Merge commit '08dd46ecb230e7b2ad99a4861e1cf755f9fee780' into dev-release
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");