Desugared library: L8 desugaring only cf to cf
- L8 second phase (D8/R8) is now run with
Desugaring turned off.
Bug: 170698191
Change-Id: I323b31f6c2434a1d398df50fccb4af29532c12c6
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 221df4c..1141688 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -316,6 +316,7 @@
r8Builder.addProguardConfiguration(
libraryConfiguration.getExtraKeepRules(), Origin.unknown());
r8Builder.addProguardConfigurationFiles(proguardConfigFiles);
+ r8Builder.setDisableDesugaring(true);
r8Command = r8Builder.makeCommand();
} else if (!(getProgramConsumer() instanceof ClassFileConsumer)) {
l8CfConsumer = new InMemoryJarContent();
@@ -333,6 +334,7 @@
inputs.getLibraryResourceProviders()) {
d8Builder.addLibraryResourceProvider(libraryResourceProvider);
}
+ d8Builder.setDisableDesugaring(true);
d8Command = d8Builder.makeCommand();
} else {
assert getProgramConsumer() instanceof ClassFileConsumer;
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 c271af1..7303dd1 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
@@ -214,13 +214,18 @@
.map(options.itemFactory::createString)
.collect(Collectors.toList());
if (options.isDesugaredLibraryCompilation()) {
- // Specific L8 Settings.
- // DesugaredLibraryRetargeter is needed for retarget core library members and backports.
- // InterfaceMethodRewriter is needed for emulated interfaces.
- // LambdaRewriter is needed because if it is missing there are invoke custom on
- // default/static interface methods, and this is not supported by the compiler.
- // DesugaredLibraryAPIConverter is here to duplicate APIs.
- // The rest is nulled out. In addition the rewriting logic fails without lambda rewriting.
+ // Specific L8 Settings, performs all desugaring including L8 specific desugaring.
+ // The following desugaring are required for L8 specific desugaring:
+ // - DesugaredLibraryRetargeter for retarget core library members.
+ // - InterfaceMethodRewriter for emulated interfaces,
+ // - LambdaRewriter since InterfaceMethodDesugaring does not support invokeCustom rewriting,
+ // - DesugaredLibraryAPIConverter to duplicate APIs.
+ // The following desugaring are present so all desugaring is performed cf to cf in L8, and
+ // the second L8 phase can just run with Desugar turned off:
+ // - InterfaceMethodRewriter for non L8 specific interface method desugaring,
+ // - TwrCloseResourceRewriter,
+ // - NestBaseAccessDesugaring.
+ assert options.desugarState == DesugarState.ON;
this.desugaredLibraryRetargeter =
options.desugaredLibraryConfiguration.getRetargetCoreLibMember().isEmpty()
? null
@@ -232,11 +237,11 @@
this.lambdaRewriter = new LambdaRewriter(appView);
this.desugaredLibraryAPIConverter =
new DesugaredLibraryAPIConverter(appView, Mode.GENERATE_CALLBACKS_AND_WRAPPERS);
- this.backportedMethodRewriter =
- options.cfToCfDesugar || options.testing.forceLibBackportsInL8CfToCf
- ? new BackportedMethodRewriter(appView)
- : null;
- this.twrCloseResourceRewriter = null;
+ this.backportedMethodRewriter = new BackportedMethodRewriter(appView);
+ this.twrCloseResourceRewriter =
+ enableTwrCloseResourceDesugaring() ? new TwrCloseResourceRewriter(appView, this) : null;
+ this.d8NestBasedAccessDesugaring =
+ options.shouldDesugarNests() ? new D8NestBasedAccessDesugaring(appView) : null;
this.lambdaMerger = null;
this.covariantReturnTypeAnnotationTransformer = null;
this.dynamicTypeOptimization = null;
@@ -251,7 +256,6 @@
this.identifierNameStringMarker = null;
this.devirtualizer = null;
this.typeChecker = null;
- this.d8NestBasedAccessDesugaring = null;
this.stringSwitchRemover = null;
this.serviceLoaderRewriter = null;
this.methodOptimizationInfoCollector = null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index 04fb914..11e6e33 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -75,7 +75,7 @@
}
public boolean needsDesugaring(DexMethod method) {
- return rewritableMethods.getProvider(method) != null;
+ return getMethodProviderOrNull(method) != null;
}
public static List<DexMethod> generateListOfBackportedMethods(
@@ -165,7 +165,30 @@
private MethodProvider getMethodProviderOrNull(DexMethod method) {
DexMethod original = appView.graphLens().getOriginalMethodSignature(method);
assert original != null;
- return rewritableMethods.getProvider(original);
+ MethodProvider provider = rewritableMethods.getProvider(original);
+ // TODO(b/150693139): Since the DesugarLibraryRetargeter is run during IR processing while the
+ // backported method rewriter is run in cf to cf, we need here to compute if the method is
+ // actually going to be retargeted through desugared library backports, and compute the
+ // corresponding backported method if so. This can be removed once the DesugarLibraryRetargeter
+ // has been moved as a cf to cf transformation.
+ if (provider == null
+ && appView.options().isDesugaredLibraryCompilation()
+ && appView
+ .options()
+ .desugaredLibraryConfiguration
+ .getBackportCoreLibraryMember()
+ .containsKey(method.holder)) {
+ DexType newHolder =
+ appView
+ .options()
+ .desugaredLibraryConfiguration
+ .getBackportCoreLibraryMember()
+ .get(method.holder);
+ DexMethod backportedMethod =
+ appView.dexItemFactory().createMethod(newHolder, method.proto, method.name);
+ provider = rewritableMethods.getProvider(backportedMethod);
+ }
+ return provider;
}
private static final class RewritableMethods {
@@ -175,15 +198,6 @@
RewritableMethods(InternalOptions options, AppView<?> appView) {
- if (options.testing.forceLibBackportsInL8CfToCf) {
- DexItemFactory factory = options.itemFactory;
- initializeJava9OptionalMethodProviders(factory);
- initializeJava10OptionalMethodProviders(factory);
- initializeJava11OptionalMethodProviders(factory);
- initializeStreamMethodProviders(factory);
- return;
- }
-
if (!options.shouldBackportMethods()) {
return;
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
index bd468b0..787915f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/D8NestBasedAccessDesugaring.java
@@ -146,6 +146,9 @@
public void desugarNestBasedAccess(
DexApplication.Builder<?> builder, ExecutorService executorService, IRConverter converter)
throws ExecutionException {
+ if (metNestHosts.isEmpty()) {
+ return;
+ }
processNestsConcurrently(executorService);
addDeferredBridges();
synthesizeNestConstructor(builder);
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 8bc1a55..e19694e 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1293,7 +1293,6 @@
public PrintStream whyAreYouNotInliningConsumer = System.out;
public boolean trackDesugaredAPIConversions =
System.getProperty("com.android.tools.r8.trackDesugaredAPIConversions") != null;
- public boolean forceLibBackportsInL8CfToCf = false;
public boolean enumUnboxingRewriteJavaCGeneratedMethod = false;
// TODO(b/154793333): Enable assertions always when resolved.
public boolean assertConsistentRenamingOfSignature = false;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
index a01a59a..9b48952 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -7,7 +7,6 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.StringUtils;
import java.nio.file.Path;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index e4b3869..b02b2e9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -119,7 +119,6 @@
options -> {
if (extraFiles) {
options.testing.disableL8AnnotationRemoval = true;
- options.testing.forceLibBackportsInL8CfToCf = true;
}
optionsModifier.accept(options);
});