Merge "Add passthrough option and update round-trip tool to use the D8 processing."
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 9c354df..0e39dae 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -333,6 +333,8 @@
     internal.skipMinification = true;
     assert internal.useTreeShaking;
     internal.useTreeShaking = false;
+    assert !internal.passthroughDexCode;
+    internal.passthroughDexCode = true;
 
     // Disable some of R8 optimizations.
     assert internal.inlineAccessors;
diff --git a/src/main/java/com/android/tools/r8/DexRoundTrip.java b/src/main/java/com/android/tools/r8/DexRoundTrip.java
index c99e939..b6bebbb 100644
--- a/src/main/java/com/android/tools/r8/DexRoundTrip.java
+++ b/src/main/java/com/android/tools/r8/DexRoundTrip.java
@@ -3,57 +3,41 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import com.android.tools.r8.ProgramResource.Kind;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.ExceptionUtils;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.google.common.io.ByteStreams;
 import java.io.IOException;
-import java.io.InputStream;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
 
 public class DexRoundTrip {
 
-  public static AndroidApp process(Collection<ProgramResource> dexResources)
-      throws CompilationFailedException {
-    InternalOptions options = new InternalOptions();
-    options.useTreeShaking = false;
-    options.skipMinification = true;
-    options.ignoreMissingClasses = true;
-    options.enableDesugaring = false;
-    AndroidAppConsumers consumer = new AndroidAppConsumers(options);
-    AndroidApp.Builder builder = AndroidApp.builder();
-    ExceptionUtils.withR8CompilationHandler(
-        options.reporter,
-        () -> {
-          for (ProgramResource resource : dexResources) {
-            try (InputStream stream = resource.getByteStream()) {
-              builder.addDexProgramData(ByteStreams.toByteArray(stream), resource.getOrigin());
-            }
-          }
-          R8.runForTesting(builder.build(), options);
-        });
-    return consumer.build();
+  public static void process(D8Command.Builder builder) throws CompilationFailedException {
+    builder.setDisableDesugaring(true);
+    D8Command command = builder.build();
+    InternalOptions options = command.getInternalOptions();
+    AndroidApp app = command.getInputApp();
+    options.passthroughDexCode = false;
+    ExceptionUtils.withD8CompilationHandler(options.reporter, () -> D8.runForTesting(app, options));
   }
 
   public static void main(String[] args)
       throws CompilationFailedException, IOException, ResourceException {
-    List<ProgramResource> resources = new ArrayList<>(args.length);
+    D8Command.Builder builder = D8Command.builder();
     for (String arg : args) {
       Path file = Paths.get(arg);
       if (!FileUtils.isDexFile(file)) {
         throw new IllegalArgumentException(
             "Only DEX files are supported as inputs. Invalid file: " + file);
       }
-      resources.add(ProgramResource.fromFile(Kind.DEX, file));
+      builder.addProgramFiles(file);
     }
-    AndroidApp result = process(resources);
-    process(result.computeAllProgramResources());
+    AndroidAppConsumers consumer = new AndroidAppConsumers();
+    builder.setProgramConsumer(consumer.wrapDexIndexedConsumer(null));
+    process(builder);
+    process(
+        D8Command.builder(consumer.build()).setProgramConsumer(DexIndexedConsumer.emptyConsumer()));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 9848c3e..e8a4fad 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -317,10 +317,11 @@
   }
 
   void convertMethodToDex(DexEncodedMethod method) throws ApiLevelException {
+    assert options.isGeneratingDex();
     if (method.getCode() != null) {
       boolean matchesMethodFilter = options.methodMatchesFilter(method);
       if (matchesMethodFilter) {
-        if (method.getCode().isJarCode()) {
+        if (!(options.passthroughDexCode && method.getCode().isDexCode())) {
           // We do not process in call graph order, so anything could be a leaf.
           rewriteCode(method, ignoreOptimizationFeedback, x -> true, CallSiteInformation.empty(),
               Outliner::noProcessing);
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 fa32b89..9300e9b 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -69,6 +69,9 @@
 
   public boolean printTimes = false;
 
+  // Flag to toggle if DEX code objects should pass-through without IR processing.
+  public boolean passthroughDexCode = false;
+
   // Optimization-related flags. These should conform to -dontoptimize.
   public boolean skipClassMerging = true;
   public boolean inlineAccessors = true;