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;