Version 2.0.22
Conservatively look at all code for identifier name string instructions
when minifying.
Also fix a concrete case which was discovered after the merge in 2.0.21.
This is not merged from master as the code has diverged there.
Bug: 148021799
Change-Id: I8f2a78dc1c0017074fabff82943ea47ee80b7018
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 40eaf83..62988d6 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "2.0.21";
+ public static final String LABEL = "2.0.22";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 1971ae0..7b6df447 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -400,10 +400,11 @@
}
}
- private void synthesizeLambdaClasses(Builder<?> builder, ExecutorService executorService)
+ private void synthesizeLambdaClasses(
+ Builder<?> builder, OptimizationFeedback feedback, ExecutorService executorService)
throws ExecutionException {
if (lambdaRewriter != null) {
- lambdaRewriter.adjustAccessibility(this);
+ lambdaRewriter.adjustAccessibility(this, feedback);
lambdaRewriter.synthesizeLambdaClasses(builder);
lambdaRewriter.optimizeSynthesizedClasses(this, executorService);
}
@@ -467,7 +468,7 @@
builder.setHighestSortingString(highestSortingString);
desugarNestBasedAccess(builder, executor);
- synthesizeLambdaClasses(builder, executor);
+ synthesizeLambdaClasses(builder, simpleOptimizationFeedback, executor);
desugarInterfaceMethods(builder, simpleOptimizationFeedback, ExcludeDexResources, executor);
synthesizeTwrCloseResourceUtilityClass(builder, executor);
synthesizeJava8UtilityClass(builder, executor);
@@ -714,7 +715,7 @@
builder.setHighestSortingString(highestSortingString);
printPhase("Lambda class synthesis");
- synthesizeLambdaClasses(builder, executorService);
+ synthesizeLambdaClasses(builder, feedback, executorService);
printPhase("Interface method desugaring");
desugarInterfaceMethods(builder, feedback, IncludeAllResources, executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 18edf5f..4254d23 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -28,6 +28,7 @@
import com.android.tools.r8.ir.code.Invoke;
import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.conversion.IRConverter;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.synthetic.SynthesizedCode;
import com.android.tools.r8.origin.SynthesizedOrigin;
import com.android.tools.r8.utils.InternalOptions;
@@ -510,7 +511,7 @@
}
// Ensure access of the referenced symbol(s).
- abstract void ensureAccessibility(IRConverter converter);
+ abstract void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback);
DexClass definitionFor(DexType type) {
return rewriter.getAppInfo().app().definitionFor(type);
@@ -553,7 +554,7 @@
}
@Override
- void ensureAccessibility(IRConverter converter) {}
+ void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {}
}
// Used for static private lambda$ methods. Only needs access relaxation.
@@ -564,7 +565,7 @@
}
@Override
- void ensureAccessibility(IRConverter converter) {
+ void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
// We already found the static method to be called, just relax its accessibility.
assert descriptor.getAccessibility() != null;
descriptor.getAccessibility().unsetPrivate();
@@ -584,7 +585,7 @@
}
@Override
- void ensureAccessibility(IRConverter converter) {
+ void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
// For all instantiation points for which the compiler creates lambda$
// methods, it creates these methods in the same class/interface.
DexMethod implMethod = descriptor.implHandle.asMethod();
@@ -610,7 +611,7 @@
encodedMethod.parameterAnnotationsList,
encodedMethod.getCode(),
true);
- newMethod.copyMetadata(encodedMethod);
+ newMethod.copyMetadata(encodedMethod, feedback);
rewriter.methodMapping.put(encodedMethod.method, callTarget);
DexEncodedMethod.setDebugInfoWithFakeThisParameter(
@@ -632,7 +633,7 @@
}
@Override
- void ensureAccessibility(IRConverter converter) {
+ void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
// For all instantiation points for which the compiler creates lambda$
// methods, it creates these methods in the same class/interface.
DexMethod implMethod = descriptor.implHandle.asMethod();
@@ -655,7 +656,7 @@
encodedMethod.parameterAnnotationsList,
encodedMethod.getCode(),
true);
- newMethod.copyMetadata(encodedMethod);
+ newMethod.copyMetadata(encodedMethod, feedback);
rewriter.methodMapping.put(encodedMethod.method, callTarget);
// Move the method from the direct methods to the virtual methods set.
implMethodHolder.removeDirectMethod(i);
@@ -675,7 +676,7 @@
}
@Override
- void ensureAccessibility(IRConverter converter) {
+ void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
// Create a static accessor with proper accessibility.
DexProgramClass accessorClass = programDefinitionFor(callTarget.holder);
assert accessorClass != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 92d04f0..7a2a30f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -33,6 +33,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.conversion.IRConverter;
import com.android.tools.r8.ir.conversion.LensCodeRewriter;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.DescriptorUtils;
@@ -250,13 +251,13 @@
}
/** Adjust accessibility of referenced application symbols or creates necessary accessors. */
- public void adjustAccessibility(IRConverter converter) {
+ public void adjustAccessibility(IRConverter converter, OptimizationFeedback feedback) {
// For each lambda class perform necessary adjustment of the
// referenced symbols to make them accessible. This can result in
// method access relaxation or creation of accessor method.
for (LambdaClass lambdaClass : knownLambdaClasses.values()) {
// This call may cause methodMapping to be updated.
- lambdaClass.target.ensureAccessibility(converter);
+ lambdaClass.target.ensureAccessibility(converter, feedback);
}
if (getAppView().enableWholeProgramOptimizations() && !methodMapping.isEmpty()) {
getAppView()
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index 481a46c..dad4c94 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -157,7 +157,13 @@
|| (encodedMethod.getCode().isCfCode()
&& encodedMethod.getCode().asCfCode().instructions.stream()
.noneMatch(CfInstruction::isDexItemBasedConstString));
- return;
+ // This return statement is commented out on the 2.0 branch. The change merged to fix
+ // b/147718617 (version 2.0.21) revealed that there could be other places where the
+ // identifier name string marker is not propagated. Due to changes to desugaring on the 2.1
+ // version line coverage of the propagation of this flag is unknown. Conservatively looking
+ // at all code for identifier name string instructions is safer.
+ //
+ // return;
}
Code code = encodedMethod.getCode();
assert code != null;