Add backend to marker to disambiguate cf and dex output

Bug: 170798257
Change-Id: I34a956e3c47c1633ecdf439c97f15a26adf1f4da
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index b4852a3..c915fe7 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -27,6 +27,7 @@
   public static final String SHA1 = "sha-1";
   public static final String COMPILATION_MODE = "compilation-mode";
   public static final String HAS_CHECKSUMS = "has-checksums";
+  public static final String BACKEND = "backend";
   public static final String PG_MAP_ID = "pg-map-id";
   public static final String R8_MODE = "r8-mode";
   private static final String NO_LIBRARY_DESUGARING = "<no-library-desugaring>";
@@ -42,6 +43,11 @@
     }
   }
 
+  public enum Backend {
+    CF,
+    DEX
+  }
+
   private static final char PREFIX_CHAR = '~';
   private static final String PREFIX = "~~";
   private static final String D8_PREFIX = PREFIX + Tool.D8 + "{";
@@ -198,6 +204,24 @@
     return this;
   }
 
+  public boolean hasBackend() {
+    return jsonObject.has(BACKEND);
+  }
+
+  public String getBackend() {
+    if (!hasBackend()) {
+      // Before adding backend we would always compile to dex if min-api was specified.
+      return hasMinApi() ? "dex" : "cf";
+    }
+    return jsonObject.get(BACKEND).getAsString();
+  }
+
+  public Marker setBackend(Backend backend) {
+    assert !hasBackend();
+    jsonObject.addProperty(BACKEND, backend.name().toLowerCase());
+    return this;
+  }
+
   public boolean getHasChecksums() {
     return jsonObject.get(HAS_CHECKSUMS).getAsBoolean();
   }
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 52ed8b2..90d5bda 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -16,6 +16,7 @@
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.Version;
 import com.android.tools.r8.dex.Marker;
+import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.IncompleteNestNestDesugarDiagnosic;
@@ -348,6 +349,7 @@
         new Marker(tool)
             .setVersion(Version.LABEL)
             .setCompilationMode(debug ? CompilationMode.DEBUG : CompilationMode.RELEASE)
+            .setBackend(isGeneratingClassFiles() ? Backend.CF : Backend.DEX)
             .setHasChecksums(encodeChecksums);
     // Compiling with D8 and L8 is always with a min API level and desugaring to that level. If
     // desugaring is explicitly turned off for D8 the input is expected to already have been
diff --git a/src/test/java/com/android/tools/r8/ExtractMarkerTest.java b/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
index 008ff1f..7cbcf63 100644
--- a/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
+++ b/src/test/java/com/android/tools/r8/ExtractMarkerTest.java
@@ -9,6 +9,8 @@
 
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Paths;
 import java.util.Collection;
@@ -120,4 +122,24 @@
             .build());
     assertTrue(testExecuted[0]);
   }
+
+  @Test
+  public void backendValueCompatibilityTestForMinApi() {
+    DexItemFactory factory = new DexItemFactory();
+    DexString markerString =
+        factory.createString(
+            "~~D8{\"compilation-mode\":\"debug\",\"has-checksums\":false,"
+                + "\"min-api\":21,\"sha-1\":\"engineering\",\"version\":\"master\" }");
+    assertEquals("dex", Marker.parse(markerString).getBackend());
+  }
+
+  @Test
+  public void backendValueCompatibilityTestForR8Cf() {
+    DexItemFactory factory = new DexItemFactory();
+    DexString markerString =
+        factory.createString(
+            "~~R8{\"compilation-mode\":\"release\",\"has-checksums\":true,"
+                + "\"sha-1\":\"engineering\",\"version\":\"master\" }");
+    assertEquals("cf", Marker.parse(markerString).getBackend());
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/MarkerMatcher.java b/src/test/java/com/android/tools/r8/MarkerMatcher.java
index ea6ea4a..d766770 100644
--- a/src/test/java/com/android/tools/r8/MarkerMatcher.java
+++ b/src/test/java/com/android/tools/r8/MarkerMatcher.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
+import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -108,6 +109,20 @@
     };
   }
 
+  public static Matcher<Marker> markerBackend(Backend backend) {
+    return new MarkerMatcher() {
+      @Override
+      protected boolean eval(Marker marker) {
+        return marker.getBackend().equals(backend.name().toLowerCase());
+      }
+
+      @Override
+      protected void explain(Description description) {
+        description.appendText(Marker.BACKEND + " ").appendText(backend.name().toLowerCase());
+      }
+    };
+  }
+
   public static Matcher<Marker> markerIsDesugared() {
     return new MarkerMatcher() {
       @Override
diff --git a/src/test/java/com/android/tools/r8/MarkersTest.java b/src/test/java/com/android/tools/r8/MarkersTest.java
index 650cf39..1fdc6ae 100644
--- a/src/test/java/com/android/tools/r8/MarkersTest.java
+++ b/src/test/java/com/android/tools/r8/MarkersTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8;
 
 import static com.android.tools.r8.MarkerMatcher.assertMarkersMatch;
+import static com.android.tools.r8.MarkerMatcher.markerBackend;
 import static com.android.tools.r8.MarkerMatcher.markerCompilationMode;
 import static com.android.tools.r8.MarkerMatcher.markerDesugaredLibraryIdentifier;
 import static com.android.tools.r8.MarkerMatcher.markerHasChecksums;
@@ -118,6 +119,7 @@
         allOf(
             markerTool(Tool.D8),
             markerCompilationMode(compilationMode),
+            markerBackend(Backend.DEX),
             markerIsDesugared(),
             markerMinApi(apiLevel),
             not(markerHasDesugaredLibraryIdentifier()));
@@ -144,6 +146,7 @@
         allOf(
             markerTool(Tool.D8),
             markerCompilationMode(compilationMode),
+            markerBackend(Backend.CF),
             markerIsDesugared(),
             markerMinApi(apiLevel),
             not(markerHasDesugaredLibraryIdentifier()));
@@ -171,6 +174,7 @@
         allOf(
             markerTool(Tool.R8),
             markerCompilationMode(compilationMode),
+            markerBackend(Backend.DEX),
             markerIsDesugared(),
             markerMinApi(apiLevel),
             not(markerHasDesugaredLibraryIdentifier()));
@@ -196,6 +200,7 @@
         allOf(
             markerTool(Tool.R8),
             markerCompilationMode(compilationMode),
+            markerBackend(Backend.CF),
             not(markerIsDesugared()),
             not(markerHasMinApi()),
             not(markerHasDesugaredLibraryIdentifier()));
@@ -242,6 +247,7 @@
         allOf(
             markerTool(Tool.R8),
             markerCompilationMode(compilationMode),
+            markerBackend(Backend.CF),
             not(markerIsDesugared()),
             not(markerHasMinApi()),
             not(markerHasDesugaredLibraryIdentifier())));