Support dumping for specific builds
Bug: b/236449152
Change-Id: Id0738e2736aa495e69b7b6812d6bc5245128e122
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 55d4411..1d55987 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -118,7 +118,7 @@
return builder.toString();
}
- private Map<String, String> getBuildProperties() {
+ public Map<String, String> getBuildProperties() {
Map<String, String> buildProperties = new LinkedHashMap<>();
addDumpEntry(buildProperties, TOOL_KEY, tool.name());
// We keep the following values for backward compatibility.
diff --git a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
index 8414589..368974b 100644
--- a/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
+++ b/src/main/java/com/android/tools/r8/utils/DumpInputFlags.java
@@ -7,6 +7,9 @@
import com.android.tools.r8.errors.Unreachable;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.regex.Pattern;
public abstract class DumpInputFlags {
@@ -47,7 +50,7 @@
}
public static DumpInputFlags dumpToFile(Path file) {
- return new DumpInputFlags() {
+ return new DumpInputToFileOrDirectoryFlags() {
@Override
public Path getDumpPath() {
@@ -55,13 +58,6 @@
}
@Override
- public boolean shouldDump(DumpOptions options) {
- // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
- // 'tool=R8').
- return true;
- }
-
- @Override
public boolean shouldFailCompilation() {
return true;
}
@@ -69,7 +65,7 @@
}
public static DumpInputFlags dumpToDirectory(Path directory) {
- return new DumpInputFlags() {
+ return new DumpInputToFileOrDirectoryFlags() {
@Override
public Path getDumpPath() {
@@ -77,13 +73,6 @@
}
@Override
- public boolean shouldDump(DumpOptions options) {
- // TODO(b/236449152): Add support for dumping only with specific build properties (e.g.,
- // 'tool=R8').
- return true;
- }
-
- @Override
public boolean shouldFailCompilation() {
return false;
}
@@ -95,4 +84,20 @@
public abstract boolean shouldDump(DumpOptions options);
public abstract boolean shouldFailCompilation();
+
+ abstract static class DumpInputToFileOrDirectoryFlags extends DumpInputFlags {
+
+ @Override
+ public boolean shouldDump(DumpOptions options) {
+ Map<String, String> buildProperties = options.getBuildProperties();
+ for (Entry<String, String> entry : buildProperties.entrySet()) {
+ String valueRegExp =
+ System.getProperty("com.android.tools.r8.dump.filter.buildproperty." + entry.getKey());
+ if (valueRegExp != null && !Pattern.matches(valueRegExp, entry.getValue())) {
+ return false;
+ }
+ }
+ return true;
+ }
+ }
}
diff --git a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
index 9fca511..52aafa3 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
@@ -5,6 +5,7 @@
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
@@ -14,6 +15,7 @@
import com.android.tools.r8.TestParametersCollection;
import com.android.tools.r8.TestRuntime.CfVm;
import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.BooleanUtils;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.DumpInputFlags;
import com.android.tools.r8.utils.ZipUtils;
@@ -80,6 +82,30 @@
}
@Test
+ public void testDumpToFileSystemPropertyWhenMinifying() throws Exception {
+ for (boolean minification : BooleanUtils.values()) {
+ Path dump = temp.newFolder().toPath().resolve("dump.zip");
+ try {
+ testForExternalR8(parameters.getBackend(), parameters.getRuntime())
+ .addJvmFlag("-Dcom.android.tools.r8.dumpinputtofile=" + dump)
+ .addJvmFlag("-Dcom.android.tools.r8.dump.filter.buildproperty.minification=^true$")
+ .addProgramClasses(TestClass.class)
+ .applyIf(!minification, builder -> builder.addKeepRules("-dontobfuscate"))
+ .compile();
+ // Without minification there should be no dump, and thus compilation should succeed.
+ assertFalse(minification);
+ } catch (AssertionError e) {
+ assertTrue(minification);
+ }
+ if (minification) {
+ verifyDump(dump, false, true);
+ } else {
+ assertFalse(Files.exists(dump));
+ }
+ }
+ }
+
+ @Test
public void testDumpToFileCLI() throws Exception {
Path dump = temp.newFolder().toPath().resolve("dump.zip");
try {