Disable PC mapping support.
Bug: 207765521
Bug: 207765416
Change-Id: I909d38e2107743e2c99b415d0f56d8c03e38fbca
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 672fd24..7b0af95 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -736,6 +736,9 @@
public LineNumberOptimization lineNumberOptimization = LineNumberOptimization.ON;
+ // TODO(b/207765416): Enable and remove this once fixed.
+ public boolean enablePcBasedMappingFile = false;
+
public CallSiteOptimizationOptions callSiteOptimizationOptions() {
return callSiteOptimizationOptions;
}
@@ -1785,7 +1788,9 @@
}
public boolean canUseDexPcAsDebugInformation() {
- return lineNumberOptimization == LineNumberOptimization.ON && hasMinApi(AndroidApiLevel.O);
+ return enablePcBasedMappingFile
+ && lineNumberOptimization == LineNumberOptimization.ON
+ && hasMinApi(AndroidApiLevel.O);
}
public boolean isInterfaceMethodDesugaringEnabled() {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
index d6e30b4..6f69813 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DexPcWithDebugInfoForOverloadedMethodsTestRunner.java
@@ -70,6 +70,7 @@
.addKeepAttributeLineNumberTable()
.addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
.setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), MAIN)
.assertFailureWithErrorThatMatches(containsString(EXPECTED))
.inspectOriginalStackTrace(
diff --git a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
index a91f006..cd8a9e8 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
@@ -60,6 +60,7 @@
.addProgramClasses(MAIN)
.setMinApi(parameters.getApiLevel())
.internalEnableMappingOutput()
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), MAIN)
// For a debug build we always expect the output to have actual line information.
.inspectFailure(this::checkHasLineNumberInfo)
@@ -73,6 +74,7 @@
.addProgramClasses(MAIN)
.setMinApi(parameters.getApiLevel())
.internalEnableMappingOutput()
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
// TODO(b/191038746): Enable LineNumberOptimization for release builds for DEX PC Output.
.applyIf(
apiLevelSupportsPcOutput(),
@@ -96,6 +98,7 @@
.release()
.addProgramClasses(MAIN)
.setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), MAIN)
// If compiling without a map output actual debug info should also be retained. Otherwise
// there would not be any way to obtain the actual lines.
@@ -111,6 +114,7 @@
.addKeepMainRule(MAIN)
.addKeepAttributeLineNumberTable()
.setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), MAIN)
.inspectOriginalStackTrace(
(stackTrace, inspector) -> {
diff --git a/src/test/java/com/android/tools/r8/regress/b150400371/DebuginfoForInlineFrameRegressionTest.java b/src/test/java/com/android/tools/r8/regress/b150400371/DebuginfoForInlineFrameRegressionTest.java
index 90617f7..5980332 100644
--- a/src/test/java/com/android/tools/r8/regress/b150400371/DebuginfoForInlineFrameRegressionTest.java
+++ b/src/test/java/com/android/tools/r8/regress/b150400371/DebuginfoForInlineFrameRegressionTest.java
@@ -39,6 +39,7 @@
.addKeepMainRule(InlineInto.class)
.addKeepRules("-keepparameternames")
.setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), InlineInto.class)
.assertSuccessWithOutputLines("42foo")
.inspect(
diff --git a/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTest.java b/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTest.java
new file mode 100644
index 0000000..1eb5db5
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTest.java
@@ -0,0 +1,21 @@
+// Copyright (c) 2021, 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.retrace;
+
+public class StackTraceWithPcAndJumboStringTest {
+
+ public static void foo() {
+ if ((System.nanoTime() > 0 ? "SomeString" : "AndSomeOtherString").length() == 10) {
+ throw new RuntimeException("MoreStrings" + System.nanoTime() + "That Other String");
+ }
+ }
+
+ public static void bar() {
+ foo();
+ }
+
+ public static void main(String[] args) {
+ bar();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTestRunner.java b/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTestRunner.java
new file mode 100644
index 0000000..8db8f1f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/StackTraceWithPcAndJumboStringTestRunner.java
@@ -0,0 +1,105 @@
+// Copyright (c) 2021, 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.retrace;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.naming.retrace.StackTrace;
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class StackTraceWithPcAndJumboStringTestRunner extends TestBase {
+
+ private final TestParameters parameters;
+
+ @Parameterized.Parameters(name = "{0}")
+ public static TestParametersCollection data() {
+ return getTestParameters().withAllRuntimesAndApiLevels().build();
+ }
+
+ public StackTraceWithPcAndJumboStringTestRunner(TestParameters parameters) {
+ this.parameters = parameters;
+ }
+
+ private Class<?> getTestClass() {
+ return StackTraceWithPcAndJumboStringTest.class;
+ }
+
+ @Test
+ public void testReference() throws Exception {
+ testForRuntime(parameters)
+ .addProgramClasses(getTestClass())
+ .run(parameters.getRuntime(), getTestClass())
+ .assertFailureWithErrorThatThrows(RuntimeException.class)
+ .inspectStackTrace(stacktrace -> assertThat(stacktrace, isSame(getExpectedStackTrace())));
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters.getBackend())
+ .addProgramClasses(getTestClass())
+ .noTreeShaking()
+ .addKeepAttributeLineNumberTable()
+ .addKeepAttributeSourceFile()
+ .addKeepMainRule(getTestClass())
+ .setMinApi(parameters.getApiLevel())
+ .addOptionsModification(
+ o -> {
+ o.enablePcBasedMappingFile = true;
+ o.testing.forceJumboStringProcessing = true;
+ })
+ .run(parameters.getRuntime(), getTestClass())
+ .assertFailureWithErrorThatThrows(RuntimeException.class)
+ .inspectStackTrace(
+ stacktrace -> {
+ if (isApiLevelWithPcSupport()) {
+ // TODO(b/207765416): Remove this when PC support works with jumbo string rewriting.
+ assertThat(stacktrace, not(isSame(getExpectedStackTrace())));
+ } else {
+ assertThat(stacktrace, isSame(getExpectedStackTrace()));
+ }
+ });
+ }
+
+ private boolean isApiLevelWithPcSupport() {
+ return parameters.isDexRuntime()
+ && parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevelWithPcAsLineNumberSupport());
+ }
+
+ private StackTrace getExpectedStackTrace() {
+ String className = getTestClass().getName();
+ String sourceFile = getTestClass().getSimpleName() + ".java";
+ return StackTrace.builder()
+ .add(
+ StackTraceLine.builder()
+ .setClassName(className)
+ .setFileName(sourceFile)
+ .setMethodName("foo")
+ .setLineNumber(10)
+ .build())
+ .add(
+ StackTraceLine.builder()
+ .setClassName(className)
+ .setFileName(sourceFile)
+ .setMethodName("bar")
+ .setLineNumber(15)
+ .build())
+ .add(
+ StackTraceLine.builder()
+ .setClassName(className)
+ .setFileName(sourceFile)
+ .setMethodName("main")
+ .setLineNumber(19)
+ .build())
+ .build();
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
index 2fac539..39e844c 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
@@ -12,13 +12,12 @@
import static org.junit.Assert.assertEquals;
import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8Command;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersBuilder;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic;
+import com.android.tools.r8.utils.AndroidApiLevel;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.StringReader;
@@ -40,6 +39,7 @@
public class TreeShakingSpecificTest extends TestBase {
private Backend backend;
+ private AndroidApiLevel minApi = AndroidApiLevel.LATEST;
@Parameters(name = "Backend: {1}")
public static List<Object[]> data() {
@@ -63,18 +63,6 @@
return Files.readAllBytes(Paths.get(EXAMPLES_BUILD_DIR, test, "classes.dex"));
}
- private void finishBuild(R8Command.Builder builder, Path out, String test) throws IOException {
- Path input;
- if (backend == Backend.DEX) {
- builder.setOutput(out, OutputMode.DexIndexed);
- input = Paths.get(EXAMPLES_BUILD_DIR, test, "classes.dex");
- } else {
- builder.setOutput(out, OutputMode.ClassFile);
- input = Paths.get(EXAMPLES_BUILD_DIR, test + ".jar");
- }
- ToolHelper.getAppBuilder(builder).addProgramFiles(input);
- }
-
@Test
public void testIgnoreWarnings() throws Exception {
// Generate R8 processed version without library option.
@@ -86,6 +74,7 @@
builder -> builder.addProgramDexFileData(getProgramDexFileData(test)))
.addKeepRuleFiles(Paths.get(EXAMPLES_DIR, test, "keep-rules.txt"))
.addIgnoreWarnings()
+ .setMinApi(minApi)
.compile();
}
@@ -101,6 +90,7 @@
.addLibraryFiles()
.addKeepRuleFiles(Paths.get(EXAMPLES_DIR, test, "keep-rules.txt"))
.allowDiagnosticErrorMessages()
+ .setMinApi(minApi)
.compileWithExpectedDiagnostics(
diagnostics -> {
diagnostics
@@ -131,6 +121,8 @@
builder -> builder.addProgramDexFileData(getProgramDexFileData(test)))
.addKeepRuleFiles(Paths.get(EXAMPLES_DIR, test, "keep-rules.txt"))
.addOptionsModification(options -> options.enableInlining = false)
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
+ .setMinApi(minApi)
.compile()
.inspectProguardMap(
proguardMap -> {
diff --git a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesTest.java b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesTest.java
index 82bcb21..6413bb8 100644
--- a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesTest.java
@@ -119,6 +119,7 @@
.addKeepRules(keepRules)
.enableSideEffectAnnotations()
.setMinApi(parameters.getApiLevel())
+ .addOptionsModification(o -> o.enablePcBasedMappingFile = true)
.run(parameters.getRuntime(), CLASS)
.inspector()
.clazz(CLASS)