Account for inlined positions in outlines
Change-Id: I60d9ca1ef762b077a66767218da59e74ccba0bd7
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 b16cfc4..e0ecef3 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -477,10 +477,10 @@
m, key -> MethodSignature.fromDexMethod(m, m.holder != clazz.getType()));
// Check if mapped position is an outline
- if (mappedPositions.get(0).isOutline) {
+ DexMethod outlineMethod = getOutlineMethod(mappedPositions.get(0));
+ if (outlineMethod != null) {
outlinesToFix
- .computeIfAbsent(
- mappedPositions.get(0).method, ignored -> new OutlineFixupBuilder())
+ .computeIfAbsent(outlineMethod, ignored -> new OutlineFixupBuilder())
.setMappedPositionsOutline(mappedPositions);
methodMappingInfo.add(OutlineMappingInformation.builder().build());
}
@@ -597,6 +597,17 @@
return classNameMapperBuilder.build();
}
+ private static DexMethod getOutlineMethod(MappedPosition mappedPosition) {
+ if (mappedPosition.isOutline) {
+ return mappedPosition.method;
+ }
+ if (mappedPosition.caller == null) {
+ return null;
+ }
+ Position outermostCaller = mappedPosition.caller.getOutermostCaller();
+ return outermostCaller.isOutline() ? outermostCaller.getMethod() : null;
+ }
+
private static MappedRange getMappedRangesForPosition(
DexItemFactory factory,
Function<DexMethod, MethodSignature> getOriginalMethodSignature,