Do not minify library overrides
even if it's library or program override
Bug: b/242948951
Change-Id: Ib52621517967512631459a81a840594d0e3bdb35
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fcf37fb..6a9fb76 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -201,6 +201,11 @@
}
@Override
+ public void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass) {
+ // Intentionally empty.
+ }
+
+ @Override
public void acceptAPIConversion(ProgramMethod method) {
methodProcessor.scheduleDesugaredMethodForProcessing(method);
}
@@ -378,6 +383,11 @@
}
@Override
+ public void acceptGenericApiConversionStub(DexClasspathClass clazz) {
+ additions.addLiveClasspathClass(clazz);
+ }
+
+ @Override
public void acceptAPIConversion(ProgramMethod method) {
// Intentionally empty. The method will be hit by tracing if required.
}
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 e67d55a..f96680f 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
@@ -123,6 +123,11 @@
public void acceptEnumConversionClasspathClass(DexClasspathClass clazz) {
// Intentionally empty.
}
+
+ @Override
+ public void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass) {
+ // Intentionally empty.
+ }
}
public static class R8PostProcessingDesugaringEventConsumer
@@ -199,5 +204,10 @@
public void acceptEnumConversionClasspathClass(DexClasspathClass clazz) {
additions.addLiveClasspathClass(clazz);
}
+
+ @Override
+ public void acceptGenericApiConversionStub(DexClasspathClass clazz) {
+ additions.addLiveClasspathClass(clazz);
+ }
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index b316972..178255b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -10,6 +10,7 @@
import com.android.tools.r8.dex.Constants;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCode;
+import com.android.tools.r8.graph.ClasspathMethod;
import com.android.tools.r8.graph.ClasspathOrLibraryClass;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexClass;
@@ -167,6 +168,28 @@
return false;
}
+ private DexMethod ensureApiGenericConversion(
+ DexMethod conversion, DesugaredLibraryClasspathWrapperSynthesizeEventConsumer eventConsumer) {
+ assert !appView.options().isDesugaredLibraryCompilation();
+ ClasspathMethod classpathMethod =
+ appView
+ .getSyntheticItems()
+ .ensureFixedClasspathMethodFromType(
+ conversion.getName(),
+ conversion.getProto(),
+ kinds -> kinds.GENERIC_API_CONVERSION_STUB,
+ conversion.getHolderType(),
+ appView,
+ ignored -> {},
+ eventConsumer::acceptGenericApiConversionStub,
+ methodBuilder ->
+ methodBuilder
+ .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
+ .setCode(null));
+ assert classpathMethod.getReference() == conversion;
+ return conversion;
+ }
+
public DexMethod ensureConversionMethod(
DexType type,
boolean destIsVivified,
@@ -175,7 +198,7 @@
Supplier<UniqueContext> contextSupplier) {
if (apiGenericTypesConversion != null) {
assert !type.isArrayType();
- return apiGenericTypesConversion;
+ return ensureApiGenericConversion(apiGenericTypesConversion, eventConsumer);
}
DexType srcType = destIsVivified ? type : vivifiedTypeFor(type);
DexType destType = destIsVivified ? vivifiedTypeFor(type) : type;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
index 6d91ba2..4adc11f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizerEventConsumer.java
@@ -26,6 +26,8 @@
void acceptWrapperClasspathClass(DexClasspathClass clazz);
void acceptEnumConversionClasspathClass(DexClasspathClass clazz);
+
+ void acceptGenericApiConversionStub(DexClasspathClass dexClasspathClass);
}
interface DesugaredLibraryAPIConverterEventConsumer
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 bb56ca2..90b9dfb 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -2974,12 +2974,18 @@
worklist.addIfNotSeen(instantiatedClass);
while (worklist.hasNext()) {
DexProgramClass clazz = worklist.next();
- DexEncodedMethod override = clazz.lookupVirtualMethod(libraryMethodOverride);
+ ProgramMethod override = clazz.lookupProgramMethod(libraryMethodOverride);
if (override != null) {
- if (override.isLibraryMethodOverride().isTrue()) {
+ if (override.getDefinition().isLibraryMethodOverride().isTrue()) {
continue;
}
- override.setLibraryMethodOverride(OptionalBool.TRUE);
+ override.getDefinition().setLibraryMethodOverride(OptionalBool.TRUE);
+ // TODO(b/243483849): The minifier does not detect library overrides if the library class
+ // is present both as program and library class. We force disable minification here as a
+ // work-around until this is fixed.
+ if (options.loadAllClassDefinitions) {
+ shouldNotBeMinified(override);
+ }
}
clazz.forEachImmediateSupertype(
superType -> {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 9aed303..2de90be 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -29,6 +29,7 @@
public final SyntheticKind API_MODEL_STUB = generator.forGlobalClass();
// Classpath only synthetics in the global type namespace.
+ public final SyntheticKind GENERIC_API_CONVERSION_STUB = generator.forGlobalClasspathClass();
public final SyntheticKind RETARGET_STUB = generator.forGlobalClasspathClass();
public final SyntheticKind EMULATED_INTERFACE_MARKER_CLASS = generator.forGlobalClasspathClass();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
index 8a0cd60..920798f 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/StackWalkerTest.java
@@ -15,7 +15,6 @@
import com.android.tools.r8.ToolHelper.DexVm.Version;
import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
-import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.StringUtils;
@@ -40,14 +39,17 @@
Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "stackwalker.jar");
private static final String EXPECTED_OUTPUT =
StringUtils.lines("[main]", "[frame2, frame1, main]");
- private static final String EXPECTED_OUTPUT_R8_MINIMAL = StringUtils.lines("[main]", "[main]");
- private static final String EXPECTED_OUTPUT_R8 = StringUtils.lines("[main]", "[a, main]");
+ private static final String EXPECTED_OUTPUT_R8 = StringUtils.lines("[main]", "[main]");
private static final String MAIN_CLASS = "stackwalker.Example";
@Parameters(name = "{0}, spec: {1}, {2}")
public static List<Object[]> data() {
return buildParameters(
- getTestParameters().withDexRuntime(Version.MASTER).withAllApiLevels().build(),
+ getTestParameters()
+ .withDexRuntime(Version.MASTER)
+ .withApiLevel(AndroidApiLevel.B)
+ .withApiLevel(AndroidApiLevel.T)
+ .build(),
ImmutableList.of(JDK11_MINIMAL, JDK11, JDK11_PATH),
DEFAULT_SPECIFICATIONS);
}
@@ -79,22 +81,11 @@
testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification)
.addProgramFiles(INPUT_JAR)
.addKeepMainRule(MAIN_CLASS)
- // TODO(b/242948951): Should not need dontobfuscate.
- .applyIf(compilationSpecification.isL8Shrink(), b -> b.addL8KeepRules("-dontobfuscate"))
.overrideLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.MASTER))
// Missing class java.lang.StackWalker$StackFrame.
.addOptionsModification(opt -> opt.ignoreMissingClasses = true)
- .applyIf(
- libraryDesugaringSpecification != JDK11_MINIMAL
- || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER),
- DesugaredLibraryTestBuilder::allowDiagnosticWarningMessages)
.run(parameters.getRuntime(), MAIN_CLASS)
.assertSuccessWithOutput(
- compilationSpecification.isProgramShrink()
- ? ((libraryDesugaringSpecification == JDK11_MINIMAL
- || parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.MASTER))
- ? EXPECTED_OUTPUT_R8_MINIMAL
- : EXPECTED_OUTPUT_R8)
- : EXPECTED_OUTPUT);
+ compilationSpecification.isProgramShrink() ? EXPECTED_OUTPUT_R8 : EXPECTED_OUTPUT);
}
}