Merge commit '34bf016d7e1728395f5e791faa2a1c0cdfb3dcdb' into dev-release
diff --git a/infra/config/global/luci-scheduler.cfg b/infra/config/global/luci-scheduler.cfg index f7f3305..eb725d9 100644 --- a/infra/config/global/luci-scheduler.cfg +++ b/infra/config/global/luci-scheduler.cfg
@@ -59,7 +59,7 @@ gitiles: { repo: "https://r8.googlesource.com/r8" # Version branches are named d8-x.y (up until d8-1.5) or just x.y (from 1.6) - refs: "regexp:refs/heads/(?:d8-)?[0-9]+\\.[0-9]+" + refs: "regexp:refs/heads/(?:d8-)?[0-9]+\\.[0-9]+(\\.[0-9]+)?" path_regexps: "src/main/java/com/android/tools/r8/Version.java" } triggers: "archive_release"
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java index b456ecb..e502f2f 100644 --- a/src/main/java/com/android/tools/r8/D8.java +++ b/src/main/java/com/android/tools/r8/D8.java
@@ -14,7 +14,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis; @@ -244,7 +244,7 @@ appView, options, marker, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), NamingLens.getIdentityLens(), null) .write(options.getClassFileConsumer()); @@ -272,7 +272,7 @@ appView, options, marker == null ? null : ImmutableList.copyOf(markers), - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), namingLens, null) @@ -327,7 +327,7 @@ null, options, null, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), prefixRewritingNamingLens, null,
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java index 94ea634..1171440 100644 --- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java +++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -12,7 +12,7 @@ import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.AndroidApp; @@ -102,7 +102,7 @@ null, options, markers, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), null);
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java index a9d4644..8d2d47d 100644 --- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java +++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -13,7 +13,7 @@ import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.LazyLoadedDexApplication; import com.android.tools.r8.naming.ClassNameMapper; @@ -101,7 +101,7 @@ null, options, markers, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), null,
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java index bbee24d..7913783 100644 --- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java +++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -24,7 +24,7 @@ import com.android.tools.r8.graph.DexProgramClass.ChecksumSupplier; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DirectMappedDexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ParameterAnnotationsList; import com.android.tools.r8.ir.desugar.DesugaredLibraryConfiguration; import com.android.tools.r8.ir.desugar.DesugaredLibraryConfigurationParser; @@ -319,7 +319,7 @@ appView, options, options.getMarker(Tool.L8), - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), NamingLens.getIdentityLens(), null); ClassFileConsumer consumer =
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java index f5059e4..8049508 100644 --- a/src/main/java/com/android/tools/r8/L8.java +++ b/src/main/java/com/android/tools/r8/L8.java
@@ -11,7 +11,7 @@ import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.LazyLoadedDexApplication; import com.android.tools.r8.ir.conversion.IRConverter; import com.android.tools.r8.ir.desugar.PrefixRewritingMapper; @@ -145,7 +145,7 @@ appView, options, options.getMarker(Tool.L8), - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), namingLens, null) .write(options.getClassFileConsumer());
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java index 17ee9af..93f229c 100644 --- a/src/main/java/com/android/tools/r8/R8.java +++ b/src/main/java/com/android/tools/r8/R8.java
@@ -32,8 +32,8 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DirectMappedDexApplication; import com.android.tools.r8.graph.EnumValueInfoMapCollection; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.SubtypingInfo; import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis; @@ -43,16 +43,16 @@ import com.android.tools.r8.ir.desugar.BackportedMethodRewriter; import com.android.tools.r8.ir.desugar.DesugaredLibraryRetargeter; import com.android.tools.r8.ir.desugar.InterfaceMethodRewriter; -import com.android.tools.r8.ir.desugar.NestedPrivateMethodLense; +import com.android.tools.r8.ir.desugar.NestedPrivateMethodLens; import com.android.tools.r8.ir.desugar.R8NestBasedAccessDesugaring; import com.android.tools.r8.ir.optimize.AssertionsRewriter; import com.android.tools.r8.ir.optimize.MethodPoolCollection; import com.android.tools.r8.ir.optimize.NestReducer; import com.android.tools.r8.ir.optimize.SwitchMapCollector; import com.android.tools.r8.ir.optimize.UninstantiatedTypeOptimization; -import com.android.tools.r8.ir.optimize.UninstantiatedTypeOptimization.UninstantiatedTypeOptimizationGraphLense; +import com.android.tools.r8.ir.optimize.UninstantiatedTypeOptimization.UninstantiatedTypeOptimizationGraphLens; import com.android.tools.r8.ir.optimize.UnusedArgumentsCollector; -import com.android.tools.r8.ir.optimize.UnusedArgumentsCollector.UnusedArgumentsGraphLense; +import com.android.tools.r8.ir.optimize.UnusedArgumentsCollector.UnusedArgumentsGraphLens; import com.android.tools.r8.ir.optimize.enums.EnumUnboxingCfMethods; import com.android.tools.r8.ir.optimize.enums.EnumUnboxingRewriter; import com.android.tools.r8.ir.optimize.enums.EnumValueInfoMapCollector; @@ -94,7 +94,7 @@ import com.android.tools.r8.shaking.TreePruner; import com.android.tools.r8.shaking.TreePrunerConfiguration; import com.android.tools.r8.shaking.VerticalClassMerger; -import com.android.tools.r8.shaking.VerticalClassMergerGraphLense; +import com.android.tools.r8.shaking.VerticalClassMergerGraphLens; import com.android.tools.r8.shaking.WhyAreYouKeepingConsumer; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.AndroidApp; @@ -206,7 +206,7 @@ ExecutorService executorService, DexApplication application, AppView<?> appView, - GraphLense graphLense, + GraphLens graphLens, InitClassLens initClassLens, NamingLens namingLens, InternalOptions options, @@ -222,7 +222,7 @@ markers.remove(marker); if (options.isGeneratingClassFiles()) { new CfApplicationWriter( - application, appView, options, marker, graphLense, namingLens, proguardMapSupplier) + application, appView, options, marker, graphLens, namingLens, proguardMapSupplier) .write(options.getClassFileConsumer()); } else { new ApplicationWriter( @@ -231,7 +231,7 @@ options, // Ensure that the marker for this compilation is the first in the list. ImmutableList.<Marker>builder().add(marker).addAll(markers).build(), - graphLense, + graphLens, initClassLens, namingLens, proguardMapSupplier) @@ -438,7 +438,7 @@ RootSet mainDexRootSet = null; MainDexClasses mainDexClasses = MainDexClasses.NONE; if (!options.mainDexKeepRules.isEmpty()) { - assert appView.graphLense().isIdentityLense(); + assert appView.graphLens().isIdentityLens(); // Find classes which may have code executed before secondary dex files installation. SubtypingInfo subtypingInfo = new SubtypingInfo(appView.appInfo().app().asDirect().allClasses(), appView); @@ -462,10 +462,10 @@ if (options.getProguardConfiguration().isAccessModificationAllowed()) { AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness(); SubtypingInfo subtypingInfo = appViewWithLiveness.appInfo().computeSubtypingInfo(); - GraphLense publicizedLense = + GraphLens publicizedLens = ClassAndMemberPublicizer.run( executorService, timing, application, appViewWithLiveness, subtypingInfo); - boolean changed = appView.setGraphLense(publicizedLense); + boolean changed = appView.setGraphLens(publicizedLens); if (changed) { // We can now remove visibility bridges. Note that we do not need to update the // invoke-targets here, as the existing invokes will simply dispatch to the now @@ -475,15 +475,15 @@ } AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness(); - appView.setGraphLense(new MemberRebindingAnalysis(appViewWithLiveness).run()); + appView.setGraphLens(new MemberRebindingAnalysis(appViewWithLiveness).run()); appView.appInfo().withLiveness().getFieldAccessInfoCollection().restrictToProgram(appView); if (options.shouldDesugarNests()) { timing.begin("NestBasedAccessDesugaring"); R8NestBasedAccessDesugaring analyzer = new R8NestBasedAccessDesugaring(appViewWithLiveness); - NestedPrivateMethodLense lens = analyzer.run(executorService, application.builder()); + NestedPrivateMethodLens lens = analyzer.run(executorService, application.builder()); if (lens != null) { - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; appViewWithLiveness.setAppInfo( appViewWithLiveness.appInfo().rewrittenWithLens(application.asDirect(), lens)); @@ -508,9 +508,9 @@ timing.begin("HorizontalStaticClassMerger"); StaticClassMerger staticClassMerger = new StaticClassMerger(appViewWithLiveness, options, mainDexClasses); - NestedGraphLense lens = staticClassMerger.run(); + NestedGraphLens lens = staticClassMerger.run(); if (lens != null) { - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; appViewWithLiveness.setAppInfo( appViewWithLiveness.appInfo().rewrittenWithLens(application.asDirect(), lens)); @@ -522,9 +522,9 @@ VerticalClassMerger verticalClassMerger = new VerticalClassMerger( application, appViewWithLiveness, executorService, timing, mainDexClasses); - VerticalClassMergerGraphLense lens = verticalClassMerger.run(); + VerticalClassMergerGraphLens lens = verticalClassMerger.run(); if (lens != null) { - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; appView.setVerticallyMergedClasses(verticalClassMerger.getMergedClasses()); application = application.asDirect().rewrittenWithLens(lens); @@ -537,13 +537,13 @@ SubtypingInfo subtypingInfo = appViewWithLiveness.appInfo().computeSubtypingInfo(); { timing.begin("UnusedArgumentRemoval"); - UnusedArgumentsGraphLense lens = + UnusedArgumentsGraphLens lens = new UnusedArgumentsCollector( appViewWithLiveness, new MethodPoolCollection(appViewWithLiveness, subtypingInfo)) .run(executorService, timing); if (lens != null) { - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; assert application.asDirect().verifyNothingToRewrite(appView, lens); appViewWithLiveness.setAppInfo( @@ -553,7 +553,7 @@ } if (options.enableUninstantiatedTypeOptimization) { timing.begin("UninstantiatedTypeOptimization"); - UninstantiatedTypeOptimizationGraphLense lens = + UninstantiatedTypeOptimizationGraphLens lens = new UninstantiatedTypeOptimization(appViewWithLiveness) .strenghtenOptimizationInfo() .run( @@ -561,7 +561,7 @@ executorService, timing); if (lens != null) { - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; assert application.asDirect().verifyNothingToRewrite(appView, lens); appViewWithLiveness.setAppInfo( @@ -583,7 +583,7 @@ appViewWithLiveness.setAppInfo(new EnumValueInfoMapCollector(appViewWithLiveness).run()); } - appView.setAppServices(appView.appServices().rewrittenWithLens(appView.graphLense())); + appView.setAppServices(appView.appServices().rewrittenWithLens(appView.graphLens())); timing.begin("Create IR"); CfgPrinter printer = options.printCfg ? new CfgPrinter() : null; @@ -601,7 +601,7 @@ // graph lens entirely, though, since it is needed for mapping all field and method signatures // back to the original program. timing.begin("AppliedGraphLens construction"); - appView.setGraphLense(new AppliedGraphLens(appView, application.classes())); + appView.setGraphLens(new AppliedGraphLens(appView, application.classes())); timing.end(); if (options.printCfg) { @@ -702,7 +702,7 @@ timing) .withEnumValueInfoMaps(enumValueInfoMapCollection)); // Rerunning the enqueuer should not give rise to any method rewritings. - assert enqueuer.buildGraphLense(appView) == appView.graphLense(); + assert enqueuer.buildGraphLens(appView) == appView.graphLens(); appView.withGeneratedMessageLiteBuilderShrinker( shrinker -> shrinker.rewriteDeadBuilderReferencesFromDynamicMethods( @@ -861,7 +861,7 @@ assert appView.rootSet().verifyKeptItemsAreKept(application, appView.appInfo()); } assert appView - .graphLense() + .graphLens() .verifyMappingToOriginalProgram( application.classesWithDeterministicOrder(), new ApplicationReader(inputApp.withoutMainDexList(), options, timing) @@ -885,7 +885,7 @@ executorService, application, appView, - appView.graphLense(), + appView.graphLens(), appView.initClassLens(), prefixRewritingNamingLens, options, @@ -912,11 +912,11 @@ clazz.forEachProgramMethod( method -> { DexMethod originalMethod = - appView.graphLense().getOriginalMethodSignature(method.getReference()); + appView.graphLens().getOriginalMethodSignature(method.getReference()); if (originalMethod != method.getReference()) { DexMethod originalMethod2 = - appView.graphLense().getOriginalMethodSignature(method.getReference()); - appView.graphLense().getOriginalMethodSignature(method.getReference()); + appView.graphLens().getOriginalMethodSignature(method.getReference()); + appView.graphLens().getOriginalMethodSignature(method.getReference()); DexEncodedMethod definition = method.getDefinition(); Code code = definition.getCode(); if (code == null) { @@ -979,7 +979,7 @@ options.getProguardConfiguration().getDontWarnPatterns(), executorService, timing)); - appView.setGraphLense(enqueuer.buildGraphLense(appView)); + appView.setGraphLens(enqueuer.buildGraphLens(appView)); if (InternalOptions.assertionsEnabled()) { // Register the dead proto types. These are needed to verify that no new missing types are // reported and that no dead proto types are referenced in the generated application.
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java index 8889e81..a7949db 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -15,8 +15,8 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.GraphLenseLookupResult; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.GraphLensLookupResult; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.code.Invoke; @@ -202,7 +202,7 @@ @Override public ConstraintWithTarget inliningConstraint( InliningConstraints inliningConstraints, DexProgramClass context) { - GraphLense graphLense = inliningConstraints.getGraphLense(); + GraphLens graphLens = inliningConstraints.getGraphLens(); AppView<?> appView = inliningConstraints.getAppView(); DexMethod target = method; // Find the DEX invocation type. @@ -211,17 +211,17 @@ case Opcodes.INVOKEINTERFACE: // Could have changed to an invoke-virtual instruction due to vertical class merging // (if an interface is merged into a class). - type = graphLense.lookupMethod(target, null, Type.INTERFACE).getType(); + type = graphLens.lookupMethod(target, null, Type.INTERFACE).getType(); assert type == Type.INTERFACE || type == Type.VIRTUAL; break; case Opcodes.INVOKESPECIAL: if (appView.dexItemFactory().isConstructor(target)) { type = Type.DIRECT; - assert noNeedToUseGraphLense(target, type, graphLense); + assert noNeedToUseGraphLens(target, type, graphLens); } else if (target.holder == context.type) { // The method could have been publicized. - type = graphLense.lookupMethod(target, null, Type.DIRECT).getType(); + type = graphLens.lookupMethod(target, null, Type.DIRECT).getType(); assert type == Type.DIRECT || type == Type.VIRTUAL; } else { // This is a super call. Note that the vertical class merger translates some invoke-super @@ -229,17 +229,17 @@ // the target method end up being in the same class, and therefore, we will allow inlining // it. The result of using type=SUPER below will be the same, since it leads to the // inlining constraint SAMECLASS. - // TODO(christofferqa): Consider using graphLense.lookupMethod (to do this, we need the - // context for the graph lense, though). + // TODO(christofferqa): Consider using graphLens.lookupMethod (to do this, we need the + // context for the graph lens, though). type = Type.SUPER; - assert noNeedToUseGraphLense(target, type, graphLense); + assert noNeedToUseGraphLens(target, type, graphLens); } break; case Opcodes.INVOKESTATIC: { // Static invokes may have changed as a result of horizontal class merging. - GraphLenseLookupResult lookup = graphLense.lookupMethod(target, null, Type.STATIC); + GraphLensLookupResult lookup = graphLens.lookupMethod(target, null, Type.STATIC); target = lookup.getMethod(); type = lookup.getType(); } @@ -258,7 +258,7 @@ } // Virtual invokes may have changed to interface invokes as a result of member rebinding. - GraphLenseLookupResult lookup = graphLense.lookupMethod(target, null, type); + GraphLensLookupResult lookup = graphLens.lookupMethod(target, null, type); target = lookup.getMethod(); type = lookup.getType(); } @@ -271,9 +271,9 @@ return inliningConstraints.forInvoke(target, type, context); } - private static boolean noNeedToUseGraphLense( - DexMethod method, Invoke.Type type, GraphLense graphLense) { - assert graphLense.lookupMethod(method, null, type).getType() == type; + private static boolean noNeedToUseGraphLens( + DexMethod method, Invoke.Type type, GraphLens graphLens) { + assert graphLens.lookupMethod(method, null, type).getType() == type; return true; } @@ -304,8 +304,8 @@ } private DexEncodedMethod lookupMethod(AppView<?> appView, DexMethod method) { - GraphLenseLookupResult lookupResult = - appView.graphLense().lookupMethod(method, method, Type.DIRECT); + GraphLensLookupResult lookupResult = + appView.graphLens().lookupMethod(method, method, Type.DIRECT); DexMethod rewrittenMethod = lookupResult.getMethod(); DexProgramClass clazz = appView.definitionForProgramType(rewrittenMethod.holder); assert clazz != null;
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java index 8986801..f0e8da6 100644 --- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java +++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -33,7 +33,7 @@ import com.android.tools.r8.graph.DexTypeList; import com.android.tools.r8.graph.DexValue; import com.android.tools.r8.graph.EnclosingMethodAttribute; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.InnerClassAttribute; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -69,7 +69,7 @@ public final DexApplication application; public final AppView<?> appView; - public final GraphLense graphLense; + public final GraphLens graphLens; public final InitClassLens initClassLens; public final NamingLens namingLens; public final InternalOptions options; @@ -148,7 +148,7 @@ AppView<?> appView, InternalOptions options, List<Marker> markers, - GraphLense graphLense, + GraphLens graphLens, InitClassLens initClassLens, NamingLens namingLens, ProguardMapSupplier proguardMapSupplier) { @@ -157,7 +157,7 @@ appView, options, markers, - graphLense, + graphLens, initClassLens, namingLens, proguardMapSupplier, @@ -169,7 +169,7 @@ AppView<?> appView, InternalOptions options, List<Marker> markers, - GraphLense graphLense, + GraphLens graphLens, InitClassLens initClassLens, NamingLens namingLens, ProguardMapSupplier proguardMapSupplier, @@ -181,7 +181,7 @@ this.options = options; this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(options, namingLens); this.markers = markers; - this.graphLense = graphLense; + this.graphLens = graphLens; this.initClassLens = initClassLens; this.namingLens = namingLens; this.proguardMapSupplier = proguardMapSupplier; @@ -338,7 +338,7 @@ // Fail if there are pending errors, e.g., the program consumers may have reported errors. options.reporter.failIfPendingErrors(); // Supply info to all additional resource consumers. - supplyAdditionalConsumers(application, appView, graphLense, namingLens, options); + supplyAdditionalConsumers(application, appView, graphLens, namingLens, options); } finally { application.timing.end(); } @@ -347,7 +347,7 @@ public static void supplyAdditionalConsumers( DexApplication application, AppView<?> appView, - GraphLense graphLense, + GraphLens graphLens, NamingLens namingLens, InternalOptions options) { if (options.configurationConsumer != null) { @@ -366,7 +366,7 @@ if (dataResourceConsumer != null) { ImmutableList<DataResourceProvider> dataResourceProviders = application.dataResourceProviders; ResourceAdapter resourceAdapter = - new ResourceAdapter(appView, application.dexItemFactory, graphLense, namingLens, options); + new ResourceAdapter(appView, application.dexItemFactory, graphLens, namingLens, options); adaptAndPassDataResources( options, dataResourceConsumer, dataResourceProviders, resourceAdapter); @@ -402,7 +402,7 @@ options.featureSplitConfiguration.getDataResourceProvidersAndConsumers()) { ResourceAdapter resourceAdapter = new ResourceAdapter( - appView, application.dexItemFactory, graphLense, namingLens, options); + appView, application.dexItemFactory, graphLens, namingLens, options); adaptAndPassDataResources( options, entry.getConsumer(), entry.getProviders(), resourceAdapter); }
diff --git a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java index 14a8261..536515d 100644 --- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java +++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -13,7 +13,7 @@ import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.ProguardPathFilter; import com.android.tools.r8.utils.DescriptorUtils; @@ -31,20 +31,20 @@ private final AppView<?> appView; private final DexItemFactory dexItemFactory; - private final GraphLense graphLense; - private final NamingLens namingLense; + private final GraphLens graphLens; + private final NamingLens namingLens; private final InternalOptions options; public ResourceAdapter( AppView<?> appView, DexItemFactory dexItemFactory, - GraphLense graphLense, - NamingLens namingLense, + GraphLens graphLens, + NamingLens namingLens, InternalOptions options) { this.appView = appView; this.dexItemFactory = dexItemFactory; - this.graphLense = graphLense; - this.namingLense = namingLense; + this.graphLens = graphLens; + this.namingLens = namingLens; this.options = options; } @@ -268,7 +268,7 @@ DescriptorUtils.javaTypeToDescriptorIgnorePrimitives(javaType)); DexType dexType = descriptor != null ? dexItemFactory.lookupType(descriptor) : null; if (dexType != null) { - DexString renamedDescriptor = namingLense.lookupDescriptor(graphLense.lookupType(dexType)); + DexString renamedDescriptor = namingLens.lookupDescriptor(graphLens.lookupType(dexType)); if (!descriptor.equals(renamedDescriptor)) { String renamedJavaType = DescriptorUtils.descriptorToJavaType(renamedDescriptor.toSourceString()); @@ -293,7 +293,7 @@ if (getClassNameSeparator() != '/') { javaPackage = javaPackage.replace(getClassNameSeparator(), '/'); } - String minifiedJavaPackage = namingLense.lookupPackageName(javaPackage); + String minifiedJavaPackage = namingLens.lookupPackageName(javaPackage); if (!javaPackage.equals(minifiedJavaPackage)) { outputRangeFromInput(outputFrom, from); outputJavaType(
diff --git a/src/main/java/com/android/tools/r8/graph/AppServices.java b/src/main/java/com/android/tools/r8/graph/AppServices.java index 0dbaa30..f853b30 100644 --- a/src/main/java/com/android/tools/r8/graph/AppServices.java +++ b/src/main/java/com/android/tools/r8/graph/AppServices.java
@@ -101,7 +101,7 @@ return false; } - public AppServices rewrittenWithLens(GraphLense graphLens) { + public AppServices rewrittenWithLens(GraphLens graphLens) { ImmutableMap.Builder<DexType, Map<FeatureSplit, List<DexType>>> rewrittenFeatureMappings = ImmutableMap.builder(); for (Entry<DexType, Map<FeatureSplit, List<DexType>>> entry : services.entrySet()) { @@ -157,10 +157,10 @@ private boolean verifyRewrittenWithLens() { for (Entry<DexType, Map<FeatureSplit, List<DexType>>> entry : services.entrySet()) { - assert entry.getKey() == appView.graphLense().lookupType(entry.getKey()); + assert entry.getKey() == appView.graphLens().lookupType(entry.getKey()); for (Entry<FeatureSplit, List<DexType>> featureEntry : entry.getValue().entrySet()) { for (DexType type : featureEntry.getValue()) { - assert type == appView.graphLense().lookupType(type); + assert type == appView.graphLens().lookupType(type); } } }
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java index 245a9ab..7b0c80f 100644 --- a/src/main/java/com/android/tools/r8/graph/AppView.java +++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -45,7 +45,7 @@ private AppInfoWithClassHierarchy appInfoForDesugaring; private AppServices appServices; private final WholeProgramOptimizations wholeProgramOptimizations; - private GraphLense graphLense; + private GraphLens graphLens; private InitClassLens initClassLens; private RootSet rootSet; // This should perferably always be obtained via AppInfoWithLiveness. @@ -82,7 +82,7 @@ assert appInfo != null; this.appInfo = appInfo; this.wholeProgramOptimizations = wholeProgramOptimizations; - this.graphLense = GraphLense.getIdentityLense(); + this.graphLens = GraphLens.getIdentityLens(); this.initClassLens = InitClassLens.getDefault(); this.methodProcessingIdFactory = new MethodProcessingId.Factory(options().testing.methodProcessingIdConsumer); @@ -196,8 +196,8 @@ allCodeProcessed = true; } - public GraphLense clearCodeRewritings() { - return graphLense = graphLense.withCodeRewritingsApplied(); + public GraphLens clearCodeRewritings() { + return graphLens = graphLens.withCodeRewritingsApplied(); } public AppServices appServices() { @@ -329,14 +329,14 @@ return defaultValue; } - public GraphLense graphLense() { - return graphLense; + public GraphLens graphLens() { + return graphLens; } /** @return true if the graph lens changed, otherwise false. */ - public boolean setGraphLense(GraphLense graphLense) { - if (graphLense != this.graphLense) { - this.graphLense = graphLense; + public boolean setGraphLens(GraphLens graphLens) { + if (graphLens != this.graphLens) { + this.graphLens = graphLens; return true; } return false;
diff --git a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java index 7e46aad..b602135 100644 --- a/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java +++ b/src/main/java/com/android/tools/r8/graph/AppliedGraphLens.java
@@ -17,7 +17,7 @@ * * <p>The mappings from the original program to the generated program are kept, though. */ -public class AppliedGraphLens extends GraphLense { +public class AppliedGraphLens extends GraphLens { private final AppView<?> appView; @@ -37,7 +37,7 @@ DexType type = clazz.type; if (appView.verticallyMergedClasses() != null && !appView.verticallyMergedClasses().hasBeenMergedIntoSubtype(type)) { - DexType original = appView.graphLense().getOriginalType(type); + DexType original = appView.graphLens().getOriginalType(type); if (original != type) { DexType existing = originalTypeNames.forcePut(type, original); assert existing == null; @@ -48,7 +48,7 @@ // Record original field signatures. for (DexEncodedField encodedField : clazz.fields()) { DexField field = encodedField.field; - DexField original = appView.graphLense().getOriginalFieldSignature(field); + DexField original = appView.graphLens().getOriginalFieldSignature(field); if (original != field) { DexField existing = originalFieldSignatures.forcePut(field, original); assert existing == null; @@ -58,7 +58,7 @@ // Record original method signatures. for (DexEncodedMethod encodedMethod : clazz.methods()) { DexMethod method = encodedMethod.method; - DexMethod original = appView.graphLense().getOriginalMethodSignature(method); + DexMethod original = appView.graphLens().getOriginalMethodSignature(method); if (original != method) { DexMethod existing = originalMethodSignatures.inverse().get(original); if (existing == null) { @@ -101,7 +101,7 @@ } @Override - public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) { + public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) { return this != applied ? originalMethodSignatures.inverse().getOrDefault(originalMethod, originalMethod) : originalMethod; @@ -117,9 +117,8 @@ } @Override - public GraphLenseLookupResult lookupMethod( - DexMethod method, DexMethod context, Invoke.Type type) { - return new GraphLenseLookupResult(method, type); + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Invoke.Type type) { + return new GraphLensLookupResult(method, type); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java index 0b9b084..24237bb 100644 --- a/src/main/java/com/android/tools/r8/graph/CfCode.java +++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -94,7 +94,7 @@ // The original holder is a reference to the holder type that the method was in from input and // for which the invokes still refer to. The holder is needed to determine if an invoke-special // maps to an invoke-direct or invoke-super. - // TODO(b/135969130): Make IR building lense aware and avoid caching the holder type. + // TODO(b/135969130): Make IR building lens aware and avoid caching the holder type. private final DexType originalHolder; private final int maxStack; @@ -381,7 +381,7 @@ this, localVariables, method, - appView.graphLense().getOriginalMethodSignature(method.getReference()), + appView.graphLens().getOriginalMethodSignature(method.getReference()), callerPosition, origin, appView); @@ -507,9 +507,9 @@ public ConstraintWithTarget computeInliningConstraint( ProgramMethod method, AppView<AppInfoWithLiveness> appView, - GraphLense graphLense, + GraphLens graphLens, DexProgramClass context) { - InliningConstraints inliningConstraints = new InliningConstraints(appView, graphLense); + InliningConstraints inliningConstraints = new InliningConstraints(appView, graphLens); if (appView.options().isInterfaceMethodDesugaringEnabled()) { // TODO(b/120130831): Conservatively need to say "no" at this point if there are invocations // to static interface methods. This should be fixed by making sure that the desugared
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java index b4eeb9e..76bead8 100644 --- a/src/main/java/com/android/tools/r8/graph/DexCode.java +++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -219,7 +219,7 @@ new DexSourceCode( this, method, - appView.graphLense().getOriginalMethodSignature(method.getReference()), + appView.graphLens().getOriginalMethodSignature(method.getReference()), null); return IRBuilder.create(method, appView, source, origin).build(method); } @@ -237,7 +237,7 @@ new DexSourceCode( this, method, - appView.graphLense().getOriginalMethodSignature(method.getReference()), + appView.graphLens().getOriginalMethodSignature(method.getReference()), callerPosition); return IRBuilder.createForInlining( method, appView, source, origin, methodProcessor, valueNumberGenerator)
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java index 4c0c7c5..019d295 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -170,7 +170,7 @@ public boolean isObsolete() { // Do not be cheating. This util can be used only if you're going to do appropriate action, - // e.g., using GraphLense#mapDexEncodedMethod to look up the correct, up-to-date instance. + // e.g., using GraphLens#mapDexEncodedMethod to look up the correct, up-to-date instance. return obsolete; }
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java index ab9be40..3a78118 100644 --- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java +++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -120,7 +120,7 @@ return "DexApplication (direct)"; } - public DirectMappedDexApplication rewrittenWithLens(GraphLense lens) { + public DirectMappedDexApplication rewrittenWithLens(GraphLens lens) { // As a side effect, this will rebuild the program classes and library classes maps. DirectMappedDexApplication rewrittenApplication = builder().build().asDirect(); assert rewrittenApplication.mappingIsValid(lens, allClasses.keySet()); @@ -128,7 +128,7 @@ return rewrittenApplication; } - public boolean verifyNothingToRewrite(AppView<?> appView, GraphLense lens) { + public boolean verifyNothingToRewrite(AppView<?> appView, GraphLens lens) { assert allClasses.keySet().stream() .allMatch( type -> @@ -138,12 +138,12 @@ return true; } - private boolean mappingIsValid(GraphLense graphLense, Iterable<DexType> types) { + private boolean mappingIsValid(GraphLens graphLens, Iterable<DexType> types) { // The lens might either map to a different type that is already present in the application // (e.g. relinking a type) or it might encode a type that was renamed, in which case the // original type will point to a definition that was renamed. for (DexType type : types) { - DexType renamed = graphLense.lookupType(type); + DexType renamed = graphLens.lookupType(type); if (renamed != type) { if (definitionFor(type) == null && definitionFor(renamed) != null) { continue;
diff --git a/src/main/java/com/android/tools/r8/graph/EnumValueInfoMapCollection.java b/src/main/java/com/android/tools/r8/graph/EnumValueInfoMapCollection.java index e5f7c51..4ee6be1 100644 --- a/src/main/java/com/android/tools/r8/graph/EnumValueInfoMapCollection.java +++ b/src/main/java/com/android/tools/r8/graph/EnumValueInfoMapCollection.java
@@ -38,7 +38,7 @@ return maps.keySet(); } - public EnumValueInfoMapCollection rewrittenWithLens(GraphLense lens) { + public EnumValueInfoMapCollection rewrittenWithLens(GraphLens lens) { Builder builder = builder(); maps.forEach( (type, map) -> { @@ -100,7 +100,7 @@ map.forEach(consumer); } - EnumValueInfoMap rewrittenWithLens(GraphLense lens) { + EnumValueInfoMap rewrittenWithLens(GraphLens lens) { LinkedHashMap<DexField, EnumValueInfo> rewritten = new LinkedHashMap<>(); map.forEach( (field, valueInfo) -> @@ -124,7 +124,7 @@ return ordinal + 1; } - EnumValueInfo rewrittenWithLens(GraphLense lens) { + EnumValueInfo rewrittenWithLens(GraphLens lens) { DexType newType = lens.lookupType(type); if (type == newType) { return this;
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java index 9dd6c41..6224914 100644 --- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java +++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoCollectionImpl.java
@@ -54,7 +54,7 @@ } public FieldAccessInfoCollectionImpl rewrittenWithLens( - DexDefinitionSupplier definitions, GraphLense lens) { + DexDefinitionSupplier definitions, GraphLens lens) { FieldAccessInfoCollectionImpl collection = new FieldAccessInfoCollectionImpl(); infos.forEach( (field, info) ->
diff --git a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java index 383c6e2..ae8a212 100644 --- a/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java +++ b/src/main/java/com/android/tools/r8/graph/FieldAccessInfoImpl.java
@@ -313,7 +313,7 @@ writesWithContexts = null; } - public FieldAccessInfoImpl rewrittenWithLens(DexDefinitionSupplier definitions, GraphLense lens) { + public FieldAccessInfoImpl rewrittenWithLens(DexDefinitionSupplier definitions, GraphLens lens) { FieldAccessInfoImpl rewritten = new FieldAccessInfoImpl(lens.lookupField(field)); rewritten.flags = flags; if (readsWithContexts != null) {
diff --git a/src/main/java/com/android/tools/r8/graph/GenericSignature.java b/src/main/java/com/android/tools/r8/graph/GenericSignature.java index 3b4d284..beb391d 100644 --- a/src/main/java/com/android/tools/r8/graph/GenericSignature.java +++ b/src/main/java/com/android/tools/r8/graph/GenericSignature.java
@@ -750,7 +750,7 @@ } String originalDescriptor = getDescriptorFromClassBinaryName(name); DexType type = - appView.graphLense().lookupType(appView.dexItemFactory().createType(originalDescriptor)); + appView.graphLens().lookupType(appView.dexItemFactory().createType(originalDescriptor)); if (appView.appInfo().wasPruned(type)) { type = appView.dexItemFactory().objectType; } @@ -783,7 +783,7 @@ getClassBinaryNameFromDescriptor(enclosingDescriptor) + DescriptorUtils.INNER_CLASS_SEPARATOR + name)); - return appView.graphLense().lookupType(type); + return appView.graphLens().lookupType(type); } //
diff --git a/src/main/java/com/android/tools/r8/graph/GraphLense.java b/src/main/java/com/android/tools/r8/graph/GraphLens.java similarity index 84% rename from src/main/java/com/android/tools/r8/graph/GraphLense.java rename to src/main/java/com/android/tools/r8/graph/GraphLens.java index 0bcbc76..bf6c5c8 100644 --- a/src/main/java/com/android/tools/r8/graph/GraphLense.java +++ b/src/main/java/com/android/tools/r8/graph/GraphLens.java
@@ -22,32 +22,34 @@ import java.util.function.Supplier; /** - * A GraphLense implements a virtual view on top of the graph, used to delay global rewrites until + * A GraphLens implements a virtual view on top of the graph, used to delay global rewrites until * later IR processing stages. - * <p> - * Valid remappings are limited to the following operations: + * + * <p>Valid remappings are limited to the following operations: + * * <ul> - * <li>Mapping a classes type to one of the super/subtypes.</li> - * <li>Renaming private methods/fields.</li> - * <li>Moving methods/fields to a super/subclass.</li> - * <li>Replacing method/field references by the same method/field on a super/subtype</li> - * <li>Moved methods might require changed invocation type at the call site</li> + * <li>Mapping a classes type to one of the super/subtypes. + * <li>Renaming private methods/fields. + * <li>Moving methods/fields to a super/subclass. + * <li>Replacing method/field references by the same method/field on a super/subtype + * <li>Moved methods might require changed invocation type at the call site * </ul> + * * Note that the latter two have to take visibility into account. */ -public abstract class GraphLense { +public abstract class GraphLens { /** - * Result of a method lookup in a GraphLense. + * Result of a method lookup in a GraphLens. * - * This provide the new target and the invoke type to use. + * <p>This provide the new target and the invoke type to use. */ - public static class GraphLenseLookupResult { + public static class GraphLensLookupResult { private final DexMethod method; private final Type type; - public GraphLenseLookupResult(DexMethod method, Type type) { + public GraphLensLookupResult(DexMethod method, Type type) { this.method = method; this.type = type; } @@ -109,21 +111,21 @@ originalFieldSignatures.put(to, from); } - public GraphLense build(DexItemFactory dexItemFactory) { - return build(dexItemFactory, getIdentityLense()); + public GraphLens build(DexItemFactory dexItemFactory) { + return build(dexItemFactory, getIdentityLens()); } - public GraphLense build(DexItemFactory dexItemFactory, GraphLense previousLense) { + public GraphLens build(DexItemFactory dexItemFactory, GraphLens previousLens) { if (typeMap.isEmpty() && methodMap.isEmpty() && fieldMap.isEmpty()) { - return previousLense; + return previousLens; } - return new NestedGraphLense( + return new NestedGraphLens( typeMap, methodMap, fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory); } } @@ -144,7 +146,7 @@ return getRenamedMethodSignature(originalMethod, null); } - public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied); + public abstract DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied); public DexEncodedMethod mapDexEncodedMethod( DexEncodedMethod originalEncodedMethod, DexDefinitionSupplier definitions) { @@ -154,7 +156,7 @@ public DexEncodedMethod mapDexEncodedMethod( DexEncodedMethod originalEncodedMethod, DexDefinitionSupplier definitions, - GraphLense applied) { + GraphLens applied) { assert originalEncodedMethod != DexEncodedMethod.SENTINEL; DexMethod newMethod = getRenamedMethodSignature(originalEncodedMethod.method, applied); // Note that: @@ -178,13 +180,13 @@ public abstract DexType lookupType(DexType type); - // This overload can be used when the graph lense is known to be context insensitive. + // This overload can be used when the graph lens is known to be context insensitive. public DexMethod lookupMethod(DexMethod method) { assert verifyIsContextFreeForMethod(method); return lookupMethod(method, null, null).getMethod(); } - public abstract GraphLenseLookupResult lookupMethod( + public abstract GraphLensLookupResult lookupMethod( DexMethod method, DexMethod context, Type type); public abstract RewrittenPrototypeDescription lookupPrototypeChanges(DexMethod method); @@ -216,9 +218,9 @@ // example, used by the vertical class merger to translate invoke-super instructions that hit // a method in the direct super class to invoke-direct instructions after class merging. // - // This method can be used to determine if a graph lense is context sensitive. If a graph lense + // This method can be used to determine if a graph lens is context sensitive. If a graph lens // is context insensitive, it is safe to invoke lookupMethod() without a context (or to pass null - // as context). Trying to invoke a context sensitive graph lense without a context will lead to + // as context). Trying to invoke a context sensitive graph lens without a context will lead to // an assertion error. public abstract boolean isContextFreeForMethods(); @@ -226,19 +228,19 @@ return isContextFreeForMethods(); } - public static GraphLense getIdentityLense() { - return IdentityGraphLense.getInstance(); + public static GraphLens getIdentityLens() { + return IdentityGraphLens.getInstance(); } public boolean hasCodeRewritings() { return true; } - public final boolean isIdentityLense() { - return this == getIdentityLense(); + public final boolean isIdentityLens() { + return this == getIdentityLens(); } - public GraphLense withCodeRewritingsApplied() { + public GraphLens withCodeRewritingsApplied() { if (hasCodeRewritings()) { return new ClearCodeRewritingGraphLens(this); } @@ -390,13 +392,13 @@ return true; } - private static class IdentityGraphLense extends GraphLense { + private static class IdentityGraphLens extends GraphLens { - private static IdentityGraphLense INSTANCE = new IdentityGraphLense(); + private static IdentityGraphLens INSTANCE = new IdentityGraphLens(); - private IdentityGraphLense() {} + private IdentityGraphLens() {} - private static IdentityGraphLense getInstance() { + private static IdentityGraphLens getInstance() { return INSTANCE; } @@ -421,7 +423,7 @@ } @Override - public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) { + public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) { return originalMethod; } @@ -431,8 +433,8 @@ } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { - return new GraphLenseLookupResult(method, type); + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + return new GraphLensLookupResult(method, type); } @Override @@ -458,11 +460,11 @@ // This lens clears all code rewriting (lookup methods mimics identity lens behavior) but still // relies on the previous lens for names (getRenamed/Original methods). - public static class ClearCodeRewritingGraphLens extends IdentityGraphLense { + public static class ClearCodeRewritingGraphLens extends IdentityGraphLens { - private final GraphLense previous; + private final GraphLens previous; - public ClearCodeRewritingGraphLens(GraphLense previous) { + public ClearCodeRewritingGraphLens(GraphLens previous) { this.previous = previous; } @@ -487,7 +489,7 @@ } @Override - public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) { + public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) { return this != applied ? previous.getRenamedMethodSignature(originalMethod, applied) : originalMethod; @@ -500,7 +502,7 @@ } /** - * GraphLense implementation with a parent lense using a simple mapping for type, method and field + * GraphLens implementation with a parent lens using a simple mapping for type, method and field * mapping. * * <p>Subclasses can override the lookup methods. @@ -509,9 +511,9 @@ * #mapInvocationType(DexMethod, DexMethod, Type)} if the default name mapping applies, and only * invocation type might need to change. */ - public static class NestedGraphLense extends GraphLense { + public static class NestedGraphLens extends GraphLens { - protected GraphLense previousLense; + protected GraphLens previousLens; protected final DexItemFactory dexItemFactory; protected final Map<DexType, DexType> typeMap; @@ -524,42 +526,44 @@ protected final BiMap<DexField, DexField> originalFieldSignatures; protected final BiMap<DexMethod, DexMethod> originalMethodSignatures; - // Overrides this if the sub type needs to be a nested lense while it doesn't have any mappings - // at all, e.g., publicizer lense that changes invocation type only. + // Overrides this if the sub type needs to be a nested lens while it doesn't have any mappings + // at all, e.g., publicizer lens that changes invocation type only. protected boolean isLegitimateToHaveEmptyMappings() { return false; } - public NestedGraphLense( + public NestedGraphLens( Map<DexType, DexType> typeMap, Map<DexMethod, DexMethod> methodMap, Map<DexField, DexField> fieldMap, BiMap<DexField, DexField> originalFieldSignatures, BiMap<DexMethod, DexMethod> originalMethodSignatures, - GraphLense previousLense, + GraphLens previousLens, DexItemFactory dexItemFactory) { - assert !typeMap.isEmpty() || !methodMap.isEmpty() || !fieldMap.isEmpty() + assert !typeMap.isEmpty() + || !methodMap.isEmpty() + || !fieldMap.isEmpty() || isLegitimateToHaveEmptyMappings(); this.typeMap = typeMap.isEmpty() ? null : typeMap; this.methodMap = methodMap; this.fieldMap = fieldMap; this.originalFieldSignatures = originalFieldSignatures; this.originalMethodSignatures = originalMethodSignatures; - this.previousLense = previousLense; + this.previousLens = previousLens; this.dexItemFactory = dexItemFactory; } - public <T> T withAlternativeParentLens(GraphLense lens, Supplier<T> action) { - GraphLense oldParent = previousLense; - previousLense = lens; + public <T> T withAlternativeParentLens(GraphLens lens, Supplier<T> action) { + GraphLens oldParent = previousLens; + previousLens = lens; T result = action.get(); - previousLense = oldParent; + previousLens = oldParent; return result; } @Override public DexType getOriginalType(DexType type) { - return previousLense.getOriginalType(type); + return previousLens.getOriginalType(type); } @Override @@ -568,7 +572,7 @@ originalFieldSignatures != null ? originalFieldSignatures.getOrDefault(field, field) : field; - return previousLense.getOriginalFieldSignature(originalField); + return previousLens.getOriginalFieldSignature(originalField); } @Override @@ -577,23 +581,23 @@ originalMethodSignatures != null ? originalMethodSignatures.getOrDefault(method, method) : method; - return previousLense.getOriginalMethodSignature(originalMethod); + return previousLens.getOriginalMethodSignature(originalMethod); } @Override public DexField getRenamedFieldSignature(DexField originalField) { - DexField renamedField = previousLense.getRenamedFieldSignature(originalField); + DexField renamedField = previousLens.getRenamedFieldSignature(originalField); return originalFieldSignatures != null ? originalFieldSignatures.inverse().getOrDefault(renamedField, renamedField) : renamedField; } @Override - public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) { + public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) { if (this == applied) { return originalMethod; } - DexMethod renamedMethod = previousLense.getRenamedMethodSignature(originalMethod, applied); + DexMethod renamedMethod = previousLens.getRenamedMethodSignature(originalMethod, applied); return originalMethodSignatures != null ? originalMethodSignatures.inverse().getOrDefault(renamedMethod, renamedMethod) : renamedMethod; @@ -618,40 +622,40 @@ return result; } } - DexType previous = previousLense.lookupType(type); + DexType previous = previousLens.lookupType(type); return typeMap != null ? typeMap.getOrDefault(previous, previous) : previous; } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { DexMethod previousContext = originalMethodSignatures != null ? originalMethodSignatures.getOrDefault(context, context) : context; - GraphLenseLookupResult previous = previousLense.lookupMethod(method, previousContext, type); + GraphLensLookupResult previous = previousLens.lookupMethod(method, previousContext, type); DexMethod newMethod = methodMap.get(previous.getMethod()); if (newMethod == null) { return previous; } // TODO(sgjesse): Should we always do interface to virtual mapping? Is it a performance win // that only subclasses which are known to need it actually do it? - return new GraphLenseLookupResult( + return new GraphLensLookupResult( newMethod, mapInvocationType(newMethod, method, previous.getType())); } @Override public RewrittenPrototypeDescription lookupPrototypeChanges(DexMethod method) { - return previousLense.lookupPrototypeChanges(method); + return previousLens.lookupPrototypeChanges(method); } @Override public DexMethod lookupGetFieldForMethod(DexField field, DexMethod context) { - return previousLense.lookupGetFieldForMethod(field, context); + return previousLens.lookupGetFieldForMethod(field, context); } @Override public DexMethod lookupPutFieldForMethod(DexField field, DexMethod context) { - return previousLense.lookupPutFieldForMethod(field, context); + return previousLens.lookupPutFieldForMethod(field, context); } /** @@ -694,18 +698,18 @@ @Override public DexField lookupField(DexField field) { - DexField previous = previousLense.lookupField(field); + DexField previous = previousLens.lookupField(field); return fieldMap.getOrDefault(previous, previous); } @Override public boolean isContextFreeForMethods() { - return previousLense.isContextFreeForMethods(); + return previousLens.isContextFreeForMethods(); } @Override public boolean verifyIsContextFreeForMethod(DexMethod method) { - assert previousLense.verifyIsContextFreeForMethod(method); + assert previousLens.verifyIsContextFreeForMethod(method); return true; } @@ -726,7 +730,7 @@ builder.append(entry.getKey().toSourceString()).append(" -> "); builder.append(entry.getValue().toSourceString()).append(System.lineSeparator()); } - builder.append(previousLense.toString()); + builder.append(previousLens.toString()); return builder.toString(); } }
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java index 546bf90..60c06cc 100644 --- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java +++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollection.java
@@ -27,5 +27,5 @@ boolean isImmediateInterfaceOfInstantiatedLambda(DexProgramClass clazz); ObjectAllocationInfoCollection rewrittenWithLens( - DexDefinitionSupplier definitions, GraphLense lens); + DexDefinitionSupplier definitions, GraphLens lens); }
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java index 1245da9..0997dc4 100644 --- a/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java +++ b/src/main/java/com/android/tools/r8/graph/ObjectAllocationInfoCollectionImpl.java
@@ -133,7 +133,7 @@ @Override public ObjectAllocationInfoCollectionImpl rewrittenWithLens( - DexDefinitionSupplier definitions, GraphLense lens) { + DexDefinitionSupplier definitions, GraphLens lens) { return builder(true, null).rewrittenWithLens(this, definitions, lens).build(definitions); } @@ -368,7 +368,7 @@ Builder rewrittenWithLens( ObjectAllocationInfoCollectionImpl objectAllocationInfos, DexDefinitionSupplier definitions, - GraphLense lens) { + GraphLens lens) { instantiatedHierarchy = null; objectAllocationInfos.classesWithAllocationSiteTracking.forEach( (clazz, allocationSitesForClass) -> {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java index 54d5160..cf531ff 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/constant/SparseConditionalConstantPropagation.java
@@ -38,16 +38,16 @@ private final Map<Value, LatticeElement> mapping = new HashMap<>(); private final Deque<Value> ssaEdges = new LinkedList<>(); private final Deque<BasicBlock> flowEdges = new LinkedList<>(); - private final int nextBlockNumber; + private final int maxBlockNumber; private final BitSet[] executableFlowEdges; private final BitSet visitedBlocks; public SparseConditionalConstantPropagation(AppView<?> appView, IRCode code) { this.appView = appView; this.code = code; - nextBlockNumber = code.getHighestBlockNumber() + 1; - executableFlowEdges = new BitSet[nextBlockNumber]; - visitedBlocks = new BitSet(nextBlockNumber); + maxBlockNumber = code.getCurrentBlockNumber() + 1; + executableFlowEdges = new BitSet[maxBlockNumber]; + visitedBlocks = new BitSet(maxBlockNumber); } public void run() { @@ -252,7 +252,7 @@ private void setExecutableEdge(int from, int to) { BitSet previousExecutable = executableFlowEdges[to]; if (previousExecutable == null) { - previousExecutable = new BitSet(nextBlockNumber); + previousExecutable = new BitSet(maxBlockNumber); executableFlowEdges[to] = previousExecutable; } previousExecutable.set(from);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java index c6e42b6..7d13544 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/AbstractFieldSet.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; /** * Implements a lifted subset lattice for fields. @@ -70,5 +70,5 @@ return lessThanOrEqual(other) && !equals(other); } - public abstract AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLense lens); + public abstract AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLens lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java index 9fe885d..5bf0c61 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/ConcreteMutableFieldSet.java
@@ -8,7 +8,7 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.SetUtils; import com.google.common.collect.Sets; @@ -69,7 +69,7 @@ } @Override - public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLense lens) { + public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLens lens) { assert !isEmpty(); ConcreteMutableFieldSet rewrittenSet = new ConcreteMutableFieldSet(); for (DexEncodedField field : fields) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java index 73559f3..9a7c7aa 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/EmptyFieldSet.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; public class EmptyFieldSet extends AbstractFieldSet implements KnownFieldSet { @@ -39,7 +39,7 @@ } @Override - public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLense lens) { + public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLens lens) { return this; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java index f083438..75a1bab 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/UnknownFieldSet.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; public class UnknownFieldSet extends AbstractFieldSet { @@ -34,7 +34,7 @@ } @Override - public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLense lens) { + public AbstractFieldSet rewrittenWithLens(AppView<?> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java index 29ca247..a89c486 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DestructivePhiTypeUpdater.java
@@ -24,7 +24,7 @@ private final Function<DexType, DexType> mapping; public DestructivePhiTypeUpdater(AppView<? extends AppInfoWithClassHierarchy> appView) { - this(appView, appView.graphLense()::lookupType); + this(appView, appView.graphLens()::lookupType); } public DestructivePhiTypeUpdater(
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java index 9939980..c2ffda0 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/AbstractValue.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.analysis.value; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; public abstract class AbstractValue { @@ -86,7 +86,7 @@ } public abstract AbstractValue rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); @Override public abstract boolean equals(Object o);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java index f5b27f7..c1afe58 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/BottomValue.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.analysis.value; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; public class BottomValue extends AbstractValue { @@ -24,7 +24,7 @@ } @Override - public AbstractValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public AbstractValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/EmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/EmptyObjectState.java index 48b1d9c..db6be42 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/EmptyObjectState.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/EmptyObjectState.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; public class EmptyObjectState extends ObjectState { @@ -30,7 +30,7 @@ } @Override - public ObjectState rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public ObjectState rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java index 0732b83..fad7303 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/NonEmptyObjectState.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; import java.util.IdentityHashMap; import java.util.Map; @@ -34,7 +34,7 @@ } @Override - public ObjectState rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public ObjectState rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { Map<DexField, AbstractValue> rewrittenState = new IdentityHashMap<>(); state.forEach( (field, value) ->
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java b/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java index 066b305..b724858 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/ObjectState.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; import java.util.IdentityHashMap; import java.util.Map; @@ -27,7 +27,7 @@ public abstract boolean isEmpty(); public abstract ObjectState rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); @Override public abstract boolean equals(Object o);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java index bcb5c0b..7240424b 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -13,7 +13,7 @@ import com.android.tools.r8.graph.DebugLocalInfo; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.ConstClass; @@ -107,7 +107,7 @@ } @Override - public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { assert lens.lookupType(type) == type; return this; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java index 7bdcc84..b7e359e 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -14,7 +14,7 @@ import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.EnumValueInfoMapCollection.EnumValueInfoMap; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -107,7 +107,7 @@ } @Override - public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { AbstractValueFactory factory = appView.abstractValueFactory(); if (field.holder == field.type) { EnumValueInfoMap unboxedEnumInfo = appView.unboxedEnums().getEnumValueInfoMap(field.type);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java index e6b1ee6..0cb75c3 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DebugLocalInfo; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.ConstNumber; @@ -91,7 +91,7 @@ } @Override - public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java index ab7c218..e494c43 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
@@ -11,7 +11,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DebugLocalInfo; import com.android.tools.r8.graph.DexString; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo; @@ -92,7 +92,7 @@ } @Override - public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java index 3ce27a0..4a3a11c 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.ir.code.Instruction; @@ -47,5 +47,5 @@ @Override public abstract SingleValue rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java index 2b4f841..8d4001f 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/value/UnknownValue.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.analysis.value; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; public class UnknownValue extends AbstractValue { @@ -29,7 +29,7 @@ } @Override - public AbstractValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public AbstractValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; }
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java index b0ef472..fa3c34c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java +++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlock.java
@@ -11,7 +11,7 @@ import com.android.tools.r8.graph.DebugLocalInfo.PrintLevel; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.Phi.RegisterReadType; @@ -998,17 +998,17 @@ /** * Due to class merging, it is possible that two exception classes have been merged into one. This - * function renames the guards according to the given graph lense. + * function renames the guards according to the given graph lens. * * @return true if any guards were renamed. */ - public boolean renameGuardsInCatchHandlers(GraphLense graphLense) { + public boolean renameGuardsInCatchHandlers(GraphLens graphLens) { assert hasCatchHandlers(); boolean anyGuardsRenamed = false; List<DexType> newGuards = new ArrayList<>(catchHandlers.getGuards().size()); for (DexType guard : catchHandlers.getGuards()) { // The type may have changed due to class merging. - DexType renamed = graphLense.lookupType(guard); + DexType renamed = graphLens.lookupType(guard); newGuards.add(renamed); anyGuardsRenamed |= renamed != guard; } @@ -1483,7 +1483,7 @@ block.add(moveException, code); block.add(throwInstruction, code); block.close(null); - block.setNumber(code.getHighestBlockNumber() + 1); + block.setNumber(code.getNextBlockNumber()); return block; } @@ -1762,9 +1762,8 @@ * method does not affect incoming edges in any way, and just adds new blocks with MoveException * and Goto. */ - public int splitCriticalExceptionEdges( + public void splitCriticalExceptionEdges( IRCode code, Consumer<BasicBlock> onNewBlock, InternalOptions options) { - int nextBlockNumber = code.getHighestBlockNumber() + 1; List<BasicBlock> predecessors = getMutablePredecessors(); boolean hasMoveException = entry().isMoveException(); TypeElement exceptionTypeLattice = null; @@ -1788,7 +1787,7 @@ "Invalid block structure: catch block reachable via non-exceptional flow."); } BasicBlock newBlock = new BasicBlock(); - newBlock.setNumber(nextBlockNumber++); + newBlock.setNumber(code.getNextBlockNumber()); newPredecessors.add(newBlock); if (hasMoveException) { Value value = @@ -1823,7 +1822,6 @@ phi.addOperands(values); move.outValue().replaceUsers(phi); } - return nextBlockNumber; } /**
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java index 57d52df..68447db 100644 --- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java +++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -383,9 +383,6 @@ List<BasicBlock> blocks = code.blocks; assert blocksIterator == null || IteratorUtils.peekPrevious(blocksIterator) == block; - int blockNumber = code.getHighestBlockNumber() + 1; - BasicBlock newBlock; - // Don't allow splitting after the last instruction. assert hasNext(); @@ -394,7 +391,7 @@ // Prepare the new block, placing the exception handlers on the block with the throwing // instruction. - newBlock = block.createSplitBlock(blockNumber, keepCatchHandlers); + BasicBlock newBlock = block.createSplitBlock(code.getNextBlockNumber(), keepCatchHandlers); // Add a goto instruction. Goto newGoto = new Goto(block); @@ -699,9 +696,8 @@ assert IteratorUtils.peekNext(blocksIterator) == invokeBlock; // Insert inlinee blocks into the IR code of the callee, before the invoke block. - int blockNumber = code.getHighestBlockNumber() + 1; for (BasicBlock bb : inlinee.blocks) { - bb.setNumber(blockNumber++); + bb.setNumber(code.getNextBlockNumber()); blocksIterator.add(bb); } @@ -745,7 +741,7 @@ return it; } BasicBlock newExitBlock = new BasicBlock(); - newExitBlock.setNumber(code.getHighestBlockNumber() + 1); + newExitBlock.setNumber(code.getNextBlockNumber()); Return newReturn; if (normalExits.get(0).exit().asReturn().isReturnVoid()) { newReturn = new Return();
diff --git a/src/main/java/com/android/tools/r8/ir/code/IRCode.java b/src/main/java/com/android/tools/r8/ir/code/IRCode.java index f177619..77988b8 100644 --- a/src/main/java/com/android/tools/r8/ir/code/IRCode.java +++ b/src/main/java/com/android/tools/r8/ir/code/IRCode.java
@@ -38,7 +38,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; -import java.util.Comparator; import java.util.Deque; import java.util.HashSet; import java.util.IdentityHashMap; @@ -109,6 +108,7 @@ public LinkedList<BasicBlock> blocks; public final ValueNumberGenerator valueNumberGenerator; + public final ValueNumberGenerator basicBlockNumberGenerator; private int usedMarkingColors = 0; private boolean numbered = false; @@ -128,14 +128,17 @@ ProgramMethod method, LinkedList<BasicBlock> blocks, ValueNumberGenerator valueNumberGenerator, + ValueNumberGenerator basicBlockNumberGenerator, IRMetadata metadata, Origin origin) { assert metadata != null; assert options != null; + assert blocks.size() == basicBlockNumberGenerator.peek(); this.options = options; this.method = method; this.blocks = blocks; this.valueNumberGenerator = valueNumberGenerator; + this.basicBlockNumberGenerator = basicBlockNumberGenerator; this.metadata = metadata; this.origin = origin; // TODO(zerny): Remove or update this property now that all instructions have positions. @@ -348,7 +351,7 @@ if (hasSeenThrowingInstruction) { List<BasicBlock> successors = block.getSuccessors(); if (successors.size() == 1 && ListUtils.first(successors).getPredecessors().size() > 1) { - BasicBlock splitBlock = block.createSplitBlock(getHighestBlockNumber() + 1, true); + BasicBlock splitBlock = block.createSplitBlock(getNextBlockNumber(), true); Goto newGoto = new Goto(block); newGoto.setPosition(Position.none()); splitBlock.listIterator(this).add(newGoto); @@ -361,7 +364,6 @@ public void splitCriticalEdges() { List<BasicBlock> newBlocks = new ArrayList<>(); - int nextBlockNumber = getHighestBlockNumber() + 1; for (BasicBlock block : blocks) { // We are using a spilling register allocator that might need to insert moves at // all critical edges, so we always split them all. @@ -383,7 +385,7 @@ // structure. BasicBlock newBlock = BasicBlock.createGotoBlock( - nextBlockNumber++, pred.exit().getPosition(), metadata, block); + getNextBlockNumber(), pred.exit().getPosition(), metadata, block); newBlocks.add(newBlock); pred.replaceSuccessor(block, newBlock); newBlock.getMutablePredecessors().add(pred); @@ -424,7 +426,6 @@ // Get the blocks first, as calling topologicallySortedBlocks also sets marks. ImmutableList<BasicBlock> sorted = topologicallySortedBlocks(); int color = reserveMarkingColor(); - int nextBlockNumber = blocks.size(); LinkedList<BasicBlock> tracedBlocks = new LinkedList<>(); for (BasicBlock block : sorted) { if (!block.isMarked(color)) { @@ -441,7 +442,7 @@ if (fallthrough != null) { BasicBlock newFallthrough = BasicBlock.createGotoBlock( - nextBlockNumber++, current.exit().getPosition(), metadata, fallthrough); + getNextBlockNumber(), current.exit().getPosition(), metadata, fallthrough); current.exit().setFallthroughBlock(newFallthrough); newFallthrough.getMutablePredecessors().add(current); fallthrough.replacePredecessor(current, newFallthrough); @@ -786,12 +787,12 @@ } public boolean consistentBlockNumbering() { - blocks - .stream() + blocks.stream() .collect(Collectors.groupingBy(BasicBlock::getNumber, Collectors.counting())) .forEach( (key, value) -> { assert value == 1; + assert value <= basicBlockNumberGenerator.peek(); }); return true; } @@ -1144,8 +1145,12 @@ return new Phi(valueNumberGenerator.next(), block, type, null, RegisterReadType.NORMAL); } - public final int getHighestBlockNumber() { - return blocks.stream().max(Comparator.comparingInt(BasicBlock::getNumber)).get().getNumber(); + public final int getNextBlockNumber() { + return basicBlockNumberGenerator.next(); + } + + public final int getCurrentBlockNumber() { + return basicBlockNumberGenerator.peek(); } public ConstClass createConstClass(AppView<?> appView, DexType type) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java index be64578..b287f84 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java +++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -1397,10 +1397,10 @@ .asArrayType() .toDexType(appView.dexItemFactory()) .toBaseType(appView.dexItemFactory()); - assert appView.graphLense().lookupType(outBaseType) == outBaseType; + assert appView.graphLens().lookupType(outBaseType) == outBaseType; } else if (outTypeElement.isClassType()) { DexType outType = outTypeElement.asClassType().getClassType(); - assert appView.graphLense().lookupType(outType) == outType; + assert appView.graphLens().lookupType(outType) == outType; } } return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Position.java b/src/main/java/com/android/tools/r8/ir/code/Position.java index d11bf38..183d352 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Position.java +++ b/src/main/java/com/android/tools/r8/ir/code/Position.java
@@ -86,7 +86,7 @@ position = Position.noneWithMethod(context.getReference(), null); } assert position.getOutermostCaller().method - == appView.graphLense().getOriginalMethodSignature(context.getReference()); + == appView.graphLens().getOriginalMethodSignature(context.getReference()); return position; }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ValueNumberGenerator.java b/src/main/java/com/android/tools/r8/ir/code/ValueNumberGenerator.java index ac07f11..722f30e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ValueNumberGenerator.java +++ b/src/main/java/com/android/tools/r8/ir/code/ValueNumberGenerator.java
@@ -9,4 +9,8 @@ public int next() { return nextValueNumber++; } + + public int peek() { + return nextValueNumber; + } }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java index 9f57ac1..8119a9c 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraphBuilderBase.java
@@ -18,7 +18,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.FieldAccessInfo; import com.android.tools.r8.graph.FieldAccessInfoCollection; -import com.android.tools.r8.graph.GraphLense.GraphLenseLookupResult; +import com.android.tools.r8.graph.GraphLens.GraphLensLookupResult; import com.android.tools.r8.graph.LookupResult; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.ResolutionResult; @@ -166,8 +166,8 @@ private void processInvoke(Invoke.Type originalType, DexMethod originalMethod) { ProgramMethod context = currentMethod.getProgramMethod(); - GraphLenseLookupResult result = - appView.graphLense().lookupMethod(originalMethod, context.getReference(), originalType); + GraphLensLookupResult result = + appView.graphLens().lookupMethod(originalMethod, context.getReference(), originalType); DexMethod method = result.getMethod(); Invoke.Type type = result.getType(); if (type == Invoke.Type.INTERFACE || type == Invoke.Type.VIRTUAL) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java index 60fcec2..c36eb8e 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/IRBuilder.java
@@ -392,6 +392,7 @@ private int currentInstructionOffset = -1; final private ValueNumberGenerator valueNumberGenerator; + private final ValueNumberGenerator basicBlockNumberGenerator; private final ProgramMethod method; private ProgramMethod context; public final AppView<?> appView; @@ -456,7 +457,7 @@ private static RewrittenPrototypeDescription lookupPrototypeChanges( AppView<?> appView, ProgramMethod method) { RewrittenPrototypeDescription prototypeChanges = - appView.graphLense().lookupPrototypeChanges(method.getReference()); + appView.graphLens().lookupPrototypeChanges(method.getReference()); if (Log.ENABLED && prototypeChanges.getArgumentInfoCollection().hasRemovedArguments()) { Log.info( IRBuilder.class, @@ -483,6 +484,7 @@ this.origin = origin; this.prototypeChanges = prototypeChanges; this.valueNumberGenerator = valueNumberGenerator; + this.basicBlockNumberGenerator = new ValueNumberGenerator(); } public DexEncodedMethod getMethod() { @@ -679,7 +681,14 @@ // Package up the IR code. IRCode ir = - new IRCode(appView.options(), method, blocks, valueNumberGenerator, metadata, origin); + new IRCode( + appView.options(), + method, + blocks, + valueNumberGenerator, + basicBlockNumberGenerator, + metadata, + origin); // Verify critical edges are split so we have a place to insert phi moves if necessary. assert ir.verifySplitCriticalEdges(); @@ -834,7 +843,7 @@ assert debugLocalEnds.isEmpty(); setCurrentBlock(item.block); blocks.add(currentBlock); - currentBlock.setNumber(nextBlockNumber++); + currentBlock.setNumber(basicBlockNumberGenerator.next()); // Process synthesized move-exception block specially. if (item instanceof MoveExceptionWorklistItem) { processMoveExceptionItem((MoveExceptionWorklistItem) item); @@ -2286,7 +2295,7 @@ BlockInfo info = new BlockInfo(); BasicBlock block = info.block; - block.setNumber(nextBlockNumber++); + block.setNumber(basicBlockNumberGenerator.next()); blocks.add(block); // Compute some unused offset for the new block and link it in the CFG. @@ -2631,7 +2640,7 @@ if (joinBlock == null) { joinBlock = BasicBlock.createGotoBlock( - blocks.size() + blocksToAdd.size(), block.getPosition(), metadata, block); + basicBlockNumberGenerator.next(), block.getPosition(), metadata, block); joinBlocks.put(otherPredecessorIndex, joinBlock); blocksToAdd.add(joinBlock); BasicBlock otherPredecessor = block.getPredecessors().get(otherPredecessorIndex);
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 0809d00..3f74b74 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
@@ -22,7 +22,7 @@ import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.TypeChecker; import com.android.tools.r8.ir.analysis.constant.SparseConditionalConstantPropagation; @@ -191,7 +191,7 @@ */ public IRConverter( AppView<?> appView, Timing timing, CfgPrinter printer, MainDexClasses mainDexClasses) { - assert appView.appInfo().hasLiveness() || appView.graphLense().isIdentityLense(); + assert appView.appInfo().hasLiveness() || appView.graphLens().isIdentityLens(); assert appView.options() != null; assert appView.options().programConsumer != null; assert timing != null; @@ -690,7 +690,7 @@ } // Process the application identifying outlining candidates. - GraphLense graphLenseForIR = appView.graphLense(); + GraphLens graphLensForIR = appView.graphLens(); OptimizationFeedbackDelayed feedback = delayedOptimizationFeedback; PostMethodProcessor.Builder postMethodProcessorBuilder = new PostMethodProcessor.Builder(getOptimizationsForPostIRProcessing()); @@ -712,7 +712,7 @@ timing, executorService); timing.end(); - assert graphLenseForIR == appView.graphLense(); + assert graphLensForIR == appView.graphLens(); } // Assure that no more optimization feedback left after primary processing. @@ -747,14 +747,14 @@ } timing.begin("IR conversion phase 2"); - graphLenseForIR = appView.graphLense(); + graphLensForIR = appView.graphLens(); PostMethodProcessor postMethodProcessor = postMethodProcessorBuilder.build(appView.withLiveness(), executorService, timing); if (postMethodProcessor != null) { assert !options.debug; postMethodProcessor.forEachWave(feedback, executorService); feedback.updateVisibleOptimizationInfo(); - assert graphLenseForIR == appView.graphLense(); + assert graphLensForIR == appView.graphLens(); } timing.end(); @@ -1188,7 +1188,7 @@ codeRewriter.simplifyDebugLocals(code); } - if (appView.graphLense().hasCodeRewritings()) { + if (appView.graphLens().hasCodeRewritings()) { assert lensCodeRewriter != null; timing.begin("Lens rewrite"); lensCodeRewriter.rewrite(code, context);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java index f83952c..6c9877c 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/LensCodeRewriter.java
@@ -47,8 +47,8 @@ import com.android.tools.r8.graph.DexValue.DexValueMethodHandle; import com.android.tools.r8.graph.DexValue.DexValueMethodType; import com.android.tools.r8.graph.DexValue.DexValueType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.GraphLenseLookupResult; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.GraphLensLookupResult; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.RewrittenPrototypeDescription; import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfo; @@ -115,7 +115,7 @@ if (insn.outValue() != null) { TypeElement oldType = insn.getOutType(); TypeElement newType = - oldType.fixupClassTypeReferences(appView.graphLense()::lookupType, appView); + oldType.fixupClassTypeReferences(appView.graphLens()::lookupType, appView); return code.createValue(newType, insn.getLocalInfo()); } return null; @@ -125,7 +125,7 @@ public void rewrite(IRCode code, ProgramMethod method) { Set<Phi> affectedPhis = enumUnboxer != null ? enumUnboxer.rewriteCode(code) : Sets.newIdentityHashSet(); - GraphLense graphLense = appView.graphLense(); + GraphLens graphLens = appView.graphLens(); DexItemFactory factory = appView.dexItemFactory(); // Rewriting types that affects phi can cause us to compute TOP for cyclic phi's. To solve this // we track all phi's that needs to be re-computed. @@ -134,7 +134,7 @@ while (blocks.hasNext()) { BasicBlock block = blocks.next(); if (block.hasCatchHandlers() && appView.options().enableVerticalClassMerging) { - boolean anyGuardsRenamed = block.renameGuardsInCatchHandlers(graphLense); + boolean anyGuardsRenamed = block.renameGuardsInCatchHandlers(graphLens); if (anyGuardsRenamed) { mayHaveUnreachableBlocks |= unlinkDeadCatchHandlers(block); } @@ -217,13 +217,13 @@ if (invoke.isInvokeDirect()) { checkInvokeDirect(method.getReference(), invoke.asInvokeDirect()); } - GraphLenseLookupResult lenseLookup = - graphLense.lookupMethod(invokedMethod, method.getReference(), invoke.getType()); - DexMethod actualTarget = lenseLookup.getMethod(); - Invoke.Type actualInvokeType = lenseLookup.getType(); + GraphLensLookupResult lensLookup = + graphLens.lookupMethod(invokedMethod, method.getReference(), invoke.getType()); + DexMethod actualTarget = lensLookup.getMethod(); + Invoke.Type actualInvokeType = lensLookup.getType(); if (actualTarget != invokedMethod || invoke.getType() != actualInvokeType) { RewrittenPrototypeDescription prototypeChanges = - graphLense.lookupPrototypeChanges(actualTarget); + graphLens.lookupPrototypeChanges(actualTarget); List<Value> newInValues; ArgumentInfoCollection argumentInfoCollection = @@ -272,7 +272,7 @@ .setLocalInfo(invoke.outValue().getLocalInfo()); } invoke.outValue().replaceUsers(constantReturnMaterializingInstruction.outValue()); - if (graphLense.lookupType(invoke.getReturnType()) != invoke.getReturnType()) { + if (graphLens.lookupType(invoke.getReturnType()) != invoke.getReturnType()) { affectedPhis.addAll( constantReturnMaterializingInstruction.outValue().uniquePhiUsers()); } @@ -324,7 +324,7 @@ } DexType actualReturnType = actualTarget.proto.returnType; - DexType expectedReturnType = graphLense.lookupType(invokedMethod.proto.returnType); + DexType expectedReturnType = graphLens.lookupType(invokedMethod.proto.returnType); if (newInvoke.outValue() != null && actualReturnType != expectedReturnType) { throw new Unreachable( "Unexpected need to insert a cast. Possibly related to resolving" @@ -343,9 +343,9 @@ { InstanceGet instanceGet = current.asInstanceGet(); DexField field = instanceGet.getField(); - DexField actualField = graphLense.lookupField(field); + DexField actualField = graphLens.lookupField(field); DexMethod replacementMethod = - graphLense.lookupGetFieldForMethod(actualField, method.getReference()); + graphLens.lookupGetFieldForMethod(actualField, method.getReference()); if (replacementMethod != null) { Value newOutValue = makeOutValue(current, code); iterator.replaceCurrentInstruction( @@ -368,9 +368,9 @@ { InstancePut instancePut = current.asInstancePut(); DexField field = instancePut.getField(); - DexField actualField = graphLense.lookupField(field); + DexField actualField = graphLens.lookupField(field); DexMethod replacementMethod = - graphLense.lookupPutFieldForMethod(actualField, method.getReference()); + graphLens.lookupPutFieldForMethod(actualField, method.getReference()); if (replacementMethod != null) { iterator.replaceCurrentInstruction( new InvokeStatic(replacementMethod, null, current.inValues())); @@ -390,9 +390,9 @@ { StaticGet staticGet = current.asStaticGet(); DexField field = staticGet.getField(); - DexField actualField = graphLense.lookupField(field); + DexField actualField = graphLens.lookupField(field); DexMethod replacementMethod = - graphLense.lookupGetFieldForMethod(actualField, method.getReference()); + graphLens.lookupGetFieldForMethod(actualField, method.getReference()); if (replacementMethod != null) { Value newOutValue = makeOutValue(current, code); iterator.replaceCurrentInstruction( @@ -414,9 +414,9 @@ { StaticPut staticPut = current.asStaticPut(); DexField field = staticPut.getField(); - DexField actualField = graphLense.lookupField(field); + DexField actualField = graphLens.lookupField(field); DexMethod replacementMethod = - graphLense.lookupPutFieldForMethod(actualField, method.getReference()); + graphLens.lookupPutFieldForMethod(actualField, method.getReference()); if (replacementMethod != null) { iterator.replaceCurrentInstruction( new InvokeStatic(replacementMethod, current.outValue(), current.inValues())); @@ -530,7 +530,7 @@ // For all other instructions, substitute any changed type. TypeElement type = current.getOutType(); TypeElement substituted = - type.fixupClassTypeReferences(graphLense::lookupType, appView); + type.fixupClassTypeReferences(graphLens::lookupType, appView); if (substituted != type) { current.outValue().setType(substituted); affectedPhis.addAll(current.outValue().uniquePhiUsers()); @@ -597,7 +597,7 @@ DexItemFactory dexItemFactory = appView.dexItemFactory(); DexProto newMethodProto = dexItemFactory.applyClassMappingToProto( - callSite.methodProto, appView.graphLense()::lookupType, protoFixupCache); + callSite.methodProto, appView.graphLens()::lookupType, protoFixupCache); DexMethodHandle newBootstrapMethod = rewriteDexMethodHandle( callSite.bootstrapMethod, context, NOT_ARGUMENT_TO_LAMBDA_METAFACTORY); @@ -678,7 +678,7 @@ List<BasicBlock> deadCatchHandlers = new ArrayList<>(); for (int i = 0; i < guards.size(); i++) { // The type may have changed due to class merging. - DexType guard = appView.graphLense().lookupType(guards.get(i)); + DexType guard = appView.graphLens().lookupType(guards.get(i)); boolean guardSeenBefore = !previouslySeenGuards.add(guard); if (guardSeenBefore) { deadCatchHandlers.add(targets.get(i)); @@ -708,7 +708,7 @@ break; case TYPE: DexType oldType = argument.asDexValueType().value; - DexType newType = appView.graphLense().lookupType(oldType); + DexType newType = appView.graphLens().lookupType(oldType); if (newType != oldType) { newArgument = new DexValueType(newType); } @@ -741,18 +741,18 @@ if (methodHandle.isMethodHandle()) { DexMethod invokedMethod = methodHandle.asMethod(); MethodHandleType oldType = methodHandle.type; - GraphLenseLookupResult lenseLookup = + GraphLensLookupResult lensLookup = appView - .graphLense() + .graphLens() .lookupMethod(invokedMethod, context.getReference(), oldType.toInvokeType()); - DexMethod rewrittenTarget = lenseLookup.getMethod(); + DexMethod rewrittenTarget = lensLookup.getMethod(); DexMethod actualTarget; MethodHandleType newType; if (use == ARGUMENT_TO_LAMBDA_METAFACTORY) { // Lambda metafactory arguments will be lambda desugared away and therefore cannot flow // to a MethodHandle.invokeExact call. We can therefore member-rebind with no issues. actualTarget = rewrittenTarget; - newType = lenseLookup.getType().toMethodHandle(actualTarget); + newType = lensLookup.getType().toMethodHandle(actualTarget); } else { assert use == NOT_ARGUMENT_TO_LAMBDA_METAFACTORY; // MethodHandles that are not arguments to a lambda metafactory will not be desugared @@ -769,7 +769,7 @@ // If the method has changed from private to public we need to use virtual instead of // direct. assert rewrittenTarget.holder == actualTarget.holder; - newType = lenseLookup.getType().toMethodHandle(actualTarget); + newType = lensLookup.getType().toMethodHandle(actualTarget); assert newType == MethodHandleType.INVOKE_DIRECT || newType == MethodHandleType.INVOKE_INSTANCE; } @@ -785,7 +785,7 @@ } } else { DexField field = methodHandle.asField(); - DexField actualField = appView.graphLense().lookupField(field); + DexField actualField = appView.graphLens().lookupField(field); if (actualField != field) { return new DexMethodHandle(methodHandle.type, actualField, methodHandle.isInterface); } @@ -798,7 +798,7 @@ DexProto newProto = appView .dexItemFactory() - .applyClassMappingToProto(oldProto, appView.graphLense()::lookupType, protoFixupCache); + .applyClassMappingToProto(oldProto, appView.graphLens()::lookupType, protoFixupCache); return newProto != oldProto ? new DexValueMethodType(newProto) : type; } @@ -819,7 +819,7 @@ void replaceInstructionIfTypeChanged( DexType type, BiFunction<DexType, Value, Instruction> constructor) { - DexType newType = appView.graphLense().lookupType(type); + DexType newType = appView.graphLens().lookupType(type); if (newType != type) { Value newOutValue = makeOutValue(current, code); Instruction newInstruction = constructor.apply(newType, newOutValue);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java index f1c403b..bf8fd80 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/PostMethodProcessor.java
@@ -9,7 +9,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.IRCode; import com.android.tools.r8.ir.conversion.MethodProcessingId.Factory.ReservedMethodProcessingIds; @@ -105,14 +105,14 @@ // Some optimizations may change methods, creating new instances of the encoded methods with a // new signature. The compiler needs to update the set of methods that must be reprocessed // according to the graph lens. - public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense applied) { + public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens applied) { methodsToReprocess.rewrittenWithLens(appView, applied); Map<DexEncodedMethod, Collection<CodeOptimization>> newOptimizationsMap = new IdentityHashMap<>(); optimizationsMap.forEach( (method, optimizations) -> newOptimizationsMap.put( - appView.graphLense().mapDexEncodedMethod(method, appView, applied), + appView.graphLens().mapDexEncodedMethod(method, appView, applied), optimizations)); optimizationsMap.clear(); optimizationsMap.putAll(newOptimizationsMap); @@ -143,7 +143,7 @@ } CallGraph callGraph = new PartialCallGraphBuilder( - appView, methodsToReprocess.build(appView, appView.graphLense())) + appView, methodsToReprocess.build(appView, appView.graphLens())) .build(executorService, timing); return new PostMethodProcessor(appView, optimizationsMap, callGraph); }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java index 52a7d0a..fec0919 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/StringSwitchRemover.java
@@ -204,7 +204,6 @@ @Override void removeStringSwitch() { - int nextBlockNumber = code.getHighestBlockNumber() + 1; // Remove outgoing control flow edges from the block containing the string switch. for (BasicBlock successor : block.getNormalSuccessors()) { successor.removePredecessor(block, null); @@ -237,7 +236,8 @@ if (blocksTargetedByMultipleSwitchCases.contains(targetBlock)) { // Need an intermediate block to avoid critical edges. BasicBlock intermediateBlock = - BasicBlock.createGotoBlock(nextBlockNumber++, Position.none(), code.metadata()); + BasicBlock.createGotoBlock( + code.getNextBlockNumber(), Position.none(), code.metadata()); intermediateBlock.link(targetBlock); blockIterator.add(intermediateBlock); newBlocksWithStrings.add(intermediateBlock); @@ -245,7 +245,7 @@ } BasicBlock newBlock = BasicBlock.createIfBlock( - nextBlockNumber++, + code.getNextBlockNumber(), ifInstruction, code.metadata(), constStringInstruction, @@ -278,7 +278,6 @@ Int2ReferenceMap<Map<DexString, BasicBlock>> structure; - private int nextBlockNumber; private int nextStringId; private SingleHashBasedStringSwitchRemover( @@ -294,11 +293,10 @@ this.idSwitchBlock = theSwitch.fallthroughBlock().getUniqueNormalSuccessor(); this.idSwitchFallthroughBlock = idSwitchBlock.getUniqueNormalSuccessor(); this.structure = createStructure(theSwitch); - this.nextBlockNumber = code.getHighestBlockNumber() + 1; } private int getAndIncrementNextBlockNumber() { - return nextBlockNumber++; + return code.getNextBlockNumber(); } private Int2ReferenceMap<Map<DexString, BasicBlock>> createStructure(StringSwitch theSwitch)
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java index fbf5a15..8c65c1e 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -282,9 +282,9 @@ } return c -> method.method.hashCode(); } - + private MethodProvider getMethodProviderOrNull(DexMethod method) { - DexMethod original = appView.graphLense().getOriginalMethodSignature(method); + DexMethod original = appView.graphLens().getOriginalMethodSignature(method); assert original != null; return rewritableMethods.getProvider(original); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java index f537a6f..88f6f04 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -26,7 +26,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; import com.android.tools.r8.graph.DexValue; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.BasicBlock; import com.android.tools.r8.ir.code.IRCode; @@ -38,7 +38,7 @@ import com.android.tools.r8.ir.code.InvokeSuper; import com.android.tools.r8.ir.conversion.IRConverter; import com.android.tools.r8.ir.desugar.DefaultMethodsHelper.Collection; -import com.android.tools.r8.ir.desugar.InterfaceProcessor.InterfaceProcessorNestedGraphLense; +import com.android.tools.r8.ir.desugar.InterfaceProcessor.InterfaceProcessorNestedGraphLens; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.origin.SynthesizedOrigin; import com.android.tools.r8.position.MethodPosition; @@ -1028,7 +1028,7 @@ } private Map<DexType, DexProgramClass> processInterfaces(Builder<?> builder, Flavor flavour) { - NestedGraphLense.Builder graphLensBuilder = InterfaceProcessorNestedGraphLense.builder(); + NestedGraphLens.Builder graphLensBuilder = InterfaceProcessorNestedGraphLens.builder(); InterfaceProcessor processor = new InterfaceProcessor(appView, this); for (DexProgramClass clazz : builder.getProgramClasses()) { if (shouldProcess(clazz, flavour, true)) { @@ -1040,7 +1040,7 @@ dispatchClass.forEachProgramMethod(synthesizedMethods::add); } if (appView.enableWholeProgramOptimizations()) { - appView.setGraphLense(graphLensBuilder.build(appView.dexItemFactory(), appView.graphLense())); + appView.setGraphLens(graphLensBuilder.build(appView.dexItemFactory(), appView.graphLens())); } return processor.syntheticClasses; } @@ -1132,7 +1132,7 @@ if (shouldIgnoreFromReports(missing)) { return; } - DexMethod method = appView.graphLense().getOriginalMethodSignature(referencedFrom); + DexMethod method = appView.graphLens().getOriginalMethodSignature(referencedFrom); Origin origin = getMethodOrigin(method); MethodPosition position = new MethodPosition(method.asMethodReference()); options.warningMissingTypeForDesugar(origin, position, missing, method);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java index 2b8ce66..0b653f7 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -28,8 +28,8 @@ import com.android.tools.r8.graph.DexProgramClass.ChecksumSupplier; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ParameterAnnotationsList; import com.android.tools.r8.ir.code.Invoke.Type; @@ -68,7 +68,7 @@ this.rewriter = rewriter; } - void process(DexProgramClass iface, NestedGraphLense.Builder graphLensBuilder) { + void process(DexProgramClass iface, NestedGraphLens.Builder graphLensBuilder) { assert iface.isInterface(); // The list of methods to be created in companion class. List<DexEncodedMethod> companionMethods = new ArrayList<>(); @@ -98,9 +98,9 @@ code, companionMethod.getArity(), appView); if (!appView.options().isDesugaredLibraryCompilation()) { setOriginalMethodPosition( - code, appView.graphLense().getOriginalMethodSignature(virtual.method)); + code, appView.graphLens().getOriginalMethodSignature(virtual.method)); } else { - assert appView.graphLense().isIdentityLense(); + assert appView.graphLens().isIdentityLens(); } DexEncodedMethod implMethod = new DexEncodedMethod( @@ -144,9 +144,9 @@ DexMethod companionMethod = rewriter.staticAsMethodOfCompanionClass(oldMethod); if (!appView.options().isDesugaredLibraryCompilation()) { setOriginalMethodPosition( - direct.getCode(), appView.graphLense().getOriginalMethodSignature(oldMethod)); + direct.getCode(), appView.graphLens().getOriginalMethodSignature(oldMethod)); } else { - assert appView.graphLense().isIdentityLense(); + assert appView.graphLens().isIdentityLens(); } DexEncodedMethod implMethod = new DexEncodedMethod( @@ -177,9 +177,9 @@ code, companionMethod.getArity(), appView); if (!appView.options().isDesugaredLibraryCompilation()) { setOriginalMethodPosition( - code, appView.graphLense().getOriginalMethodSignature(oldMethod)); + code, appView.graphLens().getOriginalMethodSignature(oldMethod)); } else { - assert appView.graphLense().isIdentityLense(); + assert appView.graphLens().isIdentityLens(); } DexEncodedMethod implMethod = new DexEncodedMethod( @@ -400,15 +400,15 @@ // Specific lens which remaps invocation types to static since all rewrites performed here // are to static companion methods. - public static class InterfaceProcessorNestedGraphLense extends NestedGraphLense { + public static class InterfaceProcessorNestedGraphLens extends NestedGraphLens { - public InterfaceProcessorNestedGraphLense( + public InterfaceProcessorNestedGraphLens( Map<DexType, DexType> typeMap, Map<DexMethod, DexMethod> methodMap, Map<DexField, DexField> fieldMap, BiMap<DexField, DexField> originalFieldSignatures, BiMap<DexMethod, DexMethod> originalMethodSignatures, - GraphLense previousLense, + GraphLens previousLens, DexItemFactory dexItemFactory) { super( typeMap, @@ -416,7 +416,7 @@ fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory); } @@ -425,23 +425,23 @@ return Type.STATIC; } - public static GraphLense.Builder builder() { + public static GraphLens.Builder builder() { return new Builder(); } - public static class Builder extends NestedGraphLense.Builder { + public static class Builder extends NestedGraphLens.Builder { @Override - public GraphLense build(DexItemFactory dexItemFactory, GraphLense previousLense) { + public GraphLens build(DexItemFactory dexItemFactory, GraphLens previousLens) { if (originalFieldSignatures.isEmpty() && originalMethodSignatures.isEmpty()) { - return previousLense; + return previousLens; } - return new InterfaceProcessorNestedGraphLense( + return new InterfaceProcessorNestedGraphLens( typeMap, methodMap, fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory); } }
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 fb66a2a..6e41b1a 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
@@ -12,8 +12,8 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.Nullability; import com.android.tools.r8.ir.analysis.type.TypeAnalysis; @@ -347,19 +347,19 @@ return knownLambdaClasses; } - public GraphLense buildMappingLense(AppView<?> appView) { + public GraphLens buildMappingLens(AppView<?> appView) { if (originalMethodSignatures.isEmpty()) { - return appView.graphLense(); + return appView.graphLens(); } - return new LambdaRewriterLense( - originalMethodSignatures, appView.graphLense(), appView.dexItemFactory()); + return new LambdaRewriterLens( + originalMethodSignatures, appView.graphLens(), appView.dexItemFactory()); } - static class LambdaRewriterLense extends NestedGraphLense { + static class LambdaRewriterLens extends NestedGraphLens { - public LambdaRewriterLense( + public LambdaRewriterLens( BiMap<DexMethod, DexMethod> originalMethodSignatures, - GraphLense graphLense, + GraphLens graphLens, DexItemFactory factory) { super( ImmutableMap.of(), @@ -367,7 +367,7 @@ ImmutableMap.of(), null, originalMethodSignatures, - graphLense, + graphLens, factory); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java index 58730b9..bbe2ae0 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/NestBasedAccessDesugaring.java
@@ -81,18 +81,18 @@ abstract void reportIncompleteNest(List<DexType> nest); DexClass definitionFor(DexType type) { - return appView.definitionFor(appView.graphLense().lookupType(type)); + return appView.definitionFor(appView.graphLens().lookupType(type)); } private DexEncodedMethod lookupOnHolder( DexMethod method, DexClassAndMethod context, Invoke.Type invokeType) { DexMethod rewritten = - appView.graphLense().lookupMethod(method, context.getReference(), invokeType).getMethod(); + appView.graphLens().lookupMethod(method, context.getReference(), invokeType).getMethod(); return rewritten.lookupOnClass(appView.definitionForHolder(rewritten)); } private DexEncodedField lookupOnHolder(DexField field) { - DexField rewritten = appView.graphLense().lookupField(field); + DexField rewritten = appView.graphLens().lookupField(field); return rewritten.lookupOnClass(appView.definitionForHolder(rewritten)); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java b/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLens.java similarity index 77% rename from src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java rename to src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLens.java index ded1538..cdca27a 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLense.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/NestedPrivateMethodLens.java
@@ -8,35 +8,35 @@ import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.RewrittenPrototypeDescription; import com.android.tools.r8.ir.code.Invoke; import com.google.common.collect.ImmutableMap; import java.util.IdentityHashMap; import java.util.Map; -public class NestedPrivateMethodLense extends NestedGraphLense { +public class NestedPrivateMethodLens extends NestedGraphLens { // Map from nestHost to nest members including nest hosts private final DexType nestConstructorType; private final Map<DexField, DexMethod> getFieldMap; private final Map<DexField, DexMethod> putFieldMap; - NestedPrivateMethodLense( + NestedPrivateMethodLens( AppView<?> appView, DexType nestConstructorType, Map<DexMethod, DexMethod> methodMap, Map<DexField, DexMethod> getFieldMap, Map<DexField, DexMethod> putFieldMap, - GraphLense previousLense) { + GraphLens previousLens) { super( ImmutableMap.of(), methodMap, ImmutableMap.of(), null, null, - previousLense, + previousLens, appView.dexItemFactory()); // No concurrent maps here, we do not want synchronization overhead. assert methodMap instanceof IdentityHashMap; @@ -59,13 +59,13 @@ @Override public DexMethod lookupGetFieldForMethod(DexField field, DexMethod context) { - assert previousLense.lookupGetFieldForMethod(field, context) == null; + assert previousLens.lookupGetFieldForMethod(field, context) == null; return lookupFieldForMethod(field, context, getFieldMap); } @Override public DexMethod lookupPutFieldForMethod(DexField field, DexMethod context) { - assert previousLense.lookupPutFieldForMethod(field, context) == null; + assert previousLens.lookupPutFieldForMethod(field, context) == null; return lookupFieldForMethod(field, context, putFieldMap); } @@ -76,7 +76,7 @@ @Override public boolean verifyIsContextFreeForMethod(DexMethod method) { - assert !methodMap.containsKey(previousLense.lookupMethod(method)); + assert !methodMap.containsKey(previousLens.lookupMethod(method)); return true; } @@ -99,18 +99,17 @@ public RewrittenPrototypeDescription lookupPrototypeChanges(DexMethod method) { if (isConstructorBridge(method)) { // TODO (b/132767654): Try to write a test which breaks that assertion. - assert previousLense.lookupPrototypeChanges(method).isEmpty(); + assert previousLens.lookupPrototypeChanges(method).isEmpty(); return RewrittenPrototypeDescription.none().withExtraNullParameter(); } else { - return previousLense.lookupPrototypeChanges(method); + return previousLens.lookupPrototypeChanges(method); } } @Override - public GraphLenseLookupResult lookupMethod( - DexMethod method, DexMethod context, Invoke.Type type) { + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Invoke.Type type) { assert originalMethodSignatures == null; - GraphLenseLookupResult previous = previousLense.lookupMethod(method, context, type); + GraphLensLookupResult previous = previousLens.lookupMethod(method, context, type); DexMethod bridge = methodMap.get(previous.getMethod()); if (bridge == null) { return previous; @@ -120,16 +119,16 @@ return previous; } if (isConstructorBridge(bridge)) { - return new GraphLenseLookupResult(bridge, Invoke.Type.DIRECT); + return new GraphLensLookupResult(bridge, Invoke.Type.DIRECT); } - return new GraphLenseLookupResult(bridge, Invoke.Type.STATIC); + return new GraphLensLookupResult(bridge, Invoke.Type.STATIC); } public static Builder builder() { return new Builder(); } - public static class Builder extends NestedGraphLense.Builder { + public static class Builder extends NestedGraphLens.Builder { private Map<DexField, DexMethod> getFieldMap = new IdentityHashMap<>(); private Map<DexField, DexMethod> putFieldMap = new IdentityHashMap<>(); @@ -142,14 +141,14 @@ putFieldMap.put(from, to); } - public NestedPrivateMethodLense build(AppView<?> appView, DexType nestConstructorType) { + public NestedPrivateMethodLens build(AppView<?> appView, DexType nestConstructorType) { assert typeMap.isEmpty(); assert fieldMap.isEmpty(); if (getFieldMap.isEmpty() && methodMap.isEmpty() && putFieldMap.isEmpty()) { return null; } - return new NestedPrivateMethodLense( - appView, nestConstructorType, methodMap, getFieldMap, putFieldMap, appView.graphLense()); + return new NestedPrivateMethodLens( + appView, nestConstructorType, methodMap, getFieldMap, putFieldMap, appView.graphLens()); } } }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java index b97888d..e9ac116 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/R8NestBasedAccessDesugaring.java
@@ -33,20 +33,20 @@ super(appView); } - public NestedPrivateMethodLense run( + public NestedPrivateMethodLens run( ExecutorService executorService, DexApplication.Builder<?> appBuilder) throws ExecutionException { assert !appView.options().canUseNestBasedAccess() || appView.options().testing.enableForceNestBasedAccessDesugaringForTest; computeAndProcessNestsConcurrently(executorService); - NestedPrivateMethodLense.Builder lensBuilder = NestedPrivateMethodLense.builder(); + NestedPrivateMethodLens.Builder lensBuilder = NestedPrivateMethodLens.builder(); addDeferredBridgesAndMapMethods(lensBuilder); clearNestAttributes(); synthesizeNestConstructor(appBuilder); return lensBuilder.build(appView, getNestConstructorType()); } - private void addDeferredBridgesAndMapMethods(NestedPrivateMethodLense.Builder lensBuilder) { + private void addDeferredBridgesAndMapMethods(NestedPrivateMethodLens.Builder lensBuilder) { // Here we add the bridges and we fill the lens map. addDeferredBridgesAndMapMethods(bridges, lensBuilder::map); addDeferredBridgesAndMapMethods(getFieldBridges, lensBuilder::mapGetField);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java index 6f3aed5..4043023 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/TwrCloseResourceRewriter.java
@@ -104,7 +104,7 @@ } public static boolean isSynthesizedCloseResourceMethod(DexMethod method, AppView<?> appView) { - DexMethod original = appView.graphLense().getOriginalMethodSignature(method); + DexMethod original = appView.graphLens().getOriginalMethodSignature(method); assert original != null; // We consider all methods of *any* class with expected name and signature // to be synthesized by java 9 compiler for try-with-resources, reasoning:
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/BasicBlockInstructionsEquivalence.java b/src/main/java/com/android/tools/r8/ir/optimize/BasicBlockInstructionsEquivalence.java index 17c8d1a..b7909df 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/BasicBlockInstructionsEquivalence.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/BasicBlockInstructionsEquivalence.java
@@ -21,7 +21,7 @@ BasicBlockInstructionsEquivalence(IRCode code, RegisterAllocator allocator) { this.allocator = allocator; - hashes = new int[code.getHighestBlockNumber() + 1]; + hashes = new int[code.getCurrentBlockNumber() + 1]; Arrays.fill(hashes, UNKNOW_HASH); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java index 4cb2fab..996b8d8 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -710,7 +710,6 @@ assert block == originalBlock; // Collect the new blocks for adding to the block list. - int nextBlockNumber = code.getHighestBlockNumber() + 1; LinkedList<BasicBlock> newBlocks = new LinkedList<>(); // Build the switch-blocks backwards, to always have the fallthrough block in hand. @@ -722,9 +721,7 @@ int key = keys.getInt(j); switchBuilder.addKeyAndTarget(key, keyToTarget.get(key)); } - switchBuilder - .setFallthrough(fallthroughBlock) - .setBlockNumber(nextBlockNumber++); + switchBuilder.setFallthrough(fallthroughBlock).setBlockNumber(code.getNextBlockNumber()); BasicBlock newSwitchBlock = switchBuilder.build(code.metadata()); newBlocks.addFirst(newSwitchBlock); fallthroughBlock = newSwitchBlock; @@ -740,7 +737,7 @@ .setRight(key) .setTarget(peeledOffTarget) .setFallthrough(fallthroughBlock) - .setBlockNumber(nextBlockNumber++); + .setBlockNumber(code.getNextBlockNumber()); BasicBlock ifBlock = ifBuilder.build(); newBlocks.addFirst(ifBlock); fallthroughBlock = ifBlock; @@ -3478,7 +3475,8 @@ iterator.add(new InvokeVirtual(print, null, ImmutableList.of(out, indent))); // Add a block for end-of-line printing. - BasicBlock eol = BasicBlock.createGotoBlock(code.blocks.size(), position, code.metadata()); + BasicBlock eol = + BasicBlock.createGotoBlock(code.getNextBlockNumber(), position, code.metadata()); code.blocks.add(eol); BasicBlock successor = block.unlinkSingleSuccessor(); @@ -3493,14 +3491,15 @@ successor = block.unlinkSingleSuccessor(); If theIf = new If(Type.NE, argument); theIf.setPosition(position); - BasicBlock ifBlock = BasicBlock.createIfBlock(code.blocks.size(), theIf, code.metadata()); + BasicBlock ifBlock = + BasicBlock.createIfBlock(code.getNextBlockNumber(), theIf, code.metadata()); code.blocks.add(ifBlock); // Fallthrough block must be added right after the if. BasicBlock isNullBlock = - BasicBlock.createGotoBlock(code.blocks.size(), position, code.metadata()); + BasicBlock.createGotoBlock(code.getNextBlockNumber(), position, code.metadata()); code.blocks.add(isNullBlock); BasicBlock isNotNullBlock = - BasicBlock.createGotoBlock(code.blocks.size(), position, code.metadata()); + BasicBlock.createGotoBlock(code.getNextBlockNumber(), position, code.metadata()); code.blocks.add(isNotNullBlock); // Link the added blocks together.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java index 97dbb2e..67b6310 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -18,7 +18,7 @@ import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.NestMemberClassAttribute; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult; @@ -136,7 +136,7 @@ return true; } - if (blacklist.contains(appView.graphLense().getOriginalMethodSignature(singleTargetReference)) + if (blacklist.contains(appView.graphLens().getOriginalMethodSignature(singleTargetReference)) || TwrCloseResourceRewriter.isSynthesizedCloseResourceMethod( singleTargetReference, appView)) { whyAreYouNotInliningReporter.reportBlacklisted(); @@ -183,7 +183,7 @@ ConstraintWithTarget result = ConstraintWithTarget.ALWAYS; InliningConstraints inliningConstraints = - new InliningConstraints(appView, GraphLense.getIdentityLense()); + new InliningConstraints(appView, GraphLens.getIdentityLens()); for (Instruction instruction : code.instructions()) { ConstraintWithTarget state = instructionAllowedForInlining(instruction, inliningConstraints, context); @@ -635,11 +635,9 @@ code.prepareBlocksForCatchHandlers(); - int nextBlockNumber = code.getHighestBlockNumber() + 1; - // Create a block for holding the monitor-exit instruction. BasicBlock monitorExitBlock = new BasicBlock(); - monitorExitBlock.setNumber(nextBlockNumber++); + monitorExitBlock.setNumber(code.getNextBlockNumber()); // For each block in the code that may throw, add a catch-all handler targeting the // monitor-exit block. @@ -654,7 +652,7 @@ } BasicBlock moveExceptionBlock = BasicBlock.createGotoBlock( - nextBlockNumber++, Position.none(), code.metadata(), monitorExitBlock); + code.getNextBlockNumber(), Position.none(), code.metadata(), monitorExitBlock); InstructionListIterator moveExceptionBlockIterator = moveExceptionBlock.listIterator(code); moveExceptionBlockIterator.setInsertionPosition(Position.syntheticNone()); @@ -665,29 +663,32 @@ moveExceptionBlocks.add(moveExceptionBlock); } - // Create a phi for the exception values such that we can rethrow the exception if needed. - Value exceptionValue; - if (moveExceptionBlocks.size() == 1) { - exceptionValue = - ListUtils.first(moveExceptionBlocks).getInstructions().getFirst().outValue(); - } else { - Phi phi = code.createPhi(monitorExitBlock, throwableType); - List<Value> operands = - ListUtils.map( - moveExceptionBlocks, block -> block.getInstructions().getFirst().outValue()); - phi.addOperands(operands); - exceptionValue = phi; + InstructionListIterator monitorExitBlockIterator = null; + if (!moveExceptionBlocks.isEmpty()) { + // Create a phi for the exception values such that we can rethrow the exception if needed. + Value exceptionValue; + if (moveExceptionBlocks.size() == 1) { + exceptionValue = + ListUtils.first(moveExceptionBlocks).getInstructions().getFirst().outValue(); + } else { + Phi phi = code.createPhi(monitorExitBlock, throwableType); + List<Value> operands = + ListUtils.map( + moveExceptionBlocks, block -> block.getInstructions().getFirst().outValue()); + phi.addOperands(operands); + exceptionValue = phi; + } + + monitorExitBlockIterator = monitorExitBlock.listIterator(code); + monitorExitBlockIterator.setInsertionPosition(Position.syntheticNone()); + monitorExitBlockIterator.add(new Throw(exceptionValue)); + monitorExitBlock.getMutablePredecessors().addAll(moveExceptionBlocks); + + // Insert the newly created blocks. + code.blocks.addAll(moveExceptionBlocks); + code.blocks.add(monitorExitBlock); } - InstructionListIterator monitorExitBlockIterator = monitorExitBlock.listIterator(code); - monitorExitBlockIterator.setInsertionPosition(Position.syntheticNone()); - monitorExitBlockIterator.add(new Throw(exceptionValue)); - monitorExitBlock.getMutablePredecessors().addAll(moveExceptionBlocks); - - // Insert the newly created blocks. - code.blocks.addAll(moveExceptionBlocks); - code.blocks.add(monitorExitBlock); - // Create a block for holding the monitor-enter instruction. Note that, since this block // is created after we attach catch-all handlers to the code, this block will not have any // catch handlers. @@ -715,9 +716,11 @@ // Insert the monitor-enter and monitor-exit instructions. monitorEnterBlockIterator.add(new Monitor(Monitor.Type.ENTER, lockValue)); - monitorExitBlockIterator.previous(); - monitorExitBlockIterator.add(new Monitor(Monitor.Type.EXIT, lockValue)); - monitorExitBlock.close(null); + if (monitorExitBlockIterator != null) { + monitorExitBlockIterator.previous(); + monitorExitBlockIterator.add(new Monitor(Monitor.Type.EXIT, lockValue)); + monitorExitBlock.close(null); + } for (BasicBlock block : code.blocks) { if (block.exit().isReturn()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java index 890a23e..1d32c0b 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -14,7 +14,7 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ResolutionResult; import com.android.tools.r8.graph.ResolutionResult.SingleResolutionResult; import com.android.tools.r8.ir.code.Invoke.Type; @@ -38,23 +38,23 @@ // being inlined into B.<init>() only because it is not declared in the same class as B (which // it would be after merging A and B). // - // To circumvent this problem, the vertical class merger creates a graph lense that maps the + // To circumvent this problem, the vertical class merger creates a graph lens that maps the // type A to B, to create a temporary view of what the world would look like after class merging. - private GraphLense graphLense; + private GraphLens graphLens; - public InliningConstraints(AppView<AppInfoWithLiveness> appView, GraphLense graphLense) { - assert graphLense.isContextFreeForMethods(); - assert appView.graphLense() != graphLense || graphLense.isIdentityLense(); + public InliningConstraints(AppView<AppInfoWithLiveness> appView, GraphLens graphLens) { + assert graphLens.isContextFreeForMethods(); + assert appView.graphLens() != graphLens || graphLens.isIdentityLens(); this.appView = appView; - this.graphLense = graphLense; // Note: Intentionally *not* appView.graphLense(). + this.graphLens = graphLens; // Note: Intentionally *not* appView.graphLens(). } public AppView<AppInfoWithLiveness> getAppView() { return appView; } - public GraphLense getGraphLense() { - return graphLense; + public GraphLens getGraphLens() { + return graphLens; } public void disallowStaticInterfaceMethodCalls() { @@ -62,7 +62,7 @@ } private boolean isVerticalClassMerging() { - return !graphLense.isIdentityLense(); + return !graphLens.isIdentityLens(); } public ConstraintWithTarget forAlwaysMaterializingUser() { @@ -131,7 +131,7 @@ } public ConstraintWithTarget forInstanceGet(DexField field, DexProgramClass context) { - DexField lookup = graphLense.lookupField(field); + DexField lookup = graphLens.lookupField(field); return forFieldInstruction(lookup, appView.appInfo().lookupInstanceTarget(lookup), context); } @@ -140,7 +140,7 @@ } public ConstraintWithTarget forInstancePut(DexField field, DexProgramClass context) { - DexField lookup = graphLense.lookupField(field); + DexField lookup = graphLens.lookupField(field); return forFieldInstruction(lookup, appView.appInfo().lookupInstanceTarget(lookup), context); } @@ -183,7 +183,7 @@ if (dexEncodedMethod != null) { return dexEncodedMethod; } - assert graphLense.lookupType(context.superType) == context.type; + assert graphLens.lookupType(context.superType) == context.type; DexProgramClass superContext = appView.definitionForProgramType(context.superType); if (superContext == null) { return null; @@ -198,7 +198,7 @@ } public ConstraintWithTarget forInvokeDirect(DexMethod method, DexProgramClass context) { - DexMethod lookup = graphLense.lookupMethod(method); + DexMethod lookup = graphLens.lookupMethod(method); DexEncodedMethod target = isVerticalClassMerging() ? lookupWhileVerticalClassMerging( @@ -210,7 +210,7 @@ } public ConstraintWithTarget forInvokeInterface(DexMethod method, DexProgramClass context) { - DexMethod lookup = graphLense.lookupMethod(method); + DexMethod lookup = graphLens.lookupMethod(method); return forVirtualInvoke(lookup, context, true); } @@ -227,7 +227,7 @@ } public ConstraintWithTarget forInvokeStatic(DexMethod method, DexProgramClass context) { - DexMethod lookup = graphLense.lookupMethod(method); + DexMethod lookup = graphLens.lookupMethod(method); DexEncodedMethod target = isVerticalClassMerging() ? lookupWhileVerticalClassMerging( @@ -244,7 +244,7 @@ } public ConstraintWithTarget forInvokeVirtual(DexMethod method, DexProgramClass context) { - DexMethod lookup = graphLense.lookupMethod(method); + DexMethod lookup = graphLens.lookupMethod(method); return forVirtualInvoke(lookup, context, false); } @@ -293,12 +293,12 @@ } public ConstraintWithTarget forStaticGet(DexField field, DexProgramClass context) { - DexField lookup = graphLense.lookupField(field); + DexField lookup = graphLens.lookupField(field); return forFieldInstruction(lookup, appView.appInfo().lookupStaticTarget(lookup), context); } public ConstraintWithTarget forStaticPut(DexField field, DexProgramClass context) { - DexField lookup = graphLense.lookupField(field); + DexField lookup = graphLens.lookupField(field); return forFieldInstruction(lookup, appView.appInfo().lookupStaticTarget(lookup), context); } @@ -329,7 +329,7 @@ private ConstraintWithTarget forFieldInstruction( DexField field, DexEncodedField target, DexProgramClass context) { // Resolve the field if possible and decide whether the instruction can inlined. - DexType fieldHolder = graphLense.lookupType(field.holder); + DexType fieldHolder = graphLens.lookupType(field.holder); DexClass fieldClass = appView.definitionFor(fieldHolder); if (target != null && fieldClass != null) { ConstraintWithTarget fieldConstraintWithTarget = @@ -340,7 +340,7 @@ // // See, for example, InlineNonReboundFieldTest (b/128604123). if (field.holder != target.holder()) { - DexType actualFieldHolder = graphLense.lookupType(target.holder()); + DexType actualFieldHolder = graphLens.lookupType(target.holder()); fieldConstraintWithTarget = ConstraintWithTarget.meet( fieldConstraintWithTarget, @@ -364,7 +364,7 @@ return ConstraintWithTarget.ALWAYS; } if (target != null) { - DexType methodHolder = graphLense.lookupType(target.holder()); + DexType methodHolder = graphLens.lookupType(target.holder()); DexClass methodClass = appView.definitionFor(methodHolder); if (methodClass != null) { if (!allowStaticInterfaceMethodCalls && methodClass.isInterface() && target.hasCode()) { @@ -405,7 +405,7 @@ return ConstraintWithTarget.NEVER; } - DexType methodHolder = graphLense.lookupType(resolutionTarget.holder()); + DexType methodHolder = graphLens.lookupType(resolutionTarget.holder()); DexClass methodClass = appView.definitionFor(methodHolder); assert methodClass != null; ConstraintWithTarget methodConstraintWithTarget =
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/NestReducer.java b/src/main/java/com/android/tools/r8/ir/optimize/NestReducer.java index 715c936..6fa08c8 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/NestReducer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/NestReducer.java
@@ -35,8 +35,8 @@ } private DexClass definitionFor(DexType type) { - assert appView.graphLense().lookupType(type) == type; - return appView.definitionFor(appView.graphLense().lookupType(type)); + assert appView.graphLens().lookupType(type) == type; + return appView.definitionFor(appView.graphLens().lookupType(type)); } public void run(ExecutorService executorService) throws ExecutionException { @@ -113,8 +113,7 @@ private void clearNestAttributes(DexClass nestHost) { nestHost.getNestMembersClassAttributes().clear(); for (NestMemberClassAttribute attr : nestHost.getNestMembersClassAttributes()) { - DexClass member = - appView.definitionFor(appView.graphLense().lookupType(attr.getNestMember())); + DexClass member = appView.definitionFor(appView.graphLens().lookupType(attr.getNestMember())); member.clearNestHost(); } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java index d9eb7f2..c7e7b6b 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -25,7 +25,7 @@ import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ParameterAnnotationsList; import com.android.tools.r8.graph.ProgramMethod; @@ -1268,7 +1268,7 @@ public Outliner(AppView<AppInfoWithLiveness> appView) { this.appView = appView; - this.inliningConstraints = new InliningConstraints(appView, GraphLense.getIdentityLense()); + this.inliningConstraints = new InliningConstraints(appView, GraphLens.getIdentityLens()); } public void createOutlineMethodIdentifierGenerator() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java index 958749e..a8cd620 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
@@ -242,7 +242,6 @@ blocks.add(normalExit); } do { - int startNumberOfNewBlock = code.getHighestBlockNumber() + 1; Map<BasicBlock, BasicBlock> newBlocks = new IdentityHashMap<>(); for (BasicBlock block : blocks) { InstructionEquivalence equivalence = new InstructionEquivalence(allocator); @@ -294,10 +293,9 @@ if (commonSuffixSize <= 1 || sizeDelta >= 0) { continue; } - int blockNumber = startNumberOfNewBlock + newBlocks.size(); BasicBlock newBlock = createAndInsertBlockForSuffix( - blockNumber, + code.getNextBlockNumber(), commonSuffixSize, predsWithSameLastInstruction, block == normalExit ? null : block,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java index 5178020..eb6bddd 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadElimination.java
@@ -336,7 +336,7 @@ assert verticallyMergedClasses.isTarget(method.getHolderType()); assert appView .dexItemFactory() - .isConstructor(appView.graphLense().getOriginalMethodSignature(method.getReference())); + .isConstructor(appView.graphLens().getOriginalMethodSignature(method.getReference())); assert method.getDefinition().getOptimizationInfo().forceInline(); return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java index 71a2a18..3b3d15d 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/ServiceLoaderRewriter.java
@@ -137,8 +137,11 @@ continue; } - // Check that ClassLoader used is the ClassLoader defined for the the service configuration + // Check that ClassLoader used is the ClassLoader defined for the service configuration // that we are instantiating or NULL. + if (serviceLoaderLoad.inValues().get(1).isPhi()) { + continue; + } InvokeVirtual classLoaderInvoke = serviceLoaderLoad.inValues().get(1).definition.asInvokeVirtual(); boolean isGetClassLoaderOnConstClassOrNull =
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java index 6a8b6a5..885a1d0 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/UninstantiatedTypeOptimization.java
@@ -16,7 +16,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.FieldAccessInfo; import com.android.tools.r8.graph.FieldAccessInfoCollection; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.RewrittenPrototypeDescription; import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection; import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfo; @@ -48,12 +48,12 @@ DISALLOW_ARGUMENT_REMOVAL } - public static class UninstantiatedTypeOptimizationGraphLense extends NestedGraphLense { + public static class UninstantiatedTypeOptimizationGraphLens extends NestedGraphLens { private final AppView<?> appView; private final Map<DexMethod, ArgumentInfoCollection> removedArgumentsInfoPerMethod; - UninstantiatedTypeOptimizationGraphLense( + UninstantiatedTypeOptimizationGraphLens( BiMap<DexMethod, DexMethod> methodMap, Map<DexMethod, ArgumentInfoCollection> removedArgumentsInfoPerMethod, AppView<?> appView) { @@ -63,7 +63,7 @@ ImmutableMap.of(), null, methodMap.inverse(), - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory()); this.appView = appView; this.removedArgumentsInfoPerMethod = removedArgumentsInfoPerMethod; @@ -72,7 +72,7 @@ @Override public RewrittenPrototypeDescription lookupPrototypeChanges(DexMethod method) { DexMethod originalMethod = originalMethodSignatures.getOrDefault(method, method); - RewrittenPrototypeDescription result = previousLense.lookupPrototypeChanges(originalMethod); + RewrittenPrototypeDescription result = previousLens.lookupPrototypeChanges(originalMethod); if (originalMethod != method) { if (method.proto.returnType.isVoidType() && !originalMethod.proto.returnType.isVoidType()) { result = result.withConstantReturn(originalMethod.proto.returnType, appView); @@ -123,7 +123,7 @@ return this; } - public UninstantiatedTypeOptimizationGraphLense run( + public UninstantiatedTypeOptimizationGraphLens run( MethodPoolCollection methodPoolCollection, ExecutorService executorService, Timing timing) { try { methodPoolCollection.buildAll(executorService, timing); @@ -147,7 +147,7 @@ removedArgumentsInfoPerMethod)); if (!methodMapping.isEmpty()) { - return new UninstantiatedTypeOptimizationGraphLense( + return new UninstantiatedTypeOptimizationGraphLens( methodMapping, removedArgumentsInfoPerMethod, appView); } return null;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java index 7b60b90..e6bd21e 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/UnusedArgumentsCollector.java
@@ -14,8 +14,8 @@ import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.RewrittenPrototypeDescription; import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection; import com.android.tools.r8.graph.RewrittenPrototypeDescription.RemovedArgumentInfo; @@ -51,17 +51,17 @@ private final BiMap<DexMethod, DexMethod> methodMapping = HashBiMap.create(); private final Map<DexMethod, ArgumentInfoCollection> removedArguments = new IdentityHashMap<>(); - public static class UnusedArgumentsGraphLense extends NestedGraphLense { + public static class UnusedArgumentsGraphLens extends NestedGraphLens { private final Map<DexMethod, ArgumentInfoCollection> removedArguments; - UnusedArgumentsGraphLense( + UnusedArgumentsGraphLens( Map<DexType, DexType> typeMap, Map<DexMethod, DexMethod> methodMap, Map<DexField, DexField> fieldMap, BiMap<DexField, DexField> originalFieldSignatures, BiMap<DexMethod, DexMethod> originalMethodSignatures, - GraphLense previousLense, + GraphLens previousLens, DexItemFactory dexItemFactory, Map<DexMethod, ArgumentInfoCollection> removedArguments) { super( @@ -70,7 +70,7 @@ fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory); this.removedArguments = removedArguments; } @@ -81,7 +81,7 @@ originalMethodSignatures != null ? originalMethodSignatures.getOrDefault(method, method) : method; - RewrittenPrototypeDescription result = previousLense.lookupPrototypeChanges(originalMethod); + RewrittenPrototypeDescription result = previousLens.lookupPrototypeChanges(originalMethod); ArgumentInfoCollection removedArguments = this.removedArguments.get(method); return removedArguments != null ? result.withRemovedArguments(removedArguments) : result; } @@ -93,7 +93,7 @@ this.methodPoolCollection = methodPoolCollection; } - public UnusedArgumentsGraphLense run(ExecutorService executorService, Timing timing) + public UnusedArgumentsGraphLens run(ExecutorService executorService, Timing timing) throws ExecutionException { ThreadUtils.awaitFutures( Streams.stream(appView.appInfo().classes()) @@ -110,13 +110,13 @@ appView.appInfo().classesWithDeterministicOrder().forEach(this::processVirtualMethods); if (!methodMapping.isEmpty()) { - return new UnusedArgumentsGraphLense( + return new UnusedArgumentsGraphLens( ImmutableMap.of(), methodMapping, ImmutableMap.of(), ImmutableBiMap.of(), methodMapping.inverse(), - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory(), removedArguments); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java index 3824962..acd7477 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -1222,8 +1222,9 @@ if (root.isStaticGet()) { // If we are class inlining a singleton instance from a static-get, then we don't know - // the value of the fields. - if (parameterUsage.hasFieldRead) { + // the value of the fields, and we also can't optimize away instance-field assignments, as + // they have global side effects. + if (parameterUsage.hasFieldAssignment || parameterUsage.hasFieldRead) { return false; } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java index 3be53b2..c902868 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxer.java
@@ -23,8 +23,8 @@ import com.android.tools.r8.graph.DexValue.DexValueInt; import com.android.tools.r8.graph.DexValue.DexValueNull; import com.android.tools.r8.graph.FieldResolutionResult; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.RewrittenPrototypeDescription; import com.android.tools.r8.graph.RewrittenPrototypeDescription.ArgumentInfoCollection; @@ -337,10 +337,10 @@ // Update keep info on any of the enum methods of the removed classes. updatePinnedItems(enumsToUnbox); enumUnboxerRewriter = new EnumUnboxingRewriter(appView, enumsToUnbox); - NestedGraphLense enumUnboxingLens = new TreeFixer(enumsToUnbox).fixupTypeReferences(); + NestedGraphLens enumUnboxingLens = new TreeFixer(enumsToUnbox).fixupTypeReferences(); appView.setUnboxedEnums(enumUnboxerRewriter.getEnumsToUnbox()); - GraphLense previousLens = appView.graphLense(); - appView.setGraphLense(enumUnboxingLens); + GraphLens previousLens = appView.graphLens(); + appView.setGraphLens(enumUnboxingLens); appView.setAppInfo( appView.appInfo().rewrittenWithLens(appView.appInfo().app().asDirect(), enumUnboxingLens)); // Update optimization info. @@ -354,8 +354,8 @@ if (optimizationInfo.isMutableFieldOptimizationInfo()) { optimizationInfo .asMutableFieldOptimizationInfo() - .fixupClassTypeReferences(appView.graphLense()::lookupType, appView) - .fixupAbstractValue(appView, appView.graphLense()); + .fixupClassTypeReferences(appView.graphLens()::lookupType, appView) + .fixupAbstractValue(appView, appView.graphLens()); } else { assert optimizationInfo.isDefaultFieldOptimizationInfo(); } @@ -367,9 +367,9 @@ if (optimizationInfo.isUpdatableMethodOptimizationInfo()) { optimizationInfo .asUpdatableMethodOptimizationInfo() - .fixupClassTypeReferences(appView.graphLense()::lookupType, appView) - .fixupAbstractReturnValue(appView, appView.graphLense()) - .fixupInstanceInitializerInfo(appView, appView.graphLense()); + .fixupClassTypeReferences(appView.graphLens()::lookupType, appView) + .fixupAbstractReturnValue(appView, appView.graphLens()) + .fixupInstanceInitializerInfo(appView, appView.graphLens()); } else { assert optimizationInfo.isDefaultMethodOptimizationInfo(); } @@ -718,7 +718,7 @@ this.enumsToUnbox = enumsToUnbox; } - private NestedGraphLense fixupTypeReferences() { + private NestedGraphLens fixupTypeReferences() { assert enumUnboxerRewriter != null; // Fix all methods and fields using enums to unbox. for (DexProgramClass clazz : appView.appInfo().classes()) { @@ -752,7 +752,7 @@ appView.definitionForProgramType(factory.enumUnboxingUtilityType); assert utilityClass != null : "Should have been synthesized upfront"; utilityClass.addDirectMethods(unboxedEnumsMethods); - return lensBuilder.build(factory, appView.graphLense(), enumsToUnbox); + return lensBuilder.build(factory, appView.graphLens(), enumsToUnbox); } private void clearEnumToUnboxMethod(DexEncodedMethod enumMethod) { @@ -857,7 +857,7 @@ } } - private static class EnumUnboxingLens extends NestedGraphLense { + private static class EnumUnboxingLens extends NestedGraphLens { private final Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges; private final Set<DexType> unboxedEnums; @@ -868,7 +868,7 @@ Map<DexField, DexField> fieldMap, BiMap<DexField, DexField> originalFieldSignatures, BiMap<DexMethod, DexMethod> originalMethodSignatures, - GraphLense previousLense, + GraphLens previousLens, DexItemFactory dexItemFactory, Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges, Set<DexType> unboxedEnums) { @@ -878,7 +878,7 @@ fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory); this.prototypeChanges = prototypeChanges; this.unboxedEnums = unboxedEnums; @@ -889,7 +889,7 @@ // During the second IR processing enum unboxing is the only optimization rewriting // prototype description, if this does not hold, remove the assertion and merge // the two prototype changes. - assert previousLense.lookupPrototypeChanges(method).isEmpty(); + assert previousLens.lookupPrototypeChanges(method).isEmpty(); return prototypeChanges.getOrDefault(method, RewrittenPrototypeDescription.none()); } @@ -908,7 +908,7 @@ return new Builder(); } - private static class Builder extends NestedGraphLense.Builder { + private static class Builder extends NestedGraphLens.Builder { private Map<DexMethod, RewrittenPrototypeDescription> prototypeChanges = new IdentityHashMap<>(); @@ -941,7 +941,7 @@ } public EnumUnboxingLens build( - DexItemFactory dexItemFactory, GraphLense previousLense, Set<DexType> unboxedEnums) { + DexItemFactory dexItemFactory, GraphLens previousLens, Set<DexType> unboxedEnums) { if (typeMap.isEmpty() && methodMap.isEmpty() && fieldMap.isEmpty()) { return null; } @@ -951,7 +951,7 @@ fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, dexItemFactory, ImmutableMap.copyOf(prototypeChanges), ImmutableSet.copyOf(unboxedEnums));
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java index d88f9d2..5542908 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -913,7 +913,7 @@ Wrapper<DexMethod> throwParamIsNullException = wrapper.wrap(appView.dexItemFactory().kotlin.intrinsics.throwParameterIsNullException); DexMethod invokedMethod = - appView.graphLense().getOriginalMethodSignature(instr.asInvokeStatic().getInvokedMethod()); + appView.graphLens().getOriginalMethodSignature(instr.asInvokeStatic().getInvokedMethod()); Wrapper<DexMethod> methodWrap = wrapper.wrap(invokedMethod); if (methodWrap.equals(throwParamIsNullException) || (methodWrap.equals(checkParameterIsNotNull) && instr.inValues().get(0).equals(value))) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java index 3237c20..41ee658 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableFieldOptimizationInfo.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -69,7 +69,7 @@ this.abstractValue = abstractValue; } - public void fixupAbstractValue(AppView<AppInfoWithLiveness> appView, GraphLense lens) { + public void fixupAbstractValue(AppView<AppInfoWithLiveness> appView, GraphLens lens) { abstractValue = abstractValue.rewrittenWithLens(appView, lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java index 3971c57..610bad0 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/UpdatableMethodOptimizationInfo.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.analysis.value.AbstractValue; @@ -164,13 +164,13 @@ } public UpdatableMethodOptimizationInfo fixupAbstractReturnValue( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { abstractReturnValue = abstractReturnValue.rewrittenWithLens(appView, lens); return this; } public UpdatableMethodOptimizationInfo fixupInstanceInitializerInfo( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { if (instanceInitializerInfo != null) { instanceInitializerInfo = instanceInitializerInfo.rewrittenWithLens(appView, lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java index fd7a84f..4e45bac 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/EmptyInstanceFieldInitializationInfoCollection.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; import java.util.function.BiConsumer; @@ -46,7 +46,7 @@ @Override public InstanceFieldInitializationInfoCollection rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java index 757eec8..0b87005 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldArgumentInitializationInfo.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.optimize.info.field; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; /** @@ -37,7 +37,7 @@ @Override public InstanceFieldInitializationInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { // We don't have the context here to determine what should happen. It is the responsibility of // optimizations that change the proto of instance initializers to update the argument // initialization info.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java index 37757f1..aa3ab9b 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfo.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.optimize.info.field; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.value.SingleValue; import com.android.tools.r8.shaking.AppInfoWithLiveness; @@ -47,5 +47,5 @@ } InstanceFieldInitializationInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java index 3ff1799..d26de6d 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldInitializationInfoCollection.java
@@ -8,7 +8,7 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; import java.util.IdentityHashMap; import java.util.Map; @@ -36,7 +36,7 @@ public abstract boolean isEmpty(); public abstract InstanceFieldInitializationInfoCollection rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); public static class Builder {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java index 3bfce16..fe09706 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/InstanceFieldTypeInitializationInfo.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.EnumValueInfoMapCollection; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.type.ClassTypeElement; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.shaking.AppInfoWithLiveness; @@ -48,7 +48,7 @@ @Override public InstanceFieldInitializationInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { EnumValueInfoMapCollection unboxedEnums = appView.unboxedEnums(); if (dynamicLowerBoundType != null && unboxedEnums.containsEnum(dynamicLowerBoundType.getClassType())) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java index fe70918..e8daa83 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/NonTrivialInstanceFieldInitializationInfoCollection.java
@@ -10,7 +10,7 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexField; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; import java.util.Map; import java.util.function.BiConsumer; @@ -56,7 +56,7 @@ @Override public InstanceFieldInitializationInfoCollection rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { Builder builder = InstanceFieldInitializationInfoCollection.builder(); infos.forEach( (field, info) -> {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java index b2b6ce9..ab4bbfe 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/field/UnknownInstanceFieldInitializationInfo.java
@@ -5,7 +5,7 @@ package com.android.tools.r8.ir.optimize.info.field; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.shaking.AppInfoWithLiveness; /** @@ -30,7 +30,7 @@ @Override public InstanceFieldInitializationInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java index 4065fb0..e4424ec 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/DefaultInstanceInitializerInfo.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.UnknownFieldSet; import com.android.tools.r8.ir.optimize.info.field.EmptyInstanceFieldInitializationInfoCollection; @@ -56,7 +56,7 @@ @Override public InstanceInitializerInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { return this; } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java index 1745e7d..1e36f40 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/InstanceInitializerInfo.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet; import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection; import com.android.tools.r8.shaking.AppInfoWithLiveness; @@ -57,5 +57,5 @@ } public abstract InstanceInitializerInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens); + AppView<AppInfoWithLiveness> appView, GraphLens lens); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java index f549927..84ce93f 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/info/initializer/NonTrivialInstanceInitializerInfo.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.ConcreteMutableFieldSet; import com.android.tools.r8.ir.analysis.fieldvalueanalysis.EmptyFieldSet; @@ -84,7 +84,7 @@ @Override public NonTrivialInstanceInitializerInfo rewrittenWithLens( - AppView<AppInfoWithLiveness> appView, GraphLense lens) { + AppView<AppInfoWithLiveness> appView, GraphLens lens) { return new NonTrivialInstanceInitializerInfo( data, fieldInitializationInfos.rewrittenWithLens(appView, lens),
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java index 6e0805e..4cba255 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/lambda/LambdaMerger.java
@@ -372,11 +372,11 @@ // Eventually, we need to process synthesized methods in the lambda group. // Otherwise, abstract SynthesizedCode will be flown to Enqueuer. // But that process should not see the holder. Otherwise, lambda calls in the main dispatch - // method became recursive calls via the lense rewriter. They should remain, then inliner + // method became recursive calls via the lens rewriter. They should remain, then inliner // will inline methods from mergee lambdas to the main dispatch method. // Then, there is a dilemma: other sub optimizations trigger subtype lookup that will throw // NPE if it cannot find the holder for this synthesized lambda group. - // One hack here is to mark those methods `processed` so that the lense rewriter is skipped. + // One hack here is to mark those methods `processed` so that the lens rewriter is skipped. synthesizedClass.forEachMethod( encodedMethod -> encodedMethod.markProcessed(ConstraintWithTarget.NEVER)); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLense.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLens.java similarity index 86% rename from src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLense.java rename to src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLens.java index 318aae5..6eeeb46 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLense.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerGraphLens.java
@@ -7,14 +7,14 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.ir.code.Invoke.Type; import com.google.common.collect.BiMap; import com.google.common.collect.ImmutableMap; -class ClassStaticizerGraphLense extends NestedGraphLense { +class ClassStaticizerGraphLens extends NestedGraphLens { - ClassStaticizerGraphLense( + ClassStaticizerGraphLens( AppView<?> appView, BiMap<DexField, DexField> fieldMapping, BiMap<DexMethod, DexMethod> methodMapping) { @@ -24,7 +24,7 @@ fieldMapping, fieldMapping.inverse(), methodMapping.inverse(), - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory()); }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java index 8dbb64a..6ad81c8 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/staticizer/StaticizingProcessor.java
@@ -773,7 +773,7 @@ } if (!methodMapping.isEmpty() || !fieldMapping.isEmpty()) { - appView.setGraphLense(new ClassStaticizerGraphLense(appView, fieldMapping, methodMapping)); + appView.setGraphLens(new ClassStaticizerGraphLens(appView, fieldMapping, methodMapping)); } return staticizedMethods; }
diff --git a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java index 01c3daa..7e98858 100644 --- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java +++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -32,7 +32,7 @@ import com.android.tools.r8.graph.DexValue.DexValueEnum; import com.android.tools.r8.graph.DexValue.DexValueInt; import com.android.tools.r8.graph.DexValue.DexValueString; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InnerClassAttribute; import com.android.tools.r8.graph.NestMemberClassAttribute; import com.android.tools.r8.graph.ParameterAnnotationsList; @@ -70,7 +70,7 @@ private final DexApplication application; private final AppView<?> appView; - private final GraphLense graphLense; + private final GraphLens graphLens; private final NamingLens namingLens; private final InternalOptions options; private final Marker marker; @@ -82,12 +82,12 @@ AppView<?> appView, InternalOptions options, Marker marker, - GraphLense graphLense, + GraphLens graphLens, NamingLens namingLens, ProguardMapSupplier proguardMapSupplier) { this.application = application; this.appView = appView; - this.graphLense = graphLense; + this.graphLens = graphLens; this.namingLens = namingLens; this.options = options; assert marker != null; @@ -143,7 +143,7 @@ } } ApplicationWriter.supplyAdditionalConsumers( - application, appView, graphLense, namingLens, options); + application, appView, graphLens, namingLens, options); } private void writeClass(
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java index 2171a00..281950c 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassMetadataReader.java
@@ -188,8 +188,8 @@ return v.asDexValueString().getValue().toString(); } - private static class MetadataError extends RuntimeException { - MetadataError(String cause) { + public static class MetadataError extends RuntimeException { + private MetadataError(String cause) { super(cause); } }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java index d709ea4..5e11d43 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -9,8 +9,10 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexAnnotation; import com.android.tools.r8.graph.DexAnnotationElement; +import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedAnnotation; import com.android.tools.r8.graph.DexItemFactory; +import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexValue; import com.android.tools.r8.graph.DexValue.DexValueArray; import com.android.tools.r8.graph.DexValue.DexValueInt; @@ -25,6 +27,36 @@ public class KotlinMetadataRewriter { + private static final class WriteMetadataFieldInfo { + final boolean writeKind; + final boolean writeMetadataVersion; + final boolean writeByteCodeVersion; + final boolean writeData1; + final boolean writeData2; + final boolean writeExtraString; + final boolean writePackageName; + final boolean writeExtraInt; + + public WriteMetadataFieldInfo( + boolean writeKind, + boolean writeMetadataVersion, + boolean writeByteCodeVersion, + boolean writeData1, + boolean writeData2, + boolean writeExtraString, + boolean writePackageName, + boolean writeExtraInt) { + this.writeKind = writeKind; + this.writeMetadataVersion = writeMetadataVersion; + this.writeByteCodeVersion = writeByteCodeVersion; + this.writeData1 = writeData1; + this.writeData2 = writeData2; + this.writeExtraString = writeExtraString; + this.writePackageName = writePackageName; + this.writeExtraInt = writeExtraInt; + } + } + private final AppView<?> appView; private final NamingLens lens; private final DexItemFactory factory; @@ -42,6 +74,18 @@ } public void run(ExecutorService executorService) throws ExecutionException { + final DexClass kotlinMetadata = + appView.definitionFor(appView.dexItemFactory().kotlinMetadataType); + final WriteMetadataFieldInfo writeMetadataFieldInfo = + new WriteMetadataFieldInfo( + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.kind), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.metadataVersion), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.bytecodeVersion), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.data1), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.data2), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.extraString), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.packageName), + kotlinMetadataFieldExists(kotlinMetadata, appView, kotlin.metadata.extraInt)); ThreadUtils.processItems( appView.appInfo().classes(), clazz -> { @@ -66,7 +110,8 @@ try { KotlinClassHeader kotlinClassHeader = kotlinInfo.rewrite(clazz, appView, lens); DexAnnotation newMeta = - createKotlinMetadataAnnotation(kotlinClassHeader, kotlinInfo.getPackageName()); + createKotlinMetadataAnnotation( + kotlinClassHeader, kotlinInfo.getPackageName(), writeMetadataFieldInfo); clazz.setAnnotations( clazz.annotations().rewrite(anno -> anno == oldMeta ? newMeta : anno)); } catch (Throwable t) { @@ -79,33 +124,54 @@ executorService); } + private boolean kotlinMetadataFieldExists( + DexClass kotlinMetadata, AppView<?> appView, DexString fieldName) { + if (!appView.appInfo().hasLiveness()) { + return true; + } + if (kotlinMetadata == null || kotlinMetadata.isNotProgramClass()) { + return true; + } + return kotlinMetadata.methods(method -> method.method.name == fieldName).iterator().hasNext(); + } + private DexAnnotation createKotlinMetadataAnnotation( - KotlinClassHeader header, String packageName) { + KotlinClassHeader header, String packageName, WriteMetadataFieldInfo writeMetadataFieldInfo) { List<DexAnnotationElement> elements = new ArrayList<>(); - elements.add( - new DexAnnotationElement( - kotlin.metadata.metadataVersion, createIntArray(header.getMetadataVersion()))); - elements.add( - new DexAnnotationElement( - kotlin.metadata.bytecodeVersion, createIntArray(header.getBytecodeVersion()))); - elements.add( - new DexAnnotationElement(kotlin.metadata.kind, DexValueInt.create(header.getKind()))); - elements.add( - new DexAnnotationElement(kotlin.metadata.data1, createStringArray(header.getData1()))); - elements.add( - new DexAnnotationElement(kotlin.metadata.data2, createStringArray(header.getData2()))); - if (packageName != null && !packageName.isEmpty()) { + if (writeMetadataFieldInfo.writeMetadataVersion) { + elements.add( + new DexAnnotationElement( + kotlin.metadata.metadataVersion, createIntArray(header.getMetadataVersion()))); + } + if (writeMetadataFieldInfo.writeByteCodeVersion) { + elements.add( + new DexAnnotationElement( + kotlin.metadata.bytecodeVersion, createIntArray(header.getBytecodeVersion()))); + } + if (writeMetadataFieldInfo.writeKind) { + elements.add( + new DexAnnotationElement(kotlin.metadata.kind, DexValueInt.create(header.getKind()))); + } + if (writeMetadataFieldInfo.writeData1) { + elements.add( + new DexAnnotationElement(kotlin.metadata.data1, createStringArray(header.getData1()))); + } + if (writeMetadataFieldInfo.writeData2) { + elements.add( + new DexAnnotationElement(kotlin.metadata.data2, createStringArray(header.getData2()))); + } + if (writeMetadataFieldInfo.writePackageName && packageName != null && !packageName.isEmpty()) { elements.add( new DexAnnotationElement( kotlin.metadata.packageName, new DexValueString(factory.createString(packageName)))); } - if (!header.getExtraString().isEmpty()) { + if (writeMetadataFieldInfo.writeExtraString && !header.getExtraString().isEmpty()) { elements.add( new DexAnnotationElement( kotlin.metadata.extraString, new DexValueString(factory.createString(header.getExtraString())))); } - if (header.getExtraInt() != 0) { + if (writeMetadataFieldInfo.writeExtraInt && header.getExtraInt() != 0) { elements.add( new DexAnnotationElement( kotlin.metadata.extraInt, DexValueInt.create(header.getExtraInt())));
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java index 1a51644..ca1d394 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataWriter.java
@@ -131,7 +131,7 @@ private static String kotlinSyntheticClassToString( KotlinClassMetadata.SyntheticClass kMetadata, String indent) { - StringBuilder sb = new StringBuilder(); + StringBuilder sb = new StringBuilder(indent); KotlinMetadataWriter.appendKmSection( indent, "Metadata.SyntheticClass",
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java index 9b659a0..998fad3 100644 --- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java +++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -255,7 +255,7 @@ InnerClassAttribute attribute = clazz.getInnerClassAttributeForThisClass(); assert attribute != null; // Note that, to be consistent with the way inner-class attribute is written via minifier - // lense, we are using attribute's outer-class, not the live context. + // lens, we are using attribute's outer-class, not the live context. String separator = computeInnerClassSeparator(attribute.getOuter(), type, attribute.getInnerName()); if (separator == null) {
diff --git a/src/main/java/com/android/tools/r8/naming/NamingLens.java b/src/main/java/com/android/tools/r8/naming/NamingLens.java index a142cbf..7aab96a 100644 --- a/src/main/java/com/android/tools/r8/naming/NamingLens.java +++ b/src/main/java/com/android/tools/r8/naming/NamingLens.java
@@ -130,7 +130,7 @@ Class<T> clazz, Predicate<T> predicate, Function<T, String> namer); /** - * Checks whether the target will be translated properly by this lense. + * Checks whether the target will be translated properly by this lens. * * <p>Normally, this means that the target corresponds to an actual definition that has been * renamed. For identity renamings, we are more relaxed, as no targets will be translated anyway.
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java index 1f66108..92b4402 100644 --- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java +++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -200,7 +200,7 @@ } String originalDescriptor = getDescriptorFromClassBinaryName(name); DexType type = - appView.graphLense().lookupType(appView.dexItemFactory().createType(originalDescriptor)); + appView.graphLens().lookupType(appView.dexItemFactory().createType(originalDescriptor)); if (appView.appInfo().hasLiveness() && appView.withLiveness().appInfo().wasPruned(type)) { type = appView.dexItemFactory().objectType; } @@ -251,7 +251,7 @@ getClassBinaryNameFromDescriptor(enclosingDescriptor) + DescriptorUtils.INNER_CLASS_SEPARATOR + name)); - type = appView.graphLense().lookupType(type); + type = appView.graphLens().lookupType(type); String renamedDescriptor = namingLens.lookupDescriptor(type).toString(); if (!renamedDescriptor.equals(type.toDescriptorString())) { // TODO(b/147504070): If this is a merged class equal to the class context, do not add.
diff --git a/src/main/java/com/android/tools/r8/optimize/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/BridgeHoisting.java index 1cfe21f..6e0168f 100644 --- a/src/main/java/com/android/tools/r8/optimize/BridgeHoisting.java +++ b/src/main/java/com/android/tools/r8/optimize/BridgeHoisting.java
@@ -20,7 +20,7 @@ import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.ResolutionResult; import com.android.tools.r8.graph.SubtypingInfo; @@ -87,7 +87,7 @@ .visit(appView.appInfo().classes(), clazz -> processClass(clazz, subtypingInfo)); if (!lensBuilder.isEmpty()) { BridgeHoistingLens lens = lensBuilder.build(appView); - boolean changed = appView.setGraphLense(lens); + boolean changed = appView.setGraphLens(lens); assert changed; appView.setAppInfo( appView.appInfo().rewrittenWithLens(appView.appInfo().app().asDirect(), lens)); @@ -367,7 +367,7 @@ : code; } - static class BridgeHoistingLens extends NestedGraphLense { + static class BridgeHoistingLens extends NestedGraphLens { public BridgeHoistingLens( AppView<?> appView, BiMap<DexMethod, DexMethod> originalMethodSignatures) { @@ -377,7 +377,7 @@ ImmutableMap.of(), null, originalMethodSignatures, - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory()); }
diff --git a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java index db4613f..4edec01 100644 --- a/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java +++ b/src/main/java/com/android/tools/r8/optimize/ClassAndMemberPublicizer.java
@@ -14,12 +14,12 @@ import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InnerClassAttribute; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.SubtypingInfo; import com.android.tools.r8.ir.optimize.MethodPoolCollection; -import com.android.tools.r8.optimize.PublicizerLense.PublicizedLenseBuilder; +import com.android.tools.r8.optimize.PublicizerLens.PublicizedLensBuilder; import com.android.tools.r8.shaking.AppInfoWithLiveness; import com.android.tools.r8.utils.OptionalBool; import com.android.tools.r8.utils.Timing; @@ -35,7 +35,7 @@ private final SubtypingInfo subtypingInfo; private final MethodPoolCollection methodPoolCollection; - private final PublicizedLenseBuilder lenseBuilder = PublicizerLense.createBuilder(); + private final PublicizedLensBuilder lensBuilder = PublicizerLens.createBuilder(); private ClassAndMemberPublicizer( DexApplication application, @@ -56,7 +56,7 @@ * * <p>This will destructively update the DexApplication passed in as argument. */ - public static GraphLense run( + public static GraphLens run( ExecutorService executorService, Timing timing, DexApplication application, @@ -67,8 +67,7 @@ .run(executorService, timing); } - private GraphLense run(ExecutorService executorService, Timing timing) - throws ExecutionException { + private GraphLens run(ExecutorService executorService, Timing timing) throws ExecutionException { // Phase 1: Collect methods to check if private instance methods don't have conflicts. methodPoolCollection.buildAll(executorService, timing); @@ -80,7 +79,7 @@ publicizeType(appView.dexItemFactory().objectType); timing.end(); - return lenseBuilder.build(appView); + return lensBuilder.build(appView); } private void publicizeType(DexType type) { @@ -171,7 +170,7 @@ // TODO(b/111118390): Renaming will enable more private instance methods to be publicized. return false; } - lenseBuilder.add(method.method); + lensBuilder.add(method.method); accessFlags.promoteToFinal(); accessFlags.promoteToPublic(); // The method just became public and is therefore not a library override.
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 1c1de57..dcd003c 100644 --- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java +++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -15,7 +15,7 @@ import com.android.tools.r8.graph.FieldAccessInfo; import com.android.tools.r8.graph.FieldAccessInfoCollection; import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; @@ -29,17 +29,17 @@ public class MemberRebindingAnalysis { private final AppView<AppInfoWithLiveness> appView; - private final GraphLense lense; + private final GraphLens lens; private final InternalOptions options; - private final MemberRebindingLense.Builder builder; + private final MemberRebindingLens.Builder builder; public MemberRebindingAnalysis(AppView<AppInfoWithLiveness> appView) { - assert appView.graphLense().isContextFreeForMethods(); + assert appView.graphLens().isContextFreeForMethods(); this.appView = appView; - this.lense = appView.graphLense(); + this.lens = appView.graphLens(); this.options = appView.options(); - this.builder = MemberRebindingLense.builder(appView); + this.builder = MemberRebindingLens.builder(appView); } private DexMethod validTargetFor(DexMethod target, DexMethod original) { @@ -168,7 +168,7 @@ method, target, originalClass, targetClass, lookupTarget); } } - builder.map(method, lense.lookupMethod(validTargetFor(target.method, method)), invokeType); + builder.map(method, lens.lookupMethod(validTargetFor(target.method, method)), invokeType); } } } @@ -331,11 +331,11 @@ if (accessibleInAllContexts) { builder.map( field, - lense.lookupField(validTargetFor(resolvedField.field, field, DexClass::lookupField))); + lens.lookupField(validTargetFor(resolvedField.field, field, DexClass::lookupField))); } } - public GraphLense run() { + public GraphLens run() { AppInfoWithLiveness appInfo = appView.appInfo(); // Virtual invokes are on classes, so use class resolution. computeMethodRebinding(appInfo.virtualInvokes, this::classLookup, Type.VIRTUAL); @@ -348,7 +348,7 @@ // Likewise static invokes. computeMethodRebinding(appInfo.staticInvokes, this::anyLookup, Type.STATIC); computeFieldRebinding(); - GraphLense lens = builder.build(lense); + GraphLens lens = builder.build(this.lens); appInfo.getFieldAccessInfoCollection().flattenAccessContexts(); return lens; }
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLense.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java similarity index 80% rename from src/main/java/com/android/tools/r8/optimize/MemberRebindingLense.java rename to src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java index 01c923d..8883f5b 100644 --- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingLense.java +++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingLens.java
@@ -7,8 +7,8 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.ir.code.Invoke; import com.android.tools.r8.ir.code.Invoke.Type; import com.google.common.collect.ImmutableMap; @@ -16,7 +16,7 @@ import java.util.IdentityHashMap; import java.util.Map; -public class MemberRebindingLense extends NestedGraphLense { +public class MemberRebindingLens extends NestedGraphLens { public static class Builder { @@ -48,29 +48,29 @@ methodMap.put(from, to); } - public GraphLense build(GraphLense previousLense) { + public GraphLens build(GraphLens previousLens) { if (fieldMap.isEmpty() && methodMaps.isEmpty()) { - return previousLense; + return previousLens; } - return new MemberRebindingLense(appView, methodMaps, fieldMap, previousLense); + return new MemberRebindingLens(appView, methodMaps, fieldMap, previousLens); } } private final AppView<?> appView; private final Map<Invoke.Type, Map<DexMethod, DexMethod>> methodMaps; - public MemberRebindingLense( + public MemberRebindingLens( AppView<?> appView, Map<Invoke.Type, Map<DexMethod, DexMethod>> methodMaps, Map<DexField, DexField> fieldMap, - GraphLense previousLense) { + GraphLens previousLens) { super( ImmutableMap.of(), ImmutableMap.of(), fieldMap, null, null, - previousLense, + previousLens, appView.dexItemFactory()); this.appView = appView; this.methodMaps = methodMaps; @@ -86,12 +86,12 @@ } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { - GraphLenseLookupResult previous = previousLense.lookupMethod(method, context, type); + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + GraphLensLookupResult previous = previousLens.lookupMethod(method, context, type); Map<DexMethod, DexMethod> methodMap = methodMaps.getOrDefault(type, Collections.emptyMap()); DexMethod newMethod = methodMap.get(previous.getMethod()); if (newMethod != null) { - return new GraphLenseLookupResult( + return new GraphLensLookupResult( newMethod, mapInvocationType(newMethod, method, previous.getType())); } return previous;
diff --git a/src/main/java/com/android/tools/r8/optimize/PublicizerLense.java b/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java similarity index 67% rename from src/main/java/com/android/tools/r8/optimize/PublicizerLense.java rename to src/main/java/com/android/tools/r8/optimize/PublicizerLens.java index ab8999a..a2c44ce 100644 --- a/src/main/java/com/android/tools/r8/optimize/PublicizerLense.java +++ b/src/main/java/com/android/tools/r8/optimize/PublicizerLens.java
@@ -7,26 +7,26 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.ir.code.Invoke.Type; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Sets; import java.util.Set; -final class PublicizerLense extends NestedGraphLense { +final class PublicizerLens extends NestedGraphLens { private final AppView appView; private final Set<DexMethod> publicizedMethods; - private PublicizerLense(AppView appView, Set<DexMethod> publicizedMethods) { + private PublicizerLens(AppView appView, Set<DexMethod> publicizedMethods) { super( ImmutableMap.of(), ImmutableMap.of(), ImmutableMap.of(), null, null, - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory()); this.appView = appView; this.publicizedMethods = publicizedMethods; @@ -34,26 +34,25 @@ @Override protected boolean isLegitimateToHaveEmptyMappings() { - // This lense does not map any DexItem's at all. + // This lens does not map any DexItem's at all. // It will just tweak invoke type for publicized methods from invoke-direct to invoke-virtual. return true; } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { - GraphLenseLookupResult previous = previousLense.lookupMethod(method, context, type); + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + GraphLensLookupResult previous = previousLens.lookupMethod(method, context, type); method = previous.getMethod(); type = previous.getType(); if (type == Type.DIRECT && publicizedMethods.contains(method)) { assert publicizedMethodIsPresentOnHolder(method, context); - return new GraphLenseLookupResult(method, Type.VIRTUAL); + return new GraphLensLookupResult(method, Type.VIRTUAL); } return super.lookupMethod(method, context, type); } private boolean publicizedMethodIsPresentOnHolder(DexMethod method, DexMethod context) { - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context, Type.VIRTUAL); + GraphLensLookupResult lookup = appView.graphLens().lookupMethod(method, context, Type.VIRTUAL); DexMethod signatureInCurrentWorld = lookup.getMethod(); DexClass clazz = appView.definitionFor(signatureInCurrentWorld.holder); assert clazz != null; @@ -63,21 +62,20 @@ return true; } - static PublicizedLenseBuilder createBuilder() { - return new PublicizedLenseBuilder(); + static PublicizedLensBuilder createBuilder() { + return new PublicizedLensBuilder(); } - static class PublicizedLenseBuilder { + static class PublicizedLensBuilder { private final Set<DexMethod> publicizedMethods = Sets.newIdentityHashSet(); - private PublicizedLenseBuilder() { - } + private PublicizedLensBuilder() {} - public GraphLense build(AppView appView) { + public GraphLens build(AppView appView) { if (publicizedMethods.isEmpty()) { - return appView.graphLense(); + return appView.graphLens(); } - return new PublicizerLense(appView, publicizedMethods); + return new PublicizerLens(appView, publicizedMethods); } public void add(DexMethod publicizedMethod) {
diff --git a/src/main/java/com/android/tools/r8/relocator/Relocator.java b/src/main/java/com/android/tools/r8/relocator/Relocator.java index 176e058..a33424b 100644 --- a/src/main/java/com/android/tools/r8/relocator/Relocator.java +++ b/src/main/java/com/android/tools/r8/relocator/Relocator.java
@@ -15,7 +15,7 @@ import com.android.tools.r8.graph.AppServices; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.jar.CfApplicationWriter; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.signature.GenericSignatureRewriter; @@ -94,7 +94,7 @@ appView, options, new Marker(Tool.Relocator), - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), namingLens, null) .write(command.getConsumer());
diff --git a/src/main/java/com/android/tools/r8/retrace/Retrace.java b/src/main/java/com/android/tools/r8/retrace/Retrace.java index 0cb273e..0689227 100644 --- a/src/main/java/com/android/tools/r8/retrace/Retrace.java +++ b/src/main/java/com/android/tools/r8/retrace/Retrace.java
@@ -141,13 +141,13 @@ ClassNameMapper.mapperFromString( command.proguardMapProducer.get(), command.diagnosticsHandler); timing.end(); - RetraceBase retraceBase = RetraceBaseImpl.create(classNameMapper); + RetraceApi retracer = Retracer.create(classNameMapper); RetraceCommandLineResult result; timing.begin("Parse and Retrace"); if (command.regularExpression != null) { result = new RetraceRegularExpression( - retraceBase, + retracer, command.stackTrace, command.diagnosticsHandler, command.regularExpression) @@ -155,7 +155,7 @@ } else { result = new RetraceStackTrace( - retraceBase, command.stackTrace, command.diagnosticsHandler, command.isVerbose) + retracer, command.stackTrace, command.diagnosticsHandler, command.isVerbose) .retrace(); } timing.end();
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceBase.java b/src/main/java/com/android/tools/r8/retrace/RetraceApi.java similarity index 84% rename from src/main/java/com/android/tools/r8/retrace/RetraceBase.java rename to src/main/java/com/android/tools/r8/retrace/RetraceApi.java index ee7d7ab..7bb9232 100644 --- a/src/main/java/com/android/tools/r8/retrace/RetraceBase.java +++ b/src/main/java/com/android/tools/r8/retrace/RetraceApi.java
@@ -4,12 +4,15 @@ package com.android.tools.r8.retrace; +import com.android.tools.r8.Keep; import com.android.tools.r8.references.ClassReference; import com.android.tools.r8.references.FieldReference; import com.android.tools.r8.references.MethodReference; import com.android.tools.r8.references.TypeReference; -public interface RetraceBase { +/** This is the main api interface for retrace. */ +@Keep +public interface RetraceApi { RetraceMethodResult retrace(MethodReference methodReference); @@ -18,6 +21,4 @@ RetraceClassResult retrace(ClassReference classReference); RetraceTypeResult retrace(TypeReference typeReference); - - RetraceSourceFileResult retraceSourceFile(ClassReference classReference, String sourceFile); }
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceRegularExpression.java b/src/main/java/com/android/tools/r8/retrace/RetraceRegularExpression.java index e2e78b2..b35bb12 100644 --- a/src/main/java/com/android/tools/r8/retrace/RetraceRegularExpression.java +++ b/src/main/java/com/android/tools/r8/retrace/RetraceRegularExpression.java
@@ -27,7 +27,7 @@ public class RetraceRegularExpression { - private final RetraceBase retraceBase; + private final RetraceApi retracer; private final List<String> stackTrace; private final DiagnosticsHandler diagnosticsHandler; private final String regularExpression; @@ -52,11 +52,11 @@ private static final String CAPTURE_GROUP_PREFIX = "captureGroup"; RetraceRegularExpression( - RetraceBase retraceBase, + RetraceApi retracer, List<String> stackTrace, DiagnosticsHandler diagnosticsHandler, String regularExpression) { - this.retraceBase = retraceBase; + this.retracer = retracer; this.stackTrace = stackTrace; this.diagnosticsHandler = diagnosticsHandler; this.regularExpression = regularExpression; @@ -73,7 +73,7 @@ Lists.newArrayList(RetraceStringBuilder.create(string).build()); if (matcher.matches()) { for (RegularExpressionGroupHandler handler : handlers) { - retracedStrings = handler.handleMatch(retracedStrings, matcher, retraceBase); + retracedStrings = handler.handleMatch(retracedStrings, matcher, retracer); } } if (retracedStrings.isEmpty()) { @@ -422,7 +422,7 @@ private interface RegularExpressionGroupHandler { List<RetraceString> handleMatch( - List<RetraceString> strings, Matcher matcher, RetraceBase retraceBase); + List<RetraceString> strings, Matcher matcher, RetraceApi retracer); } private abstract static class RegularExpressionGroup { @@ -450,12 +450,12 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } String typeName = matcher.group(captureGroup); - RetraceClassResult retraceResult = retraceBase.retrace(classFromMatch(typeName)); + RetraceClassResult retraceResult = retracer.retrace(classFromMatch(typeName)); List<RetraceString> retracedStrings = new ArrayList<>(); for (RetraceString retraceString : strings) { retraceResult.forEach( @@ -537,7 +537,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -606,7 +606,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -660,7 +660,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -707,7 +707,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -808,7 +808,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -819,7 +819,7 @@ } TypeReference typeReference = Reference.returnTypeFromDescriptor(descriptor); List<RetraceString> retracedStrings = new ArrayList<>(); - RetraceTypeResult retracedType = retraceBase.retrace(typeReference); + RetraceTypeResult retracedType = retracer.retrace(typeReference); for (RetraceString retraceString : strings) { retracedType.forEach( element -> { @@ -854,7 +854,7 @@ @Override RegularExpressionGroupHandler createHandler(String captureGroup) { - return (strings, matcher, retraceBase) -> { + return (strings, matcher, retracer) -> { if (matcher.start(captureGroup) == NO_MATCH) { return strings; } @@ -872,7 +872,7 @@ } TypeReference typeReference = Reference.returnTypeFromDescriptor(descriptor); Set<List<TypeReference>> retracedTypes = new LinkedHashSet<>(); - retraceBase + retracer .retrace(typeReference) .forEach( element -> {
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java index 719dd44..88d048f 100644 --- a/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java +++ b/src/main/java/com/android/tools/r8/retrace/RetraceStackTrace.java
@@ -86,17 +86,17 @@ } } - private final RetraceBase retraceBase; + private final RetraceApi retracer; private final List<String> stackTrace; private final DiagnosticsHandler diagnosticsHandler; private final boolean verbose; RetraceStackTrace( - RetraceBase retraceBase, + RetraceApi retracer, List<String> stackTrace, DiagnosticsHandler diagnosticsHandler, boolean verbose) { - this.retraceBase = retraceBase; + this.retracer = retracer; this.stackTrace = stackTrace; this.diagnosticsHandler = diagnosticsHandler; this.verbose = verbose; @@ -117,7 +117,7 @@ return; } StackTraceLine stackTraceLine = parseLine(index + 1, stackTrace.get(index)); - List<StackTraceLine> retraced = stackTraceLine.retrace(retraceBase, verbose); + List<StackTraceLine> retraced = stackTraceLine.retrace(retracer, verbose); StackTraceNode node = new StackTraceNode(retraced); result.add(node); retraceLine(stackTrace, index + 1, result); @@ -125,7 +125,7 @@ abstract static class StackTraceLine { - abstract List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose); + abstract List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose); static int firstNonWhiteSpaceCharacterFromIndex(String line, int index) { return firstFromIndex(line, index, not(Character::isWhitespace)); @@ -225,9 +225,9 @@ } @Override - List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose) { + List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose) { List<StackTraceLine> exceptionLines = new ArrayList<>(); - retraceBase + retracer .retrace(Reference.classFromTypeName(exceptionClass)) .forEach( element -> @@ -397,31 +397,28 @@ } @Override - List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose) { + List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose) { List<StackTraceLine> lines = new ArrayList<>(); String retraceClassLoaderName = classLoaderName; if (retraceClassLoaderName != null) { ClassReference classLoaderReference = Reference.classFromTypeName(retraceClassLoaderName); - retraceBase + retracer .retrace(classLoaderReference) .forEach( classElement -> { retraceClassAndMethods( - retraceBase, verbose, lines, classElement.getClassReference().getTypeName()); + retracer, verbose, lines, classElement.getClassReference().getTypeName()); }); } else { - retraceClassAndMethods(retraceBase, verbose, lines, retraceClassLoaderName); + retraceClassAndMethods(retracer, verbose, lines, retraceClassLoaderName); } return lines; } private void retraceClassAndMethods( - RetraceBase retraceBase, - boolean verbose, - List<StackTraceLine> lines, - String classLoaderName) { + RetraceApi retracer, boolean verbose, List<StackTraceLine> lines, String classLoaderName) { ClassReference classReference = Reference.classFromTypeName(clazz); - RetraceClassResult classResult = retraceBase.retrace(classReference); + RetraceClassResult classResult = retracer.retrace(classReference); RetraceMethodResult retraceResult = classResult.lookupMethod(method); if (linePosition != NO_POSITION && linePosition != INVALID_POSITION) { retraceResult = retraceResult.narrowByLine(linePosition); @@ -509,7 +506,7 @@ } @Override - List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose) { + List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose) { return ImmutableList.of(new MoreLine(line)); } @@ -562,9 +559,9 @@ } @Override - List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose) { + List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose) { List<StackTraceLine> exceptionLines = new ArrayList<>(); - retraceBase + retracer .retrace(Reference.classFromTypeName(exceptionClass)) .forEach( element -> @@ -590,7 +587,7 @@ } @Override - List<StackTraceLine> retrace(RetraceBase retraceBase, boolean verbose) { + List<StackTraceLine> retrace(RetraceApi retracer, boolean verbose) { return ImmutableList.of(new UnknownLine(line)); }
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java b/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java index 2ab72a7..8ea169f 100644 --- a/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java +++ b/src/main/java/com/android/tools/r8/retrace/RetraceTypeResult.java
@@ -13,11 +13,11 @@ public class RetraceTypeResult extends Result<Element, RetraceTypeResult> { private final TypeReference obfuscatedType; - private final RetraceBase retraceBase; + private final RetraceApi retracer; - RetraceTypeResult(TypeReference obfuscatedType, RetraceBase retraceBase) { + RetraceTypeResult(TypeReference obfuscatedType, RetraceApi retracer) { this.obfuscatedType = obfuscatedType; - this.retraceBase = retraceBase; + this.retracer = retracer; } @Override @@ -28,10 +28,10 @@ } if (obfuscatedType.isArray()) { int dimensions = obfuscatedType.asArray().getDimensions(); - return retraceBase.retrace(obfuscatedType.asArray().getBaseType()).stream() + return retracer.retrace(obfuscatedType.asArray().getBaseType()).stream() .map(base -> new Element(Reference.array(base.getTypeReference(), dimensions))); } - return retraceBase.retrace(obfuscatedType.asClass()).stream() + return retracer.retrace(obfuscatedType.asClass()).stream() .map(clazz -> new Element(clazz.getClassReference())); }
diff --git a/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java b/src/main/java/com/android/tools/r8/retrace/Retracer.java similarity index 68% rename from src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java rename to src/main/java/com/android/tools/r8/retrace/Retracer.java index 1561457..b2dad89 100644 --- a/src/main/java/com/android/tools/r8/retrace/RetraceBaseImpl.java +++ b/src/main/java/com/android/tools/r8/retrace/Retracer.java
@@ -4,23 +4,25 @@ package com.android.tools.r8.retrace; +import com.android.tools.r8.Keep; import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.references.ClassReference; import com.android.tools.r8.references.FieldReference; import com.android.tools.r8.references.MethodReference; import com.android.tools.r8.references.TypeReference; -import com.android.tools.r8.utils.Box; -public class RetraceBaseImpl implements RetraceBase { +/** A default implementation for the retrace api using the ClassNameMapper defined in R8. */ +@Keep +public class Retracer implements RetraceApi { private final ClassNameMapper classNameMapper; - private RetraceBaseImpl(ClassNameMapper classNameMapper) { + private Retracer(ClassNameMapper classNameMapper) { this.classNameMapper = classNameMapper; } - public static RetraceBase create(ClassNameMapper classNameMapper) { - return new RetraceBaseImpl(classNameMapper); + public static RetraceApi create(ClassNameMapper classNameMapper) { + return new Retracer(classNameMapper); } @Override @@ -40,15 +42,6 @@ } @Override - public RetraceSourceFileResult retraceSourceFile( - ClassReference classReference, String sourceFile) { - Box<RetraceSourceFileResult> retracedSourceFile = new Box<>(); - retrace(classReference) - .forEach(element -> retracedSourceFile.set(element.retraceSourceFile(sourceFile))); - return retracedSourceFile.get(); - } - - @Override public RetraceTypeResult retrace(TypeReference typeReference) { return new RetraceTypeResult(typeReference, this); }
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java index 0fe561c..a67af38 100644 --- a/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java +++ b/src/main/java/com/android/tools/r8/shaking/AnnotationFixer.java
@@ -14,15 +14,15 @@ import com.android.tools.r8.graph.DexValue; import com.android.tools.r8.graph.DexValue.DexValueArray; import com.android.tools.r8.graph.DexValue.DexValueType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.utils.ArrayUtils; public class AnnotationFixer { - private final GraphLense lense; + private final GraphLens lens; - public AnnotationFixer(GraphLense lense) { - this.lense = lense; + public AnnotationFixer(GraphLens lens) { + this.lens = lens; } public void run(Iterable<DexProgramClass> classes) { @@ -50,7 +50,7 @@ private DexEncodedAnnotation rewriteEncodedAnnotation(DexEncodedAnnotation original) { DexEncodedAnnotation rewritten = - original.rewrite(lense::lookupType, this::rewriteAnnotationElement); + original.rewrite(lens::lookupType, this::rewriteAnnotationElement); assert rewritten != null; return rewritten; } @@ -66,7 +66,7 @@ private DexValue rewriteValue(DexValue value) { if (value.isDexValueType()) { DexType originalType = value.asDexValueType().value; - DexType rewrittenType = lense.lookupType(originalType); + DexType rewrittenType = lens.lookupType(originalType); if (rewrittenType != originalType) { return new DexValueType(rewrittenType); }
diff --git a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java index 3c0d9dd..1a8d708 100644 --- a/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java +++ b/src/main/java/com/android/tools/r8/shaking/AnnotationRemover.java
@@ -16,7 +16,7 @@ import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InnerClassAttribute; import com.google.common.collect.ImmutableList; import com.google.common.collect.Sets; @@ -225,15 +225,15 @@ } private DexEncodedAnnotation rewriteEncodedAnnotation(DexEncodedAnnotation original) { - GraphLense graphLense = appView.graphLense(); + GraphLens graphLens = appView.graphLens(); DexType annotationType = original.type.toBaseType(appView.dexItemFactory()); if (removedClasses.contains(annotationType)) { return null; } - DexType rewrittenType = graphLense.lookupType(annotationType); + DexType rewrittenType = graphLens.lookupType(annotationType); DexEncodedAnnotation rewrite = original.rewrite( - graphLense::lookupType, element -> rewriteAnnotationElement(rewrittenType, element)); + graphLens::lookupType, element -> rewriteAnnotationElement(rewrittenType, element)); assert rewrite != null; DexClass annotationClass = appView.appInfo().definitionFor(rewrittenType); assert annotationClass == null
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java index d3afad2..5f68d46 100644 --- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java +++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -28,8 +28,8 @@ import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl; import com.android.tools.r8.graph.FieldAccessInfoImpl; import com.android.tools.r8.graph.FieldResolutionResult; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.InstantiatedSubTypeInfo; import com.android.tools.r8.graph.LookupResult.LookupResultSuccess; import com.android.tools.r8.graph.LookupTarget; @@ -889,7 +889,7 @@ } private static SortedMap<DexMethod, ProgramMethodSet> rewriteInvokesWithContexts( - Map<DexMethod, ProgramMethodSet> invokes, GraphLense lens) { + Map<DexMethod, ProgramMethodSet> invokes, GraphLens lens) { SortedMap<DexMethod, ProgramMethodSet> result = new TreeMap<>(PresortedComparable::slowCompare); invokes.forEach( (method, contexts) -> @@ -966,17 +966,17 @@ } public AppInfoWithLiveness rewrittenWithLens( - DirectMappedDexApplication application, NestedGraphLense lens) { + DirectMappedDexApplication application, NestedGraphLens lens) { assert checkIfObsolete(); // The application has already been rewritten with all of lens' parent lenses. Therefore, we // temporarily replace lens' parent lens with an identity lens to avoid the overhead of // traversing the entire lens chain upon each lookup during the rewriting. return lens.withAlternativeParentLens( - GraphLense.getIdentityLense(), () -> createRewrittenAppInfoWithLiveness(application, lens)); + GraphLens.getIdentityLens(), () -> createRewrittenAppInfoWithLiveness(application, lens)); } private AppInfoWithLiveness createRewrittenAppInfoWithLiveness( - DirectMappedDexApplication application, NestedGraphLense lens) { + DirectMappedDexApplication application, NestedGraphLens lens) { // Switchmap classes should never be affected by renaming. assert lens.assertDefinitionsNotModified( switchMaps.keySet().stream()
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java index 5c0f735..281561b 100644 --- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java +++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -57,7 +57,7 @@ import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl; import com.android.tools.r8.graph.FieldAccessInfoImpl; import com.android.tools.r8.graph.FieldResolutionResult; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InnerClassAttribute; import com.android.tools.r8.graph.LookupLambdaTarget; import com.android.tools.r8.graph.LookupTarget; @@ -2007,6 +2007,12 @@ clazz, context, instantiationReason, keepReason, appInfo); } + void markAnnotationAsInstantiated(DexProgramClass clazz, KeepReasonWitness witness) { + assert clazz.isAnnotation(); + markTypeAsLive(clazz, witness); + transitionDependentItemsForInstantiatedInterface(clazz); + } + void markInterfaceAsInstantiated(DexProgramClass clazz, KeepReasonWitness witness) { assert !clazz.isAnnotation(); assert clazz.isInterface(); @@ -2373,6 +2379,10 @@ return liveFields.contains(field); } + public boolean isFieldLive(DexEncodedField field) { + return liveFields.contains(field); + } + public boolean isFieldRead(ProgramField field) { FieldAccessInfoImpl info = fieldAccessInfoCollection.get(field.getReference()); return info != null && info.isRead(); @@ -2723,10 +2733,8 @@ return appInfoWithLiveness; } - public GraphLense buildGraphLense(AppView<?> appView) { - return lambdaRewriter != null - ? lambdaRewriter.buildMappingLense(appView) - : appView.graphLense(); + public GraphLens buildGraphLens(AppView<?> appView) { + return lambdaRewriter != null ? lambdaRewriter.buildMappingLens(appView) : appView.graphLens(); } private void keepClassWithRules(DexProgramClass clazz, Set<ProguardKeepRuleBase> rules) {
diff --git a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java index 3c9649d..2bc8459 100644 --- a/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java +++ b/src/main/java/com/android/tools/r8/shaking/EnqueuerWorklist.java
@@ -101,7 +101,7 @@ @Override public void run(Enqueuer enqueuer) { - enqueuer.markTypeAsLive(target, reason); + enqueuer.markAnnotationAsInstantiated(target, reason); } }
diff --git a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java index d8fbb6d..8841f15 100644 --- a/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java +++ b/src/main/java/com/android/tools/r8/shaking/IfRuleEvaluator.java
@@ -228,8 +228,12 @@ filteredMembers, targetClass.fields( f -> - (enqueuer.isFieldReferenced(f) || f.getOptimizationInfo().valueHasBeenPropagated()) - && appView.graphLense().getOriginalFieldSignature(f.field).holder + // Fields referenced only by -keep may not be referenced, we therefore have to + // filter on both live and referenced. + (enqueuer.isFieldLive(f) + || enqueuer.isFieldReferenced(f) + || f.getOptimizationInfo().valueHasBeenPropagated()) + && appView.graphLens().getOriginalFieldSignature(f.field).holder == sourceClass.type)); Iterables.addAll( filteredMembers, @@ -238,7 +242,7 @@ (enqueuer.isMethodLive(m) || enqueuer.isMethodTargeted(m) || m.getOptimizationInfo().returnValueHasBeenPropagated()) - && appView.graphLense().getOriginalMethodSignature(m.method).holder + && appView.graphLens().getOriginalMethodSignature(m.method).holder == sourceClass.type)); // If the number of member rules to hold is more than live members, we can't make it.
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java index 53af669..ee30fce 100644 --- a/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java +++ b/src/main/java/com/android/tools/r8/shaking/KeepInfoCollection.java
@@ -16,7 +16,7 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.graph.ProgramField; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.shaking.KeepFieldInfo.Joiner; @@ -160,7 +160,7 @@ @Deprecated public abstract void forEachPinnedField(Consumer<DexField> consumer); - public abstract KeepInfoCollection rewrite(NestedGraphLense lens); + public abstract KeepInfoCollection rewrite(NestedGraphLens lens); public abstract KeepInfoCollection mutate(Consumer<MutableKeepInfoCollection> mutator); @@ -196,7 +196,7 @@ } @Override - public KeepInfoCollection rewrite(NestedGraphLense lens) { + public KeepInfoCollection rewrite(NestedGraphLens lens) { Map<DexType, KeepClassInfo> newClassInfo = new IdentityHashMap<>(keepClassInfo.size()); keepClassInfo.forEach( (type, info) -> {
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java index 3034f6d..5163a69 100644 --- a/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java +++ b/src/main/java/com/android/tools/r8/shaking/ProguardMemberRule.java
@@ -184,7 +184,7 @@ AppView<?> appView, Consumer<AnnotationMatchResult> matchedAnnotationsConsumer, DexStringCache stringCache) { - DexField originalSignature = appView.graphLense().getOriginalFieldSignature(field.field); + DexField originalSignature = appView.graphLens().getOriginalFieldSignature(field.field); switch (getRuleType()) { case ALL: case ALL_FIELDS: @@ -235,7 +235,7 @@ AppView<?> appView, Consumer<AnnotationMatchResult> matchedAnnotationsConsumer, DexStringCache stringCache) { - DexMethod originalSignature = appView.graphLense().getOriginalMethodSignature(method.method); + DexMethod originalSignature = appView.graphLens().getOriginalMethodSignature(method.method); switch (getRuleType()) { case ALL_METHODS: if (method.isClassInitializer()) {
diff --git a/src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java b/src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java index a96194f..ed87cff 100644 --- a/src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java +++ b/src/main/java/com/android/tools/r8/shaking/StaticClassMerger.java
@@ -12,7 +12,7 @@ import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexString; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.logging.Log; import com.android.tools.r8.shaking.VerticalClassMerger.IllegalAccessDetector; import com.android.tools.r8.utils.FieldSignatureEquivalence; @@ -226,7 +226,7 @@ this.mainDexClasses = mainDexClasses; } - public NestedGraphLense run() { + public NestedGraphLens run() { for (DexProgramClass clazz : appView.appInfo().app().classesWithDeterministicOrder()) { MergeGroup group = satisfiesMergeCriteria(clazz); if (group != MergeGroup.DONT_MERGE) { @@ -240,20 +240,20 @@ numberOfMergedClasses, fieldMapping.size() + methodMapping.size()); } - return buildGraphLense(); + return buildGraphLens(); } - private NestedGraphLense buildGraphLense() { + private NestedGraphLens buildGraphLens() { if (!fieldMapping.isEmpty() || !methodMapping.isEmpty()) { BiMap<DexField, DexField> originalFieldSignatures = fieldMapping.inverse(); BiMap<DexMethod, DexMethod> originalMethodSignatures = methodMapping.inverse(); - return new NestedGraphLense( + return new NestedGraphLens( ImmutableMap.of(), methodMapping, fieldMapping, originalFieldSignatures, originalMethodSignatures, - appView.graphLense(), + appView.graphLens(), appView.dexItemFactory()); } return null; @@ -293,7 +293,7 @@ method -> method.accessFlags.isNative() || appView.appInfo().isPinned(method.method) - // TODO(christofferqa): Remove the invariant that the graph lense should not + // TODO(christofferqa): Remove the invariant that the graph lens should not // modify any methods from the sets alwaysInline and noSideEffects. || appView.appInfo().alwaysInline.contains(method.method) || appView.appInfo().noSideEffects.keySet().contains(method.method))) { @@ -343,7 +343,7 @@ return false; } if (appView.appInfo().constClassReferences.contains(clazz.type)) { - // Since the type is const-class referenced (and the static merger does not create a lense + // Since the type is const-class referenced (and the static merger does not create a lens // to map the merged type) the class will likely remain and there is no gain from merging. return false; }
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java index 79d472d..c2b3627 100644 --- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java +++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -27,8 +27,8 @@ import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.GraphLenseLookupResult; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.GraphLensLookupResult; import com.android.tools.r8.graph.LookupResult.LookupResultSuccess; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ObjectAllocationInfoCollection; @@ -89,7 +89,7 @@ * <p>A common use-case for this is to merge an interface into its single implementation. * * <p>The class merger only fixes the structure of the graph but leaves the actual instructions - * untouched. Fixup of instructions is deferred via a {@link GraphLense} to the IR building phase. + * untouched. Fixup of instructions is deferred via a {@link GraphLens} to the IR building phase. */ public class VerticalClassMerger { @@ -210,8 +210,8 @@ // Set of types that must not be merged into their subtype. private final Set<DexType> pinnedTypes = Sets.newIdentityHashSet(); - // The resulting graph lense that should be used after class merging. - private final VerticalClassMergerGraphLense.Builder renamedMembersLense; + // The resulting graph lens that should be used after class merging. + private final VerticalClassMergerGraphLens.Builder renamedMembersLens; // All the bridge methods that have been synthesized during vertical class merging. private final List<SynthesizedBridgeCode> synthesizedBridges = new ArrayList<>(); @@ -230,7 +230,7 @@ this.subtypingInfo = appInfo.computeSubtypingInfo(); this.executorService = executorService; this.methodPoolCollection = new MethodPoolCollection(appView, subtypingInfo); - this.renamedMembersLense = new VerticalClassMergerGraphLense.Builder(appView.dexItemFactory()); + this.renamedMembersLens = new VerticalClassMergerGraphLens.Builder(appView.dexItemFactory()); this.timing = timing; this.mainDexClasses = mainDexClasses; @@ -629,7 +629,7 @@ } } - public VerticalClassMergerGraphLense run() { + public VerticalClassMergerGraphLens run() { timing.begin("merge"); // Visit the program classes in a top-down order according to the class hierarchy. TopDownClassHierarchyTraversal.forProgramClasses(appView) @@ -639,13 +639,13 @@ } timing.end(); timing.begin("fixup"); - VerticalClassMergerGraphLense lens = new TreeFixer().fixupTypeReferences(); + VerticalClassMergerGraphLens lens = new TreeFixer().fixupTypeReferences(); timing.end(); assert lens == null || verifyGraphLens(lens); return lens; } - private boolean verifyGraphLens(VerticalClassMergerGraphLense graphLense) { + private boolean verifyGraphLens(VerticalClassMergerGraphLens graphLens) { // Note that the method assertReferencesNotModified() relies on getRenamedFieldSignature() and // getRenamedMethodSignature() instead of lookupField() and lookupMethod(). This is important // for this check to succeed, since it is not guaranteed that calling lookupMethod() with a @@ -672,13 +672,13 @@ // that `invoke-super A.method` instructions, which are in one of the methods from C, needs to // be rewritten to `invoke-direct C.method$B`. This is valid even though A.method() is actually // pinned, because this rewriting does not affect A.method() in any way. - assert graphLense.assertPinnedNotModified(appInfo.getKeepInfo()); + assert graphLens.assertPinnedNotModified(appInfo.getKeepInfo()); for (DexProgramClass clazz : appInfo.classes()) { for (DexEncodedMethod encodedMethod : clazz.methods()) { DexMethod method = encodedMethod.method; - DexMethod originalMethod = graphLense.getOriginalMethodSignature(method); - DexMethod renamedMethod = graphLense.getRenamedMethodSignature(originalMethod); + DexMethod originalMethod = graphLens.getOriginalMethodSignature(method); + DexMethod renamedMethod = graphLens.getRenamedMethodSignature(originalMethod); // Must be able to map back and forth. if (encodedMethod.hasCode() && encodedMethod.getCode() instanceof SynthesizedBridgeCode) { @@ -690,7 +690,7 @@ DexMethod implementationMethod = ((SynthesizedBridgeCode) encodedMethod.getCode()).invocationTarget; DexMethod originalImplementationMethod = - graphLense.getOriginalMethodSignature(implementationMethod); + graphLens.getOriginalMethodSignature(implementationMethod); assert originalMethod == originalImplementationMethod; assert implementationMethod == renamedMethod; } else { @@ -832,8 +832,8 @@ throw new RuntimeException(e); } if (merged) { - // Commit the changes to the graph lense. - renamedMembersLense.merge(merger.getRenamings()); + // Commit the changes to the graph lens. + renamedMembersLens.merge(merger.getRenamings()); synthesizedBridges.addAll(merger.getSynthesizedBridges()); } if (Log.ENABLED) { @@ -888,8 +888,8 @@ private final DexProgramClass source; private final DexProgramClass target; - private final VerticalClassMergerGraphLense.Builder deferredRenamings = - new VerticalClassMergerGraphLense.Builder(appView.dexItemFactory()); + private final VerticalClassMergerGraphLens.Builder deferredRenamings = + new VerticalClassMergerGraphLens.Builder(appView.dexItemFactory()); private final List<SynthesizedBridgeCode> synthesizedBridges = new ArrayList<>(); private boolean abortMerge = false; @@ -1120,7 +1120,7 @@ return true; } - public VerticalClassMergerGraphLense.Builder getRenamings() { + public VerticalClassMergerGraphLens.Builder getRenamings() { return deferredRenamings; } @@ -1138,7 +1138,7 @@ // if I has a supertype J. This is due to the fact that invoke-super instructions that // resolve to a method on an interface never hit an implementation below that interface. deferredRenamings.mapVirtualMethodToDirectInType( - oldTarget, new GraphLenseLookupResult(newTarget, STATIC), target.type); + oldTarget, new GraphLensLookupResult(newTarget, STATIC), target.type); } else { // If we merge class B into class C, and class C contains an invocation super.m(), then it // is insufficient to rewrite "invoke-super B.m()" to "invoke-direct C.m$B()" (the method @@ -1157,7 +1157,7 @@ || appInfo.lookupSuperTarget(signatureInHolder, holder) != null; if (resolutionSucceeds) { deferredRenamings.mapVirtualMethodToDirectInType( - signatureInHolder, new GraphLenseLookupResult(newTarget, DIRECT), target.type); + signatureInHolder, new GraphLensLookupResult(newTarget, DIRECT), target.type); } else { break; } @@ -1175,11 +1175,11 @@ // Resolution would have succeeded if the method used to be in [type], or if one of // its super classes declared the method. boolean resolutionSucceededBeforeMerge = - renamedMembersLense.hasMappingForSignatureInContext(holder, signatureInType) + renamedMembersLens.hasMappingForSignatureInContext(holder, signatureInType) || appInfo.lookupSuperTarget(signatureInHolder, holder) != null; if (resolutionSucceededBeforeMerge) { deferredRenamings.mapVirtualMethodToDirectInType( - signatureInType, new GraphLenseLookupResult(newTarget, DIRECT), target.type); + signatureInType, new GraphLensLookupResult(newTarget, DIRECT), target.type); } } } @@ -1226,7 +1226,7 @@ SynthesizedBridgeCode code = new SynthesizedBridgeCode( newMethod, - appView.graphLense().getOriginalMethodSignature(method.method), + appView.graphLens().getOriginalMethodSignature(method.method), invocationTarget.method, invocationTarget.isPrivateMethod() ? DIRECT : STATIC, target.isInterface()); @@ -1444,12 +1444,12 @@ private class TreeFixer { - private final VerticalClassMergerGraphLense.Builder lensBuilder = - VerticalClassMergerGraphLense.Builder.createBuilderForFixup( - renamedMembersLense, mergedClasses); + private final VerticalClassMergerGraphLens.Builder lensBuilder = + VerticalClassMergerGraphLens.Builder.createBuilderForFixup( + renamedMembersLens, mergedClasses); private final Map<DexProto, DexProto> protoFixupCache = new IdentityHashMap<>(); - private VerticalClassMergerGraphLense fixupTypeReferences() { + private VerticalClassMergerGraphLens fixupTypeReferences() { // Globally substitute merged class types in protos and holders. for (DexProgramClass clazz : appInfo.classes()) { clazz.getMethodCollection().replaceMethods(this::fixupMethod); @@ -1459,7 +1459,7 @@ for (SynthesizedBridgeCode synthesizedBridge : synthesizedBridges) { synthesizedBridge.updateMethodSignatures(this::fixupMethod); } - VerticalClassMergerGraphLense lens = lensBuilder.build(appView, mergedClasses); + VerticalClassMergerGraphLens lens = lensBuilder.build(appView, mergedClasses); if (lens != null) { new AnnotationFixer(lens).run(appView.appInfo().classes()); } @@ -1667,7 +1667,7 @@ cfCode.computeInliningConstraint( method, appView, - new SingleTypeMapperGraphLense(method.getHolderType(), context), + new SingleTypeMapperGraphLens(method.getHolderType(), context), context); if (constraint == ConstraintWithTarget.NEVER) { return AbortReason.UNSAFE_INLINING; @@ -1686,12 +1686,12 @@ return AbortReason.UNSAFE_INLINING; } - private class SingleTypeMapperGraphLense extends GraphLense { + private class SingleTypeMapperGraphLens extends GraphLens { private final DexType source; private final DexProgramClass target; - public SingleTypeMapperGraphLense(DexType source, DexProgramClass target) { + public SingleTypeMapperGraphLens(DexType source, DexProgramClass target) { this.source = source; this.target = target; } @@ -1717,7 +1717,7 @@ } @Override - public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLense applied) { + public DexMethod getRenamedMethodSignature(DexMethod originalMethod, GraphLens applied) { throw new Unreachable(); } @@ -1727,14 +1727,14 @@ } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { - // First look up the method using the existing graph lense (for example, the type will have + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + // First look up the method using the existing graph lens (for example, the type will have // changed if the method was publicized by ClassAndMemberPublicizer). - GraphLenseLookupResult lookup = appView.graphLense().lookupMethod(method, context, type); + GraphLensLookupResult lookup = appView.graphLens().lookupMethod(method, context, type); DexMethod previousMethod = lookup.getMethod(); Type previousType = lookup.getType(); // Then check if there is a renaming due to the vertical class merger. - DexMethod newMethod = renamedMembersLense.methodMap.get(previousMethod); + DexMethod newMethod = renamedMembersLens.methodMap.get(previousMethod); if (newMethod != null) { if (previousType == Type.INTERFACE) { // If an interface has been merged into a class, invoke-interface needs to be translated @@ -1742,12 +1742,12 @@ DexClass clazz = appInfo.definitionFor(newMethod.holder); if (clazz != null && !clazz.accessFlags.isInterface()) { assert appInfo.definitionFor(method.holder).accessFlags.isInterface(); - return new GraphLenseLookupResult(newMethod, Type.VIRTUAL); + return new GraphLensLookupResult(newMethod, Type.VIRTUAL); } } - return new GraphLenseLookupResult(newMethod, previousType); + return new GraphLensLookupResult(newMethod, previousType); } - return new GraphLenseLookupResult(previousMethod, previousType); + return new GraphLensLookupResult(previousMethod, previousType); } @Override @@ -1757,7 +1757,7 @@ @Override public DexField lookupField(DexField field) { - return renamedMembersLense.fieldMap.getOrDefault(field, field); + return renamedMembersLens.fieldMap.getOrDefault(field, field); } @Override @@ -1793,7 +1793,7 @@ private boolean checkFieldReference(DexField field) { if (!foundIllegalAccess) { DexType baseType = - appView.graphLense().lookupType(field.holder.toBaseType(appView.dexItemFactory())); + appView.graphLens().lookupType(field.holder.toBaseType(appView.dexItemFactory())); if (baseType.isClassType() && baseType.isSamePackage(source.type)) { checkTypeReference(field.holder); checkTypeReference(field.type); @@ -1810,7 +1810,7 @@ private boolean checkMethodReference(DexMethod method, OptionalBool isInterface) { if (!foundIllegalAccess) { DexType baseType = - appView.graphLense().lookupType(method.holder.toBaseType(appView.dexItemFactory())); + appView.graphLens().lookupType(method.holder.toBaseType(appView.dexItemFactory())); if (baseType.isClassType() && baseType.isSamePackage(source.type)) { checkTypeReference(method.holder); checkTypeReference(method.proto.returnType); @@ -1833,7 +1833,7 @@ private boolean checkTypeReference(DexType type) { if (!foundIllegalAccess) { DexType baseType = - appView.graphLense().lookupType(type.toBaseType(appView.dexItemFactory())); + appView.graphLens().lookupType(type.toBaseType(appView.dexItemFactory())); if (baseType.isClassType() && baseType.isSamePackage(source.type)) { DexClass clazz = appView.definitionFor(baseType); if (clazz == null || !clazz.accessFlags.isPublic()) { @@ -1852,51 +1852,51 @@ @Override public boolean registerInvokeVirtual(DexMethod method) { assert context != null; - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context.getReference(), Type.VIRTUAL); + GraphLensLookupResult lookup = + appView.graphLens().lookupMethod(method, context.getReference(), Type.VIRTUAL); return checkMethodReference(lookup.getMethod(), OptionalBool.FALSE); } @Override public boolean registerInvokeDirect(DexMethod method) { assert context != null; - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context.getReference(), Type.DIRECT); + GraphLensLookupResult lookup = + appView.graphLens().lookupMethod(method, context.getReference(), Type.DIRECT); return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN); } @Override public boolean registerInvokeStatic(DexMethod method) { assert context != null; - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context.getReference(), Type.STATIC); + GraphLensLookupResult lookup = + appView.graphLens().lookupMethod(method, context.getReference(), Type.STATIC); return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN); } @Override public boolean registerInvokeInterface(DexMethod method) { assert context != null; - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context.getReference(), Type.INTERFACE); + GraphLensLookupResult lookup = + appView.graphLens().lookupMethod(method, context.getReference(), Type.INTERFACE); return checkMethodReference(lookup.getMethod(), OptionalBool.TRUE); } @Override public boolean registerInvokeSuper(DexMethod method) { assert context != null; - GraphLenseLookupResult lookup = - appView.graphLense().lookupMethod(method, context.getReference(), Type.SUPER); + GraphLensLookupResult lookup = + appView.graphLens().lookupMethod(method, context.getReference(), Type.SUPER); return checkMethodReference(lookup.getMethod(), OptionalBool.UNKNOWN); } @Override public boolean registerInstanceFieldWrite(DexField field) { - return checkFieldReference(appView.graphLense().lookupField(field)); + return checkFieldReference(appView.graphLens().lookupField(field)); } @Override public boolean registerInstanceFieldRead(DexField field) { - return checkFieldReference(appView.graphLense().lookupField(field)); + return checkFieldReference(appView.graphLens().lookupField(field)); } @Override @@ -1906,12 +1906,12 @@ @Override public boolean registerStaticFieldRead(DexField field) { - return checkFieldReference(appView.graphLense().lookupField(field)); + return checkFieldReference(appView.graphLens().lookupField(field)); } @Override public boolean registerStaticFieldWrite(DexField field) { - return checkFieldReference(appView.graphLense().lookupField(field)); + return checkFieldReference(appView.graphLens().lookupField(field)); } @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java similarity index 84% rename from src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java rename to src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java index 2a0a843..db59152 100644 --- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLense.java +++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMergerGraphLens.java
@@ -11,8 +11,8 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.GraphLense; -import com.android.tools.r8.graph.GraphLense.NestedGraphLense; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.GraphLens.NestedGraphLens; import com.android.tools.r8.ir.code.Invoke.Type; import com.google.common.collect.BiMap; import com.google.common.collect.HashBiMap; @@ -21,7 +21,7 @@ import java.util.Map; import java.util.Set; -// This graph lense is instantiated during vertical class merging. The graph lense is context +// This graph lens is instantiated during vertical class merging. The graph lens is context // sensitive in the enclosing class of a given invoke *and* the type of the invoke (e.g., invoke- // super vs invoke-virtual). This is illustrated by the following example. // @@ -40,38 +40,38 @@ // During this process, the method corresponding to A.m will be made private such that it can be // called via an invoke-direct instruction. // -// For the invocation "invoke-super A.m()" in B.m, this graph lense will return the newly created, +// For the invocation "invoke-super A.m()" in B.m, this graph lens will return the newly created, // private method corresponding to A.m (that is now in B.m with a fresh name), such that the // invocation will hit the same implementation as the original super.m() call. // -// For the invocation "invoke-virtual A.m()" in B.m2, this graph lense will return the method B.m. -public class VerticalClassMergerGraphLense extends NestedGraphLense { +// For the invocation "invoke-virtual A.m()" in B.m2, this graph lens will return the method B.m. +public class VerticalClassMergerGraphLens extends NestedGraphLens { private final AppView<?> appView; - private final Map<DexType, Map<DexMethod, GraphLenseLookupResult>> + private final Map<DexType, Map<DexMethod, GraphLensLookupResult>> contextualVirtualToDirectMethodMaps; private Set<DexMethod> mergedMethods; private final Map<DexMethod, DexMethod> originalMethodSignaturesForBridges; - private VerticalClassMergerGraphLense( + private VerticalClassMergerGraphLens( AppView<?> appView, Map<DexType, DexType> typeMap, Map<DexField, DexField> fieldMap, Map<DexMethod, DexMethod> methodMap, Set<DexMethod> mergedMethods, - Map<DexType, Map<DexMethod, GraphLenseLookupResult>> contextualVirtualToDirectMethodMaps, + Map<DexType, Map<DexMethod, GraphLensLookupResult>> contextualVirtualToDirectMethodMaps, BiMap<DexField, DexField> originalFieldSignatures, BiMap<DexMethod, DexMethod> originalMethodSignatures, Map<DexMethod, DexMethod> originalMethodSignaturesForBridges, - GraphLense previousLense) { + GraphLens previousLens) { super( typeMap, methodMap, fieldMap, originalFieldSignatures, originalMethodSignatures, - previousLense, + previousLens, appView.dexItemFactory()); this.appView = appView; this.contextualVirtualToDirectMethodMaps = contextualVirtualToDirectMethodMaps; @@ -81,7 +81,7 @@ @Override public DexType getOriginalType(DexType type) { - return previousLense.getOriginalType(type); + return previousLens.getOriginalType(type); } @Override @@ -91,19 +91,19 @@ } @Override - public GraphLenseLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { + public GraphLensLookupResult lookupMethod(DexMethod method, DexMethod context, Type type) { assert context != null || verifyIsContextFreeForMethod(method); assert context == null || type != null; DexMethod previousContext = originalMethodSignaturesForBridges.containsKey(context) ? originalMethodSignaturesForBridges.get(context) : originalMethodSignatures.getOrDefault(context, context); - GraphLenseLookupResult previous = previousLense.lookupMethod(method, previousContext, type); + GraphLensLookupResult previous = previousLens.lookupMethod(method, previousContext, type); if (previous.getType() == Type.SUPER && !mergedMethods.contains(context)) { - Map<DexMethod, GraphLenseLookupResult> virtualToDirectMethodMap = + Map<DexMethod, GraphLensLookupResult> virtualToDirectMethodMap = contextualVirtualToDirectMethodMaps.get(context.holder); if (virtualToDirectMethodMap != null) { - GraphLenseLookupResult lookup = virtualToDirectMethodMap.get(previous.getMethod()); + GraphLensLookupResult lookup = virtualToDirectMethodMap.get(previous.getMethod()); if (lookup != null) { // If the super class A of the enclosing class B (i.e., context.holder()) // has been merged into B during vertical class merging, and this invoke-super instruction @@ -125,13 +125,13 @@ @Override public boolean isContextFreeForMethods() { - return contextualVirtualToDirectMethodMaps.isEmpty() && previousLense.isContextFreeForMethods(); + return contextualVirtualToDirectMethodMaps.isEmpty() && previousLens.isContextFreeForMethods(); } @Override public boolean verifyIsContextFreeForMethod(DexMethod method) { - assert previousLense.verifyIsContextFreeForMethod(method); - DexMethod previous = previousLense.lookupMethod(method); + assert previousLens.verifyIsContextFreeForMethod(method); + DexMethod previous = previousLens.lookupMethod(method); assert contextualVirtualToDirectMethodMaps.values().stream() .noneMatch(virtualToDirectMethodMap -> virtualToDirectMethodMap.containsKey(previous)); return true; @@ -144,7 +144,7 @@ protected final BiMap<DexField, DexField> fieldMap = HashBiMap.create(); protected final Map<DexMethod, DexMethod> methodMap = new IdentityHashMap<>(); private final ImmutableSet.Builder<DexMethod> mergedMethodsBuilder = ImmutableSet.builder(); - private final Map<DexType, Map<DexMethod, GraphLenseLookupResult>> + private final Map<DexType, Map<DexMethod, GraphLensLookupResult>> contextualVirtualToDirectMethodMaps = new IdentityHashMap<>(); private final BiMap<DexMethod, DexMethod> originalMethodSignatures = HashBiMap.create(); @@ -173,18 +173,17 @@ newBuilder.markMethodAsMerged( builder.getMethodSignatureAfterClassMerging(method, mergedClasses)); } - for (Map.Entry<DexType, Map<DexMethod, GraphLenseLookupResult>> entry : + for (Map.Entry<DexType, Map<DexMethod, GraphLensLookupResult>> entry : builder.contextualVirtualToDirectMethodMaps.entrySet()) { DexType context = entry.getKey(); assert context == builder.getTypeAfterClassMerging(context, mergedClasses); - for (Map.Entry<DexMethod, GraphLenseLookupResult> innerEntry : - entry.getValue().entrySet()) { + for (Map.Entry<DexMethod, GraphLensLookupResult> innerEntry : entry.getValue().entrySet()) { DexMethod from = innerEntry.getKey(); - GraphLenseLookupResult rewriting = innerEntry.getValue(); + GraphLensLookupResult rewriting = innerEntry.getValue(); DexMethod to = builder.getMethodSignatureAfterClassMerging(rewriting.getMethod(), mergedClasses); newBuilder.mapVirtualMethodToDirectInType( - from, new GraphLenseLookupResult(to, rewriting.getType()), context); + from, new GraphLensLookupResult(to, rewriting.getType()), context); } } for (Map.Entry<DexMethod, DexMethod> entry : builder.originalMethodSignatures.entrySet()) { @@ -201,14 +200,14 @@ return newBuilder; } - public VerticalClassMergerGraphLense build( + public VerticalClassMergerGraphLens build( AppView<?> appView, Map<DexType, DexType> mergedClasses) { if (mergedClasses.isEmpty()) { return null; } BiMap<DexField, DexField> originalFieldSignatures = fieldMap.inverse(); - // Build new graph lense. - return new VerticalClassMergerGraphLense( + // Build new graph lens. + return new VerticalClassMergerGraphLens( appView, mergedClasses, fieldMap, @@ -218,7 +217,7 @@ originalFieldSignatures, originalMethodSignatures, originalMethodSignaturesForBridges, - appView.graphLense()); + appView.graphLens()); } private DexField getFieldSignatureAfterClassMerging( @@ -268,7 +267,7 @@ } public boolean hasMappingForSignatureInContext(DexProgramClass context, DexMethod signature) { - Map<DexMethod, GraphLenseLookupResult> virtualToDirectMethodMap = + Map<DexMethod, GraphLensLookupResult> virtualToDirectMethodMap = contextualVirtualToDirectMethodMaps.get(context.type); if (virtualToDirectMethodMap != null) { return virtualToDirectMethodMap.containsKey(signature); @@ -307,22 +306,22 @@ } public void mapVirtualMethodToDirectInType( - DexMethod from, GraphLenseLookupResult to, DexType type) { - Map<DexMethod, GraphLenseLookupResult> virtualToDirectMethodMap = + DexMethod from, GraphLensLookupResult to, DexType type) { + Map<DexMethod, GraphLensLookupResult> virtualToDirectMethodMap = contextualVirtualToDirectMethodMaps.computeIfAbsent(type, key -> new IdentityHashMap<>()); virtualToDirectMethodMap.put(from, to); } - public void merge(VerticalClassMergerGraphLense.Builder builder) { + public void merge(VerticalClassMergerGraphLens.Builder builder) { fieldMap.putAll(builder.fieldMap); methodMap.putAll(builder.methodMap); mergedMethodsBuilder.addAll(builder.mergedMethodsBuilder.build()); originalMethodSignatures.putAll(builder.originalMethodSignatures); originalMethodSignaturesForBridges.putAll(builder.originalMethodSignaturesForBridges); for (DexType context : builder.contextualVirtualToDirectMethodMaps.keySet()) { - Map<DexMethod, GraphLenseLookupResult> current = + Map<DexMethod, GraphLensLookupResult> current = contextualVirtualToDirectMethodMaps.get(context); - Map<DexMethod, GraphLenseLookupResult> other = + Map<DexMethod, GraphLensLookupResult> other = builder.contextualVirtualToDirectMethodMaps.get(context); if (current != null) { current.putAll(other);
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java index e349c9a..c230a6d 100644 --- a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java +++ b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
@@ -171,8 +171,10 @@ .addClasspathFiles(classpath) .addProguardConfigurationFiles(config) .setOutput(outputPath, outputMode) - .setMode(compilationMode) - .setMinApiLevel(minApi); + .setMode(compilationMode); + if (outputMode != OutputMode.ClassFile) { + commandBuilder.setMinApiLevel(minApi); + } features.forEach( (in, out) -> commandBuilder.addFeatureSplit(
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java index 6cc73f4..6d85a4e 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -819,7 +819,7 @@ List<String> classPathClasses = new ArrayList<>(); List<String> libraryClasses = new ArrayList<>(); for (DexType type : nest) { - DexClass clazz = appView.definitionFor(appView.graphLense().lookupType(type)); + DexClass clazz = appView.definitionFor(appView.graphLens().lookupType(type)); if (clazz == null) { unavailableClasses.add(type.getName()); } else if (clazz.isLibraryClass()) {
diff --git a/src/main/java/com/android/tools/r8/utils/LensUtils.java b/src/main/java/com/android/tools/r8/utils/LensUtils.java index 325d6fa..a039fb6 100644 --- a/src/main/java/com/android/tools/r8/utils/LensUtils.java +++ b/src/main/java/com/android/tools/r8/utils/LensUtils.java
@@ -6,14 +6,14 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.google.common.collect.Sets; import java.util.Set; public class LensUtils { public static Set<DexEncodedMethod> rewrittenWithRenamedSignature( - Set<DexEncodedMethod> methods, DexDefinitionSupplier definitions, GraphLense lens) { + Set<DexEncodedMethod> methods, DexDefinitionSupplier definitions, GraphLens lens) { Set<DexEncodedMethod> result = Sets.newIdentityHashSet(); for (DexEncodedMethod method : methods) { result.add(lens.mapDexEncodedMethod(method, definitions));
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 6907805..9c703e7 100644 --- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java +++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -35,7 +35,7 @@ import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexValue.DexValueString; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.kotlin.KotlinSourceDebugExtensionParser; import com.android.tools.r8.kotlin.KotlinSourceDebugExtensionParser.Result; @@ -274,12 +274,12 @@ // Collect which files contain which classes that need to have their line numbers optimized. for (DexProgramClass clazz : application.classes()) { IdentityHashMap<DexString, List<DexEncodedMethod>> methodsByRenamedName = - groupMethodsByRenamedName(appView.graphLense(), namingLens, clazz); + groupMethodsByRenamedName(appView.graphLens(), namingLens, clazz); // At this point we don't know if we really need to add this class to the builder. // It depends on whether any methods/fields are renamed or some methods contain positions. // Create a supplier which creates a new, cached ClassNaming.Builder on-demand. - DexType originalType = appView.graphLense().getOriginalType(clazz.type); + DexType originalType = appView.graphLens().getOriginalType(clazz.type); DexString renamedClassName = namingLens.lookupDescriptor(clazz.getType()); Supplier<ClassNaming.Builder> onDemandClassNamingBuilder = Suppliers.memoize( @@ -302,7 +302,7 @@ addClassToClassNaming(originalType, renamedClassName, onDemandClassNamingBuilder); // First transfer renamed fields to classNamingBuilder. - addFieldsToClassNaming(appView.graphLense(), namingLens, clazz, onDemandClassNamingBuilder); + addFieldsToClassNaming(appView.graphLens(), namingLens, clazz, onDemandClassNamingBuilder); // Then process the methods, ordered by renamed name. List<DexString> renamedMethodNames = new ArrayList<>(methodsByRenamedName.keySet()); @@ -355,7 +355,7 @@ } } - DexMethod originalMethod = appView.graphLense().getOriginalMethodSignature(method.method); + DexMethod originalMethod = appView.graphLens().getOriginalMethodSignature(method.method); MethodSignature originalSignature = MethodSignature.fromDexMethod(originalMethod, originalMethod.holder != clazz.type); @@ -536,14 +536,14 @@ } private static void addFieldsToClassNaming( - GraphLense graphLense, + GraphLens graphLens, NamingLens namingLens, DexProgramClass clazz, Supplier<Builder> onDemandClassNamingBuilder) { clazz.forEachField( dexEncodedField -> { DexField dexField = dexEncodedField.field; - DexField originalField = graphLense.getOriginalFieldSignature(dexField); + DexField originalField = graphLens.getOriginalFieldSignature(dexField); DexString renamedName = namingLens.lookupName(dexField); if (renamedName != originalField.name || originalField.holder != clazz.type) { FieldSignature originalSignature = @@ -555,7 +555,7 @@ } private static IdentityHashMap<DexString, List<DexEncodedMethod>> groupMethodsByRenamedName( - GraphLense graphLens, NamingLens namingLens, DexProgramClass clazz) { + GraphLens graphLens, NamingLens namingLens, DexProgramClass clazz) { IdentityHashMap<DexString, List<DexEncodedMethod>> methodsByRenamedName = new IdentityHashMap<>(clazz.getMethodCollection().size()); for (DexEncodedMethod encodedMethod : clazz.methods()) {
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMultisetBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMultisetBuilder.java index f3ba06b..765f373 100644 --- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMultisetBuilder.java +++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodMultisetBuilder.java
@@ -34,7 +34,7 @@ ProgramMethodMultiset result = ProgramMethodMultiset.createHash(); backing.forEachEntry( (oldMethod, occurrences) -> { - DexMethod method = appView.graphLense().getRenamedMethodSignature(oldMethod); + DexMethod method = appView.graphLens().getRenamedMethodSignature(oldMethod); DexProgramClass holder = appView.definitionForHolder(method).asProgramClass(); result.createAndAdd(holder, holder.lookupMethod(method), occurrences); });
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java index 1c6d63a..4b4eccb 100644 --- a/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java +++ b/src/main/java/com/android/tools/r8/utils/collections/LongLivedProgramMethodSetBuilder.java
@@ -7,7 +7,7 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProgramClass; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.shaking.AppInfoWithLiveness; import com.google.common.collect.Sets; @@ -39,10 +39,10 @@ methods.forEach(this::add); } - public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense applied) { + public void rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLens applied) { Set<DexMethod> newMethods = Sets.newIdentityHashSet(); for (DexMethod method : methods) { - newMethods.add(appView.graphLense().getRenamedMethodSignature(method, applied)); + newMethods.add(appView.graphLens().getRenamedMethodSignature(method, applied)); } methods.clear(); methods.addAll(newMethods); @@ -52,10 +52,10 @@ return build(appView, null); } - public T build(AppView<AppInfoWithLiveness> appView, GraphLense applied) { + public T build(AppView<AppInfoWithLiveness> appView, GraphLens applied) { T result = factory.apply(methods.size()); for (DexMethod oldMethod : methods) { - DexMethod method = appView.graphLense().getRenamedMethodSignature(oldMethod, applied); + DexMethod method = appView.graphLens().getRenamedMethodSignature(oldMethod, applied); DexProgramClass holder = appView.definitionForHolder(method).asProgramClass(); result.createAndAdd(holder, holder.lookupMethod(method)); }
diff --git a/src/test/examples/classmerging/RewritePinnedMethodTest.java b/src/test/examples/classmerging/RewritePinnedMethodTest.java index 3d25805..81f6c5f 100644 --- a/src/test/examples/classmerging/RewritePinnedMethodTest.java +++ b/src/test/examples/classmerging/RewritePinnedMethodTest.java
@@ -32,7 +32,7 @@ public void m() { System.out.println("In C.m"); // This invocation is changed from invoke-super to invoke-direct. It would be valid for this - // instruction to be on the form "invoke-super A.m". Therefore, the graph lense contains a + // instruction to be on the form "invoke-super A.m". Therefore, the graph lens contains a // mapping for "A.m" from (context: "C.m", type: SUPER) to C.m$B, where the method C.m$B is // the direct method that gets created for B.m during vertical class merging. super.m();
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java index 31150c4..9b83a88 100644 --- a/src/test/java/com/android/tools/r8/ToolHelper.java +++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -20,7 +20,7 @@ import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DirectMappedDexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; @@ -2092,7 +2092,7 @@ Executors.newSingleThreadExecutor(), application, null, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), options,
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java index 5c04f51..8c2adf3 100644 --- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java +++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -64,12 +64,13 @@ String expectedException, Consumer<CodeInspector> inspectorConsumer) throws Exception { AndroidApp app = buildApplication(builder); - List<String> pgConfigs = ImmutableList.of( - keepMainProguardConfiguration(CLASS_NAME), - // We're testing lense-based invocation type conversions. - "-dontoptimize", - "-dontobfuscate", - "-allowaccessmodification"); + List<String> pgConfigs = + ImmutableList.of( + keepMainProguardConfiguration(CLASS_NAME), + // We're testing lens-based invocation type conversions. + "-dontoptimize", + "-dontobfuscate", + "-allowaccessmodification"); R8Command.Builder command = ToolHelper.prepareR8CommandBuilder(app); command.addProguardConfiguration(pgConfigs, Origin.unknown()); AndroidApp processedApp = ToolHelper.runR8(command.build(), o -> { @@ -88,7 +89,7 @@ } // The following test checks invoke-direct, which refers to the private static method, is *not* - // rewritten by publicizer lense, resulting in IncompatibleClassChangeError, which is expected. + // rewritten by publicizer lens, resulting in IncompatibleClassChangeError, which is expected. // // class Example { // private int foo() { return 0; } @@ -118,7 +119,7 @@ } // The following test checks invoke-direct, which refers to the private instance method, *is* - // rewritten by publicizer lense, as the target method will be publicized. + // rewritten by publicizer lens, as the target method will be publicized. // // class Example { // private int foo() { return 0; }
diff --git a/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java b/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java index 817abcd..49e7256 100644 --- a/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java +++ b/src/test/java/com/android/tools/r8/dex/SharedClassWritingTest.java
@@ -23,7 +23,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; import com.android.tools.r8.graph.DirectMappedDexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ParameterAnnotationsList; @@ -155,7 +155,7 @@ null, options, null, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), null);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java index dc6bc19..c139dcf 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstantRemovalTest.java
@@ -70,8 +70,9 @@ // // Then test that peephole optimization realizes that the last const number // is needed and the value 10 is *not* still in register 0 at that point. + final ValueNumberGenerator basicBlockNumberGenerator = new ValueNumberGenerator(); BasicBlock block = new BasicBlock(); - block.setNumber(0); + block.setNumber(basicBlockNumberGenerator.next()); IRMetadata metadata = IRMetadata.unknown(); Position position = Position.testingPosition(); @@ -141,6 +142,7 @@ null, blocks, new ValueNumberGenerator(), + basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown()); PeepholeOptimizer.optimize(code, new MockLinearScanRegisterAllocator(appView, code));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java index 7d7785f..69394e0 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/TrivialGotoEliminationTest.java
@@ -62,18 +62,20 @@ // throw v0 // block2: // return + final ValueNumberGenerator basicBlockNumberGenerator = new ValueNumberGenerator(); Position position = Position.testingPosition(); BasicBlock block2 = new BasicBlock(); - block2.setNumber(2); - BasicBlock block0 = BasicBlock.createGotoBlock(0, position, metadata, block2); + BasicBlock block0 = + BasicBlock.createGotoBlock(basicBlockNumberGenerator.next(), position, metadata, block2); + BasicBlock block1 = new BasicBlock(); + block1.setNumber(basicBlockNumberGenerator.next()); + block2.setNumber(basicBlockNumberGenerator.next()); block0.setFilledForTesting(); block2.getMutablePredecessors().add(block0); Instruction ret = new Return(); ret.setPosition(position); block2.add(ret, metadata); block2.setFilledForTesting(); - BasicBlock block1 = new BasicBlock(); - block1.setNumber(1); Value value = new Value(0, TypeElement.getInt(), null); Instruction number = new ConstNumber(value, 0); number.setPosition(position); @@ -97,6 +99,7 @@ null, blocks, new ValueNumberGenerator(), + basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown()); CodeRewriter.collapseTrivialGotos(code); @@ -123,28 +126,30 @@ // // block3: // goto block3 + final ValueNumberGenerator basicBlockNumberGenerator = new ValueNumberGenerator(); Position position = Position.testingPosition(); + BasicBlock block0 = new BasicBlock(); + block0.setNumber(basicBlockNumberGenerator.next()); BasicBlock block2 = new BasicBlock(); - block2.setNumber(2); + BasicBlock block1 = + BasicBlock.createGotoBlock(basicBlockNumberGenerator.next(), position, metadata); + block2.setNumber(basicBlockNumberGenerator.next()); Instruction ret = new Return(); ret.setPosition(position); block2.add(ret, metadata); block2.setFilledForTesting(); BasicBlock block3 = new BasicBlock(); - block3.setNumber(3); + block3.setNumber(basicBlockNumberGenerator.next()); Instruction instruction = new Goto(); instruction.setPosition(position); block3.add(instruction, metadata); block3.setFilledForTesting(); block3.getMutableSuccessors().add(block3); - BasicBlock block1 = BasicBlock.createGotoBlock(1, position, metadata); block1.getMutableSuccessors().add(block3); block1.setFilledForTesting(); - BasicBlock block0 = new BasicBlock(); - block0.setNumber(0); Value value = new Value( 0, @@ -181,6 +186,7 @@ null, blocks, new ValueNumberGenerator(), + basicBlockNumberGenerator, IRMetadata.unknown(), Origin.unknown()); CodeRewriter.collapseTrivialGotos(code);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningTest.java new file mode 100644 index 0000000..17ccc82 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningTest.java
@@ -0,0 +1,71 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.ir.optimize.classinliner; + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class StatefulSingletonClassInliningTest extends TestBase { + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public StatefulSingletonClassInliningTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(StatefulSingletonClassInliningTest.class) + .addKeepMainRule(TestClass.class) + .enableInliningAnnotations() + .setMinApi(parameters.getApiLevel()) + .compile() + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutputLines("true"); + } + + static class TestClass { + + public static void main(String[] args) { + State.get().set(); + State.get().print(); + } + } + + static class State { + + static StatefulSingleton SINGLETON = new StatefulSingleton(); + + static StatefulSingleton get() { + return SINGLETON; + } + } + + static class StatefulSingleton { + + boolean field; + + @NeverInline + void set() { + field = true; + } + + void print() { + System.out.println(field); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java new file mode 100644 index 0000000..681f958 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/StatefulSingletonClassInliningWithStaticEscapeTest.java
@@ -0,0 +1,72 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.ir.optimize.classinliner; + + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class StatefulSingletonClassInliningWithStaticEscapeTest extends TestBase { + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public StatefulSingletonClassInliningWithStaticEscapeTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(StatefulSingletonClassInliningWithStaticEscapeTest.class) + .addKeepMainRule(TestClass.class) + .enableInliningAnnotations() + .setMinApi(parameters.getApiLevel()) + .compile() + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutputLines("true"); + } + + static class TestClass { + + public static void main(String[] args) { + State.set(State.get()); + State.get().print(); + } + } + + static class State { + + static StatefulSingleton SINGLETON = new StatefulSingleton(); + + static StatefulSingleton get() { + return SINGLETON; + } + + @NeverInline + static void set(StatefulSingleton state) { + state.field = true; + } + } + + static class StatefulSingleton { + + boolean field; + + void print() { + System.out.println(field); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java new file mode 100644 index 0000000..45997a8 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java
@@ -0,0 +1,67 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.ir.optimize.inliner; + +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.utils.StringUtils; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class InlineSynchronizedMethodTest extends TestBase { + + static final String EXPECTED = StringUtils.lines("Hello, world"); + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimes().withAllApiLevels().build(); + } + + public InlineSynchronizedMethodTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(InlineSynchronizedMethodTest.class) + .addKeepMainRule(TestClass.class) + .setMinApi(parameters.getApiLevel()) + .run(parameters.getRuntime(), TestClass.class) + .assertSuccessWithOutput(EXPECTED) + .inspect( + inspector -> { + // TODO(b/163007704): Identify and remove trivial/unobservable monitor enter/exit + // pairs. + assertEquals( + 2, + inspector + .clazz(TestClass.class) + .uniqueMethodWithName("main") + .streamInstructions() + .filter(i -> i.isMonitorEnter() || i.isMonitorExit()) + .count()); + }); + } + + static class TestClass { + + public static synchronized String foo(String msg) { + // No throwing instructions, so no need to join exceptions on exit. + return msg; + } + + public static void main(String[] args) { + System.out.println(foo(args.length == 1 ? args[0] : "Hello, world")); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostFieldOnlyTestClass.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostFieldOnlyTestClass.java index eb8e6a4..0ec6935 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostFieldOnlyTestClass.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/movetohost/MoveToHostFieldOnlyTestClass.java
@@ -23,7 +23,7 @@ // Any other uses other than invoke-virtual or invoke-direct (to either <init> or private) are // not allowed, e.g., System.out.println(INSTANCE), null check, or static-put to somewhere else. // Therefore, it's merely dead code, and thus it has not been harmful to forget to create a - // staticizer lense when there is no method mapping (for instance methods to staticized ones) + // staticizer lens when there is no method mapping (for instance methods to staticized ones) // while there are field mappings as shown in this example. Object x = HostOkFieldOnly.INSTANCE; }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java new file mode 100644 index 0000000..77134d8 --- /dev/null +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
@@ -0,0 +1,85 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.kotlin.metadata; + +import static com.android.tools.r8.KotlinCompilerTool.KOTLINC; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.CoreMatchers.equalTo; +import static org.hamcrest.CoreMatchers.not; +import static org.hamcrest.MatcherAssert.assertThat; + +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.ToolHelper.KotlinTargetVersion; +import com.android.tools.r8.kotlin.metadata.metadata_pruned_fields.Main; +import com.android.tools.r8.shaking.ProguardKeepAttributes; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import java.nio.file.Path; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import org.junit.BeforeClass; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +/** This is a reproduction of b/161230424. */ +@RunWith(Parameterized.class) +public class MetadataPrunedFieldsTest extends KotlinMetadataTestBase { + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0} target: {1}") + public static Collection<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimesAndApiLevels().build(), KotlinTargetVersion.values()); + } + + public MetadataPrunedFieldsTest(TestParameters parameters, KotlinTargetVersion targetVersion) { + super(targetVersion); + this.parameters = parameters; + } + + private static Map<KotlinTargetVersion, Path> libJars = new HashMap<>(); + + @BeforeClass + public static void createLibJar() throws Exception { + String baseLibFolder = PKG_PREFIX + "/metadata_pruned_fields"; + for (KotlinTargetVersion targetVersion : KotlinTargetVersion.values()) { + Path baseLibJar = + kotlinc(KOTLINC, targetVersion) + .addSourceFiles(getKotlinFileInTest(baseLibFolder, "Methods")) + .compile(); + libJars.put(targetVersion, baseLibJar); + } + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addProgramFiles(ToolHelper.getKotlinStdlibJar()) + .addProgramFiles(libJars.get(targetVersion)) + .addProgramClassFileData(Main.dump()) + .addKeepRules("-keep class " + PKG + ".metadata_pruned_fields.MethodsKt { *; }") + .addKeepRules("-keep class kotlin.Metadata { *** pn(); }") + .addKeepMainRule(Main.class) + .allowDiagnosticWarningMessages() + .setMinApi(parameters.getApiLevel()) + .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) + .compile() + .inspect( + codeInspector -> { + final ClassSubject clazz = codeInspector.clazz("kotlin.Metadata"); + assertThat(clazz, isPresent()); + assertThat(clazz.uniqueMethodWithName("pn"), isPresent()); + assertThat(clazz.uniqueMethodWithName("d1"), not(isPresent())); + assertThat(clazz.uniqueMethodWithName("d2"), not(isPresent())); + assertThat(clazz.uniqueMethodWithName("bv"), not(isPresent())); + }) + .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists.")) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("", "Hello World!"); + } +}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java index bb77f38..8be744d 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInRenamedTypeTest.java
@@ -101,7 +101,7 @@ .addProgramFiles(inputJarMap.get(targetVersion)) .addKeepRules(OBFUSCATE_RENAMED, KEEP_KEPT) .addKeepRules("-keep class **.Anno") - .addKeepRules("-keep class kotlin.Metadata") + .addKeepKotlinMetadata() .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) .allowDiagnosticWarningMessages() .compile()
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java index 295f26a..0f80128 100644 --- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteKeepTest.java
@@ -4,9 +4,6 @@ package com.android.tools.r8.kotlin.metadata; -import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -14,7 +11,6 @@ import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.KotlinTargetVersion; import com.android.tools.r8.shaking.ProguardKeepAttributes; -import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.FoundClassSubject; import java.util.Collection; @@ -51,52 +47,12 @@ } @Test - public void testR8KeepPartial() throws Exception { - // This test is a bit weird, since it shows that we can remove params from the kotlin.Metadata - // class, but still be able to fully read the kotlin.Metadata. - testForR8(parameters.getBackend()) - .addProgramFiles(ToolHelper.getKotlinStdlibJar()) - .setMinApi(parameters.getApiLevel()) - .addKeepRules("-keep class kotlin.Metadata { *** d1(); }") - .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) - .compile() - .inspect( - inspector -> { - inspect(inspector); - ClassSubject kotlinMetadataClass = inspector.clazz("kotlin.Metadata"); - assertThat(kotlinMetadataClass, isPresent()); - assertEquals(1, kotlinMetadataClass.allMethods().size()); - assertNotNull(kotlinMetadataClass.getKmClass().getName()); - }); - } - - @Test - public void testR8KeepPartialCooking() throws Exception { - // This test is a bit weird, since it shows that we can remove params from the kotlin.Metadata - // class, but still be able to fully read the kotlin.Metadata externally. - testForR8(parameters.getBackend()) - .addProgramFiles(ToolHelper.getKotlinStdlibJar()) - .setMinApi(parameters.getApiLevel()) - .addKeepRules("-keep class kotlin.Metadata { *** d1(); }") - .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) - .compile() - .inspect( - inspector -> { - inspect(inspector); - ClassSubject kotlinMetadataClass = inspector.clazz("kotlin.Metadata"); - assertThat(kotlinMetadataClass, isPresent()); - assertEquals(1, kotlinMetadataClass.allMethods().size()); - assertNotNull(kotlinMetadataClass.getKmClass().getName()); - }); - } - - @Test public void testR8KeepIf() throws Exception { testForR8(parameters.getBackend()) .addProgramFiles(ToolHelper.getKotlinStdlibJar()) .setMinApi(parameters.getApiLevel()) .addKeepRules("-keep class kotlin.io.** { *; }") - .addKeepRules("-if class * { *** $VALUES; }", "-keep class kotlin.Metadata { *; }") + .addKeepRules("-if class *", "-keep class kotlin.Metadata { *; }") .addKeepAttributes(ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS) .compile() .inspect(this::inspect);
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java b/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java new file mode 100644 index 0000000..10ebf6b --- /dev/null +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main.java
@@ -0,0 +1,81 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.kotlin.metadata.metadata_pruned_fields; + +import org.objectweb.asm.ClassWriter; +import org.objectweb.asm.MethodVisitor; +import org.objectweb.asm.Opcodes; +import org.objectweb.asm.Type; + +public class Main implements Opcodes { + + // The dump is generated from the code below, which cannot compile because of a missing + // reference to MethodsKt. + // + // public static void main(String[] args) { + // final kotlin.Metadata annotation = MethodsKt.class.getAnnotation(kotlin.Metadata.class); + // System.out.println(annotation.pn()); + // MethodsKt.staticMethod(); + // } + + public static byte[] dump() { + + ClassWriter classWriter = new ClassWriter(0); + MethodVisitor methodVisitor; + + classWriter.visit( + V1_8, + ACC_PUBLIC | ACC_SUPER, + "com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Main", + null, + "java/lang/Object", + new String[] {}); + + { + methodVisitor = classWriter.visitMethod(ACC_PUBLIC, "<init>", "()V", null, null); + methodVisitor.visitCode(); + methodVisitor.visitVarInsn(ALOAD, 0); + methodVisitor.visitMethodInsn(INVOKESPECIAL, "java/lang/Object", "<init>", "()V", false); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(1, 1); + methodVisitor.visitEnd(); + } + { + methodVisitor = + classWriter.visitMethod( + ACC_PUBLIC | ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); + methodVisitor.visitCode(); + methodVisitor.visitLdcInsn( + Type.getType("Lcom/android/tools/r8/kotlin/metadata/metadata_pruned_fields/MethodsKt;")); + methodVisitor.visitLdcInsn(Type.getType("Lkotlin/Metadata;")); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, + "java/lang/Class", + "getAnnotation", + "(Ljava/lang/Class;)Ljava/lang/annotation/Annotation;", + false); + methodVisitor.visitTypeInsn(CHECKCAST, "kotlin/Metadata"); + methodVisitor.visitVarInsn(ASTORE, 1); + methodVisitor.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); + methodVisitor.visitVarInsn(ALOAD, 1); + methodVisitor.visitMethodInsn( + INVOKEINTERFACE, "kotlin/Metadata", "pn", "()Ljava/lang/String;", true); + methodVisitor.visitMethodInsn( + INVOKEVIRTUAL, "java/io/PrintStream", "println", "(Ljava/lang/String;)V", false); + methodVisitor.visitMethodInsn( + INVOKESTATIC, + "com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/MethodsKt", + "staticMethod", + "()V", + false); + methodVisitor.visitInsn(RETURN); + methodVisitor.visitMaxs(2, 2); + methodVisitor.visitEnd(); + } + classWriter.visitEnd(); + + return classWriter.toByteArray(); + } +}
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt b/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt new file mode 100644 index 0000000..5f67164 --- /dev/null +++ b/src/test/java/com/android/tools/r8/kotlin/metadata/metadata_pruned_fields/Methods.kt
@@ -0,0 +1,9 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.kotlin.metadata.metadata_pruned_fields + +fun staticMethod() { + println("Hello World!") +} \ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java index b3cbe0e..984d813 100644 --- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java +++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -46,7 +46,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.DexTypeList; import com.android.tools.r8.graph.DirectMappedDexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.graph.MethodAccessFlags; import com.android.tools.r8.graph.ParameterAnnotationsList; @@ -871,7 +871,7 @@ null, options, null, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), null);
diff --git a/src/test/java/com/android/tools/r8/rewrite/ServiceLoaderRewritingTest.java b/src/test/java/com/android/tools/r8/rewrite/ServiceLoaderRewritingTest.java index 5e18734..cd7964f 100644 --- a/src/test/java/com/android/tools/r8/rewrite/ServiceLoaderRewritingTest.java +++ b/src/test/java/com/android/tools/r8/rewrite/ServiceLoaderRewritingTest.java
@@ -135,6 +135,20 @@ } } + public static class LoadWhereClassLoaderIsPhi { + + public static void main(String[] args) { + ServiceLoader.load( + Service.class, + System.currentTimeMillis() > 0 + ? Thread.currentThread().getContextClassLoader() + : null) + .iterator() + .next() + .print(); + } + } + @Parameterized.Parameters(name = "{0}") public static TestParametersCollection data() { return getTestParameters().withAllRuntimesAndApiLevels().build(); @@ -207,7 +221,7 @@ testForR8(parameters.getBackend()) .addInnerClasses(ServiceLoaderRewritingTest.class) .addKeepMainRule(MainWithTryCatchRunner.class) - .setMinApi(parameters.getRuntime()) + .setMinApi(parameters.getApiLevel()) .addDataEntryResources( DataEntryResource.fromBytes( StringUtils.lines(ServiceImpl.class.getTypeName(), ServiceImpl2.class.getTypeName()) @@ -267,7 +281,7 @@ .addInnerClasses(ServiceLoaderRewritingTest.class) .addKeepMainRule(EscapingRunner.class) .enableInliningAnnotations() - .setMinApi(parameters.getRuntime()) + .setMinApi(parameters.getApiLevel()) .noMinification() .addDataEntryResources( DataEntryResource.fromBytes( @@ -291,6 +305,37 @@ } @Test + public void testDoNoRewriteWhenClassLoaderIsPhi() + throws IOException, CompilationFailedException, ExecutionException { + Path path = temp.newFile("out.zip").toPath(); + CodeInspector inspector = + testForR8(parameters.getBackend()) + .addInnerClasses(ServiceLoaderRewritingTest.class) + .addKeepMainRule(LoadWhereClassLoaderIsPhi.class) + .enableInliningAnnotations() + .setMinApi(parameters.getApiLevel()) + .addDataEntryResources( + DataEntryResource.fromBytes( + StringUtils.lines(ServiceImpl.class.getTypeName()).getBytes(), + "META-INF/services/" + Service.class.getTypeName(), + Origin.unknown())) + .compile() + .writeToZip(path) + .run(parameters.getRuntime(), LoadWhereClassLoaderIsPhi.class) + .assertSuccessWithOutputLines("Hello World!") + .inspector(); + + // Check that we have not rewritten the calls to ServiceLoader.load. + assertEquals(1, getServiceLoaderLoads(inspector, LoadWhereClassLoaderIsPhi.class)); + + // Check that we have not removed the service configuration from META-INF/services. + ZipFile zip = new ZipFile(path.toFile()); + ClassSubject serviceImpl = inspector.clazz(ServiceImpl.class); + assertTrue(serviceImpl.isPresent()); + assertNotNull(zip.getEntry("META-INF/services/" + serviceImpl.getFinalName())); + } + + @Test public void testKeepAsOriginal() throws IOException, CompilationFailedException, ExecutionException { // The CL that changed behaviour after Nougat is:
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java new file mode 100644 index 0000000..3bb240a --- /dev/null +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAnnotationWithWildcardTest.java
@@ -0,0 +1,87 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.shaking.ifrule; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class IfOnAnnotationWithWildcardTest extends TestBase { + + private final TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public IfOnAnnotationWithWildcardTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void testR8WithTripleStars() throws Exception { + runTest( + "-if class ** { @" + + MyAnnotation.class.getTypeName() + + " *** *; }\n" + + "-keep class <1> { *; }"); + } + + @Test + public void testR8WithFields() throws Exception { + runTest( + "-if class ** { @" + + MyAnnotation.class.getTypeName() + + " <fields>; }\n" + + "-keep class <1> { *; }"); + } + + @Test + public void testR8WithAny() throws Exception { + runTest( + "-if class ** { @" + + MyAnnotation.class.getTypeName() + + " *; }\n" + + "-keep class <1> { *; }"); + } + + private void runTest(String ifRule) throws Exception { + testForR8Compat(parameters.getBackend()) + .addProgramClasses(MyClass.class, MyAnnotation.class) + .setMinApi(parameters.getApiLevel()) + .addKeepClassAndMembersRules(MyAnnotation.class) + .addKeepRules("-keep class * { @" + MyAnnotation.class.getTypeName() + " <fields>; }") + .addKeepRules(ifRule) + .addRunClasspathFiles(buildOnDexRuntime(parameters, Main.class)) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("Hello World = 42"); + } + + public static class MyClass { + @MyAnnotation int x; + int y; + + public void foo() { + System.out.println("Hello World = " + y); + } + } + + public @interface MyAnnotation {} + + public static class Main { + + public static void main(String[] args) { + final MyClass myClass = new MyClass(); + myClass.y = 42; + myClass.foo(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java new file mode 100644 index 0000000..c4dd92f --- /dev/null +++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfRuleWithKeepAllTest.java
@@ -0,0 +1,96 @@ +// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file +// for details. All rights reserved. Use of this source code is governed by a +// BSD-style license that can be found in the LICENSE file. + +package com.android.tools.r8.shaking.ifrule; + +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import java.lang.annotation.Annotation; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class IfRuleWithKeepAllTest extends TestBase { + + private final TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public IfRuleWithKeepAllTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void testR8WithKeepOnAllMembers() throws Exception { + runTest("-if class ** { *; }"); + } + + @Test + public void testR8WithKeepOnClass() throws Exception { + runTest("-if class **"); + } + + private void runTest(String precondition) throws Exception { + testForR8(parameters.getBackend()) + .addProgramClasses(DirectlyKept.class, KeptByIf.class) + .addKeepClassAndMembersRules(DirectlyKept.class) + .addKeepRules(precondition + "\n-keep class " + KeptByIf.class.getTypeName() + " { *; }") + .setMinApi(parameters.getApiLevel()) + .compile() + .inspect( + codeInspector -> { + assertThat(codeInspector.clazz(DirectlyKept.class), isPresent()); + final ClassSubject keptByIf = codeInspector.clazz(KeptByIf.class); + assertThat(keptByIf, isPresent()); + assertEquals(1, keptByIf.allMethods().size()); + }) + .addRunClasspathFiles(buildOnDexRuntime(parameters, Main.class)) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("Hello World!"); + } + + @KeptByIf() + public static class DirectlyKept { + final int foo = 42; + } + + @Retention(RetentionPolicy.RUNTIME) + public @interface KeptByIf { + String key() default ""; + } + + public static class Main implements KeptByIf { + + public static void main(String[] args) { + runKeptByIf(new Main()); + } + + public static void runKeptByIf(KeptByIf keptByIf) { + System.out.println(keptByIf.key()); + } + + @Override + public String key() { + return "Hello World!"; + } + + @Override + public Class<? extends Annotation> annotationType() { + return null; + } + } +}
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java index cb9ace0..2bb72cd 100644 --- a/src/test/java/com/android/tools/r8/utils/Smali.java +++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -9,7 +9,7 @@ import com.android.tools.r8.dex.ApplicationReader; import com.android.tools.r8.dex.ApplicationWriter; import com.android.tools.r8.graph.DexApplication; -import com.android.tools.r8.graph.GraphLense; +import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.InitClassLens; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; @@ -117,7 +117,7 @@ null, options, null, - GraphLense.getIdentityLense(), + GraphLens.getIdentityLens(), InitClassLens.getDefault(), NamingLens.getIdentityLens(), null);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java index 43ba1fb..1428897 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -38,8 +38,8 @@ import com.android.tools.r8.references.FieldReference; import com.android.tools.r8.references.MethodReference; import com.android.tools.r8.references.Reference; -import com.android.tools.r8.retrace.RetraceBase; -import com.android.tools.r8.retrace.RetraceBaseImpl; +import com.android.tools.r8.retrace.RetraceApi; +import com.android.tools.r8.retrace.Retracer; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.BiMapContainer; import com.android.tools.r8.utils.DescriptorUtils; @@ -481,7 +481,7 @@ } } - public RetraceBase retrace() { - return RetraceBaseImpl.create(mapping); + public RetraceApi retrace() { + return Retracer.create(mapping); } }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java index bfcda02..ad9b5c2 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InstructionSubject.java
@@ -6,7 +6,7 @@ import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; -import com.android.tools.r8.retrace.RetraceBase; +import com.android.tools.r8.retrace.RetraceApi; import com.android.tools.r8.retrace.RetraceMethodResult; public interface InstructionSubject { @@ -129,18 +129,17 @@ return lineNumberTable == null ? -1 : lineNumberTable.getLineForInstruction(this); } - default RetraceMethodResult retrace(RetraceBase retraceBase) { + default RetraceMethodResult retrace(RetraceApi retracer) { MethodSubject methodSubject = getMethodSubject(); assert methodSubject.isPresent(); - return retraceBase.retrace(methodSubject.asFoundMethodSubject().asMethodReference()); + return retracer.retrace(methodSubject.asFoundMethodSubject().asMethodReference()); } - default RetraceMethodResult retraceLinePosition(RetraceBase retraceBase) { - return retrace(retraceBase).narrowByLine(getLineNumber()); + default RetraceMethodResult retraceLinePosition(RetraceApi retracer) { + return retrace(retracer).narrowByLine(getLineNumber()); } - default RetraceMethodResult retracePcPosition( - RetraceBase retraceBase, MethodSubject methodSubject) { - return retrace(retraceBase).narrowByLine(getOffset(methodSubject).offset); + default RetraceMethodResult retracePcPosition(RetraceApi retracer, MethodSubject methodSubject) { + return retrace(retracer).narrowByLine(getOffset(methodSubject).offset); } }