Maintain position info when reprocessing dex code

Bug: b/226699242
Change-Id: I2456a208946914ac3101e9bb0d8a497be0e7ce87
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEntry.java b/src/main/java/com/android/tools/r8/graph/DexDebugEntry.java
index 2547996..f89353c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntry.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntry.java
@@ -4,11 +4,18 @@
 package com.android.tools.r8.graph;
 
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.Position.OutlineCallerPosition;
+import com.android.tools.r8.ir.code.Position.OutlineCallerPosition.OutlineCallerPositionBuilder;
+import com.android.tools.r8.ir.code.Position.OutlinePosition;
+import com.android.tools.r8.ir.code.Position.PositionBuilder;
+import com.android.tools.r8.ir.code.Position.SourcePosition;
+import com.android.tools.r8.utils.Int2StructuralItemArrayMap;
 import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.SortedSet;
 import java.util.TreeSet;
+import java.util.function.Function;
 
 public class DexDebugEntry {
 
@@ -21,6 +28,9 @@
   public final Map<Integer, DebugLocalInfo> locals;
   public final DexMethod method;
   public final Position callerPosition;
+  public final boolean isOutline;
+  public final DexMethod outlineCallee;
+  public final Int2StructuralItemArrayMap<Position> outlineCallerPositions;
 
   public DexDebugEntry(
       boolean lineEntry,
@@ -31,7 +41,10 @@
       boolean epilogueBegin,
       ImmutableMap<Integer, DebugLocalInfo> locals,
       DexMethod method,
-      Position callerPosition) {
+      Position callerPosition,
+      boolean isOutline,
+      DexMethod outlineCallee,
+      Int2StructuralItemArrayMap<Position> outlineCallerPositions) {
     this.lineEntry = lineEntry;
     this.address = address;
     this.line = line;
@@ -42,6 +55,9 @@
     this.method = method;
     assert method != null;
     this.callerPosition = callerPosition;
+    this.isOutline = isOutline;
+    this.outlineCallee = outlineCallee;
+    this.outlineCallerPositions = outlineCallerPositions;
   }
 
   @Override
@@ -67,6 +83,15 @@
         caller = caller.getCallerPosition();
       }
     }
+    if (isOutline) {
+      builder.append(", isOutline = true");
+    }
+    if (outlineCallee != null) {
+      builder.append(", outlineCallee = ").append(outlineCallee);
+    }
+    if (outlineCallerPositions != null) {
+      builder.append(", outlineCallerPositions = ").append(outlineCallerPositions);
+    }
     if (prologueEnd) {
       builder.append(", prologue_end = true");
     }
@@ -89,4 +114,23 @@
     }
     return builder.toString();
   }
+
+  public Position toPosition(Function<Position, Position> canonicalizeCallerPosition) {
+    PositionBuilder<?, ?> positionBuilder;
+    if (outlineCallee != null) {
+      OutlineCallerPositionBuilder outlineCallerPositionBuilder =
+          OutlineCallerPosition.builder().setOutlineCallee(outlineCallee).setIsOutline(isOutline);
+      outlineCallerPositions.forEach(outlineCallerPositionBuilder::addOutlinePosition);
+      positionBuilder = outlineCallerPositionBuilder;
+    } else if (isOutline) {
+      positionBuilder = OutlinePosition.builder();
+    } else {
+      positionBuilder = SourcePosition.builder().setFile(sourceFile);
+    }
+    return positionBuilder
+        .setLine(line)
+        .setMethod(method)
+        .setCallerPosition(canonicalizeCallerPosition.apply(callerPosition))
+        .build();
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
index 2a67e34..5a4fd84 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
@@ -170,7 +170,10 @@
               pending.epilogueBegin,
               getLocals(),
               pending.method,
-              pending.callerPosition));
+              pending.callerPosition,
+              pending.isOutline,
+              pending.outlineCallee,
+              pending.outlineCallerPositions));
     }
     pending =
         new DexDebugEntry(
@@ -182,7 +185,10 @@
             epilogueBegin,
             null,
             positionState.getCurrentMethod(),
-            positionState.getCurrentCallerPosition());
+            positionState.getCurrentCallerPosition(),
+            positionState.isOutline(),
+            positionState.getOutlineCallee(),
+            positionState.getOutlineCallerPositions());
     prologueEnd = false;
     epilogueBegin = false;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
index 6dec27c..a8d0ccd 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -44,7 +44,6 @@
 import com.android.tools.r8.ir.code.CanonicalPositions;
 import com.android.tools.r8.ir.code.CatchHandlers;
 import com.android.tools.r8.ir.code.Position;
-import com.android.tools.r8.ir.code.Position.SourcePosition;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -262,14 +261,8 @@
     // If this instruction has already been inlined then this.method must be the outermost caller.
     assert entry.callerPosition == null
         || entry.callerPosition.getOutermostCaller().getMethod() == originalMethod;
-
     return canonicalPositions.getCanonical(
-        SourcePosition.builder()
-            .setLine(entry.line)
-            .setFile(entry.sourceFile)
-            .setMethod(entry.method)
-            .setCallerPosition(canonicalPositions.canonicalizeCallerPosition(entry.callerPosition))
-            .build());
+        entry.toPosition(canonicalPositions::canonicalizeCallerPosition));
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index a85ff88..78f612a 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -1120,7 +1120,7 @@
     } else if (state.isOutline()) {
       positionBuilder = OutlinePosition.builder();
     } else {
-      positionBuilder = SourcePosition.builder();
+      positionBuilder = SourcePosition.builder().setFile(state.getCurrentFile());
     }
     return positionBuilder
         .setLine(state.getCurrentLine())