Fix DesugaredLibraryRetargeter synthetic method processing in R8
Fix red bots
Change-Id: I76a92b01ebc6c1b53b0c96d692fd932ebfba9345
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 200ebd8..8fd91e3 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -401,9 +401,9 @@
}
}
- private void synthesizeRetargetClass() throws ExecutionException {
+ private void synthesizeRetargetClass(ExecutorService executorService) throws ExecutionException {
if (desugaredLibraryRetargeter != null) {
- desugaredLibraryRetargeter.synthesizeRetargetClasses();
+ desugaredLibraryRetargeter.synthesizeRetargetClasses(this, executorService);
}
}
@@ -781,7 +781,7 @@
feedback.updateVisibleOptimizationInfo();
printPhase("Utility classes synthesis");
- synthesizeRetargetClass();
+ synthesizeRetargetClass(executorService);
synthesizeEnumUnboxingUtilityMethods(executorService);
printPhase("Desugared library API Conversion finalization");
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
index a3f492c..a0153a0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DesugaredLibraryRetargeter.java
@@ -45,6 +45,7 @@
import com.android.tools.r8.ir.code.InstructionListIterator;
import com.android.tools.r8.ir.code.InvokeMethod;
import com.android.tools.r8.ir.code.InvokeStatic;
+import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.synthetic.EmulateInterfaceSyntheticCfCodeProvider;
import com.android.tools.r8.origin.SynthesizedOrigin;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
@@ -53,6 +54,7 @@
import com.android.tools.r8.utils.StringDiagnostic;
import com.android.tools.r8.utils.WorkList;
import com.android.tools.r8.utils.collections.DexClassAndMethodSet;
+import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import com.google.common.collect.Maps;
import java.util.ArrayList;
import java.util.Collection;
@@ -65,6 +67,8 @@
import java.util.Map.Entry;
import java.util.Set;
import java.util.TreeSet;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
import java.util.function.Function;
import org.objectweb.asm.Opcodes;
@@ -80,6 +84,8 @@
// Non final virtual library methods requiring generation of emulated dispatch.
private final DexClassAndMethodSet emulatedDispatchMethods = DexClassAndMethodSet.create();
+ private final SortedProgramMethodSet forwardingMethods = SortedProgramMethodSet.create();
+
public DesugaredLibraryRetargeter(AppView<?> appView) {
this.appView = appView;
if (appView.options().desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()) {
@@ -663,8 +669,11 @@
}
@Deprecated // Use Cf to Cf desugaring.
- public void synthesizeRetargetClasses() {
+ public void synthesizeRetargetClasses(IRConverter converter, ExecutorService executorService)
+ throws ExecutionException {
+ assert appView.enableWholeProgramOptimizations();
new EmulatedDispatchTreeFixer().fixApp(null);
+ converter.processMethodsConcurrently(forwardingMethods, executorService);
}
// The rewrite of virtual calls requires to go through emulate dispatch. This class is responsible
@@ -749,6 +758,9 @@
clazz.addVirtualMethod(newMethod);
if (eventConsumer != null) {
eventConsumer.acceptForwardingMethod(new ProgramMethod(clazz, newMethod));
+ } else {
+ assert appView.enableWholeProgramOptimizations();
+ forwardingMethods.add(new ProgramMethod(clazz, newMethod));
}
}
}