Ensure we emit a new position after seeing an outline caller
Bug: b/263357015
Bug: b/293630963
Bug: b/294904638
Change-Id: I10d31404dcc88fec51cb80981b9b62ba67f4a3d1
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index 399d2b7..200e8b4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -258,9 +258,13 @@
nextPosition.getCallerPosition() != previousPosition.getCallerPosition()
|| nextPosition.getMethod() != previousPosition.getMethod();
boolean isOutline = nextPosition.isOutline();
- boolean isOutlineCallee =
- nextPosition.getOutlineCallee() != null && !nextPosition.getOutlinePositions().isEmpty();
- if (isNewPosition || isOutline || isOutlineCallee) {
+ boolean isOutlineCallerWithInfo =
+ nextPosition.isOutlineCaller()
+ && nextPosition.getOutlineCallee() != null
+ && !nextPosition.getOutlinePositions().isEmpty();
+ boolean isNoLongerOutlineCaller =
+ previousPosition.isOutlineCaller() && !nextPosition.isOutlineCaller();
+ if (isNewPosition || isOutline || isOutlineCallerWithInfo || isNoLongerOutlineCaller) {
events.add(factory.createPositionFrame(nextPosition));
}
addDefaultEventWithAdvancePcIfNecessary(lineDelta, pcDelta, events, factory);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineMappingInformationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineMappingInformationTest.java
index a51667e..8f8d723 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineMappingInformationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineMappingInformationTest.java
@@ -95,14 +95,10 @@
assertEquals(5, inspector.allClasses().size());
assertEquals(expectedStackTrace, stackTrace);
});
- String proguardMap = compileResult.getProguardMap();
-
- if (parameters.isDexRuntime()) {
- // TODO(b/263357015, b/293630963): Outline information is not reset for new default events.
- assertEquals(6, StringUtils.occurrences(proguardMap, "com.android.tools.r8.outlineCallsite"));
- } else {
- assertEquals(4, StringUtils.occurrences(proguardMap, "com.android.tools.r8.outlineCallsite"));
- }
+ assertEquals(
+ 4,
+ StringUtils.occurrences(
+ compileResult.getProguardMap(), "com.android.tools.r8.outlineCallsite"));
}
@NoHorizontalClassMerging