Enable CF on InliningWithoutPositionsTest and fix related bug:
Inlined preamble positions was not inserted.
Change-Id: I3f2b0acafe8c3c27a78d6dc121d262318937dab5
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
index 957a1f3..bc2222f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfSourceCode.java
@@ -182,7 +182,6 @@
private CfState state;
private final CfCode code;
private final DexEncodedMethod method;
- private final Position callerPosition;
private final Origin origin;
private final Reference2IntMap<CfLabel> labelOffsets = new Reference2IntOpenHashMap<>();
@@ -205,7 +204,6 @@
boolean preserveCaller) {
this.code = code;
this.method = method;
- this.callerPosition = callerPosition;
this.origin = origin;
int cfPositionCount = 0;
for (int i = 0; i < code.getInstructions().size(); i++) {
@@ -328,7 +326,7 @@
public void buildPrelude(IRBuilder builder) {
assert !inPrelude;
inPrelude = true;
- state.buildPrelude();
+ state.buildPrelude(canonicalPositions.getPreamblePosition());
setLocalVariableLists();
buildArgumentInstructions(builder);
recordStateForTarget(0, state.getSnapshot());
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
index 8174797..7f4ee72 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CfState.java
@@ -74,8 +74,8 @@
private static final int MAX_UPDATES = 4;
- public void buildPrelude() {
- current = new BaseSnapshot();
+ public void buildPrelude(Position preamblePosition) {
+ current = new BaseSnapshot(preamblePosition);
}
public void clear() {
@@ -92,9 +92,9 @@
current = new BaseSnapshot(locals, stack, position);
}
- public void merge(Snapshot snapshot) {
+ public void merge(Snapshot snapshot, Position preamblePosition) {
if (current == null) {
- current = snapshot == null ? new BaseSnapshot() : snapshot;
+ current = snapshot == null ? new BaseSnapshot(preamblePosition) : snapshot;
} else {
current = merge(current, snapshot, origin);
}
@@ -312,8 +312,8 @@
final SlotType[] stack;
final Position position;
- BaseSnapshot() {
- this(0, 0, Position.none());
+ BaseSnapshot(Position preamblePosition) {
+ this(0, 0, preamblePosition);
}
BaseSnapshot(int locals, int stack, Position position) {
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
index c67cf32..0f8ac65 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestRunner.java
@@ -40,33 +40,49 @@
@RunWith(Parameterized.class)
public class InliningWithoutPositionsTestRunner {
+ enum Backend {
+ CF,
+ DEX
+ }
+
private static final String TEST_CLASS = "InliningWithoutPositionsTestSource";
private static final String TEST_PACKAGE = "com.android.tools.r8.debuginfo";
@ClassRule public static TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+ private final Backend backend;
private final boolean mainPos;
private final boolean foo1Pos;
private final boolean barPos;
private final boolean foo2Pos;
private final Location throwLocation;
- @Parameters(name = "main/foo1/bar/foo2 positions: {0}/{1}/{2}/{3}, throwLocation: {4}")
+ @Parameters(name = "{0}: main/foo1/bar/foo2 positions: {1}/{2}/{3}/{4}, throwLocation: {5}")
public static Collection<Object[]> data() {
List<Object[]> testCases = new ArrayList<>();
+ for (Backend backend : Backend.values()) {
for (int i = 0; i < 16; ++i) {
for (Location throwLocation : Location.values()) {
if (throwLocation != Location.MAIN) {
- testCases.add(
- new Object[] {(i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation});
+ testCases.add(
+ new Object[] {
+ backend, (i & 1) != 0, (i & 2) != 0, (i & 4) != 0, (i & 8) != 0, throwLocation
+ });
}
}
+ }
}
return testCases;
}
public InliningWithoutPositionsTestRunner(
- boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
+ Backend backend,
+ boolean mainPos,
+ boolean foo1Pos,
+ boolean barPos,
+ boolean foo2Pos,
+ Location throwLocation) {
+ this.backend = backend;
this.mainPos = mainPos;
this.foo1Pos = foo1Pos;
this.barPos = barPos;
@@ -79,33 +95,45 @@
// See InliningWithoutPositionsTestSourceDump for the code compiled here.
Path testClassDir = temp.newFolder(TEST_PACKAGE.split(".")).toPath();
Path testClassPath = testClassDir.resolve(TEST_CLASS + ".class");
- Path outputDexPath = temp.newFolder().toPath();
+ Path outputPath = temp.newFolder().toPath();
Files.write(
testClassPath,
InliningWithoutPositionsTestSourceDump.dump(
mainPos, foo1Pos, barPos, foo2Pos, throwLocation));
- AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
Path proguardMapPath = testClassDir.resolve("proguard.map");
- ToolHelper.runR8(
+ R8Command.Builder builder =
R8Command.builder()
.addProgramFiles(testClassPath)
- .setMinApiLevel(minSdk.getLevel())
- .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
- .setOutput(outputDexPath, OutputMode.DexIndexed)
.setMode(CompilationMode.RELEASE)
- .setProguardMapOutputPath(proguardMapPath)
- .build(),
- options -> options.inliningInstructionLimit = 20);
+ .setProguardMapOutputPath(proguardMapPath);
+ if (backend == Backend.DEX) {
+ AndroidApiLevel minSdk = ToolHelper.getMinApiLevelForDexVm();
+ builder
+ .setMinApiLevel(minSdk.getLevel())
+ .addLibraryFiles(ToolHelper.getAndroidJar(minSdk))
+ .setOutput(outputPath, OutputMode.DexIndexed);
+ } else {
+ assert (backend == Backend.CF);
+ builder
+ .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+ .setOutput(outputPath, OutputMode.ClassFile);
+ }
- ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
- artCommandBuilder.appendClasspath(outputDexPath.resolve("classes.dex").toString());
- artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
+ ToolHelper.runR8(builder.build(), options -> options.inliningInstructionLimit = 40);
- ProcessResult result = ToolHelper.runArtRaw(artCommandBuilder);
+ ProcessResult result;
+ if (backend == Backend.DEX) {
+ ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
+ artCommandBuilder.appendClasspath(outputPath.resolve("classes.dex").toString());
+ artCommandBuilder.setMainClass(TEST_PACKAGE + "." + TEST_CLASS);
+ result = ToolHelper.runArtRaw(artCommandBuilder);
+ } else {
+ result = ToolHelper.runJava(outputPath, TEST_PACKAGE + "." + TEST_CLASS);
+ }
assertNotEquals(result.exitCode, 0);
// Verify stack trace.
diff --git a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
index 53d6df3..c72a9c5 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/InliningWithoutPositionsTestSourceDump.java
@@ -61,8 +61,7 @@
}
*/
public static byte[] dump(
- boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation)
- throws Exception {
+ boolean mainPos, boolean foo1Pos, boolean barPos, boolean foo2Pos, Location throwLocation) {
ClassWriter cw = new ClassWriter(0);
FieldVisitor fv;
MethodVisitor mv;