[Retrace] Put residual signature in for mapped ranges
Bug: b/241763080
Change-Id: I5f27aae27099594a1fd66ba3a14db60f0a89d4c0
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNaming.java b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
index 83b7b3f..d0d0b63 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
@@ -27,7 +27,7 @@
Range obfuscatedRange,
MemberNaming.MethodSignature originalSignature,
Range originalRange,
- String obfuscatedName);
+ MemberNaming.MethodSignature residualSignature);
public abstract void addMappingInformation(
MappingInformation info, Consumer<MappingInformation> onProhibitedAddition);
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
index 3c83c90..f4bdafa 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
@@ -89,7 +89,7 @@
Range obfuscatedRange,
MemberNaming.MethodSignature originalSignature,
Range originalRange,
- String obfuscatedName) {
+ MemberNaming.MethodSignature residualSignature) {
return null;
}
@@ -172,7 +172,7 @@
// {@link ClassNamingForNameMapper#lookupByOriginalSignature}.
if (renamedSignature.kind() == SignatureKind.METHOD) {
for (MemberNaming memberNaming : methodMembers.values()) {
- if (memberNaming.getRenamedSignature().equals(renamedSignature)) {
+ if (memberNaming.getResidualSignature().equals(renamedSignature)) {
return memberNaming;
}
}
@@ -180,7 +180,7 @@
} else {
assert renamedSignature.kind() == SignatureKind.FIELD;
for (MemberNaming memberNaming : fieldMembers.values()) {
- if (memberNaming.getRenamedSignature().equals(renamedSignature)) {
+ if (memberNaming.getResidualSignature().equals(renamedSignature)) {
return memberNaming;
}
}
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
index 050b1ff..31d05c3 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -60,11 +60,11 @@
@Override
public ClassNaming.Builder addMemberEntry(MemberNaming entry) {
if (entry.isMethodNaming()) {
- methodMembers.put(entry.getRenamedSignature().asMethodSignature(), entry);
+ methodMembers.put(entry.getResidualSignature().asMethodSignature(), entry);
} else {
- fieldMembers.put(entry.getRenamedSignature().asFieldSignature(), entry);
+ fieldMembers.put(entry.getResidualSignature().asFieldSignature(), entry);
mappedFieldNamingsByName
- .computeIfAbsent(entry.getRenamedName(), m -> new ArrayList<>())
+ .computeIfAbsent(entry.getRenamedName(), ignored -> new ArrayList<>())
.add(entry);
}
return this;
@@ -99,10 +99,12 @@
Range minifiedRange,
MemberNaming.MethodSignature originalSignature,
Range originalRange,
- String renamedName) {
+ MemberNaming.MethodSignature residualSignature) {
MappedRange range =
- new MappedRange(minifiedRange, originalSignature, originalRange, renamedName);
- mappedRangesByName.computeIfAbsent(renamedName, k -> new ArrayList<>()).add(range);
+ new MappedRange(minifiedRange, originalSignature, originalRange, residualSignature);
+ mappedRangesByName
+ .computeIfAbsent(residualSignature.getName(), ignored -> new ArrayList<>())
+ .add(range);
return range;
}
@@ -377,8 +379,8 @@
mappedFields ->
mappedFields.forEach(
mappedField -> {
- if (mappedField.renamedSignature.isQualified()) {
- consumer.accept(mappedField.renamedSignature.toHolderFromQualified());
+ if (mappedField.residualSignature.isQualified()) {
+ consumer.accept(mappedField.residualSignature.toHolderFromQualified());
}
}));
mappedRangesByRenamedName
@@ -494,7 +496,7 @@
public final Range minifiedRange; // Can be null, if so then originalRange must also be null.
public final MethodSignature signature;
public final Range originalRange;
- public final String renamedName;
+ private MethodSignature residualSignature;
/**
* The sole purpose of {@link #sequenceNumber} is to preserve the order of members read from a
@@ -505,11 +507,14 @@
private List<MappingInformation> additionalMappingInfo = EMPTY_MAPPING_INFORMATION;
MappedRange(
- Range minifiedRange, MethodSignature signature, Range originalRange, String renamedName) {
+ Range minifiedRange,
+ MethodSignature signature,
+ Range originalRange,
+ MethodSignature residualSignature) {
this.minifiedRange = minifiedRange;
this.signature = signature;
this.originalRange = originalRange;
- this.renamedName = renamedName;
+ this.residualSignature = residualSignature;
}
public void addMappingInformation(
@@ -594,6 +599,14 @@
}
}
+ public MethodSignature getResidualSignature() {
+ return residualSignature;
+ }
+
+ public void setResidualSignatureInternal(MethodSignature residualSignature) {
+ this.residualSignature = residualSignature;
+ }
+
@Override
public String toString() {
StringBuilder builder = new StringBuilder();
@@ -604,7 +617,7 @@
if (originalRange != null && !originalRange.equals(minifiedRange)) {
builder.append(":").append(originalRange);
}
- builder.append(" -> ").append(renamedName);
+ builder.append(" -> ").append(residualSignature.name);
return builder.toString();
}
@@ -624,7 +637,7 @@
return Objects.equals(minifiedRange, that.minifiedRange)
&& Objects.equals(originalRange, that.originalRange)
&& signature.equals(that.signature)
- && renamedName.equals(that.renamedName);
+ && residualSignature.equals(that.residualSignature);
}
@Override
@@ -633,7 +646,7 @@
int result = Objects.hashCode(minifiedRange);
result = 31 * result + Objects.hashCode(originalRange);
result = 31 * result + signature.hashCode();
- result = 31 * result + renamedName.hashCode();
+ result = 31 * result + residualSignature.hashCode();
return result;
}
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
index 3919bbb..c4aebb7 100644
--- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
+++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -447,11 +447,11 @@
for (int i = 0; i < memberNamings.size(); i++) {
MemberNaming memberNaming = memberNamings.get(i);
assert memberNaming.getRenamedName().equals(fieldNaming.getOriginalName());
- if (memberNaming.renamedSignature.equals(fieldNaming.getOriginalSignature())) {
+ if (memberNaming.residualSignature.equals(fieldNaming.getOriginalSignature())) {
memberNamings.set(
i,
new MemberNaming(
- memberNaming.getOriginalSignature(), fieldNaming.getRenamedName()));
+ memberNaming.getOriginalSignature(), fieldNaming.getResidualSignature()));
return;
}
}
@@ -488,7 +488,9 @@
Range minifiedRange = mappedRangeResult.lastRange.minifiedRange;
int endMinifiedPosition = minifiedRange == null ? NO_RANGE_FROM : minifiedRange.to;
methodMembers
- .computeIfAbsent(newMappedRange.renamedName, ignored -> new SegmentTree<>(false))
+ .computeIfAbsent(
+ newMappedRange.getResidualSignature().getName(),
+ ignored -> new SegmentTree<>(false))
.add(
mappedRangeResult.startMinifiedPosition,
endMinifiedPosition,
@@ -619,7 +621,7 @@
newRange.minifiedRange,
existingRange.signature,
existingRange.originalRange,
- newRange.renamedName));
+ newRange.getResidualSignature()));
}
} else {
// First check if the original range matches the existing minified range.
@@ -683,7 +685,7 @@
.getUpdateOutlineCallsiteInformation(
currentOriginalName,
ListUtils.last(newRanges).signature.getName(),
- lastComposedRange.renamedName)
+ lastComposedRange.getResidualSignature().getName())
.setNewMappedRanges(newRanges);
lastComposedRange.addMappingInformation(
computedOutlineInformation.seenOutlineMappingInformation,
@@ -770,7 +772,7 @@
newMinifiedRange,
existingMappedRange.signature,
newOriginalRange,
- newMappedRange.renamedName);
+ newMappedRange.getResidualSignature());
existingMappedRange
.getAdditionalMappingInfo()
.forEach(
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNaming.java b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
index 3437cbb..f8e4d02 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
@@ -45,30 +45,30 @@
}
MemberNaming that = (MemberNaming) o;
- return signature.equals(that.signature) && renamedSignature.equals(that.renamedSignature);
+ return signature.equals(that.signature) && residualSignature.equals(that.residualSignature);
}
@Override
public int hashCode() {
int result = signature.hashCode();
- result = 31 * result + renamedSignature.hashCode();
+ result = 31 * result + residualSignature.hashCode();
return result;
}
/** Original signature of the member. */
final Signature signature;
- /** Renamed signature where types and names could be changed. */
- Signature renamedSignature;
+ /** Residual signature where types and names could be changed. */
+ Signature residualSignature;
/** Position of the member in the file. */
final Position position;
- public MemberNaming(Signature signature, String renamedName) {
- this(signature, signature.asRenamed(renamedName), Position.UNKNOWN);
+ public MemberNaming(Signature signature, Signature residualSignature) {
+ this(signature, residualSignature, Position.UNKNOWN);
}
- public MemberNaming(Signature signature, Signature renamedSignature, Position position) {
+ public MemberNaming(Signature signature, Signature residualSignature, Position position) {
this.signature = signature;
- this.renamedSignature = renamedSignature;
+ this.residualSignature = residualSignature;
this.position = position;
}
@@ -80,12 +80,12 @@
return signature.name;
}
- public Signature getRenamedSignature() {
- return renamedSignature;
+ public Signature getResidualSignature() {
+ return residualSignature;
}
public String getRenamedName() {
- return renamedSignature.name;
+ return residualSignature.name;
}
public boolean isMethodNaming() {
@@ -102,11 +102,11 @@
@Override
public String toString() {
- return signature.toString() + " -> " + renamedSignature.name;
+ return signature.toString() + " -> " + residualSignature.name;
}
- public void setRenamedSignatureInternal(Signature signature) {
- this.renamedSignature = signature;
+ public void setResidualSignatureInternal(Signature signature) {
+ this.residualSignature = signature;
}
public abstract static class Signature {
@@ -335,7 +335,7 @@
}
@Override
- Signature asRenamed(String renamedName) {
+ MethodSignature asRenamed(String renamedName) {
return new MethodSignature(renamedName, type, parameters);
}
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 5c6cccb..3c3c106 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -365,15 +365,18 @@
MappingInformationDiagnostics.notAllowedCombination(
info, conflictingInfo, lineNo)));
if (info.isResidualMethodSignatureMappingInformation()) {
- ResidualMethodSignatureMappingInformation residualSignature =
+ ResidualMethodSignatureMappingInformation residualSignatureInfo =
info.asResidualMethodSignatureMappingInformation();
- currentMember.setRenamedSignatureInternal(
+ MethodSignature residualSignature =
new MethodSignature(
currentMember.getRenamedName(),
- DescriptorUtils.descriptorToJavaType(residualSignature.getReturnType()),
+ DescriptorUtils.descriptorToJavaType(
+ residualSignatureInfo.getReturnType()),
ArrayUtils.mapToStringArray(
- residualSignature.getParameters(),
- DescriptorUtils::descriptorToJavaType)));
+ residualSignatureInfo.getParameters(),
+ DescriptorUtils::descriptorToJavaType));
+ currentMember.setResidualSignatureInternal(residualSignature);
+ currentRange.setResidualSignatureInternal(residualSignature);
}
}
});
@@ -419,13 +422,21 @@
skipWhitespace();
String renamedName = parseMethodName();
- if (signature instanceof MethodSignature) {
+ if (signature.isMethodSignature()) {
+ MethodSignature residualSignature;
+ if (activeMappedRange != null
+ && activeMappedRange.signature == signature
+ && activeMappedRange.getResidualSignature().getName().equals(renamedName)) {
+ residualSignature = activeMappedRange.getResidualSignature();
+ } else {
+ residualSignature = signature.asMethodSignature().asRenamed(renamedName);
+ }
activeMappedRange =
classNamingBuilder.addMappedRange(
- mappedRange, (MethodSignature) signature, originalRange, renamedName);
+ mappedRange, signature.asMethodSignature(), originalRange, residualSignature);
}
- assert mappedRange == null || signature instanceof MethodSignature;
+ assert mappedRange == null || signature.isMethodSignature();
// If this line refers to a member that should be added to classNamingBuilder (as opposed to
// an inner inlined callee) and it's different from the the previous activeMemberNaming, then
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 d71f6b5..4885cb5 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -633,22 +633,21 @@
MethodSignature originalSignature =
MethodSignature.fromDexMethod(originalMethod, originalMethod.holder != originalType);
- DexString obfuscatedNameDexString =
- appView.getNamingLens().lookupName(method.getReference());
- String obfuscatedName = obfuscatedNameDexString.toString();
-
List<MappingInformation> methodMappingInfo = new ArrayList<>();
if (definition.isD8R8Synthesized()) {
methodMappingInfo.add(CompilerSynthesizedMappingInformation.builder().build());
}
+ DexMethod residualMethod =
+ appView.getNamingLens().lookupMethod(method.getReference(), appView.dexItemFactory());
+
MapVersion mapFileVersion = appView.options().getMapFileVersion();
if (isIdentityMapping(
mapFileVersion,
mappedPositions,
methodMappingInfo,
method,
- obfuscatedNameDexString,
+ residualMethod.getName(),
originalMethod,
originalType)) {
assert appView.options().lineNumberOptimization == LineNumberOptimization.OFF
@@ -660,10 +659,12 @@
if (mapFileVersion.isGreaterThan(MapVersion.MAP_VERSION_2_1)
&& originalMethod != method.getReference()) {
methodMappingInfo.add(
- ResidualMethodSignatureMappingInformation.fromDexMethod(method.getReference()));
+ ResidualMethodSignatureMappingInformation.fromDexMethod(residualMethod));
}
- MemberNaming memberNaming = new MemberNaming(originalSignature, obfuscatedName);
+ MethodSignature residualSignature = MethodSignature.fromDexMethod(residualMethod);
+
+ MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
onDemandClassNamingBuilder.computeIfAbsent().addMemberEntry(memberNaming);
// Add simple "a() -> b" mapping if we won't have any other with concrete line numbers
@@ -671,7 +672,7 @@
MappedRange range =
onDemandClassNamingBuilder
.computeIfAbsent()
- .addMappedRange(null, originalSignature, null, obfuscatedName);
+ .addMappedRange(null, originalSignature, null, residualSignature);
methodMappingInfo.forEach(
info -> range.addMappingInformation(info, Unreachable::raise));
continue;
@@ -745,7 +746,7 @@
getOriginalMethodSignature,
classNamingBuilder,
firstPosition.method,
- obfuscatedName,
+ residualSignature,
obfuscatedRange,
nonCardinalRangeCache.get(
firstPosition.originalLine, lastPosition.originalLine),
@@ -774,7 +775,7 @@
getOriginalMethodSignature,
classNamingBuilder,
position.getMethod(),
- obfuscatedName,
+ residualSignature,
nonCardinalRangeCache.get(
placeHolderLineToBeFixed, placeHolderLineToBeFixed),
nonCardinalRangeCache.get(position.getLine(), position.getLine()),
@@ -884,7 +885,7 @@
Function<DexMethod, MethodSignature> getOriginalMethodSignature,
Builder classNamingBuilder,
DexMethod method,
- String obfuscatedName,
+ MethodSignature residualSignature,
Range obfuscatedRange,
Range originalLine,
Position caller,
@@ -895,7 +896,7 @@
obfuscatedRange,
getOriginalMethodSignature.apply(method),
originalLine,
- obfuscatedName);
+ residualSignature);
int inlineFramesCount = 0;
while (caller != null) {
inlineFramesCount += 1;
@@ -912,7 +913,7 @@
getOriginalMethodSignature.apply(caller.getMethod()),
cardinalRangeCache.get(
Math.max(caller.getLine(), 0)), // Prevent against "no-position".
- obfuscatedName);
+ residualSignature);
if (caller.isRemoveInnerFramesIfThrowingNpe()) {
lastMappedRange.addMappingInformation(
RewriteFrameMappingInformation.builder()
@@ -1025,11 +1026,13 @@
dexEncodedField -> {
DexField dexField = dexEncodedField.getReference();
DexField originalField = appView.graphLens().getOriginalFieldSignature(dexField);
- DexString renamedName = appView.getNamingLens().lookupName(dexField);
- if (renamedName != originalField.name || originalField.holder != originalType) {
+ DexField residualField =
+ appView.getNamingLens().lookupField(dexField, appView.dexItemFactory());
+ if (residualField.name != originalField.name || originalField.holder != originalType) {
FieldSignature originalSignature =
FieldSignature.fromDexField(originalField, originalField.holder != originalType);
- MemberNaming memberNaming = new MemberNaming(originalSignature, renamedName.toString());
+ MemberNaming memberNaming =
+ new MemberNaming(originalSignature, FieldSignature.fromDexField(residualField));
onDemandClassNamingBuilder.computeIfAbsent().addMemberEntry(memberNaming);
}
});
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 0ecf5e3..2a4799c 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -61,7 +61,7 @@
import org.junit.runners.Parameterized.Parameters;
// TODO(christofferqa): Add tests to check that statically typed invocations on method handles
-// continue to work after class merging.
+// continue to work after class merging.
@RunWith(Parameterized.class)
public class VerticalClassMergerTest extends TestBase {
@@ -539,7 +539,7 @@
.toString()
.equals("java.lang.String classmerging.ProguardFieldMapTest$A.f")
&& fieldNaming
- .getRenamedSignature()
+ .getResidualSignature()
.toString()
.equals("java.lang.String f")));
}
@@ -587,7 +587,7 @@
methodNaming
.getOriginalSignature()
.toString()
- .equals(methodNaming.getRenamedSignature().toString())));
+ .equals(methodNaming.getResidualSignature().toString())));
// Try with vertical class merging.
Set<String> preservedClassNames =
@@ -620,7 +620,7 @@
.toString()
.equals("void classmerging.ProguardMethodMapTest$A.method()")
&& methodNaming
- .getRenamedSignature()
+ .getResidualSignature()
.toString()
.equals("void method$classmerging$ProguardMethodMapTest$A()")));
}
@@ -677,7 +677,7 @@
.signature
.toString()
.equals("void classmerging.ProguardMethodMapTest$A.method()")
- && mappedRange.renamedName.equals("method")));
+ && mappedRange.getResidualSignature().getName().equals("method")));
// Try with vertical class merging.
Set<String> preservedClassNames =
@@ -717,7 +717,7 @@
.signature
.toString()
.equals("void classmerging.ProguardMethodMapTest$A.method()")
- && mappedRange.renamedName.equals("method")));
+ && mappedRange.getResidualSignature().getName().equals("method")));
}
@Test