Discard synthetic positions when simulating code inlining
Change-Id: I08baf7a02ed6f32aaabfeb6fffc67bf389b37a45
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index 5b71a42..169a880 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -898,7 +898,8 @@
}
@Override
- public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+ public Code getCodeAsInlining(
+ DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
Position callerPosition = SyntheticPosition.builder().setLine(0).setMethod(caller).build();
List<CfInstruction> newInstructions = new ArrayList<>(instructions.size() + 2);
CfLabel firstLabel;
@@ -916,15 +917,18 @@
newInstructions.add(
new CfPosition(
oldPosition.getLabel(),
- oldPosition.getPosition().withOutermostCallerPosition(callerPosition)));
+ newInlineePosition(
+ callerPosition, oldPosition.getPosition(), isCalleeD8R8Synthesized)));
} else {
if (!instruction.isLabel() && !seenPosition) {
Position preamblePosition =
- SyntheticPosition.builder()
- .setMethod(callee)
- .setCallerPosition(callerPosition)
- .setLine(0)
- .build();
+ isCalleeD8R8Synthesized
+ ? callerPosition
+ : SyntheticPosition.builder()
+ .setMethod(callee)
+ .setCallerPosition(callerPosition)
+ .setLine(0)
+ .build();
newInstructions.add(new CfPosition(firstLabel, preamblePosition));
seenPosition = true;
}
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index d0417b4..0475e2c 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.ir.code.IRCode;
import com.android.tools.r8.ir.code.NumberGenerator;
import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.Position.PositionBuilder;
import com.android.tools.r8.ir.conversion.MethodConversionOptions.MutableMethodConversionOptions;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.RetracerForCodePrinting;
@@ -176,7 +177,35 @@
return true;
}
- public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+ public Code getCodeAsInlining(DexMethod caller, DexEncodedMethod callee, DexItemFactory factory) {
+ return getCodeAsInlining(caller, callee.getReference(), factory, callee.isD8R8Synthesized());
+ }
+
+ public Code getCodeAsInlining(
+ DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
throw new Unreachable();
}
+
+ public Position newInlineePosition(
+ Position callerPosition, Position oldPosition, boolean isCalleeD8R8Synthesized) {
+ Position outermostCaller = oldPosition.getOutermostCaller();
+ if (!isCalleeD8R8Synthesized) {
+ return oldPosition.withOutermostCallerPosition(callerPosition);
+ }
+ // We can replace the position since the callee was synthesized by the compiler, however, if
+ // the position carries special information we need to copy it.
+ if (!outermostCaller.isOutline() && !outermostCaller.isRemoveInnerFramesIfThrowingNpe()) {
+ return oldPosition.replacePosition(outermostCaller, callerPosition);
+ }
+ assert !callerPosition.isOutline();
+ PositionBuilder<?, ?> positionBuilder =
+ outermostCaller
+ .builderWithCopy()
+ .setMethod(callerPosition.getMethod())
+ .setLine(callerPosition.getLine());
+ if (callerPosition.isRemoveInnerFramesIfThrowingNpe()) {
+ positionBuilder.setRemoveInnerFramesIfThrowingNpe(true);
+ }
+ return oldPosition.replacePosition(outermostCaller, positionBuilder.build());
+ }
}
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index 048e01d..81caca5 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -279,7 +279,8 @@
}
@Override
- public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+ public Code getCodeAsInlining(
+ DexMethod caller, DexMethod callee, DexItemFactory factory, boolean isCalleeD8R8Synthesized) {
return new DexCode(
registerSize,
incomingRegisterSize,
@@ -287,11 +288,11 @@
instructions,
tries,
handlers,
- debugInfoAsInlining(caller, callee, factory));
+ debugInfoAsInlining(caller, callee, isCalleeD8R8Synthesized, factory));
}
private DexDebugInfo debugInfoAsInlining(
- DexMethod caller, DexMethod callee, DexItemFactory factory) {
+ DexMethod caller, DexMethod callee, boolean isCalleeD8R8Synthesized, DexItemFactory factory) {
Position callerPosition = SyntheticPosition.builder().setLine(0).setMethod(caller).build();
EventBasedDebugInfo eventBasedInfo = DexDebugInfo.convertToEventBased(this, factory);
if (eventBasedInfo == null) {
@@ -299,11 +300,13 @@
// This is consistent with the building IR for inlining which will always ensure the method
// has a position.
Position preamblePosition =
- SyntheticPosition.builder()
- .setMethod(callee)
- .setCallerPosition(callerPosition)
- .setLine(0)
- .build();
+ isCalleeD8R8Synthesized
+ ? callerPosition
+ : SyntheticPosition.builder()
+ .setMethod(callee)
+ .setCallerPosition(callerPosition)
+ .setLine(0)
+ .build();
return new EventBasedDebugInfo(
0,
new DexString[callee.getArity()],
@@ -321,14 +324,17 @@
int i = 0;
newEvents[i++] =
new SetPositionFrame(
- frameBuilder.setMethod(callee).setCallerPosition(callerPosition).build());
+ isCalleeD8R8Synthesized
+ ? callerPosition
+ : frameBuilder.setMethod(callee).setCallerPosition(callerPosition).build());
for (DexDebugEvent event : oldEvents) {
if (event instanceof SetPositionFrame) {
SetPositionFrame oldFrame = (SetPositionFrame) event;
assert oldFrame.getPosition() != null;
newEvents[i++] =
new SetPositionFrame(
- oldFrame.getPosition().withOutermostCallerPosition(callerPosition));
+ newInlineePosition(
+ callerPosition, oldFrame.getPosition(), isCalleeD8R8Synthesized));
} else {
newEvents[i++] = event;
}
diff --git a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
index 3abc2e4..d98d0ea 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyCfCode.java
@@ -175,7 +175,7 @@
}
@Override
- public Code getCodeAsInlining(DexMethod caller, DexMethod callee, DexItemFactory factory) {
+ public Code getCodeAsInlining(DexMethod caller, DexEncodedMethod callee, DexItemFactory factory) {
return asCfCode().getCodeAsInlining(caller, callee, factory);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Position.java b/src/main/java/com/android/tools/r8/ir/code/Position.java
index 653e20e..3662c28 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Position.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Position.java
@@ -46,10 +46,6 @@
return false;
}
- public boolean isAdditionalMappingInfoPosition() {
- return false;
- }
-
public boolean isRemoveInnerFramesIfThrowingNpe() {
return removeInnerFramesIfThrowingNpe;
}
@@ -201,7 +197,8 @@
return HashCodeVisitor.run(this);
}
- private String toString(boolean forceMethod) {
+ @Override
+ public String toString() {
if (isNone()) {
return "--";
}
@@ -210,7 +207,7 @@
builder.append(getFile()).append(":");
}
builder.append("#").append(line);
- if (method != null && (forceMethod || callerPosition != null)) {
+ if (method != null && callerPosition != null) {
builder.append(":").append(method.name);
}
if (callerPosition != null) {
@@ -223,11 +220,6 @@
return builder.toString();
}
- @Override
- public String toString() {
- return toString(false);
- }
-
public abstract PositionBuilder<?, ?> builderWithCopy();
public abstract static class PositionBuilder<
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
index 8d2c8c6..adf23fa 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -210,7 +210,7 @@
definition
.getCode()
.getCodeAsInlining(
- companion.getReference(), method.getReference(), appView.dexItemFactory());
+ companion.getReference(), method.getDefinition(), appView.dexItemFactory());
if (!definition.isStatic()) {
DexEncodedMethod.setDebugInfoWithFakeThisParameter(
code, companion.getReference().getArity(), appView);