Fix PostProcessingDesugaring in R8
Bug: 195888934
Change-Id: Ibd2658e254eab5970f5b1c104f73869d259b15ca
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 4177124..51a7e60 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
@@ -465,7 +465,7 @@
instructionDesugaring.getInterfaceMethodPostProcessingDesugaring(ExcludeDexResources);
CfPostProcessingDesugaringCollection.create(
appView, interfaceDesugaring, instructionDesugaring.getRetargetingInfo())
- .postProcessingDesugaring(eventConsumer, executorService);
+ .postProcessingDesugaring(appView.appInfo().classes(), eventConsumer, executorService);
methodProcessor.awaitMethodProcessing();
eventConsumer.finalizeDesugaring();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
index 38a0413..f3aaaad 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaring.java
@@ -3,12 +3,16 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.ir.desugar;
+import com.android.tools.r8.graph.DexProgramClass;
+import java.util.Collection;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
public interface CfPostProcessingDesugaring {
void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException;
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index 367e0ca..b9fc5b9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -4,11 +4,13 @@
package com.android.tools.r8.ir.desugar;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryRetargeterPostProcessor;
import com.android.tools.r8.ir.desugar.desugaredlibrary.RetargetingInfo;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -31,7 +33,9 @@
}
public abstract void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException;
public static class NonEmptyCfPostProcessingDesugaringCollection
@@ -72,10 +76,12 @@
@Override
public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException {
for (CfPostProcessingDesugaring desugaring : desugarings) {
- desugaring.postProcessingDesugaring(eventConsumer, executorService);
+ desugaring.postProcessingDesugaring(programClasses, eventConsumer, executorService);
}
}
}
@@ -94,7 +100,9 @@
@Override
public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException {
// Intentionally empty.
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
index dac3079..d25015b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/DesugaredLibraryRetargeterPostProcessor.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.utils.collections.DexClassAndMethodSet;
import com.google.common.collect.Maps;
import java.util.ArrayList;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
@@ -44,16 +45,19 @@
@Override
public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException {
if (appView.options().isDesugaredLibraryCompilation()) {
ensureEmulatedDispatchMethodsSynthesized(eventConsumer);
} else {
- ensureInterfacesAndForwardingMethodsSynthesized(eventConsumer);
+ ensureInterfacesAndForwardingMethodsSynthesized(programClasses, eventConsumer);
}
}
private void ensureInterfacesAndForwardingMethodsSynthesized(
+ Collection<DexProgramClass> programClasses,
DesugaredLibraryRetargeterPostProcessingEventConsumer eventConsumer) {
assert !appView.options().isDesugaredLibraryCompilation();
Map<DexType, List<DexClassAndMethod>> map = Maps.newIdentityHashMap();
@@ -61,7 +65,7 @@
map.putIfAbsent(emulatedDispatchMethod.getHolderType(), new ArrayList<>(1));
map.get(emulatedDispatchMethod.getHolderType()).add(emulatedDispatchMethod);
}
- for (DexProgramClass clazz : appView.appInfo().classes()) {
+ for (DexProgramClass clazz : programClasses) {
if (clazz.superType == null) {
assert clazz.type == appView.dexItemFactory().objectType : clazz.type.toSourceString();
continue;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
index 71844b0..a4c3f91 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodProcessorFacade.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.utils.collections.SortedProgramMethodSet;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
+import java.util.Collection;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
@@ -60,7 +61,7 @@
CollectingInterfaceDesugaringEventConsumer eventConsumer =
new CollectingInterfaceDesugaringEventConsumer();
- processClassesConcurrently(eventConsumer, executorService);
+ processClassesConcurrently(appView.appInfo().classes(), eventConsumer, executorService);
converter.processMethodsConcurrently(
eventConsumer.getSortedSynthesizedMethods(), executorService);
}
@@ -101,11 +102,12 @@
}
private void processClassesConcurrently(
- InterfaceProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ InterfaceProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException {
ThreadUtils.processItems(
- Iterables.filter(
- appView.appInfo().classes(), (DexProgramClass clazz) -> shouldProcess(clazz, flavour)),
+ Iterables.filter(programClasses, (DexProgramClass clazz) -> shouldProcess(clazz, flavour)),
clazz -> {
for (InterfaceDesugaringProcessor processor : interfaceDesugaringProcessors) {
processor.process(clazz, eventConsumer);
@@ -119,10 +121,12 @@
@Override
public void postProcessingDesugaring(
- CfPostProcessingDesugaringEventConsumer eventConsumer, ExecutorService executorService)
+ Collection<DexProgramClass> programClasses,
+ CfPostProcessingDesugaringEventConsumer eventConsumer,
+ ExecutorService executorService)
throws ExecutionException {
// TODO(b/183998768): Would be nice to use the ClassProcessing for the processing of classes,
// and do here only the finalization.
- processClassesConcurrently(eventConsumer, executorService);
+ processClassesConcurrently(programClasses, eventConsumer, executorService);
}
}
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 5af34bd..eefefe1 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -3918,10 +3918,12 @@
SyntheticAdditions syntheticAdditions =
new SyntheticAdditions(appView.createProcessorContext());
+ assert workList.isEmpty();
+
R8PostProcessingDesugaringEventConsumer eventConsumer =
CfPostProcessingDesugaringEventConsumer.createForR8(appView, syntheticAdditions);
CfPostProcessingDesugaringCollection.create(appView, null, desugaring.getRetargetingInfo())
- .postProcessingDesugaring(eventConsumer, executorService);
+ .postProcessingDesugaring(liveTypes.items, eventConsumer, executorService);
if (syntheticAdditions.isEmpty()) {
return;