Wrap desugaring collection in D8
This refactors the desugaring collection in D8 so that a wrapper around the desugaring collection returns the underlying desugaring collection given the class/method that is about to be desugared.
This will allow returning different desugaring collections based on the class/method being desugared, which will be used in the D8 step of R8 partial, to apply different desugarings to the D8 part and R8 part.
Bug: b/391572031
Change-Id: I050cf51a40df816313b94f17ccd5eb39a8c688a7
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 42af1e9..cbbe820 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
@@ -40,7 +40,7 @@
import com.android.tools.r8.ir.conversion.passes.StringSwitchRemover;
import com.android.tools.r8.ir.conversion.passes.ThrowCatchOptimizer;
import com.android.tools.r8.ir.conversion.passes.TrivialPhiSimplifier;
-import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
+import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollectionSupplier;
import com.android.tools.r8.ir.optimize.AssertionErrorTwoArgsConstructorRewriter;
import com.android.tools.r8.ir.optimize.AssertionsRewriter;
import com.android.tools.r8.ir.optimize.AssumeInserter;
@@ -107,7 +107,7 @@
public final Outliner outliner;
protected final CodeRewriterPassCollection rewriterPassCollection;
private final ClassInitializerDefaultsOptimization classInitializerDefaultsOptimization;
- protected final CfInstructionDesugaringCollection instructionDesugaring;
+ protected final CfInstructionDesugaringCollectionSupplier instructionDesugaring;
protected FieldAccessAnalysis fieldAccessAnalysis;
protected final LibraryMethodOverrideAnalysis libraryMethodOverrideAnalysis;
protected final IdempotentFunctionCallCanonicalizer idempotentFunctionCallCanonicalizer;
@@ -186,8 +186,7 @@
// - nest based access desugaring,
// - invoke-special desugaring.
assert options.desugarState.isOn();
- this.instructionDesugaring =
- CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+ this.instructionDesugaring = CfInstructionDesugaringCollectionSupplier.createForL8(appView);
this.dynamicTypeOptimization = null;
this.classInliner = null;
this.fieldAccessAnalysis = null;
@@ -208,8 +207,8 @@
}
this.instructionDesugaring =
appView.enableWholeProgramOptimizations()
- ? CfInstructionDesugaringCollection.empty()
- : CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+ ? CfInstructionDesugaringCollectionSupplier.empty()
+ : CfInstructionDesugaringCollectionSupplier.createForD8(appView);
removeVerificationErrorForUnknownReturnedValues =
(appView.options().apiModelingOptions().isApiModelingEnabled()
&& appView.options().canHaveVerifyErrorForUnknownUnusedReturnValue())
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
index 57e3cc6..d2b3868 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryD8L8IRConverter.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.ir.conversion;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
import static com.android.tools.r8.ir.desugar.lambda.D8LambdaDesugaring.rewriteEnclosingLambdaMethodAttributes;
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
@@ -21,17 +20,16 @@
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.CfInstructionDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringCollection;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.ProgramAdditions;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceApplicationRewriter;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
import com.android.tools.r8.ir.desugar.itf.L8InnerOuterAttributeEraser;
import com.android.tools.r8.ir.desugar.lambda.LambdaDeserializationMethodRemover;
-import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.position.MethodPosition;
import com.android.tools.r8.profile.rewriting.ProfileCollectionAdditions;
@@ -69,8 +67,7 @@
convertClasses(methodProcessor, interfaceProcessor, executorService);
- reportNestDesugarDependencies();
- clearNestAttributes();
+ instructionDesugaring.finalizeNestDesugaring();
application = commitPendingSyntheticItems(appView, application);
@@ -281,7 +278,8 @@
// The synthesis of accessibility bridges in nest based access desugaring will schedule and
// await the processing of synthesized methods.
- synthesizeBridgesForNestBasedAccessesOnClasspath(methodProcessor, executorService);
+ instructionDesugaring.processClasspath(methodProcessor, executorService);
+ methodProcessor.awaitMethodProcessing();
// There should be no outstanding method processing.
methodProcessor.verifyNoPendingMethodProcessing();
@@ -289,8 +287,7 @@
rewriteEnclosingLambdaMethodAttributes(
appView, classConverterResult.getForcefullyMovedLambdaMethods());
- instructionDesugaring.withDesugaredLibraryAPIConverter(
- DesugaredLibraryAPIConverter::generateTrackingWarnings);
+ instructionDesugaring.generateDesugaredLibraryApiConverterTrackingWarnings();
}
private void postProcessingDesugaringForD8(
@@ -306,8 +303,7 @@
instructionDesugaring);
methodProcessor.newWave();
InterfaceMethodProcessorFacade interfaceDesugaring =
- instructionDesugaring.getInterfaceMethodPostProcessingDesugaringD8(
- ExcludeDexResources, interfaceProcessor);
+ instructionDesugaring.getInterfaceMethodProcessorFacade(interfaceProcessor);
CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring, m -> true)
.postProcessingDesugaring(appView.appInfo().classes(), eventConsumer, executorService);
methodProcessor.awaitMethodProcessing();
@@ -323,10 +319,13 @@
ThreadUtils.processItems(
appView.appInfo().classes(),
clazz -> {
+ CfInstructionDesugaringCollection instructionDesugaringForClass =
+ instructionDesugaring.get(clazz);
clazz.forEachProgramMethodMatching(
method -> method.hasCode() && method.getCode().isCfCode(),
method ->
- instructionDesugaring.prepare(method, desugaringEventConsumer, programAdditions));
+ instructionDesugaringForClass.prepare(
+ method, desugaringEventConsumer, programAdditions));
},
threadingModule,
executorService);
@@ -383,31 +382,14 @@
if (!method.getDefinition().getCode().isCfCode()) {
return false;
}
- instructionDesugaring.scan(method, desugaringEventConsumer);
- if (instructionDesugaring.needsDesugaring(method)) {
- instructionDesugaring.desugar(method, methodProcessingContext, desugaringEventConsumer);
+ CfInstructionDesugaringCollection instructionDesugaringForMethod =
+ instructionDesugaring.get(method);
+ instructionDesugaringForMethod.scan(method, desugaringEventConsumer);
+ if (instructionDesugaringForMethod.needsDesugaring(method)) {
+ instructionDesugaringForMethod.desugar(
+ method, methodProcessingContext, desugaringEventConsumer);
return true;
}
return false;
}
-
- private void clearNestAttributes() {
- instructionDesugaring.withD8NestBasedAccessDesugaring(
- D8NestBasedAccessDesugaring::clearNestAttributes);
- }
-
- private void reportNestDesugarDependencies() {
- instructionDesugaring.withD8NestBasedAccessDesugaring(
- D8NestBasedAccessDesugaring::reportDesugarDependencies);
- }
-
- private void synthesizeBridgesForNestBasedAccessesOnClasspath(
- D8MethodProcessor methodProcessor, ExecutorService executorService)
- throws ExecutionException {
- instructionDesugaring.withD8NestBasedAccessDesugaring(
- d8NestBasedAccessDesugaring ->
- d8NestBasedAccessDesugaring.synthesizeBridgesForNestBasedAccessesOnClasspath(
- methodProcessor, executorService));
- methodProcessor.awaitMethodProcessing();
- }
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index 5357748..5ecdabc 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -56,9 +56,6 @@
private DexApplication internalOptimize(
AppView<AppInfoWithLiveness> appView, ExecutorService executorService)
throws ExecutionException {
- // Desugaring happens in the enqueuer.
- assert instructionDesugaring.isEmpty();
-
workaroundAbstractMethodOnNonAbstractClassVerificationBug(executorService);
// The process is in two phases in general.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index 97f2d27..567fd16 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.ir.desugar;
-import com.android.tools.r8.androidapi.AndroidApiLevelCompute;
import com.android.tools.r8.cf.code.CfInstruction;
import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
import com.android.tools.r8.errors.CompilationError;
@@ -13,12 +12,13 @@
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.utils.ThrowingConsumer;
import java.util.Collection;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Predicate;
/**
@@ -29,22 +29,20 @@
*/
public abstract class CfInstructionDesugaringCollection {
- public static CfInstructionDesugaringCollection create(
- AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
+ public static CfInstructionDesugaringCollection create(AppView<?> appView) {
if (appView.options().desugarState.isOff() && appView.options().forceNestDesugaring) {
throw new CompilationError(
"Cannot combine -Dcom.android.tools.r8.forceNestDesugaring with desugaring turned off");
}
if (appView.options().desugarState.isOn()) {
- return new NonEmptyCfInstructionDesugaringCollection(appView, apiLevelCompute);
+ return new NonEmptyCfInstructionDesugaringCollection(appView);
}
// TODO(b/145775365): invoke-special desugaring is mandatory, since we currently can't map
// invoke-special instructions that require desugaring into IR.
if (appView.options().isGeneratingClassFiles()) {
return NonEmptyCfInstructionDesugaringCollection.createForCfToCfNonDesugar(appView);
}
- return NonEmptyCfInstructionDesugaringCollection.createForCfToDexNonDesugar(
- appView, apiLevelCompute);
+ return NonEmptyCfInstructionDesugaringCollection.createForCfToDexNonDesugar(appView);
}
public static CfInstructionDesugaringCollection empty() {
@@ -86,12 +84,11 @@
public abstract <T extends Throwable> void withD8NestBasedAccessDesugaring(
ThrowingConsumer<D8NestBasedAccessDesugaring, T> consumer) throws T;
- public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
- Flavor flavor, InterfaceProcessor interfaceProcessor);
-
public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
- Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor);
+ Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor);
public abstract void withDesugaredLibraryAPIConverter(
Consumer<DesugaredLibraryAPIConverter> consumer);
+
+ public abstract <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java
new file mode 100644
index 0000000..12f22de
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollectionSupplier.java
@@ -0,0 +1,120 @@
+// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.ir.desugar;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ProgramDefinition;
+import com.android.tools.r8.ir.conversion.D8MethodProcessor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
+import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+
+public interface CfInstructionDesugaringCollectionSupplier {
+
+ CfInstructionDesugaringCollectionSupplier EMPTY =
+ new EmptyCfInstructionDesugaringCollectionSupplier();
+
+ CfInstructionDesugaringCollection get(ProgramDefinition definition);
+
+ void finalizeNestDesugaring();
+
+ void generateDesugaredLibraryApiConverterTrackingWarnings();
+
+ InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+ InterfaceProcessor interfaceProcessor);
+
+ void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor)
+ throws ExecutionException;
+
+ static CfInstructionDesugaringCollectionSupplier createForD8(AppView<?> appView) {
+ return new DefaultCfInstructionDesugaringCollectionSupplier(appView);
+ }
+
+ static CfInstructionDesugaringCollectionSupplier createForL8(AppView<?> appView) {
+ return new DefaultCfInstructionDesugaringCollectionSupplier(appView);
+ }
+
+ static CfInstructionDesugaringCollectionSupplier empty() {
+ return EMPTY;
+ }
+
+ class DefaultCfInstructionDesugaringCollectionSupplier
+ implements CfInstructionDesugaringCollectionSupplier {
+
+ private final CfInstructionDesugaringCollection desugaring;
+
+ DefaultCfInstructionDesugaringCollectionSupplier(AppView<?> appView) {
+ this.desugaring = CfInstructionDesugaringCollection.create(appView);
+ }
+
+ @Override
+ public CfInstructionDesugaringCollection get(ProgramDefinition target) {
+ return desugaring;
+ }
+
+ @Override
+ public void finalizeNestDesugaring() {
+ desugaring.withD8NestBasedAccessDesugaring(
+ nestBasedAccessDesugaring -> {
+ nestBasedAccessDesugaring.reportDesugarDependencies();
+ nestBasedAccessDesugaring.clearNestAttributes();
+ });
+ }
+
+ @Override
+ public void generateDesugaredLibraryApiConverterTrackingWarnings() {
+ desugaring.withDesugaredLibraryAPIConverter(
+ DesugaredLibraryAPIConverter::generateTrackingWarnings);
+ }
+
+ @Override
+ public InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+ InterfaceProcessor interfaceProcessor) {
+ return desugaring.withInterfaceMethodRewriter(
+ interfaceMethodRewriter ->
+ interfaceMethodRewriter.getPostProcessingDesugaringD8(interfaceProcessor));
+ }
+
+ @Override
+ public void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor)
+ throws ExecutionException {
+ desugaring.withD8NestBasedAccessDesugaring(
+ nestBasedAccessDesugaring ->
+ nestBasedAccessDesugaring.synthesizeBridgesForNestBasedAccessesOnClasspath(
+ methodProcessor, executor));
+ }
+ }
+
+ class EmptyCfInstructionDesugaringCollectionSupplier
+ implements CfInstructionDesugaringCollectionSupplier {
+
+ @Override
+ public CfInstructionDesugaringCollection get(ProgramDefinition target) {
+ return CfInstructionDesugaringCollection.empty();
+ }
+
+ @Override
+ public void finalizeNestDesugaring() {
+ // Intentionally empty.
+ }
+
+ @Override
+ public void generateDesugaredLibraryApiConverterTrackingWarnings() {
+ // Intentionally empty.
+ }
+
+ @Override
+ public InterfaceMethodProcessorFacade getInterfaceMethodProcessorFacade(
+ InterfaceProcessor interfaceProcessor) {
+ return null;
+ }
+
+ @Override
+ public void processClasspath(D8MethodProcessor methodProcessor, ExecutorService executor) {
+ // Intentionally empty.
+ }
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
index 1a232e1..9cdb6e6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
@@ -41,7 +41,7 @@
AppView<?> appView,
ProfileCollectionAdditions profileCollectionAdditions,
D8MethodProcessor methodProcessor,
- CfInstructionDesugaringCollection instructionDesugaring) {
+ CfInstructionDesugaringCollectionSupplier instructionDesugaring) {
CfPostProcessingDesugaringEventConsumer eventConsumer =
new D8CfPostProcessingDesugaringEventConsumer(methodProcessor, instructionDesugaring);
return ProfileRewritingCfPostProcessingDesugaringEventConsumer.attach(
@@ -71,17 +71,17 @@
// Methods cannot be processed directly because we cannot add method to classes while
// concurrently processing other methods.
private final ProgramMethodSet methodsToReprocess = ProgramMethodSet.createConcurrent();
- private final CfInstructionDesugaringCollection instructionDesugaring;
+ private final CfInstructionDesugaringCollectionSupplier instructionDesugaring;
private D8CfPostProcessingDesugaringEventConsumer(
D8MethodProcessor methodProcessor,
- CfInstructionDesugaringCollection instructionDesugaring) {
+ CfInstructionDesugaringCollectionSupplier instructionDesugaring) {
this.methodProcessor = methodProcessor;
this.instructionDesugaring = instructionDesugaring;
}
private void addMethodToReprocess(ProgramMethod method) {
- assert !instructionDesugaring.needsDesugaring(method);
+ assert !instructionDesugaring.get(method).needsDesugaring(method);
assert method.getDefinition().getCode().isCfCode();
methodsToReprocess.add(method);
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index 46ff0f0..b099cf9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -10,12 +10,13 @@
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
+import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
import com.android.tools.r8.utils.ThrowingConsumer;
import java.util.Collection;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Predicate;
public class EmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -82,14 +83,8 @@
}
@Override
- public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
- Flavor flavor, InterfaceProcessor interfaceProcessor) {
- return null;
- }
-
- @Override
public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
- Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
+ Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
return null;
}
@@ -97,4 +92,9 @@
public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
// Intentionally empty.
}
+
+ @Override
+ public <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn) {
+ return null;
+ }
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index ece7ef6..4442dfe 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -26,7 +26,6 @@
import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialToSelfDesugaring;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
import com.android.tools.r8.ir.desugar.nest.D8NestBasedAccessDesugaring;
@@ -53,6 +52,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.function.Consumer;
+import java.util.function.Function;
import java.util.function.Predicate;
public class NonEmptyCfInstructionDesugaringCollection extends CfInstructionDesugaringCollection {
@@ -70,6 +70,10 @@
private final CfInstructionDesugaring[][] asmOpcodeOrCompareToIdToDesugaringsMap;
+ NonEmptyCfInstructionDesugaringCollection(AppView<?> appView) {
+ this(appView, appView.apiLevelCompute());
+ }
+
NonEmptyCfInstructionDesugaringCollection(
AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
this.appView = appView;
@@ -227,11 +231,10 @@
return new NonEmptyCfInstructionDesugaringCollection(appView, noAndroidApiLevelCompute());
}
- static NonEmptyCfInstructionDesugaringCollection createForCfToDexNonDesugar(
- AppView<?> appView, AndroidApiLevelCompute apiLevelCompute) {
+ static NonEmptyCfInstructionDesugaringCollection createForCfToDexNonDesugar(AppView<?> appView) {
assert appView.options().desugarState.isOff();
assert appView.options().isGeneratingDex();
- return new NonEmptyCfInstructionDesugaringCollection(appView, apiLevelCompute);
+ return new NonEmptyCfInstructionDesugaringCollection(appView);
}
private void ensureCfCode(ProgramMethod method) {
@@ -533,19 +536,11 @@
}
@Override
- public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringD8(
- Flavor flavor, InterfaceProcessor interfaceProcessor) {
- return interfaceMethodRewriter != null
- ? interfaceMethodRewriter.getPostProcessingDesugaringD8(flavor, interfaceProcessor)
- : null;
- }
-
- @Override
public InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
- Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
- return interfaceMethodRewriter != null
- ? interfaceMethodRewriter.getPostProcessingDesugaringR8(flavor, isLiveMethod, processor)
- : null;
+ Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor) {
+ return withInterfaceMethodRewriter(
+ interfaceMethodRewriter ->
+ interfaceMethodRewriter.getPostProcessingDesugaringR8(isLiveMethod, processor));
}
@Override
@@ -554,4 +549,12 @@
consumer.accept(desugaredLibraryAPIConverter);
}
}
+
+ @Override
+ public <T> T withInterfaceMethodRewriter(Function<InterfaceMethodRewriter, T> fn) {
+ if (interfaceMethodRewriter != null) {
+ return fn.apply(interfaceMethodRewriter);
+ }
+ return null;
+ }
}
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 3c3197b..f50a458 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
@@ -4,13 +4,14 @@
package com.android.tools.r8.ir.desugar.itf;
+import static com.google.common.base.Predicates.alwaysTrue;
+
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper.InterfaceMethodDesugaringMode;
-import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.Collection;
@@ -21,28 +22,29 @@
public class InterfaceMethodProcessorFacade implements CfPostProcessingDesugaring {
private final AppView<?> appView;
- private final Flavor flavour;
private final InterfaceProcessor interfaceProcessor;
private final ClassProcessor classProcessor;
InterfaceMethodProcessorFacade(
AppView<?> appView,
- Flavor flavour,
- Predicate<ProgramMethod> isLiveMethod,
InterfaceProcessor interfaceProcessor,
InterfaceMethodDesugaringMode desugaringMode) {
+ this(appView, interfaceProcessor, desugaringMode, alwaysTrue());
+ }
+
+ InterfaceMethodProcessorFacade(
+ AppView<?> appView,
+ InterfaceProcessor interfaceProcessor,
+ InterfaceMethodDesugaringMode desugaringMode,
+ Predicate<ProgramMethod> isLiveMethod) {
this.appView = appView;
- this.flavour = flavour;
assert interfaceProcessor != null;
this.interfaceProcessor = interfaceProcessor;
this.classProcessor = new ClassProcessor(appView, isLiveMethod, desugaringMode);
}
- private boolean shouldProcess(DexProgramClass clazz, Flavor flavour) {
- if (appView.isAlreadyLibraryDesugared(clazz)) {
- return false;
- }
- return (!clazz.originatesFromDexResource() || flavour == Flavor.IncludeAllResources);
+ private boolean shouldProcess(DexProgramClass clazz) {
+ return !appView.isAlreadyLibraryDesugared(clazz) && !clazz.originatesFromDexResource();
}
private void processClassesConcurrently(
@@ -51,7 +53,7 @@
ExecutorService executorService)
throws ExecutionException {
ThreadUtils.processItems(
- ListUtils.filter(programClasses, clazz -> shouldProcess(clazz, flavour)),
+ ListUtils.filter(programClasses, this::shouldProcess),
clazz -> classProcessor.process(clazz, eventConsumer),
appView.options().getThreadingModule(),
executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 003f7dd..bf94859 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -927,17 +927,15 @@
}
public InterfaceMethodProcessorFacade getPostProcessingDesugaringD8(
- Flavor flavour, InterfaceProcessor interfaceProcessor) {
- return new InterfaceMethodProcessorFacade(
- appView, flavour, m -> true, interfaceProcessor, desugaringMode);
+ InterfaceProcessor interfaceProcessor) {
+ return new InterfaceMethodProcessorFacade(appView, interfaceProcessor, desugaringMode);
}
public InterfaceMethodProcessorFacade getPostProcessingDesugaringR8(
- Flavor flavour,
Predicate<ProgramMethod> isLiveMethod,
InterfaceProcessor interfaceProcessor) {
return new InterfaceMethodProcessorFacade(
- appView, flavour, isLiveMethod, interfaceProcessor, desugaringMode);
+ appView, interfaceProcessor, desugaringMode, isLiveMethod);
}
private Origin getMethodOrigin(DexMethod method) {
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 a47ffa7..86724f3 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -7,7 +7,6 @@
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.graph.FieldAccessInfoImpl.MISSING_FIELD_ACCESS_INFO;
import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafactoryMethod;
-import static com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor.ExcludeDexResources;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.identifyIdentifier;
import static com.android.tools.r8.naming.IdentifierNameStringUtils.isReflectionMethod;
import static com.android.tools.r8.shaking.KeepInfo.Joiner.asClassJoinerOrNull;
@@ -567,7 +566,7 @@
liveMethods = new LiveMethodsSet(graphReporter::registerMethod);
liveFields = new LiveFieldsSet(graphReporter::registerField);
if (mode.isInitialTreeShaking()) {
- desugaring = CfInstructionDesugaringCollection.create(appView, appView.apiLevelCompute());
+ desugaring = CfInstructionDesugaringCollection.create(appView);
interfaceProcessor = InterfaceProcessor.create(appView);
} else {
desugaring = CfInstructionDesugaringCollection.empty();
@@ -4931,7 +4930,7 @@
null)));
InterfaceMethodProcessorFacade interfaceDesugaring =
desugaring.getInterfaceMethodPostProcessingDesugaringR8(
- ExcludeDexResources, liveMethods::contains, interfaceProcessor);
+ liveMethods::contains, interfaceProcessor);
CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring, liveMethods::contains)
.postProcessingDesugaring(liveTypes.items, eventConsumer, executorService);