Do not map into pruned external synthetics in synthetic finalization
Fixes: b/326850124
Change-Id: Ia2cc6ec72e8180b97fb5bd02162d755267e5f9cc
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 7c1b22f..abd4a13 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -636,11 +636,13 @@
externalSyntheticTypePrefix,
generators,
appView,
- candidateType ->
- equivalences.containsKey(candidateType)
- || appView
- .horizontallyMergedClasses()
- .isMergeSource(candidateType));
+ candidateType -> {
+ if (appView.hasLiveness()
+ && appView.appInfoWithLiveness().wasPruned(candidateType)) {
+ return true;
+ }
+ return equivalences.containsKey(candidateType);
+ });
equivalences.put(representativeType, group);
}
});
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index a6ee92f..35b4218 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -121,8 +121,6 @@
prunedEntries.forEach(
entry -> {
DexType holder = entry.getKey();
- assert appView.appInfo().definitionForWithoutExistenceAssert(holder) == null
- || !appView.appInfo().definitionForWithoutExistenceAssert(holder).isProgramClass();
String typeName = holder.toSourceString();
String sourceFile = entry.getValue();
// We have to pick a right-hand side destination that does not overlap with an existing
@@ -413,14 +411,12 @@
MappedRange lastMappedRange =
getMappedRangesForPosition(
- appView,
getOriginalMethodSignature,
getBuilder(),
firstPosition,
residualSignature,
obfuscatedRange,
originalRange,
- prunedInlinedClasses,
cardinalRangeCache,
canStripOuterFrame);
// firstPosition will contain a potential outline caller.
@@ -450,7 +446,6 @@
positionMap.put((int) line, placeHolderLineToBeFixed);
MappedRange lastRange =
getMappedRangesForPosition(
- appView,
getOriginalMethodSignature,
getBuilder(),
position,
@@ -458,7 +453,6 @@
nonCardinalRangeCache.get(
placeHolderLineToBeFixed, placeHolderLineToBeFixed),
nonCardinalRangeCache.get(position.getLine(), position.getLine()),
- prunedInlinedClasses,
cardinalRangeCache,
canStripOuterFrame);
maxPc.set(lastRange.minifiedRange.to);
@@ -533,14 +527,12 @@
}
private MappedRange getMappedRangesForPosition(
- AppView<?> appView,
Function<DexMethod, MethodSignature> getOriginalMethodSignature,
ClassNaming.Builder classNamingBuilder,
Position position,
MethodSignature residualSignature,
Range obfuscatedRange,
Range originalLine,
- Map<DexType, String> prunedInlineHolder,
CardinalPositionRangeAllocator cardinalRangeCache,
boolean canStripOuterFrame) {
MappedRange lastMappedRange = null;
@@ -555,7 +547,12 @@
DexType holderType = position.getMethod().getHolderType();
String prunedClassSourceFileInfo = appView.getPrunedClassSourceFileInfo(holderType);
if (prunedClassSourceFileInfo != null) {
- String originalValue = prunedInlineHolder.put(holderType, prunedClassSourceFileInfo);
+ assert appView.appInfo().definitionForWithoutExistenceAssert(holderType) == null
+ || !appView
+ .appInfo()
+ .definitionForWithoutExistenceAssert(holderType)
+ .isProgramClass();
+ String originalValue = prunedInlinedClasses.put(holderType, prunedClassSourceFileInfo);
assert originalValue == null || originalValue.equals(prunedClassSourceFileInfo);
}
lastMappedRange =