Disregard debug set-file events.
Fixes: 202254240
Change-Id: Ia0f11917fb8bfbccbc87018f006bf63aa143faa6
diff --git a/src/main/java/com/android/tools/r8/Disassemble.java b/src/main/java/com/android/tools/r8/Disassemble.java
index 7c4ac49..c36a796 100644
--- a/src/main/java/com/android/tools/r8/Disassemble.java
+++ b/src/main/java/com/android/tools/r8/Disassemble.java
@@ -213,6 +213,7 @@
InternalOptions getInternalOptions() {
InternalOptions internal = new InternalOptions();
internal.useSmaliSyntax = useSmali;
+ internal.readDebugSetFileEvent = true;
return internal;
}
}
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 03e0e31..0601b5c 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -581,7 +581,9 @@
case Constants.DBG_SET_FILE: {
int nameIdx = dexReader.getUleb128p1();
DexString sourceFile = nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx);
- events.add(dexItemFactory.createSetFile(sourceFile));
+ if (options.readDebugSetFileEvent) {
+ events.add(dexItemFactory.createSetFile(sourceFile));
+ }
break;
}
default: {
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
index 1bbd88a..dfd4f1c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.dex.DebugBytecodeWriter;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
+import com.android.tools.r8.errors.InternalCompilerError;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.ir.code.Position;
import com.android.tools.r8.utils.structural.CompareToVisitor;
@@ -457,6 +458,13 @@
}
}
+ /**
+ * Unused/unsupported set-file event.
+ *
+ * <p>The set-file event is unused by all DEX VMs and incorrect on some older VMs. It is
+ * represented in the type of events for completeness, but should never be emitted as part of
+ * writing DEX code.
+ */
public static class SetFile extends DexDebugEvent {
DexString fileName;
@@ -468,8 +476,7 @@
@Override
public void writeOn(
DebugBytecodeWriter writer, ObjectToOffsetMapping mapping, GraphLens graphLens) {
- writer.putByte(Constants.DBG_SET_FILE);
- writer.putString(fileName);
+ throw new InternalCompilerError("Unused/unsupported SetFile event should never be written");
}
@Override
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 747a052..9d2657a 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -281,6 +281,7 @@
public BiPredicate<String, Long> dexClassChecksumFilter = (name, checksum) -> true;
public boolean cfToCfDesugar = false;
public boolean forceAnnotateSynthetics = false;
+ public boolean readDebugSetFileEvent = false;
public int callGraphLikelySpuriousCallEdgeThreshold = 50;
diff --git a/src/test/java/com/android/tools/r8/debuginfo/DebugSetFileSmaliTest.java b/src/test/java/com/android/tools/r8/debuginfo/DebugSetFileSmaliTest.java
index e6c9b84..e64b7d7 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/DebugSetFileSmaliTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/DebugSetFileSmaliTest.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.debuginfo;
import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
@@ -62,7 +62,7 @@
.compile()
.inspect(
inspector -> {
- assertTrue(
+ assertFalse(
Arrays.stream(
inspector
.clazz(CLASS_NAME)
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileSmaliTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileSmaliTest.java
deleted file mode 100644
index de654b8..0000000
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileSmaliTest.java
+++ /dev/null
@@ -1,128 +0,0 @@
-// Copyright (c) 2017, 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.naming;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.code.ConstString;
-import com.android.tools.r8.code.InvokeVirtual;
-import com.android.tools.r8.code.ReturnVoid;
-import com.android.tools.r8.code.SgetObject;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexCode;
-import com.android.tools.r8.graph.DexDebugEvent.SetFile;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.shaking.ProguardConfiguration;
-import com.android.tools.r8.smali.SmaliBuilder;
-import com.android.tools.r8.smali.SmaliBuilder.MethodSignature;
-import com.android.tools.r8.smali.SmaliTestBase;
-import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.StringUtils;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.List;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameter;
-import org.junit.runners.Parameterized.Parameters;
-
-/**
- * Tests -renamesourcefileattribute.
- */
-@RunWith(Parameterized.class)
-public class RenameSourceFileSmaliTest extends SmaliTestBase {
-
- private static final String TEST_FILE = "TestFile.java";
-
- private static final List<String> DEFAULT_PG_CONFIGS =
- ImmutableList.of(
- "-keep class *** { *; }",
- "-dontoptimize",
- "-keepattributes SourceFile,LineNumberTable");
-
- private void configure(ProguardConfiguration.Builder pg) {
- if (renaming) {
- pg.setRenameSourceFileAttribute(TEST_FILE);
- }
- }
-
- @Parameter
- public boolean renaming;
-
- @Parameters(name="renaming:{0}")
- public static Object[] parameters() {
- return new Object[] {true, false};
- }
-
- /**
- * replica of {@link RunArtSmokeTest#test}
- */
- @Test
- public void artSmokeTest() throws Exception {
- // Build simple "Hello, world!" application.
- SmaliBuilder builder = new SmaliBuilder(DEFAULT_CLASS_NAME);
- String originalSourceFile = DEFAULT_CLASS_NAME + FileUtils.JAVA_EXTENSION;
- builder.setSourceFile(originalSourceFile);
- MethodSignature mainSignature = builder.addMainMethod(
- 2,
- ".line 1",
- " sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;",
- " const-string v1, \"Hello, world!\"",
- ".source \"PrintStream.java\"",
- ".line 337",
- " invoke-virtual { v0, v1 }, Ljava/io/PrintStream;->println(Ljava/lang/String;)V",
- ".source \"" + originalSourceFile + "\"",
- ".line 2",
- " return-void"
- );
- Path processedApp = runR8(builder, DEFAULT_PG_CONFIGS, this::configure, null);
-
- DexClass mainClass = getClass(processedApp, DEFAULT_CLASS_NAME);
- verifySourceFileInCodeItem(mainClass, originalSourceFile, TEST_FILE);
-
- DexEncodedMethod mainMethod = getMethod(processedApp, mainSignature);
- assertNotNull(mainMethod);
-
- DexCode code = mainMethod.getCode().asDexCode();
- assertTrue(code.instructions[0] instanceof SgetObject);
- assertTrue(code.instructions[1] instanceof ConstString);
- assertTrue(code.instructions[2] instanceof InvokeVirtual);
- assertTrue(code.instructions[3] instanceof ReturnVoid);
-
- // Run the generated code in Art.
- String result = runArt(processedApp, DEFAULT_MAIN_CLASS_NAME);
- assertEquals(StringUtils.lines("Hello, world!"), result);
-
- verifySourceFileInDebugInfo(code);
- }
-
- private void verifySourceFileInCodeItem(DexClass clazz, String original, String rename) {
- String processedSourceFile = clazz.sourceFile.toString();
- if (renaming) {
- assertEquals(rename, processedSourceFile);
- } else {
- assertEquals(original, processedSourceFile);
- }
- }
-
- private void verifySourceFileInDebugInfo(DexCode code) {
- assertNotNull(code.getDebugInfo());
- assertNotEquals(0, code.getDebugInfo().events.length);
- long setFileCount =
- Arrays.stream(code.getDebugInfo().events)
- .filter(dexDebugEvent -> dexDebugEvent instanceof SetFile)
- .count();
- if (renaming) {
- assertEquals(0, setFileCount);
- } else {
- assertNotEquals(0, setFileCount);
- }
- }
-
-}