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())