Add backend to dumps

Fixes: b/231424162
Change-Id: Ifd4d7676f104a4ca1f160522cb2840aefefba06b
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index a233e49..4d1269c 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.utils.DumpInputFlags;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions.DesugarState;
+import com.android.tools.r8.utils.ProgramConsumerUtils;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.ThreadUtils;
 import java.nio.file.Path;
@@ -147,6 +148,7 @@
 
   void dumpBaseCommandOptions(DumpOptions.Builder builder) {
     builder
+        .setBackend(ProgramConsumerUtils.getBackend(programConsumer))
         .setCompilationMode(getMode())
         .setMinApi(getMinApiLevel())
         .setOptimizeMultidexForLinearAlloc(isOptimizeMultidexForLinearAlloc())
diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index ef3a443..c8787e5 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.dump;
 
 import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.features.FeatureSplitConfiguration;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
@@ -28,6 +29,7 @@
   // The following keys and values should not be changed to keep the dump utility backward
   // compatible with previous versions. They are also used by the python script compileDump and
   // the corresponding CompileDumpCompatR8 java class.
+  private static final String BACKEND_KEY = "backend";
   private static final String TOOL_KEY = "tool";
   private static final String MODE_KEY = "mode";
   private static final String DEBUG_MODE_VALUE = "debug";
@@ -48,6 +50,7 @@
   private static final String ANDROID_PLATFORM_BUILD = "android-platform-build";
   private static final String TRACE_REFERENCES_CONSUMER = "trace_references_consumer";
 
+  private final Backend backend;
   private final Tool tool;
   private final CompilationMode compilationMode;
   private final int minApi;
@@ -78,6 +81,7 @@
   private final boolean dumpInputToFile;
 
   private DumpOptions(
+      Backend backend,
       Tool tool,
       CompilationMode compilationMode,
       int minAPI,
@@ -99,6 +103,7 @@
       Map<String, String> systemProperties,
       boolean dumpInputToFile,
       String traceReferencesConsumer) {
+    this.backend = backend;
     this.tool = tool;
     this.compilationMode = compilationMode;
     this.minApi = minAPI;
@@ -137,6 +142,7 @@
     }
     if (tool != Tool.TraceReferences) {
       // We keep the following values for backward compatibility.
+      addDumpEntry(buildProperties, BACKEND_KEY, backend.name());
       addDumpEntry(
           buildProperties,
           MODE_KEY,
@@ -183,6 +189,9 @@
 
   private static void parseKeyValue(Builder builder, String key, String value) {
     switch (key) {
+      case BACKEND_KEY:
+        builder.setBackend(Backend.valueOf(value));
+        return;
       case TOOL_KEY:
         builder.setTool(Tool.valueOf(value));
         return;
@@ -303,6 +312,7 @@
   }
 
   public static class Builder {
+    private Backend backend;
     private Tool tool;
     private CompilationMode compilationMode;
     private int minApi;
@@ -333,6 +343,11 @@
 
     public Builder() {}
 
+    public Builder setBackend(Backend backend) {
+      this.backend = backend;
+      return this;
+    }
+
     public Builder setTool(Tool tool) {
       this.tool = tool;
       return this;
@@ -456,7 +471,9 @@
 
     public DumpOptions build() {
       assert tool != null;
+      assert tool == Tool.TraceReferences || backend != null;
       return new DumpOptions(
+          backend,
           tool,
           compilationMode,
           minApi,
diff --git a/src/main/java/com/android/tools/r8/utils/ProgramConsumerUtils.java b/src/main/java/com/android/tools/r8/utils/ProgramConsumerUtils.java
new file mode 100644
index 0000000..e33f72e
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/ProgramConsumerUtils.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.utils;
+
+import com.android.tools.r8.ClassFileConsumer;
+import com.android.tools.r8.DexFilePerClassFileConsumer;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramConsumer;
+import com.android.tools.r8.dex.Marker.Backend;
+
+public class ProgramConsumerUtils {
+
+  public static Backend getBackend(ProgramConsumer programConsumer) {
+    if (isGeneratingClassFiles(programConsumer)) {
+      return Backend.CF;
+    } else {
+      assert isGeneratingDex(programConsumer);
+      return Backend.DEX;
+    }
+  }
+
+  public static boolean isGeneratingClassFiles(ProgramConsumer programConsumer) {
+    return programConsumer instanceof ClassFileConsumer;
+  }
+
+  public static boolean isGeneratingDex(ProgramConsumer programConsumer) {
+    return programConsumer instanceof DexIndexedConsumer
+        || programConsumer instanceof DexFilePerClassFileConsumer;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/AndroidAppDumpsTest.java b/src/test/java/com/android/tools/r8/AndroidAppDumpsTest.java
index 4fda093..88e998c 100644
--- a/src/test/java/com/android/tools/r8/AndroidAppDumpsTest.java
+++ b/src/test/java/com/android/tools/r8/AndroidAppDumpsTest.java
@@ -8,6 +8,7 @@
 
 import com.android.tools.r8.DataResourceProvider.Visitor;
 import com.android.tools.r8.ProgramResource.Kind;
+import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.origin.Origin;
@@ -42,7 +43,7 @@
   @Test
   public void test() throws Exception {
     InternalOptions options = new InternalOptions();
-    options.dumpOptions = DumpOptions.builder(Tool.D8).build();
+    options.dumpOptions = DumpOptions.builder(Tool.D8).setBackend(Marker.Backend.DEX).build();
 
     String dataResourceName = "my-resource.bin";
     byte[] dataResourceData = new byte[] {1, 2, 3};
diff --git a/tools/compiledump.py b/tools/compiledump.py
index 691bdeb..52805f9 100755
--- a/tools/compiledump.py
+++ b/tools/compiledump.py
@@ -289,11 +289,8 @@
   return dump.program_jar()
 
 def determine_class_file(args, build_properties):
-  if args.classfile:
-    return args.classfile
-  if 'classfile' in build_properties:
-    return True
-  return None
+  return args.classfile \
+      or build_properties.get('backend', 'dex').lower() == 'cf'
 
 def determine_android_platform_build(args, build_properties):
   if args.android_platform_build: