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)