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())));