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;