Add an option for D8 cf to cf desugar not adding a marker
Fixes: 191469661
Change-Id: I13d5f88ebedd60792a1b1b7d4858323e76d05d52
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
index 74d7686..dcf4d30 100644
--- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -119,12 +119,23 @@
}
}
+ private boolean includeMarker(Marker marker) {
+ if (marker.isRelocator()) {
+ return false;
+ }
+ assert marker.isCfBackend() || marker.isDexBackend();
+ if (options.desugarSpecificOptions().noCfMarkerForDesugaredCode) {
+ return !marker.isCfBackend() || !marker.isDesugared();
+ }
+ return true;
+ }
+
private void writeApplication(ClassFileConsumer consumer) {
if (proguardMapSupplier != null && options.proguardMapConsumer != null) {
marker.setPgMapId(proguardMapSupplier.writeProguardMap().get());
}
Optional<String> markerString =
- marker.isRelocator() ? Optional.empty() : Optional.of(marker.toString());
+ includeMarker(marker) ? Optional.of(marker.toString()) : Optional.empty();
LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(appView);
for (DexProgramClass clazz : application.classes()) {
assert SyntheticNaming.verifyNotInternalSynthetic(clazz.getType());
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 ff1643f..7509f2a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1188,6 +1188,9 @@
// will be passed-through without the problematic rewritings applied.
public boolean allowAllDesugaredInput =
System.getProperty("com.android.tools.r8.allowAllDesugaredInput") != null;
+ // See b/191469661 for why this is here.
+ public boolean noCfMarkerForDesugaredCode =
+ System.getProperty("com.android.tools.r8.noCfMarkerForDesugaredCode") != null;
}
public static class CallSiteOptimizationOptions {
diff --git a/src/test/java/com/android/tools/r8/MarkersTest.java b/src/test/java/com/android/tools/r8/MarkersTest.java
index f1baee5..d883360 100644
--- a/src/test/java/com/android/tools/r8/MarkersTest.java
+++ b/src/test/java/com/android/tools/r8/MarkersTest.java
@@ -16,6 +16,7 @@
import static com.android.tools.r8.MarkerMatcher.markerTool;
import static org.hamcrest.CoreMatchers.allOf;
import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.assertTrue;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.dex.Marker;
@@ -37,26 +38,36 @@
@RunWith(Parameterized.class)
public class MarkersTest extends TestBase {
- @Parameterized.Parameters(name = "{0}, compilationMode {1}, shrinkDesugaredLibrary {2}")
+ @Parameterized.Parameters(
+ name = "{0}, compilationMode {1}, shrinkDesugaredLibrary {2}, noCfMarkerForDesugaredCode {3}")
public static Collection<Object[]> data() {
return buildParameters(
getTestParameters().withNoneRuntime().build(),
CompilationMode.values(),
+ BooleanUtils.values(),
BooleanUtils.values());
}
private final CompilationMode compilationMode;
private final boolean shrinkDesugaredLibrary;
+ private final boolean noCfMarkerForDesugaredCode;
public MarkersTest(
- TestParameters parameters, CompilationMode compilationMode, boolean shrinkDesugaredLibrary) {
+ TestParameters parameters,
+ CompilationMode compilationMode,
+ boolean shrinkDesugaredLibrary,
+ boolean noCfMarkerForDesugaredCode) {
parameters.assertNoneRuntime();
this.compilationMode = compilationMode;
this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+ this.noCfMarkerForDesugaredCode = noCfMarkerForDesugaredCode;
}
@Test
public void testL8Marker() throws Throwable {
+ // This option is not relevant for L8.
+ assumeTrue(!noCfMarkerForDesugaredCode);
+
AndroidApiLevel apiLevel = AndroidApiLevel.L;
Path output = temp.newFolder().toPath().resolve("desugar_jdk_libs.zip");
L8Command.Builder builder =
@@ -109,7 +120,12 @@
.setMode(compilationMode)
.setMinApiLevel(apiLevel.getLevel())
.setOutput(output, OutputMode.DexIndexed);
- D8.run(builder.build());
+ if (noCfMarkerForDesugaredCode) {
+ ToolHelper.runD8(
+ builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+ } else {
+ D8.run(builder.build());
+ }
Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
Matcher<Marker> matcher =
allOf(
@@ -136,17 +152,24 @@
.setMode(compilationMode)
.setMinApiLevel(apiLevel.getLevel())
.setOutput(output, OutputMode.ClassFile);
- D8.run(builder.build());
- Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
- Matcher<Marker> matcher =
- allOf(
- markerTool(Tool.D8),
- markerCompilationMode(compilationMode),
- markerBackend(Backend.CF),
- markerIsDesugared(),
- markerMinApi(apiLevel),
- not(markerHasDesugaredLibraryIdentifier()));
- assertMarkersMatch(markers, matcher);
+ if (noCfMarkerForDesugaredCode) {
+ ToolHelper.runD8(
+ builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+ Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
+ assertTrue(markers.isEmpty());
+ } else {
+ D8.run(builder.build());
+ Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
+ Matcher<Marker> matcher =
+ allOf(
+ markerTool(Tool.D8),
+ markerCompilationMode(compilationMode),
+ markerBackend(Backend.CF),
+ markerIsDesugared(),
+ markerMinApi(apiLevel),
+ not(markerHasDesugaredLibraryIdentifier()));
+ assertMarkersMatch(markers, matcher);
+ }
}
@Test
@@ -164,7 +187,13 @@
.setMode(compilationMode)
.setMinApiLevel(apiLevel.getLevel())
.setOutput(output, OutputMode.DexIndexed);
- R8.run(builder.build());
+ if (noCfMarkerForDesugaredCode) {
+ ToolHelper.runR8(
+ builder.build(),
+ options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+ } else {
+ R8.run(builder.build());
+ }
Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
Matcher<Marker> matcher =
allOf(
@@ -190,7 +219,13 @@
.addProguardConfiguration(ImmutableList.of("-keep class * { *; }"), Origin.unknown())
.setMode(compilationMode)
.setOutput(output, OutputMode.ClassFile);
- R8.run(builder.build());
+ if (noCfMarkerForDesugaredCode) {
+ ToolHelper.runR8(
+ builder.build(),
+ options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+ } else {
+ R8.run(builder.build());
+ }
Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(output);
Matcher<Marker> matcher =
allOf(
@@ -210,23 +245,29 @@
AndroidApiLevel apiLevel = AndroidApiLevel.L;
Path d8DesugaredOutput = temp.newFolder().toPath().resolve("output.zip");
- D8.run(
+ D8Command.Builder builder =
D8Command.builder()
.addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
.addProgramFiles(ToolHelper.getClassFileForTestClass(TestClass.class))
.setMode(compilationMode)
.setMinApiLevel(apiLevel.getLevel())
- .setOutput(d8DesugaredOutput, OutputMode.ClassFile)
- .build());
- assertMarkersMatch(
- ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput),
- allOf(
- markerTool(Tool.D8),
- markerCompilationMode(compilationMode),
- markerIsDesugared(),
- markerMinApi(apiLevel),
- not(markerHasDesugaredLibraryIdentifier())));
-
+ .setOutput(d8DesugaredOutput, OutputMode.ClassFile);
+ if (noCfMarkerForDesugaredCode) {
+ ToolHelper.runD8(
+ builder, options -> options.desugarSpecificOptions().noCfMarkerForDesugaredCode = true);
+ Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput);
+ assertTrue(markers.isEmpty());
+ } else {
+ D8.run(builder.build());
+ assertMarkersMatch(
+ ExtractMarker.extractMarkerFromDexFile(d8DesugaredOutput),
+ allOf(
+ markerTool(Tool.D8),
+ markerCompilationMode(compilationMode),
+ markerIsDesugared(),
+ markerMinApi(apiLevel),
+ not(markerHasDesugaredLibraryIdentifier())));
+ }
// Running R8 on desugared input will clear that information and leave no markers with
// that information.
Path output = temp.newFolder().toPath().resolve("output.zip");