Account for library desugaring in D8 backporting of R8 partial
Bug: b/391572031
Change-Id: Iddfb1976c529e142da5e8620c64b2da62578b061
diff --git a/src/main/java/com/android/tools/r8/R8Partial.java b/src/main/java/com/android/tools/r8/R8Partial.java
index e874dc8..56b1730 100644
--- a/src/main/java/com/android/tools/r8/R8Partial.java
+++ b/src/main/java/com/android/tools/r8/R8Partial.java
@@ -120,7 +120,8 @@
InternalOptions d8Options = d8Command.getInternalOptions();
options.partialCompilationConfiguration.d8DexOptionsConsumer.accept(d8Options);
R8PartialD8SubCompilationConfiguration subCompilationConfiguration =
- new R8PartialD8SubCompilationConfiguration(input.getD8Types(), input.getR8Types(), timing);
+ new R8PartialD8SubCompilationConfiguration(
+ input.getD8Types(), input.getR8Types(), options.getLibraryDesugaringOptions(), timing);
d8Options.setArtProfileOptions(
new ArtProfileOptions(d8Options, options.getArtProfileOptions()));
d8Options.setFeatureSplitConfiguration(options.getFeatureSplitConfiguration());
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 1ff5fe1..6399485 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
@@ -1,7 +1,6 @@
// Copyright (c) 2018, 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.androidapi.ComputedApiLevel;
@@ -94,11 +93,13 @@
public final class BackportedMethodRewriter implements CfInstructionDesugaring {
private final AppView<?> appView;
+ private final LibraryDesugaringOptions libraryDesugaringOptions;
private final RewritableMethods rewritableMethods;
public BackportedMethodRewriter(AppView<?> appView) {
assert appView.options().desugarState.isOn();
this.appView = appView;
+ this.libraryDesugaringOptions = appView.options().getSubCompilationLibraryDesugaringOptions();
this.rewritableMethods = new RewritableMethods(appView);
}
@@ -217,8 +218,7 @@
AppInfo appInfo =
AppInfo.createInitialAppInfo(app, GlobalSyntheticsStrategy.forNonSynthesizing());
AppView<?> appView = AppView.createForD8(appInfo, Timing.empty());
- BackportedMethodRewriter.RewritableMethods rewritableMethods =
- new BackportedMethodRewriter.RewritableMethods(appView);
+ RewritableMethods rewritableMethods = new RewritableMethods(appView);
rewritableMethods.visit(methods);
new DesugaredLibraryRetargeterHelper(appView).visit(methods);
new AutoCloseableRetargeterHelper(options.getMinApiLevel(), options.dexItemFactory())
@@ -241,13 +241,9 @@
// maintained for legacy only, recent desugared library should not be shipped with
// pre-desugared code.
Map<DexType, DexType> legacyBackport =
- appView
- .options()
- .getLibraryDesugaringOptions()
- .getMachineDesugaredLibrarySpecification()
- .getLegacyBackport();
+ libraryDesugaringOptions.getMachineDesugaredLibrarySpecification().getLegacyBackport();
if (provider == null
- && appView.options().getLibraryDesugaringOptions().isDesugaredLibraryCompilation()
+ && libraryDesugaringOptions.isDesugaredLibraryCompilation()
&& legacyBackport.containsKey(method.holder)) {
DexType newHolder = legacyBackport.get(method.holder);
DexMethod backportedMethod =
@@ -277,8 +273,7 @@
}
private MethodProvider<DexField> getProviderOrNull(DexField field) {
- MethodProvider<DexField> provider = rewritableMethods.getProvider(field);
- return provider;
+ return rewritableMethods.getProvider(field);
}
private static final class RewritableMethods {
@@ -286,6 +281,7 @@
private final Map<DexType, AndroidApiLevel> typeMinApi;
private final AppView<?> appView;
+ private final LibraryDesugaringOptions libraryDesugaringOptions;
// Map backported field or method to a provider for creating the actual target method
// (with code).
@@ -298,6 +294,7 @@
InternalOptions options = appView.options();
DexItemFactory factory = options.dexItemFactory();
this.appView = appView;
+ this.libraryDesugaringOptions = options.getSubCompilationLibraryDesugaringOptions();
this.typeMinApi = initializeTypeMinApi(factory);
if (!options.enableBackportedMethodRewriting()) {
return;
@@ -410,8 +407,6 @@
}
private boolean typeIsInDesugaredLibrary(DexType type) {
- LibraryDesugaringOptions libraryDesugaringOptions =
- appView.options().getLibraryDesugaringOptions();
return libraryDesugaringOptions.getTypeRewriter().hasRewrittenType(type)
|| libraryDesugaringOptions
.getMachineDesugaredLibrarySpecification()
@@ -436,9 +431,7 @@
if (typeIsInDesugaredLibrary(type)) {
// Desugared library is enabled, the methods are present if desugared library specifies it.
return methodsMinAPI.isGreaterThan(AndroidApiLevel.N)
- && !appView
- .options()
- .getLibraryDesugaringOptions()
+ && !libraryDesugaringOptions
.getMachineDesugaredLibrarySpecification()
.includesJDK11Methods();
}
@@ -2224,8 +2217,7 @@
BackportedMethodDesugaringEventConsumer eventConsumer,
MethodProcessingContext methodProcessingContext,
LocalStackAllocator localStackAllocator) {
- return rewriter.rewrite(
- instruction.asStaticFieldGet(), appView.dexItemFactory(), localStackAllocator);
+ return rewriter.rewrite(instruction.asStaticFieldGet(), appView.dexItemFactory());
}
}
@@ -2530,10 +2522,7 @@
CfInstruction rewriteSingle(CfStaticFieldRead staticGet, DexItemFactory factory);
// Convenience wrapper since most rewrites are to a single instruction.
- default Collection<CfInstruction> rewrite(
- CfStaticFieldRead staticGet,
- DexItemFactory factory,
- LocalStackAllocator localStackAllocator) {
+ default Collection<CfInstruction> rewrite(CfStaticFieldRead staticGet, DexItemFactory factory) {
return ImmutableList.of(rewriteSingle(staticGet, factory));
}
}
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
index 5e82a63..a5cd867 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialSubCompilationConfiguration.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.ir.conversion.MethodConversionOptions;
import com.android.tools.r8.ir.conversion.MethodConversionOptions.Target;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.LibraryDesugaringOptions;
import com.android.tools.r8.keepanno.ast.KeepDeclaration;
import com.android.tools.r8.profile.art.ArtProfile;
import com.android.tools.r8.profile.art.ArtProfileCollection;
@@ -65,6 +66,7 @@
private final Set<DexType> d8Types;
private final Set<DexType> r8Types;
+ private final LibraryDesugaringOptions libraryDesugaringOptions;
private ArtProfileCollection artProfiles;
private ClassToFeatureSplitMap classToFeatureSplitMap;
@@ -75,10 +77,14 @@
private StartupProfile startupProfile;
public R8PartialD8SubCompilationConfiguration(
- Set<DexType> d8Types, Set<DexType> r8Types, Timing timing) {
+ Set<DexType> d8Types,
+ Set<DexType> r8Types,
+ LibraryDesugaringOptions libraryDesugaringOptions,
+ Timing timing) {
super(timing);
this.d8Types = d8Types;
this.r8Types = r8Types;
+ this.libraryDesugaringOptions = libraryDesugaringOptions;
}
public ArtProfileCollection getArtProfiles() {
@@ -100,6 +106,10 @@
return desugaredOutputClasses;
}
+ public LibraryDesugaringOptions getLibraryDesugaringOptions() {
+ return libraryDesugaringOptions;
+ }
+
public Collection<DexClasspathClass> getOutputClasspathClasses() {
assert outputClasspathClasses != null;
return outputClasspathClasses;
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 74b8fd1..dd600b2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1082,6 +1082,18 @@
return libraryDesugaringOptions;
}
+ /**
+ * Similar to {@link #getLibraryDesugaringOptions()}, except for the D8 compilation in R8 partial,
+ * where this deliberately returns the library desugaring options of the outer R8 partial
+ * compilation.
+ */
+ public LibraryDesugaringOptions getSubCompilationLibraryDesugaringOptions() {
+ if (partialSubCompilationConfiguration != null && partialSubCompilationConfiguration.isD8()) {
+ return partialSubCompilationConfiguration.asD8().getLibraryDesugaringOptions();
+ }
+ return getLibraryDesugaringOptions();
+ }
+
public SingleCallerInlinerOptions getSingleCallerInlinerOptions() {
return singleCallerInlinerOptions;
}