Merge "Apply the prior lense _after_ finding members to be bound."
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d587efe..13f2404 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -331,6 +331,16 @@
GraphLense graphLense = GraphLense.getIdentityLense();
if (appInfo.hasLiveness()) {
+ if (options.proguardConfiguration.hasApplyMappingFile()) {
+ SeedMapper seedMapper =
+ SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
+ timing.begin("apply-mapping");
+ graphLense =
+ new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
+ application = application.asDirect().rewrittenWithLense(graphLense);
+ appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
+ timing.end();
+ }
graphLense = new MemberRebindingAnalysis(appInfo.withLiveness(), graphLense).run();
// Class merging requires inlining.
if (options.enableClassMerging && options.enableInlining) {
@@ -339,20 +349,11 @@
new VerticalClassMerger(application, appInfo.withLiveness(), graphLense, timing);
graphLense = classMerger.run();
timing.end();
-
+ application = application.asDirect().rewrittenWithLense(graphLense);
appInfo = appInfo.withLiveness()
- .prunedCopyFrom(application, classMerger.getRemovedClasses());
+ .prunedCopyFrom(application, classMerger.getRemovedClasses())
+ .rewrittenWithLense(application.asDirect(), graphLense);
}
- if (options.proguardConfiguration.hasApplyMappingFile()) {
- SeedMapper seedMapper =
- SeedMapper.seedMapperFromFile(options.proguardConfiguration.getApplyMappingFile());
- timing.begin("apply-mapping");
- graphLense =
- new ProguardMapApplier(appInfo.withLiveness(), graphLense, seedMapper).run(timing);
- timing.end();
- }
- application = application.asDirect().rewrittenWithLense(graphLense);
- appInfo = appInfo.withLiveness().rewrittenWithLense(application.asDirect(), graphLense);
// Collect switch maps and ordinals maps.
appInfo = new SwitchMapCollector(appInfo.withLiveness(), options).run();
appInfo = new EnumOrdinalMapCollector(appInfo.withLiveness(), options).run();
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
index c159b9d..f5d48fd 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapApplier.java
@@ -149,27 +149,25 @@
}
});
- // We need to handle a lib class that extends another lib class where some members are not
- // overridden, resulting in absence of definitions. References to those members need to be
- // redirected via lense as well.
- if (clazz.isLibraryClass()) {
- classNaming.forAllFieldNaming(memberNaming -> {
- if (!appliedMemberNaming.contains(memberNaming)) {
- DexField pretendedOriginalField =
- ((FieldSignature) memberNaming.getOriginalSignature())
- .toDexField(appInfo.dexItemFactory, from);
- applyFieldMapping(pretendedOriginalField, memberNaming);
- }
- });
- classNaming.forAllMethodNaming(memberNaming -> {
- if (!appliedMemberNaming.contains(memberNaming)) {
- DexMethod pretendedOriginalMethod =
- ((MethodSignature) memberNaming.getOriginalSignature())
- .toDexMethod(appInfo.dexItemFactory, from);
- applyMethodMapping(pretendedOriginalMethod, memberNaming);
- }
- });
- }
+ // We need to handle a class that extends another class where some members are not overridden,
+ // resulting in absence of definitions. References to those members need to be redirected via
+ // the lense as well.
+ classNaming.forAllFieldNaming(memberNaming -> {
+ if (!appliedMemberNaming.contains(memberNaming)) {
+ DexField pretendedOriginalField =
+ ((FieldSignature) memberNaming.getOriginalSignature())
+ .toDexField(appInfo.dexItemFactory, from);
+ applyFieldMapping(pretendedOriginalField, memberNaming);
+ }
+ });
+ classNaming.forAllMethodNaming(memberNaming -> {
+ if (!appliedMemberNaming.contains(memberNaming)) {
+ DexMethod pretendedOriginalMethod =
+ ((MethodSignature) memberNaming.getOriginalSignature())
+ .toDexMethod(appInfo.dexItemFactory, from);
+ applyMethodMapping(pretendedOriginalMethod, memberNaming);
+ }
+ });
}
private void applyFieldMapping(DexField originalField, MemberNaming memberNaming) {
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index da7a787..9efd5c8 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -116,7 +116,6 @@
private void computeMethodRebinding(Set<DexMethod> methods,
Function<DexMethod, DexEncodedMethod> lookupTarget) {
for (DexMethod method : methods) {
- method = lense.lookupMethod(method);
// We can safely ignore array types, as the corresponding methods are defined in a library.
if (!method.getHolder().isClassType()) {
continue;
@@ -150,7 +149,7 @@
target = bridgeMethod;
}
}
- builder.map(method, validTargetFor(target.method, method));
+ builder.map(method, lense.lookupMethod(validTargetFor(target.method, method)));
}
}
}
@@ -189,7 +188,6 @@
BiFunction<DexClass, DexField, DexEncodedField> lookupTargetOnClass) {
for (Map.Entry<DexField, Set<DexEncodedMethod>> entry : fields.entrySet()) {
DexField field = entry.getKey();
- field = lense.lookupField(field);
DexEncodedField target = lookup.apply(field.getHolder(), field);
// Rebind to the lowest library class or program class. Do not rebind accesses to fields that
// are not visible from the access context.
@@ -197,7 +195,8 @@
if (target != null && target.field != field
&& contexts.stream().allMatch(context ->
isVisibleFromOriginalContext(context.method.getHolder(), target))) {
- builder.map(field, validTargetFor(target.field, field, lookupTargetOnClass));
+ builder.map(field,
+ lense.lookupField(validTargetFor(target.field, field, lookupTargetOnClass)));
}
}
}