Merge commit 'de30207755784daa2e1ededd0de58f26fbabec12' into dev-release
diff --git a/build.gradle b/build.gradle index d157084..9981676 100644 --- a/build.gradle +++ b/build.gradle
@@ -781,6 +781,7 @@ def r8CreateTask(name, baseName, sources, includeSwissArmyKnife) { return tasks.create("r8Create${name}", Jar) { + entryCompression ZipEntryCompression.STORED dependsOn sources from consolidatedLicense.outputs.files from sources.collect { zipTree(it) }
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json index 6893b8f..238f3ee 100644 --- a/src/library_desugar/jdk11/desugar_jdk_libs.json +++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -165,6 +165,16 @@ ], "program_flags": [ { + "api_level_below_or_equal": 32, + "api_level_greater_or_equal": 26, + "covariant_retarget_method": { + "java.time.chrono.IsoEra java.time.LocalDate#getEra()": "java.time.chrono.Era" + }, + "amend_library_method": [ + "public java.time.chrono.IsoEra java.time.LocalDate#getEra()" + ] + }, + { "api_level_below_or_equal": 30, "retarget_method": { "java.time.Instant java.util.Calendar#toInstant()": "java.util.DesugarCalendar",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json b/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json index 730a294..b92af9f 100644 --- a/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json +++ b/src/library_desugar/jdk11/desugar_jdk_libs_legacy.json
@@ -1,14 +1,14 @@ { - "configuration_format_version": 4, + "configuration_format_version": 5, "group_id" : "com.tools.android", "artifact_id" : "desugar_jdk_libs", - "version": "1.2.0-alpha01", + "version": "1.2.0", "required_compilation_api_level": 30, "synthesized_library_classes_package_prefix": "j$.", "support_all_callbacks_from_library": true, "common_flags": [ { - "api_level_below_or_equal": 30, + "api_level_below_or_equal": 10000, "rewrite_prefix": { "java.time.": "j$.time.", "java.util.Desugar": "j$.util.Desugar" @@ -37,20 +37,15 @@ } }, { - "api_level_below_or_equal": 28, + "api_level_below_or_equal": 23, "rewrite_prefix": { - "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics", - "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics", - "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics", - "java.util.Optional": "j$.util.Optional", - "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator", - "java.util.Spliterator": "j$.util.Spliterator", - "java.util.StringJoiner": "j$.util.StringJoiner", - "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap", - "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom", - "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic", - "java.util.function.": "j$.util.function.", - "java.util.stream.": "j$.util.stream." + "java.util.concurrent.atomic.DesugarAtomic": "j$.util.concurrent.atomic.DesugarAtomic" + } + }, + { + "api_level_below_or_equal": 23, + "rewrite_prefix": { + "java.util.function.": "j$.util.function." }, "emulate_interface": { "java.lang.Iterable": "j$.lang.Iterable", @@ -66,7 +61,22 @@ }, "dont_rewrite": [ "java.util.Iterator#remove" - ], + ] + }, + { + "api_level_below_or_equal": 10000, + "rewrite_prefix": { + "java.util.DoubleSummaryStatistics": "j$.util.DoubleSummaryStatistics", + "java.util.IntSummaryStatistics": "j$.util.IntSummaryStatistics", + "java.util.LongSummaryStatistics": "j$.util.LongSummaryStatistics", + "java.util.Optional": "j$.util.Optional", + "java.util.PrimitiveIterator": "j$.util.PrimitiveIterator", + "java.util.Spliterator": "j$.util.Spliterator", + "java.util.StringJoiner": "j$.util.StringJoiner", + "java.util.concurrent.ConcurrentHashMap": "j$.util.concurrent.ConcurrentHashMap", + "java.util.concurrent.ThreadLocalRandom": "j$.util.concurrent.ThreadLocalRandom", + "java.util.stream.": "j$.util.stream." + }, "retarget_lib_member": { "java.util.Arrays#spliterator": "java.util.DesugarArrays", "java.util.Arrays#stream": "java.util.DesugarArrays", @@ -137,7 +147,7 @@ ], "program_flags": [ { - "api_level_below_or_equal": 30, + "api_level_below_or_equal": 10000, "retarget_lib_member": { "java.util.TimeZone#getTimeZone": "java.util.DesugarTimeZone", "java.util.Calendar#toInstant": "java.util.DesugarCalendar", @@ -167,9 +177,10 @@ ], "library_flags": [ { - "api_level_below_or_equal": 30, + "api_level_below_or_equal": 10000, "rewrite_prefix": { "j$.time.": "java.time.", + "java.lang.Desugar": "j$.lang.Desugar", "jdk.internal.": "j$.jdk.internal.", "sun.misc.Desugar": "j$.sun.misc.Desugar", "sun.security.action.": "j$.sun.security.action." @@ -182,7 +193,7 @@ } }, { - "api_level_below_or_equal": 28, + "api_level_below_or_equal": 10000, "rewrite_prefix": { "java.util.AbstractList": "j$.util.AbstractList", "java.util.CollSer": "j$.util.CollSer",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_path.json b/src/library_desugar/jdk11/desugar_jdk_libs_path.json index a61df55..03ca930 100644 --- a/src/library_desugar/jdk11/desugar_jdk_libs_path.json +++ b/src/library_desugar/jdk11/desugar_jdk_libs_path.json
@@ -268,6 +268,16 @@ ], "program_flags": [ { + "api_level_below_or_equal": 32, + "api_level_greater_or_equal": 26, + "covariant_retarget_method": { + "java.time.chrono.IsoEra java.time.LocalDate#getEra()": "java.time.chrono.Era" + }, + "amend_library_method": [ + "public java.time.chrono.IsoEra java.time.LocalDate#getEra()" + ] + }, + { "api_level_below_or_equal": 30, "retarget_method": { "java.time.Instant java.util.Calendar#toInstant()": "java.util.DesugarCalendar",
diff --git a/src/main/java/com/android/tools/r8/CompilationMode.java b/src/main/java/com/android/tools/r8/CompilationMode.java index fb02504..9288a35 100644 --- a/src/main/java/com/android/tools/r8/CompilationMode.java +++ b/src/main/java/com/android/tools/r8/CompilationMode.java
@@ -9,5 +9,13 @@ /** Preserves debugging information during compilation, eg, line-numbers and locals. */ DEBUG, /** Strips debugging information that cannot affect stack traces. */ - RELEASE + RELEASE; + + public boolean isDebug() { + return this == DEBUG; + } + + public boolean isRelease() { + return this == RELEASE; + } }
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java index 7cb5133..9393f4d 100644 --- a/src/main/java/com/android/tools/r8/D8.java +++ b/src/main/java/com/android/tools/r8/D8.java
@@ -281,9 +281,8 @@ Marker.checkCompatibleDesugaredLibrary(markers, options.reporter); InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes()); - NamingLens namingLens = NamingLens.getIdentityLens(); - namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens); - namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens); + appView.setNamingLens(PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView)); + appView.setNamingLens(RecordRewritingNamingLens.createRecordRewritingNamingLens(appView)); if (options.isGeneratingDex() && hasDexResources @@ -294,17 +293,15 @@ // without iterating again the IR. We fall-back to writing one app with rewriting and // merging it with the other app in rewriteNonDexInputs. timing.begin("Rewrite non-dex inputs"); - DexApplication app = - rewriteNonDexInputs( - appView, inputApp, options, executor, timing, appView.appInfo().app(), namingLens); + DexApplication app = rewriteNonDexInputs(appView, inputApp, executor, timing); timing.end(); appView.setAppInfo( new AppInfo( appView.appInfo().getSyntheticItems().commit(app), appView.appInfo().getMainDexInfo())); - namingLens = NamingLens.getIdentityLens(); + appView.setNamingLens(NamingLens.getIdentityLens()); } else if (options.isGeneratingDex() && hasDexResources) { - namingLens = NamingLens.getIdentityLens(); + appView.setNamingLens(NamingLens.getIdentityLens()); } // Since tracing is not lens aware, this needs to be done prior to synthetic finalization @@ -322,21 +319,16 @@ HorizontalClassMerger.createForD8ClassMerging(appView).runIfNecessary(executor, timing); - new GenericSignatureRewriter(appView, namingLens) - .runForD8(appView.appInfo().classes(), executor); - new KotlinMetadataRewriter(appView, namingLens).runForD8(executor); + new GenericSignatureRewriter(appView).runForD8(appView.appInfo().classes(), executor); + new KotlinMetadataRewriter(appView).runForD8(executor); if (options.isGeneratingClassFiles()) { - new CfApplicationWriter(appView, marker, namingLens) - .write(options.getClassFileConsumer(), inputApp); + new CfApplicationWriter(appView, marker).write(options.getClassFileConsumer(), inputApp); } else { if (options.apiModelingOptions().enableStubbingOfClasses) { new ApiReferenceStubber(appView).run(executor); } - new ApplicationWriter( - appView, - marker == null ? null : ImmutableList.copyOf(markers), - namingLens) + new ApplicationWriter(appView, marker == null ? null : ImmutableList.copyOf(markers)) .write(executor, inputApp); } options.printWarnings(); @@ -357,13 +349,7 @@ } private static DexApplication rewriteNonDexInputs( - AppView<AppInfo> appView, - AndroidApp inputApp, - InternalOptions options, - ExecutorService executor, - Timing timing, - DexApplication app, - NamingLens desugaringLens) + AppView<AppInfo> appView, AndroidApp inputApp, ExecutorService executor, Timing timing) throws IOException, ExecutionException { // TODO(b/154575955): Remove the naming lens in D8. appView @@ -376,33 +362,33 @@ + " dex the class file inputs and dex merging only dex files.")); List<DexProgramClass> dexProgramClasses = new ArrayList<>(); List<DexProgramClass> nonDexProgramClasses = new ArrayList<>(); - for (DexProgramClass aClass : app.classes()) { + for (DexProgramClass aClass : appView.appInfo().classes()) { if (aClass.originatesFromDexResource()) { dexProgramClasses.add(aClass); } else { nonDexProgramClasses.add(aClass); } } - DexApplication cfApp = app.builder().replaceProgramClasses(nonDexProgramClasses).build(); + DexApplication cfApp = + appView.app().builder().replaceProgramClasses(nonDexProgramClasses).build(); appView.setAppInfo( new AppInfo( appView.appInfo().getSyntheticItems().commit(cfApp), appView.appInfo().getMainDexInfo())); ConvertedCfFiles convertedCfFiles = new ConvertedCfFiles(); - new GenericSignatureRewriter(appView, desugaringLens) - .run(appView.appInfo().classes(), executor); - new KotlinMetadataRewriter(appView, desugaringLens).runForD8(executor); + new GenericSignatureRewriter(appView).run(appView.appInfo().classes(), executor); + new KotlinMetadataRewriter(appView).runForD8(executor); new ApplicationWriter( appView, null, - desugaringLens, convertedCfFiles) .write(executor); AndroidApp.Builder builder = AndroidApp.builder(inputApp); builder.getProgramResourceProviders().clear(); builder.addProgramResourceProvider(convertedCfFiles); AndroidApp newAndroidApp = builder.build(); - DexApplication newApp = new ApplicationReader(newAndroidApp, options, timing).read(executor); + DexApplication newApp = + new ApplicationReader(newAndroidApp, appView.options(), timing).read(executor); DexApplication.Builder<?> finalDexApp = newApp.builder(); for (DexProgramClass dexProgramClass : dexProgramClasses) { finalDexApp.addProgramClass(dexProgramClass);
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java index c158fc8..1495071 100644 --- a/src/main/java/com/android/tools/r8/D8Command.java +++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -92,6 +92,7 @@ private boolean minimalMainDex = false; private boolean skipDump = false; private final List<ProguardConfigurationSource> mainDexRules = new ArrayList<>(); + private boolean enableMissingLibraryApiModeling = false; private Builder() { this(new DefaultD8DiagnosticsHandler()); @@ -322,6 +323,18 @@ return self(); } + /** + * Enable experimental/pre-release support for modeling missing library APIs. + * + * <p>This allows enabling the feature while it is still default disabled by the compiler. Once + * the feature is default enabled, calling this method will have no affect. + */ + @Deprecated + public Builder setEnableExperimentalMissingLibraryApiModeling(boolean enable) { + this.enableMissingLibraryApiModeling = enable; + return self(); + } + @Override void validate() { if (isPrintHelp()) { @@ -411,6 +424,7 @@ getDumpInputFlags(), getMapIdProvider(), proguardMapConsumer, + enableMissingLibraryApiModeling, factory); } } @@ -426,6 +440,7 @@ private final boolean minimalMainDex; private final ImmutableList<ProguardConfigurationRule> mainDexKeepRules; private final StringConsumer proguardMapConsumer; + private final boolean enableMissingLibraryApiModeling; private final DexItemFactory factory; public static Builder builder() { @@ -500,6 +515,7 @@ DumpInputFlags dumpInputFlags, MapIdProvider mapIdProvider, StringConsumer proguardMapConsumer, + boolean enableMissingLibraryApiModeling, DexItemFactory factory) { super( inputApp, @@ -529,6 +545,7 @@ this.minimalMainDex = minimalMainDex; this.mainDexKeepRules = mainDexKeepRules; this.proguardMapConsumer = proguardMapConsumer; + this.enableMissingLibraryApiModeling = enableMissingLibraryApiModeling; this.factory = factory; } @@ -545,6 +562,7 @@ minimalMainDex = false; mainDexKeepRules = null; proguardMapConsumer = null; + enableMissingLibraryApiModeling = false; factory = null; } @@ -602,6 +620,11 @@ internal.synthesizedClassPrefix = synthesizedClassPrefix; internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer; + if (!enableMissingLibraryApiModeling) { + internal.apiModelingOptions().disableApiCallerIdentification(); + internal.apiModelingOptions().disableMissingApiModeling(); + } + // Default is to remove all javac generated assertion code when generating dex. assert internal.assertionsConfiguration == null; internal.assertionsConfiguration =
diff --git a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java index f6149c8..b8163c7 100644 --- a/src/main/java/com/android/tools/r8/DexFileMergerHelper.java +++ b/src/main/java/com/android/tools/r8/DexFileMergerHelper.java
@@ -13,7 +13,6 @@ 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.naming.NamingLens; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.ExceptionUtils; @@ -103,11 +102,7 @@ List<Marker> markers = appView.dexItemFactory().extractMarkers(); assert !options.hasMethodsFilter(); - ApplicationWriter writer = - new ApplicationWriter( - appView, - markers, - NamingLens.getIdentityLens()); + ApplicationWriter writer = new ApplicationWriter(appView, markers); writer.write(executor); options.printWarnings(); } catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java index b90b736..43b8e9a 100644 --- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java +++ b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
@@ -16,7 +16,6 @@ import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.LazyLoadedDexApplication; import com.android.tools.r8.naming.ClassNameMapper; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.MainDexInfo; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.ExceptionUtils; @@ -113,7 +112,6 @@ new ApplicationWriter( appView, markers, - NamingLens.getIdentityLens(), consumer) .write(executor); options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java index 417fb63..27bdafd 100644 --- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java +++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -38,7 +38,6 @@ import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser; import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification; import com.android.tools.r8.jar.CfApplicationWriter; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.AndroidApiLevel; @@ -348,11 +347,7 @@ AppView.createForD8( AppInfo.createInitialAppInfo( builder.build(), GlobalSyntheticsStrategy.forNonSynthesizing())); - CfApplicationWriter writer = - new CfApplicationWriter( - appView, - options.getMarker(Tool.L8), - NamingLens.getIdentityLens()); + CfApplicationWriter writer = new CfApplicationWriter(appView, options.getMarker(Tool.L8)); ClassFileConsumer consumer = new ClassFileConsumer.ArchiveConsumer( lintFile(compilationApiLevel, minApiLevel, FileUtils.JAR_EXTENSION));
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java index 8a8769a..f8d95ab 100644 --- a/src/main/java/com/android/tools/r8/L8.java +++ b/src/main/java/com/android/tools/r8/L8.java
@@ -15,7 +15,6 @@ import com.android.tools.r8.ir.desugar.TypeRewriter; import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibraryAmender; import com.android.tools.r8.jar.CfApplicationWriter; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.PrefixRewritingNamingLens; import com.android.tools.r8.naming.signature.GenericSignatureRewriter; import com.android.tools.r8.origin.CommandLineOrigin; @@ -143,10 +142,10 @@ SyntheticFinalization.finalize(appView, executor); - NamingLens namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView); - new GenericSignatureRewriter(appView, namingLens).run(appView.appInfo().classes(), executor); + appView.setNamingLens(PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView)); + new GenericSignatureRewriter(appView).run(appView.appInfo().classes(), executor); - new CfApplicationWriter(appView, options.getMarker(Tool.L8), namingLens) + new CfApplicationWriter(appView, options.getMarker(Tool.L8)) .write(options.getClassFileConsumer()); options.printWarnings(); } catch (ExecutionException e) {
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java index 6c8f251..2b50253 100644 --- a/src/main/java/com/android/tools/r8/L8Command.java +++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -213,6 +213,8 @@ // Disable global optimizations. internal.disableGlobalOptimizations(); + internal.apiModelingOptions().disableApiCallerIdentification(); + internal.apiModelingOptions().disableMissingApiModeling(); internal.setDumpInputFlags(getDumpInputFlags(), false); internal.dumpOptions = dumpOptions();
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java index 25a91e7..5d07a1c 100644 --- a/src/main/java/com/android/tools/r8/R8.java +++ b/src/main/java/com/android/tools/r8/R8.java
@@ -63,7 +63,6 @@ import com.android.tools.r8.kotlin.KotlinMetadataRewriter; import com.android.tools.r8.kotlin.KotlinMetadataUtils; import com.android.tools.r8.naming.Minifier; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.PrefixRewritingNamingLens; import com.android.tools.r8.naming.ProguardMapMinifier; import com.android.tools.r8.naming.RecordRewritingNamingLens; @@ -208,29 +207,24 @@ } static void writeApplication( - ExecutorService executorService, - AppView<?> appView, - NamingLens namingLens, - InternalOptions options, - AndroidApp inputApp) + AppView<?> appView, AndroidApp inputApp, ExecutorService executorService) throws ExecutionException { + InternalOptions options = appView.options(); InspectorImpl.runInspections(options.outputInspections, appView.appInfo().classes()); try { Marker marker = options.getMarker(Tool.R8); assert marker != null; // Get the markers from the input which are different from the one created for this // compilation - Set<Marker> markers = new HashSet<>(options.itemFactory.extractMarkers()); + Set<Marker> markers = new HashSet<>(appView.dexItemFactory().extractMarkers()); markers.remove(marker); if (options.isGeneratingClassFiles()) { - new CfApplicationWriter(appView, marker, namingLens) - .write(options.getClassFileConsumer(), inputApp); + new CfApplicationWriter(appView, marker).write(options.getClassFileConsumer(), inputApp); } else { new ApplicationWriter( appView, // Ensure that the marker for this compilation is the first in the list. - ImmutableList.<Marker>builder().add(marker).addAll(markers).build(), - namingLens) + ImmutableList.<Marker>builder().add(marker).addAll(markers).build()) .write(executorService, inputApp); } } catch (IOException e) { @@ -431,7 +425,7 @@ annotationRemoverBuilder .build(appViewWithLiveness, removedClasses); annotationRemover.ensureValid().run(executorService); - new GenericSignatureRewriter(appView, NamingLens.getIdentityLens(), genericContextBuilder) + new GenericSignatureRewriter(appView, genericContextBuilder) .run(appView.appInfo().classes(), executorService); assert appView.checkForTesting(() -> allReferencesAssignedApiLevel(appViewWithLiveness)); @@ -650,8 +644,7 @@ AnnotationRemover.builder(Mode.FINAL_TREE_SHAKING) .build(appView.withLiveness(), removedClasses) .run(executorService); - new GenericSignatureRewriter( - appView, NamingLens.getIdentityLens(), genericContextBuilder) + new GenericSignatureRewriter(appView, genericContextBuilder) .run(appView.appInfo().classes(), executorService); assert appView.checkForTesting( () -> @@ -761,19 +754,17 @@ : null); // Perform minification. - NamingLens namingLens; if (options.getProguardConfiguration().hasApplyMappingFile()) { timing.begin("apply-mapping"); - namingLens = new ProguardMapMinifier(appView.withLiveness()).run(executorService, timing); + appView.setNamingLens( + new ProguardMapMinifier(appView.withLiveness()).run(executorService, timing)); timing.end(); // Clear the applymapping data appView.clearApplyMappingSeedMapper(); } else if (options.isMinifying()) { timing.begin("Minification"); - namingLens = new Minifier(appView.withLiveness()).run(executorService, timing); + appView.setNamingLens(new Minifier(appView.withLiveness()).run(executorService, timing)); timing.end(); - } else { - namingLens = NamingLens.getIdentityLens(); } assert verifyMovedMethodsHaveOriginalMethodPosition(appView, getDirectApp(appView)); @@ -808,16 +799,16 @@ options.syntheticProguardRulesConsumer.accept(synthesizedProguardRules); } - namingLens = PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView, namingLens); - namingLens = RecordRewritingNamingLens.createRecordRewritingNamingLens(appView, namingLens); + appView.setNamingLens(PrefixRewritingNamingLens.createPrefixRewritingNamingLens(appView)); + appView.setNamingLens(RecordRewritingNamingLens.createRecordRewritingNamingLens(appView)); new ApiReferenceStubber(appView).run(executorService); timing.begin("MinifyKotlinMetadata"); - new KotlinMetadataRewriter(appView, namingLens).runForR8(executorService); + new KotlinMetadataRewriter(appView).runForR8(executorService); timing.end(); - new GenericSignatureRewriter(appView, namingLens, genericContextBuilderBeforeFinalMerging) + new GenericSignatureRewriter(appView, genericContextBuilderBeforeFinalMerging) .run(appView.appInfo().classes(), executorService); assert appView.checkForTesting( @@ -829,15 +820,10 @@ .isValid()) : "Could not validate generic signatures"; - new DesugaredLibraryKeepRuleGenerator(appView, namingLens).runIfNecessary(timing); + new DesugaredLibraryKeepRuleGenerator(appView).runIfNecessary(timing); // Generate the resulting application resources. - writeApplication( - executorService, - appView, - namingLens, - options, - inputApp); + writeApplication(appView, inputApp, executorService); assert appView.getDontWarnConfiguration().validate(options);
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java index 4e3e190..4e7ca32 100644 --- a/src/main/java/com/android/tools/r8/R8Command.java +++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -114,6 +114,7 @@ private final List<FeatureSplit> featureSplits = new ArrayList<>(); private String synthesizedClassPrefix = ""; private boolean skipDump = false; + private boolean enableMissingLibraryApiModeling = false; private boolean allowTestProguardOptions = System.getProperty("com.android.tools.r8.allowTestProguardOptions") != null; @@ -431,6 +432,18 @@ return self(); } + /** + * Enable experimental/pre-release support for modeling missing library APIs. + * + * <p>This allows enabling the feature while it is still default disabled by the compiler. Once + * the feature is default enabled, calling this method will have no affect. + */ + @Deprecated + public Builder setEnableExperimentalMissingLibraryApiModeling(boolean enable) { + this.enableMissingLibraryApiModeling = enable; + return self(); + } + @Override protected InternalProgramOutputPathConsumer createProgramOutputConsumer( Path path, @@ -619,7 +632,8 @@ getThreadCount(), getDumpInputFlags(), getMapIdProvider(), - getSourceFileProvider()); + getSourceFileProvider(), + enableMissingLibraryApiModeling); if (inputDependencyGraphConsumer != null) { inputDependencyGraphConsumer.finished(); @@ -704,6 +718,7 @@ private final FeatureSplitConfiguration featureSplitConfiguration; private final String synthesizedClassPrefix; private final boolean skipDump; + private final boolean enableMissingLibraryApiModeling; /** Get a new {@link R8Command.Builder}. */ public static Builder builder() { @@ -792,7 +807,8 @@ int threadCount, DumpInputFlags dumpInputFlags, MapIdProvider mapIdProvider, - SourceFileProvider sourceFileProvider) { + SourceFileProvider sourceFileProvider, + boolean enableMissingLibraryApiModeling) { super( inputApp, mode, @@ -831,6 +847,7 @@ this.featureSplitConfiguration = featureSplitConfiguration; this.synthesizedClassPrefix = synthesizedClassPrefix; this.skipDump = skipDump; + this.enableMissingLibraryApiModeling = enableMissingLibraryApiModeling; } private R8Command(boolean printHelp, boolean printVersion) { @@ -854,6 +871,7 @@ featureSplitConfiguration = null; synthesizedClassPrefix = null; skipDump = false; + enableMissingLibraryApiModeling = false; } public DexItemFactory getDexItemFactory() { @@ -960,6 +978,10 @@ internal.outputInspections = InspectorImpl.wrapInspections(getOutputInspections()); + if (!enableMissingLibraryApiModeling) { + internal.apiModelingOptions().disableMissingApiModeling(); + } + // Default is to remove all javac generated assertion code when generating dex. assert internal.assertionsConfiguration == null; AssertionsConfiguration.Builder builder = AssertionsConfiguration.builder(getReporter());
diff --git a/src/main/java/com/android/tools/r8/ResourceShrinker.java b/src/main/java/com/android/tools/r8/ResourceShrinker.java index bf40d89..b5ab2b6 100644 --- a/src/main/java/com/android/tools/r8/ResourceShrinker.java +++ b/src/main/java/com/android/tools/r8/ResourceShrinker.java
@@ -3,38 +3,38 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8; -import com.android.tools.r8.code.Const; -import com.android.tools.r8.code.Const16; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstHigh16; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstStringJumbo; -import com.android.tools.r8.code.ConstWide16; -import com.android.tools.r8.code.ConstWide32; -import com.android.tools.r8.code.FillArrayData; -import com.android.tools.r8.code.FillArrayDataPayload; -import com.android.tools.r8.code.Format35c; -import com.android.tools.r8.code.Format3rc; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeDirectRange; -import com.android.tools.r8.code.InvokeInterface; -import com.android.tools.r8.code.InvokeInterfaceRange; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeStaticRange; -import com.android.tools.r8.code.InvokeSuper; -import com.android.tools.r8.code.InvokeSuperRange; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.InvokeVirtualRange; -import com.android.tools.r8.code.NewArray; -import com.android.tools.r8.code.Sget; -import com.android.tools.r8.code.SgetBoolean; -import com.android.tools.r8.code.SgetByte; -import com.android.tools.r8.code.SgetChar; -import com.android.tools.r8.code.SgetObject; -import com.android.tools.r8.code.SgetShort; -import com.android.tools.r8.code.SgetWide; import com.android.tools.r8.dex.ApplicationReader; +import com.android.tools.r8.dex.code.DexConst; +import com.android.tools.r8.dex.code.DexConst16; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstHigh16; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstStringJumbo; +import com.android.tools.r8.dex.code.DexConstWide16; +import com.android.tools.r8.dex.code.DexConstWide32; +import com.android.tools.r8.dex.code.DexFillArrayData; +import com.android.tools.r8.dex.code.DexFillArrayDataPayload; +import com.android.tools.r8.dex.code.DexFormat35c; +import com.android.tools.r8.dex.code.DexFormat3rc; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeDirectRange; +import com.android.tools.r8.dex.code.DexInvokeInterface; +import com.android.tools.r8.dex.code.DexInvokeInterfaceRange; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; +import com.android.tools.r8.dex.code.DexInvokeSuper; +import com.android.tools.r8.dex.code.DexInvokeSuperRange; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; +import com.android.tools.r8.dex.code.DexNewArray; +import com.android.tools.r8.dex.code.DexSget; +import com.android.tools.r8.dex.code.DexSgetBoolean; +import com.android.tools.r8.dex.code.DexSgetByte; +import com.android.tools.r8.dex.code.DexSgetChar; +import com.android.tools.r8.dex.code.DexSgetObject; +import com.android.tools.r8.dex.code.DexSgetShort; +import com.android.tools.r8.dex.code.DexSgetWide; import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexAnnotation; import com.android.tools.r8.graph.DexAnnotationElement; @@ -219,12 +219,12 @@ final Set<Integer> methodIntArrayPayloadOffsets = Sets.newHashSet(); // First we collect payloads, and then we process them because payload can be before the // fill-array-data instruction referencing it. - final List<FillArrayDataPayload> payloads = Lists.newArrayList(); + final List<DexFillArrayDataPayload> payloads = Lists.newArrayList(); - Instruction[] instructions = implementation.asDexCode().instructions; + DexInstruction[] instructions = implementation.asDexCode().instructions; int current = 0; while (current < instructions.length) { - Instruction instruction = instructions[current]; + DexInstruction instruction = instructions[current]; if (isIntConstInstruction(instruction)) { processIntConstInstruction(instruction); } else if (isStringConstInstruction(instruction)) { @@ -235,15 +235,15 @@ processInvokeInstruction(instruction); } else if (isInvokeRangeInstruction(instruction)) { processInvokeRangeInstruction(instruction); - } else if (instruction instanceof FillArrayData) { + } else if (instruction instanceof DexFillArrayData) { processFillArray(instructions, current, methodIntArrayPayloadOffsets); - } else if (instruction instanceof FillArrayDataPayload) { - payloads.add((FillArrayDataPayload) instruction); + } else if (instruction instanceof DexFillArrayDataPayload) { + payloads.add((DexFillArrayDataPayload) instruction); } current++; } - for (FillArrayDataPayload payload : payloads) { + for (DexFillArrayDataPayload payload : payloads) { if (isIntArrayPayload(payload, methodIntArrayPayloadOffsets)) { processIntArrayPayload(payload); } @@ -272,8 +272,8 @@ }); } - private void processIntArrayPayload(Instruction instruction) { - FillArrayDataPayload payload = (FillArrayDataPayload) instruction; + private void processIntArrayPayload(DexInstruction instruction) { + DexFillArrayDataPayload payload = (DexFillArrayDataPayload) instruction; for (int i = 0; i < payload.data.length / 2; i++) { int intValue = payload.data[2 * i + 1] << 16 | payload.data[2 * i]; @@ -282,20 +282,20 @@ } private boolean isIntArrayPayload( - Instruction instruction, Set<Integer> methodIntArrayPayloadOffsets) { - if (!(instruction instanceof FillArrayDataPayload)) { + DexInstruction instruction, Set<Integer> methodIntArrayPayloadOffsets) { + if (!(instruction instanceof DexFillArrayDataPayload)) { return false; } - FillArrayDataPayload payload = (FillArrayDataPayload) instruction; + DexFillArrayDataPayload payload = (DexFillArrayDataPayload) instruction; return methodIntArrayPayloadOffsets.contains(payload.getOffset()); } private void processFillArray( - Instruction[] instructions, int current, Set<Integer> methodIntArrayPayloadOffsets) { - FillArrayData fillArrayData = (FillArrayData) instructions[current]; - if (current > 0 && instructions[current - 1] instanceof NewArray) { - NewArray newArray = (NewArray) instructions[current - 1]; + DexInstruction[] instructions, int current, Set<Integer> methodIntArrayPayloadOffsets) { + DexFillArrayData fillArrayData = (DexFillArrayData) instructions[current]; + if (current > 0 && instructions[current - 1] instanceof DexNewArray) { + DexNewArray newArray = (DexNewArray) instructions[current - 1]; if (!Objects.equals(newArray.getType().descriptor.toString(), "[I")) { return; } @@ -334,17 +334,17 @@ } } - private boolean isIntConstInstruction(Instruction instruction) { + private boolean isIntConstInstruction(DexInstruction instruction) { int opcode = instruction.getOpcode(); - return opcode == Const4.OPCODE - || opcode == Const16.OPCODE - || opcode == Const.OPCODE - || opcode == ConstWide32.OPCODE - || opcode == ConstHigh16.OPCODE - || opcode == ConstWide16.OPCODE; + return opcode == DexConst4.OPCODE + || opcode == DexConst16.OPCODE + || opcode == DexConst.OPCODE + || opcode == DexConstWide32.OPCODE + || opcode == DexConstHigh16.OPCODE + || opcode == DexConstWide16.OPCODE; } - private void processIntConstInstruction(Instruction instruction) { + private void processIntConstInstruction(DexInstruction instruction) { assert isIntConstInstruction(instruction); int constantValue; @@ -365,20 +365,20 @@ callback.referencedInt(constantValue); } - private boolean isStringConstInstruction(Instruction instruction) { + private boolean isStringConstInstruction(DexInstruction instruction) { int opcode = instruction.getOpcode(); - return opcode == ConstString.OPCODE || opcode == ConstStringJumbo.OPCODE; + return opcode == DexConstString.OPCODE || opcode == DexConstStringJumbo.OPCODE; } - private void processStringConstantInstruction(Instruction instruction) { + private void processStringConstantInstruction(DexInstruction instruction) { assert isStringConstInstruction(instruction); String constantValue; - if (instruction instanceof ConstString) { - ConstString constString = (ConstString) instruction; + if (instruction instanceof DexConstString) { + DexConstString constString = (DexConstString) instruction; constantValue = constString.getString().toString(); - } else if (instruction instanceof ConstStringJumbo) { - ConstStringJumbo constStringJumbo = (ConstStringJumbo) instruction; + } else if (instruction instanceof DexConstStringJumbo) { + DexConstStringJumbo constStringJumbo = (DexConstStringJumbo) instruction; constantValue = constStringJumbo.getString().toString(); } else { throw new AssertionError("Not a string constant instruction."); @@ -387,41 +387,41 @@ callback.referencedString(constantValue); } - private boolean isGetStatic(Instruction instruction) { + private boolean isGetStatic(DexInstruction instruction) { int opcode = instruction.getOpcode(); - return opcode == Sget.OPCODE - || opcode == SgetBoolean.OPCODE - || opcode == SgetByte.OPCODE - || opcode == SgetChar.OPCODE - || opcode == SgetObject.OPCODE - || opcode == SgetShort.OPCODE - || opcode == SgetWide.OPCODE; + return opcode == DexSget.OPCODE + || opcode == DexSgetBoolean.OPCODE + || opcode == DexSgetByte.OPCODE + || opcode == DexSgetChar.OPCODE + || opcode == DexSgetObject.OPCODE + || opcode == DexSgetShort.OPCODE + || opcode == DexSgetWide.OPCODE; } - private void processGetStatic(Instruction instruction) { + private void processGetStatic(DexInstruction instruction) { assert isGetStatic(instruction); DexField field; - if (instruction instanceof Sget) { - Sget sget = (Sget) instruction; + if (instruction instanceof DexSget) { + DexSget sget = (DexSget) instruction; field = sget.getField(); - } else if (instruction instanceof SgetBoolean) { - SgetBoolean sgetBoolean = (SgetBoolean) instruction; + } else if (instruction instanceof DexSgetBoolean) { + DexSgetBoolean sgetBoolean = (DexSgetBoolean) instruction; field = sgetBoolean.getField(); - } else if (instruction instanceof SgetByte) { - SgetByte sgetByte = (SgetByte) instruction; + } else if (instruction instanceof DexSgetByte) { + DexSgetByte sgetByte = (DexSgetByte) instruction; field = sgetByte.getField(); - } else if (instruction instanceof SgetChar) { - SgetChar sgetChar = (SgetChar) instruction; + } else if (instruction instanceof DexSgetChar) { + DexSgetChar sgetChar = (DexSgetChar) instruction; field = sgetChar.getField(); - } else if (instruction instanceof SgetObject) { - SgetObject sgetObject = (SgetObject) instruction; + } else if (instruction instanceof DexSgetObject) { + DexSgetObject sgetObject = (DexSgetObject) instruction; field = sgetObject.getField(); - } else if (instruction instanceof SgetShort) { - SgetShort sgetShort = (SgetShort) instruction; + } else if (instruction instanceof DexSgetShort) { + DexSgetShort sgetShort = (DexSgetShort) instruction; field = sgetShort.getField(); - } else if (instruction instanceof SgetWide) { - SgetWide sgetWide = (SgetWide) instruction; + } else if (instruction instanceof DexSgetWide) { + DexSgetWide sgetWide = (DexSgetWide) instruction; field = sgetWide.getField(); } else { throw new AssertionError("Not a get static instruction"); @@ -430,19 +430,19 @@ callback.referencedStaticField(field.holder.getInternalName(), field.name.toString()); } - private boolean isInvokeInstruction(Instruction instruction) { + private boolean isInvokeInstruction(DexInstruction instruction) { int opcode = instruction.getOpcode(); - return opcode == InvokeVirtual.OPCODE - || opcode == InvokeSuper.OPCODE - || opcode == InvokeDirect.OPCODE - || opcode == InvokeStatic.OPCODE - || opcode == InvokeInterface.OPCODE; + return opcode == DexInvokeVirtual.OPCODE + || opcode == DexInvokeSuper.OPCODE + || opcode == DexInvokeDirect.OPCODE + || opcode == DexInvokeStatic.OPCODE + || opcode == DexInvokeInterface.OPCODE; } - private void processInvokeInstruction(Instruction instruction) { + private void processInvokeInstruction(DexInstruction instruction) { assert isInvokeInstruction(instruction); - Format35c ins35c = (Format35c) instruction; + DexFormat35c ins35c = (DexFormat35c) instruction; DexMethod method = (DexMethod) ins35c.BBBB; callback.referencedMethod( @@ -451,19 +451,19 @@ method.proto.toDescriptorString()); } - private boolean isInvokeRangeInstruction(Instruction instruction) { + private boolean isInvokeRangeInstruction(DexInstruction instruction) { int opcode = instruction.getOpcode(); - return opcode == InvokeVirtualRange.OPCODE - || opcode == InvokeSuperRange.OPCODE - || opcode == InvokeDirectRange.OPCODE - || opcode == InvokeStaticRange.OPCODE - || opcode == InvokeInterfaceRange.OPCODE; + return opcode == DexInvokeVirtualRange.OPCODE + || opcode == DexInvokeSuperRange.OPCODE + || opcode == DexInvokeDirectRange.OPCODE + || opcode == DexInvokeStaticRange.OPCODE + || opcode == DexInvokeInterfaceRange.OPCODE; } - private void processInvokeRangeInstruction(Instruction instruction) { + private void processInvokeRangeInstruction(DexInstruction instruction) { assert isInvokeRangeInstruction(instruction); - Format3rc ins3rc = (Format3rc) instruction; + DexFormat3rc ins3rc = (DexFormat3rc) instruction; DexMethod method = (DexMethod) ins3rc.BBBB; callback.referencedMethod(
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiDataAccess.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiDataAccess.java index 37acc4d..0539dcf 100644 --- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiDataAccess.java +++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiDataAccess.java
@@ -5,15 +5,29 @@ package com.android.tools.r8.androidapi; import static com.android.tools.r8.lightir.ByteUtils.unsetBitAtIndex; +import static com.android.tools.r8.utils.ZipUtils.getOffsetOfResourceInZip; +import com.android.tools.r8.DiagnosticsHandler; +import com.android.tools.r8.dex.CompatByteBuffer; import com.android.tools.r8.errors.CompilationError; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.DexString; +import com.android.tools.r8.utils.ExceptionDiagnostic; +import com.android.tools.r8.utils.InternalOptions; +import com.android.tools.r8.utils.StringDiagnostic; import com.google.common.io.ByteStreams; import com.google.common.primitives.Ints; +import java.io.File; import java.io.IOException; import java.io.InputStream; +import java.net.JarURLConnection; import java.net.URL; +import java.nio.MappedByteBuffer; +import java.nio.channels.FileChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; import java.util.function.BiPredicate; /** @@ -30,9 +44,13 @@ private static final int PAYLOAD_OFFSET_WITH_LENGTH = 4 + 2; private static final byte ZERO_BYTE = (byte) 0; + public static boolean isApiDatabaseEntry(String entry) { + return RESOURCE_NAME.equals(entry); + } + private static class PositionAndLength { - private static PositionAndLength EMPTY = new PositionAndLength(0, 0); + private static final PositionAndLength EMPTY = new PositionAndLength(0, 0); private final int position; private final int length; @@ -46,7 +64,7 @@ if (position == 0 && length == 0) { return EMPTY; } - if ((position < 0 && length != 0) || (position > 0 && length == 0)) { + if ((position < 0 && length > 0) || (position > 0 && length == 0)) { assert false : "Unexpected position and length"; return EMPTY; } @@ -70,6 +88,61 @@ } } + public static AndroidApiDataAccess create( + InternalOptions options, DiagnosticsHandler diagnosticsHandler) { + URL resource = AndroidApiDataAccess.class.getClassLoader().getResource(RESOURCE_NAME); + if (resource == null) { + throw new CompilationError("Could not find the api database at " + RESOURCE_NAME); + } + if (options.apiModelingOptions().useMemoryMappedByteBuffer) { + try { + // The resource is encoded as protocol and a path, where we should have one of either: + // protocol: file, path: <path-to-file> + // protocol: jar, path: file:<path-to-jar>!/<resource-name-in-jar> + if (resource.getProtocol().equals("file")) { + return getDataAccessFromPathAndOffset(Paths.get(resource.toURI()), 0); + } else if (resource.getProtocol().equals("jar") && resource.getPath().startsWith("file:")) { + // The path is on form 'file:<path-to-jar>!/<resource-name-in-jar> + JarURLConnection jarUrl = (JarURLConnection) resource.openConnection(); + File jarFile = new File(jarUrl.getJarFileURL().getFile()); + String databaseEntry = jarUrl.getEntryName(); + long offsetInJar = getOffsetOfResourceInZip(jarFile, databaseEntry); + if (offsetInJar > 0) { + return getDataAccessFromPathAndOffset(jarFile.toPath(), offsetInJar); + } + } + // On older DEX platforms creating a new byte channel may fail: + // Error: java.lang.NoSuchMethodError: No static method newByteChannel(Ljava/nio/file/Path; + // [Ljava/nio/file/OpenOption;)Ljava/nio/channels/SeekableByteChannel; + // in class Ljava/nio/file/Files + } catch (Exception | NoSuchMethodError e) { + diagnosticsHandler.warning(new ExceptionDiagnostic(e)); + } + diagnosticsHandler.warning( + new StringDiagnostic( + "Unable to use a memory mapped byte buffer to access the api database. Falling back" + + " to loading the database into program which requires more memory")); + } + try (InputStream apiInputStream = + AndroidApiDataAccess.class.getClassLoader().getResourceAsStream(RESOURCE_NAME)) { + if (apiInputStream == null) { + throw new CompilationError("Could not find the api database at: " + resource); + } + return new AndroidApiDataAccessInMemory(ByteStreams.toByteArray(apiInputStream)); + } catch (IOException e) { + throw new CompilationError("Could not read the api database.", e); + } + } + + private static AndroidApiDataAccessByteMapped getDataAccessFromPathAndOffset( + Path path, long offset) throws IOException { + FileChannel fileChannel = (FileChannel) Files.newByteChannel(path, StandardOpenOption.READ); + MappedByteBuffer mappedByteBuffer = + fileChannel.map(FileChannel.MapMode.READ_ONLY, offset, fileChannel.size() - offset); + // Ensure that we can run on JDK 8 by using the CompatByteBuffer. + return new AndroidApiDataAccessByteMapped(new CompatByteBuffer(mappedByteBuffer)); + } + public static int entrySizeInBitsForConstantPoolMap() { return ENTRY_SIZE_IN_BITS_FOR_CONSTANT_POOL_MAP; } @@ -102,25 +175,44 @@ return PAYLOAD_OFFSET_WITH_LENGTH; } - static int constantPoolOffset() { + /** The start of the constant pool */ + public static int constantPoolOffset() { return 4; } - static int constantPoolHashMapOffset(int constantPoolSize) { + /** The start of the constant pool hash map. */ + public static int constantPoolHashMapOffset(int constantPoolSize) { return (constantPoolSize * constantPoolEntrySize()) + constantPoolOffset(); } - static int apiLevelHashMapOffset(int constantPoolSize) { + /** The start of the api level hash map. */ + public static int apiLevelHashMapOffset(int constantPoolSize) { int constantPoolHashMapSize = (1 << entrySizeInBitsForConstantPoolMap()) * constantPoolMapEntrySize(); return constantPoolHashMapOffset(constantPoolSize) + constantPoolHashMapSize; } - static int payloadOffset(int constantPoolSize) { + /** The start of the payload section. */ + public static int payloadOffset(int constantPoolSize) { int apiLevelSize = (1 << entrySizeInBitsForApiLevelMap()) * apiLevelHashMapEntrySize(); return apiLevelHashMapOffset(constantPoolSize) + apiLevelSize; } + /** The actual byte index of the constant pool index. */ + public int constantPoolIndexOffset(int index) { + return constantPoolOffset() + (index * constantPoolEntrySize()); + } + + /** The actual byte index of the constant pool hash key. */ + protected int constantPoolHashMapIndexOffset(int hash) { + return constantPoolHashMapOffset(getConstantPoolSize()) + (hash * constantPoolMapEntrySize()); + } + + /** The actual byte index of the api hash key. */ + protected int apiLevelHashMapIndexOffset(int hash) { + return apiLevelHashMapOffset(getConstantPoolSize()) + (hash * apiLevelHashMapEntrySize()); + } + static int readIntFromOffset(byte[] data, int offset) { return Ints.fromBytes(data[offset], data[offset + 1], data[offset + 2], data[offset + 3]); } @@ -133,11 +225,7 @@ abstract int readConstantPoolSize(); - abstract PositionAndLength getConstantPoolPayloadOffset(int index); - - abstract PositionAndLength getConstantPoolHashMapPayloadOffset(int hash); - - abstract PositionAndLength getApiLevelHashMapPayloadOffset(int hash); + abstract PositionAndLength readPositionAndLength(int offset); abstract boolean payloadHasConstantPoolValue(int offset, int length, byte[] value); @@ -169,7 +257,7 @@ public int getConstantPoolIndex(DexString string) { PositionAndLength constantPoolIndex = - getConstantPoolHashMapPayloadOffset(constantPoolHash(string)); + readPositionAndLength(constantPoolHashMapIndexOffset(constantPoolHash(string))); if (constantPoolIndex.isEmpty()) { return -1; } @@ -183,56 +271,108 @@ } else { assert length > 0; return payloadContainsConstantPoolValue( - position, length, string.content, this::isConstantPoolEntry); + payloadOffset(getConstantPoolSize()) + position, + length, + string.content, + this::isConstantPoolEntry); } return -1; } public boolean isConstantPoolEntry(int index, byte[] value) { - PositionAndLength constantPoolPayloadOffset = getConstantPoolPayloadOffset(index); + PositionAndLength constantPoolPayloadOffset = + readPositionAndLength(constantPoolIndexOffset(index)); if (constantPoolPayloadOffset.isEmpty()) { return false; } + if (value.length != constantPoolPayloadOffset.getLength()) { + return false; + } return payloadHasConstantPoolValue( - constantPoolPayloadOffset.getPosition(), constantPoolPayloadOffset.getLength(), value); + payloadOffset(getConstantPoolSize()) + constantPoolPayloadOffset.getPosition(), + constantPoolPayloadOffset.getLength(), + value); } public byte getApiLevelForReference(byte[] serialized, DexReference reference) { PositionAndLength apiLevelPayloadOffset = - getApiLevelHashMapPayloadOffset(apiLevelHash(reference)); + readPositionAndLength(apiLevelHashMapIndexOffset(apiLevelHash(reference))); if (apiLevelPayloadOffset.isEmpty()) { return 0; } return readApiLevelForPayloadOffset( - apiLevelPayloadOffset.getPosition(), apiLevelPayloadOffset.getLength(), serialized); + payloadOffset(getConstantPoolSize()) + apiLevelPayloadOffset.getPosition(), + apiLevelPayloadOffset.getLength(), + serialized); } - public static byte findApiForReferenceHelper(byte[] data, int offset, int length, byte[] value) { - int index = offset; - while (index < offset + length) { - // Read size of entry - int lengthOfEntry = Ints.fromBytes(ZERO_BYTE, ZERO_BYTE, data[index], data[index + 1]); - int startIndex = index + 2; - int endIndex = startIndex + lengthOfEntry; - if (isSerializedDescriptor(value, data, startIndex, lengthOfEntry)) { - return data[endIndex]; - } - index = endIndex + 1; - } - return 0; - } + public static class AndroidApiDataAccessByteMapped extends AndroidApiDataAccess { - protected static boolean isSerializedDescriptor( - byte[] serialized, byte[] candidate, int offset, int length) { - if (serialized.length != length) { - return false; + private final CompatByteBuffer mappedByteBuffer; + + public AndroidApiDataAccessByteMapped(CompatByteBuffer mappedByteBuffer) { + this.mappedByteBuffer = mappedByteBuffer; } - for (int i = 0; i < length; i++) { - if (serialized[i] != candidate[i + offset]) { - return false; + + @Override + int readConstantPoolSize() { + return mappedByteBuffer.getInt(0); + } + + @Override + public PositionAndLength readPositionAndLength(int offset) { + return PositionAndLength.create( + mappedByteBuffer.getInt(offset), mappedByteBuffer.getShort(offset + 4)); + } + + @Override + boolean payloadHasConstantPoolValue(int offset, int length, byte[] value) { + assert length == value.length; + mappedByteBuffer.position(offset); + for (byte expected : value) { + if (expected != mappedByteBuffer.get()) { + return false; + } } + return true; } - return true; + + @Override + int payloadContainsConstantPoolValue( + int offset, int length, byte[] value, BiPredicate<Integer, byte[]> predicate) { + for (int i = offset; i < offset + length; i += 2) { + // Do not use mappedByteBuffer.getShort() since that will add the sign. + int index = + Ints.fromBytes( + ZERO_BYTE, ZERO_BYTE, mappedByteBuffer.get(i), mappedByteBuffer.get(i + 1)); + if (predicate.test(index, value)) { + return index; + } + } + return -1; + } + + @Override + byte readApiLevelForPayloadOffset(int offset, int length, byte[] value) { + int currentOffset = offset; + while (currentOffset < offset + length) { + // Read the length + int lengthOfEntry = + Ints.fromBytes( + ZERO_BYTE, + ZERO_BYTE, + mappedByteBuffer.get(currentOffset), + mappedByteBuffer.get(currentOffset + 1)); + int startPosition = currentOffset + 2; + if (value.length == lengthOfEntry + && payloadHasConstantPoolValue(startPosition, lengthOfEntry, value)) { + return mappedByteBuffer.get(startPosition + lengthOfEntry); + } + // Advance our current position + length of entry + api level. + currentOffset = startPosition + lengthOfEntry + 1; + } + return -1; + } } public static class AndroidApiDataAccessInMemory extends AndroidApiDataAccess { @@ -243,62 +383,36 @@ this.data = data; } - public static AndroidApiDataAccessInMemory create() { - byte[] data; - try (InputStream apiInputStream = - AndroidApiDataAccess.class.getClassLoader().getResourceAsStream(RESOURCE_NAME); ) { - if (apiInputStream == null) { - URL resource = AndroidApiDataAccess.class.getClassLoader().getResource(RESOURCE_NAME); - throw new CompilationError("Could not find the api database at: " + resource); - } - data = ByteStreams.toByteArray(apiInputStream); - } catch (IOException e) { - throw new CompilationError("Could not read the api database.", e); - } - return new AndroidApiDataAccessInMemory(data); - } - @Override public int readConstantPoolSize() { return readIntFromOffset(data, 0); } @Override - PositionAndLength getConstantPoolPayloadOffset(int index) { - int offset = constantPoolOffset() + (index * constantPoolEntrySize()); - return PositionAndLength.create(data, offset); - } - - @Override - PositionAndLength getConstantPoolHashMapPayloadOffset(int hash) { - int offset = - constantPoolHashMapOffset(getConstantPoolSize()) + (hash * constantPoolMapEntrySize()); - return PositionAndLength.create(data, offset); - } - - @Override - PositionAndLength getApiLevelHashMapPayloadOffset(int hash) { - int offset = - apiLevelHashMapOffset(getConstantPoolSize()) + (hash * apiLevelHashMapEntrySize()); + PositionAndLength readPositionAndLength(int offset) { return PositionAndLength.create(data, offset); } @Override boolean payloadHasConstantPoolValue(int offset, int length, byte[] value) { - return isSerializedDescriptor( - value, data, payloadOffset(getConstantPoolSize()) + offset, length); + if (value.length != length) { + return false; + } + for (int i = 0; i < length; i++) { + if (value[i] != data[i + offset]) { + return false; + } + } + return true; } @Override int payloadContainsConstantPoolValue( int offset, int length, byte[] value, BiPredicate<Integer, byte[]> predicate) { - int payloadOffset = payloadOffset(getConstantPoolSize()); - int startInPayload = payloadOffset + offset; - int endInPayload = startInPayload + length; - if (data.length < endInPayload) { + if (data.length < length) { return -1; } - for (int i = startInPayload; i < endInPayload; i += 2) { + for (int i = offset; i < offset + length; i += 2) { int index = Ints.fromBytes(ZERO_BYTE, ZERO_BYTE, data[i], data[i + 1]); if (predicate.test(index, value)) { return index; @@ -309,8 +423,18 @@ @Override byte readApiLevelForPayloadOffset(int offset, int length, byte[] value) { - return findApiForReferenceHelper( - data, payloadOffset(getConstantPoolSize()) + offset, length, value); + int index = offset; + while (index < offset + length) { + // Read size of entry + int lengthOfEntry = Ints.fromBytes(ZERO_BYTE, ZERO_BYTE, data[index], data[index + 1]); + int startIndex = index + 2; + int endIndex = startIndex + lengthOfEntry; + if (payloadHasConstantPoolValue(startIndex, lengthOfEntry, value)) { + return data[endIndex]; + } + index = endIndex + 1; + } + return 0; } } }
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelHashingDatabaseImpl.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelHashingDatabaseImpl.java index 5e0a407..22d0c6d 100644 --- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelHashingDatabaseImpl.java +++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiLevelHashingDatabaseImpl.java
@@ -7,13 +7,14 @@ import static com.android.tools.r8.lightir.ByteUtils.isU2; import static com.android.tools.r8.utils.AndroidApiLevel.ANDROID_PLATFORM; -import com.android.tools.r8.androidapi.AndroidApiDataAccess.AndroidApiDataAccessInMemory; +import com.android.tools.r8.DiagnosticsHandler; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.ThrowingFunction; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -126,13 +127,16 @@ private final Map<DexReference, AndroidApiLevel> lookupCache = new ConcurrentHashMap<>(); private final Map<DexString, Integer> constantPoolCache = new ConcurrentHashMap<>(); + private final InternalOptions options; + private final DiagnosticsHandler diagnosticsHandler; private static volatile AndroidApiDataAccess dataAccess; - private static AndroidApiDataAccess getDataAccess() { + private static AndroidApiDataAccess getDataAccess( + InternalOptions options, DiagnosticsHandler diagnosticsHandler) { if (dataAccess == null) { synchronized (AndroidApiDataAccess.class) { if (dataAccess == null) { - dataAccess = AndroidApiDataAccessInMemory.create(); + dataAccess = AndroidApiDataAccess.create(options, diagnosticsHandler); } } } @@ -140,7 +144,11 @@ } public AndroidApiLevelHashingDatabaseImpl( - List<AndroidApiForHashingReference> predefinedApiTypeLookup) { + List<AndroidApiForHashingReference> predefinedApiTypeLookup, + InternalOptions options, + DiagnosticsHandler diagnosticsHandler) { + this.options = options; + this.diagnosticsHandler = diagnosticsHandler; predefinedApiTypeLookup.forEach( predefinedApiReference -> { // Do not use computeIfAbsent since a return value of null implies the key should not be @@ -169,7 +177,7 @@ private int getConstantPoolId(DexString string) { return constantPoolCache.computeIfAbsent( - string, key -> getDataAccess().getConstantPoolIndex(string)); + string, key -> getDataAccess(options, diagnosticsHandler).getConstantPoolIndex(string)); } private AndroidApiLevel lookupApiLevel(DexReference reference) { @@ -190,7 +198,8 @@ return ANDROID_PLATFORM; } else { byte apiLevelForReference = - getDataAccess().getApiLevelForReference(uniqueDescriptorForReference, ref); + getDataAccess(options, diagnosticsHandler) + .getApiLevelForReference(uniqueDescriptorForReference, ref); return (apiLevelForReference <= 0) ? ANDROID_PLATFORM : AndroidApiLevel.getAndroidApiLevel(apiLevelForReference);
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java index 0e08965..b1b581b 100644 --- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java +++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -30,7 +30,8 @@ this.apiLevelCompute = apiLevelCompute; factory = appView.dexItemFactory(); androidApiLevelDatabase = - new AndroidApiLevelHashingDatabaseImpl(predefinedApiTypeLookupForHashing); + new AndroidApiLevelHashingDatabaseImpl( + predefinedApiTypeLookupForHashing, appView.options(), appView.reporter()); } public static AndroidApiReferenceLevelCache create(
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java index f8ed446..6d8c09d 100644 --- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java +++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -10,10 +10,10 @@ import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppView; -import com.android.tools.r8.graph.DefaultInstanceInitializerCode; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexField; +import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexLibraryClass; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProgramClass; @@ -29,9 +29,7 @@ import com.android.tools.r8.utils.ThreadUtils; import com.android.tools.r8.utils.WorkList; import com.google.common.collect.Sets; -import java.util.ArrayList; import java.util.Arrays; -import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -78,22 +76,22 @@ @Override public void registerInstanceFieldRead(DexField field) { - checkReferenceToLibraryClass(field.type); + checkReferenceToLibraryClass(field); } @Override public void registerInstanceFieldWrite(DexField field) { - checkReferenceToLibraryClass(field.type); + checkReferenceToLibraryClass(field); } @Override public void registerStaticFieldRead(DexField field) { - checkReferenceToLibraryClass(field.type); + checkReferenceToLibraryClass(field); } @Override public void registerStaticFieldWrite(DexField field) { - checkReferenceToLibraryClass(field.type); + checkReferenceToLibraryClass(field); } @Override @@ -104,17 +102,13 @@ private void checkReferenceToLibraryClass(DexReference reference) { DexType rewrittenType = appView.graphLens().lookupType(reference.getContextType()); findReferencedLibraryClasses(rewrittenType, getContext().getContextClass()); - if (reference.isDexMethod()) { - findReferencedLibraryMethod(reference.asDexMethod(), getContext().getContextClass()); - } } } private final AppView<?> appView; private final Map<DexLibraryClass, Set<ProgramDefinition>> referencingContexts = new ConcurrentHashMap<>(); - private final Map<DexLibraryClass, Set<DexMethod>> libraryClassesToMock = - new ConcurrentHashMap<>(); + private final Set<DexLibraryClass> libraryClassesToMock = Sets.newConcurrentHashSet(); private final Set<DexType> seenTypes = Sets.newConcurrentHashSet(); private final AndroidApiLevelCompute apiLevelCompute; @@ -133,10 +127,9 @@ return; } libraryClassesToMock.forEach( - (clazz, methods) -> + clazz -> mockMissingLibraryClass( clazz, - methods, ThrowExceptionCode.create(appView.dexItemFactory().noClassDefFoundErrorType))); // Commit the synthetic items. CommittedItems committedItems = appView.getSyntheticItems().commit(appView.appInfo().app()); @@ -171,37 +164,6 @@ method -> method.registerCodeReferences(new ReferencesToApiLevelUseRegistry(method))); } - private void findReferencedLibraryMethod(DexMethod method, DexProgramClass context) { - DexType holderType = method.getHolderType(); - if (!holderType.isClassType()) { - return; - } - DexType rewrittenType = appView.graphLens().lookupType(holderType); - DexClass clazz = appView.definitionFor(rewrittenType); - if (clazz == null || !clazz.isLibraryClass()) { - return; - } - ComputedApiLevel apiLevel = - apiLevelCompute.computeApiLevelForLibraryReference(method, ComputedApiLevel.unknown()); - if (apiLevel.isGreaterThan(appView.computedMinApiLevel())) { - ComputedApiLevel holderApiLevel = - apiLevelCompute.computeApiLevelForLibraryReference( - rewrittenType, ComputedApiLevel.unknown()); - if (holderApiLevel.isUnknownApiLevel()) { - // Do not mock methods or classes where the holder is unknown. - return; - } - if (holderApiLevel.isGreaterThan(appView.computedMinApiLevel())) { - libraryClassesToMock - .computeIfAbsent(clazz.asLibraryClass(), ignoreKey(Sets::newConcurrentHashSet)) - .add(method); - referencingContexts - .computeIfAbsent(clazz.asLibraryClass(), ignoreKey(Sets::newConcurrentHashSet)) - .add(context); - } - } - } - private void findReferencedLibraryClasses(DexType type, DexProgramClass context) { if (!type.isClassType()) { return; @@ -218,8 +180,7 @@ clazz.type, ComputedApiLevel.unknown()); if (androidApiLevel.isGreaterThan(appView.computedMinApiLevel()) && !androidApiLevel.isUnknownApiLevel()) { - libraryClassesToMock.computeIfAbsent( - clazz.asLibraryClass(), ignoreKey(Sets::newConcurrentHashSet)); + libraryClassesToMock.add(clazz.asLibraryClass()); referencingContexts .computeIfAbsent(clazz.asLibraryClass(), ignoreKey(Sets::newConcurrentHashSet)) .add(context); @@ -231,9 +192,9 @@ private void mockMissingLibraryClass( DexLibraryClass libraryClass, - Set<DexMethod> methodsToStub, ThrowExceptionCode throwExceptionCode) { - if (libraryClass.getType() == appView.dexItemFactory().objectType + DexItemFactory factory = appView.dexItemFactory(); + if (libraryClass.getType() == factory.objectType || libraryClass.getType().toDescriptorString().startsWith("Ljava/")) { return; } @@ -260,9 +221,14 @@ classBuilder .setSuperType(libraryClass.getSuperType()) .setInterfaces(Arrays.asList(libraryClass.getInterfaces().values)) - .setVirtualMethods( - buildLibraryMethodsForProgram( - libraryClass, libraryClass.virtualMethods(), methodsToStub)); + // Add throwing static initializer + .addMethod( + methodBuilder -> + methodBuilder + .setName(factory.classConstructorMethodName) + .setProto(factory.createProto(factory.voidType)) + .setAccessFlags(MethodAccessFlags.createForClassInitializer()) + .setCode(method -> throwExceptionCode)); // Based on b/138781768#comment57 there is no significant reason to synthesize fields. if (libraryClass.isInterface()) { classBuilder.setInterface(); @@ -270,60 +236,7 @@ if (!libraryClass.isFinal()) { classBuilder.unsetFinal(); } - List<DexEncodedMethod> directMethods = - (!libraryClass.isInterface() - || appView.options().canUseDefaultAndStaticInterfaceMethods()) - ? buildLibraryMethodsForProgram( - libraryClass, libraryClass.directMethods(), methodsToStub) - : new ArrayList<>(); - // Add throwing static initializer - directMethods.add( - DexEncodedMethod.syntheticBuilder() - .setMethod( - appView.dexItemFactory().createClassInitializer(libraryClass.getType())) - .setAccessFlags(MethodAccessFlags.createForClassInitializer()) - .setCode(throwExceptionCode) - .build()); - classBuilder.setDirectMethods(directMethods); }, ignored -> {}); } - - private List<DexEncodedMethod> buildLibraryMethodsForProgram( - DexLibraryClass clazz, Iterable<DexEncodedMethod> methods, Set<DexMethod> methodsToMock) { - List<DexEncodedMethod> newMethods = new ArrayList<>(); - methods.forEach( - method -> { - if (methodsToMock.contains(method.getReference())) { - DexEncodedMethod newMethod = buildLibraryMethodForProgram(clazz, method); - if (newMethod != null) { - newMethods.add(newMethod); - } - } - }); - return newMethods; - } - - private DexEncodedMethod buildLibraryMethodForProgram( - DexLibraryClass clazz, DexEncodedMethod method) { - assert !clazz.isInterface() - || !method.isStatic() - || appView.options().canUseDefaultAndStaticInterfaceMethods(); - DexMethod newMethod = method.getReference().withHolder(clazz.type, appView.dexItemFactory()); - DexEncodedMethod.Builder methodBuilder = - DexEncodedMethod.syntheticBuilder(method) - .setMethod(newMethod) - .modifyAccessFlags(MethodAccessFlags::setSynthetic); - if (method.isInstanceInitializer()) { - methodBuilder.setCode(DefaultInstanceInitializerCode.get()); - } else if (method.isVirtualMethod() && clazz.isInterface()) { - methodBuilder.modifyAccessFlags(MethodAccessFlags::setAbstract); - } else if (method.isAbstract()) { - methodBuilder.modifyAccessFlags(MethodAccessFlags::setAbstract); - } else { - // To allow us not adding a trivial throwing code body we set the access flag as native. - methodBuilder.modifyAccessFlags(MethodAccessFlags::setNative); - } - return methodBuilder.build(); - } }
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java index 4228cf4..c7547a8 100644 --- a/src/main/java/com/android/tools/r8/bisect/Bisect.java +++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -14,7 +14,6 @@ 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.naming.NamingLens; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.AndroidAppConsumers; @@ -175,7 +174,7 @@ } private DexApplication readApp(Path apk, InternalOptions options, ExecutorService executor) - throws IOException, ExecutionException { + throws IOException { AndroidApp app = AndroidApp.builder().addProgramFiles(apk).build(); return new ApplicationReader(app, options, timing).read(executor); } @@ -191,8 +190,7 @@ new ApplicationWriter( AppView.createForD8( AppInfo.createInitialAppInfo(app, GlobalSyntheticsStrategy.forNonSynthesizing())), - null, - NamingLens.getIdentityLens()); + null); writer.write(executor); options.signalFinishedToConsumers(); compatSink.build().writeToDirectory(output, OutputMode.DexIndexed);
diff --git a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java index 22fbe8e..9798222 100644 --- a/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java +++ b/src/main/java/com/android/tools/r8/cf/CfCodePrinter.java
@@ -536,24 +536,7 @@ } else if (frameType.isUninitializedNew()) { return frameTypeType() + ".uninitializedNew(new " + cfType("CfLabel") + "())"; } else if (frameType.isPrimitive()) { - if (frameType.isSingle()) { - if (frameType.isInt()) { - return frameTypeType() + ".intType()"; - } else { - return frameTypeType() - + ".initialized(" - + dexType(frameType.asSingleInitializedType().getInitializedType()) - + ")"; - } - } else { - assert frameType.isWide(); - if (frameType.isDouble()) { - return frameTypeType() + ".doubleType()"; - } else { - assert frameType.isLong(); - return frameTypeType() + ".longType()"; - } - } + return frameTypeType() + "." + frameType.asPrimitive().getTypeName() + "Type()"; } else { assert frameType.isInitialized(); if (frameType.isNullType()) {
diff --git a/src/main/java/com/android/tools/r8/cf/CfPrinter.java b/src/main/java/com/android/tools/r8/cf/CfPrinter.java index 035e416..6030119 100644 --- a/src/main/java/com/android/tools/r8/cf/CfPrinter.java +++ b/src/main/java/com/android/tools/r8/cf/CfPrinter.java
@@ -456,17 +456,7 @@ private void print(FrameType type) { if (type.isPrimitive()) { - if (type.isInt()) { - builder.append("int"); - } else if (type.isDouble()) { - builder.append("double"); - } else if (type.isLong()) { - assert type.isLong(); - builder.append("long"); - } else { - assert type.isSingleInitialized(); - appendType(type.asSingleInitializedType().getInitializedType()); - } + builder.append(type.asPrimitive().getTypeName()); } else if (type.isInitialized()) { appendType(type.asSingleInitializedType().getInitializedType()); } else if (type.isUninitializedNew()) {
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java index bf9dc6b..993dd8e 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -220,11 +221,14 @@ @Override public CfFrameState evaluate( CfFrameState state, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value1, value2 → // ..., result - return state.popInitialized(appView, type).popInitialized(appView, type).push(appView, type); + return state + .popInitialized(appView, type) + .popInitialized(appView, type) + .push(appView, config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java index e696048..8a39916 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -96,13 +97,13 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., arrayref → // ..., length return frame .popInitialized(appView, dexItemFactory.objectArrayType) - .push(dexItemFactory.intType); + .push(config, dexItemFactory.intType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java index fbcad69..129219b 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -141,14 +142,14 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., arrayref, index → // ..., value return frame .popInitialized(appView, dexItemFactory.intType) .popInitialized(appView, dexItemFactory.objectArrayType) - .push(appView, type); + .push(appView, config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java index 31ad222..965c413 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -133,8 +134,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., arrayref, index, value → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java b/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java index 184afb2..8335908 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfAssignability.java
@@ -33,7 +33,7 @@ // Based on https://docs.oracle.com/javase/specs/jvms/se8/html/jvms-4.html#jvms-4.10.1.2. public static boolean isFrameTypeAssignable( SingleFrameType source, SingleFrameType target, AppView<?> appView) { - if (source == target || target.isOneWord()) { + if (source.equals(target) || target.isOneWord()) { return true; } if (source.isOneWord()) { @@ -49,11 +49,21 @@ } // TODO(b/168190267): Clean-up the lattice. DexItemFactory factory = appView.dexItemFactory(); + if (target.isPrimitive()) { + return source.isPrimitive() + && source.asSinglePrimitive().hasIntVerificationType() + && target.asSinglePrimitive().hasIntVerificationType(); + } + if (source.isPrimitive()) { + return false; + } if (target.isInitialized()) { if (source.isInitialized()) { // Both are instantiated types and we resort to primitive type/java type hierarchy checking. return isAssignable( - source.getInitializedType(factory), target.getInitializedType(factory), appView); + source.asSingleInitializedType().getInitializedType(), + target.asSingleInitializedType().getInitializedType(), + appView); } return target.asSingleInitializedType().getInitializedType() == factory.objectType; }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java index 323a253..6ad249b 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -145,11 +146,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref → // ..., objectref - return frame.popInitialized(appView, dexItemFactory.objectType).push(type); + return frame.popInitialized(appView, dexItemFactory.objectType).push(config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java index 4a42ca3..5d3f7b9 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
@@ -25,6 +25,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -145,14 +146,14 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value1, value2 → // ..., result return frame .popInitialized(appView, type) .popInitialized(appView, type) - .push(dexItemFactory.intType); + .push(config, dexItemFactory.intType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java index ff36775..43e8eee 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -152,11 +153,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.classType); + return frame.push(config, dexItemFactory.classType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java b/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java index 54c7820..da94a6ba 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstDynamic.java
@@ -31,6 +31,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -239,11 +240,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.classType); + return frame.push(config, dexItemFactory.classType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java index 50564e3..ad9f25e 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -116,11 +117,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.methodHandleType); + return frame.push(config, dexItemFactory.methodHandleType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java index b262ff9..dc1bee0 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -114,11 +115,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.methodTypeType); + return frame.push(config, dexItemFactory.methodTypeType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java index e849e05..546fd6b 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -86,11 +87,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(DexItemFactory.nullValueType); + return frame.push(config, DexItemFactory.nullValueType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java index 34f67c7..3277d2b 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
@@ -21,6 +21,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import com.android.tools.r8.utils.structural.StructuralSpecification; @@ -244,12 +245,12 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value assert type.isPrimitive(); - return frame.push(appView, type); + return frame.push(appView, config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java index 4e4a325..e143829 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -117,11 +118,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.stringType); + return frame.push(config, dexItemFactory.stringType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java index 8bccf77..374b722 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.dexitembasedstring.NameComputationInfo; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -136,11 +137,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., value - return frame.push(dexItemFactory.stringType); + return frame.push(config, dexItemFactory.stringType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java index c40062c..fafcb67 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
@@ -6,6 +6,7 @@ import static org.objectweb.asm.Opcodes.F_NEW; import com.android.tools.r8.cf.CfPrinter; +import com.android.tools.r8.cf.code.frame.PrimitiveFrameType; import com.android.tools.r8.cf.code.frame.SingleFrameType; import com.android.tools.r8.cf.code.frame.WideFrameType; import com.android.tools.r8.errors.Unimplemented; @@ -29,6 +30,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.IntObjConsumer; import com.android.tools.r8.utils.collections.ImmutableDeque; @@ -52,10 +54,26 @@ public abstract static class FrameType { + public static BooleanFrameType booleanType() { + return BooleanFrameType.SINGLETON; + } + + public static ByteFrameType byteType() { + return ByteFrameType.SINGLETON; + } + + public static CharFrameType charType() { + return CharFrameType.SINGLETON; + } + public static DoubleFrameType doubleType() { return DoubleFrameType.SINGLETON; } + public static FloatFrameType floatType() { + return FloatFrameType.SINGLETON; + } + public static IntFrameType intType() { return IntFrameType.SINGLETON; } @@ -64,12 +82,32 @@ return LongFrameType.SINGLETON; } + public static ShortFrameType shortType() { + return ShortFrameType.SINGLETON; + } + public static FrameType initialized(DexType type) { if (type.isPrimitiveType()) { - if (type.isWideType()) { - return type.isDoubleType() ? doubleType() : longType(); - } else if (type.isIntType()) { - return intType(); + char c = (char) type.getDescriptor().content[0]; + switch (c) { + case 'Z': + return booleanType(); + case 'B': + return byteType(); + case 'C': + return charType(); + case 'D': + return doubleType(); + case 'F': + return floatType(); + case 'I': + return intType(); + case 'J': + return longType(); + case 'S': + return shortType(); + default: + throw new Unreachable("Unexpected primitive type: " + type.getTypeName()); } } return new SingleInitializedType(type); @@ -97,10 +135,26 @@ abstract Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens); + public boolean isBoolean() { + return false; + } + + public boolean isByte() { + return false; + } + + public boolean isChar() { + return false; + } + public boolean isDouble() { return false; } + public boolean isFloat() { + return false; + } + public boolean isInt() { return false; } @@ -109,6 +163,10 @@ return false; } + public boolean isShort() { + return false; + } + public boolean isNullType() { return false; } @@ -117,7 +175,7 @@ return false; } - public DexType getObjectType(ProgramMethod context) { + public DexType getObjectType(DexType context) { assert false : "Unexpected use of getObjectType() for non-object FrameType"; return null; } @@ -126,6 +184,10 @@ return false; } + public PrimitiveFrameType asPrimitive() { + return null; + } + public final boolean isSingle() { return !isWide(); } @@ -134,6 +196,10 @@ return null; } + public SinglePrimitiveFrameType asSinglePrimitive() { + return null; + } + public SingleInitializedType asSingleInitializedType() { return null; } @@ -146,6 +212,11 @@ return null; } + public int getWidth() { + assert isSingle(); + return 1; + } + public boolean isUninitializedNew() { return false; } @@ -166,10 +237,6 @@ return false; } - public boolean isSingleInitialized() { - return false; - } - public DexType getInitializedType(DexItemFactory dexItemFactory) { return null; } @@ -283,26 +350,181 @@ return CfCompareHelper.compareIdUniquelyDeterminesEquality(this, other); } - public abstract static class SinglePrimitiveType extends SingletonFrameType - implements SingleFrameType { + public abstract static class SinglePrimitiveFrameType extends SingletonFrameType + implements PrimitiveFrameType, SingleFrameType { + + public boolean hasIntVerificationType() { + return false; + } @Override - public boolean isInitialized() { + public final boolean isInitialized() { return true; } @Override - public boolean isPrimitive() { + public final boolean isPrimitive() { return true; } @Override - public SingleFrameType asSingle() { + public PrimitiveFrameType asPrimitive() { return this; } + + @Override + public final SingleFrameType asSingle() { + return this; + } + + @Override + public final SinglePrimitiveFrameType asSinglePrimitive() { + return this; + } + + @Override + public final SingleFrameType join(SingleFrameType frameType) { + if (this == frameType) { + return this; + } + if (hasIntVerificationType() + && frameType.isPrimitive() + && frameType.asSinglePrimitive().hasIntVerificationType()) { + return intType(); + } + return oneWord(); + } + + @Override + public final String toString() { + return getTypeName(); + } } - public static class IntFrameType extends SinglePrimitiveType { + public static class BooleanFrameType extends SinglePrimitiveFrameType { + + private static final BooleanFrameType SINGLETON = new BooleanFrameType(); + + private BooleanFrameType() {} + + @Override + public DexType getInitializedType(DexItemFactory dexItemFactory) { + return dexItemFactory.booleanType; + } + + @Override + public String getTypeName() { + return "boolean"; + } + + @Override + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + throw new Unreachable("Unexpected value type: " + this); + } + + @Override + public boolean hasIntVerificationType() { + return true; + } + + @Override + public boolean isBoolean() { + return true; + } + } + + public static class ByteFrameType extends SinglePrimitiveFrameType { + + private static final ByteFrameType SINGLETON = new ByteFrameType(); + + private ByteFrameType() {} + + @Override + public DexType getInitializedType(DexItemFactory dexItemFactory) { + return dexItemFactory.byteType; + } + + @Override + public String getTypeName() { + return "byte"; + } + + @Override + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + throw new Unreachable("Unexpected value type: " + this); + } + + @Override + public boolean hasIntVerificationType() { + return true; + } + + @Override + public boolean isByte() { + return true; + } + } + + public static class CharFrameType extends SinglePrimitiveFrameType { + + private static final CharFrameType SINGLETON = new CharFrameType(); + + private CharFrameType() {} + + @Override + public DexType getInitializedType(DexItemFactory dexItemFactory) { + return dexItemFactory.charType; + } + + @Override + public String getTypeName() { + return "char"; + } + + @Override + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + throw new Unreachable("Unexpected value type: " + this); + } + + @Override + public boolean hasIntVerificationType() { + return true; + } + + @Override + public boolean isChar() { + return true; + } + } + + public static class FloatFrameType extends SinglePrimitiveFrameType { + + private static final FloatFrameType SINGLETON = new FloatFrameType(); + + private FloatFrameType() {} + + @Override + public DexType getInitializedType(DexItemFactory dexItemFactory) { + return dexItemFactory.floatType; + } + + @Override + public String getTypeName() { + return "float"; + } + + @Override + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + return Opcodes.FLOAT; + } + + @Override + public boolean isFloat() { + return true; + } + } + + public static class IntFrameType extends SinglePrimitiveFrameType { private static final IntFrameType SINGLETON = new IntFrameType(); @@ -314,8 +536,8 @@ } @Override - public boolean isInt() { - return true; + public String getTypeName() { + return "int"; } @Override @@ -324,23 +546,45 @@ } @Override - public SingleFrameType join(SingleFrameType frameType) { - if (this == frameType) { - return this; - } - if (frameType.isOneWord() || frameType.isUninitializedObject()) { - return oneWord(); - } - assert frameType.isInitialized(); - return CfAssignability.hasIntVerificationType( - frameType.asSingleInitializedType().getInitializedType()) - ? this - : oneWord(); + public boolean hasIntVerificationType() { + return true; } @Override - public String toString() { - return "int"; + public boolean isInt() { + return true; + } + } + + public static class ShortFrameType extends SinglePrimitiveFrameType { + + private static final ShortFrameType SINGLETON = new ShortFrameType(); + + private ShortFrameType() {} + + @Override + public DexType getInitializedType(DexItemFactory dexItemFactory) { + return dexItemFactory.shortType; + } + + @Override + public String getTypeName() { + return "short"; + } + + @Override + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + throw new Unreachable("Unexpected value type: " + this); + } + + @Override + public boolean hasIntVerificationType() { + return true; + } + + @Override + public boolean isShort() { + return true; } } @@ -350,7 +594,7 @@ private SingleInitializedType(DexType type) { assert type != null; - assert !type.isIntType(); + assert type.isReferenceType(); this.type = type; } @@ -364,26 +608,11 @@ if (equals(frameType)) { return this; } - if (frameType.isOneWord() || frameType.isUninitializedObject()) { + if (frameType.isOneWord() || frameType.isPrimitive() || frameType.isUninitializedObject()) { return oneWord(); } - assert frameType.isInitialized(); - if (frameType.isPrimitive()) { - if (frameType.isInt()) { - return CfAssignability.hasIntVerificationType(type) ? frameType : oneWord(); - } - // The rest of the primitives are still represented using SingleInitializedType. - DexType otherType = frameType.asSingleInitializedType().getInitializedType(); - return CfAssignability.hasIntVerificationType(type) - && CfAssignability.hasIntVerificationType(otherType) - ? intType() - : oneWord(); - } DexType otherType = frameType.asSingleInitializedType().getInitializedType(); assert type != otherType; - if (type.isPrimitiveType()) { - return oneWord(); - } assert type.isReferenceType(); if (isNullType()) { return otherType.isReferenceType() ? frameType : oneWord(); @@ -456,16 +685,6 @@ return true; } - @Override - public boolean isPrimitive() { - return type.isPrimitiveType(); - } - - @Override - public boolean isSingleInitialized() { - return true; - } - public DexType getInitializedType() { return type; } @@ -486,14 +705,14 @@ } @Override - public DexType getObjectType(ProgramMethod context) { + public DexType getObjectType(DexType context) { assert isObject() : "Unexpected use of getObjectType() for non-object FrameType"; return type; } } - public abstract static class WideInitializedType extends SingletonFrameType - implements WideFrameType { + public abstract static class WidePrimitiveFrameType extends SingletonFrameType + implements PrimitiveFrameType, WideFrameType { @Override public boolean isInitialized() { @@ -506,6 +725,11 @@ } @Override + public PrimitiveFrameType asPrimitive() { + return this; + } + + @Override public boolean isWide() { return true; } @@ -516,12 +740,22 @@ } @Override + public int getWidth() { + return 2; + } + + @Override public WideFrameType join(WideFrameType frameType) { return this == frameType ? this : twoWord(); } + + @Override + public final String toString() { + return getTypeName(); + } } - private static class DoubleFrameType extends WideInitializedType { + public static class DoubleFrameType extends WidePrimitiveFrameType { private static final DoubleFrameType SINGLETON = new DoubleFrameType(); @@ -538,17 +772,17 @@ } @Override - Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { - return Opcodes.DOUBLE; + public String getTypeName() { + return "double"; } @Override - public String toString() { - return "double"; + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + return Opcodes.DOUBLE; } } - public static class LongFrameType extends WideInitializedType { + public static class LongFrameType extends WidePrimitiveFrameType { private static final LongFrameType SINGLETON = new LongFrameType(); @@ -565,13 +799,13 @@ } @Override - Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { - return Opcodes.LONG; + public String getTypeName() { + return "long"; } @Override - public String toString() { - return "long"; + Object getTypeOpcode(GraphLens graphLens, NamingLens namingLens) { + return Opcodes.LONG; } } @@ -628,7 +862,7 @@ } @Override - public DexType getObjectType(ProgramMethod context) { + public DexType getObjectType(DexType context) { return type; } @@ -688,8 +922,8 @@ } @Override - public DexType getObjectType(ProgramMethod context) { - return context.getHolderType(); + public DexType getObjectType(DexType context) { + return context; } @Override @@ -767,6 +1001,11 @@ } @Override + public int getWidth() { + return 2; + } + + @Override public WideFrameType join(WideFrameType frameType) { // The join of wide with one of {double, long, wide} is wide. return this; @@ -843,10 +1082,20 @@ return locals; } + public Int2ObjectAVLTreeMap<FrameType> getMutableLocals() { + assert locals instanceof Int2ObjectAVLTreeMap<?>; + return (Int2ObjectAVLTreeMap<FrameType>) locals; + } + public Deque<FrameType> getStack() { return stack; } + public ArrayDeque<FrameType> getMutableStack() { + assert stack instanceof ArrayDeque<?>; + return (ArrayDeque<FrameType>) stack; + } + @Override public boolean equals(Object obj) { if (this == obj) { @@ -898,7 +1147,7 @@ public int computeStackSize() { int size = 0; for (FrameType frameType : stack) { - size += frameType.isWide() ? 2 : 1; + size += frameType.getWidth(); } return size; } @@ -989,8 +1238,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame.check(appView, this); }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java index 10a85b9..490de77 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -119,8 +120,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame; }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIf.java b/src/main/java/com/android/tools/r8/cf/code/CfIf.java index 8388a88..78acd72 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfIf.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfIf.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -117,8 +118,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java index 7c30583..96f5832 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -118,8 +119,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value1, value2 → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java index 5a121bd..8135aa9 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
@@ -21,6 +21,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.FunctionUtils; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -109,8 +110,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame.readLocal(appView, getLocalIndex(), ValueType.INT, FunctionUtils::getFirst); }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java index a168090..fe8f36e 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -129,11 +130,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., → // ..., value - return frame.push(dexItemFactory.intType); + return frame.push(config, dexItemFactory.intType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java index c461c07..1eb4b5d 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldRead.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.cf.code; -import com.android.tools.r8.code.CfOrDexInstanceFieldRead; +import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.DexClassAndMethod; @@ -19,6 +19,7 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import java.util.ListIterator; import org.objectweb.asm.Opcodes; @@ -80,11 +81,13 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref → // ..., value - return frame.popInitialized(appView, getField().getHolderType()).push(getField().getType()); + return frame + .popInitialized(appView, getField().getHolderType()) + .push(config, getField().getType()); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldWrite.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldWrite.java index ea0d0f8..b7bf3ec 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldWrite.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceFieldWrite.java
@@ -4,8 +4,10 @@ package com.android.tools.r8.cf.code; +import static com.android.tools.r8.optimize.interfaces.analysis.ErroneousCfFrameState.formatActual; import static com.android.tools.r8.utils.BiPredicateUtils.or; +import com.android.tools.r8.cf.code.CfFrame.FrameType; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.DexClassAndMethod; @@ -20,7 +22,9 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; +import com.android.tools.r8.optimize.interfaces.analysis.ErroneousCfFrameState; import java.util.ListIterator; import org.objectweb.asm.Opcodes; @@ -83,8 +87,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref, value → // ... @@ -93,7 +97,15 @@ .popObject( appView, getField().getHolderType(), - context, - (state, head) -> head.isUninitializedNew() ? CfFrameState.error() : state); + config, + (state, head) -> head.isUninitializedNew() ? error(head) : state); + } + + private ErroneousCfFrameState error(FrameType objectType) { + return CfFrameState.error( + "Frame type " + + formatActual(objectType) + + " is not assignable to " + + getField().getHolderType().getTypeName()); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java index 53f9904..e42e7e3 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -139,11 +140,13 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref → // ..., result - return frame.popInitialized(appView, dexItemFactory.objectType).push(dexItemFactory.intType); + return frame + .popInitialized(appView, dexItemFactory.objectType) + .push(config, dexItemFactory.intType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java index 6599e60..dc1f4de 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.cf.code; import com.android.tools.r8.cf.CfPrinter; -import com.android.tools.r8.code.CfOrDexInstruction; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.CfCode; @@ -25,6 +25,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -127,7 +128,12 @@ CT initialValue) { // The method is overridden in each jump instruction. assert !isJump(); - return fn.apply(fallthroughInstruction, initialValue); + if (fallthroughInstruction != null) { + return fn.apply(fallthroughInstruction, initialValue); + } + // There may be a label after the last return. + assert isLabel(); + return TraversalContinuation.doContinue(initialValue); } @Override @@ -141,7 +147,7 @@ } @Override - public Instruction asDexInstruction() { + public DexInstruction asDexInstruction() { return null; } @@ -355,5 +361,8 @@ DexItemFactory dexItemFactory); public abstract CfFrameState evaluate( - CfFrameState frame, ProgramMethod context, AppView<?> appView, DexItemFactory dexItemFactory); + CfFrameState frame, + AppView<?> appView, + CfAnalysisConfig config, + DexItemFactory dexItemFactory); }
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 c972e4e..bbaf8b5 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
@@ -32,6 +32,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import com.android.tools.r8.utils.structural.StructuralSpecification; @@ -341,8 +342,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref, [arg1, [arg2 ...]] → // ... [ returnType ] @@ -352,14 +353,14 @@ frame = frame.popInitialized(appView, method.getParameters().getBacking()); if (opcode != Opcodes.INVOKESTATIC) { frame = - opcode == Opcodes.INVOKESPECIAL && context.getDefinition().isInstanceInitializer() - ? frame.popAndInitialize(appView, method, context) + opcode == Opcodes.INVOKESPECIAL && method.isInstanceInitializer(dexItemFactory) + ? frame.popAndInitialize(appView, method, config) : frame.popInitialized(appView, method.getHolderType()); } if (method.getReturnType().isVoidType()) { return frame; } - return frame.push(method.getReturnType()); + return frame.push(config, method.getReturnType()); } private Type computeInvokeTypeForInvokeSpecial(
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java index 121c288..dc81cfc 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
@@ -28,6 +28,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ArrayList; @@ -183,8 +184,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., [arg1, [arg2 ...]] → // ... @@ -193,6 +194,6 @@ if (returnType.isVoidType()) { return frame; } - return frame.push(returnType); + return frame.push(config, returnType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java index ab730fb..f132e94 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
@@ -21,6 +21,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -97,10 +98,10 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { - return CfFrameState.error(); + return CfFrameState.error("Unexpected JSR/RET instruction"); } public int getLocal() {
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java index 0e1ee11..7705bce 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.Label; @@ -107,8 +108,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame; }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java index 225ad07..22e8e44 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -144,11 +145,12 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., objectref - return frame.readLocal(appView, getLocalIndex(), type, CfFrameState::push); + return frame.readLocal( + appView, getLocalIndex(), type, (state, frameType) -> state.push(config, frameType)); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java index 3cf6f34..18bf0d3 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -202,8 +203,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value1, value2 → // ..., result @@ -221,6 +222,6 @@ return frame .popInitialized(appView, value2Type) .popInitialized(appView, value1Type) - .push(appView, value1Type); + .push(appView, config, value1Type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java index f860f58..9b6e582 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -108,8 +109,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java index a69ff20..0d48a12 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -145,14 +146,14 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., count1, [count2, ...] → // ..., arrayref for (int i = 0; i < dimensions; i++) { frame = frame.popInitialized(appView, dexItemFactory.intType); } - return frame.push(type); + return frame.push(config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java index c25b0ff..5150a97 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -134,11 +135,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value → // ..., result - return frame.popInitialized(appView, type).push(appView, type); + return frame.popInitialized(appView, type).push(appView, config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNew.java b/src/main/java/com/android/tools/r8/cf/code/CfNew.java index bcfae83..94fbd54 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNew.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNew.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -145,11 +146,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., objectref - return frame.push(FrameType.uninitializedNew(getLabel(), type)); + return frame.push(config, FrameType.uninitializedNew(getLabel(), type)); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java index 261db2e..6d176fa 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -178,11 +179,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., count → // ..., arrayref - return frame.popInitialized(appView, dexItemFactory.intType).push(type); + return frame.popInitialized(appView, dexItemFactory.intType).push(config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java b/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java index 73d04d1..7814564 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNewUnboxedEnum.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ListIterator; @@ -131,11 +132,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ... → // ..., objectref - return frame.push(type); + return frame.push(config, type); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNop.java b/src/main/java/com/android/tools/r8/cf/code/CfNop.java index 7bc083c..db3ea6a 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNop.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNop.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -88,8 +89,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame; }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java index ee83adb..f302df8 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -206,11 +207,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value → // ..., result - return frame.popInitialized(appView, from).push(appView, to); + return frame.popInitialized(appView, from).push(appView, config, to); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java index 42ebf38..1df0826 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -121,8 +122,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame; }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java b/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java index ba04a1c..2d2456e 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfRecordFieldValues.java
@@ -23,6 +23,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import com.android.tools.r8.utils.structural.StructuralSpecification; @@ -124,12 +125,12 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { for (DexField ignored : fields) { frame = frame.popInitialized(appView, dexItemFactory.objectType); } - return frame.push(dexItemFactory.objectArrayType); + return frame.push(config, dexItemFactory.objectArrayType); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java index be09285..6c007cc 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
@@ -22,6 +22,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -131,10 +132,10 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { - assert !context.getReturnType().isVoidType(); - return frame.popInitialized(appView, context.getReturnType()).clear(); + assert !config.getCurrentContext().getReturnType().isVoidType(); + return frame.popInitialized(appView, config.getCurrentContext().getReturnType()).clear(); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java index 0572c8b..e21e6c7 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
@@ -19,6 +19,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -103,8 +104,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { return frame.clear(); }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java index e27498e..345cc84 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
@@ -24,6 +24,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.FunctionUtils; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -510,8 +511,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { switch (opcode) { case Pop: @@ -532,13 +533,13 @@ case Dup: // ..., value → // ..., value, value - return frame.popSingle((state, single) -> state.push(single, single)); + return frame.popSingle((state, single) -> state.push(config, single, single)); case DupX1: { // ..., value2, value1 → // ..., value1, value2, value1 return frame.popSingles( - (state, single2, single1) -> state.push(single1, single2, single1)); + (state, single2, single1) -> state.push(config, single1, single2, single1)); } case DupX2: { @@ -550,8 +551,9 @@ return frame.popSingle( (state1, single1) -> state1.popSingleSingleOrWide( - (state2, single3, single2) -> state2.push(single1, single3, single2, single1), - (state2, wide2) -> state2.push(single1, wide2, single1))); + (state2, single3, single2) -> + state2.push(config, single1, single3, single2, single1), + (state2, wide2) -> state2.push(config, single1, wide2, single1))); } case Dup2: { @@ -561,8 +563,8 @@ // ..., value → // ..., value, value return frame.popSingleSingleOrWide( - (state, single2, single1) -> state.push(single2, single1, single2, single1), - (state, wide) -> state.push(wide, wide)); + (state, single2, single1) -> state.push(config, single2, single1, single2, single1), + (state, wide) -> state.push(config, wide, wide)); } case Dup2X1: { @@ -575,9 +577,10 @@ (state1, single2, single1) -> state1.popSingle( (state2, single3) -> - state2.push(single2, single1, single3, single2, single1)), + state2.push(config, single2, single1, single3, single2, single1)), (state1, wide1) -> - state1.popSingle((state2, single2) -> state2.push(wide1, single2, wide1))); + state1.popSingle( + (state2, single2) -> state2.push(config, wide1, single2, wide1))); } case Dup2X2: { @@ -597,18 +600,21 @@ (state1, single2, single1) -> state1.popSingleSingleOrWide( (state2, single4, single3) -> - state2.push(single2, single1, single4, single3, single2, single1), - (state2, wide3) -> state2.push(single2, single1, wide3, single2, single1)), + state2.push(config, single2, single1, single4, single3, single2, single1), + (state2, wide3) -> + state2.push(config, single2, single1, wide3, single2, single1)), (state1, wide1) -> state1.popSingleSingleOrWide( - (state2, single3, single2) -> state2.push(wide1, single3, single2, wide1), - (state2, wide2) -> state2.push(wide1, wide2, wide1))); + (state2, single3, single2) -> + state2.push(config, wide1, single3, single2, wide1), + (state2, wide2) -> state2.push(config, wide1, wide2, wide1))); } case Swap: { // ..., value2, value1 → // ..., value1, value2 - return frame.popSingles((state, single2, single1) -> state.push(single1, single2)); + return frame.popSingles( + (state, single2, single1) -> state.push(config, single1, single2)); } default: throw new Unreachable("Invalid opcode for CfStackInstruction");
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java index 3950a9c..e0d1ab1 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldRead.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.cf.code; -import com.android.tools.r8.code.CfOrDexStaticFieldRead; +import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.DexClassAndMethod; @@ -18,6 +18,7 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import java.util.ListIterator; import org.objectweb.asm.Opcodes; @@ -83,11 +84,11 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., → // ..., value - return frame.push(getField().getType()); + return frame.push(config, getField().getType()); } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldWrite.java b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldWrite.java index 3c64e6a..dc25d3f 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldWrite.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfStaticFieldWrite.java
@@ -18,6 +18,7 @@ import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import java.util.ListIterator; import org.objectweb.asm.Opcodes; @@ -79,8 +80,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., value → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStore.java b/src/main/java/com/android/tools/r8/cf/code/CfStore.java index 2d1bf34..e5406bb 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfStore.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
@@ -25,6 +25,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.structural.CompareToVisitor; import org.objectweb.asm.MethodVisitor; @@ -177,19 +178,20 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., ref → // ... if (type.isObject()) { - return frame.popObject((state, head) -> state.storeLocal(getLocalIndex(), head)); + return frame.popObject((state, head) -> state.storeLocal(getLocalIndex(), head, config)); } else { assert type.isPrimitive(); return frame.popInitialized( appView, type, - (state, head) -> state.storeLocal(getLocalIndex(), type.toPrimitiveType(), appView)); + (state, head) -> + state.storeLocal(getLocalIndex(), type.toPrimitiveType(), appView, config)); } } }
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java index 695bd9c..44bb2c9 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
@@ -21,6 +21,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.TraversalUtils; @@ -184,8 +185,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., index/key → // ...
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java index ef2ab8b..126c0ad 100644 --- a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java +++ b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
@@ -20,6 +20,7 @@ import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget; import com.android.tools.r8.ir.optimize.InliningConstraints; import com.android.tools.r8.naming.NamingLens; +import com.android.tools.r8.optimize.interfaces.analysis.CfAnalysisConfig; import com.android.tools.r8.optimize.interfaces.analysis.CfFrameState; import com.android.tools.r8.utils.TraversalContinuation; import com.android.tools.r8.utils.structural.CompareToVisitor; @@ -114,8 +115,8 @@ @Override public CfFrameState evaluate( CfFrameState frame, - ProgramMethod context, AppView<?> appView, + CfAnalysisConfig config, DexItemFactory dexItemFactory) { // ..., objectref → // objectref
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/PrimitiveFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/PrimitiveFrameType.java new file mode 100644 index 0000000..2db1925 --- /dev/null +++ b/src/main/java/com/android/tools/r8/cf/code/frame/PrimitiveFrameType.java
@@ -0,0 +1,10 @@ +// Copyright (c) 2022, 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.cf.code.frame; + +public interface PrimitiveFrameType { + + String getTypeName(); +}
diff --git a/src/main/java/com/android/tools/r8/cf/code/frame/SingleFrameType.java b/src/main/java/com/android/tools/r8/cf/code/frame/SingleFrameType.java index 1723418..ce215b6 100644 --- a/src/main/java/com/android/tools/r8/cf/code/frame/SingleFrameType.java +++ b/src/main/java/com/android/tools/r8/cf/code/frame/SingleFrameType.java
@@ -6,6 +6,7 @@ import com.android.tools.r8.cf.code.CfFrame.FrameType; import com.android.tools.r8.cf.code.CfFrame.SingleInitializedType; +import com.android.tools.r8.cf.code.CfFrame.SinglePrimitiveFrameType; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexType; @@ -27,6 +28,8 @@ boolean isPrimitive(); + SinglePrimitiveFrameType asSinglePrimitive(); + boolean isUninitializedNew(); DexType getUninitializedNewType();
diff --git a/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java b/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java deleted file mode 100644 index 4e15eb9..0000000 --- a/src/main/java/com/android/tools/r8/code/BaseInstructionFactory.java +++ /dev/null
@@ -1,465 +0,0 @@ -// Copyright (c) 2016, 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.code; - -import com.android.tools.r8.graph.OffsetToObjectMapping; - -abstract class BaseInstructionFactory { - - static Instruction create(int high, int opcode, BytecodeStream stream, - OffsetToObjectMapping mapping) { - switch (opcode) { - case 0x0: - return Nop.create(high, stream); - case Move.OPCODE: - return new Move(high, stream); - case MoveFrom16.OPCODE: - return new MoveFrom16(high, stream); - case Move16.OPCODE: - return new Move16(high, stream); - case MoveWide.OPCODE: - return new MoveWide(high, stream); - case MoveWideFrom16.OPCODE: - return new MoveWideFrom16(high, stream); - case MoveWide16.OPCODE: - return new MoveWide16(high, stream); - case MoveObject.OPCODE: - return new MoveObject(high, stream); - case MoveObjectFrom16.OPCODE: - return new MoveObjectFrom16(high, stream); - case MoveObject16.OPCODE: - return new MoveObject16(high, stream); - case MoveResult.OPCODE: - return new MoveResult(high, stream); - case MoveResultWide.OPCODE: - return new MoveResultWide(high, stream); - case MoveResultObject.OPCODE: - return new MoveResultObject(high, stream); - case MoveException.OPCODE: - return new MoveException(high, stream); - case ReturnVoid.OPCODE: - return new ReturnVoid(high, stream); - case Return.OPCODE: - return new Return(high, stream); - case ReturnWide.OPCODE: - return new ReturnWide(high, stream); - case ReturnObject.OPCODE: - return new ReturnObject(high, stream); - case Const4.OPCODE: - return new Const4(high, stream); - case Const16.OPCODE: - return new Const16(high, stream); - case Const.OPCODE: - return new Const(high, stream); - case ConstHigh16.OPCODE: - return new ConstHigh16(high, stream); - case ConstWide16.OPCODE: - return new ConstWide16(high, stream); - case ConstWide32.OPCODE: - return new ConstWide32(high, stream); - case ConstWide.OPCODE: - return new ConstWide(high, stream); - case ConstWideHigh16.OPCODE: - return new ConstWideHigh16(high, stream); - case ConstString.OPCODE: - return new ConstString(high, stream, mapping); - case ConstStringJumbo.OPCODE: - return new ConstStringJumbo(high, stream, mapping); - case ConstClass.OPCODE: - return new ConstClass(high, stream, mapping); - case MonitorEnter.OPCODE: - return new MonitorEnter(high, stream); - case MonitorExit.OPCODE: - return new MonitorExit(high, stream); - case CheckCast.OPCODE: - return new CheckCast(high, stream, mapping); - case InstanceOf.OPCODE: - return new InstanceOf(high, stream, mapping); - case ArrayLength.OPCODE: - return new ArrayLength(high, stream); - case NewInstance.OPCODE: - return new NewInstance(high, stream, mapping); - case NewArray.OPCODE: - return new NewArray(high, stream, mapping); - case FilledNewArray.OPCODE: - return new FilledNewArray(high, stream, mapping); - case FilledNewArrayRange.OPCODE: - return new FilledNewArrayRange(high, stream, mapping); - case FillArrayData.OPCODE: - return new FillArrayData(high, stream); - case Throw.OPCODE: - return new Throw(high, stream); - case Goto.OPCODE: - return new Goto(high, stream); - case Goto16.OPCODE: - return new Goto16(high, stream); - case Goto32.OPCODE: - return new Goto32(high, stream); - case PackedSwitch.OPCODE: - return new PackedSwitch(high, stream); - case SparseSwitch.OPCODE: - return new SparseSwitch(high, stream); - case CmplFloat.OPCODE: - return new CmplFloat(high, stream); - case CmpgFloat.OPCODE: - return new CmpgFloat(high, stream); - case CmplDouble.OPCODE: - return new CmplDouble(high, stream); - case CmpgDouble.OPCODE: - return new CmpgDouble(high, stream); - case CmpLong.OPCODE: - return new CmpLong(high, stream); - case IfEq.OPCODE: - return new IfEq(high, stream); - case IfNe.OPCODE: - return new IfNe(high, stream); - case IfLt.OPCODE: - return new IfLt(high, stream); - case IfGe.OPCODE: - return new IfGe(high, stream); - case IfGt.OPCODE: - return new IfGt(high, stream); - case IfLe.OPCODE: - return new IfLe(high, stream); - case IfEqz.OPCODE: - return new IfEqz(high, stream); - case IfNez.OPCODE: - return new IfNez(high, stream); - case IfLtz.OPCODE: - return new IfLtz(high, stream); - case IfGez.OPCODE: - return new IfGez(high, stream); - case IfGtz.OPCODE: - return new IfGtz(high, stream); - case IfLez.OPCODE: - return new IfLez(high, stream); - case Aget.OPCODE: - return new Aget(high, stream); - case AgetWide.OPCODE: - return new AgetWide(high, stream); - case AgetObject.OPCODE: - return new AgetObject(high, stream); - case AgetBoolean.OPCODE: - return new AgetBoolean(high, stream); - case AgetByte.OPCODE: - return new AgetByte(high, stream); - case AgetChar.OPCODE: - return new AgetChar(high, stream); - case AgetShort.OPCODE: - return new AgetShort(high, stream); - case Aput.OPCODE: - return new Aput(high, stream); - case AputWide.OPCODE: - return new AputWide(high, stream); - case AputObject.OPCODE: - return new AputObject(high, stream); - case AputBoolean.OPCODE: - return new AputBoolean(high, stream); - case AputByte.OPCODE: - return new AputByte(high, stream); - case AputChar.OPCODE: - return new AputChar(high, stream); - case AputShort.OPCODE: - return new AputShort(high, stream); - case Iget.OPCODE: - return new Iget(high, stream, mapping); - case IgetWide.OPCODE: - return new IgetWide(high, stream, mapping); - case IgetObject.OPCODE: - return new IgetObject(high, stream, mapping); - case IgetBoolean.OPCODE: - return new IgetBoolean(high, stream, mapping); - case IgetByte.OPCODE: - return new IgetByte(high, stream, mapping); - case IgetChar.OPCODE: - return new IgetChar(high, stream, mapping); - case IgetShort.OPCODE: - return new IgetShort(high, stream, mapping); - case Iput.OPCODE: - return new Iput(high, stream, mapping); - case IputWide.OPCODE: - return new IputWide(high, stream, mapping); - case IputObject.OPCODE: - return new IputObject(high, stream, mapping); - case IputBoolean.OPCODE: - return new IputBoolean(high, stream, mapping); - case IputByte.OPCODE: - return new IputByte(high, stream, mapping); - case IputChar.OPCODE: - return new IputChar(high, stream, mapping); - case IputShort.OPCODE: - return new IputShort(high, stream, mapping); - case Sget.OPCODE: - return new Sget(high, stream, mapping); - case SgetWide.OPCODE: - return new SgetWide(high, stream, mapping); - case SgetObject.OPCODE: - return new SgetObject(high, stream, mapping); - case SgetBoolean.OPCODE: - return new SgetBoolean(high, stream, mapping); - case SgetByte.OPCODE: - return new SgetByte(high, stream, mapping); - case SgetChar.OPCODE: - return new SgetChar(high, stream, mapping); - case SgetShort.OPCODE: - return new SgetShort(high, stream, mapping); - case Sput.OPCODE: - return new Sput(high, stream, mapping); - case SputWide.OPCODE: - return new SputWide(high, stream, mapping); - case SputObject.OPCODE: - return new SputObject(high, stream, mapping); - case SputBoolean.OPCODE: - return new SputBoolean(high, stream, mapping); - case SputByte.OPCODE: - return new SputByte(high, stream, mapping); - case SputChar.OPCODE: - return new SputChar(high, stream, mapping); - case SputShort.OPCODE: - return new SputShort(high, stream, mapping); - case InvokeVirtual.OPCODE: - return new InvokeVirtual(high, stream, mapping); - case InvokeSuper.OPCODE: - return new InvokeSuper(high, stream, mapping); - case InvokeDirect.OPCODE: - return new InvokeDirect(high, stream, mapping); - case InvokeStatic.OPCODE: - return new InvokeStatic(high, stream, mapping); - case InvokeInterface.OPCODE: - return new InvokeInterface(high, stream, mapping); - case InvokeVirtualRange.OPCODE: - return new InvokeVirtualRange(high, stream, mapping); - case InvokeSuperRange.OPCODE: - return new InvokeSuperRange(high, stream, mapping); - case InvokeDirectRange.OPCODE: - return new InvokeDirectRange(high, stream, mapping); - case InvokeStaticRange.OPCODE: - return new InvokeStaticRange(high, stream, mapping); - case InvokeInterfaceRange.OPCODE: - return new InvokeInterfaceRange(high, stream, mapping); - case NegInt.OPCODE: - return new NegInt(high, stream); - case NotInt.OPCODE: - return new NotInt(high, stream); - case NegLong.OPCODE: - return new NegLong(high, stream); - case NotLong.OPCODE: - return new NotLong(high, stream); - case NegFloat.OPCODE: - return new NegFloat(high, stream); - case NegDouble.OPCODE: - return new NegDouble(high, stream); - case IntToLong.OPCODE: - return new IntToLong(high, stream); - case IntToFloat.OPCODE: - return new IntToFloat(high, stream); - case IntToDouble.OPCODE: - return new IntToDouble(high, stream); - case LongToInt.OPCODE: - return new LongToInt(high, stream); - case LongToFloat.OPCODE: - return new LongToFloat(high, stream); - case LongToDouble.OPCODE: - return new LongToDouble(high, stream); - case FloatToInt.OPCODE: - return new FloatToInt(high, stream); - case FloatToLong.OPCODE: - return new FloatToLong(high, stream); - case FloatToDouble.OPCODE: - return new FloatToDouble(high, stream); - case DoubleToInt.OPCODE: - return new DoubleToInt(high, stream); - case DoubleToLong.OPCODE: - return new DoubleToLong(high, stream); - case DoubleToFloat.OPCODE: - return new DoubleToFloat(high, stream); - case IntToByte.OPCODE: - return new IntToByte(high, stream); - case IntToChar.OPCODE: - return new IntToChar(high, stream); - case IntToShort.OPCODE: - return new IntToShort(high, stream); - case AddInt.OPCODE: - return new AddInt(high, stream); - case SubInt.OPCODE: - return new SubInt(high, stream); - case MulInt.OPCODE: - return new MulInt(high, stream); - case DivInt.OPCODE: - return new DivInt(high, stream); - case RemInt.OPCODE: - return new RemInt(high, stream); - case AndInt.OPCODE: - return new AndInt(high, stream); - case OrInt.OPCODE: - return new OrInt(high, stream); - case XorInt.OPCODE: - return new XorInt(high, stream); - case ShlInt.OPCODE: - return new ShlInt(high, stream); - case ShrInt.OPCODE: - return new ShrInt(high, stream); - case UshrInt.OPCODE: - return new UshrInt(high, stream); - case AddLong.OPCODE: - return new AddLong(high, stream); - case SubLong.OPCODE: - return new SubLong(high, stream); - case MulLong.OPCODE: - return new MulLong(high, stream); - case DivLong.OPCODE: - return new DivLong(high, stream); - case RemLong.OPCODE: - return new RemLong(high, stream); - case AndLong.OPCODE: - return new AndLong(high, stream); - case OrLong.OPCODE: - return new OrLong(high, stream); - case XorLong.OPCODE: - return new XorLong(high, stream); - case ShlLong.OPCODE: - return new ShlLong(high, stream); - case ShrLong.OPCODE: - return new ShrLong(high, stream); - case UshrLong.OPCODE: - return new UshrLong(high, stream); - case AddFloat.OPCODE: - return new AddFloat(high, stream); - case SubFloat.OPCODE: - return new SubFloat(high, stream); - case MulFloat.OPCODE: - return new MulFloat(high, stream); - case DivFloat.OPCODE: - return new DivFloat(high, stream); - case RemFloat.OPCODE: - return new RemFloat(high, stream); - case AddDouble.OPCODE: - return new AddDouble(high, stream); - case SubDouble.OPCODE: - return new SubDouble(high, stream); - case MulDouble.OPCODE: - return new MulDouble(high, stream); - case DivDouble.OPCODE: - return new DivDouble(high, stream); - case RemDouble.OPCODE: - return new RemDouble(high, stream); - case AddInt2Addr.OPCODE: - return new AddInt2Addr(high, stream); - case SubInt2Addr.OPCODE: - return new SubInt2Addr(high, stream); - case MulInt2Addr.OPCODE: - return new MulInt2Addr(high, stream); - case DivInt2Addr.OPCODE: - return new DivInt2Addr(high, stream); - case RemInt2Addr.OPCODE: - return new RemInt2Addr(high, stream); - case AndInt2Addr.OPCODE: - return new AndInt2Addr(high, stream); - case OrInt2Addr.OPCODE: - return new OrInt2Addr(high, stream); - case XorInt2Addr.OPCODE: - return new XorInt2Addr(high, stream); - case ShlInt2Addr.OPCODE: - return new ShlInt2Addr(high, stream); - case ShrInt2Addr.OPCODE: - return new ShrInt2Addr(high, stream); - case UshrInt2Addr.OPCODE: - return new UshrInt2Addr(high, stream); - case AddLong2Addr.OPCODE: - return new AddLong2Addr(high, stream); - case SubLong2Addr.OPCODE: - return new SubLong2Addr(high, stream); - case MulLong2Addr.OPCODE: - return new MulLong2Addr(high, stream); - case DivLong2Addr.OPCODE: - return new DivLong2Addr(high, stream); - case RemLong2Addr.OPCODE: - return new RemLong2Addr(high, stream); - case AndLong2Addr.OPCODE: - return new AndLong2Addr(high, stream); - case OrLong2Addr.OPCODE: - return new OrLong2Addr(high, stream); - case XorLong2Addr.OPCODE: - return new XorLong2Addr(high, stream); - case ShlLong2Addr.OPCODE: - return new ShlLong2Addr(high, stream); - case ShrLong2Addr.OPCODE: - return new ShrLong2Addr(high, stream); - case UshrLong2Addr.OPCODE: - return new UshrLong2Addr(high, stream); - case AddFloat2Addr.OPCODE: - return new AddFloat2Addr(high, stream); - case SubFloat2Addr.OPCODE: - return new SubFloat2Addr(high, stream); - case MulFloat2Addr.OPCODE: - return new MulFloat2Addr(high, stream); - case DivFloat2Addr.OPCODE: - return new DivFloat2Addr(high, stream); - case RemFloat2Addr.OPCODE: - return new RemFloat2Addr(high, stream); - case AddDouble2Addr.OPCODE: - return new AddDouble2Addr(high, stream); - case SubDouble2Addr.OPCODE: - return new SubDouble2Addr(high, stream); - case MulDouble2Addr.OPCODE: - return new MulDouble2Addr(high, stream); - case DivDouble2Addr.OPCODE: - return new DivDouble2Addr(high, stream); - case RemDouble2Addr.OPCODE: - return new RemDouble2Addr(high, stream); - case AddIntLit16.OPCODE: - return new AddIntLit16(high, stream); - case RsubInt.OPCODE: - return new RsubInt(high, stream); - case MulIntLit16.OPCODE: - return new MulIntLit16(high, stream); - case DivIntLit16.OPCODE: - return new DivIntLit16(high, stream); - case RemIntLit16.OPCODE: - return new RemIntLit16(high, stream); - case AndIntLit16.OPCODE: - return new AndIntLit16(high, stream); - case OrIntLit16.OPCODE: - return new OrIntLit16(high, stream); - case XorIntLit16.OPCODE: - return new XorIntLit16(high, stream); - case AddIntLit8.OPCODE: - return new AddIntLit8(high, stream); - case RsubIntLit8.OPCODE: - return new RsubIntLit8(high, stream); - case MulIntLit8.OPCODE: - return new MulIntLit8(high, stream); - case DivIntLit8.OPCODE: - return new DivIntLit8(high, stream); - case RemIntLit8.OPCODE: - return new RemIntLit8(high, stream); - case AndIntLit8.OPCODE: - return new AndIntLit8(high, stream); - case OrIntLit8.OPCODE: - return new OrIntLit8(high, stream); - case XorIntLit8.OPCODE: - return new XorIntLit8(high, stream); - case ShlIntLit8.OPCODE: - return new ShlIntLit8(high, stream); - case ShrIntLit8.OPCODE: - return new ShrIntLit8(high, stream); - case UshrIntLit8.OPCODE: - return new UshrIntLit8(high, stream); - case InvokePolymorphic.OPCODE: - return new InvokePolymorphic(high, stream, mapping); - case InvokePolymorphicRange.OPCODE: - return new InvokePolymorphicRange(high, stream, mapping); - case InvokeCustom.OPCODE: - return new InvokeCustom(high, stream, mapping); - case InvokeCustomRange.OPCODE: - return new InvokeCustomRange(high, stream, mapping); - case ConstMethodHandle.OPCODE: - return new ConstMethodHandle(high, stream, mapping); - case ConstMethodType.OPCODE: - return new ConstMethodType(high, stream, mapping); - default: - throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16)); - } - } -}
diff --git a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java index 173ddd1..e9b23e7 100644 --- a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java +++ b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
@@ -3,17 +3,16 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.debuginfo; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.dex.VirtualFile; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexDebugInfo; import com.android.tools.r8.graph.DexDebugInfo.PcBasedDebugInfo; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexString; -import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ProgramMethod; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.LebUtils; import com.android.tools.r8.utils.LineNumberOptimizer; @@ -69,8 +68,8 @@ this.paramToInfo = paramToInfo; } - public static void computeForFile( - VirtualFile file, GraphLens graphLens, NamingLens namingLens, InternalOptions options) { + public static void computeForFile(AppView<?> appView, VirtualFile file) { + InternalOptions options = appView.options(); if (!options.canUseDexPc2PcAsDebugInformation() || options.canUseNativeDexPcInsteadOfDebugInfo() || options.testing.forcePcBasedEncoding) { @@ -81,7 +80,7 @@ Int2ReferenceMap<CostSummary> paramCountToCosts = new Int2ReferenceOpenHashMap<>(); for (DexProgramClass clazz : file.classes()) { IdentityHashMap<DexString, List<ProgramMethod>> overloads = - LineNumberOptimizer.groupMethodsByRenamedName(graphLens, namingLens, clazz); + LineNumberOptimizer.groupMethodsByRenamedName(appView, clazz); for (List<ProgramMethod> methods : overloads.values()) { if (methods.size() != 1) { // Never use PC info for overloaded methods. They need distinct lines to disambiguate. @@ -94,7 +93,7 @@ } DexCode code = definition.getCode().asDexCode(); DexDebugInfo debugInfo = code.getDebugInfo(); - Instruction lastInstruction = getLastExecutableInstruction(code); + DexInstruction lastInstruction = getLastExecutableInstruction(code); if (lastInstruction == null) { continue; } @@ -120,7 +119,7 @@ if (conversionInfo.cutoff < 0) { return false; } - Instruction lastInstruction = getLastExecutableInstruction(code); + DexInstruction lastInstruction = getLastExecutableInstruction(code); if (lastInstruction == null) { return false; } @@ -264,9 +263,9 @@ } } - private static Instruction getLastExecutableInstruction(DexCode code) { - Instruction lastInstruction = null; - for (Instruction instruction : code.instructions) { + private static DexInstruction getLastExecutableInstruction(DexCode code) { + DexInstruction lastInstruction = null; + for (DexInstruction instruction : code.instructions) { if (!instruction.isPayload()) { lastInstruction = instruction; }
diff --git a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java index eaec5a0..8dc8979 100644 --- a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java +++ b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
@@ -44,13 +44,10 @@ public class DesugaredLibraryKeepRuleGenerator { private final AppView<AppInfoWithClassHierarchy> appView; - private final NamingLens namingLens; private final InternalOptions options; - public DesugaredLibraryKeepRuleGenerator( - AppView<AppInfoWithClassHierarchy> appView, NamingLens namingLens) { + public DesugaredLibraryKeepRuleGenerator(AppView<AppInfoWithClassHierarchy> appView) { this.appView = appView; - this.namingLens = namingLens; this.options = appView.options(); } @@ -68,7 +65,7 @@ || !options.testing.enableExperimentalDesugaredLibraryKeepRuleGenerator) { return false; } - return namingLens.hasPrefixRewritingLogic() + return appView.getNamingLens().hasPrefixRewritingLogic() || options.machineDesugaredLibrarySpecification.hasEmulatedInterfaces(); } @@ -83,6 +80,7 @@ byte[] synthesizedLibraryClassesPackageDescriptorPrefix = DexString.encodeToMutf8( "L" + desugaredLibrarySpecification.getSynthesizedLibraryClassesPackagePrefix()); + NamingLens namingLens = appView.getNamingLens(); return type -> namingLens.prefixRewrittenType(type) != null || desugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type) @@ -91,7 +89,7 @@ } private KeepRuleGenerator createTraceReferencesConsumer() { - return new KeepRuleGenerator(appView, namingLens); + return new KeepRuleGenerator(appView); } private static class KeepRuleGenerator extends TraceReferencesConsumer.ForwardingConsumer { @@ -111,14 +109,13 @@ // ArrayReference to DexType, nor conversions from (formal types, return type) to DexProto. private final Map<TypeReference, DexType> typeConversionCache = new ConcurrentHashMap<>(); - private KeepRuleGenerator( - AppView<? extends AppInfoWithClassHierarchy> appView, NamingLens namingLens) { + private KeepRuleGenerator(AppView<? extends AppInfoWithClassHierarchy> appView) { super( TraceReferencesKeepRules.builder() .setOutputConsumer(appView.options().desugaredLibraryKeepRuleConsumer) .build()); this.factory = appView.dexItemFactory(); - this.namingLens = namingLens; + this.namingLens = appView.getNamingLens(); } @Override
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 cc04d01..d2cff23 100644 --- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java +++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -83,7 +83,6 @@ public class ApplicationWriter { public final AppView<?> appView; - public final NamingLens namingLens; public final InternalOptions options; private final CodeToKeep desugaredLibraryCodeToKeep; private final Predicate<DexType> isTypeMissing; @@ -151,38 +150,42 @@ } @Override - public boolean setAnnotationsDirectoryForClass(DexProgramClass clazz, - DexAnnotationDirectory annotationDirectory) { - return true; + public void setAnnotationsDirectoryForClass( + DexProgramClass clazz, DexAnnotationDirectory annotationDirectory) { + // Intentionally empty. + } + + @Override + public void setStaticFieldValuesForClass( + DexProgramClass clazz, DexEncodedArray staticFieldValues) { + add(staticFieldValues); } } - public ApplicationWriter( - AppView<?> appView, - List<Marker> markers, - NamingLens namingLens) { + public ApplicationWriter(AppView<?> appView, List<Marker> markers) { this( appView, markers, - namingLens, null); } public ApplicationWriter( AppView<?> appView, List<Marker> markers, - NamingLens namingLens, DexIndexedConsumer consumer) { this.appView = appView; this.options = appView.options(); - this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(options, namingLens); + this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(appView); this.markers = markers; - this.namingLens = namingLens; this.programConsumer = consumer; this.isTypeMissing = PredicateUtils.isNull(appView.appInfo()::definitionForWithoutExistenceAssert); } + private NamingLens getNamingLens() { + return appView.getNamingLens(); + } + private List<VirtualFile> distribute(ExecutorService executorService) throws ExecutionException, IOException { Collection<DexProgramClass> classes = appView.appInfo().classes(); @@ -242,12 +245,12 @@ Collection<DexProgramClass> classes = appView.appInfo().classes(); Reference2LongMap<DexString> inputChecksums = new Reference2LongOpenHashMap<>(classes.size()); for (DexProgramClass clazz : classes) { - inputChecksums.put(namingLens.lookupDescriptor(clazz.getType()), clazz.getChecksum()); + inputChecksums.put(getNamingLens().lookupDescriptor(clazz.getType()), clazz.getChecksum()); } for (VirtualFile file : files) { ClassesChecksum toWrite = new ClassesChecksum(); for (DexProgramClass clazz : file.classes()) { - DexString desc = namingLens.lookupDescriptor(clazz.type); + DexString desc = getNamingLens().lookupDescriptor(clazz.type); toWrite.addChecksum(desc.toString(), inputChecksums.getLong(desc)); } file.injectString(appView.dexItemFactory().createString(toWrite.toJsonString())); @@ -307,7 +310,7 @@ // TODO(b/151313617): Sorting annotations mutates elements so run single threaded on main. timing.begin("Sort Annotations"); - SortAnnotations sortAnnotations = new SortAnnotations(namingLens); + SortAnnotations sortAnnotations = new SortAnnotations(getNamingLens()); appView.appInfo().classes().forEach((clazz) -> clazz.addDependencies(sortAnnotations)); timing.end(); @@ -322,8 +325,7 @@ Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options); computeOffsetMappingAndRewriteJumboStrings( virtualFile, lazyDexStrings, fileTiming); - DebugRepresentation.computeForFile( - virtualFile, appView.graphLens(), namingLens, options); + DebugRepresentation.computeForFile(appView, virtualFile); fileTiming.end(); return fileTiming; }, @@ -332,15 +334,14 @@ merger.end(); } - - // Now code offsets are fixed, compute the mapping file content. + // Now that the instruction offsets in each code object are fixed, compute the mapping file + // content. if (willComputeProguardMap()) { // TODO(b/220999985): Refactor line number optimization to be per file and thread it above. DebugRepresentationPredicate representation = DebugRepresentation.fromFiles(virtualFiles, options); delayedProguardMapId.set( - runAndWriteMap( - inputApp, appView, namingLens, timing, originalSourceFiles, representation)); + runAndWriteMap(inputApp, appView, timing, originalSourceFiles, representation)); } // With the mapping id/hash known, it is safe to compute the remaining dex strings. @@ -368,7 +369,7 @@ merger.add(timings); merger.end(); if (globalsSyntheticsConsumer != null) { - globalsSyntheticsConsumer.finished(appView, namingLens); + globalsSyntheticsConsumer.finished(appView); } } @@ -380,7 +381,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(appView.appInfo().app(), appView, namingLens, options); + supplyAdditionalConsumers(appView); } finally { timing.end(); } @@ -484,7 +485,7 @@ return; } timing.begin("Compute object offset mapping"); - virtualFile.computeMapping(appView, namingLens, lazyDexStrings.size(), timing); + virtualFile.computeMapping(appView, lazyDexStrings.size(), timing); timing.end(); timing.begin("Rewrite jumbo strings"); rewriteCodeWithJumboStrings( @@ -528,7 +529,7 @@ timing.end(); timing.begin("Write bytes"); - ByteBufferResult result = writeDexFile(objectMapping, byteBufferProvider, timing); + ByteBufferResult result = writeDexFile(objectMapping, byteBufferProvider, virtualFile, timing); ByteDataView data = new ByteDataView(result.buffer.array(), result.buffer.arrayOffset(), result.length); timing.end(); @@ -550,11 +551,8 @@ byteBufferProvider.releaseByteBuffer(result.buffer.asByteBuffer()); } - public static void supplyAdditionalConsumers( - DexApplication application, - AppView<?> appView, - NamingLens namingLens, - InternalOptions options) { + public static void supplyAdditionalConsumers(AppView<?> appView) { + InternalOptions options = appView.options(); if (options.configurationConsumer != null) { ExceptionUtils.withConsumeResourceHandler( options.reporter, options.configurationConsumer, @@ -563,22 +561,22 @@ } if (options.mainDexListConsumer != null) { ExceptionUtils.withConsumeResourceHandler( - options.reporter, options.mainDexListConsumer, writeMainDexList(appView, namingLens)); + options.reporter, options.mainDexListConsumer, writeMainDexList(appView)); ExceptionUtils.withFinishedResourceHandler(options.reporter, options.mainDexListConsumer); } DataResourceConsumer dataResourceConsumer = options.dataResourceConsumer; if (dataResourceConsumer != null) { - ImmutableList<DataResourceProvider> dataResourceProviders = application.dataResourceProviders; - ResourceAdapter resourceAdapter = - new ResourceAdapter(appView, application.dexItemFactory, namingLens, options); - + ImmutableList<DataResourceProvider> dataResourceProviders = + appView.app().dataResourceProviders; + ResourceAdapter resourceAdapter = new ResourceAdapter(appView); adaptAndPassDataResources( options, dataResourceConsumer, dataResourceProviders, resourceAdapter); // Write the META-INF/services resources. Sort on service names and keep the order from // the input for the implementation lines for deterministic output. if (!appView.appServices().isEmpty()) { + NamingLens namingLens = appView.getNamingLens(); appView .appServices() .visit( @@ -605,8 +603,7 @@ if (options.featureSplitConfiguration != null) { for (DataResourceProvidersAndConsumer entry : options.featureSplitConfiguration.getDataResourceProvidersAndConsumers()) { - ResourceAdapter resourceAdapter = - new ResourceAdapter(appView, application.dexItemFactory, namingLens, options); + ResourceAdapter resourceAdapter = new ResourceAdapter(appView); adaptAndPassDataResources( options, entry.getConsumer(), entry.getProviders(), resourceAdapter); } @@ -704,7 +701,7 @@ } else { annotations.add( DexAnnotation.createInnerClassAnnotation( - namingLens.lookupInnerName(innerClass, options), + getNamingLens().lookupInnerName(innerClass, options), innerClass.getAccess(), options.itemFactory)); if (innerClass.getOuter() != null && innerClass.isNamed()) { @@ -726,7 +723,7 @@ if (clazz.getClassSignature().hasSignature()) { annotations.add( DexAnnotation.createSignatureAnnotation( - clazz.getClassSignature().toRenamedString(namingLens, isTypeMissing), + clazz.getClassSignature().toRenamedString(getNamingLens(), isTypeMissing), options.itemFactory)); } @@ -756,7 +753,7 @@ ArrayUtils.appendSingleElement( field.annotations().annotations, DexAnnotation.createSignatureAnnotation( - field.getGenericSignature().toRenamedString(namingLens, isTypeMissing), + field.getGenericSignature().toRenamedString(getNamingLens(), isTypeMissing), options.itemFactory)))); field.clearGenericSignature(); } @@ -771,7 +768,7 @@ ArrayUtils.appendSingleElement( method.annotations().annotations, DexAnnotation.createSignatureAnnotation( - method.getGenericSignature().toRenamedString(namingLens, isTypeMissing), + method.getGenericSignature().toRenamedString(getNamingLens(), isTypeMissing), options.itemFactory)))); method.clearGenericSignature(); } @@ -827,15 +824,12 @@ } private ByteBufferResult writeDexFile( - ObjectToOffsetMapping objectMapping, ByteBufferProvider provider, Timing timing) { + ObjectToOffsetMapping objectMapping, + ByteBufferProvider provider, + VirtualFile virtualFile, + Timing timing) { FileWriter fileWriter = - new FileWriter( - provider, - objectMapping, - appView.appInfo(), - options, - namingLens, - desugaredLibraryCodeToKeep); + new FileWriter(appView, provider, objectMapping, desugaredLibraryCodeToKeep, virtualFile); // Collect the non-fixed sections. timing.time("collect", fileWriter::collect); // Generate and write the bytes. @@ -847,7 +841,7 @@ .replace('.', '/') + ".class"; } - private static String writeMainDexList(AppView<?> appView, NamingLens namingLens) { + private static String writeMainDexList(AppView<?> appView) { // TODO(b/178231294): Clean up by streaming directly to the consumer. MainDexInfo mainDexInfo = appView.appInfo().getMainDexInfo(); StringBuilder builder = new StringBuilder(); @@ -855,7 +849,7 @@ mainDexInfo.forEach(list::add); list.sort(DexType::compareTo); list.forEach( - type -> builder.append(mapMainDexListName(type, namingLens)).append('\n')); + type -> builder.append(mapMainDexListName(type, appView.getNamingLens())).append('\n')); return builder.toString(); }
diff --git a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java index 6b77d5b..5a0ec34 100644 --- a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java +++ b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.dex; import com.android.tools.r8.errors.Unreachable; +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.DexProgramClass; @@ -24,7 +25,9 @@ public abstract class CodeToKeep { - static CodeToKeep createCodeToKeep(InternalOptions options, NamingLens namingLens) { + static CodeToKeep createCodeToKeep(AppView<?> appView) { + InternalOptions options = appView.options(); + NamingLens namingLens = appView.getNamingLens(); if ((!namingLens.hasPrefixRewritingLogic() && options.machineDesugaredLibrarySpecification.getMaintainType().isEmpty() && !options.machineDesugaredLibrarySpecification.hasEmulatedInterfaces()) @@ -32,7 +35,7 @@ || options.testing.enableExperimentalDesugaredLibraryKeepRuleGenerator) { return new NopCodeToKeep(); } - return new DesugaredLibraryCodeToKeep(namingLens, options); + return new DesugaredLibraryCodeToKeep(appView); } public abstract void recordMethod(DexMethod method); @@ -58,17 +61,16 @@ boolean all = false; } - private final NamingLens namingLens; + private final AppView<?> appView; private final Map<DexType, KeepStruct> toKeep = new ConcurrentHashMap<>(); - private final InternalOptions options; - public DesugaredLibraryCodeToKeep(NamingLens namingLens, InternalOptions options) { - this.namingLens = namingLens; - this.options = options; + public DesugaredLibraryCodeToKeep(AppView<?> appView) { + this.appView = appView; } private boolean shouldKeep(DexType givenType) { - if (namingLens.prefixRewrittenType(givenType) != null + InternalOptions options = appView.options(); + if (appView.getNamingLens().prefixRewrittenType(givenType) != null || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(givenType) || options.machineDesugaredLibrarySpecification.isEmulatedInterfaceRewrittenType( givenType) @@ -84,14 +86,14 @@ DexType type = InterfaceDesugaringSyntheticHelper.isCompanionClassType(givenType) ? InterfaceDesugaringSyntheticHelper.getInterfaceClassType( - givenType, options.dexItemFactory()) + givenType, appView.dexItemFactory()) : givenType; return options.machineDesugaredLibrarySpecification.getMaintainType().contains(type); } @Override public void recordMethod(DexMethod method) { - DexType baseType = method.holder.toBaseType(options.dexItemFactory()); + DexType baseType = method.holder.toBaseType(appView.dexItemFactory()); if (shouldKeep(baseType)) { keepClass(baseType); if (!method.holder.isArrayType()) { @@ -110,7 +112,7 @@ @Override public void recordField(DexField field) { - DexType baseType = field.holder.toBaseType(options.dexItemFactory()); + DexType baseType = field.holder.toBaseType(appView.dexItemFactory()); if (shouldKeep(baseType)) { keepClass(baseType); if (!field.holder.isArrayType()) { @@ -146,7 +148,7 @@ } private void keepClass(DexType type) { - DexType baseType = type.lookupBaseType(options.itemFactory); + DexType baseType = type.lookupBaseType(appView.dexItemFactory()); toKeep.putIfAbsent(baseType, new KeepStruct()); } @@ -156,7 +158,7 @@ } private String convertType(DexType type) { - DexString rewriteType = namingLens.prefixRewrittenType(type); + DexString rewriteType = appView.getNamingLens().prefixRewrittenType(type); DexString descriptor = rewriteType != null ? rewriteType : type.descriptor; return DescriptorUtils.descriptorToJavaType(descriptor.toString()); } @@ -166,13 +168,6 @@ // TODO(b/134734081): Stream the consumer instead of building the String. StringBuilder sb = new StringBuilder(); String cr = System.lineSeparator(); - Comparator<DexReference> comparator = - new Comparator<DexReference>() { - @Override - public int compare(DexReference o1, DexReference o2) { - return o1.compareTo(o2); - } - }; for (DexType type : CollectionUtils.sort(toKeep.keySet(), getComparator())) { KeepStruct keepStruct = toKeep.get(type); sb.append("-keep class ").append(convertType(type)); @@ -214,12 +209,7 @@ } private static <T extends DexReference> Comparator<T> getComparator() { - return new Comparator<T>() { - @Override - public int compare(T o1, T o2) { - return o1.compareTo(o2); - } - }; + return DexReference::compareTo; } }
diff --git a/src/main/java/com/android/tools/r8/dex/CompatByteBuffer.java b/src/main/java/com/android/tools/r8/dex/CompatByteBuffer.java index 6e32c6e..0d36470 100644 --- a/src/main/java/com/android/tools/r8/dex/CompatByteBuffer.java +++ b/src/main/java/com/android/tools/r8/dex/CompatByteBuffer.java
@@ -117,6 +117,10 @@ return asByteBuffer().getShort(); } + public short getShort(int offset) { + return asByteBuffer().getShort(offset); + } + public void put(byte aByte) { asByteBuffer().put(aByte); }
diff --git a/src/main/java/com/android/tools/r8/dex/DefaultMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/DefaultMixedSectionLayoutStrategy.java new file mode 100644 index 0000000..dee0f55 --- /dev/null +++ b/src/main/java/com/android/tools/r8/dex/DefaultMixedSectionLayoutStrategy.java
@@ -0,0 +1,118 @@ +// Copyright (c) 2022, 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.dex; + +import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexAnnotation; +import com.android.tools.r8.graph.DexAnnotationDirectory; +import com.android.tools.r8.graph.DexAnnotationSet; +import com.android.tools.r8.graph.DexEncodedArray; +import com.android.tools.r8.graph.DexEncodedMethod; +import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.graph.DexString; +import com.android.tools.r8.graph.DexTypeList; +import com.android.tools.r8.graph.DexWritableCode; +import com.android.tools.r8.graph.ParameterAnnotationsList; +import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.naming.ClassNameMapper; +import com.android.tools.r8.naming.MemberNaming.MethodSignature; +import com.android.tools.r8.naming.MemberNaming.Signature; +import com.android.tools.r8.utils.collections.ProgramMethodMap; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Comparator; +import java.util.List; + +public class DefaultMixedSectionLayoutStrategy extends MixedSectionLayoutStrategy { + + final AppView<?> appView; + final MixedSectionOffsets mixedSectionOffsets; + + public DefaultMixedSectionLayoutStrategy( + AppView<?> appView, MixedSectionOffsets mixedSectionOffsets) { + this.appView = appView; + this.mixedSectionOffsets = mixedSectionOffsets; + } + + @Override + public Collection<DexAnnotation> getAnnotationLayout() { + return mixedSectionOffsets.getAnnotations(); + } + + @Override + public Collection<DexAnnotationDirectory> getAnnotationDirectoryLayout() { + return mixedSectionOffsets.getAnnotationDirectories(); + } + + @Override + public Collection<DexAnnotationSet> getAnnotationSetLayout() { + return mixedSectionOffsets.getAnnotationSets(); + } + + @Override + public Collection<ParameterAnnotationsList> getAnnotationSetRefListLayout() { + return mixedSectionOffsets.getAnnotationSetRefLists(); + } + + @Override + public Collection<DexProgramClass> getClassDataLayout() { + return mixedSectionOffsets.getClassesWithData(); + } + + @Override + public Collection<ProgramMethod> getCodeLayout() { + return getCodeLayoutForClasses(mixedSectionOffsets.getClassesWithData()); + } + + final Collection<ProgramMethod> getCodeLayoutForClasses(Collection<DexProgramClass> classes) { + ProgramMethodMap<String> codeToSignatureMap = ProgramMethodMap.create(); + List<ProgramMethod> codesSorted = new ArrayList<>(); + for (DexProgramClass clazz : classes) { + clazz.forEachProgramMethodMatching( + DexEncodedMethod::hasCode, + method -> { + DexWritableCode code = method.getDefinition().getDexWritableCodeOrNull(); + assert code != null || method.getDefinition().shouldNotHaveCode(); + if (code != null) { + codesSorted.add(method); + codeToSignatureMap.put( + method, getKeyForDexCodeSorting(method, appView.app().getProguardMap())); + } + }); + } + codesSorted.sort(Comparator.comparing(codeToSignatureMap::get)); + return codesSorted; + } + + private static String getKeyForDexCodeSorting(ProgramMethod method, ClassNameMapper proguardMap) { + // TODO(b/173999869): Could this instead compute sorting using dex items? + Signature signature; + String originalClassName; + if (proguardMap != null) { + signature = proguardMap.originalSignatureOf(method.getReference()); + originalClassName = proguardMap.originalNameOf(method.getHolderType()); + } else { + signature = MethodSignature.fromDexMethod(method.getReference()); + originalClassName = method.getHolderType().toSourceString(); + } + return originalClassName + signature; + } + + @Override + public Collection<DexEncodedArray> getEncodedArrayLayout() { + return mixedSectionOffsets.getEncodedArrays(); + } + + @Override + public Collection<DexString> getStringDataLayout() { + return mixedSectionOffsets.getStringData(); + } + + @Override + public Collection<DexTypeList> getTypeListLayout() { + return mixedSectionOffsets.getTypeLists(); + } +}
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java index 7a3ccf5..8705bb4 100644 --- a/src/main/java/com/android/tools/r8/dex/DexParser.java +++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -9,8 +9,8 @@ import static com.android.tools.r8.utils.EncodedValueUtils.parseUnsigned; import com.android.tools.r8.ProgramResource.Kind; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InstructionFactory; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInstructionFactory; import com.android.tools.r8.errors.CompilationError; import com.android.tools.r8.graph.ApplicationReaderMap; import com.android.tools.r8.graph.ClassAccessFlags; @@ -167,7 +167,7 @@ dexReader.position(offset); dexReader.align(4); DexCode code = parseCodeItem(); - codes.put(offset, code); // Update the file local offset to code mapping. + codes.put(offset, code); // Update the file local offset to code mapping. dexReader.position(currentPos); } } @@ -297,7 +297,7 @@ DexMethodHandle value = indexedItems.getMethodHandle((int) parseUnsigned(dexReader, size)); return new DexValue.DexValueMethodHandle(value); - } + } default: throw new IndexOutOfBoundsException(); } @@ -306,9 +306,10 @@ private void checkName(DexString name) { if (!options.itemFactory.getSkipNameValidationForTesting() && !name.isValidSimpleName(options.getMinApiLevel())) { - throw new CompilationError("Space characters in SimpleName '" - + name.toASCIIString() - + "' are not allowed prior to DEX version 040"); + throw new CompilationError( + "Space characters in SimpleName '" + + name.toASCIIString() + + "' are not allowed prior to DEX version 040"); } } @@ -333,7 +334,6 @@ return values; } - private DexEncodedArray parseEncodedArray() { return new DexEncodedArray(parseEncodedArrayValues()); } @@ -415,10 +415,11 @@ DexParameterAnnotation[] result = new DexParameterAnnotation[size]; for (int i = 0; i < size; i++) { DexMethod method = indexedItems.getMethod(methodIndices[i]); - result[i] = new DexParameterAnnotation( - method, - annotationSetRefListAt(annotationOffsets[i]) - .withParameterCount(method.proto.parameters.size())); + result[i] = + new DexParameterAnnotation( + method, + annotationSetRefListAt(annotationOffsets[i]) + .withParameterCount(method.proto.parameters.size())); } dexReader.position(saved); return result; @@ -433,11 +434,11 @@ private <S> Object cacheAt(int offset, Supplier<S> function) { if (offset == 0) { - return null; // return null for offset zero. + return null; // return null for offset zero. } Object result = offsetMap.get(offset); if (result != null) { - return result; // return the cached result. + return result; // return the cached result. } // Cache is empty so parse the structure. dexReader.position(offset); @@ -484,8 +485,7 @@ } DexType dupType = DexAnnotationSet.findDuplicateEntryType(result); if (dupType != null) { - throw new CompilationError( - "Multiple annotations of type `" + dupType.toSourceString() + "`"); + throw new CompilationError("Multiple annotations of type `" + dupType.toSourceString() + "`"); } return DexAnnotationSet.create(result); } @@ -500,8 +500,8 @@ } private AnnotationsDirectory annotationsDirectoryAt(int offset) { - return (AnnotationsDirectory) cacheAt(offset, this::parseAnnotationsDirectory, - AnnotationsDirectory::empty); + return (AnnotationsDirectory) + cacheAt(offset, this::parseAnnotationsDirectory, AnnotationsDirectory::empty); } private AnnotationsDirectory parseAnnotationsDirectory() { @@ -513,10 +513,7 @@ final DexMethodAnnotation[] methods = parseMethodAnnotations(methodsSize); final DexParameterAnnotation[] parameters = parseParameterAnnotations(parametersSize); return new AnnotationsDirectory( - annotationSetAt(classAnnotationsOff), - fields, - methods, - parameters); + annotationSetAt(classAnnotationsOff), fields, methods, parameters); } private DexDebugInfo debugInfoAt(int offset) { @@ -548,72 +545,82 @@ events.add(dexItemFactory.createAdvanceLine(dexReader.getSleb128())); isPcBasedDebugInfo = false; break; - case Constants.DBG_START_LOCAL: { - int registerNum = dexReader.getUleb128(); - int nameIdx = dexReader.getUleb128p1(); - int typeIdx = dexReader.getUleb128p1(); - events.add(new DexDebugEvent.StartLocal( - registerNum, - nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx), - typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx), - null)); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_START_LOCAL_EXTENDED: { - int registerNum = dexReader.getUleb128(); - int nameIdx = dexReader.getUleb128p1(); - int typeIdx = dexReader.getUleb128p1(); - int sigIdx = dexReader.getUleb128p1(); - events.add(new DexDebugEvent.StartLocal( - registerNum, - nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx), - typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx), - sigIdx == NO_INDEX ? null : indexedItems.getString(sigIdx))); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_END_LOCAL: { - events.add(dexItemFactory.createEndLocal(dexReader.getUleb128())); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_RESTART_LOCAL: { - events.add(dexItemFactory.createRestartLocal(dexReader.getUleb128())); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_SET_PROLOGUE_END: { - events.add(dexItemFactory.createSetPrologueEnd()); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_SET_EPILOGUE_BEGIN: { - events.add(dexItemFactory.createSetEpilogueBegin()); - isPcBasedDebugInfo = false; - break; - } - case Constants.DBG_SET_FILE: { - int nameIdx = dexReader.getUleb128p1(); - DexString sourceFile = nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx); - if (options.readDebugSetFileEvent) { - events.add(dexItemFactory.createSetFile(sourceFile)); + case Constants.DBG_START_LOCAL: + { + int registerNum = dexReader.getUleb128(); + int nameIdx = dexReader.getUleb128p1(); + int typeIdx = dexReader.getUleb128p1(); + events.add( + new DexDebugEvent.StartLocal( + registerNum, + nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx), + typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx), + null)); + isPcBasedDebugInfo = false; + break; } - isPcBasedDebugInfo = false; - break; - } - default: { - assert head >= 0x0a && head <= 0xff; - Default event = dexItemFactory.createDefault(head); - events.add(event); - if (isPcBasedDebugInfo) { - if (events.size() == 1) { - isPcBasedDebugInfo = event.equals(dexItemFactory.zeroChangeDefaultEvent); - } else { - isPcBasedDebugInfo = event.equals(dexItemFactory.oneChangeDefaultEvent); + case Constants.DBG_START_LOCAL_EXTENDED: + { + int registerNum = dexReader.getUleb128(); + int nameIdx = dexReader.getUleb128p1(); + int typeIdx = dexReader.getUleb128p1(); + int sigIdx = dexReader.getUleb128p1(); + events.add( + new DexDebugEvent.StartLocal( + registerNum, + nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx), + typeIdx == NO_INDEX ? null : indexedItems.getType(typeIdx), + sigIdx == NO_INDEX ? null : indexedItems.getString(sigIdx))); + isPcBasedDebugInfo = false; + break; + } + case Constants.DBG_END_LOCAL: + { + events.add(dexItemFactory.createEndLocal(dexReader.getUleb128())); + isPcBasedDebugInfo = false; + break; + } + case Constants.DBG_RESTART_LOCAL: + { + events.add(dexItemFactory.createRestartLocal(dexReader.getUleb128())); + isPcBasedDebugInfo = false; + break; + } + case Constants.DBG_SET_PROLOGUE_END: + { + events.add(dexItemFactory.createSetPrologueEnd()); + isPcBasedDebugInfo = false; + break; + } + case Constants.DBG_SET_EPILOGUE_BEGIN: + { + events.add(dexItemFactory.createSetEpilogueBegin()); + isPcBasedDebugInfo = false; + break; + } + case Constants.DBG_SET_FILE: + { + int nameIdx = dexReader.getUleb128p1(); + DexString sourceFile = nameIdx == NO_INDEX ? null : indexedItems.getString(nameIdx); + if (options.readDebugSetFileEvent) { + events.add(dexItemFactory.createSetFile(sourceFile)); + } + isPcBasedDebugInfo = false; + break; + } + default: + { + assert head >= 0x0a && head <= 0xff; + Default event = dexItemFactory.createDefault(head); + events.add(event); + if (isPcBasedDebugInfo) { + if (events.size() == 1) { + isPcBasedDebugInfo = event.equals(dexItemFactory.zeroChangeDefaultEvent); + } else { + isPcBasedDebugInfo = event.equals(dexItemFactory.oneChangeDefaultEvent); + } } } - } } } return isPcBasedDebugInfo @@ -650,8 +657,8 @@ } } - private DexEncodedField[] readFields(int size, DexFieldAnnotation[] annotations, - DexValue[] staticValues) { + private DexEncodedField[] readFields( + int size, DexFieldAnnotation[] annotations, DexValue[] staticValues) { DexEncodedField[] fields = new DexEncodedField[size]; int fieldIndex = 0; MemberAnnotationIterator<DexField, DexAnnotationSet> annotationIterator = @@ -784,8 +791,9 @@ // Check if constraints from // https://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.1 are met. if (!flags.areValid(Constants.CORRESPONDING_CLASS_FILE_VERSION, false)) { - throw new CompilationError("Class " + type.toSourceString() - + " has illegal access flags. Found: " + flags, origin); + throw new CompilationError( + "Class " + type.toSourceString() + " has illegal access flags. Found: " + flags, + origin); } DexEncodedField[] staticFields = DexEncodedField.EMPTY_ARRAY; DexEncodedField[] instanceFields = DexEncodedField.EMPTY_ARRAY; @@ -811,8 +819,11 @@ int directMethodsSize = dexReader.getUleb128(); int virtualMethodsSize = dexReader.getUleb128(); - staticFields = readFields(staticFieldsSize, annotationsDirectory.fields, - staticValues != null ? staticValues.values : null); + staticFields = + readFields( + staticFieldsSize, + annotationsDirectory.fields, + staticValues != null ? staticValues.values : null); instanceFields = readFields(instanceFieldsSize, annotationsDirectory.fields, null); directMethods = readMethods( @@ -857,7 +868,7 @@ dexItemFactory.getSkipNameValidationForTesting(), checksumSupplier, null); - classCollection.accept(clazz); // Update the application object. + classCollection.accept(clazz); // Update the application object. } } @@ -913,8 +924,13 @@ for (int i = 0; i < result.length; i++) { DexSection dexSection = result[i]; int nextOffset = i < result.length - 1 ? result[i + 1].offset : dexSection.offset; - Log.debug(this.getClass(), "Read section 0x%04x @ 0x%08x #items %08d size 0x%08x.", - dexSection.type, dexSection.offset, dexSection.length, nextOffset - dexSection.offset); + Log.debug( + this.getClass(), + "Read section 0x%04x @ 0x%08x #items %08d size 0x%08x.", + dexSection.type, + dexSection.offset, + dexSection.length, + nextOffset - dexSection.offset); } } for (int i = 0; i < mapSize - 1; i++) { @@ -940,7 +956,7 @@ code[i] = dexReader.getShort(); } if (insnsSize % 2 != 0) { - dexReader.getUshort(); // Skip padding ushort + dexReader.getUshort(); // Skip padding ushort } if (triesSize > 0) { Int2IntArrayMap handlerMap = new Int2IntArrayMap(); @@ -987,20 +1003,20 @@ int saved = dexReader.position(); DexDebugInfo debugInfo = debugInfoAt(debugInfoOff); dexReader.position(saved); - InstructionFactory factory = new InstructionFactory(); - Instruction[] instructions = + DexInstructionFactory factory = new DexInstructionFactory(); + DexInstruction[] instructions = factory.readSequenceFrom(ShortBuffer.wrap(code), 0, code.length, indexedItems); return new DexCode(registerSize, insSize, outsSize, instructions, tries, handlers, debugInfo); } void populateIndexTables() { // Populate structures that are already sorted upon read. - populateStrings(); // Depends on nothing. + populateStrings(); // Depends on nothing. populateChecksums(); // Depends on Strings. - populateTypes(); // Depends on Strings. - populateFields(); // Depends on Types, and Strings. - populateProtos(); // Depends on Types and Strings. - populateMethods(); // Depends on Protos, Types, and Strings. + populateTypes(); // Depends on Strings. + populateFields(); // Depends on Types, and Strings. + populateProtos(); // Depends on Types and Strings. + populateMethods(); // Depends on Protos, Types, and Strings. populateMethodHandles(); // Depends on Methods and Fields populateCallSites(); // Depends on MethodHandles } @@ -1176,9 +1192,8 @@ * From https://source.android.com/devices/tech/dalvik/dex-format#file-layout: * * <p>This list must be sorted, where the defining type (by type_id index) is the major order, - * method name (by string_id index) is the intermediate order, and method prototype - * (by proto_id index) is the minor order. The list must not contain any duplicate entries. - * + * method name (by string_id index) is the intermediate order, and method prototype (by proto_id + * index) is the minor order. The list must not contain any duplicate entries. */ private boolean verifyOrderOfMethodIds(DexSection dexSection) { if (dexSection.length >= 2) { @@ -1288,18 +1303,20 @@ case INSTANCE_GET: case INSTANCE_PUT: case STATIC_GET: - case STATIC_PUT: { - fieldOrMethod = indexedItems.getField(indexFieldOrMethod); - break; - } + case STATIC_PUT: + { + fieldOrMethod = indexedItems.getField(indexFieldOrMethod); + break; + } case INVOKE_CONSTRUCTOR: case INVOKE_DIRECT: case INVOKE_INTERFACE: case INVOKE_INSTANCE: - case INVOKE_STATIC: { - fieldOrMethod = indexedItems.getMethod(indexFieldOrMethod); - break; - } + case INVOKE_STATIC: + { + fieldOrMethod = indexedItems.getMethod(indexFieldOrMethod); + break; + } default: throw new AssertionError("Method handle type unsupported in a dex file."); } @@ -1367,15 +1384,15 @@ private static final DexParameterAnnotation[] NO_PARAMETER_ANNOTATIONS = new DexParameterAnnotation[0]; - private static final DexFieldAnnotation[] NO_FIELD_ANNOTATIONS = - new DexFieldAnnotation[0]; + private static final DexFieldAnnotation[] NO_FIELD_ANNOTATIONS = new DexFieldAnnotation[0]; - private static final DexMethodAnnotation[] NO_METHOD_ANNOTATIONS = - new DexMethodAnnotation[0]; + private static final DexMethodAnnotation[] NO_METHOD_ANNOTATIONS = new DexMethodAnnotation[0]; private static final AnnotationsDirectory THE_EMPTY_ANNOTATIONS_DIRECTORY = - new AnnotationsDirectory(DexAnnotationSet.empty(), - NO_FIELD_ANNOTATIONS, new DexMethodAnnotation[0], + new AnnotationsDirectory( + DexAnnotationSet.empty(), + NO_FIELD_ANNOTATIONS, + new DexMethodAnnotation[0], NO_PARAMETER_ANNOTATIONS); public final DexAnnotationSet clazz; @@ -1383,7 +1400,8 @@ public final DexMethodAnnotation[] methods; public final DexParameterAnnotation[] parameters; - AnnotationsDirectory(DexAnnotationSet clazz, + AnnotationsDirectory( + DexAnnotationSet clazz, DexFieldAnnotation[] fields, DexMethodAnnotation[] methods, DexParameterAnnotation[] parameters) {
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java index ebf21c6..2c9ca25 100644 --- a/src/main/java/com/android/tools/r8/dex/FileWriter.java +++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -11,14 +11,12 @@ import com.android.tools.r8.errors.InvokeCustomDiagnostic; import com.android.tools.r8.errors.PrivateInterfaceMethodDiagnostic; import com.android.tools.r8.errors.StaticInterfaceMethodDiagnostic; -import com.android.tools.r8.graph.AppInfo; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexAnnotation; import com.android.tools.r8.graph.DexAnnotationDirectory; import com.android.tools.r8.graph.DexAnnotationElement; import com.android.tools.r8.graph.DexAnnotationSet; -import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.graph.DexCallSite; -import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair; @@ -46,12 +44,8 @@ import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ParameterAnnotationsList; import com.android.tools.r8.graph.ProgramClassVisitor; -import com.android.tools.r8.graph.ProgramDexCode; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.logging.Log; -import com.android.tools.r8.naming.ClassNameMapper; -import com.android.tools.r8.naming.MemberNaming.MethodSignature; -import com.android.tools.r8.naming.MemberNaming.Signature; import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.position.MethodPosition; import com.android.tools.r8.synthesis.SyntheticNaming; @@ -70,8 +64,6 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; -import java.util.Comparator; -import java.util.HashMap; import java.util.HashSet; import java.util.IdentityHashMap; import java.util.List; @@ -96,31 +88,33 @@ } } - private final ObjectToOffsetMapping mapping; - private final DexApplication application; - private final InternalOptions options; + private final AppView<?> appView; private final GraphLens graphLens; - private final NamingLens namingLens; + private final ObjectToOffsetMapping mapping; + private final InternalOptions options; private final DexOutputBuffer dest; private final MixedSectionOffsets mixedSectionOffsets; private final CodeToKeep desugaredLibraryCodeToKeep; - private final Map<DexProgramClass, DexEncodedArray> staticFieldValues = new IdentityHashMap<>(); + private final VirtualFile virtualFile; public FileWriter( + AppView<?> appView, ByteBufferProvider provider, ObjectToOffsetMapping mapping, - AppInfo appInfo, - InternalOptions options, - NamingLens namingLens, - CodeToKeep desugaredLibraryCodeToKeep) { + CodeToKeep desugaredLibraryCodeToKeep, + VirtualFile virtualFile) { + this.appView = appView; + this.graphLens = appView.graphLens(); this.mapping = mapping; - this.application = appInfo.app(); - this.options = options; - this.graphLens = mapping.getGraphLens(); - this.namingLens = namingLens; + this.options = appView.options(); this.dest = new DexOutputBuffer(provider); this.mixedSectionOffsets = new MixedSectionOffsets(options); this.desugaredLibraryCodeToKeep = desugaredLibraryCodeToKeep; + this.virtualFile = virtualFile; + } + + private NamingLens getNamingLens() { + return appView.getNamingLens(); } public static void writeEncodedAnnotation( @@ -140,20 +134,19 @@ public FileWriter collect() { // Use the class array from the mapping, as it has a deterministic iteration order. - new ProgramClassDependencyCollector(application, mapping.getClasses()) - .run(mapping.getClasses()); + new ProgramClassDependencyCollector(appView, mapping.getClasses()).run(mapping.getClasses()); // Add the static values for all fields now that we have committed to their sorting. mixedSectionOffsets.getClassesWithData().forEach(this::addStaticFieldValues); - // String data is not tracked by the MixedSectionCollection.new AppInfo(application, null) + // String data is not tracked by the MixedSectionCollection. assert mixedSectionOffsets.stringData.size() == 0; for (DexString string : mapping.getStrings()) { mixedSectionOffsets.add(string); } // Neither are the typelists in protos... for (DexProto proto : mapping.getProtos()) { - mixedSectionOffsets.add(proto.parameters); + mixedSectionOffsets.add(proto.getParameters()); } DexItem.collectAll(mixedSectionOffsets, mapping.getCallSites()); @@ -174,7 +167,9 @@ layout.setCodesOffset(layout.dataSectionOffset); // Sort the codes first, as their order might impact size due to alignment constraints. - List<ProgramDexCode> codes = sortDexCodesByClassName(); + MixedSectionLayoutStrategy mixedSectionLayoutStrategy = + MixedSectionLayoutStrategy.create(appView, mixedSectionOffsets, virtualFile); + Collection<ProgramMethod> codes = mixedSectionLayoutStrategy.getCodeLayout(); // Output the debug_info_items first, as they have no dependencies. dest.moveTo(layout.getCodesOffset() + sizeOfCodeItems(codes)); @@ -184,10 +179,11 @@ // Ensure deterministic ordering of debug info by sorting consistent with the code objects. layout.setDebugInfosOffset(dest.align(1)); Set<DexDebugInfoForWriting> seen = new HashSet<>(mixedSectionOffsets.getDebugInfos().size()); - for (ProgramDexCode code : codes) { - DexDebugInfoForWriting info = code.getCode().getDebugInfoForWriting(); + for (ProgramMethod method : codes) { + DexDebugInfoForWriting info = + method.getDefinition().getCode().asDexWritableCode().getDebugInfoForWriting(); if (info != null && seen.add(info)) { - writeDebugItem(info, graphLens); + writeDebugItem(info); } } } @@ -203,21 +199,41 @@ // Now the type lists and rest. dest.moveTo(layout.getTypeListsOffset()); - writeItems(mixedSectionOffsets.getTypeLists(), layout::alreadySetOffset, this::writeTypeList); - writeItems(mixedSectionOffsets.getStringData(), layout::setStringDataOffsets, + writeItems( + mixedSectionLayoutStrategy.getTypeListLayout(), + layout::alreadySetOffset, + this::writeTypeList); + writeItems( + mixedSectionLayoutStrategy.getStringDataLayout(), + layout::setStringDataOffsets, this::writeStringData); - writeItems(mixedSectionOffsets.getAnnotations(), layout::setAnnotationsOffset, + writeItems( + mixedSectionLayoutStrategy.getAnnotationLayout(), + layout::setAnnotationsOffset, this::writeAnnotation); - writeItems(mixedSectionOffsets.getClassesWithData(), layout::setClassDataOffset, + writeItems( + mixedSectionLayoutStrategy.getClassDataLayout(), + layout::setClassDataOffset, this::writeClassData); - writeItems(mixedSectionOffsets.getEncodedArrays(), layout::setEncodedArrarysOffset, + writeItems( + mixedSectionLayoutStrategy.getEncodedArrayLayout(), + layout::setEncodedArraysOffset, this::writeEncodedArray); - writeItems(mixedSectionOffsets.getAnnotationSets(), layout::setAnnotationSetsOffset, - this::writeAnnotationSet, 4); - writeItems(mixedSectionOffsets.getAnnotationSetRefLists(), - layout::setAnnotationSetRefListsOffset, this::writeAnnotationSetRefList, 4); - writeItems(mixedSectionOffsets.getAnnotationDirectories(), - layout::setAnnotationDirectoriesOffset, this::writeAnnotationDirectory, 4); + writeItems( + mixedSectionLayoutStrategy.getAnnotationSetLayout(), + layout::setAnnotationSetsOffset, + this::writeAnnotationSet, + 4); + writeItems( + mixedSectionLayoutStrategy.getAnnotationSetRefListLayout(), + layout::setAnnotationSetRefListsOffset, + this::writeAnnotationSetRefList, + 4); + writeItems( + mixedSectionLayoutStrategy.getAnnotationDirectoryLayout(), + layout::setAnnotationDirectoriesOffset, + this::writeAnnotationDirectory, + 4); // Add the map at the end layout.setMapOffset(dest.align(4)); @@ -265,7 +281,7 @@ // static methods, as well as public non-abstract (default) // and private instance methods. private void checkInterfaceMethod(DexEncodedMethod method) { - if (application.dexItemFactory.isClassConstructor(method.getReference())) { + if (appView.dexItemFactory().isClassConstructor(method.getReference())) { return; // Class constructor is always OK. } if (method.accessFlags.isStatic()) { @@ -304,7 +320,7 @@ } private boolean verifyNames() { - if (options.itemFactory.getSkipNameValidationForTesting()) { + if (appView.dexItemFactory().getSkipNameValidationForTesting()) { return true; } @@ -325,40 +341,6 @@ return true; } - private List<ProgramDexCode> sortDexCodesByClassName() { - Map<ProgramDexCode, String> codeToSignatureMap = new IdentityHashMap<>(); - List<ProgramDexCode> codesSorted = new ArrayList<>(); - for (DexProgramClass clazz : mapping.getClasses()) { - clazz.forEachProgramMethod( - method -> { - DexWritableCode code = method.getDefinition().getDexWritableCodeOrNull(); - assert code != null || method.getDefinition().shouldNotHaveCode(); - if (code != null) { - ProgramDexCode programCode = new ProgramDexCode(code, method); - codesSorted.add(programCode); - codeToSignatureMap.put( - programCode, getKeyForDexCodeSorting(method, application.getProguardMap())); - } - }); - } - codesSorted.sort(Comparator.comparing(codeToSignatureMap::get)); - return codesSorted; - } - - private static String getKeyForDexCodeSorting(ProgramMethod method, ClassNameMapper proguardMap) { - // TODO(b/173999869): Could this instead compute sorting using dex items? - Signature signature; - String originalClassName; - if (proguardMap != null) { - signature = proguardMap.originalSignatureOf(method.getReference()); - originalClassName = proguardMap.originalNameOf(method.getHolderType()); - } else { - signature = MethodSignature.fromDexMethod(method.getReference()); - originalClassName = method.getHolderType().toSourceString(); - } - return originalClassName + signature; - } - private <T extends IndexedDexItem> void writeFixedSectionItems( Collection<T> items, int offset, Consumer<T> writer) { assert dest.position() == offset; @@ -390,11 +372,11 @@ } } - private int sizeOfCodeItems(Iterable<ProgramDexCode> codes) { + private int sizeOfCodeItems(Iterable<ProgramMethod> methods) { int size = 0; - for (ProgramDexCode code : codes) { + for (ProgramMethod method : methods) { size = alignSize(4, size); - size += sizeOfCodeItem(code.getCode()); + size += sizeOfCodeItem(method.getDefinition().getCode().asDexWritableCode()); } return size; } @@ -431,7 +413,7 @@ } private void writeTypeItem(DexType type) { - DexString descriptor = namingLens.lookupDescriptor(type); + DexString descriptor = getNamingLens().lookupDescriptor(type); dest.putInt(mapping.getOffsetFor(descriptor)); } @@ -448,7 +430,7 @@ int typeIdx = mapping.getOffsetFor(field.type); assert (typeIdx & 0xFFFF) == typeIdx; dest.putShort((short) typeIdx); - DexString name = namingLens.lookupName(field); + DexString name = getNamingLens().lookupName(field); dest.putInt(mapping.getOffsetFor(name)); } @@ -459,13 +441,12 @@ int protoIdx = mapping.getOffsetFor(method.proto); assert (protoIdx & 0xFFFF) == protoIdx; dest.putShort((short) protoIdx); - DexString name = namingLens.lookupName(method); + DexString name = getNamingLens().lookupName(method); dest.putInt(mapping.getOffsetFor(name)); } private void writeClassDefItem(DexProgramClass clazz) { desugaredLibraryCodeToKeep.recordHierarchyOf(clazz); - dest.putInt(mapping.getOffsetFor(clazz.type)); dest.putInt(clazz.accessFlags.getAsDexAccessFlags()); dest.putInt( @@ -476,19 +457,20 @@ dest.putInt(mixedSectionOffsets.getOffsetForAnnotationsDirectory(clazz)); dest.putInt( clazz.hasMethodsOrFields() ? mixedSectionOffsets.getOffsetFor(clazz) : Constants.NO_OFFSET); - dest.putInt(mixedSectionOffsets.getOffsetFor(staticFieldValues.get(clazz))); + dest.putInt( + mixedSectionOffsets.getOffsetFor(mixedSectionOffsets.getStaticFieldValuesForClass(clazz))); } - private void writeDebugItem(DexDebugInfoForWriting debugInfo, GraphLens graphLens) { + private void writeDebugItem(DexDebugInfoForWriting debugInfo) { mixedSectionOffsets.setOffsetFor(debugInfo, dest.position()); dest.putBytes(new DebugBytecodeWriter(debugInfo, mapping, graphLens).generate()); } - private void writeCodeItem(ProgramDexCode code) { - writeCodeItem(code.getCode(), code.getMethod()); + private void writeCodeItem(ProgramMethod method) { + writeCodeItem(method, method.getDefinition().getCode().asDexWritableCode()); } - private void writeCodeItem(DexWritableCode code, ProgramMethod method) { + private void writeCodeItem(ProgramMethod method, DexWritableCode code) { mixedSectionOffsets.setOffsetFor(method.getDefinition(), code, dest.align(4)); // Fixed size header information. dest.putShort((short) code.getRegisterSize(method)); @@ -630,7 +612,7 @@ a.getReference().acceptCompareTo(b.getReference(), mapping.getCompareToVisitor())); int currentOffset = 0; for (DexEncodedField field : fields) { - assert field.validateDexValue(application.dexItemFactory); + assert field.validateDexValue(appView.dexItemFactory()); int nextOffset = mapping.getOffsetFor(field.getReference()); assert nextOffset - currentOffset >= 0; dest.putUleb128(nextOffset - currentOffset); @@ -683,10 +665,9 @@ // We have collected the individual components of this array due to the data stored in // DexEncodedField#staticValues. However, we have to collect the DexEncodedArray itself // here. - DexEncodedArray staticValues = clazz.computeStaticValuesArray(namingLens); + DexEncodedArray staticValues = clazz.computeStaticValuesArray(getNamingLens()); if (staticValues != null) { - staticFieldValues.put(clazz, staticValues); - mixedSectionOffsets.add(staticValues); + mixedSectionOffsets.setStaticFieldValuesForClass(clazz, staticValues); } } @@ -780,8 +761,11 @@ mixedSectionOffsets.getAnnotations().size()); size += writeMapItem(Constants.TYPE_CLASS_DATA_ITEM, layout.getClassDataOffset(), mixedSectionOffsets.getClassesWithData().size()); - size += writeMapItem(Constants.TYPE_ENCODED_ARRAY_ITEM, layout.getEncodedArrarysOffset(), - mixedSectionOffsets.getEncodedArrays().size()); + size += + writeMapItem( + Constants.TYPE_ENCODED_ARRAY_ITEM, + layout.getEncodedArraysOffset(), + mixedSectionOffsets.getEncodedArrays().size()); size += writeMapItem(Constants.TYPE_ANNOTATION_SET_ITEM, layout.getAnnotationSetsOffset(), mixedSectionOffsets.getAnnotationSets().size()); size += writeMapItem(Constants.TYPE_ANNOTATION_SET_REF_LIST, @@ -885,12 +869,19 @@ private int annotationSetRefListsOffset = NOT_SET; // aligned private int annotationDirectoriesOffset = NOT_SET; // aligned private int classDataOffset = NOT_SET; - private int encodedArrarysOffset = NOT_SET; + private int encodedArraysOffset = NOT_SET; private int mapOffset = NOT_SET; private int endOfFile = NOT_SET; - private Layout(int stringIdsOffset, int typeIdsOffset, int protoIdsOffset, int fieldIdsOffset, - int methodIdsOffset, int classDefsOffset, int callSiteIdsOffset, int methodHandleIdsOffset, + private Layout( + int stringIdsOffset, + int typeIdsOffset, + int protoIdsOffset, + int fieldIdsOffset, + int methodIdsOffset, + int classDefsOffset, + int callSiteIdsOffset, + int methodHandleIdsOffset, int dataSectionOffset) { this.stringIdsOffset = stringIdsOffset; this.typeIdsOffset = typeIdsOffset; @@ -1029,14 +1020,14 @@ this.classDataOffset = classDataOffset; } - public int getEncodedArrarysOffset() { - assert isValidOffset(encodedArrarysOffset, false); - return encodedArrarysOffset; + public int getEncodedArraysOffset() { + assert isValidOffset(encodedArraysOffset, false); + return encodedArraysOffset; } - public void setEncodedArrarysOffset(int encodedArrarysOffset) { - assert this.encodedArrarysOffset == NOT_SET; - this.encodedArrarysOffset = encodedArrarysOffset; + public void setEncodedArraysOffset(int encodedArraysOffset) { + assert this.encodedArraysOffset == NOT_SET; + this.encodedArraysOffset = encodedArraysOffset; } public int getMapOffset() { @@ -1063,7 +1054,7 @@ * These offsets are then used to resolve cross-references between items from different sections * into a file offset. */ - private static class MixedSectionOffsets extends MixedSectionCollection { + static class MixedSectionOffsets extends MixedSectionCollection { private static final int NOT_SET = -1; private static final int NOT_KNOWN = -2; @@ -1078,12 +1069,14 @@ = createObject2IntMap(); private final Object2IntMap<DexAnnotationDirectory> annotationDirectories = createObject2IntMap(); - private final Object2IntMap<DexProgramClass> classesWithData = createObject2IntMap(); + private final Reference2IntMap<DexProgramClass> classesWithData = createReference2IntMap(); private final Object2IntMap<DexEncodedArray> encodedArrays = createObject2IntMap(); - private final Map<DexProgramClass, DexAnnotationDirectory> clazzToAnnotationDirectory - = new HashMap<>(); + private final Map<DexProgramClass, DexAnnotationDirectory> classToAnnotationDirectory = + new IdentityHashMap<>(); + private final Map<DexProgramClass, DexEncodedArray> classToStaticFieldValues = + new IdentityHashMap<>(); - private final AndroidApiLevel minApiLevel; + private final InternalOptions options; private static <T> Object2IntMap<T> createObject2IntMap() { Object2IntMap<T> result = new Object2IntLinkedOpenHashMap<>(); @@ -1098,7 +1091,7 @@ } private MixedSectionOffsets(InternalOptions options) { - this.minApiLevel = options.getMinApiLevel(); + this.options = options; } private <T> boolean add(Object2IntMap<T> map, T item) { @@ -1129,9 +1122,7 @@ @Override public boolean add(DexAnnotationSet annotationSet) { - // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to - // work around a DALVIK bug. See b/36951668. - if ((minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) && annotationSet.isEmpty()) { + if (!options.canHaveDalvikEmptyAnnotationSetBug() && annotationSet.isEmpty()) { return false; } return add(annotationSets, annotationSet); @@ -1174,11 +1165,19 @@ } @Override - public boolean setAnnotationsDirectoryForClass(DexProgramClass clazz, - DexAnnotationDirectory annotationDirectory) { - DexAnnotationDirectory previous = clazzToAnnotationDirectory.put(clazz, annotationDirectory); + public void setAnnotationsDirectoryForClass( + DexProgramClass clazz, DexAnnotationDirectory annotationDirectory) { + DexAnnotationDirectory previous = classToAnnotationDirectory.put(clazz, annotationDirectory); assert previous == null; - return add(annotationDirectories, annotationDirectory); + add(annotationDirectories, annotationDirectory); + } + + @Override + public void setStaticFieldValuesForClass( + DexProgramClass clazz, DexEncodedArray staticFieldValues) { + DexEncodedArray previous = classToStaticFieldValues.put(clazz, staticFieldValues); + assert previous == null; + add(staticFieldValues); } public boolean add(DexString string) { @@ -1266,12 +1265,11 @@ return lookup(debugInfo, debugInfos); } - public int getOffsetForAnnotationsDirectory(DexProgramClass clazz) { if (!clazz.hasClassOrMemberAnnotations()) { return Constants.NO_OFFSET; } - int offset = annotationDirectories.getInt(clazzToAnnotationDirectory.get(clazz)); + int offset = annotationDirectories.getInt(getAnnotationDirectoryForClass(clazz)); assert offset != NOT_KNOWN; return offset; } @@ -1281,9 +1279,7 @@ } public int getOffsetFor(DexAnnotationSet annotationSet) { - // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to - // work around a DALVIK bug. See b/36951668. - if ((minApiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.J_MR1)) && annotationSet.isEmpty()) { + if (!options.canHaveDalvikEmptyAnnotationSetBug() && annotationSet.isEmpty()) { return 0; } return lookup(annotationSet, annotationSets); @@ -1332,9 +1328,7 @@ } void setOffsetFor(DexAnnotationSet annotationSet, int offset) { - // Until we fully drop support for API levels < 17, we have to emit an empty annotation set to - // work around a DALVIK bug. See b/36951668. - assert (minApiLevel.isLessThan(AndroidApiLevel.J_MR1)) || !annotationSet.isEmpty(); + assert options.canHaveDalvikEmptyAnnotationSetBug() || !annotationSet.isEmpty(); setOffsetFor(annotationSet, offset, annotationSets); } @@ -1354,29 +1348,31 @@ assert offset != 0 && !annotationSetRefList.isEmpty(); setOffsetFor(annotationSetRefList, offset, annotationSetRefLists); } + + DexAnnotationDirectory getAnnotationDirectoryForClass(DexProgramClass clazz) { + return classToAnnotationDirectory.get(clazz); + } + + DexEncodedArray getStaticFieldValuesForClass(DexProgramClass clazz) { + return classToStaticFieldValues.get(clazz); + } } private class ProgramClassDependencyCollector extends ProgramClassVisitor { - private final Set<DexClass> includedClasses = Sets.newIdentityHashSet(); + private final Set<DexProgramClass> includedClasses = Sets.newIdentityHashSet(); - ProgramClassDependencyCollector(DexApplication application, DexProgramClass[] includedClasses) { - super(application); + ProgramClassDependencyCollector(AppView<?> appView, DexProgramClass[] includedClasses) { + super(appView); Collections.addAll(this.includedClasses, includedClasses); } @Override - public void visit(DexType type) { - // Intentionally left empty. - } - - @Override - public void visit(DexClass clazz) { + public void visit(DexProgramClass clazz) { // Only visit classes that are part of the current file. - if (!includedClasses.contains(clazz)) { - return; + if (includedClasses.contains(clazz)) { + clazz.addDependencies(mixedSectionOffsets); } - clazz.addDependencies(mixedSectionOffsets); } }
diff --git a/src/main/java/com/android/tools/r8/dex/IndexedItemCollection.java b/src/main/java/com/android/tools/r8/dex/IndexedItemCollection.java index 1de1144..393439d 100644 --- a/src/main/java/com/android/tools/r8/dex/IndexedItemCollection.java +++ b/src/main/java/com/android/tools/r8/dex/IndexedItemCollection.java
@@ -12,9 +12,7 @@ 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.GraphLens; import com.android.tools.r8.graph.IndexedDexItem; -import com.android.tools.r8.graph.InitClassLens; /** * Common interface for constant pools. @@ -100,24 +98,4 @@ * @return true if the method handle was not in the pool before. */ boolean addMethodHandle(DexMethodHandle methodHandle); - - default GraphLens getGraphLens() { - return GraphLens.getIdentityLens(); - } - - default InitClassLens getInitClassLens() { - return InitClassLens.getThrowingInstance(); - } - - default DexString getRenamedName(DexMethod method) { - return method.name; - } - - default DexString getRenamedName(DexField field) { - return field.name; - } - - default DexString getRenamedDescriptor(DexType type) { - return type.descriptor; - } }
diff --git a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java index 9978311..c78eaac 100644 --- a/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java +++ b/src/main/java/com/android/tools/r8/dex/InheritanceClassInDexDistributor.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.IntBox; import com.android.tools.r8.utils.ThreadUtils; import com.google.common.collect.Maps; @@ -70,7 +69,7 @@ public void updateNumbersOfIds() { // Use a temporary VirtualFile to evaluate the number of ids in the group. - VirtualFile virtualFile = new VirtualFile(0, appView, namingLens); + VirtualFile virtualFile = new VirtualFile(0, appView); // Note: sort not needed. for (DexProgramClass clazz : members) { virtualFile.addClass(clazz); @@ -286,7 +285,6 @@ private final Set<DexProgramClass> classes; private final AppView<?> appView; private final IntBox nextFileId; - private final NamingLens namingLens; private final DirectSubClassesInfo directSubClasses; public InheritanceClassInDexDistributor( @@ -295,7 +293,6 @@ List<VirtualFile> filesForDistribution, Set<DexProgramClass> classes, IntBox nextFileId, - NamingLens namingLens, AppView<?> appView, ExecutorService executorService) { this.mainDex = mainDex; @@ -303,7 +300,6 @@ this.filesForDistribution = filesForDistribution; this.classes = classes; this.nextFileId = nextFileId; - this.namingLens = namingLens; this.appView = appView; this.executorService = executorService; @@ -320,7 +316,7 @@ // Allocate member of groups depending on // the main dex members VirtualFileCycler cycler = - new VirtualFileCycler(files, filesForDistribution, appView, namingLens, nextFileId); + new VirtualFileCycler(files, filesForDistribution, appView, nextFileId); for (Iterator<ClassGroup> iter = remainingInheritanceGroups.iterator(); iter.hasNext();) { ClassGroup group = iter.next(); if (group.dependsOnMainDexClasses) {
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java index fc3784f..785158d 100644 --- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java +++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -6,29 +6,29 @@ import static com.android.tools.r8.graph.DexCode.TryHandler.NO_HANDLER; import static com.android.tools.r8.graph.DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstStringJumbo; -import com.android.tools.r8.code.Format21t; -import com.android.tools.r8.code.Format22t; -import com.android.tools.r8.code.Format31t; -import com.android.tools.r8.code.Goto; -import com.android.tools.r8.code.Goto16; -import com.android.tools.r8.code.Goto32; -import com.android.tools.r8.code.IfEq; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.IfGe; -import com.android.tools.r8.code.IfGez; -import com.android.tools.r8.code.IfGt; -import com.android.tools.r8.code.IfGtz; -import com.android.tools.r8.code.IfLe; -import com.android.tools.r8.code.IfLez; -import com.android.tools.r8.code.IfLt; -import com.android.tools.r8.code.IfLtz; -import com.android.tools.r8.code.IfNe; -import com.android.tools.r8.code.IfNez; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.Nop; -import com.android.tools.r8.code.SwitchPayload; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstStringJumbo; +import com.android.tools.r8.dex.code.DexFormat21t; +import com.android.tools.r8.dex.code.DexFormat22t; +import com.android.tools.r8.dex.code.DexFormat31t; +import com.android.tools.r8.dex.code.DexGoto; +import com.android.tools.r8.dex.code.DexGoto16; +import com.android.tools.r8.dex.code.DexGoto32; +import com.android.tools.r8.dex.code.DexIfEq; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexIfGe; +import com.android.tools.r8.dex.code.DexIfGez; +import com.android.tools.r8.dex.code.DexIfGt; +import com.android.tools.r8.dex.code.DexIfGtz; +import com.android.tools.r8.dex.code.DexIfLe; +import com.android.tools.r8.dex.code.DexIfLez; +import com.android.tools.r8.dex.code.DexIfLt; +import com.android.tools.r8.dex.code.DexIfLtz; +import com.android.tools.r8.dex.code.DexIfNe; +import com.android.tools.r8.dex.code.DexIfNez; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNop; +import com.android.tools.r8.dex.code.DexSwitchPayload; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; @@ -57,11 +57,11 @@ public class JumboStringRewriter { private static class TryTargets { - private Instruction start; - private Instruction end; + private DexInstruction start; + private DexInstruction end; private final boolean endsAfterLastInstruction; - TryTargets(Instruction start, Instruction end, boolean endsAfterLastInstruction) { + TryTargets(DexInstruction start, DexInstruction end, boolean endsAfterLastInstruction) { assert start != null; assert end != null; this.start = start; @@ -69,7 +69,7 @@ this.endsAfterLastInstruction = endsAfterLastInstruction; } - void replaceTarget(Instruction target, Instruction newTarget) { + void replaceTarget(DexInstruction target, DexInstruction newTarget) { if (start == target) { start = newTarget; } @@ -93,14 +93,16 @@ private final DexEncodedMethod method; private final DexString firstJumboString; private final DexItemFactory factory; - private final Map<Instruction, List<Instruction>> instructionTargets = new IdentityHashMap<>(); + private final Map<DexInstruction, List<DexInstruction>> instructionTargets = + new IdentityHashMap<>(); private EventBasedDebugInfo debugEventBasedInfo = null; - private final Int2ReferenceMap<Instruction> debugEventTargets = new Int2ReferenceOpenHashMap<>(); - private final Map<Instruction, Instruction> payloadToSwitch = new IdentityHashMap<>(); + private final Int2ReferenceMap<DexInstruction> debugEventTargets = + new Int2ReferenceOpenHashMap<>(); + private final Map<DexInstruction, DexInstruction> payloadToSwitch = new IdentityHashMap<>(); private final Map<Try, TryTargets> tryTargets = new IdentityHashMap<>(); - private final Int2ReferenceMap<Instruction> tryRangeStartAndEndTargets - = new Int2ReferenceOpenHashMap<>(); - private final Map<TryHandler, List<Instruction>> handlerTargets = new IdentityHashMap<>(); + private final Int2ReferenceMap<DexInstruction> tryRangeStartAndEndTargets = + new Int2ReferenceOpenHashMap<>(); + private final Map<TryHandler, List<DexInstruction>> handlerTargets = new IdentityHashMap<>(); public JumboStringRewriter( DexEncodedMethod method, DexString firstJumboString, DexItemFactory factory) { @@ -114,7 +116,7 @@ // instructions to the actual instruction referenced. recordTargets(); // Expand the code by rewriting jumbo strings and branching instructions. - List<Instruction> newInstructions = expandCode(); + List<DexInstruction> newInstructions = expandCode(); // Commit to the new instruction offsets and update instructions, try-catch structures // and debug info with the new offsets. rewriteInstructionOffsets(newInstructions); @@ -128,7 +130,7 @@ oldCode.registerSize, oldCode.incomingRegisterSize, oldCode.outgoingRegisterSize, - newInstructions.toArray(Instruction.EMPTY_ARRAY), + newInstructions.toArray(DexInstruction.EMPTY_ARRAY), newTries, newHandlers, newDebugInfo); @@ -138,44 +140,44 @@ return newCode; } - private void rewriteInstructionOffsets(List<Instruction> instructions) { - for (Instruction instruction : instructions) { - if (instruction instanceof Format22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe - Format22t condition = (Format22t) instruction; + private void rewriteInstructionOffsets(List<DexInstruction> instructions) { + for (DexInstruction instruction : instructions) { + if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe + DexFormat22t condition = (DexFormat22t) instruction; int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset(); assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE; condition.CCCC = (short) offset; - } else if (instruction instanceof Format21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez - Format21t condition = (Format21t) instruction; + } else if (instruction instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez + DexFormat21t condition = (DexFormat21t) instruction; int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset(); assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE; condition.BBBB = (short) offset; - } else if (instruction instanceof Goto) { - Goto jump = (Goto) instruction; + } else if (instruction instanceof DexGoto) { + DexGoto jump = (DexGoto) instruction; int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); assert Byte.MIN_VALUE <= offset && offset <= Byte.MAX_VALUE; jump.AA = (byte) offset; - } else if (instruction instanceof Goto16) { - Goto16 jump = (Goto16) instruction; + } else if (instruction instanceof DexGoto16) { + DexGoto16 jump = (DexGoto16) instruction; int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE; jump.AAAA = (short) offset; - } else if (instruction instanceof Goto32) { - Goto32 jump = (Goto32) instruction; + } else if (instruction instanceof DexGoto32) { + DexGoto32 jump = (DexGoto32) instruction; int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); jump.AAAAAAAA = offset; - } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch - Format31t payloadUser = (Format31t) instruction; + } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch + DexFormat31t payloadUser = (DexFormat31t) instruction; int offset = instructionTargets.get(payloadUser).get(0).getOffset() - instruction.getOffset(); payloadUser.setPayloadOffset(offset); - } else if (instruction instanceof SwitchPayload) { - SwitchPayload payload = (SwitchPayload) instruction; - Instruction switchInstruction = payloadToSwitch.get(payload); - List<Instruction> switchTargets = instructionTargets.get(payload); + } else if (instruction instanceof DexSwitchPayload) { + DexSwitchPayload payload = (DexSwitchPayload) instruction; + DexInstruction switchInstruction = payloadToSwitch.get(payload); + List<DexInstruction> switchTargets = instructionTargets.get(payload); int[] targets = payload.switchTargetOffsets(); for (int i = 0; i < switchTargets.size(); i++) { - Instruction target = switchTargets.get(i); + DexInstruction target = switchTargets.get(i); targets[i] = target.getOffset() - switchInstruction.getOffset(); } } @@ -199,8 +201,8 @@ TryHandler[] result = new TryHandler[code.handlers.length]; for (int i = 0; i < code.handlers.length; i++) { TryHandler handler = code.handlers[i]; - List<Instruction> targets = handlerTargets.get(handler); - Iterator<Instruction> it = targets.iterator(); + List<DexInstruction> targets = handlerTargets.get(handler); + Iterator<DexInstruction> it = targets.iterator(); int catchAllAddr = NO_HANDLER; if (handler.catchAllAddr != NO_HANDLER) { catchAllAddr = it.next().getOffset(); @@ -226,14 +228,14 @@ if (event instanceof AdvancePC) { AdvancePC advance = (AdvancePC) event; lastOriginalOffset += advance.delta; - Instruction target = debugEventTargets.get(lastOriginalOffset); + DexInstruction target = debugEventTargets.get(lastOriginalOffset); int pcDelta = target.getOffset() - lastNewOffset; events.add(factory.createAdvancePC(pcDelta)); lastNewOffset = target.getOffset(); } else if (event instanceof Default) { Default defaultEvent = (Default) event; lastOriginalOffset += defaultEvent.getPCDelta(); - Instruction target = debugEventTargets.get(lastOriginalOffset); + DexInstruction target = debugEventTargets.get(lastOriginalOffset); int lineDelta = defaultEvent.getLineDelta(); int pcDelta = target.getOffset() - lastNewOffset; addDefaultEventWithAdvancePcIfNecessary(lineDelta, pcDelta, events, factory); @@ -250,116 +252,116 @@ return code.getDebugInfo(); } - private List<Instruction> expandCode() { - LinkedList<Instruction> instructions = new LinkedList<>(); + private List<DexInstruction> expandCode() { + LinkedList<DexInstruction> instructions = new LinkedList<>(); Collections.addAll(instructions, method.getCode().asDexCode().instructions); int offsetDelta; do { - ListIterator<Instruction> it = instructions.listIterator(); + ListIterator<DexInstruction> it = instructions.listIterator(); offsetDelta = 0; while (it.hasNext()) { - Instruction instruction = it.next(); + DexInstruction instruction = it.next(); int orignalOffset = instruction.getOffset(); instruction.setOffset(orignalOffset + offsetDelta); - if (instruction instanceof ConstString) { - ConstString string = (ConstString) instruction; + if (instruction instanceof DexConstString) { + DexConstString string = (DexConstString) instruction; if (string.getString().compareTo(firstJumboString) >= 0) { - ConstStringJumbo jumboString = new ConstStringJumbo(string.AA, string.getString()); + DexConstStringJumbo jumboString = + new DexConstStringJumbo(string.AA, string.getString()); jumboString.setOffset(string.getOffset()); offsetDelta++; it.set(jumboString); replaceTarget(instruction, jumboString); } - } else if (instruction instanceof Format22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe - Format22t condition = (Format22t) instruction; + } else if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe + DexFormat22t condition = (DexFormat22t) instruction; int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset(); if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) { - Format22t newCondition = null; + DexFormat22t newCondition = null; switch (condition.getType().inverted()) { case EQ: - newCondition = new IfEq(condition.A, condition.B, 0); + newCondition = new DexIfEq(condition.A, condition.B, 0); break; case GE: - newCondition = new IfGe(condition.A, condition.B, 0); + newCondition = new DexIfGe(condition.A, condition.B, 0); break; case GT: - newCondition = new IfGt(condition.A, condition.B, 0); + newCondition = new DexIfGt(condition.A, condition.B, 0); break; case LE: - newCondition = new IfLe(condition.A, condition.B, 0); + newCondition = new DexIfLe(condition.A, condition.B, 0); break; case LT: - newCondition = new IfLt(condition.A, condition.B, 0); + newCondition = new DexIfLt(condition.A, condition.B, 0); break; case NE: - newCondition = new IfNe(condition.A, condition.B, 0); + newCondition = new DexIfNe(condition.A, condition.B, 0); break; } offsetDelta = rewriteIfToIfAndGoto(offsetDelta, it, condition, newCondition); } - } else if (instruction instanceof Format21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez - Format21t condition = (Format21t) instruction; + } else if (instruction + instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez + DexFormat21t condition = (DexFormat21t) instruction; int offset = instructionTargets.get(condition).get(0).getOffset() - instruction.getOffset(); if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) { - Format21t newCondition = null; + DexFormat21t newCondition = null; switch (condition.getType().inverted()) { case EQ: - newCondition = new IfEqz(condition.AA, 0); + newCondition = new DexIfEqz(condition.AA, 0); break; case GE: - newCondition = new IfGez(condition.AA, 0); + newCondition = new DexIfGez(condition.AA, 0); break; case GT: - newCondition = new IfGtz(condition.AA, 0); + newCondition = new DexIfGtz(condition.AA, 0); break; case LE: - newCondition = new IfLez(condition.AA, 0); + newCondition = new DexIfLez(condition.AA, 0); break; case LT: - newCondition = new IfLtz(condition.AA, 0); + newCondition = new DexIfLtz(condition.AA, 0); break; case NE: - newCondition = new IfNez(condition.AA, 0); + newCondition = new DexIfNez(condition.AA, 0); break; } offsetDelta = rewriteIfToIfAndGoto(offsetDelta, it, condition, newCondition); } - } else if (instruction instanceof Goto) { - Goto jump = (Goto) instruction; - int offset = - instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); + } else if (instruction instanceof DexGoto) { + DexGoto jump = (DexGoto) instruction; + int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); if (Byte.MIN_VALUE > offset || offset > Byte.MAX_VALUE) { - Instruction newJump; + DexInstruction newJump; if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) { - newJump = new Goto32(offset); + newJump = new DexGoto32(offset); } else { - newJump = new Goto16(offset); + newJump = new DexGoto16(offset); } newJump.setOffset(jump.getOffset()); it.set(newJump); offsetDelta += (newJump.getSize() - jump.getSize()); replaceTarget(jump, newJump); - List<Instruction> targets = instructionTargets.remove(jump); + List<DexInstruction> targets = instructionTargets.remove(jump); instructionTargets.put(newJump, targets); } - } else if (instruction instanceof Goto16) { - Goto16 jump = (Goto16) instruction; - int offset = - instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); + } else if (instruction instanceof DexGoto16) { + DexGoto16 jump = (DexGoto16) instruction; + int offset = instructionTargets.get(jump).get(0).getOffset() - instruction.getOffset(); if (Short.MIN_VALUE > offset || offset > Short.MAX_VALUE) { - Instruction newJump = new Goto32(offset); + DexInstruction newJump = new DexGoto32(offset); newJump.setOffset(jump.getOffset()); it.set(newJump); offsetDelta += (newJump.getSize() - jump.getSize()); replaceTarget(jump, newJump); - List<Instruction> targets = instructionTargets.remove(jump); + List<DexInstruction> targets = instructionTargets.remove(jump); instructionTargets.put(newJump, targets); } - } else if (instruction instanceof Goto32) { + } else if (instruction instanceof DexGoto32) { // Instruction big enough for any offset. - } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch + } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch // Instruction big enough for any offset. } else if (instruction.isPayload()) { // Payload instructions must be 4 byte aligned (instructions are 2 bytes). @@ -368,7 +370,7 @@ // Check if the previous instruction was a simple nop. If that is the case, remove it // to make the alignment instead of adding another one. Only allow removal if this // instruction is not targeted by anything. See b/78072750. - Instruction instructionBeforePayload = it.hasPrevious() ? it.previous() : null; + DexInstruction instructionBeforePayload = it.hasPrevious() ? it.previous() : null; if (instructionBeforePayload != null && instructionBeforePayload.isSimpleNop() && debugEventTargets.get(orignalOffset) == null @@ -379,7 +381,7 @@ if (instructionBeforePayload != null) { it.next(); } - Nop nop = new Nop(); + DexNop nop = new DexNop(); nop.setOffset(instruction.getOffset()); it.add(nop); offsetDelta++; @@ -396,11 +398,11 @@ private int rewriteIfToIfAndGoto( int offsetDelta, - ListIterator<Instruction> it, - Instruction condition, - Instruction newCondition) { + ListIterator<DexInstruction> it, + DexInstruction condition, + DexInstruction newCondition) { int jumpOffset = condition.getOffset() + condition.getSize(); - Goto32 jump = new Goto32(0); + DexGoto32 jump = new DexGoto32(0); jump.setOffset(jumpOffset); newCondition.setOffset(condition.getOffset()); it.set(newCondition); @@ -408,17 +410,17 @@ it.add(jump); offsetDelta += jump.getSize(); instructionTargets.put(jump, instructionTargets.remove(condition)); - Instruction fallthroughInstruction = it.next(); + DexInstruction fallthroughInstruction = it.next(); instructionTargets.put(newCondition, Lists.newArrayList(fallthroughInstruction)); it.previous(); return offsetDelta; } - private void replaceTarget(Instruction target, Instruction newTarget) { - for (List<Instruction> instructions : instructionTargets.values()) { + private void replaceTarget(DexInstruction target, DexInstruction newTarget) { + for (List<DexInstruction> instructions : instructionTargets.values()) { instructions.replaceAll((i) -> i == target ? newTarget : i); } - for (Int2ReferenceMap.Entry<Instruction> entry : debugEventTargets.int2ReferenceEntrySet()) { + for (Int2ReferenceMap.Entry<DexInstruction> entry : debugEventTargets.int2ReferenceEntrySet()) { if (entry.getValue() == target) { entry.setValue(newTarget); } @@ -426,52 +428,53 @@ for (Entry<Try, TryTargets> entry : tryTargets.entrySet()) { entry.getValue().replaceTarget(target, newTarget); } - for (List<Instruction> instructions : handlerTargets.values()) { + for (List<DexInstruction> instructions : handlerTargets.values()) { instructions.replaceAll((i) -> i == target ? newTarget : i); } } - private void recordInstructionTargets(Int2ReferenceMap<Instruction> offsetToInstruction) { - Instruction[] instructions = method.getCode().asDexCode().instructions; - for (Instruction instruction : instructions) { - if (instruction instanceof Format22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe - Format22t condition = (Format22t) instruction; - Instruction target = offsetToInstruction.get(condition.getOffset() + condition.CCCC); + private void recordInstructionTargets(Int2ReferenceMap<DexInstruction> offsetToInstruction) { + DexInstruction[] instructions = method.getCode().asDexCode().instructions; + for (DexInstruction instruction : instructions) { + if (instruction instanceof DexFormat22t) { // IfEq, IfGe, IfGt, IfLe, IfLt, IfNe + DexFormat22t condition = (DexFormat22t) instruction; + DexInstruction target = offsetToInstruction.get(condition.getOffset() + condition.CCCC); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction instanceof Format21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez - Format21t condition = (Format21t) instruction; - Instruction target = offsetToInstruction.get(condition.getOffset() + condition.BBBB); + } else if (instruction instanceof DexFormat21t) { // IfEqz, IfGez, IfGtz, IfLez, IfLtz, IfNez + DexFormat21t condition = (DexFormat21t) instruction; + DexInstruction target = offsetToInstruction.get(condition.getOffset() + condition.BBBB); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction instanceof Goto) { - Goto jump = (Goto) instruction; - Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AA); + } else if (instruction instanceof DexGoto) { + DexGoto jump = (DexGoto) instruction; + DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AA); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction instanceof Goto16) { - Goto16 jump = (Goto16) instruction; - Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAA); + } else if (instruction instanceof DexGoto16) { + DexGoto16 jump = (DexGoto16) instruction; + DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAA); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction instanceof Goto32) { - Goto32 jump = (Goto32) instruction; - Instruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAAAAAA); + } else if (instruction instanceof DexGoto32) { + DexGoto32 jump = (DexGoto32) instruction; + DexInstruction target = offsetToInstruction.get(jump.getOffset() + jump.AAAAAAAA); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch - Format31t offsetInstruction = (Format31t) instruction; - Instruction target = offsetToInstruction.get( - offsetInstruction.getOffset() + offsetInstruction.getPayloadOffset()); + } else if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch + DexFormat31t offsetInstruction = (DexFormat31t) instruction; + DexInstruction target = + offsetToInstruction.get( + offsetInstruction.getOffset() + offsetInstruction.getPayloadOffset()); assert target != null; instructionTargets.put(instruction, Lists.newArrayList(target)); - } else if (instruction instanceof SwitchPayload) { - SwitchPayload payload = (SwitchPayload) instruction; + } else if (instruction instanceof DexSwitchPayload) { + DexSwitchPayload payload = (DexSwitchPayload) instruction; int[] targetOffsets = payload.switchTargetOffsets(); int switchOffset = payloadToSwitch.get(instruction).getOffset(); - List<Instruction> targets = new ArrayList<>(); + List<DexInstruction> targets = new ArrayList<>(); for (int i = 0; i < targetOffsets.length; i++) { - Instruction target = offsetToInstruction.get(switchOffset + targetOffsets[i]); + DexInstruction target = offsetToInstruction.get(switchOffset + targetOffsets[i]); assert target != null; targets.add(target); } @@ -480,7 +483,7 @@ } } - private void recordDebugEventTargets(Int2ReferenceMap<Instruction> offsetToInstruction) { + private void recordDebugEventTargets(Int2ReferenceMap<DexInstruction> offsetToInstruction) { // TODO(b/213411850): Merging pc based D8 builds will map out of PC for any jumbo processed // method. Instead we should rather retain the PC encoding by bumping the max-pc and recording // the line number translation. We actually need to do so to support merging with native PC @@ -496,13 +499,13 @@ if (event instanceof AdvancePC) { AdvancePC advance = (AdvancePC) event; address += advance.delta; - Instruction target = offsetToInstruction.get(address); + DexInstruction target = offsetToInstruction.get(address); assert target != null; debugEventTargets.put(address, target); } else if (event instanceof Default) { Default defaultEvent = (Default) event; address += defaultEvent.getPCDelta(); - Instruction target = offsetToInstruction.get(address); + DexInstruction target = offsetToInstruction.get(address); assert target != null; debugEventTargets.put(address, target); } @@ -510,12 +513,11 @@ } private void recordTryAndHandlerTargets( - Int2ReferenceMap<Instruction> offsetToInstruction, - Instruction lastInstruction) { + Int2ReferenceMap<DexInstruction> offsetToInstruction, DexInstruction lastInstruction) { DexCode code = method.getCode().asDexCode(); for (Try theTry : code.tries) { - Instruction start = offsetToInstruction.get(theTry.startAddress); - Instruction end = null; + DexInstruction start = offsetToInstruction.get(theTry.startAddress); + DexInstruction end = null; int endAddress = theTry.startAddress + theTry.instructionCount; TryTargets targets; if (endAddress > lastInstruction.getOffset()) { @@ -532,14 +534,14 @@ tryRangeStartAndEndTargets.put(end.getOffset(), end); } for (TryHandler handler : code.handlers) { - List<Instruction> targets = new ArrayList<>(); + List<DexInstruction> targets = new ArrayList<>(); if (handler.catchAllAddr != NO_HANDLER) { - Instruction target = offsetToInstruction.get(handler.catchAllAddr); + DexInstruction target = offsetToInstruction.get(handler.catchAllAddr); assert target != null; targets.add(target); } for (TypeAddrPair pair : handler.pairs) { - Instruction target = offsetToInstruction.get(pair.addr); + DexInstruction target = offsetToInstruction.get(pair.addr); assert target != null; targets.add(target); } @@ -548,19 +550,19 @@ } private void recordTargets() { - Int2ReferenceMap<Instruction> offsetToInstruction = new Int2ReferenceOpenHashMap<>(); - Instruction[] instructions = method.getCode().asDexCode().instructions; + Int2ReferenceMap<DexInstruction> offsetToInstruction = new Int2ReferenceOpenHashMap<>(); + DexInstruction[] instructions = method.getCode().asDexCode().instructions; boolean containsPayloads = false; - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { offsetToInstruction.put(instruction.getOffset(), instruction); - if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch + if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch containsPayloads = true; } } if (containsPayloads) { - for (Instruction instruction : instructions) { - if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch - Instruction payload = + for (DexInstruction instruction : instructions) { + if (instruction.hasPayload()) { // FillArrayData, SparseSwitch, PackedSwitch + DexInstruction payload = offsetToInstruction.get(instruction.getOffset() + instruction.getPayloadOffset()); assert payload != null; payloadToSwitch.put(payload, instruction); @@ -569,7 +571,7 @@ } recordInstructionTargets(offsetToInstruction); recordDebugEventTargets(offsetToInstruction); - Instruction lastInstruction = instructions[instructions.length - 1]; + DexInstruction lastInstruction = instructions[instructions.length - 1]; recordTryAndHandlerTargets(offsetToInstruction, lastInstruction); } }
diff --git a/src/main/java/com/android/tools/r8/dex/MixedSectionCollection.java b/src/main/java/com/android/tools/r8/dex/MixedSectionCollection.java index f0c4c06..d80b036 100644 --- a/src/main/java/com/android/tools/r8/dex/MixedSectionCollection.java +++ b/src/main/java/com/android/tools/r8/dex/MixedSectionCollection.java
@@ -110,10 +110,16 @@ /** * Adds the given annotation directory to the collection. * - * Add a dependency between the clazz and the annotation directory. - * - * @return true if the item was not added before + * <p>Adds a dependency between the clazz and the annotation directory. */ - public abstract boolean setAnnotationsDirectoryForClass(DexProgramClass clazz, - DexAnnotationDirectory annotationDirectory); + public abstract void setAnnotationsDirectoryForClass( + DexProgramClass clazz, DexAnnotationDirectory annotationDirectory); + + /** + * Adds the given static field values array to the collection. + * + * <p>Adds a dependency between the clazz and the static field values array. + */ + public abstract void setStaticFieldValuesForClass( + DexProgramClass clazz, DexEncodedArray staticFieldValues); }
diff --git a/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java new file mode 100644 index 0000000..5454b0f --- /dev/null +++ b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
@@ -0,0 +1,56 @@ +// Copyright (c) 2022, 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.dex; + +import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets; +import com.android.tools.r8.experimental.startup.StartupOrder; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexAnnotation; +import com.android.tools.r8.graph.DexAnnotationDirectory; +import com.android.tools.r8.graph.DexAnnotationSet; +import com.android.tools.r8.graph.DexEncodedArray; +import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.graph.DexString; +import com.android.tools.r8.graph.DexTypeList; +import com.android.tools.r8.graph.ParameterAnnotationsList; +import com.android.tools.r8.graph.ProgramMethod; +import java.util.Collection; + +public abstract class MixedSectionLayoutStrategy { + + public static MixedSectionLayoutStrategy create( + AppView<?> appView, MixedSectionOffsets mixedSectionOffsets, VirtualFile virtualFile) { + StartupOrder startupOrderForWriting = + virtualFile.getId() == 0 && appView.hasClassHierarchy() + ? appView + .appInfoWithClassHierarchy() + .getStartupOrder() + .toStartupOrderForWriting(appView) + : StartupOrder.empty(); + if (startupOrderForWriting.isEmpty()) { + return new DefaultMixedSectionLayoutStrategy(appView, mixedSectionOffsets); + } + return new StartupMixedSectionLayoutStrategy( + appView, mixedSectionOffsets, startupOrderForWriting, virtualFile); + } + + public abstract Collection<DexAnnotation> getAnnotationLayout(); + + public abstract Collection<DexAnnotationDirectory> getAnnotationDirectoryLayout(); + + public abstract Collection<DexAnnotationSet> getAnnotationSetLayout(); + + public abstract Collection<ParameterAnnotationsList> getAnnotationSetRefListLayout(); + + public abstract Collection<DexProgramClass> getClassDataLayout(); + + public abstract Collection<ProgramMethod> getCodeLayout(); + + public abstract Collection<DexEncodedArray> getEncodedArrayLayout(); + + public abstract Collection<DexString> getStringDataLayout(); + + public abstract Collection<DexTypeList> getTypeListLayout(); +}
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 eaf736d..e249186 100644 --- a/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java +++ b/src/main/java/com/android/tools/r8/dex/ResourceAdapter.java
@@ -37,16 +37,12 @@ private final NamingLens namingLens; private final InternalOptions options; - public ResourceAdapter( - AppView<?> appView, - DexItemFactory dexItemFactory, - NamingLens namingLens, - InternalOptions options) { + public ResourceAdapter(AppView<?> appView) { this.appView = appView; - this.dexItemFactory = dexItemFactory; + this.dexItemFactory = appView.dexItemFactory(); this.graphLens = appView.graphLens(); - this.namingLens = namingLens; - this.options = options; + this.namingLens = appView.getNamingLens(); + this.options = appView.options(); } public DataEntryResource adaptIfNeeded(DataEntryResource file) {
diff --git a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java new file mode 100644 index 0000000..b5ccc6b --- /dev/null +++ b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
@@ -0,0 +1,226 @@ +// Copyright (c) 2022, 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.dex; + +import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets; +import com.android.tools.r8.experimental.startup.StartupOrder; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexAnnotation; +import com.android.tools.r8.graph.DexAnnotationDirectory; +import com.android.tools.r8.graph.DexAnnotationSet; +import com.android.tools.r8.graph.DexCallSite; +import com.android.tools.r8.graph.DexEncodedArray; +import com.android.tools.r8.graph.DexEncodedMethod; +import com.android.tools.r8.graph.DexField; +import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.DexMethodHandle; +import com.android.tools.r8.graph.DexProgramClass; +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.DexTypeList; +import com.android.tools.r8.graph.ParameterAnnotationsList; +import com.android.tools.r8.graph.ProgramMethod; +import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; +import com.android.tools.r8.utils.MapUtils; +import com.android.tools.r8.utils.collections.LinkedProgramMethodSet; +import com.android.tools.r8.utils.collections.ProgramMethodSet; +import java.util.Collection; +import java.util.LinkedHashSet; +import java.util.Map; +import java.util.Set; + +public class StartupMixedSectionLayoutStrategy extends DefaultMixedSectionLayoutStrategy { + + private final StartupOrder startupOrderForWriting; + + private final LinkedHashSet<DexAnnotation> annotationLayout; + private final LinkedHashSet<DexAnnotationDirectory> annotationDirectoryLayout; + private final LinkedHashSet<DexAnnotationSet> annotationSetLayout; + private final LinkedHashSet<ParameterAnnotationsList> annotationSetRefListLayout; + private final LinkedHashSet<DexProgramClass> classDataLayout; + private final LinkedProgramMethodSet codeLayout; + private final LinkedHashSet<DexEncodedArray> encodedArrayLayout; + private final LinkedHashSet<DexString> stringDataLayout; + private final LinkedHashSet<DexTypeList> typeListLayout; + + public StartupMixedSectionLayoutStrategy( + AppView<?> appView, + MixedSectionOffsets mixedSectionOffsets, + StartupOrder startupOrderForWriting, + VirtualFile virtualFile) { + super(appView, mixedSectionOffsets); + this.startupOrderForWriting = startupOrderForWriting; + + // Initialize startup layouts. + this.annotationLayout = new LinkedHashSet<>(mixedSectionOffsets.getAnnotations().size()); + this.annotationDirectoryLayout = + new LinkedHashSet<>(mixedSectionOffsets.getAnnotationDirectories().size()); + this.annotationSetLayout = new LinkedHashSet<>(mixedSectionOffsets.getAnnotationSets().size()); + this.annotationSetRefListLayout = + new LinkedHashSet<>(mixedSectionOffsets.getAnnotationSetRefLists().size()); + this.classDataLayout = new LinkedHashSet<>(mixedSectionOffsets.getClassesWithData().size()); + this.codeLayout = ProgramMethodSet.createLinked(mixedSectionOffsets.getCodes().size()); + this.encodedArrayLayout = new LinkedHashSet<>(mixedSectionOffsets.getEncodedArrays().size()); + this.stringDataLayout = new LinkedHashSet<>(mixedSectionOffsets.getStringData().size()); + this.typeListLayout = new LinkedHashSet<>(mixedSectionOffsets.getTypeLists().size()); + + // Add startup items to startup layouts. + collectStartupItems(virtualFile); + } + + private void collectStartupItems(VirtualFile virtualFile) { + Map<DexType, DexProgramClass> virtualFileDefinitions = + MapUtils.newIdentityHashMap( + builder -> + virtualFile.classes().forEach(clazz -> builder.accept(clazz.getType(), clazz)), + virtualFile.classes().size()); + LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(appView, true); + StartupIndexedItemCollection indexedItemCollection = new StartupIndexedItemCollection(); + for (DexType startupClass : startupOrderForWriting.getClasses()) { + DexProgramClass definition = virtualFileDefinitions.get(startupClass); + if (definition != null) { + definition.collectIndexedItems(appView, indexedItemCollection, rewriter); + } + } + } + + private static <T> Collection<T> amendStartupLayout( + Collection<T> startupLayout, Collection<T> defaultLayout) { + startupLayout.addAll(defaultLayout); + return startupLayout; + } + + @Override + public Collection<DexAnnotation> getAnnotationLayout() { + return amendStartupLayout(annotationLayout, super.getAnnotationLayout()); + } + + @Override + public Collection<DexAnnotationDirectory> getAnnotationDirectoryLayout() { + return amendStartupLayout(annotationDirectoryLayout, super.getAnnotationDirectoryLayout()); + } + + @Override + public Collection<DexAnnotationSet> getAnnotationSetLayout() { + return amendStartupLayout(annotationSetLayout, super.getAnnotationSetLayout()); + } + + @Override + public Collection<ParameterAnnotationsList> getAnnotationSetRefListLayout() { + return amendStartupLayout(annotationSetRefListLayout, super.getAnnotationSetRefListLayout()); + } + + @Override + public Collection<DexProgramClass> getClassDataLayout() { + return amendStartupLayout(classDataLayout, super.getClassDataLayout()); + } + + @Override + public Collection<ProgramMethod> getCodeLayout() { + Set<DexProgramClass> nonStartupClasses = + new LinkedHashSet<>(mixedSectionOffsets.getClassesWithData()); + nonStartupClasses.removeIf(clazz -> startupOrderForWriting.contains(clazz.getType())); + return amendStartupLayout(codeLayout, super.getCodeLayoutForClasses(nonStartupClasses)); + } + + @Override + public Collection<DexEncodedArray> getEncodedArrayLayout() { + return amendStartupLayout(encodedArrayLayout, super.getEncodedArrayLayout()); + } + + @Override + public Collection<DexString> getStringDataLayout() { + return amendStartupLayout(stringDataLayout, super.getStringDataLayout()); + } + + @Override + public Collection<DexTypeList> getTypeListLayout() { + return amendStartupLayout(typeListLayout, super.getTypeListLayout()); + } + + private class StartupIndexedItemCollection implements IndexedItemCollection { + + private void addAnnotation(DexAnnotation annotation) { + annotationLayout.add(annotation); + } + + private void addAnnotationSet(DexAnnotationSet annotationSet) { + if (appView.options().canHaveDalvikEmptyAnnotationSetBug() || !annotationSet.isEmpty()) { + annotationSetLayout.add(annotationSet); + } + } + + private void addAnnotationSetRefList(ParameterAnnotationsList annotationSetRefList) { + if (!annotationSetRefList.isEmpty()) { + annotationSetRefListLayout.add(annotationSetRefList); + } + } + + @Override + public boolean addClass(DexProgramClass clazz) { + if (clazz.hasMethodsOrFields()) { + classDataLayout.add(clazz); + } + addTypeList(clazz.getInterfaces()); + clazz.forEachProgramMethodMatching(DexEncodedMethod::hasCode, codeLayout::add); + DexAnnotationDirectory annotationDirectory = + mixedSectionOffsets.getAnnotationDirectoryForClass(clazz); + if (annotationDirectory != null) { + annotationDirectoryLayout.add(annotationDirectory); + annotationDirectory.visitAnnotations( + this::addAnnotation, this::addAnnotationSet, this::addAnnotationSetRefList); + } + DexEncodedArray staticFieldValues = mixedSectionOffsets.getStaticFieldValuesForClass(clazz); + if (staticFieldValues != null) { + encodedArrayLayout.add(staticFieldValues); + } + return true; + } + + @Override + public boolean addField(DexField field) { + return true; + } + + @Override + public boolean addMethod(DexMethod method) { + return true; + } + + @Override + public boolean addString(DexString string) { + return stringDataLayout.add(string); + } + + @Override + public boolean addProto(DexProto proto) { + addTypeList(proto.getParameters()); + return true; + } + + @Override + public boolean addType(DexType type) { + return true; + } + + private void addTypeList(DexTypeList typeList) { + if (!typeList.isEmpty()) { + typeListLayout.add(typeList); + } + } + + @Override + public boolean addCallSite(DexCallSite callSite) { + encodedArrayLayout.add(callSite.getEncodedArray()); + return true; + } + + @Override + public boolean addMethodHandle(DexMethodHandle methodHandle) { + return true; + } + } +}
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java index d5995f4..80b9a6c 100644 --- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java +++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -79,38 +79,32 @@ private final DexProgramClass primaryClass; private DebugRepresentation debugRepresentation; - VirtualFile( - int id, - AppView<?> appView, - NamingLens namingLens) { - this(id, appView, namingLens, null, null); + VirtualFile(int id, AppView<?> appView) { + this(id, appView, null, null); } VirtualFile( int id, AppView<?> appView, - NamingLens namingLens, FeatureSplit featureSplit) { - this(id, appView, namingLens, null, featureSplit); + this(id, appView, null, featureSplit); } private VirtualFile( int id, AppView<?> appView, - NamingLens namingLens, DexProgramClass primaryClass) { - this(id, appView, namingLens, primaryClass, null); + this(id, appView, primaryClass, null); } private VirtualFile( int id, AppView<?> appView, - NamingLens namingLens, DexProgramClass primaryClass, FeatureSplit featureSplit) { this.id = id; - this.indexedItems = new VirtualFileIndexedItemCollection(appView, namingLens); - this.transaction = new IndexedItemTransaction(indexedItems, appView, namingLens); + this.indexedItems = new VirtualFileIndexedItemCollection(appView); + this.transaction = new IndexedItemTransaction(indexedItems, appView); this.primaryClass = primaryClass; this.featureSplit = featureSplit; } @@ -199,7 +193,6 @@ public void computeMapping( AppView<?> appView, - NamingLens namingLens, int lazyDexStringsCount, Timing timing) { assert transaction.isEmpty(); @@ -207,7 +200,6 @@ objectMapping = new ObjectToOffsetMapping( appView, - namingLens, transaction.rewriter, indexedItems.classes, indexedItems.protos, @@ -326,8 +318,7 @@ // duplicated. if (!combineSyntheticClassesWithPrimaryClass || !appView.getSyntheticItems().isSyntheticClass(clazz)) { - VirtualFile file = - new VirtualFile(virtualFiles.size(), appView, writer.namingLens, clazz); + VirtualFile file = new VirtualFile(virtualFiles.size(), appView, clazz); virtualFiles.add(file); file.addClass(clazz); files.put(clazz, file); @@ -365,7 +356,7 @@ this.classes = SetUtils.newIdentityHashSet(classes); // Create the primary dex file. The distribution will add more if needed. - mainDexFile = new VirtualFile(0, appView, writer.namingLens); + mainDexFile = new VirtualFile(0, appView); assert virtualFiles.isEmpty(); virtualFiles.add(mainDexFile); addMarkers(mainDexFile); @@ -446,7 +437,6 @@ new VirtualFile( nextFileId.getAndIncrement(), appView, - writer.namingLens, featureSplitSetEntry.getKey()); virtualFiles.add(featureFile); addMarkers(featureFile); @@ -458,8 +448,7 @@ appView, featureSplitSetEntry.getValue(), originalNames, - nextFileId, - writer.namingLens) + nextFileId) .run(); } } @@ -510,19 +499,12 @@ filesForDistribution, classes, nextFileId, - writer.namingLens, appView, executorService) .distribute(); } else { new PackageSplitPopulator( - virtualFiles, - filesForDistribution, - appView, - classes, - originalNames, - nextFileId, - writer.namingLens) + virtualFiles, filesForDistribution, appView, classes, originalNames, nextFileId) .run(); } addFeatureSplitFiles(featureSplitClasses); @@ -573,10 +555,10 @@ private final Set<DexCallSite> callSites = Sets.newIdentityHashSet(); private final Set<DexMethodHandle> methodHandles = Sets.newIdentityHashSet(); - public VirtualFileIndexedItemCollection(AppView<?> appView, NamingLens namingLens) { + public VirtualFileIndexedItemCollection(AppView<?> appView) { this.graphLens = appView.graphLens(); this.initClassLens = appView.initClassLens(); - this.namingLens = namingLens; + this.namingLens = appView.getNamingLens(); } @Override @@ -627,45 +609,12 @@ int getNumberOfFields() { return fields.size(); } - - int getNumberOfStrings() { - return strings.size(); - } - - @Override - public GraphLens getGraphLens() { - return graphLens; - } - - @Override - public InitClassLens getInitClassLens() { - return initClassLens; - } - - @Override - public DexString getRenamedDescriptor(DexType type) { - return namingLens.lookupDescriptor(type); - } - - @Override - public DexString getRenamedName(DexMethod method) { - DexMethod mappedMethod = graphLens.lookupMethod(method); - assert namingLens.verifyRenamingConsistentWithResolution(mappedMethod); - return namingLens.lookupName(mappedMethod); - } - - @Override - public DexString getRenamedName(DexField field) { - return namingLens.lookupName(graphLens.lookupField(field)); - } } public static class IndexedItemTransaction implements IndexedItemCollection { private final AppView<?> appView; private final VirtualFileIndexedItemCollection base; - private final InitClassLens initClassLens; - private final NamingLens namingLens; private final LensCodeRewriterUtils rewriter; private final Set<DexProgramClass> classes = new LinkedHashSet<>(); @@ -677,17 +626,16 @@ private final Set<DexCallSite> callSites = new LinkedHashSet<>(); private final Set<DexMethodHandle> methodHandles = new LinkedHashSet<>(); - private IndexedItemTransaction( - VirtualFileIndexedItemCollection base, - AppView<?> appView, - NamingLens namingLens) { + private IndexedItemTransaction(VirtualFileIndexedItemCollection base, AppView<?> appView) { this.appView = appView; this.base = base; - this.initClassLens = appView.initClassLens(); - this.namingLens = namingLens; this.rewriter = new LensCodeRewriterUtils(appView, true); } + private NamingLens getNamingLens() { + return appView.getNamingLens(); + } + private <T extends DexItem> boolean maybeInsert(T item, Set<T> set, Set<T> baseSet) { if (baseSet.contains(item) || set.contains(item)) { return false; @@ -697,7 +645,7 @@ } void addClassAndDependencies(DexProgramClass clazz) { - clazz.collectIndexedItems(this, getGraphLens(), rewriter); + clazz.collectIndexedItems(appView, this, rewriter); } @Override @@ -741,32 +689,6 @@ return maybeInsert(methodHandle, methodHandles, base.methodHandles); } - @Override - public GraphLens getGraphLens() { - return appView.graphLens(); - } - - @Override - public InitClassLens getInitClassLens() { - return initClassLens; - } - - @Override - public DexString getRenamedDescriptor(DexType type) { - return namingLens.lookupDescriptor(type); - } - - @Override - public DexString getRenamedName(DexMethod method) { - assert namingLens.verifyRenamingConsistentWithResolution(method); - return namingLens.lookupName(method); - } - - @Override - public DexString getRenamedName(DexField field) { - return namingLens.lookupName(field); - } - int getNumberOfMethods() { return methods.size() + base.getNumberOfMethods(); } @@ -830,7 +752,6 @@ private final List<VirtualFile> files; private final List<VirtualFile> filesForDistribution; private final AppView<?> appView; - private final NamingLens namingLens; private final IntBox nextFileId; private Iterator<VirtualFile> allFilesCyclic; @@ -841,12 +762,10 @@ List<VirtualFile> files, List<VirtualFile> filesForDistribution, AppView<?> appView, - NamingLens namingLens, IntBox nextFileId) { this.files = files; this.filesForDistribution = new ArrayList<>(filesForDistribution); this.appView = appView; - this.namingLens = namingLens; this.nextFileId = nextFileId; if (filesForDistribution.size() > 0) { @@ -917,8 +836,7 @@ } private VirtualFile internalAddFile() { - VirtualFile newFile = - new VirtualFile(nextFileId.getAndIncrement(), appView, namingLens, featureSplit); + VirtualFile newFile = new VirtualFile(nextFileId.getAndIncrement(), appView, featureSplit); files.add(newFile); filesForDistribution.add(newFile); return newFile; @@ -1061,14 +979,12 @@ AppView<?> appView, Collection<DexProgramClass> classes, Map<DexProgramClass, String> originalNames, - IntBox nextFileId, - NamingLens namingLens) { + IntBox nextFileId) { this.classPartioning = PackageSplitClassPartioning.create(classes, appView, originalNames); this.originalNames = originalNames; this.dexItemFactory = appView.dexItemFactory(); this.options = appView.options(); - this.cycler = - new VirtualFileCycler(files, filesForDistribution, appView, namingLens, nextFileId); + this.cycler = new VirtualFileCycler(files, filesForDistribution, appView, nextFileId); } static boolean coveredByPrefix(String originalName, String currentPrefix) {
diff --git a/src/main/java/com/android/tools/r8/code/BytecodeStream.java b/src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java similarity index 87% rename from src/main/java/com/android/tools/r8/code/BytecodeStream.java rename to src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java index e928c3e..da1e31a 100644 --- a/src/main/java/com/android/tools/r8/code/BytecodeStream.java +++ b/src/main/java/com/android/tools/r8/dex/code/BytecodeStream.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; public interface BytecodeStream { @@ -23,7 +23,7 @@ * Returns the next byte value from the stream, i.e., the high value of the next short followed by * the low value. * - * Both bytes need to be consumed before the next call to {@link #nextShort()}. + * <p>Both bytes need to be consumed before the next call to {@link #nextShort()}. * * @return next byte value in the stream. */
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java similarity index 89% rename from src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java index 3d560fc..4d4d9bc 100644 --- a/src/main/java/com/android/tools/r8/code/CfOrDexInstanceFieldRead.java +++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstanceFieldRead.java
@@ -2,7 +2,7 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField;
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java index e8ac111..7bd1e7a 100644 --- a/src/main/java/com/android/tools/r8/code/CfOrDexInstruction.java +++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexInstruction.java
@@ -2,7 +2,7 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.cf.code.CfInstruction; @@ -12,5 +12,5 @@ boolean isCfInstruction(); - Instruction asDexInstruction(); + DexInstruction asDexInstruction(); }
diff --git a/src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java b/src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java similarity index 89% rename from src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java rename to src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java index 121023a..513543c 100644 --- a/src/main/java/com/android/tools/r8/code/CfOrDexStaticFieldRead.java +++ b/src/main/java/com/android/tools/r8/dex/code/CfOrDexStaticFieldRead.java
@@ -2,7 +2,7 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField;
diff --git a/src/main/java/com/android/tools/r8/code/AddDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java index ce962e2..d78dcbd 100644 --- a/src/main/java/com/android/tools/r8/code/AddDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddDouble extends Format23x { + +public class DexAddDouble extends DexFormat23x { public static final int OPCODE = 0xab; public static final String NAME = "AddDouble"; public static final String SMALI_NAME = "add-double"; - AddDouble(int high, BytecodeStream stream) { + DexAddDouble(int high, BytecodeStream stream) { super(high, stream); } - public AddDouble(int dest, int left, int right) { + public DexAddDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AddDouble2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java index a5a907b..c641b5f 100644 --- a/src/main/java/com/android/tools/r8/code/AddDouble2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddDouble2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddDouble2Addr extends Format12x { + +public class DexAddDouble2Addr extends DexFormat12x { public static final int OPCODE = 0xcb; public static final String NAME = "AddDouble2Addr"; public static final String SMALI_NAME = "add-double/2addr"; - AddDouble2Addr(int high, BytecodeStream stream) { + DexAddDouble2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AddDouble2Addr(int left, int right) { + public DexAddDouble2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java index 2d255ea..e745b30 100644 --- a/src/main/java/com/android/tools/r8/code/AddFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddFloat extends Format23x { +public class DexAddFloat extends DexFormat23x { public static final int OPCODE = 0xa6; public static final String NAME = "AddFloat"; public static final String SMALI_NAME = "add-float"; - AddFloat(int high, BytecodeStream stream) { + DexAddFloat(int high, BytecodeStream stream) { super(high, stream); } - public AddFloat(int dest, int left, int right) { + public DexAddFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AddFloat2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java index 0fb4691..e232cae 100644 --- a/src/main/java/com/android/tools/r8/code/AddFloat2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddFloat2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddFloat2Addr extends Format12x { +public class DexAddFloat2Addr extends DexFormat12x { public static final int OPCODE = 0xc6; public static final String NAME = "AddFloat2Addr"; public static final String SMALI_NAME = "add-float/2addr"; - AddFloat2Addr(int high, BytecodeStream stream) { + DexAddFloat2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AddFloat2Addr(int left, int right) { + public DexAddFloat2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddInt.java b/src/main/java/com/android/tools/r8/dex/code/DexAddInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddInt.java index ba05bbf..b9e3d75 100644 --- a/src/main/java/com/android/tools/r8/code/AddInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddInt extends Format23x { +public class DexAddInt extends DexFormat23x { public static final int OPCODE = 0x90; public static final String NAME = "AddInt"; public static final String SMALI_NAME = "add-int"; - AddInt(int high, BytecodeStream stream) { + DexAddInt(int high, BytecodeStream stream) { super(high, stream); } - public AddInt(int dest, int left, int right) { + public DexAddInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java index 1d50caf..cc38583 100644 --- a/src/main/java/com/android/tools/r8/code/AddInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddInt2Addr extends Format12x { +public class DexAddInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb0; public static final String NAME = "AddInt2Addr"; public static final String SMALI_NAME = "add-int/2addr"; - AddInt2Addr(int high, BytecodeStream stream) { + DexAddInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AddInt2Addr(int left, int right) { + public DexAddInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AddIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java index c05f238..07e6e6a 100644 --- a/src/main/java/com/android/tools/r8/code/AddIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddIntLit16 extends Format22s { +public class DexAddIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd0; public static final String NAME = "AddIntLit16"; public static final String SMALI_NAME = "add-int/lit16"; - AddIntLit16(int high, BytecodeStream stream) { + DexAddIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public AddIntLit16(int dest, int register, int constant) { + public DexAddIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/AddIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AddIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java index 8715c06..8093253 100644 --- a/src/main/java/com/android/tools/r8/code/AddIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddIntLit8 extends Format22b { +public class DexAddIntLit8 extends DexFormat22b { public static final int OPCODE = 0xd8; public static final String NAME = "AddIntLit8"; public static final String SMALI_NAME = "add-int/lit8"; - AddIntLit8(int high, BytecodeStream stream) { + DexAddIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public AddIntLit8(int dest, int register, int constant) { + public DexAddIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/AddLong.java b/src/main/java/com/android/tools/r8/dex/code/DexAddLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddLong.java index f3a6e3f..dbb0094 100644 --- a/src/main/java/com/android/tools/r8/code/AddLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddLong extends Format23x { + +public class DexAddLong extends DexFormat23x { public static final int OPCODE = 0x9b; public static final String NAME = "AddLong"; public static final String SMALI_NAME = "add-long"; - AddLong(int high, BytecodeStream stream) { + DexAddLong(int high, BytecodeStream stream) { super(high, stream); } - public AddLong(int dest, int left, int right) { + public DexAddLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AddLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AddLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java index 72cb8e6..0d93f58 100644 --- a/src/main/java/com/android/tools/r8/code/AddLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAddLong2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AddLong2Addr extends Format12x { + +public class DexAddLong2Addr extends DexFormat12x { public static final int OPCODE = 0xbb; public static final String NAME = "AddLong2Addr"; public static final String SMALI_NAME = "add-long/2addr"; - AddLong2Addr(int high, BytecodeStream stream) { + DexAddLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AddLong2Addr(int left, int right) { + public DexAddLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/Aget.java b/src/main/java/com/android/tools/r8/dex/code/DexAget.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Aget.java rename to src/main/java/com/android/tools/r8/dex/code/DexAget.java index 063df5e..71f365b 100644 --- a/src/main/java/com/android/tools/r8/code/Aget.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAget.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Aget extends Format23x { +public class DexAget extends DexFormat23x { public static final int OPCODE = 0x44; public static final String NAME = "Aget"; public static final String SMALI_NAME = "aget"; - /*package*/ Aget(int high, BytecodeStream stream) { + /*package*/ DexAget(int high, BytecodeStream stream) { super(high, stream); } - public Aget(int AA, int BB, int CC) { + public DexAget(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AgetBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java index fc05007..e969298 100644 --- a/src/main/java/com/android/tools/r8/code/AgetBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetBoolean.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetBoolean extends Format23x { +public class DexAgetBoolean extends DexFormat23x { public static final int OPCODE = 0x47; public static final String NAME = "AgetBoolean"; public static final String SMALI_NAME = "aget-boolean"; - AgetBoolean(int high, BytecodeStream stream) { + DexAgetBoolean(int high, BytecodeStream stream) { super(high, stream); } - public AgetBoolean(int AA, int BB, int CC) { + public DexAgetBoolean(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AgetByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java index f7bc165..addb35e 100644 --- a/src/main/java/com/android/tools/r8/code/AgetByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetByte.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetByte extends Format23x { +public class DexAgetByte extends DexFormat23x { public static final int OPCODE = 0x48; public static final String NAME = "AgetByte"; public static final String SMALI_NAME = "aget-byte"; - /*package*/ AgetByte(int high, BytecodeStream stream) { + /*package*/ DexAgetByte(int high, BytecodeStream stream) { super(high, stream); } - public AgetByte(int AA, int BB, int CC) { + public DexAgetByte(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AgetChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java index fc7804e..ed8ac21 100644 --- a/src/main/java/com/android/tools/r8/code/AgetChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetChar.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetChar extends Format23x { +public class DexAgetChar extends DexFormat23x { public static final int OPCODE = 0x49; public static final String NAME = "AgetChar"; public static final String SMALI_NAME = "aget-char"; - /*package*/ AgetChar(int high, BytecodeStream stream) { + /*package*/ DexAgetChar(int high, BytecodeStream stream) { super(high, stream); } - public AgetChar(int AA, int BB, int CC) { + public DexAgetChar(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AgetObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java index 1574602..8cbedda 100644 --- a/src/main/java/com/android/tools/r8/code/AgetObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetObject.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetObject extends Format23x { + +public class DexAgetObject extends DexFormat23x { public static final int OPCODE = 0x46; public static final String NAME = "AgetObject"; public static final String SMALI_NAME = "aget-object"; - AgetObject(int high, BytecodeStream stream) { + DexAgetObject(int high, BytecodeStream stream) { super(high, stream); } - public AgetObject(int AA, int BB, int CC) { + public DexAgetObject(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AgetShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java index d7fb45a..fd887b1 100644 --- a/src/main/java/com/android/tools/r8/code/AgetShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetShort.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetShort extends Format23x { +public class DexAgetShort extends DexFormat23x { public static final int OPCODE = 0x4a; public static final String NAME = "AgetShort"; public static final String SMALI_NAME = "aget-short"; - AgetShort(int high, BytecodeStream stream) { + DexAgetShort(int high, BytecodeStream stream) { super(high, stream); } - public AgetShort(int AA, int BB, int CC) { + public DexAgetShort(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AgetWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java index 64c645d..59a0923 100644 --- a/src/main/java/com/android/tools/r8/code/AgetWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAgetWide.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AgetWide extends Format23x { +public class DexAgetWide extends DexFormat23x { public static final int OPCODE = 0x45; public static final String NAME = "AgetWide"; public static final String SMALI_NAME = "aget-wide"; - /*package*/ AgetWide(int high, BytecodeStream stream) { + /*package*/ DexAgetWide(int high, BytecodeStream stream) { super(high, stream); } - public AgetWide(int AA, int BB, int CC) { + public DexAgetWide(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AndInt.java b/src/main/java/com/android/tools/r8/dex/code/DexAndInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AndInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndInt.java index 532e657..7050380 100644 --- a/src/main/java/com/android/tools/r8/code/AndInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndInt extends Format23x { +public class DexAndInt extends DexFormat23x { public static final int OPCODE = 0x95; public static final String NAME = "AndInt"; public static final String SMALI_NAME = "and-int"; - AndInt(int high, BytecodeStream stream) { + DexAndInt(int high, BytecodeStream stream) { super(high, stream); } - public AndInt(int dest, int left, int right) { + public DexAndInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AndInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AndInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java index ad29884..8eba630 100644 --- a/src/main/java/com/android/tools/r8/code/AndInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndInt2Addr extends Format12x { +public class DexAndInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb5; public static final String NAME = "AndInt2Addr"; public static final String SMALI_NAME = "and-int/2addr"; - AndInt2Addr(int high, BytecodeStream stream) { + DexAndInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AndInt2Addr(int left, int right) { + public DexAndInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AndIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AndIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java index 8dc59d5..fd68e93 100644 --- a/src/main/java/com/android/tools/r8/code/AndIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndIntLit16 extends Format22s { +public class DexAndIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd5; public static final String NAME = "AndIntLit16"; public static final String SMALI_NAME = "and-int/lit16"; - AndIntLit16(int high, BytecodeStream stream) { + DexAndIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public AndIntLit16(int dest, int left, int constant) { + public DexAndIntLit16(int dest, int left, int constant) { super(dest, left, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/AndIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/AndIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java index a347b70..18778c6 100644 --- a/src/main/java/com/android/tools/r8/code/AndIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndIntLit8.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndIntLit8 extends Format22b { + +public class DexAndIntLit8 extends DexFormat22b { public static final int OPCODE = 0xdd; public static final String NAME = "AndIntLit8"; public static final String SMALI_NAME = "and-int/lit8"; - AndIntLit8(int high, BytecodeStream stream) { + DexAndIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public AndIntLit8(int dest, int left, int constant) { + public DexAndIntLit8(int dest, int left, int constant) { super(dest, left, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/AndLong.java b/src/main/java/com/android/tools/r8/dex/code/DexAndLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AndLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndLong.java index 0bc3eaa..5458217 100644 --- a/src/main/java/com/android/tools/r8/code/AndLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndLong extends Format23x { +public class DexAndLong extends DexFormat23x { public static final int OPCODE = 0xA0; public static final String NAME = "AndLong"; public static final String SMALI_NAME = "and-long"; - AndLong(int high, BytecodeStream stream) { + DexAndLong(int high, BytecodeStream stream) { super(high, stream); } - public AndLong(int dest, int left, int right) { + public DexAndLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/AndLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AndLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java index 276a814..73babe5 100644 --- a/src/main/java/com/android/tools/r8/code/AndLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAndLong2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AndLong2Addr extends Format12x { + +public class DexAndLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc0; public static final String NAME = "AndLong2Addr"; public static final String SMALI_NAME = "and-long/2addr"; - AndLong2Addr(int high, BytecodeStream stream) { + DexAndLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public AndLong2Addr(int left, int right) { + public DexAndLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/Aput.java b/src/main/java/com/android/tools/r8/dex/code/DexAput.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Aput.java rename to src/main/java/com/android/tools/r8/dex/code/DexAput.java index 65e0721..c5b1e1a 100644 --- a/src/main/java/com/android/tools/r8/code/Aput.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAput.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Aput extends Format23x { +public class DexAput extends DexFormat23x { public static final int OPCODE = 0x4b; public static final String NAME = "Aput"; public static final String SMALI_NAME = "aput"; - /*package*/ Aput(int high, BytecodeStream stream) { + /*package*/ DexAput(int high, BytecodeStream stream) { super(high, stream); } - public Aput(int AA, int BB, int CC) { + public DexAput(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AputBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java index ac64012..78d70a2 100644 --- a/src/main/java/com/android/tools/r8/code/AputBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputBoolean.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputBoolean extends Format23x { +public class DexAputBoolean extends DexFormat23x { public static final int OPCODE = 0x4e; public static final String NAME = "AputBoolean"; public static final String SMALI_NAME = "aput-boolean"; - /*package*/ AputBoolean(int high, BytecodeStream stream) { + /*package*/ DexAputBoolean(int high, BytecodeStream stream) { super(high, stream); } - public AputBoolean(int AA, int BB, int CC) { + public DexAputBoolean(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexAputByte.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AputByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputByte.java index 1d439c6..04def29 100644 --- a/src/main/java/com/android/tools/r8/code/AputByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputByte.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputByte extends Format23x { +public class DexAputByte extends DexFormat23x { public static final int OPCODE = 0x4f; public static final String NAME = "AputByte"; public static final String SMALI_NAME = "aput-byte"; - /*package*/ AputByte(int high, BytecodeStream stream) { + /*package*/ DexAputByte(int high, BytecodeStream stream) { super(high, stream); } - public AputByte(int AA, int BB, int CC) { + public DexAputByte(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexAputChar.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AputChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputChar.java index 14e408c..0f66bfa 100644 --- a/src/main/java/com/android/tools/r8/code/AputChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputChar.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputChar extends Format23x { +public class DexAputChar extends DexFormat23x { public static final int OPCODE = 0x50; public static final String NAME = "AputChar"; public static final String SMALI_NAME = "aput-char"; - /*package*/ AputChar(int high, BytecodeStream stream) { + /*package*/ DexAputChar(int high, BytecodeStream stream) { super(high, stream); } - public AputChar(int AA, int BB, int CC) { + public DexAputChar(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexAputObject.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AputObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputObject.java index bcfea78..3012172 100644 --- a/src/main/java/com/android/tools/r8/code/AputObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputObject.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputObject extends Format23x { +public class DexAputObject extends DexFormat23x { public static final int OPCODE = 0x4d; public static final String NAME = "AputObject"; public static final String SMALI_NAME = "aput-object"; - /*package*/ AputObject(int high, BytecodeStream stream) { + /*package*/ DexAputObject(int high, BytecodeStream stream) { super(high, stream); } - public AputObject(int AA, int BB, int CC) { + public DexAputObject(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexAputShort.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/AputShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputShort.java index daf9b4a..6a3173e 100644 --- a/src/main/java/com/android/tools/r8/code/AputShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputShort.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputShort extends Format23x { +public class DexAputShort extends DexFormat23x { public static final int OPCODE = 0x51; public static final String NAME = "AputShort"; public static final String SMALI_NAME = "aput-short"; - /*package*/ AputShort(int high, BytecodeStream stream) { + /*package*/ DexAputShort(int high, BytecodeStream stream) { super(high, stream); } - public AputShort(int AA, int BB, int CC) { + public DexAputShort(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/AputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexAputWide.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/AputWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexAputWide.java index 286dfff..adf0e40 100644 --- a/src/main/java/com/android/tools/r8/code/AputWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexAputWide.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.MemberType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class AputWide extends Format23x { +public class DexAputWide extends DexFormat23x { public static final int OPCODE = 0x4c; public static final String NAME = "AputWide"; public static final String SMALI_NAME = "aput-wide"; - /*package*/ AputWide(int high, BytecodeStream stream) { + /*package*/ DexAputWide(int high, BytecodeStream stream) { super(high, stream); } - public AputWide(int AA, int BB, int CC) { + public DexAputWide(int AA, int BB, int CC) { super(AA, BB, CC); }
diff --git a/src/main/java/com/android/tools/r8/code/ArrayLength.java b/src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ArrayLength.java rename to src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java index 156df49..543ab01 100644 --- a/src/main/java/com/android/tools/r8/code/ArrayLength.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexArrayLength.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ArrayLength extends Format12x { +public class DexArrayLength extends DexFormat12x { public static final int OPCODE = 0x21; public static final String NAME = "ArrayLength"; public static final String SMALI_NAME = "array-length"; - ArrayLength(int high, BytecodeStream stream) { + DexArrayLength(int high, BytecodeStream stream) { super(high, stream); } - public ArrayLength(int dest, int array) { + public DexArrayLength(int dest, int array) { super(dest, array); }
diff --git a/src/main/java/com/android/tools/r8/code/Base1Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java similarity index 64% rename from src/main/java/com/android/tools/r8/code/Base1Format.java rename to src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java index 09c4bc8..eaea826 100644 --- a/src/main/java/com/android/tools/r8/code/Base1Format.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexBase1Format.java
@@ -1,17 +1,17 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; -public abstract class Base1Format extends Instruction { +public abstract class DexBase1Format extends DexInstruction { public static final int SIZE = 1; - public Base1Format(BytecodeStream stream) { + public DexBase1Format(BytecodeStream stream) { super(stream); } - protected Base1Format() {} + protected DexBase1Format() {} @Override public int getSize() {
diff --git a/src/main/java/com/android/tools/r8/code/Base2Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java similarity index 64% rename from src/main/java/com/android/tools/r8/code/Base2Format.java rename to src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java index 7d8e51e..abc2ee2 100644 --- a/src/main/java/com/android/tools/r8/code/Base2Format.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexBase2Format.java
@@ -1,15 +1,15 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; -public abstract class Base2Format extends Instruction { +public abstract class DexBase2Format extends DexInstruction { public static final int SIZE = 2; - protected Base2Format() {} + protected DexBase2Format() {} - public Base2Format(BytecodeStream stream) { + public DexBase2Format(BytecodeStream stream) { super(stream); }
diff --git a/src/main/java/com/android/tools/r8/code/Base3Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java similarity index 64% rename from src/main/java/com/android/tools/r8/code/Base3Format.java rename to src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java index 62d6824..e78d48d 100644 --- a/src/main/java/com/android/tools/r8/code/Base3Format.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexBase3Format.java
@@ -1,15 +1,15 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; -public abstract class Base3Format extends Instruction { +public abstract class DexBase3Format extends DexInstruction { public static final int SIZE = 3; - protected Base3Format() {} + protected DexBase3Format() {} - public Base3Format(BytecodeStream stream) { + public DexBase3Format(BytecodeStream stream) { super(stream); } @@ -17,4 +17,4 @@ public int getSize() { return SIZE; } -} \ No newline at end of file +}
diff --git a/src/main/java/com/android/tools/r8/code/Base4Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java similarity index 64% rename from src/main/java/com/android/tools/r8/code/Base4Format.java rename to src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java index a08411f..ea206fe 100644 --- a/src/main/java/com/android/tools/r8/code/Base4Format.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexBase4Format.java
@@ -1,15 +1,15 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; -public abstract class Base4Format extends Instruction { +public abstract class DexBase4Format extends DexInstruction { public static final int SIZE = 4; - protected Base4Format() {} + protected DexBase4Format() {} - public Base4Format(BytecodeStream stream) { + public DexBase4Format(BytecodeStream stream) { super(stream); } @@ -17,4 +17,4 @@ public int getSize() { return SIZE; } -} \ No newline at end of file +}
diff --git a/src/main/java/com/android/tools/r8/code/Base5Format.java b/src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java similarity index 64% rename from src/main/java/com/android/tools/r8/code/Base5Format.java rename to src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java index 093e932..207129d 100644 --- a/src/main/java/com/android/tools/r8/code/Base5Format.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexBase5Format.java
@@ -1,15 +1,15 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; -public abstract class Base5Format extends Instruction { +public abstract class DexBase5Format extends DexInstruction { public static final int SIZE = 5; - protected Base5Format() {} + protected DexBase5Format() {} - public Base5Format(BytecodeStream stream) { + public DexBase5Format(BytecodeStream stream) { super(stream); } @@ -17,4 +17,4 @@ public int getSize() { return SIZE; } -} \ No newline at end of file +}
diff --git a/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java b/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java new file mode 100644 index 0000000..fdd4b40 --- /dev/null +++ b/src/main/java/com/android/tools/r8/dex/code/DexBaseInstructionFactory.java
@@ -0,0 +1,465 @@ +// Copyright (c) 2016, 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.dex.code; + +import com.android.tools.r8.graph.OffsetToObjectMapping; + +abstract class DexBaseInstructionFactory { + + static DexInstruction create( + int high, int opcode, BytecodeStream stream, OffsetToObjectMapping mapping) { + switch (opcode) { + case 0x0: + return DexNop.create(high, stream); + case DexMove.OPCODE: + return new DexMove(high, stream); + case DexMoveFrom16.OPCODE: + return new DexMoveFrom16(high, stream); + case DexMove16.OPCODE: + return new DexMove16(high, stream); + case DexMoveWide.OPCODE: + return new DexMoveWide(high, stream); + case DexMoveWideFrom16.OPCODE: + return new DexMoveWideFrom16(high, stream); + case DexMoveWide16.OPCODE: + return new DexMoveWide16(high, stream); + case DexMoveObject.OPCODE: + return new DexMoveObject(high, stream); + case DexMoveObjectFrom16.OPCODE: + return new DexMoveObjectFrom16(high, stream); + case DexMoveObject16.OPCODE: + return new DexMoveObject16(high, stream); + case DexMoveResult.OPCODE: + return new DexMoveResult(high, stream); + case DexMoveResultWide.OPCODE: + return new DexMoveResultWide(high, stream); + case DexMoveResultObject.OPCODE: + return new DexMoveResultObject(high, stream); + case DexMoveException.OPCODE: + return new DexMoveException(high, stream); + case DexReturnVoid.OPCODE: + return new DexReturnVoid(high, stream); + case DexReturn.OPCODE: + return new DexReturn(high, stream); + case DexReturnWide.OPCODE: + return new DexReturnWide(high, stream); + case DexReturnObject.OPCODE: + return new DexReturnObject(high, stream); + case DexConst4.OPCODE: + return new DexConst4(high, stream); + case DexConst16.OPCODE: + return new DexConst16(high, stream); + case DexConst.OPCODE: + return new DexConst(high, stream); + case DexConstHigh16.OPCODE: + return new DexConstHigh16(high, stream); + case DexConstWide16.OPCODE: + return new DexConstWide16(high, stream); + case DexConstWide32.OPCODE: + return new DexConstWide32(high, stream); + case DexConstWide.OPCODE: + return new DexConstWide(high, stream); + case DexConstWideHigh16.OPCODE: + return new DexConstWideHigh16(high, stream); + case DexConstString.OPCODE: + return new DexConstString(high, stream, mapping); + case DexConstStringJumbo.OPCODE: + return new DexConstStringJumbo(high, stream, mapping); + case DexConstClass.OPCODE: + return new DexConstClass(high, stream, mapping); + case DexMonitorEnter.OPCODE: + return new DexMonitorEnter(high, stream); + case DexMonitorExit.OPCODE: + return new DexMonitorExit(high, stream); + case DexCheckCast.OPCODE: + return new DexCheckCast(high, stream, mapping); + case DexInstanceOf.OPCODE: + return new DexInstanceOf(high, stream, mapping); + case DexArrayLength.OPCODE: + return new DexArrayLength(high, stream); + case DexNewInstance.OPCODE: + return new DexNewInstance(high, stream, mapping); + case DexNewArray.OPCODE: + return new DexNewArray(high, stream, mapping); + case DexFilledNewArray.OPCODE: + return new DexFilledNewArray(high, stream, mapping); + case DexFilledNewArrayRange.OPCODE: + return new DexFilledNewArrayRange(high, stream, mapping); + case DexFillArrayData.OPCODE: + return new DexFillArrayData(high, stream); + case DexThrow.OPCODE: + return new DexThrow(high, stream); + case DexGoto.OPCODE: + return new DexGoto(high, stream); + case DexGoto16.OPCODE: + return new DexGoto16(high, stream); + case DexGoto32.OPCODE: + return new DexGoto32(high, stream); + case DexPackedSwitch.OPCODE: + return new DexPackedSwitch(high, stream); + case DexSparseSwitch.OPCODE: + return new DexSparseSwitch(high, stream); + case DexCmplFloat.OPCODE: + return new DexCmplFloat(high, stream); + case DexCmpgFloat.OPCODE: + return new DexCmpgFloat(high, stream); + case DexCmplDouble.OPCODE: + return new DexCmplDouble(high, stream); + case DexCmpgDouble.OPCODE: + return new DexCmpgDouble(high, stream); + case DexCmpLong.OPCODE: + return new DexCmpLong(high, stream); + case DexIfEq.OPCODE: + return new DexIfEq(high, stream); + case DexIfNe.OPCODE: + return new DexIfNe(high, stream); + case DexIfLt.OPCODE: + return new DexIfLt(high, stream); + case DexIfGe.OPCODE: + return new DexIfGe(high, stream); + case DexIfGt.OPCODE: + return new DexIfGt(high, stream); + case DexIfLe.OPCODE: + return new DexIfLe(high, stream); + case DexIfEqz.OPCODE: + return new DexIfEqz(high, stream); + case DexIfNez.OPCODE: + return new DexIfNez(high, stream); + case DexIfLtz.OPCODE: + return new DexIfLtz(high, stream); + case DexIfGez.OPCODE: + return new DexIfGez(high, stream); + case DexIfGtz.OPCODE: + return new DexIfGtz(high, stream); + case DexIfLez.OPCODE: + return new DexIfLez(high, stream); + case DexAget.OPCODE: + return new DexAget(high, stream); + case DexAgetWide.OPCODE: + return new DexAgetWide(high, stream); + case DexAgetObject.OPCODE: + return new DexAgetObject(high, stream); + case DexAgetBoolean.OPCODE: + return new DexAgetBoolean(high, stream); + case DexAgetByte.OPCODE: + return new DexAgetByte(high, stream); + case DexAgetChar.OPCODE: + return new DexAgetChar(high, stream); + case DexAgetShort.OPCODE: + return new DexAgetShort(high, stream); + case DexAput.OPCODE: + return new DexAput(high, stream); + case DexAputWide.OPCODE: + return new DexAputWide(high, stream); + case DexAputObject.OPCODE: + return new DexAputObject(high, stream); + case DexAputBoolean.OPCODE: + return new DexAputBoolean(high, stream); + case DexAputByte.OPCODE: + return new DexAputByte(high, stream); + case DexAputChar.OPCODE: + return new DexAputChar(high, stream); + case DexAputShort.OPCODE: + return new DexAputShort(high, stream); + case DexIget.OPCODE: + return new DexIget(high, stream, mapping); + case DexIgetWide.OPCODE: + return new DexIgetWide(high, stream, mapping); + case DexIgetObject.OPCODE: + return new DexIgetObject(high, stream, mapping); + case DexIgetBoolean.OPCODE: + return new DexIgetBoolean(high, stream, mapping); + case DexIgetByte.OPCODE: + return new DexIgetByte(high, stream, mapping); + case DexIgetChar.OPCODE: + return new DexIgetChar(high, stream, mapping); + case DexIgetShort.OPCODE: + return new DexIgetShort(high, stream, mapping); + case DexIput.OPCODE: + return new DexIput(high, stream, mapping); + case DexIputWide.OPCODE: + return new DexIputWide(high, stream, mapping); + case DexIputObject.OPCODE: + return new DexIputObject(high, stream, mapping); + case DexIputBoolean.OPCODE: + return new DexIputBoolean(high, stream, mapping); + case DexIputByte.OPCODE: + return new DexIputByte(high, stream, mapping); + case DexIputChar.OPCODE: + return new DexIputChar(high, stream, mapping); + case DexIputShort.OPCODE: + return new DexIputShort(high, stream, mapping); + case DexSget.OPCODE: + return new DexSget(high, stream, mapping); + case DexSgetWide.OPCODE: + return new DexSgetWide(high, stream, mapping); + case DexSgetObject.OPCODE: + return new DexSgetObject(high, stream, mapping); + case DexSgetBoolean.OPCODE: + return new DexSgetBoolean(high, stream, mapping); + case DexSgetByte.OPCODE: + return new DexSgetByte(high, stream, mapping); + case DexSgetChar.OPCODE: + return new DexSgetChar(high, stream, mapping); + case DexSgetShort.OPCODE: + return new DexSgetShort(high, stream, mapping); + case DexSput.OPCODE: + return new DexSput(high, stream, mapping); + case DexSputWide.OPCODE: + return new DexSputWide(high, stream, mapping); + case DexSputObject.OPCODE: + return new DexSputObject(high, stream, mapping); + case DexSputBoolean.OPCODE: + return new DexSputBoolean(high, stream, mapping); + case DexSputByte.OPCODE: + return new DexSputByte(high, stream, mapping); + case DexSputChar.OPCODE: + return new DexSputChar(high, stream, mapping); + case DexSputShort.OPCODE: + return new DexSputShort(high, stream, mapping); + case DexInvokeVirtual.OPCODE: + return new DexInvokeVirtual(high, stream, mapping); + case DexInvokeSuper.OPCODE: + return new DexInvokeSuper(high, stream, mapping); + case DexInvokeDirect.OPCODE: + return new DexInvokeDirect(high, stream, mapping); + case DexInvokeStatic.OPCODE: + return new DexInvokeStatic(high, stream, mapping); + case DexInvokeInterface.OPCODE: + return new DexInvokeInterface(high, stream, mapping); + case DexInvokeVirtualRange.OPCODE: + return new DexInvokeVirtualRange(high, stream, mapping); + case DexInvokeSuperRange.OPCODE: + return new DexInvokeSuperRange(high, stream, mapping); + case DexInvokeDirectRange.OPCODE: + return new DexInvokeDirectRange(high, stream, mapping); + case DexInvokeStaticRange.OPCODE: + return new DexInvokeStaticRange(high, stream, mapping); + case DexInvokeInterfaceRange.OPCODE: + return new DexInvokeInterfaceRange(high, stream, mapping); + case DexNegInt.OPCODE: + return new DexNegInt(high, stream); + case DexNotInt.OPCODE: + return new DexNotInt(high, stream); + case DexNegLong.OPCODE: + return new DexNegLong(high, stream); + case DexNotLong.OPCODE: + return new DexNotLong(high, stream); + case DexNegFloat.OPCODE: + return new DexNegFloat(high, stream); + case DexNegDouble.OPCODE: + return new DexNegDouble(high, stream); + case DexIntToLong.OPCODE: + return new DexIntToLong(high, stream); + case DexIntToFloat.OPCODE: + return new DexIntToFloat(high, stream); + case DexIntToDouble.OPCODE: + return new DexIntToDouble(high, stream); + case DexLongToInt.OPCODE: + return new DexLongToInt(high, stream); + case DexLongToFloat.OPCODE: + return new DexLongToFloat(high, stream); + case DexLongToDouble.OPCODE: + return new DexLongToDouble(high, stream); + case DexFloatToInt.OPCODE: + return new DexFloatToInt(high, stream); + case DexFloatToLong.OPCODE: + return new DexFloatToLong(high, stream); + case DexFloatToDouble.OPCODE: + return new DexFloatToDouble(high, stream); + case DexDoubleToInt.OPCODE: + return new DexDoubleToInt(high, stream); + case DexDoubleToLong.OPCODE: + return new DexDoubleToLong(high, stream); + case DexDoubleToFloat.OPCODE: + return new DexDoubleToFloat(high, stream); + case DexIntToByte.OPCODE: + return new DexIntToByte(high, stream); + case DexIntToChar.OPCODE: + return new DexIntToChar(high, stream); + case DexIntToShort.OPCODE: + return new DexIntToShort(high, stream); + case DexAddInt.OPCODE: + return new DexAddInt(high, stream); + case DexSubInt.OPCODE: + return new DexSubInt(high, stream); + case DexMulInt.OPCODE: + return new DexMulInt(high, stream); + case DexDivInt.OPCODE: + return new DexDivInt(high, stream); + case DexRemInt.OPCODE: + return new DexRemInt(high, stream); + case DexAndInt.OPCODE: + return new DexAndInt(high, stream); + case DexOrInt.OPCODE: + return new DexOrInt(high, stream); + case DexXorInt.OPCODE: + return new DexXorInt(high, stream); + case DexShlInt.OPCODE: + return new DexShlInt(high, stream); + case DexShrInt.OPCODE: + return new DexShrInt(high, stream); + case DexUshrInt.OPCODE: + return new DexUshrInt(high, stream); + case DexAddLong.OPCODE: + return new DexAddLong(high, stream); + case DexSubLong.OPCODE: + return new DexSubLong(high, stream); + case DexMulLong.OPCODE: + return new DexMulLong(high, stream); + case DexDivLong.OPCODE: + return new DexDivLong(high, stream); + case DexRemLong.OPCODE: + return new DexRemLong(high, stream); + case DexAndLong.OPCODE: + return new DexAndLong(high, stream); + case DexOrLong.OPCODE: + return new DexOrLong(high, stream); + case DexXorLong.OPCODE: + return new DexXorLong(high, stream); + case DexShlLong.OPCODE: + return new DexShlLong(high, stream); + case DexShrLong.OPCODE: + return new DexShrLong(high, stream); + case DexUshrLong.OPCODE: + return new DexUshrLong(high, stream); + case DexAddFloat.OPCODE: + return new DexAddFloat(high, stream); + case DexSubFloat.OPCODE: + return new DexSubFloat(high, stream); + case DexMulFloat.OPCODE: + return new DexMulFloat(high, stream); + case DexDivFloat.OPCODE: + return new DexDivFloat(high, stream); + case DexRemFloat.OPCODE: + return new DexRemFloat(high, stream); + case DexAddDouble.OPCODE: + return new DexAddDouble(high, stream); + case DexSubDouble.OPCODE: + return new DexSubDouble(high, stream); + case DexMulDouble.OPCODE: + return new DexMulDouble(high, stream); + case DexDivDouble.OPCODE: + return new DexDivDouble(high, stream); + case DexRemDouble.OPCODE: + return new DexRemDouble(high, stream); + case DexAddInt2Addr.OPCODE: + return new DexAddInt2Addr(high, stream); + case DexSubInt2Addr.OPCODE: + return new DexSubInt2Addr(high, stream); + case DexMulInt2Addr.OPCODE: + return new DexMulInt2Addr(high, stream); + case DexDivInt2Addr.OPCODE: + return new DexDivInt2Addr(high, stream); + case DexRemInt2Addr.OPCODE: + return new DexRemInt2Addr(high, stream); + case DexAndInt2Addr.OPCODE: + return new DexAndInt2Addr(high, stream); + case DexOrInt2Addr.OPCODE: + return new DexOrInt2Addr(high, stream); + case DexXorInt2Addr.OPCODE: + return new DexXorInt2Addr(high, stream); + case DexShlInt2Addr.OPCODE: + return new DexShlInt2Addr(high, stream); + case DexShrInt2Addr.OPCODE: + return new DexShrInt2Addr(high, stream); + case DexUshrInt2Addr.OPCODE: + return new DexUshrInt2Addr(high, stream); + case DexAddLong2Addr.OPCODE: + return new DexAddLong2Addr(high, stream); + case DexSubLong2Addr.OPCODE: + return new DexSubLong2Addr(high, stream); + case DexMulLong2Addr.OPCODE: + return new DexMulLong2Addr(high, stream); + case DexDivLong2Addr.OPCODE: + return new DexDivLong2Addr(high, stream); + case DexRemLong2Addr.OPCODE: + return new DexRemLong2Addr(high, stream); + case DexAndLong2Addr.OPCODE: + return new DexAndLong2Addr(high, stream); + case DexOrLong2Addr.OPCODE: + return new DexOrLong2Addr(high, stream); + case DexXorLong2Addr.OPCODE: + return new DexXorLong2Addr(high, stream); + case DexShlLong2Addr.OPCODE: + return new DexShlLong2Addr(high, stream); + case DexShrLong2Addr.OPCODE: + return new DexShrLong2Addr(high, stream); + case DexUshrLong2Addr.OPCODE: + return new DexUshrLong2Addr(high, stream); + case DexAddFloat2Addr.OPCODE: + return new DexAddFloat2Addr(high, stream); + case DexSubFloat2Addr.OPCODE: + return new DexSubFloat2Addr(high, stream); + case DexMulFloat2Addr.OPCODE: + return new DexMulFloat2Addr(high, stream); + case DexDivFloat2Addr.OPCODE: + return new DexDivFloat2Addr(high, stream); + case DexRemFloat2Addr.OPCODE: + return new DexRemFloat2Addr(high, stream); + case DexAddDouble2Addr.OPCODE: + return new DexAddDouble2Addr(high, stream); + case DexSubDouble2Addr.OPCODE: + return new DexSubDouble2Addr(high, stream); + case DexMulDouble2Addr.OPCODE: + return new DexMulDouble2Addr(high, stream); + case DexDivDouble2Addr.OPCODE: + return new DexDivDouble2Addr(high, stream); + case DexRemDouble2Addr.OPCODE: + return new DexRemDouble2Addr(high, stream); + case DexAddIntLit16.OPCODE: + return new DexAddIntLit16(high, stream); + case DexRsubInt.OPCODE: + return new DexRsubInt(high, stream); + case DexMulIntLit16.OPCODE: + return new DexMulIntLit16(high, stream); + case DexDivIntLit16.OPCODE: + return new DexDivIntLit16(high, stream); + case DexRemIntLit16.OPCODE: + return new DexRemIntLit16(high, stream); + case DexAndIntLit16.OPCODE: + return new DexAndIntLit16(high, stream); + case DexOrIntLit16.OPCODE: + return new DexOrIntLit16(high, stream); + case DexXorIntLit16.OPCODE: + return new DexXorIntLit16(high, stream); + case DexAddIntLit8.OPCODE: + return new DexAddIntLit8(high, stream); + case DexRsubIntLit8.OPCODE: + return new DexRsubIntLit8(high, stream); + case DexMulIntLit8.OPCODE: + return new DexMulIntLit8(high, stream); + case DexDivIntLit8.OPCODE: + return new DexDivIntLit8(high, stream); + case DexRemIntLit8.OPCODE: + return new DexRemIntLit8(high, stream); + case DexAndIntLit8.OPCODE: + return new DexAndIntLit8(high, stream); + case DexOrIntLit8.OPCODE: + return new DexOrIntLit8(high, stream); + case DexXorIntLit8.OPCODE: + return new DexXorIntLit8(high, stream); + case DexShlIntLit8.OPCODE: + return new DexShlIntLit8(high, stream); + case DexShrIntLit8.OPCODE: + return new DexShrIntLit8(high, stream); + case DexUshrIntLit8.OPCODE: + return new DexUshrIntLit8(high, stream); + case DexInvokePolymorphic.OPCODE: + return new DexInvokePolymorphic(high, stream, mapping); + case DexInvokePolymorphicRange.OPCODE: + return new DexInvokePolymorphicRange(high, stream, mapping); + case DexInvokeCustom.OPCODE: + return new DexInvokeCustom(high, stream, mapping); + case DexInvokeCustomRange.OPCODE: + return new DexInvokeCustomRange(high, stream, mapping); + case DexConstMethodHandle.OPCODE: + return new DexConstMethodHandle(high, stream, mapping); + case DexConstMethodType.OPCODE: + return new DexConstMethodType(high, stream, mapping); + default: + throw new IllegalArgumentException("Illegal Opcode: 0x" + Integer.toString(opcode, 16)); + } + } +}
diff --git a/src/main/java/com/android/tools/r8/code/CheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/CheckCast.java rename to src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java index 74a5f91..650655a 100644 --- a/src/main/java/com/android/tools/r8/code/CheckCast.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCheckCast.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -15,7 +16,7 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class CheckCast extends Format21c<DexType> { +public class DexCheckCast extends DexFormat21c<DexType> { public static final int OPCODE = 0x1f; public static final String NAME = "CheckCast"; @@ -23,12 +24,12 @@ private final boolean ignoreCompatRules; - CheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); this.ignoreCompatRules = false; } - public CheckCast(int valueRegister, DexType type, boolean ignoreCompatRules) { + public DexCheckCast(int valueRegister, DexType type, boolean ignoreCompatRules) { super(valueRegister, type); this.ignoreCompatRules = ignoreCompatRules; } @@ -49,7 +50,7 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) { spec.withItem(i -> i.BBBB); } @@ -60,12 +61,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override @@ -81,7 +82,7 @@ } @Override - public CheckCast asCheckCast() { + public DexCheckCast asCheckCast() { return this; }
diff --git a/src/main/java/com/android/tools/r8/code/CmpLong.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/CmpLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java index 38f1bc9..57f1807 100644 --- a/src/main/java/com/android/tools/r8/code/CmpLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpLong.java
@@ -1,23 +1,23 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Cmp.Bias; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class CmpLong extends Format23x { +public class DexCmpLong extends DexFormat23x { public static final int OPCODE = 0x31; public static final String NAME = "CmpLong"; public static final String SMALI_NAME = "cmp-long"; - CmpLong(int high, BytecodeStream stream) { + DexCmpLong(int high, BytecodeStream stream) { super(high, stream); } - public CmpLong(int dest, int left, int right) { + public DexCmpLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/CmpgDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/CmpgDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java index f4cfef4..4414ec7 100644 --- a/src/main/java/com/android/tools/r8/code/CmpgDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpgDouble.java
@@ -1,23 +1,23 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Cmp.Bias; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class CmpgDouble extends Format23x { +public class DexCmpgDouble extends DexFormat23x { public static final int OPCODE = 0x30; public static final String NAME = "CmpgDouble"; public static final String SMALI_NAME = "cmpg-double"; - CmpgDouble(int high, BytecodeStream stream) { + DexCmpgDouble(int high, BytecodeStream stream) { super(high, stream); } - public CmpgDouble(int dest, int left, int right) { + public DexCmpgDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/CmpgFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/CmpgFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java index 299e2fe..ac387ed 100644 --- a/src/main/java/com/android/tools/r8/code/CmpgFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCmpgFloat.java
@@ -1,23 +1,23 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Cmp.Bias; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class CmpgFloat extends Format23x { +public class DexCmpgFloat extends DexFormat23x { public static final int OPCODE = 0x2e; public static final String NAME = "CmpgFloat"; public static final String SMALI_NAME = "cmpg-float"; - CmpgFloat(int high, BytecodeStream stream) { + DexCmpgFloat(int high, BytecodeStream stream) { super(high, stream); } - public CmpgFloat(int dest, int left, int right) { + public DexCmpgFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/CmplDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/CmplDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java index a65ef74..b28bf82 100644 --- a/src/main/java/com/android/tools/r8/code/CmplDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCmplDouble.java
@@ -1,23 +1,23 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Cmp.Bias; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class CmplDouble extends Format23x { +public class DexCmplDouble extends DexFormat23x { public static final int OPCODE = 0x2f; public static final String NAME = "CmplDouble"; public static final String SMALI_NAME = "cmpl-double"; - CmplDouble(int high, BytecodeStream stream) { + DexCmplDouble(int high, BytecodeStream stream) { super(high, stream); } - public CmplDouble(int dest, int left, int right) { + public DexCmplDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/CmplFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/CmplFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java index 892d0de..76becd7 100644 --- a/src/main/java/com/android/tools/r8/code/CmplFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCmplFloat.java
@@ -1,23 +1,23 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Cmp.Bias; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class CmplFloat extends Format23x { +public class DexCmplFloat extends DexFormat23x { public static final int OPCODE = 0x2d; public static final String NAME = "CmplFloat"; public static final String SMALI_NAME = "cmpl-float"; - CmplFloat(int high, BytecodeStream stream) { + DexCmplFloat(int high, BytecodeStream stream) { super(high, stream); } - public CmplFloat(int dest, int left, int right) { + public DexCmplFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DexCompareHelper.java b/src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java similarity index 91% rename from src/main/java/com/android/tools/r8/code/DexCompareHelper.java rename to src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java index 130e69b..93c2501 100644 --- a/src/main/java/com/android/tools/r8/code/DexCompareHelper.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexCompareHelper.java
@@ -1,7 +1,7 @@ // 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.code; +package com.android.tools.r8.dex.code; public class DexCompareHelper { @@ -22,7 +22,7 @@ // Helper to signal that the concrete instruction is uniquely determined by its ID/opcode. public static int compareIdUniquelyDeterminesEquality( - Instruction instruction1, Instruction instruction2) { + DexInstruction instruction1, DexInstruction instruction2) { assert instruction1.getClass() == instruction2.getClass(); assert instruction1.getCompareToId() == instruction2.getCompareToId(); assert instruction1.toString().equals(instruction2.toString());
diff --git a/src/main/java/com/android/tools/r8/code/Const.java b/src/main/java/com/android/tools/r8/dex/code/DexConst.java similarity index 74% rename from src/main/java/com/android/tools/r8/code/Const.java rename to src/main/java/com/android/tools/r8/dex/code/DexConst.java index 498f747..33fdff4 100644 --- a/src/main/java/com/android/tools/r8/code/Const.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConst.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.SingleConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class Const extends Format31i implements SingleConstant { +public class DexConst extends DexFormat31i implements SingleConstant { public static final int OPCODE = 0x14; public static final String NAME = "Const"; public static final String SMALI_NAME = "const"; - Const(int high, BytecodeStream stream) { + DexConst(int high, BytecodeStream stream) { super(high, stream); } - public Const(int register, int constant) { + public DexConst(int register, int constant) { super(register, constant); } @@ -45,14 +45,14 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")"); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + - " # " + decodedValue()); + return formatSmaliString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " # " + decodedValue()); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/Const16.java b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java similarity index 78% rename from src/main/java/com/android/tools/r8/code/Const16.java rename to src/main/java/com/android/tools/r8/dex/code/DexConst16.java index 9d69f25..1188df2 100644 --- a/src/main/java/com/android/tools/r8/code/Const16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConst16.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.SingleConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class Const16 extends Format21s implements SingleConstant { +public class DexConst16 extends DexFormat21s implements SingleConstant { public static final int OPCODE = 0x13; public static final String NAME = "Const16"; public static final String SMALI_NAME = "const/16"; - /*package*/ Const16(int high, BytecodeStream stream) { + /*package*/ DexConst16(int high, BytecodeStream stream) { super(high, stream); } - public Const16(int dest, int constant) { + public DexConst16(int dest, int constant) { super(dest, constant); } @@ -45,8 +45,8 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 4) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 4) + " (" + decodedValue() + ")"); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/Const4.java b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java similarity index 74% rename from src/main/java/com/android/tools/r8/code/Const4.java rename to src/main/java/com/android/tools/r8/dex/code/DexConst4.java index b9fd59c..09ecd15 100644 --- a/src/main/java/com/android/tools/r8/code/Const4.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConst4.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.SingleConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class Const4 extends Format11n implements SingleConstant { +public class DexConst4 extends DexFormat11n implements SingleConstant { public static final int OPCODE = 0x12; public static final String NAME = "Const4"; public static final String SMALI_NAME = "const/4"; - Const4(int high, BytecodeStream stream) { + DexConst4(int high, BytecodeStream stream) { super(high, stream); } - public Const4(int dest, int constant) { + public DexConst4(int dest, int constant) { super(dest, constant); } @@ -45,14 +45,14 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + A + ", " + StringUtils.hexString(decodedValue(), 1) + - " (" + decodedValue() + ")"); + return formatString( + "v" + A + ", " + StringUtils.hexString(decodedValue(), 1) + " (" + decodedValue() + ")"); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + A + ", " + StringUtils.hexString(decodedValue(), 2) + - " # " + decodedValue()); + return formatSmaliString( + "v" + A + ", " + StringUtils.hexString(decodedValue(), 2) + " # " + decodedValue()); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstClass.java b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/ConstClass.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstClass.java index 88b35e1..bc476c1 100644 --- a/src/main/java/com/android/tools/r8/code/ConstClass.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstClass.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -15,7 +16,7 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class ConstClass extends Format21c<DexType> { +public class DexConstClass extends DexFormat21c<DexType> { public static final int OPCODE = 0x1c; public static final String NAME = "ConstClass"; @@ -23,18 +24,18 @@ private final boolean ignoreCompatRules; - ConstClass(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexConstClass(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); this.ignoreCompatRules = false; } - public ConstClass(int dest, DexType type, boolean ignoreCompatRules) { + public DexConstClass(int dest, DexType type, boolean ignoreCompatRules) { super(dest, type); this.ignoreCompatRules = ignoreCompatRules; } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) { spec.withItem(i -> i.BBBB); } @@ -60,12 +61,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override @@ -100,7 +101,7 @@ } @Override - public ConstClass asConstClass() { + public DexConstClass asConstClass() { return this; }
diff --git a/src/main/java/com/android/tools/r8/code/ConstHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java similarity index 72% rename from src/main/java/com/android/tools/r8/code/ConstHigh16.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java index b16e45d..2e732ed 100644 --- a/src/main/java/com/android/tools/r8/code/ConstHigh16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstHigh16.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.SingleConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class ConstHigh16 extends Format21h implements SingleConstant { +public class DexConstHigh16 extends DexFormat21h implements SingleConstant { public static final int OPCODE = 0x15; public static final String NAME = "ConstHigh16"; public static final String SMALI_NAME = "const/high16"; - /*package*/ ConstHigh16(int high, BytecodeStream stream) { + /*package*/ DexConstHigh16(int high, BytecodeStream stream) { super(high, stream); } - public ConstHigh16(int register, int constantHighBits) { + public DexConstHigh16(int register, int constantHighBits) { super(register, constantHighBits); } @@ -45,14 +45,14 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " (" + decodedValue() + ")"); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + - " # " + decodedValue()); + return formatSmaliString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 8) + " # " + decodedValue()); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/ConstMethodHandle.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java index 0df963f..87964c8 100644 --- a/src/main/java/com/android/tools/r8/code/ConstMethodHandle.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodHandle.java
@@ -1,10 +1,11 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.InternalCompilerError; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethodHandle; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -18,17 +19,17 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class ConstMethodHandle extends Format21c<DexMethodHandle> { +public class DexConstMethodHandle extends DexFormat21c<DexMethodHandle> { public static final int OPCODE = 0xfe; public static final String NAME = "ConstMethodHandle"; public static final String SMALI_NAME = "const-method-handle"; - ConstMethodHandle(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexConstMethodHandle(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodHandleMap()); } - public ConstMethodHandle(int register, DexMethodHandle methodHandle) { + public DexConstMethodHandle(int register, DexMethodHandle methodHandle) { super(register, methodHandle); } @@ -52,7 +53,7 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexMethodHandle>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexMethodHandle>, ?> spec) { spec.withItem(i -> i.BBBB); } @@ -92,14 +93,14 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexMethodHandle rewritten = rewriter.rewriteDexMethodHandle( getMethodHandle(), MethodHandleUse.NOT_ARGUMENT_TO_LAMBDA_METAFACTORY, context); - rewritten.collectIndexedItems(indexedItems); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/ConstMethodType.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java index 478d3b5..68f49fb 100644 --- a/src/main/java/com/android/tools/r8/code/ConstMethodType.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstMethodType.java
@@ -1,10 +1,11 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.InternalCompilerError; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -17,17 +18,17 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class ConstMethodType extends Format21c<DexProto> { +public class DexConstMethodType extends DexFormat21c<DexProto> { public static final int OPCODE = 0xff; public static final String NAME = "ConstMethodType"; public static final String SMALI_NAME = "const-method-type"; - ConstMethodType(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexConstMethodType(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getProtosMap()); } - public ConstMethodType(int register, DexProto methodType) { + public DexConstMethodType(int register, DexProto methodType) { super(register, methodType); } @@ -51,7 +52,7 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexProto>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexProto>, ?> spec) { spec.withItem(i -> i.BBBB); } @@ -88,12 +89,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexProto rewritten = rewriter.rewriteProto(getMethodType()); - rewritten.collectIndexedItems(indexedItems); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/ConstString.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstString.java index 5fd55e4..0117785 100644 --- a/src/main/java/com/android/tools/r8/code/ConstString.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstString.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.InternalCompilerError; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -16,17 +17,17 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class ConstString extends Format21c<DexString> { +public class DexConstString extends DexFormat21c<DexString> { public static final int OPCODE = 0x1a; public static final String NAME = "ConstString"; public static final String SMALI_NAME = "const-string"; - ConstString(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexConstString(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getStringMap()); } - public ConstString(int register, DexString string) { + public DexConstString(int register, DexString string) { super(register, string); } @@ -35,15 +36,15 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexString>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexString>, ?> spec) { spec.withItem(i -> i.BBBB); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { getString().collectIndexedItems(indexedItems); } @@ -64,7 +65,7 @@ } @Override - public ConstString asConstString() { + public DexConstString asConstString() { return this; }
diff --git a/src/main/java/com/android/tools/r8/code/ConstStringJumbo.java b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/ConstStringJumbo.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java index b24f86f..725ef8a 100644 --- a/src/main/java/com/android/tools/r8/code/ConstStringJumbo.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstStringJumbo.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.naming.ClassNameMapper; -public class ConstStringJumbo extends Format31c { +public class DexConstStringJumbo extends DexFormat31c { public static final int OPCODE = 0x1b; public static final String NAME = "ConstStringJumbo"; public static final String SMALI_NAME = "const-string/jumbo"; - ConstStringJumbo(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexConstStringJumbo(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getStringMap()); } - public ConstStringJumbo(int register, DexString string) { + public DexConstStringJumbo(int register, DexString string) { super(register, string); } @@ -42,7 +42,7 @@ } @Override - public ConstStringJumbo asConstStringJumbo() { + public DexConstStringJumbo asConstStringJumbo() { return this; }
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java similarity index 72% rename from src/main/java/com/android/tools/r8/code/ConstWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide.java index dd2e6e6..6fbd6f2 100644 --- a/src/main/java/com/android/tools/r8/code/ConstWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.WideConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class ConstWide extends Format51l implements WideConstant { +public class DexConstWide extends DexFormat51l implements WideConstant { public static final int OPCODE = 0x18; public static final String NAME = "ConstWide"; public static final String SMALI_NAME = "const-wide"; - ConstWide(int high, BytecodeStream stream) { + DexConstWide(int high, BytecodeStream stream) { super(high, stream); } - public ConstWide(int dest, long constant) { + public DexConstWide(int dest, long constant) { super(dest, constant); } @@ -45,14 +45,14 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")"); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - "L # " + decodedValue()); + return formatSmaliString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L # " + decodedValue()); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/ConstWide16.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java index 99c1810..e30b886 100644 --- a/src/main/java/com/android/tools/r8/code/ConstWide16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide16.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.WideConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class ConstWide16 extends Format21s implements WideConstant { +public class DexConstWide16 extends DexFormat21s implements WideConstant { public static final int OPCODE = 0x16; public static final String NAME = "ConstWide16"; public static final String SMALI_NAME = "const-wide/16"; - ConstWide16(int high, BytecodeStream stream) { + DexConstWide16(int high, BytecodeStream stream) { super(high, stream); } - public ConstWide16(int dest, int constant) { + public DexConstWide16(int dest, int constant) { super(dest, constant); } @@ -45,8 +45,8 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")"); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWide32.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/ConstWide32.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java index 1e2c274..b315cb9 100644 --- a/src/main/java/com/android/tools/r8/code/ConstWide32.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWide32.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.WideConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class ConstWide32 extends Format31i implements WideConstant { +public class DexConstWide32 extends DexFormat31i implements WideConstant { public static final int OPCODE = 0x17; public static final String NAME = "ConstWide32"; public static final String SMALI_NAME = "const-wide/32"; - ConstWide32(int high, BytecodeStream stream) { + DexConstWide32(int high, BytecodeStream stream) { super(high, stream); } - public ConstWide32(int dest, int constant) { + public DexConstWide32(int dest, int constant) { super(dest, constant); } @@ -45,8 +45,8 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")"); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java similarity index 71% rename from src/main/java/com/android/tools/r8/code/ConstWideHigh16.java rename to src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java index 26d5ea0..0eeca93 100644 --- a/src/main/java/com/android/tools/r8/code/ConstWideHigh16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexConstWideHigh16.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.analysis.type.TypeElement; import com.android.tools.r8.ir.code.WideConstant; @@ -9,17 +9,17 @@ import com.android.tools.r8.naming.ClassNameMapper; import com.android.tools.r8.utils.StringUtils; -public class ConstWideHigh16 extends Format21h implements WideConstant { +public class DexConstWideHigh16 extends DexFormat21h implements WideConstant { public static final int OPCODE = 0x19; public static final String NAME = "ConstWideHigh16"; public static final String SMALI_NAME = "const-wide/high16"; - ConstWideHigh16(int high, BytecodeStream stream) { + DexConstWideHigh16(int high, BytecodeStream stream) { super(high, stream); } - public ConstWideHigh16(int dest, int constantHighBits) { + public DexConstWideHigh16(int dest, int constantHighBits) { super(dest, constantHighBits); } @@ -45,14 +45,14 @@ @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - " (" + decodedValue() + ")"); + return formatString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + " (" + decodedValue() + ")"); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + - "L # " + decodedValue()); + return formatSmaliString( + "v" + AA + ", " + StringUtils.hexString(decodedValue(), 16) + "L # " + decodedValue()); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/DivDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DivDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java index 1be9ee9..19ad41f 100644 --- a/src/main/java/com/android/tools/r8/code/DivDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivDouble extends Format23x { + +public class DexDivDouble extends DexFormat23x { public static final int OPCODE = 0xae; public static final String NAME = "DivDouble"; public static final String SMALI_NAME = "div-double"; - DivDouble(int high, BytecodeStream stream) { + DexDivDouble(int high, BytecodeStream stream) { super(high, stream); } - public DivDouble(int dest, int left, int right) { + public DexDivDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/DivDouble2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java index a8070d2..9481f04 100644 --- a/src/main/java/com/android/tools/r8/code/DivDouble2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivDouble2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivDouble2Addr extends Format12x { +public class DexDivDouble2Addr extends DexFormat12x { public static final int OPCODE = 0xce; public static final String NAME = "DivDouble2Addr"; public static final String SMALI_NAME = "div-double/2addr"; - DivDouble2Addr(int high, BytecodeStream stream) { + DexDivDouble2Addr(int high, BytecodeStream stream) { super(high, stream); } - public DivDouble2Addr(int left, int right) { + public DexDivDouble2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DivFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java index 4069d40..2791142 100644 --- a/src/main/java/com/android/tools/r8/code/DivFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivFloat extends Format23x { + +public class DexDivFloat extends DexFormat23x { public static final int OPCODE = 0xa9; public static final String NAME = "DivFloat"; public static final String SMALI_NAME = "div-float"; - DivFloat(int high, BytecodeStream stream) { + DexDivFloat(int high, BytecodeStream stream) { super(high, stream); } - public DivFloat(int dest, int left, int right) { + public DexDivFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/DivFloat2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java index a51af26..56fb846 100644 --- a/src/main/java/com/android/tools/r8/code/DivFloat2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivFloat2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivFloat2Addr extends Format12x { +public class DexDivFloat2Addr extends DexFormat12x { public static final int OPCODE = 0xc9; public static final String NAME = "DivFloat2Addr"; public static final String SMALI_NAME = "div-float/2addr"; - DivFloat2Addr(int high, BytecodeStream stream) { + DexDivFloat2Addr(int high, BytecodeStream stream) { super(high, stream); } - public DivFloat2Addr(int left, int right) { + public DexDivFloat2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivInt.java b/src/main/java/com/android/tools/r8/dex/code/DexDivInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DivInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivInt.java index 90e1459..7f5dc8a 100644 --- a/src/main/java/com/android/tools/r8/code/DivInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivInt extends Format23x { +public class DexDivInt extends DexFormat23x { public static final int OPCODE = 0x93; public static final String NAME = "DivInt"; public static final String SMALI_NAME = "div-int"; - /*package*/ DivInt(int high, BytecodeStream stream) { + /*package*/ DexDivInt(int high, BytecodeStream stream) { super(high, stream); } - public DivInt(int dest, int left, int right) { + public DexDivInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DivInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java index a92d24f..f321ff2 100644 --- a/src/main/java/com/android/tools/r8/code/DivInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivInt2Addr extends Format12x { +public class DexDivInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb3; public static final String NAME = "DivInt2Addr"; public static final String SMALI_NAME = "div-int/2addr"; - /*package*/ DivInt2Addr(int high, BytecodeStream stream) { + /*package*/ DexDivInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public DivInt2Addr(int left, int right) { + public DexDivInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/DivIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java index 1a62f6e..10931d3 100644 --- a/src/main/java/com/android/tools/r8/code/DivIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit16.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivIntLit16 extends Format22s { + +public class DexDivIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd3; public static final String NAME = "DivIntLit16"; public static final String SMALI_NAME = "div-int/lit16"; - /*package*/ DivIntLit16(int high, BytecodeStream stream) { + /*package*/ DexDivIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public DivIntLit16(int dest, int register, int constant) { + public DexDivIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/DivIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DivIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java index 31fd0e60..0626aa4 100644 --- a/src/main/java/com/android/tools/r8/code/DivIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivIntLit8 extends Format22b { +public class DexDivIntLit8 extends DexFormat22b { public static final int OPCODE = 0xdb; public static final String NAME = "DivIntLit8"; public static final String SMALI_NAME = "div-int/lit8"; - DivIntLit8(int high, BytecodeStream stream) { + DexDivIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public DivIntLit8(int dest, int left, int constant) { + public DexDivIntLit8(int dest, int left, int constant) { super(dest, left, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/DivLong.java b/src/main/java/com/android/tools/r8/dex/code/DexDivLong.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/DivLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivLong.java index 271dd04..260be18 100644 --- a/src/main/java/com/android/tools/r8/code/DivLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivLong extends Format23x { + +public class DexDivLong extends DexFormat23x { public static final int OPCODE = 0x9e; public static final String NAME = "DivLong"; public static final String SMALI_NAME = "div-long"; - DivLong(int high, BytecodeStream stream) { + DexDivLong(int high, BytecodeStream stream) { super(high, stream); } - public DivLong(int dest, int left, int right) { + public DexDivLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DivLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/DivLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java index 40f0946..b36326d 100644 --- a/src/main/java/com/android/tools/r8/code/DivLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDivLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DivLong2Addr extends Format12x { +public class DexDivLong2Addr extends DexFormat12x { public static final int OPCODE = 0xbe; public static final String NAME = "DivLong2Addr"; public static final String SMALI_NAME = "div-long/2addr"; - DivLong2Addr(int high, BytecodeStream stream) { + DexDivLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public DivLong2Addr(int left, int right) { + public DexDivLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DoubleToFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java index 07b8ab6..008c565 100644 --- a/src/main/java/com/android/tools/r8/code/DoubleToFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToFloat.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DoubleToFloat extends Format12x { +public class DexDoubleToFloat extends DexFormat12x { public static final int OPCODE = 0x8c; public static final String NAME = "DoubleToFloat"; public static final String SMALI_NAME = "double-to-float"; - DoubleToFloat(int high, BytecodeStream stream) { + DexDoubleToFloat(int high, BytecodeStream stream) { super(high, stream); } - public DoubleToFloat(int dest, int source) { + public DexDoubleToFloat(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DoubleToInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java index 6d8f506..99debd4 100644 --- a/src/main/java/com/android/tools/r8/code/DoubleToInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToInt.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DoubleToInt extends Format12x { + +public class DexDoubleToInt extends DexFormat12x { public static final int OPCODE = 0x8a; public static final String NAME = "DoubleToInt"; public static final String SMALI_NAME = "doubleto-int"; - DoubleToInt(int high, BytecodeStream stream) { + DexDoubleToInt(int high, BytecodeStream stream) { super(high, stream); } - public DoubleToInt(int dest, int source) { + public DexDoubleToInt(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/DoubleToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/DoubleToLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java index d9fa0c5..0ea8942 100644 --- a/src/main/java/com/android/tools/r8/code/DoubleToLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexDoubleToLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class DoubleToLong extends Format12x { + +public class DexDoubleToLong extends DexFormat12x { public static final int OPCODE = 0x8b; public static final String NAME = "DoubleToLong"; public static final String SMALI_NAME = "double-to-long"; - DoubleToLong(int high, BytecodeStream stream) { + DexDoubleToLong(int high, BytecodeStream stream) { super(high, stream); } - public DoubleToLong(int dest, int source) { + public DexDoubleToLong(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/FillArrayData.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/FillArrayData.java rename to src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java index a49a31d..de478d7 100644 --- a/src/main/java/com/android/tools/r8/code/FillArrayData.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayData.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.naming.ClassNameMapper; -public class FillArrayData extends Format31t { +public class DexFillArrayData extends DexFormat31t { public static final int OPCODE = 0x26; public static final String NAME = "FillArrayData"; public static final String SMALI_NAME = "fill-array-data"; - FillArrayData(int high, BytecodeStream stream) { + DexFillArrayData(int high, BytecodeStream stream) { super(high, stream); } - public FillArrayData(int value) { + public DexFillArrayData(int value) { super(value, -1); }
diff --git a/src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java rename to src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java index cab0270..11b34be 100644 --- a/src/main/java/com/android/tools/r8/code/FillArrayDataPayload.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFillArrayDataPayload.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -15,17 +15,17 @@ import java.nio.ShortBuffer; import java.util.Arrays; -public class FillArrayDataPayload extends Nop { +public class DexFillArrayDataPayload extends DexNop { public final int element_width; public final long size; public final short[] data; - private static void specify(StructuralSpecification<FillArrayDataPayload, ?> spec) { + private static void specify(StructuralSpecification<DexFillArrayDataPayload, ?> spec) { spec.withInt(i -> i.element_width).withLong(i -> i.size).withShortArray(i -> i.data); } - FillArrayDataPayload(int high, BytecodeStream stream) { + DexFillArrayDataPayload(int high, BytecodeStream stream) { super(high, stream); element_width = read16BitValue(stream); size = read32BitValue(stream); @@ -39,7 +39,7 @@ } } - public FillArrayDataPayload(int element_width, long size, short[] data) { + public DexFillArrayDataPayload(int element_width, long size, short[] data) { this.element_width = element_width; this.size = size; this.data = data; @@ -57,7 +57,7 @@ GraphLens graphLens, ObjectToOffsetMapping mapping, LensCodeRewriterUtils rewriter) { - writeFirst(3, dest); // Pseudo-opcode = 0x0300 + writeFirst(3, dest); // Pseudo-opcode = 0x0300 write16BitValue(element_width, dest); write32BitValue(size, dest); for (short datum : data) { @@ -66,8 +66,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (FillArrayDataPayload) other, FillArrayDataPayload::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFillArrayDataPayload) other, DexFillArrayDataPayload::specify); } @Override @@ -86,8 +86,12 @@ @Override public String toString(ClassNameMapper naming) { - return super.toString(naming) + "[FillArrayPayload], " + - "width: " + element_width + ", size: " + size; + return super.toString(naming) + + "[FillArrayPayload], " + + "width: " + + element_width + + ", size: " + + size; } @Override
diff --git a/src/main/java/com/android/tools/r8/code/FilledNewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java similarity index 77% rename from src/main/java/com/android/tools/r8/code/FilledNewArray.java rename to src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java index 5198876..ab52b2b 100644 --- a/src/main/java/com/android/tools/r8/code/FilledNewArray.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArray.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -13,17 +14,17 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class FilledNewArray extends Format35c<DexType> { +public class DexFilledNewArray extends DexFormat35c<DexType> { public static final int OPCODE = 0x24; public static final String NAME = "FilledNewArray"; public static final String SMALI_NAME = "filled-new-array"; - FilledNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexFilledNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); } - public FilledNewArray(int size, DexType type, int v0, int v1, int v2, int v3, int v4) { + public DexFilledNewArray(int size, DexType type, int v0, int v1, int v2, int v3, int v4) { super(size, type, v0, v1, v2, v3, v4); } @@ -44,12 +45,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } public DexType getType() { @@ -58,7 +59,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeNewArray(getType(), A, new int[]{C, D, E, F, G}); + builder.addInvokeNewArray(getType(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java index de651f5..5e473dc 100644 --- a/src/main/java/com/android/tools/r8/code/FilledNewArrayRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFilledNewArrayRange.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -13,17 +14,17 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class FilledNewArrayRange extends Format3rc<DexType> { +public class DexFilledNewArrayRange extends DexFormat3rc<DexType> { public static final int OPCODE = 0x25; public static final String NAME = "FilledNewArrayRange"; public static final String SMALI_NAME = "filled-new-array/range"; - FilledNewArrayRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexFilledNewArrayRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); } - public FilledNewArrayRange(int firstContentRegister, int size, DexType type) { + public DexFilledNewArrayRange(int firstContentRegister, int size, DexType type) { super(firstContentRegister, size, type); } @@ -44,12 +45,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } public DexType getType() {
diff --git a/src/main/java/com/android/tools/r8/code/FloatToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/FloatToDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java index 5b11258..8536b7e 100644 --- a/src/main/java/com/android/tools/r8/code/FloatToDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToDouble.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class FloatToDouble extends Format12x { +public class DexFloatToDouble extends DexFormat12x { public static final int OPCODE = 0x89; public static final String NAME = "FloatToDouble"; public static final String SMALI_NAME = "float-to-double"; - FloatToDouble(int high, BytecodeStream stream) { + DexFloatToDouble(int high, BytecodeStream stream) { super(high, stream); } - public FloatToDouble(int dest, int source) { + public DexFloatToDouble(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/FloatToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/FloatToInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java index d0d706f..cf95583 100644 --- a/src/main/java/com/android/tools/r8/code/FloatToInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class FloatToInt extends Format12x { +public class DexFloatToInt extends DexFormat12x { public static final int OPCODE = 0x87; public static final String NAME = "FloatToInt"; public static final String SMALI_NAME = "float-to-int"; - FloatToInt(int high, BytecodeStream stream) { + DexFloatToInt(int high, BytecodeStream stream) { super(high, stream); } - public FloatToInt(int dest, int source) { + public DexFloatToInt(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/FloatToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/FloatToLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java index 82346b0..3c7d3b4 100644 --- a/src/main/java/com/android/tools/r8/code/FloatToLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFloatToLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class FloatToLong extends Format12x { + +public class DexFloatToLong extends DexFormat12x { public static final int OPCODE = 0x88; public static final String NAME = "FloatToLong"; public static final String SMALI_NAME = "float-to-long"; - FloatToLong(int high, BytecodeStream stream) { + DexFloatToLong(int high, BytecodeStream stream) { super(high, stream); } - public FloatToLong(int dest, int source) { + public DexFloatToLong(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/Format10t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format10t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java index 9b2b11c..5ccccb9 100644 --- a/src/main/java/com/android/tools/r8/code/Format10t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10t.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -12,18 +13,18 @@ import com.android.tools.r8.utils.structural.CompareToVisitor; import java.nio.ShortBuffer; -abstract class Format10t extends Base1Format { +abstract class DexFormat10t extends DexBase1Format { public /* offset */ byte AA; // +AA | op - Format10t(int high, BytecodeStream stream) { + DexFormat10t(int high, BytecodeStream stream) { super(stream); // AA is an offset, so convert to signed. AA = (byte) high; } - protected Format10t(int AA) { + protected DexFormat10t(int AA) { assert Byte.MIN_VALUE <= AA && AA <= Byte.MAX_VALUE; this.AA = (byte) AA; } @@ -44,8 +45,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visitInt(AA, ((Format10t) other).AA); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visitInt(AA, ((DexFormat10t) other).AA); } @Override @@ -60,9 +61,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format10x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/Format10x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java index bc8feed..3cb41fb 100644 --- a/src/main/java/com/android/tools/r8/code/Format10x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat10x.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -11,16 +12,15 @@ import com.android.tools.r8.naming.ClassNameMapper; import java.nio.ShortBuffer; -abstract class Format10x extends Base1Format { +abstract class DexFormat10x extends DexBase1Format { // øø | op - Format10x(int high, BytecodeStream stream) { + DexFormat10x(int high, BytecodeStream stream) { // Intentionally left empty. super(stream); } - protected Format10x() { - } + protected DexFormat10x() {} @Override public void write( @@ -44,9 +44,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format11n.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java similarity index 78% rename from src/main/java/com/android/tools/r8/code/Format11n.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java index 27c0d27..20bec92 100644 --- a/src/main/java/com/android/tools/r8/code/Format11n.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11n.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,16 +15,16 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format11n extends Base1Format { +abstract class DexFormat11n extends DexBase1Format { public final byte A, B; - private static void specify(StructuralSpecification<Format11n, ?> spec) { + private static void specify(StructuralSpecification<DexFormat11n, ?> spec) { spec.withInt(i -> i.A).withInt(i -> i.B); } // #+B | vA | op - /*package*/ Format11n(int high, BytecodeStream stream) { + /*package*/ DexFormat11n(int high, BytecodeStream stream) { super(stream); A = (byte) (high & 0xf); // Sign extend 4bit value. @@ -35,7 +36,7 @@ } } - /*package*/ Format11n(int A, int B) { + /*package*/ DexFormat11n(int A, int B) { assert 0 <= A && A <= Constants.U4BIT_MAX; assert Constants.S4BIT_MIN <= B && B <= Constants.S4BIT_MAX; this.A = (byte) A; @@ -58,8 +59,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format11n) other, Format11n::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat11n) other, DexFormat11n::specify); } @Override @@ -69,9 +70,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format11x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/Format11x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java index 3cc3b73..46d615b 100644 --- a/src/main/java/com/android/tools/r8/code/Format11x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat11x.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -13,17 +14,17 @@ import com.android.tools.r8.utils.structural.CompareToVisitor; import java.nio.ShortBuffer; -abstract class Format11x extends Base1Format { +abstract class DexFormat11x extends DexBase1Format { public final short AA; // vAA | op - Format11x(int high, BytecodeStream stream) { + DexFormat11x(int high, BytecodeStream stream) { super(stream); AA = (short) high; } - protected Format11x(int AA) { + protected DexFormat11x(int AA) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; this.AA = (short) AA; } @@ -44,8 +45,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visitInt(AA, ((Format11x) other).AA); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visitInt(AA, ((DexFormat11x) other).AA); } @Override @@ -60,9 +61,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format12x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java similarity index 78% rename from src/main/java/com/android/tools/r8/code/Format12x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java index f3b80aa..29c2224 100644 --- a/src/main/java/com/android/tools/r8/code/Format12x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat12x.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,22 +15,22 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format12x extends Base1Format { +abstract class DexFormat12x extends DexBase1Format { public final byte A, B; - private static void specify(StructuralSpecification<Format12x, ?> spec) { + private static void specify(StructuralSpecification<DexFormat12x, ?> spec) { spec.withInt(i -> i.A).withInt(i -> i.B); } // vB | vA | op - Format12x(int high, BytecodeStream stream) { + DexFormat12x(int high, BytecodeStream stream) { super(stream); A = (byte) (high & 0xF); B = (byte) ((high >> 4) & 0xF); } - Format12x(int A, int B) { + DexFormat12x(int A, int B) { assert 0 <= A && A <= Constants.U4BIT_MAX; assert 0 <= B && B <= Constants.U4BIT_MAX; this.A = (byte) A; @@ -52,11 +53,10 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format12x) other, Format12x::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat12x) other, DexFormat12x::specify); } - @Override public String toString(ClassNameMapper naming) { return formatString("v" + A + ", v" + B); @@ -69,9 +69,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format20t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format20t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java index c9cd18b..c63962f 100644 --- a/src/main/java/com/android/tools/r8/code/Format20t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat20t.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -12,17 +13,17 @@ import com.android.tools.r8.utils.structural.CompareToVisitor; import java.nio.ShortBuffer; -abstract class Format20t extends Base2Format { +abstract class DexFormat20t extends DexBase2Format { public /* offset */ short AAAA; // øø | op | +AAAA - Format20t(int high, BytecodeStream stream) { + DexFormat20t(int high, BytecodeStream stream) { super(stream); AAAA = readSigned16BitValue(stream); } - protected Format20t(int AAAA) { + protected DexFormat20t(int AAAA) { assert Short.MIN_VALUE <= AAAA && AAAA <= Short.MAX_VALUE; this.AAAA = (short) AAAA; } @@ -44,8 +45,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visitInt(AAAA, ((Format20t) other).AAAA); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visitInt(AAAA, ((DexFormat20t) other).AAAA); } @Override @@ -60,9 +61,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format21c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java similarity index 73% rename from src/main/java/com/android/tools/r8/code/Format21c.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java index 9416be7..d942119 100644 --- a/src/main/java/com/android/tools/r8/code/Format21c.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21c.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.IndexedDexItem; @@ -10,19 +10,19 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.util.function.BiPredicate; -abstract class Format21c<T extends IndexedDexItem> extends Base2Format { +abstract class DexFormat21c<T extends IndexedDexItem> extends DexBase2Format { public final short AA; public T BBBB; // AA | op | [type|field|string]@BBBB - Format21c(int high, BytecodeStream stream, T[] map) { + DexFormat21c(int high, BytecodeStream stream, T[] map) { super(stream); AA = (short) high; BBBB = map[read16BitValue(stream)]; } - protected Format21c(int AA, T BBBB) { + protected DexFormat21c(int AA, T BBBB) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; this.AA = (short) AA; this.BBBB = BBBB; @@ -35,14 +35,14 @@ @SuppressWarnings("unchecked") @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { return visitor.visit( this, - (Format21c<T>) other, + (DexFormat21c<T>) other, spec -> spec.withInt(i -> i.AA).withSpec(this::internalSubSpecify)); } - abstract void internalSubSpecify(StructuralSpecification<Format21c<T>, ?> spec); + abstract void internalSubSpecify(StructuralSpecification<DexFormat21c<T>, ?> spec); @Override public String toString(ClassNameMapper naming) { @@ -57,11 +57,12 @@ } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || this.getClass() != other.getClass()) { return false; } - Format21c<?> o = (Format21c<?>) other; + DexFormat21c<?> o = (DexFormat21c<?>) other; return o.AA == AA && equality.test(BBBB, o.BBBB); } }
diff --git a/src/main/java/com/android/tools/r8/code/Format21h.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java similarity index 76% rename from src/main/java/com/android/tools/r8/code/Format21h.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java index 36b9174..ae07163 100644 --- a/src/main/java/com/android/tools/r8/code/Format21h.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21h.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -13,23 +14,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format21h extends Base2Format { +abstract class DexFormat21h extends DexBase2Format { public final short AA; public final char BBBB; - private static void specify(StructuralSpecification<Format21h, ?> spec) { + private static void specify(StructuralSpecification<DexFormat21h, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBB); } // AA | op | BBBB0000[00000000] - /*package*/ Format21h(int high, BytecodeStream stream) { + /*package*/ DexFormat21h(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBB = read16BitValue(stream); } - /*package*/ Format21h(int AA, int BBBB) { + /*package*/ DexFormat21h(int AA, int BBBB) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; assert 0 <= BBBB && BBBB <= Constants.U16BIT_MAX; this.AA = (short) AA; @@ -53,15 +54,15 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format21h) other, Format21h::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat21h) other, DexFormat21h::specify); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format21s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/Format21s.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java index 550fdd4..1194963 100644 --- a/src/main/java/com/android/tools/r8/code/Format21s.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21s.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -15,23 +16,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format21s extends Base2Format { +abstract class DexFormat21s extends DexBase2Format { public final short AA; public final short BBBB; - private static void specify(StructuralSpecification<Format21s, ?> spec) { + private static void specify(StructuralSpecification<DexFormat21s, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBB); } // AA | op | #+BBBB - /*package*/ Format21s(int high, BytecodeStream stream) { + /*package*/ DexFormat21s(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBB = readSigned16BitValue(stream); } - /*package*/ Format21s(int AA, int BBBB) { + /*package*/ DexFormat21s(int AA, int BBBB) { assert Short.MIN_VALUE <= BBBB && BBBB <= Short.MAX_VALUE; assert 0 <= AA && AA <= Constants.U8BIT_MAX; this.AA = (short) AA; @@ -55,8 +56,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format21s) other, Format21s::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat21s) other, DexFormat21s::specify); } @Override @@ -71,9 +72,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format21t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Format21t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java index bde930d..21061c3 100644 --- a/src/main/java/com/android/tools/r8/code/Format21t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat21t.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -17,23 +18,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public abstract class Format21t extends Base2Format { +public abstract class DexFormat21t extends DexBase2Format { public final short AA; public /* offset */ short BBBB; - private static void specify(StructuralSpecification<Format21t, ?> spec) { + private static void specify(StructuralSpecification<DexFormat21t, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBB); } // AA | op | +BBBB - Format21t(int high, BytecodeStream stream) { + DexFormat21t(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBB = readSigned16BitValue(stream); } - Format21t(int register, int offset) { + DexFormat21t(int register, int offset) { assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE; assert 0 <= register && register <= Constants.U8BIT_MAX; AA = (short) register; @@ -57,8 +58,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format21t) other, Format21t::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat21t) other, DexFormat21t::specify); } public abstract Type getType(); @@ -67,7 +68,7 @@ @Override public int[] getTargets() { - return new int[]{BBBB, getSize()}; + return new int[] {BBBB, getSize()}; } @Override @@ -89,9 +90,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format22b.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format22b.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java index 6f79b50..5f3213e 100644 --- a/src/main/java/com/android/tools/r8/code/Format22b.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22b.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -15,25 +16,25 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public abstract class Format22b extends Base2Format { +public abstract class DexFormat22b extends DexBase2Format { public final short AA; public final short BB; public final byte CC; - private static void specify(StructuralSpecification<Format22b, ?> spec) { + private static void specify(StructuralSpecification<DexFormat22b, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BB).withInt(i -> i.CC); } // vAA | op | #+CC | VBB - /*package*/ Format22b(int high, BytecodeStream stream) { + /*package*/ DexFormat22b(int high, BytecodeStream stream) { super(stream); AA = (short) high; CC = readSigned8BitValue(stream); BB = read8BitValue(stream); } - /*package*/ Format22b(int AA, int BB, int CC) { + /*package*/ DexFormat22b(int AA, int BB, int CC) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; assert 0 <= BB && BB <= Constants.U8BIT_MAX; assert Byte.MIN_VALUE <= CC && CC <= Byte.MAX_VALUE; @@ -59,8 +60,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format22b) other, Format22b::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat22b) other, DexFormat22b::specify); } @Override @@ -76,9 +77,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format22c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java similarity index 71% rename from src/main/java/com/android/tools/r8/code/Format22c.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java index 536ec65..d406aad 100644 --- a/src/main/java/com/android/tools/r8/code/Format22c.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22c.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.DexReference; @@ -11,25 +11,26 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.util.function.BiPredicate; -public abstract class Format22c<T extends DexReference> extends Base2Format { +public abstract class DexFormat22c<T extends DexReference> extends DexBase2Format { public final byte A; public final byte B; public T CCCC; - private static void specify(StructuralSpecification<Format22c<? extends DexReference>, ?> spec) { + private static void specify( + StructuralSpecification<DexFormat22c<? extends DexReference>, ?> spec) { spec.withInt(i -> i.A).withInt(i -> i.B).withDexReference(i -> i.CCCC); } // vB | vA | op | [type|field]@CCCC - /*package*/ Format22c(int high, BytecodeStream stream, T[] map) { + /*package*/ DexFormat22c(int high, BytecodeStream stream, T[] map) { super(stream); A = (byte) (high & 0xf); B = (byte) ((high >> 4) & 0xf); CCCC = map[read16BitValue(stream)]; } - /*package*/ Format22c(int A, int B, T CCCC) { + /*package*/ DexFormat22c(int A, int B, T CCCC) { assert 0 <= A && A <= Constants.U4BIT_MAX; assert 0 <= B && B <= Constants.U4BIT_MAX; this.A = (byte) A; @@ -43,8 +44,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format22c<? extends DexReference>) other, Format22c::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat22c<? extends DexReference>) other, DexFormat22c::specify); } @Override @@ -60,11 +61,12 @@ } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || this.getClass() != other.getClass()) { return false; } - Format22c<?> o = (Format22c<?>) other; + DexFormat22c<?> o = (DexFormat22c<?>) other; return o.A == A && o.B == B && equality.test(CCCC, o.CCCC); } }
diff --git a/src/main/java/com/android/tools/r8/code/Format22s.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format22s.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java index efa14d2..84921eb 100644 --- a/src/main/java/com/android/tools/r8/code/Format22s.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22s.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -15,25 +16,25 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public abstract class Format22s extends Base2Format { +public abstract class DexFormat22s extends DexBase2Format { public final byte A; public final byte B; public final short CCCC; - private static void specify(StructuralSpecification<Format22s, ?> spec) { + private static void specify(StructuralSpecification<DexFormat22s, ?> spec) { spec.withInt(i -> i.A).withInt(i -> i.B).withInt(i -> i.CCCC); } // vB | vA | op | #+CCCC - /*package*/ Format22s(int high, BytecodeStream stream) { + /*package*/ DexFormat22s(int high, BytecodeStream stream) { super(stream); A = (byte) (high & 0xf); B = (byte) ((high >> 4) & 0xf); CCCC = readSigned16BitValue(stream); } - /*package*/ Format22s(int A, int B, int CCCC) { + /*package*/ DexFormat22s(int A, int B, int CCCC) { assert 0 <= A && A <= Constants.U4BIT_MAX; assert 0 <= B && B <= Constants.U4BIT_MAX; assert Short.MIN_VALUE <= CCCC && CCCC <= Short.MAX_VALUE; @@ -59,8 +60,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format22s) other, Format22s::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat22s) other, DexFormat22s::specify); } @Override @@ -76,9 +77,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format22t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Format22t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java index 9688b4e..395ac6e 100644 --- a/src/main/java/com/android/tools/r8/code/Format22t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22t.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -17,25 +18,25 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public abstract class Format22t extends Base2Format { +public abstract class DexFormat22t extends DexBase2Format { public final byte A; public final byte B; public /* offset */ short CCCC; - private static void specify(StructuralSpecification<Format22t, ?> spec) { + private static void specify(StructuralSpecification<DexFormat22t, ?> spec) { spec.withInt(i -> i.A).withInt(i -> i.B).withInt(i -> i.CCCC); } // vB | vA | op | +CCCC - Format22t(int high, BytecodeStream stream) { + DexFormat22t(int high, BytecodeStream stream) { super(stream); A = (byte) (high & 0xf); B = (byte) ((high >> 4) & 0xf); CCCC = readSigned16BitValue(stream); } - Format22t(int register1, int register2, int offset) { + DexFormat22t(int register1, int register2, int offset) { assert 0 <= register1 && register1 <= Constants.U4BIT_MAX; assert 0 <= register2 && register2 <= Constants.U4BIT_MAX; assert Short.MIN_VALUE <= offset && offset <= Short.MAX_VALUE; @@ -61,8 +62,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format22t) other, Format22t::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat22t) other, DexFormat22t::specify); } public abstract Type getType(); @@ -71,7 +72,7 @@ @Override public int[] getTargets() { - return new int[]{CCCC, getSize()}; + return new int[] {CCCC, getSize()}; } @Override @@ -93,9 +94,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format22x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java similarity index 74% rename from src/main/java/com/android/tools/r8/code/Format22x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java index 1d9d8ba..e7d6f0c 100644 --- a/src/main/java/com/android/tools/r8/code/Format22x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat22x.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,23 +15,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format22x extends Base2Format { +abstract class DexFormat22x extends DexBase2Format { public final short AA; public final char BBBB; - private static void specify(StructuralSpecification<Format22x, ?> spec) { + private static void specify(StructuralSpecification<DexFormat22x, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBB); } // AA | op | vBBBB - Format22x(int high, BytecodeStream stream) { + DexFormat22x(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBB = read16BitValue(stream); } - Format22x(int dest, int src) { + DexFormat22x(int dest, int src) { assert 0 <= dest && dest <= Constants.U8BIT_MAX; assert 0 <= src && src <= Constants.U16BIT_MAX; AA = (short) dest; @@ -54,26 +55,25 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format22x) other, Format22x::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat22x) other, DexFormat22x::specify); } - @Override public String toString(ClassNameMapper naming) { - return formatString("v" + AA + ", v" + (int)BBBB); + return formatString("v" + AA + ", v" + (int) BBBB); } @Override public String toSmaliString(ClassNameMapper naming) { - return formatSmaliString("v" + AA + ", v" + (int)BBBB); + return formatSmaliString("v" + AA + ", v" + (int) BBBB); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format23x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format23x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java index ca3ef80..ee90cf8 100644 --- a/src/main/java/com/android/tools/r8/code/Format23x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat23x.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,25 +15,25 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format23x extends Base2Format { +abstract class DexFormat23x extends DexBase2Format { public final short AA; public final short BB; public final short CC; - private static void specify(StructuralSpecification<Format23x, ?> spec) { + private static void specify(StructuralSpecification<DexFormat23x, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BB).withInt(i -> i.CC); } // vAA | op | vCC | vBB - Format23x(int high, BytecodeStream stream) { + DexFormat23x(int high, BytecodeStream stream) { super(stream); AA = (short) high; CC = read8BitValue(stream); BB = read8BitValue(stream); } - Format23x(int AA, int BB, int CC) { + DexFormat23x(int AA, int BB, int CC) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; assert 0 <= BB && BB <= Constants.U8BIT_MAX; assert 0 <= CC && CC <= Constants.U8BIT_MAX; @@ -58,8 +59,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format23x) other, Format23x::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat23x) other, DexFormat23x::specify); } @Override @@ -74,9 +75,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format30t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/Format30t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java index ba986cc..878cc7b 100644 --- a/src/main/java/com/android/tools/r8/code/Format30t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat30t.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -12,17 +13,17 @@ import com.android.tools.r8.utils.structural.CompareToVisitor; import java.nio.ShortBuffer; -abstract class Format30t extends Base3Format { +abstract class DexFormat30t extends DexBase3Format { public /* offset */ int AAAAAAAA; // øø | op | AAAAlo | AAAAhi - Format30t(int high, BytecodeStream stream) { + DexFormat30t(int high, BytecodeStream stream) { super(stream); AAAAAAAA = readSigned32BitValue(stream); } - protected Format30t(int AAAAAAAA) { + protected DexFormat30t(int AAAAAAAA) { this.AAAAAAAA = AAAAAAAA; } @@ -43,8 +44,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visitInt(AAAAAAAA, ((Format30t) other).AAAAAAAA); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visitInt(AAAAAAAA, ((DexFormat30t) other).AAAAAAAA); } @Override @@ -59,9 +60,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format31c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java similarity index 76% rename from src/main/java/com/android/tools/r8/code/Format31c.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java index 6664662..82e033a 100644 --- a/src/main/java/com/android/tools/r8/code/Format31c.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31c.java
@@ -1,11 +1,12 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import static com.android.tools.r8.dex.Constants.U8BIT_MAX; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexString; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.IndexedDexItem; @@ -18,23 +19,23 @@ import java.nio.ShortBuffer; import java.util.function.BiPredicate; -abstract class Format31c extends Base3Format { +abstract class DexFormat31c extends DexBase3Format { public final short AA; public DexString BBBBBBBB; - private static void specify(StructuralSpecification<Format31c, ?> spec) { + private static void specify(StructuralSpecification<DexFormat31c, ?> spec) { spec.withInt(i -> i.AA).withItem(i -> i.BBBBBBBB); } // vAA | op | string@BBBBlo | string@#+BBBBhi - Format31c(int high, BytecodeStream stream, DexString[] map) { + DexFormat31c(int high, BytecodeStream stream, DexString[] map) { super(stream); AA = (short) high; BBBBBBBB = map[(int) read32BitValue(stream)]; } - Format31c(int AA, DexString BBBBBBBB) { + DexFormat31c(int AA, DexString BBBBBBBB) { assert 0 <= AA && AA <= U8BIT_MAX; this.AA = (short) AA; this.BBBBBBBB = BBBBBBBB; @@ -57,8 +58,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format31c) other, Format31c::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat31c) other, DexFormat31c::specify); } @Override @@ -69,19 +70,20 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { BBBBBBBB.collectIndexedItems(indexedItems); } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || (this.getClass() != other.getClass())) { return false; } - Format31c o = (Format31c) other; + DexFormat31c o = (DexFormat31c) other; return o.AA == AA && equality.test(BBBBBBBB, o.BBBBBBBB); } }
diff --git a/src/main/java/com/android/tools/r8/code/Format31i.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java similarity index 77% rename from src/main/java/com/android/tools/r8/code/Format31i.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java index c2fa1b1..04e57f1 100644 --- a/src/main/java/com/android/tools/r8/code/Format31i.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31i.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,23 +15,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format31i extends Base3Format { +abstract class DexFormat31i extends DexBase3Format { public final short AA; public final int BBBBBBBB; - private static void specify(StructuralSpecification<Format31i, ?> spec) { + private static void specify(StructuralSpecification<DexFormat31i, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBBBBBB); } // vAA | op | #+BBBBlo | #+BBBBhi - /*package*/ Format31i(int high, BytecodeStream stream) { + /*package*/ DexFormat31i(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBBBBBB = readSigned32BitValue(stream); } - /*package*/ Format31i(int AA, int BBBBBBBB) { + /*package*/ DexFormat31i(int AA, int BBBBBBBB) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; this.AA = (short) AA; this.BBBBBBBB = BBBBBBBB; @@ -53,8 +54,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format31i) other, Format31i::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat31i) other, DexFormat31i::specify); } @Override @@ -64,9 +65,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format31t.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Format31t.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java index f85aca6..cc57a14 100644 --- a/src/main/java/com/android/tools/r8/code/Format31t.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat31t.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,23 +15,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public abstract class Format31t extends Base3Format { +public abstract class DexFormat31t extends DexBase3Format { public final short AA; protected /* offset */ int BBBBBBBB; - private static void specify(StructuralSpecification<Format31t, ?> spec) { + private static void specify(StructuralSpecification<DexFormat31t, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.BBBBBBBB); } // vAA | op | +BBBBlo | +BBBBhi - Format31t(int high, BytecodeStream stream) { + DexFormat31t(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBBBBBB = readSigned32BitValue(stream); } - Format31t(int register, int payloadOffset) { + DexFormat31t(int register, int payloadOffset) { assert 0 <= register && register <= Constants.U8BIT_MAX; AA = (short) register; BBBBBBBB = payloadOffset; @@ -68,8 +69,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format31t) other, Format31t::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat31t) other, DexFormat31t::specify); } @Override @@ -79,9 +80,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format32x.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/Format32x.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java index c637383..f9a7792 100644 --- a/src/main/java/com/android/tools/r8/code/Format32x.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat32x.java
@@ -1,11 +1,12 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import static com.android.tools.r8.dex.Constants.U16BIT_MAX; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -15,23 +16,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format32x extends Base3Format { +abstract class DexFormat32x extends DexBase3Format { public final int AAAA; public final int BBBB; - private static void specify(StructuralSpecification<Format32x, ?> spec) { + private static void specify(StructuralSpecification<DexFormat32x, ?> spec) { spec.withInt(i -> i.AAAA).withInt(i -> i.BBBB); } // øø | op | AAAA | BBBB - Format32x(int high, BytecodeStream stream) { + DexFormat32x(int high, BytecodeStream stream) { super(stream); AAAA = read16BitValue(stream); BBBB = read16BitValue(stream); } - Format32x(int dest, int src) { + DexFormat32x(int dest, int src) { assert 0 <= dest && dest <= U16BIT_MAX; assert 0 <= src && src <= U16BIT_MAX; AAAA = dest; @@ -56,8 +57,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format32x) other, Format32x::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat32x) other, DexFormat32x::specify); } @Override @@ -72,9 +73,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Format35c.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java similarity index 77% rename from src/main/java/com/android/tools/r8/code/Format35c.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java index e5d2489..78a5323 100644 --- a/src/main/java/com/android/tools/r8/code/Format35c.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat35c.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.IndexedDexItem; @@ -11,7 +11,8 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.util.function.BiPredicate; -public abstract class Format35c<T extends IndexedDexItem & StructuralItem<T>> extends Base3Format { +public abstract class DexFormat35c<T extends IndexedDexItem & StructuralItem<T>> + extends DexBase3Format { public final byte A; public final byte C; @@ -22,7 +23,7 @@ public T BBBB; private static <T extends IndexedDexItem & StructuralItem<T>> void specify( - StructuralSpecification<Format35c<T>, ?> spec) { + StructuralSpecification<DexFormat35c<T>, ?> spec) { spec.withInt(i -> i.A) .withInt(i -> i.C) .withInt(i -> i.D) @@ -33,7 +34,7 @@ } // A | G | op | BBBB | F | E | D | C - Format35c(int high, BytecodeStream stream, T[] map) { + DexFormat35c(int high, BytecodeStream stream, T[] map) { super(stream); G = (byte) (high & 0xf); A = (byte) ((high >> 4) & 0xf); @@ -46,7 +47,7 @@ D = (byte) ((next >> 4) & 0xf); } - Format35c(int A, T BBBB, int C, int D, int E, int F, int G) { + DexFormat35c(int A, T BBBB, int C, int D, int E, int F, int G) { assert 0 <= A && A <= Constants.U4BIT_MAX; assert 0 <= C && C <= Constants.U4BIT_MAX; assert 0 <= D && D <= Constants.U4BIT_MAX; @@ -64,19 +65,19 @@ @Override public final int hashCode() { - return ((BBBB.hashCode() << 24) | (A << 20) | (C << 16) | (D << 12) | (E << 8) | (F << 4) - | G) ^ getClass().hashCode(); + return ((BBBB.hashCode() << 24) | (A << 20) | (C << 16) | (D << 12) | (E << 8) | (F << 4) | G) + ^ getClass().hashCode(); } @SuppressWarnings("unchecked") @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format35c<T>) other, Format35c::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat35c<T>) other, DexFormat35c::specify); } private void appendRegisterArguments(StringBuilder builder, String separator) { builder.append("{ "); - int[] values = new int[]{C, D, E, F, G}; + int[] values = new int[] {C, D, E, F, G}; for (int i = 0; i < A; i++) { if (i != 0) { builder.append(separator); @@ -110,12 +111,18 @@ } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || (this.getClass() != other.getClass())) { return false; } - Format35c o = (Format35c) other; - return o.A == A && o.C == C && o.D == D && o.E == E && o.F == F && o.G == G + DexFormat35c o = (DexFormat35c) other; + return o.A == A + && o.C == C + && o.D == D + && o.E == E + && o.F == F + && o.G == G && equality.test(BBBB, o.BBBB); } }
diff --git a/src/main/java/com/android/tools/r8/code/Format3rc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/Format3rc.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java index 0ceeb4a..01fff36b 100644 --- a/src/main/java/com/android/tools/r8/code/Format3rc.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat3rc.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.IndexedDexItem; @@ -11,26 +11,27 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.util.function.BiPredicate; -public abstract class Format3rc<T extends IndexedDexItem & StructuralItem<T>> extends Base3Format { +public abstract class DexFormat3rc<T extends IndexedDexItem & StructuralItem<T>> + extends DexBase3Format { public final short AA; public final char CCCC; public T BBBB; private static <T extends IndexedDexItem & StructuralItem<T>> void specify( - StructuralSpecification<Format3rc<T>, ?> spec) { + StructuralSpecification<DexFormat3rc<T>, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.CCCC).withItem(i -> i.BBBB); } // AA | op | [meth|type]@BBBBB | CCCC - Format3rc(int high, BytecodeStream stream, T[] map) { + DexFormat3rc(int high, BytecodeStream stream, T[] map) { super(stream); this.AA = (short) high; this.BBBB = map[read16BitValue(stream)]; this.CCCC = read16BitValue(stream); } - Format3rc(int firstArgumentRegister, int argumentCount, T dexItem) { + DexFormat3rc(int firstArgumentRegister, int argumentCount, T dexItem) { assert 0 <= firstArgumentRegister && firstArgumentRegister <= Constants.U16BIT_MAX; assert 0 <= argumentCount && argumentCount <= Constants.U8BIT_MAX; this.CCCC = (char) firstArgumentRegister; @@ -49,8 +50,8 @@ @SuppressWarnings("unchecked") @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format3rc<T>) other, Format3rc::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat3rc<T>) other, DexFormat3rc::specify); } private void appendRegisterRange(StringBuilder builder) { @@ -87,11 +88,12 @@ } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || (this.getClass() != other.getClass())) { return false; } - Format3rc<?> o = (Format3rc<?>) other; + DexFormat3rc<?> o = (DexFormat3rc<?>) other; return o.AA == AA && o.CCCC == CCCC && equality.test(BBBB, o.BBBB); } }
diff --git a/src/main/java/com/android/tools/r8/code/Format45cc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/Format45cc.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java index 1542015..bdc0a15 100644 --- a/src/main/java/com/android/tools/r8/code/Format45cc.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat45cc.java
@@ -1,11 +1,12 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import static com.android.tools.r8.dex.Constants.U4BIT_MAX; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.GraphLens; @@ -21,7 +22,7 @@ import java.nio.ShortBuffer; /** Format45cc for instructions of size 4, with 5 registers and 2 constant pool index. */ -public abstract class Format45cc extends Base4Format { +public abstract class DexFormat45cc extends DexBase4Format { public final byte A; public final byte C; @@ -32,7 +33,7 @@ public DexMethod BBBB; public DexProto HHHH; - private static void specify(StructuralSpecification<Format45cc, ?> spec) { + private static void specify(StructuralSpecification<DexFormat45cc, ?> spec) { spec.withInt(i -> i.A) .withInt(i -> i.C) .withInt(i -> i.D) @@ -43,7 +44,7 @@ .withItem(i -> i.HHHH); } - Format45cc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) { + DexFormat45cc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) { super(stream); G = (byte) (high & 0xf); A = (byte) ((high >> 4) & 0xf); @@ -58,7 +59,7 @@ } // A | G | op | [meth]@BBBB | F | E | D | C | [proto]@HHHH - protected Format45cc(int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) { + protected DexFormat45cc(int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) { assert 0 <= A && A <= U4BIT_MAX; assert 0 <= C && C <= U4BIT_MAX; assert 0 <= D && D <= U4BIT_MAX; @@ -89,23 +90,23 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format45cc) other, Format45cc::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat45cc) other, DexFormat45cc::specify); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { MethodLookupResult lookup = - graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC); + appView.graphLens().lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC); assert lookup.getType() == Type.POLYMORPHIC; - lookup.getReference().collectIndexedItems(indexedItems); + lookup.getReference().collectIndexedItems(appView, indexedItems); DexProto rewrittenProto = rewriter.rewriteProto(getProto()); - rewrittenProto.collectIndexedItems(indexedItems); + rewrittenProto.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/Format4rcc.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/Format4rcc.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java index 4da5b40..a96b70b 100644 --- a/src/main/java/com/android/tools/r8/code/Format4rcc.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat4rcc.java
@@ -1,10 +1,11 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.GraphLens; @@ -21,19 +22,19 @@ import java.util.function.BiPredicate; /** Format4rcc for instructions of size 4, with a range of registers and 2 constant pool index. */ -public abstract class Format4rcc extends Base4Format { +public abstract class DexFormat4rcc extends DexBase4Format { public final short AA; public final char CCCC; public DexMethod BBBB; public DexProto HHHH; - private static void specify(StructuralSpecification<Format4rcc, ?> spec) { + private static void specify(StructuralSpecification<DexFormat4rcc, ?> spec) { spec.withInt(i -> i.AA).withInt(i -> i.CCCC).withItem(i -> i.BBBB).withItem(i -> i.HHHH); } // AA | op | [meth]@BBBB | CCCC | [proto]@HHHH - Format4rcc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) { + DexFormat4rcc(int high, BytecodeStream stream, DexMethod[] methodMap, DexProto[] protoMap) { super(stream); this.AA = (short) high; this.BBBB = methodMap[read16BitValue(stream)]; @@ -41,7 +42,7 @@ this.HHHH = protoMap[read16BitValue(stream)]; } - Format4rcc(int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) { + DexFormat4rcc(int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) { assert 0 <= firstArgumentRegister && firstArgumentRegister <= Constants.U16BIT_MAX; assert 0 <= argumentCount && argumentCount <= Constants.U8BIT_MAX; this.CCCC = (char) firstArgumentRegister; @@ -75,8 +76,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format4rcc) other, Format4rcc::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat4rcc) other, DexFormat4rcc::specify); } @Override @@ -111,25 +112,26 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { MethodLookupResult lookup = - graphLens.lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC); + appView.graphLens().lookupMethod(getMethod(), context.getReference(), Type.POLYMORPHIC); assert lookup.getType() == Type.POLYMORPHIC; - lookup.getReference().collectIndexedItems(indexedItems); + lookup.getReference().collectIndexedItems(appView, indexedItems); DexProto rewrittenProto = rewriter.rewriteProto(getProto()); - rewrittenProto.collectIndexedItems(indexedItems); + rewrittenProto.collectIndexedItems(appView, indexedItems); } @Override - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { if (other == null || (this.getClass() != other.getClass())) { return false; } - Format4rcc o = (Format4rcc) other; + DexFormat4rcc o = (DexFormat4rcc) other; return o.AA == AA && o.CCCC == CCCC && equality.test(BBBB, o.BBBB)
diff --git a/src/main/java/com/android/tools/r8/code/Format51l.java b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java similarity index 78% rename from src/main/java/com/android/tools/r8/code/Format51l.java rename to src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java index 1417bf8..fa88721 100644 --- a/src/main/java/com/android/tools/r8/code/Format51l.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexFormat51l.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.graph.ProgramMethod; @@ -14,23 +15,23 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class Format51l extends Base5Format { +abstract class DexFormat51l extends DexBase5Format { public final short AA; public final long BBBBBBBBBBBBBBBB; - private static void specify(StructuralSpecification<Format51l, ?> spec) { + private static void specify(StructuralSpecification<DexFormat51l, ?> spec) { spec.withInt(i -> i.AA).withLong(i -> i.BBBBBBBBBBBBBBBB); } // AA | op | BBBB | BBBB | BBBB | BBBB - Format51l(int high, BytecodeStream stream) { + DexFormat51l(int high, BytecodeStream stream) { super(stream); AA = (short) high; BBBBBBBBBBBBBBBB = read64BitValue(stream); } - public Format51l(int AA, long BBBBBBBBBBBBBBBB) { + public DexFormat51l(int AA, long BBBBBBBBBBBBBBBB) { assert 0 <= AA && AA <= Constants.U8BIT_MAX; this.AA = (short) AA; this.BBBBBBBBBBBBBBBB = BBBBBBBBBBBBBBBB; @@ -53,8 +54,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (Format51l) other, Format51l::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexFormat51l) other, DexFormat51l::specify); } @Override @@ -64,9 +65,9 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // No references. }
diff --git a/src/main/java/com/android/tools/r8/code/Goto.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/Goto.java rename to src/main/java/com/android/tools/r8/dex/code/DexGoto.java index fc911ee..6b7c0b2 100644 --- a/src/main/java/com/android/tools/r8/code/Goto.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Goto extends Format10t { +public class DexGoto extends DexFormat10t { public static final int OPCODE = 0x28; public static final String NAME = "Goto"; public static final String SMALI_NAME = "goto"; - Goto(int high, BytecodeStream stream) { + DexGoto(int high, BytecodeStream stream) { super(high, stream); } - public Goto(int AA) { + public DexGoto(int AA) { super(AA); } @@ -36,7 +36,7 @@ @Override public int[] getTargets() { - return new int[] { AA }; + return new int[] {AA}; } @Override
diff --git a/src/main/java/com/android/tools/r8/code/Goto16.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Goto16.java rename to src/main/java/com/android/tools/r8/dex/code/DexGoto16.java index c4cec89..0a41ab6 100644 --- a/src/main/java/com/android/tools/r8/code/Goto16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto16.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Goto16 extends Format20t { +public class DexGoto16 extends DexFormat20t { public static final int OPCODE = 0x29; public static final String NAME = "Goto16"; public static final String SMALI_NAME = "goto/16"; - Goto16(int high, BytecodeStream stream) { + DexGoto16(int high, BytecodeStream stream) { super(high, stream); } - public Goto16(int AAAA) { + public DexGoto16(int AAAA) { super(AAAA); } @@ -36,7 +36,7 @@ @Override public int[] getTargets() { - return new int[]{AAAA}; + return new int[] {AAAA}; } @Override
diff --git a/src/main/java/com/android/tools/r8/code/Goto32.java b/src/main/java/com/android/tools/r8/dex/code/DexGoto32.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Goto32.java rename to src/main/java/com/android/tools/r8/dex/code/DexGoto32.java index 3a4c6b8..bfa83cc 100644 --- a/src/main/java/com/android/tools/r8/code/Goto32.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexGoto32.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Goto32 extends Format30t { +public class DexGoto32 extends DexFormat30t { public static final int OPCODE = 0x2a; public static final String NAME = "Goto32"; public static final String SMALI_NAME = "goto/32"; - Goto32(int high, BytecodeStream stream) { + DexGoto32(int high, BytecodeStream stream) { super(high, stream); } - public Goto32(int AAAAAAAA) { + public DexGoto32(int AAAAAAAA) { super(AAAAAAAA); } @@ -36,7 +36,7 @@ @Override public int[] getTargets() { - return new int[]{AAAAAAAA}; + return new int[] {AAAAAAAA}; } @Override
diff --git a/src/main/java/com/android/tools/r8/code/IfEq.java b/src/main/java/com/android/tools/r8/dex/code/DexIfEq.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfEq.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfEq.java index abd77ee..345328f 100644 --- a/src/main/java/com/android/tools/r8/code/IfEq.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfEq.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfEq extends Format22t { +public class DexIfEq extends DexFormat22t { public static final int OPCODE = 0x32; public static final String NAME = "IfEq"; public static final String SMALI_NAME = "if-eq"; - IfEq(int high, BytecodeStream stream) { + DexIfEq(int high, BytecodeStream stream) { super(high, stream); } - public IfEq(int register1, int register2, int offset) { + public DexIfEq(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfEqz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfEqz.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java index 8bfed6d..517576c 100644 --- a/src/main/java/com/android/tools/r8/code/IfEqz.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfEqz.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfEqz extends Format21t { +public class DexIfEqz extends DexFormat21t { public static final int OPCODE = 0x38; public static final String NAME = "IfEqz"; public static final String SMALI_NAME = "if-eqz"; - IfEqz(int high, BytecodeStream stream) { + DexIfEqz(int high, BytecodeStream stream) { super(high, stream); } - public IfEqz(int register, int offset) { + public DexIfEqz(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfGe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGe.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfGe.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfGe.java index dd123f2..4c49892 100644 --- a/src/main/java/com/android/tools/r8/code/IfGe.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGe.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfGe extends Format22t { +public class DexIfGe extends DexFormat22t { public static final int OPCODE = 0x35; public static final String NAME = "IfGe"; public static final String SMALI_NAME = "if-ge"; - IfGe(int high, BytecodeStream stream) { + DexIfGe(int high, BytecodeStream stream) { super(high, stream); } - public IfGe(int register1, int register2, int offset) { + public DexIfGe(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfGez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGez.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfGez.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfGez.java index 9ca69c0..6a9b49e 100644 --- a/src/main/java/com/android/tools/r8/code/IfGez.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGez.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfGez extends Format21t { +public class DexIfGez extends DexFormat21t { public static final int OPCODE = 0x3b; public static final String NAME = "IfGez"; public static final String SMALI_NAME = "if-gez"; - IfGez(int high, BytecodeStream stream) { + DexIfGez(int high, BytecodeStream stream) { super(high, stream); } - public IfGez(int register, int offset) { + public DexIfGez(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfGt.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGt.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfGt.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfGt.java index 84a8fcb..20abfdc 100644 --- a/src/main/java/com/android/tools/r8/code/IfGt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfGt extends Format22t { +public class DexIfGt extends DexFormat22t { public static final int OPCODE = 0x36; public static final String NAME = "IfGt"; public static final String SMALI_NAME = "if-gt"; - IfGt(int high, BytecodeStream stream) { + DexIfGt(int high, BytecodeStream stream) { super(high, stream); } - public IfGt(int register1, int register2, int offset) { + public DexIfGt(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfGtz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfGtz.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java index 8567a11..c3a8348 100644 --- a/src/main/java/com/android/tools/r8/code/IfGtz.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfGtz.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfGtz extends Format21t { +public class DexIfGtz extends DexFormat21t { public static final int OPCODE = 0x3c; public static final String NAME = "IfGtz"; public static final String SMALI_NAME = "if-gtz"; - IfGtz(int high, BytecodeStream stream) { + DexIfGtz(int high, BytecodeStream stream) { super(high, stream); } - public IfGtz(int register, int offset) { + public DexIfGtz(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfLe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLe.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfLe.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfLe.java index c313a4f..9fde6a5 100644 --- a/src/main/java/com/android/tools/r8/code/IfLe.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLe.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfLe extends Format22t { +public class DexIfLe extends DexFormat22t { public static final int OPCODE = 0x37; public static final String NAME = "IfLe"; public static final String SMALI_NAME = "if-le"; - IfLe(int high, BytecodeStream stream) { + DexIfLe(int high, BytecodeStream stream) { super(high, stream); } - public IfLe(int register1, int register2, int offset) { + public DexIfLe(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfLez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLez.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfLez.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfLez.java index 9024a98..04ebeff 100644 --- a/src/main/java/com/android/tools/r8/code/IfLez.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLez.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfLez extends Format21t { +public class DexIfLez extends DexFormat21t { public static final int OPCODE = 0x3d; public static final String NAME = "IfLez"; public static final String SMALI_NAME = "if-lez"; - IfLez(int high, BytecodeStream stream) { + DexIfLez(int high, BytecodeStream stream) { super(high, stream); } - public IfLez(int register, int offset) { + public DexIfLez(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfLt.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLt.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfLt.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfLt.java index 556de31..728ba10 100644 --- a/src/main/java/com/android/tools/r8/code/IfLt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfLt extends Format22t { +public class DexIfLt extends DexFormat22t { public static final int OPCODE = 0x34; public static final String NAME = "IfLt"; public static final String SMALI_NAME = "if-lt"; - IfLt(int high, BytecodeStream stream) { + DexIfLt(int high, BytecodeStream stream) { super(high, stream); } - public IfLt(int register1, int register2, int offset) { + public DexIfLt(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfLtz.java b/src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfLtz.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java index c19b0d9..0aba44f 100644 --- a/src/main/java/com/android/tools/r8/code/IfLtz.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfLtz.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfLtz extends Format21t { +public class DexIfLtz extends DexFormat21t { public static final int OPCODE = 0x3a; public static final String NAME = "IfLtz"; public static final String SMALI_NAME = "if-ltz"; - IfLtz(int high, BytecodeStream stream) { + DexIfLtz(int high, BytecodeStream stream) { super(high, stream); } - public IfLtz(int register, int offset) { + public DexIfLtz(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfNe.java b/src/main/java/com/android/tools/r8/dex/code/DexIfNe.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IfNe.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfNe.java index 24e45d9..9919538 100644 --- a/src/main/java/com/android/tools/r8/code/IfNe.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfNe.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfNe extends Format22t { +public class DexIfNe extends DexFormat22t { public static final int OPCODE = 0x33; public static final String NAME = "IfNe"; public static final String SMALI_NAME = "if-ne"; - IfNe(int high, BytecodeStream stream) { + DexIfNe(int high, BytecodeStream stream) { super(high, stream); } - public IfNe(int register1, int register2, int offset) { + public DexIfNe(int register1, int register2, int offset) { super(register1, register2, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/IfNez.java b/src/main/java/com/android/tools/r8/dex/code/DexIfNez.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/IfNez.java rename to src/main/java/com/android/tools/r8/dex/code/DexIfNez.java index f9057e6..cb74246 100644 --- a/src/main/java/com/android/tools/r8/code/IfNez.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIfNez.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.If.Type; import com.android.tools.r8.ir.code.ValueTypeConstraint; -public class IfNez extends Format21t { +public class DexIfNez extends DexFormat21t { public static final int OPCODE = 0x39; public static final String NAME = "IfNez"; public static final String SMALI_NAME = "if-nez"; - IfNez(int high, BytecodeStream stream) { + DexIfNez(int high, BytecodeStream stream) { super(high, stream); } - public IfNez(int register, int offset) { + public DexIfNez(int register, int offset) { super(register, offset); }
diff --git a/src/main/java/com/android/tools/r8/code/Iget.java b/src/main/java/com/android/tools/r8/dex/code/DexIget.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/Iget.java rename to src/main/java/com/android/tools/r8/dex/code/DexIget.java index ee8e7a0..0329505 100644 --- a/src/main/java/com/android/tools/r8/code/Iget.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIget.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Iget extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIget extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x52; public static final String NAME = "Iget"; public static final String SMALI_NAME = "iget"; - /*package*/ Iget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public Iget(int destRegister, int objectRegister, DexField field) { + public DexIget(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java index 3212878..16bfd6d 100644 --- a/src/main/java/com/android/tools/r8/code/IgetBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetBoolean.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetBoolean extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetBoolean extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x55; public static final String NAME = "IgetBoolean"; public static final String SMALI_NAME = "iget-boolean"; - /*package*/ IgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetBoolean(int destRegister, int objectRegister, DexField field) { + public DexIgetBoolean(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java index a876d70..a1a04db 100644 --- a/src/main/java/com/android/tools/r8/code/IgetByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetByte.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetByte extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetByte extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x56; public static final String NAME = "IgetByte"; public static final String SMALI_NAME = "iget-byte"; - /*package*/ IgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetByte(int destRegister, int objectRegister, DexField field) { + public DexIgetByte(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java index efa458d..a546c34 100644 --- a/src/main/java/com/android/tools/r8/code/IgetChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetChar.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetChar extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetChar extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x57; public static final String NAME = "IgetChar"; public static final String SMALI_NAME = "iget-char"; - /*package*/ IgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetChar(int destRegister, int objectRegister, DexField field) { + public DexIgetChar(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java index 93540d6..b9d1e38 100644 --- a/src/main/java/com/android/tools/r8/code/IgetObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetObject.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetObject extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetObject extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x54; public static final String NAME = "IgetObject"; public static final String SMALI_NAME = "iget-object"; - /*package*/ IgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetObject(int destRegister, int objectRegister, DexField field) { + public DexIgetObject(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetOrIput.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java similarity index 73% rename from src/main/java/com/android/tools/r8/code/IgetOrIput.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java index 33621e5..d1c298a 100644 --- a/src/main/java/com/android/tools/r8/code/IgetOrIput.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetOrIput.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -11,24 +12,24 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public abstract class IgetOrIput extends Format22c<DexField> { +public abstract class DexIgetOrIput extends DexFormat22c<DexField> { - IgetOrIput(int high, BytecodeStream stream, DexField[] map) { + DexIgetOrIput(int high, BytecodeStream stream, DexField[] map) { super(high, stream, map); } - IgetOrIput(int A, int B, DexField CCCC) { + DexIgetOrIput(int A, int B, DexField CCCC) { super(A, B, CCCC); } @Override public final void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexField rewritten = graphLens.lookupField(getField()); - rewritten.collectIndexedItems(indexedItems); + DexField rewritten = appView.graphLens().lookupField(getField()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/IgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java index 23bd792..653aac0 100644 --- a/src/main/java/com/android/tools/r8/code/IgetShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetShort.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetShort extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetShort extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x58; public static final String NAME = "IgetShort"; public static final String SMALI_NAME = "iget-short"; - /*package*/ IgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetShort(int destRegister, int objectRegister, DexField field) { + public DexIgetShort(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/IgetWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java index 12ad976..a2bcf17 100644 --- a/src/main/java/com/android/tools/r8/code/IgetWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIgetWide.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IgetWide extends IgetOrIput implements CfOrDexInstanceFieldRead { +public class DexIgetWide extends DexIgetOrIput implements CfOrDexInstanceFieldRead { public static final int OPCODE = 0x53; public static final String NAME = "IgetWide"; public static final String SMALI_NAME = "iget-wide"; - /*package*/ IgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IgetWide(int destRegister, int objectRegister, DexField field) { + public DexIgetWide(int destRegister, int objectRegister, DexField field) { super(destRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/DexInitClass.java b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java similarity index 85% rename from src/main/java/com/android/tools/r8/code/DexInitClass.java rename to src/main/java/com/android/tools/r8/dex/code/DexInitClass.java index 545c24c..b1e5025 100644 --- a/src/main/java/com/android/tools/r8/code/DexInitClass.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInitClass.java
@@ -2,10 +2,11 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; @@ -20,7 +21,7 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class DexInitClass extends Base2Format { +public class DexInitClass extends DexBase2Format { public static final int OPCODE = 0x60; public static final String NAME = "InitClass"; @@ -46,15 +47,15 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // We intentionally apply the graph lens first, and then the init class lens, using the fact // that the init class lens maps classes in the final program to fields in the final program. - DexType rewrittenClass = graphLens.lookupType(clazz); - DexField clinitField = indexedItems.getInitClassLens().getInitClassField(rewrittenClass); - clinitField.collectIndexedItems(indexedItems); + DexType rewrittenClass = appView.graphLens().lookupType(clazz); + DexField clinitField = appView.initClassLens().getInitClassField(rewrittenClass); + clinitField.collectIndexedItems(appView, indexedItems); } @Override @@ -87,20 +88,20 @@ switch (type) { case INT: case FLOAT: - return Sget.OPCODE; + return DexSget.OPCODE; case LONG: case DOUBLE: - return SgetWide.OPCODE; + return DexSgetWide.OPCODE; case OBJECT: - return SgetObject.OPCODE; + return DexSgetObject.OPCODE; case BOOLEAN: - return SgetBoolean.OPCODE; + return DexSgetBoolean.OPCODE; case BYTE: - return SgetByte.OPCODE; + return DexSgetByte.OPCODE; case CHAR: - return SgetChar.OPCODE; + return DexSgetChar.OPCODE; case SHORT: - return SgetShort.OPCODE; + return DexSgetShort.OPCODE; default: throw new Unreachable("Unexpected type: " + type); } @@ -132,7 +133,7 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { return visitor.visit(this, (DexInitClass) other, DexInitClass::specify); }
diff --git a/src/main/java/com/android/tools/r8/code/InstanceOf.java b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/InstanceOf.java rename to src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java index c1b8293..601dffb 100644 --- a/src/main/java/com/android/tools/r8/code/InstanceOf.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInstanceOf.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,22 +15,22 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class InstanceOf extends Format22c<DexType> { +public class DexInstanceOf extends DexFormat22c<DexType> { public static final int OPCODE = 0x20; public static final String NAME = "InstanceOf"; public static final String SMALI_NAME = "instance-of"; - InstanceOf(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInstanceOf(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); } - public InstanceOf(int dest, int value, DexType type) { + public DexInstanceOf(int dest, int value, DexType type) { super(dest, value, type); } @Override - public InstanceOf asInstanceOf() { + public DexInstanceOf asInstanceOf() { return this; } @@ -55,12 +56,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } public DexType getType() {
diff --git a/src/main/java/com/android/tools/r8/code/Instruction.java b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/Instruction.java rename to src/main/java/com/android/tools/r8/dex/code/DexInstruction.java index 580d5ef..cc35c46 100644 --- a/src/main/java/com/android/tools/r8/code/Instruction.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInstruction.java
@@ -1,12 +1,13 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.InternalCompilerError; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; @@ -28,20 +29,20 @@ import java.nio.ShortBuffer; import java.util.function.BiPredicate; -public abstract class Instruction implements CfOrDexInstruction, StructuralItem<Instruction> { - public static final Instruction[] EMPTY_ARRAY = {}; +public abstract class DexInstruction implements CfOrDexInstruction, StructuralItem<DexInstruction> { + public static final DexInstruction[] EMPTY_ARRAY = {}; - public final static int[] NO_TARGETS = null; - public final static int[] EXIT_TARGET = {}; + public static final int[] NO_TARGETS = null; + public static final int[] EXIT_TARGET = {}; private int offset; - Instruction(BytecodeStream stream) { + DexInstruction(BytecodeStream stream) { // When this constructor is invoked, we have already read 1 ushort from the stream. this.offset = stream.getOffset() - 1; } - protected Instruction() { + protected DexInstruction() { this.offset = -1; } @@ -128,8 +129,8 @@ write16BitValue(index, dest); } - protected void write32BitReference(IndexedDexItem item, ShortBuffer dest, - ObjectToOffsetMapping mapping) { + protected void write32BitReference( + IndexedDexItem item, ShortBuffer dest, ObjectToOffsetMapping mapping) { write32BitValue(item.getOffset(mapping), dest); } @@ -156,11 +157,11 @@ } @Override - public Instruction asDexInstruction() { + public DexInstruction asDexInstruction() { return this; } - public CheckCast asCheckCast() { + public DexCheckCast asCheckCast() { return null; } @@ -168,7 +169,7 @@ return false; } - public InstanceOf asInstanceOf() { + public DexInstanceOf asInstanceOf() { return null; } @@ -176,7 +177,7 @@ return false; } - public ConstString asConstString() { + public DexConstString asConstString() { return null; } @@ -184,7 +185,7 @@ return false; } - public ConstClass asConstClass() { + public DexConstClass asConstClass() { return null; } @@ -204,7 +205,7 @@ return false; } - public ConstStringJumbo asConstStringJumbo() { + public DexConstStringJumbo asConstStringJumbo() { return null; } @@ -216,7 +217,7 @@ return false; } - public InvokeVirtual asInvokeVirtual() { + public DexInvokeVirtual asInvokeVirtual() { return null; } @@ -224,12 +225,12 @@ return false; } - public InvokeVirtualRange asInvokeVirtualRange() { + public DexInvokeVirtualRange asInvokeVirtualRange() { return null; } public boolean isSimpleNop() { - return !isPayload() && this instanceof Nop; + return !isPayload() && this instanceof DexNop; } public boolean isPayload() { @@ -324,12 +325,12 @@ public abstract int hashCode(); @Override - public Instruction self() { + public DexInstruction self() { return this; } @Override - public StructuralMapping<Instruction> getStructuralMapping() { + public StructuralMapping<DexInstruction> getStructuralMapping() { throw new Unreachable(); } @@ -338,10 +339,10 @@ } // Abstract compare-to called only if the opcode/compare-id of the instruction matches. - abstract int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor); + abstract int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor); @Override - public final int acceptCompareTo(Instruction other, CompareToVisitor visitor) { + public final int acceptCompareTo(DexInstruction other, CompareToVisitor visitor) { int opcodeDiff = visitor.visitInt(getCompareToId(), other.getCompareToId()); if (opcodeDiff != 0) { return opcodeDiff; @@ -367,7 +368,7 @@ public abstract int getSize(); - public String toSmaliString(Instruction payloadUser) { + public String toSmaliString(DexInstruction payloadUser) { throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user"); } @@ -379,7 +380,7 @@ public abstract String toString(ClassNameMapper naming); - public String toString(ClassNameMapper naming, Instruction payloadUser) { + public String toString(ClassNameMapper naming, DexInstruction payloadUser) { throw new InternalCompilerError("Instruction " + payloadUser + " is not a payload user"); } @@ -396,12 +397,13 @@ LensCodeRewriterUtils rewriter); public abstract void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter); - public boolean equals(Instruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { + public boolean equals( + DexInstruction other, BiPredicate<IndexedDexItem, IndexedDexItem> equality) { // In the default case, there is nothing to substitute. return this.equals(other); }
diff --git a/src/main/java/com/android/tools/r8/code/InstructionFactory.java b/src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java similarity index 73% rename from src/main/java/com/android/tools/r8/code/InstructionFactory.java rename to src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java index 6b60f29..356535c 100644 --- a/src/main/java/com/android/tools/r8/code/InstructionFactory.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInstructionFactory.java
@@ -1,32 +1,31 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.OffsetToObjectMapping; import java.nio.ShortBuffer; import java.util.ArrayList; import java.util.List; -public class InstructionFactory extends BaseInstructionFactory { +public class DexInstructionFactory extends DexBaseInstructionFactory { - static private Instruction readFrom(ShortBufferBytecodeStream stream, - OffsetToObjectMapping mapping) { + private static DexInstruction readFrom( + ShortBufferBytecodeStream stream, OffsetToObjectMapping mapping) { int high = stream.nextByte(); int opcode = stream.nextByte(); return create(high, opcode, stream, mapping); } - public Instruction[] readSequenceFrom(ShortBuffer buffer, int startIndex, int length, - OffsetToObjectMapping mapping) { - ShortBufferBytecodeStream range = - new ShortBufferBytecodeStream(buffer, startIndex, length); - List<Instruction> insn = new ArrayList<>(length); + public DexInstruction[] readSequenceFrom( + ShortBuffer buffer, int startIndex, int length, OffsetToObjectMapping mapping) { + ShortBufferBytecodeStream range = new ShortBufferBytecodeStream(buffer, startIndex, length); + List<DexInstruction> insn = new ArrayList<>(length); while (range.hasMore()) { - Instruction instruction = readFrom(range, mapping); + DexInstruction instruction = readFrom(range, mapping); insn.add(instruction); } - return insn.toArray(Instruction.EMPTY_ARRAY); + return insn.toArray(DexInstruction.EMPTY_ARRAY); } private static class ShortBufferBytecodeStream implements BytecodeStream {
diff --git a/src/main/java/com/android/tools/r8/code/IntToByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IntToByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java index 2f6fde6..b2aefe3 100644 --- a/src/main/java/com/android/tools/r8/code/IntToByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToByte.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToByte extends Format12x { + +public class DexIntToByte extends DexFormat12x { public static final int OPCODE = 0x8d; public static final String NAME = "IntToByte"; public static final String SMALI_NAME = "int-to-byte"; - IntToByte(int high, BytecodeStream stream) { + DexIntToByte(int high, BytecodeStream stream) { super(high, stream); } - public IntToByte(int dest, int source) { + public DexIntToByte(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/IntToChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IntToChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java index 1994d77..a096373 100644 --- a/src/main/java/com/android/tools/r8/code/IntToChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToChar.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToChar extends Format12x { +public class DexIntToChar extends DexFormat12x { public static final int OPCODE = 0x8e; public static final String NAME = "IntToChar"; public static final String SMALI_NAME = "int-to-char"; - IntToChar(int high, BytecodeStream stream) { + DexIntToChar(int high, BytecodeStream stream) { super(high, stream); } - public IntToChar(int dest, int source) { + public DexIntToChar(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/IntToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IntToDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java index e7a3a51..f3b1c19 100644 --- a/src/main/java/com/android/tools/r8/code/IntToDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToDouble.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToDouble extends Format12x { +public class DexIntToDouble extends DexFormat12x { public static final int OPCODE = 0x83; public static final String NAME = "IntToDouble"; public static final String SMALI_NAME = "int-to-double"; - IntToDouble(int high, BytecodeStream stream) { + DexIntToDouble(int high, BytecodeStream stream) { super(high, stream); } - public IntToDouble(int dest, int source) { + public DexIntToDouble(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/IntToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IntToFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java index 5865d4d..9883869 100644 --- a/src/main/java/com/android/tools/r8/code/IntToFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToFloat.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToFloat extends Format12x { + +public class DexIntToFloat extends DexFormat12x { public static final int OPCODE = 0x82; public static final String NAME = "IntToFloat"; public static final String SMALI_NAME = "int-to-float"; - IntToFloat(int high, BytecodeStream stream) { + DexIntToFloat(int high, BytecodeStream stream) { super(high, stream); } - public IntToFloat(int dest, int source) { + public DexIntToFloat(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/IntToLong.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/IntToLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java index 5a3592e..8c319b1 100644 --- a/src/main/java/com/android/tools/r8/code/IntToLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToLong extends Format12x { +public class DexIntToLong extends DexFormat12x { public static final int OPCODE = 0x81; public static final String NAME = "IntToLong"; public static final String SMALI_NAME = "int-to-long"; - IntToLong(int high, BytecodeStream stream) { + DexIntToLong(int high, BytecodeStream stream) { super(high, stream); } - public IntToLong(int dest, int source) { + public DexIntToLong(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/IntToShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IntToShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java index 6fbdaaa..579cff4 100644 --- a/src/main/java/com/android/tools/r8/code/IntToShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIntToShort.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IntToShort extends Format12x { +public class DexIntToShort extends DexFormat12x { public static final int OPCODE = 0x8f; public static final String NAME = "IntToShort"; public static final String SMALI_NAME = "int-to-short"; - IntToShort(int high, BytecodeStream stream) { + DexIntToShort(int high, BytecodeStream stream) { super(high, stream); } - public IntToShort(int dest, int source) { + public DexIntToShort(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/InvokeCustom.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java index ea07822..605b420 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeCustom.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustom.java
@@ -1,9 +1,10 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,17 +15,17 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class InvokeCustom extends Format35c<DexCallSite> { +public class DexInvokeCustom extends DexFormat35c<DexCallSite> { public static final int OPCODE = 0xfc; public static final String NAME = "InvokeCustom"; public static final String SMALI_NAME = "invoke-custom"; - InvokeCustom(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeCustom(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getCallSiteMap()); } - public InvokeCustom(int A, DexCallSite BBBB, int C, int D, int E, int F, int G) { + public DexInvokeCustom(int A, DexCallSite BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @@ -45,12 +46,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexCallSite rewritten = rewriter.rewriteCallSite(getCallSite(), context); - rewritten.collectIndexedItems(indexedItems); + rewritten.collectIndexedItems(appView, indexedItems); } @Override @@ -65,7 +66,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeCustomRegisters(getCallSite(), A, new int[]{C, D, E, F, G}); + builder.addInvokeCustomRegisters(getCallSite(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeCustomRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/InvokeCustomRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java index c057c94..a88f338 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeCustomRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeCustomRange.java
@@ -1,9 +1,10 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,17 +15,17 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class InvokeCustomRange extends Format3rc<DexCallSite> { +public class DexInvokeCustomRange extends DexFormat3rc<DexCallSite> { public static final int OPCODE = 0xfd; public static final String NAME = "InvokeCustomRange"; public static final String SMALI_NAME = "invoke-custom/range"; - InvokeCustomRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeCustomRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getCallSiteMap()); } - public InvokeCustomRange(int firstArgumentRegister, int argumentCount, DexCallSite callSite) { + public DexInvokeCustomRange(int firstArgumentRegister, int argumentCount, DexCallSite callSite) { super(firstArgumentRegister, argumentCount, callSite); } @@ -45,12 +46,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexCallSite rewritten = rewriter.rewriteCallSite(getCallSite(), context); - rewritten.collectIndexedItems(indexedItems); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/InvokeDirect.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java index 4f5938f..b918754 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeDirect.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirect.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeDirect extends InvokeMethod { +public class DexInvokeDirect extends DexInvokeMethod { public static final int OPCODE = 0x70; public static final String NAME = "InvokeDirect"; public static final String SMALI_NAME = "invoke-direct"; - InvokeDirect(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeDirect(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeDirect(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + public DexInvokeDirect(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @@ -50,7 +50,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeRegisters(Type.DIRECT, getMethod(), getProto(), A, new int[]{C, D, E, F, G}); + builder.addInvokeRegisters(Type.DIRECT, getMethod(), getProto(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeDirectRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/InvokeDirectRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java index 6f232c0..9134e4a 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeDirectRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeDirectRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeDirectRange extends InvokeMethodRange { +public class DexInvokeDirectRange extends DexInvokeMethodRange { public static final int OPCODE = 0x76; public static final String NAME = "InvokeDirectRange"; public static final String SMALI_NAME = "invoke-direct/range"; - InvokeDirectRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeDirectRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeDirectRange(int firstArgumentRegister, int argumentCount, DexMethod method) { + public DexInvokeDirectRange(int firstArgumentRegister, int argumentCount, DexMethod method) { super(firstArgumentRegister, argumentCount, method); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/InvokeInterface.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java index 2e20c9c..d7a64be 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeInterface.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterface.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeInterface extends InvokeMethod { +public class DexInvokeInterface extends DexInvokeMethod { public static final int OPCODE = 0x72; public static final String NAME = "InvokeInterface"; public static final String SMALI_NAME = "invoke-interface"; - InvokeInterface(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeInterface(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeInterface(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + public DexInvokeInterface(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java index 7592e3d..b8dfc7b 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeInterfaceRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeInterfaceRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeInterfaceRange extends InvokeMethodRange { +public class DexInvokeInterfaceRange extends DexInvokeMethodRange { public static final int OPCODE = 0x78; public static final String NAME = "InvokeInterfaceRange"; public static final String SMALI_NAME = "invoke-interface/range"; - InvokeInterfaceRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeInterfaceRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeInterfaceRange(int firstArgumentRegister, int argumentCount, DexMethod method) { + public DexInvokeInterfaceRange(int firstArgumentRegister, int argumentCount, DexMethod method) { super(firstArgumentRegister, argumentCount, method); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeMethod.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java similarity index 74% rename from src/main/java/com/android/tools/r8/code/InvokeMethod.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java index 9e5d8f2..9340e4a 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeMethod.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethod.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.GraphLens.MethodLookupResult; @@ -13,25 +14,28 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public abstract class InvokeMethod extends Format35c<DexMethod> { +public abstract class DexInvokeMethod extends DexFormat35c<DexMethod> { - InvokeMethod(int high, BytecodeStream stream, DexMethod[] map) { + DexInvokeMethod(int high, BytecodeStream stream, DexMethod[] map) { super(high, stream, map); } - InvokeMethod(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + DexInvokeMethod(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @Override public final void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexMethod rewritten = - graphLens.lookupMethod(getMethod(), context.getReference(), getInvokeType()).getReference(); - rewritten.collectIndexedItems(indexedItems); + appView + .graphLens() + .lookupMethod(getMethod(), context.getReference(), getInvokeType()) + .getReference(); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeMethodRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java similarity index 73% rename from src/main/java/com/android/tools/r8/code/InvokeMethodRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java index ba248e0..34243ac 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeMethodRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeMethodRange.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.GraphLens.MethodLookupResult; @@ -13,25 +14,28 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public abstract class InvokeMethodRange extends Format3rc<DexMethod> { +public abstract class DexInvokeMethodRange extends DexFormat3rc<DexMethod> { - InvokeMethodRange(int high, BytecodeStream stream, DexMethod[] map) { + DexInvokeMethodRange(int high, BytecodeStream stream, DexMethod[] map) { super(high, stream, map); } - InvokeMethodRange(int firstArgumentRegister, int argumentCount, DexMethod dexItem) { + DexInvokeMethodRange(int firstArgumentRegister, int argumentCount, DexMethod dexItem) { super(firstArgumentRegister, argumentCount, dexItem); } @Override public final void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { DexMethod rewritten = - graphLens.lookupMethod(getMethod(), context.getReference(), getInvokeType()).getReference(); - rewritten.collectIndexedItems(indexedItems); + appView + .graphLens() + .lookupMethod(getMethod(), context.getReference(), getInvokeType()) + .getReference(); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/InvokePolymorphic.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java index d5ecd11..72678f0 100644 --- a/src/main/java/com/android/tools/r8/code/InvokePolymorphic.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphic.java
@@ -1,7 +1,7 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProto; @@ -13,17 +13,17 @@ * An invoke-polymorphic instruction used to invoke a method in a MethodHandle using either * MethodHandle.invoke or MethodHandle.invokeExact. */ -public class InvokePolymorphic extends Format45cc { +public class DexInvokePolymorphic extends DexFormat45cc { public static final int OPCODE = 0xfa; public static final String NAME = "InvokePolymorphic"; public static final String SMALI_NAME = "invoke-polymorphic"; - InvokePolymorphic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokePolymorphic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap(), mapping.getProtosMap()); } - public InvokePolymorphic( + public DexInvokePolymorphic( int A, DexMethod BBBB, DexProto HHHH, int C, int D, int E, int F, int G) { super(A, BBBB, HHHH, C, D, E, F, G); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java similarity index 87% rename from src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java index 07cf3a0..186952b 100644 --- a/src/main/java/com/android/tools/r8/code/InvokePolymorphicRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokePolymorphicRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2017, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexProto; @@ -11,17 +11,17 @@ import com.android.tools.r8.ir.conversion.IRBuilder; /** An invoke-polymorphic range instruction used to call method with polymorphic signature. */ -public class InvokePolymorphicRange extends Format4rcc { +public class DexInvokePolymorphicRange extends DexFormat4rcc { public static final int OPCODE = 0xfb; public static final String NAME = "InvokePolymorphicRange"; public static final String SMALI_NAME = "invoke-polymorphic/range"; - InvokePolymorphicRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokePolymorphicRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap(), mapping.getProtosMap()); } - public InvokePolymorphicRange( + public DexInvokePolymorphicRange( int firstArgumentRegister, int argumentCount, DexMethod method, DexProto proto) { super(firstArgumentRegister, argumentCount, method, proto); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/InvokeStatic.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java index fb198e4..b645556 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeStatic.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStatic.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeStatic extends InvokeMethod { +public class DexInvokeStatic extends DexInvokeMethod { public static final int OPCODE = 0x71; public static final String NAME = "InvokeStatic"; public static final String SMALI_NAME = "invoke-static"; - InvokeStatic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeStatic(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeStatic(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + public DexInvokeStatic(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @@ -50,7 +50,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeRegisters(Type.STATIC, getMethod(), getProto(), A, new int[]{C, D, E, F, G}); + builder.addInvokeRegisters(Type.STATIC, getMethod(), getProto(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeStaticRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/InvokeStaticRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java index de84a90..512632f 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeStaticRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeStaticRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeStaticRange extends InvokeMethodRange { +public class DexInvokeStaticRange extends DexInvokeMethodRange { public static final int OPCODE = 0x77; public static final String NAME = "InvokeStaticRange"; public static final String SMALI_NAME = "invoke-static/range"; - InvokeStaticRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeStaticRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeStaticRange(int firstArgumentRegister, int argumentCount, DexMethod method) { + public DexInvokeStaticRange(int firstArgumentRegister, int argumentCount, DexMethod method) { super(firstArgumentRegister, argumentCount, method); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/InvokeSuper.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java index 24ab80e..3be61ac 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeSuper.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuper.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeSuper extends InvokeMethod { +public class DexInvokeSuper extends DexInvokeMethod { public static final int OPCODE = 0x6f; public static final String NAME = "InvokeSuper"; public static final String SMALI_NAME = "invoke-super"; - InvokeSuper(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeSuper(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeSuper(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + public DexInvokeSuper(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @@ -50,7 +50,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeRegisters(Type.SUPER, getMethod(), getProto(), A, new int[]{C, D, E, F, G}); + builder.addInvokeRegisters(Type.SUPER, getMethod(), getProto(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeSuperRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/InvokeSuperRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java index ac820c9..206e74f 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeSuperRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeSuperRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeSuperRange extends InvokeMethodRange { +public class DexInvokeSuperRange extends DexInvokeMethodRange { public static final int OPCODE = 0x75; public static final String NAME = "InvokeSuperRange"; public static final String SMALI_NAME = "invoke-super/range"; - InvokeSuperRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeSuperRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeSuperRange(int firstArgumentRegister, int argumentCount, DexMethod method) { + public DexInvokeSuperRange(int firstArgumentRegister, int argumentCount, DexMethod method) { super(firstArgumentRegister, argumentCount, method); }
diff --git a/src/main/java/com/android/tools/r8/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/InvokeVirtual.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java index 27e37c5..f1704e5 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeVirtual.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtual.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeVirtual extends InvokeMethod { +public class DexInvokeVirtual extends DexInvokeMethod { public static final int OPCODE = 0x6e; public static final String NAME = "InvokeVirtual"; public static final String SMALI_NAME = "invoke-virtual"; - InvokeVirtual(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeVirtual(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeVirtual(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { + public DexInvokeVirtual(int A, DexMethod BBBB, int C, int D, int E, int F, int G) { super(A, BBBB, C, D, E, F, G); } @@ -49,7 +49,7 @@ } @Override - public InvokeVirtual asInvokeVirtual() { + public DexInvokeVirtual asInvokeVirtual() { return this; } @@ -60,7 +60,7 @@ @Override public void buildIR(IRBuilder builder) { - builder.addInvokeRegisters(Type.VIRTUAL, getMethod(), getProto(), A, new int[]{C, D, E, F, G}); + builder.addInvokeRegisters(Type.VIRTUAL, getMethod(), getProto(), A, new int[] {C, D, E, F, G}); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java rename to src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java index e93733f..97a87f8 100644 --- a/src/main/java/com/android/tools/r8/code/InvokeVirtualRange.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexInvokeVirtualRange.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.OffsetToObjectMapping; @@ -9,17 +9,17 @@ import com.android.tools.r8.ir.code.Invoke.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class InvokeVirtualRange extends InvokeMethodRange { +public class DexInvokeVirtualRange extends DexInvokeMethodRange { public static final int OPCODE = 0x74; public static final String NAME = "InvokeVirtualRange"; public static final String SMALI_NAME = "invoke-virtual/range"; - InvokeVirtualRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexInvokeVirtualRange(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getMethodMap()); } - public InvokeVirtualRange(int firstArgumentRegister, int argumentCount, DexMethod method) { + public DexInvokeVirtualRange(int firstArgumentRegister, int argumentCount, DexMethod method) { super(firstArgumentRegister, argumentCount, method); } @@ -49,7 +49,7 @@ } @Override - public InvokeVirtualRange asInvokeVirtualRange() { + public DexInvokeVirtualRange asInvokeVirtualRange() { return this; }
diff --git a/src/main/java/com/android/tools/r8/code/Iput.java b/src/main/java/com/android/tools/r8/dex/code/DexIput.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Iput.java rename to src/main/java/com/android/tools/r8/dex/code/DexIput.java index 76f90af..1a1cea9 100644 --- a/src/main/java/com/android/tools/r8/code/Iput.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIput.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Iput extends IgetOrIput { +public class DexIput extends DexIgetOrIput { public static final int OPCODE = 0x59; public static final String NAME = "Iput"; public static final String SMALI_NAME = "iput"; - /*package*/ Iput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public Iput(int valueRegister, int objectRegister, DexField field) { + public DexIput(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java index 634657d..501d0e4 100644 --- a/src/main/java/com/android/tools/r8/code/IputBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputBoolean.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputBoolean extends IgetOrIput { +public class DexIputBoolean extends DexIgetOrIput { public static final int OPCODE = 0x5c; public static final String NAME = "IputBoolean"; public static final String SMALI_NAME = "iput-boolean"; - /*package*/ IputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputBoolean(int valueRegister, int objectRegister, DexField field) { + public DexIputBoolean(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexIputByte.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputByte.java index b579bec..2d5fec3 100644 --- a/src/main/java/com/android/tools/r8/code/IputByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputByte.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputByte extends IgetOrIput { +public class DexIputByte extends DexIgetOrIput { public static final int OPCODE = 0x5d; public static final String NAME = "IputByte"; public static final String SMALI_NAME = "iput-byte"; - /*package*/ IputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputByte(int valueRegister, int objectRegister, DexField field) { + public DexIputByte(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexIputChar.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputChar.java index 1b0d42d..bf96679 100644 --- a/src/main/java/com/android/tools/r8/code/IputChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputChar.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputChar extends IgetOrIput { +public class DexIputChar extends DexIgetOrIput { public static final int OPCODE = 0x5e; public static final String NAME = "IputChar"; public static final String SMALI_NAME = "iput-char"; - /*package*/ IputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputChar(int valueRegister, int objectRegister, DexField field) { + public DexIputChar(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexIputObject.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputObject.java index 816f81f..3052fec 100644 --- a/src/main/java/com/android/tools/r8/code/IputObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputObject.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputObject extends IgetOrIput { +public class DexIputObject extends DexIgetOrIput { public static final int OPCODE = 0x5b; public static final String NAME = "IputObject"; public static final String SMALI_NAME = "iput-object"; - /*package*/ IputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputObject(int valueRegister, int objectRegister, DexField field) { + public DexIputObject(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexIputShort.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputShort.java index dfa9ff7..d6d32a3 100644 --- a/src/main/java/com/android/tools/r8/code/IputShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputShort.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputShort extends IgetOrIput { +public class DexIputShort extends DexIgetOrIput { public static final int OPCODE = 0x5f; public static final String NAME = "IputShort"; public static final String SMALI_NAME = "iput-short"; - /*package*/ IputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputShort(int valueRegister, int objectRegister, DexField field) { + public DexIputShort(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/IputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexIputWide.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/IputWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexIputWide.java index 261dc26..2f70828 100644 --- a/src/main/java/com/android/tools/r8/code/IputWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexIputWide.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class IputWide extends IgetOrIput { +public class DexIputWide extends DexIgetOrIput { public static final int OPCODE = 0x5a; public static final String NAME = "IputWide"; public static final String SMALI_NAME = "iput-wide"; - /*package*/ IputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexIputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public IputWide(int valueRegister, int objectRegister, DexField field) { + public DexIputWide(int valueRegister, int objectRegister, DexField field) { super(valueRegister, objectRegister, field); }
diff --git a/src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java similarity index 90% rename from src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java rename to src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java index 70e9c4f..d34a783 100644 --- a/src/main/java/com/android/tools/r8/code/DexItemBasedConstString.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexItemBasedConstString.java
@@ -1,10 +1,11 @@ // Copyright (c) 2018, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexReference; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -17,7 +18,7 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class DexItemBasedConstString extends Format21c<DexReference> { +public class DexItemBasedConstString extends DexFormat21c<DexReference> { public static final String NAME = "DexItemBasedConstString"; public static final String SMALI_NAME = "const-string*"; @@ -40,11 +41,11 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - getItem().collectIndexedItems(indexedItems); + getItem().collectIndexedItems(appView, indexedItems); } @Override @@ -69,7 +70,7 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexReference>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexReference>, ?> spec) { spec.withDexReference(i -> i.BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/LongToDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/LongToDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java index f2ac125..224b047 100644 --- a/src/main/java/com/android/tools/r8/code/LongToDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToDouble.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class LongToDouble extends Format12x { + +public class DexLongToDouble extends DexFormat12x { public static final int OPCODE = 0x86; public static final String NAME = "LongToDouble"; public static final String SMALI_NAME = "long-to-double"; - LongToDouble(int high, BytecodeStream stream) { + DexLongToDouble(int high, BytecodeStream stream) { super(high, stream); } - public LongToDouble(int dest, int source) { + public DexLongToDouble(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/LongToFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/LongToFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java index ead1ee2..ddec7bf 100644 --- a/src/main/java/com/android/tools/r8/code/LongToFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToFloat.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class LongToFloat extends Format12x { + +public class DexLongToFloat extends DexFormat12x { public static final int OPCODE = 0x85; public static final String NAME = "LongToFloat"; public static final String SMALI_NAME = "long-to-float"; - LongToFloat(int high, BytecodeStream stream) { + DexLongToFloat(int high, BytecodeStream stream) { super(high, stream); } - public LongToFloat(int dest, int source) { + public DexLongToFloat(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/LongToInt.java b/src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/LongToInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java index bbb10b6..4d912a4 100644 --- a/src/main/java/com/android/tools/r8/code/LongToInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexLongToInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class LongToInt extends Format12x { +public class DexLongToInt extends DexFormat12x { public static final int OPCODE = 0x84; public static final String NAME = "LongToInt"; public static final String SMALI_NAME = "long-to-int"; - LongToInt(int high, BytecodeStream stream) { + DexLongToInt(int high, BytecodeStream stream) { super(high, stream); } - public LongToInt(int dest, int source) { + public DexLongToInt(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/MonitorEnter.java b/src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/MonitorEnter.java rename to src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java index 17c9852..620c557 100644 --- a/src/main/java/com/android/tools/r8/code/MonitorEnter.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMonitorEnter.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Monitor.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MonitorEnter extends Format11x { + +public class DexMonitorEnter extends DexFormat11x { public static final int OPCODE = 0x1d; public static final String NAME = "MonitorEnter"; public static final String SMALI_NAME = "monitor-enter"; - MonitorEnter(int high, BytecodeStream stream) { + DexMonitorEnter(int high, BytecodeStream stream) { super(high, stream); } - public MonitorEnter(int register) { + public DexMonitorEnter(int register) { super(register); }
diff --git a/src/main/java/com/android/tools/r8/code/MonitorExit.java b/src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/MonitorExit.java rename to src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java index 7725ca0..d001e32 100644 --- a/src/main/java/com/android/tools/r8/code/MonitorExit.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMonitorExit.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.Monitor.Type; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MonitorExit extends Format11x { + +public class DexMonitorExit extends DexFormat11x { public static final int OPCODE = 0x1e; public static final String NAME = "MonitorExit"; public static final String SMALI_NAME = "monitor-exit"; - MonitorExit(int high, BytecodeStream stream) { + DexMonitorExit(int high, BytecodeStream stream) { super(high, stream); } - public MonitorExit(int register) { + public DexMonitorExit(int register) { super(register); }
diff --git a/src/main/java/com/android/tools/r8/code/Move.java b/src/main/java/com/android/tools/r8/dex/code/DexMove.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/Move.java rename to src/main/java/com/android/tools/r8/dex/code/DexMove.java index 3e750a6..5c45e0c 100644 --- a/src/main/java/com/android/tools/r8/code/Move.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMove.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Move extends Format12x { +public class DexMove extends DexFormat12x { public static final int OPCODE = 0x1; public static final String NAME = "Move"; public static final String SMALI_NAME = "move"; - Move(int high, BytecodeStream stream) { + DexMove(int high, BytecodeStream stream) { super(high, stream); } - public Move(int dest, int src) { + public DexMove(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/Move16.java b/src/main/java/com/android/tools/r8/dex/code/DexMove16.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Move16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMove16.java index 64a0f7c..a003bc3 100644 --- a/src/main/java/com/android/tools/r8/code/Move16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMove16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Move16 extends Format32x { +public class DexMove16 extends DexFormat32x { public static final int OPCODE = 0x3; public static final String NAME = "Move16"; public static final String SMALI_NAME = "move/16"; - Move16(int high, BytecodeStream stream) { + DexMove16(int high, BytecodeStream stream) { super(high, stream); } - public Move16(int dest, int src) { + public DexMove16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveException.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveException.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MoveException.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveException.java index ca79a0c..1f3888e 100644 --- a/src/main/java/com/android/tools/r8/code/MoveException.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveException.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveException extends Format11x { +public class DexMoveException extends DexFormat11x { public static final int OPCODE = 0xd; public static final String NAME = "MoveException"; public static final String SMALI_NAME = "move-exception"; - MoveException(int high, BytecodeStream stream) { + DexMoveException(int high, BytecodeStream stream) { super(high, stream); } - public MoveException(int AA) { + public DexMoveException(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/MoveFrom16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java index 51b456e..48f9fa8 100644 --- a/src/main/java/com/android/tools/r8/code/MoveFrom16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveFrom16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveFrom16 extends Format22x { +public class DexMoveFrom16 extends DexFormat22x { public static final int OPCODE = 0x2; public static final String NAME = "MoveFrom16"; public static final String SMALI_NAME = "move-from/16"; - MoveFrom16(int high, BytecodeStream stream) { + DexMoveFrom16(int high, BytecodeStream stream) { super(high, stream); } - public MoveFrom16(int dest, int src) { + public DexMoveFrom16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/MoveObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java index a308ab1..22ee41c 100644 --- a/src/main/java/com/android/tools/r8/code/MoveObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveObject extends Format12x { +public class DexMoveObject extends DexFormat12x { public static final int OPCODE = 0x7; public static final String NAME = "MoveObject"; public static final String SMALI_NAME = "move-object"; - MoveObject(int high, BytecodeStream stream) { + DexMoveObject(int high, BytecodeStream stream) { super(high, stream); } - public MoveObject(int dest, int src) { + public DexMoveObject(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObject16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/MoveObject16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java index a7eb12c..3598213 100644 --- a/src/main/java/com/android/tools/r8/code/MoveObject16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObject16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveObject16 extends Format32x { +public class DexMoveObject16 extends DexFormat32x { public static final int OPCODE = 0x9; public static final String NAME = "MoveObject16"; public static final String SMALI_NAME = "move-object/16"; - MoveObject16(int high, BytecodeStream stream) { + DexMoveObject16(int high, BytecodeStream stream) { super(high, stream); } - public MoveObject16(int dest, int src) { + public DexMoveObject16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java index 8b32125..4016567 100644 --- a/src/main/java/com/android/tools/r8/code/MoveObjectFrom16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveObjectFrom16.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveObjectFrom16 extends Format22x { + +public class DexMoveObjectFrom16 extends DexFormat22x { public static final int OPCODE = 0x8; public static final String NAME = "MoveObjectFrom16"; public static final String SMALI_NAME = "move-object-from/16"; - MoveObjectFrom16(int high, BytecodeStream stream) { + DexMoveObjectFrom16(int high, BytecodeStream stream) { super(high, stream); } - public MoveObjectFrom16(int dest, int src) { + public DexMoveObjectFrom16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResult.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MoveResult.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java index cd9eb78..caa3883 100644 --- a/src/main/java/com/android/tools/r8/code/MoveResult.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResult.java
@@ -1,20 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveResult extends Format11x { + +public class DexMoveResult extends DexFormat11x { public static final int OPCODE = 0xa; public static final String NAME = "MoveResult"; public static final String SMALI_NAME = "move-result"; - /*package*/ MoveResult(int high, BytecodeStream stream) { + /*package*/ DexMoveResult(int high, BytecodeStream stream) { super(high, stream); } - public MoveResult(int AA) { + public DexMoveResult(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultObject.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java similarity index 78% rename from src/main/java/com/android/tools/r8/code/MoveResultObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java index 3210b71..d5248c7 100644 --- a/src/main/java/com/android/tools/r8/code/MoveResultObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultObject.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveResultObject extends Format11x { +public class DexMoveResultObject extends DexFormat11x { public static final int OPCODE = 0xc; public static final String NAME = "MoveResultObject"; public static final String SMALI_NAME = "move-result-object"; - /*package*/ MoveResultObject(int high, BytecodeStream stream) { + /*package*/ DexMoveResultObject(int high, BytecodeStream stream) { super(high, stream); } - public MoveResultObject(int AA) { + public DexMoveResultObject(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveResultWide.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java similarity index 79% rename from src/main/java/com/android/tools/r8/code/MoveResultWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java index 95b4350..6bff9b6 100644 --- a/src/main/java/com/android/tools/r8/code/MoveResultWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveResultWide.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveResultWide extends Format11x { +public class DexMoveResultWide extends DexFormat11x { public static final int OPCODE = 0xb; public static final String NAME = "MoveResultWide"; public static final String SMALI_NAME = "move-result-wide"; - /*package*/ MoveResultWide(int high, BytecodeStream stream) { + /*package*/ DexMoveResultWide(int high, BytecodeStream stream) { super(high, stream); } - public MoveResultWide(int AA) { + public DexMoveResultWide(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/MoveWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java index 06d44a2..88fe616 100644 --- a/src/main/java/com/android/tools/r8/code/MoveWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveWide extends Format12x { +public class DexMoveWide extends DexFormat12x { public static final int OPCODE = 0x4; public static final String NAME = "MoveWide"; public static final String SMALI_NAME = "move-wide"; - MoveWide(int high, BytecodeStream stream) { + DexMoveWide(int high, BytecodeStream stream) { super(high, stream); } - public MoveWide(int dest, int src) { + public DexMoveWide(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveWide16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/MoveWide16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java index 66fe3fd..fd80875 100644 --- a/src/main/java/com/android/tools/r8/code/MoveWide16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWide16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveWide16 extends Format32x { +public class DexMoveWide16 extends DexFormat32x { public static final int OPCODE = 0x6; public static final String NAME = "MoveWide16"; public static final String SMALI_NAME = "move-wide/16"; - MoveWide16(int high, BytecodeStream stream) { + DexMoveWide16(int high, BytecodeStream stream) { super(high, stream); } - public MoveWide16(int dest, int src) { + public DexMoveWide16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java b/src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/MoveWideFrom16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java index 45c3840..a3c4f6d 100644 --- a/src/main/java/com/android/tools/r8/code/MoveWideFrom16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMoveWideFrom16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.ValueTypeConstraint; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MoveWideFrom16 extends Format22x { +public class DexMoveWideFrom16 extends DexFormat22x { public static final int OPCODE = 0x5; public static final String NAME = "MoveWideFrom16"; public static final String SMALI_NAME = "move-wide-from/16"; - MoveWideFrom16(int high, BytecodeStream stream) { + DexMoveWideFrom16(int high, BytecodeStream stream) { super(high, stream); } - public MoveWideFrom16(int dest, int src) { + public DexMoveWideFrom16(int dest, int src) { super(dest, src); }
diff --git a/src/main/java/com/android/tools/r8/code/MulDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/MulDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java index 5c3f9df..1f195a0 100644 --- a/src/main/java/com/android/tools/r8/code/MulDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulDouble extends Format23x { +public class DexMulDouble extends DexFormat23x { public static final int OPCODE = 0xad; public static final String NAME = "MulDouble"; public static final String SMALI_NAME = "mul-double"; - MulDouble(int high, BytecodeStream stream) { + DexMulDouble(int high, BytecodeStream stream) { super(high, stream); } - public MulDouble(int dest, int left, int right) { + public DexMulDouble(int dest, int left, int right) { super(dest, left, right); // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MulDouble2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java index 347ef3a..8290b14 100644 --- a/src/main/java/com/android/tools/r8/code/MulDouble2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulDouble2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulDouble2Addr extends Format12x { +public class DexMulDouble2Addr extends DexFormat12x { public static final int OPCODE = 0xcd; public static final String NAME = "MulDouble2Addr"; public static final String SMALI_NAME = "mul-double/2addr"; - MulDouble2Addr(int high, BytecodeStream stream) { + DexMulDouble2Addr(int high, BytecodeStream stream) { super(high, stream); } - public MulDouble2Addr(int left, int right) { + public DexMulDouble2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/MulFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/MulFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java index 1792264..7155e5e 100644 --- a/src/main/java/com/android/tools/r8/code/MulFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulFloat extends Format23x { +public class DexMulFloat extends DexFormat23x { public static final int OPCODE = 0xa8; public static final String NAME = "MulFloat"; public static final String SMALI_NAME = "mul-float"; - MulFloat(int high, BytecodeStream stream) { + DexMulFloat(int high, BytecodeStream stream) { super(high, stream); } - public MulFloat(int dest, int left, int right) { + public DexMulFloat(int dest, int left, int right) { super(dest, left, right); // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MulFloat2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java index 1e56be6..0147cac 100644 --- a/src/main/java/com/android/tools/r8/code/MulFloat2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulFloat2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulFloat2Addr extends Format12x { +public class DexMulFloat2Addr extends DexFormat12x { public static final int OPCODE = 0xc8; public static final String NAME = "MulFloat2Addr"; public static final String SMALI_NAME = "mul-float/2addr"; - MulFloat2Addr(int high, BytecodeStream stream) { + DexMulFloat2Addr(int high, BytecodeStream stream) { super(high, stream); } - public MulFloat2Addr(int left, int right) { + public DexMulFloat2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/MulInt.java b/src/main/java/com/android/tools/r8/dex/code/DexMulInt.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/MulInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulInt.java index 2513ab9..12c5ed9 100644 --- a/src/main/java/com/android/tools/r8/code/MulInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulInt.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulInt extends Format23x { + +public class DexMulInt extends DexFormat23x { public static final int OPCODE = 0x92; public static final String NAME = "MulInt"; public static final String SMALI_NAME = "mul-int"; - MulInt(int high, BytecodeStream stream) { + DexMulInt(int high, BytecodeStream stream) { super(high, stream); } - public MulInt(int dest, int left, int right) { + public DexMulInt(int dest, int left, int right) { super(dest, left, right); // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/MulInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java index e65146a..d0fda45 100644 --- a/src/main/java/com/android/tools/r8/code/MulInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulInt2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulInt2Addr extends Format12x { + +public class DexMulInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb2; public static final String NAME = "MulInt2Addr"; public static final String SMALI_NAME = "mul-int/2addr"; - MulInt2Addr(int high, BytecodeStream stream) { + DexMulInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public MulInt2Addr(int left, int right) { + public DexMulInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/MulIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MulIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java index efa2cfb..ba7acd0 100644 --- a/src/main/java/com/android/tools/r8/code/MulIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulIntLit16 extends Format22s { +public class DexMulIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd2; public static final String NAME = "MulIntLit16"; public static final String SMALI_NAME = "mul-int/lit16"; - MulIntLit16(int high, BytecodeStream stream) { + DexMulIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public MulIntLit16(int dest, int register, int constant) { + public DexMulIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/MulIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/MulIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java index 0de1c6f..0173322 100644 --- a/src/main/java/com/android/tools/r8/code/MulIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulIntLit8 extends Format22b { +public class DexMulIntLit8 extends DexFormat22b { public static final int OPCODE = 0xda; public static final String NAME = "MulIntLit8"; public static final String SMALI_NAME = "mul-int/lit8"; - MulIntLit8(int high, BytecodeStream stream) { + DexMulIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public MulIntLit8(int dest, int register, int constant) { + public DexMulIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/MulLong.java b/src/main/java/com/android/tools/r8/dex/code/DexMulLong.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/MulLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulLong.java index 486b4d6..d545bec 100644 --- a/src/main/java/com/android/tools/r8/code/MulLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulLong extends Format23x { +public class DexMulLong extends DexFormat23x { public static final int OPCODE = 0x9d; public static final String NAME = "MulLong"; public static final String SMALI_NAME = "mul-long"; - MulLong(int high, BytecodeStream stream) { + DexMulLong(int high, BytecodeStream stream) { super(high, stream); } - public MulLong(int dest, int left, int right) { + public DexMulLong(int dest, int left, int right) { super(dest, left, right); // The art x86 backend had a bug that made it fail on "mul r0, r1, r0" instructions where // the second src register and the dst register is the same (but the first src register is
diff --git a/src/main/java/com/android/tools/r8/code/MulLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/MulLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java index 2cd78f6..ae0c5cf 100644 --- a/src/main/java/com/android/tools/r8/code/MulLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexMulLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class MulLong2Addr extends Format12x { +public class DexMulLong2Addr extends DexFormat12x { public static final int OPCODE = 0xbd; public static final String NAME = "MulLong2Addr"; public static final String SMALI_NAME = "mul-long/2addr"; - MulLong2Addr(int high, BytecodeStream stream) { + DexMulLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public MulLong2Addr(int left, int right) { + public DexMulLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/NegDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/NegDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java index bd054aa..64c6dcd 100644 --- a/src/main/java/com/android/tools/r8/code/NegDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNegDouble.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NegDouble extends Format12x { + +public class DexNegDouble extends DexFormat12x { public static final int OPCODE = 0x80; public static final String NAME = "NegDouble"; public static final String SMALI_NAME = "neg-double"; - /*package*/ NegDouble(int high, BytecodeStream stream) { + /*package*/ DexNegDouble(int high, BytecodeStream stream) { super(high, stream); } - public NegDouble(int dest, int source) { + public DexNegDouble(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/NegFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/NegFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java index 54d3053..58d214c 100644 --- a/src/main/java/com/android/tools/r8/code/NegFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNegFloat.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NegFloat extends Format12x { +public class DexNegFloat extends DexFormat12x { public static final int OPCODE = 0x7f; public static final String NAME = "NegFloat"; public static final String SMALI_NAME = "neg-float"; - /*package*/ NegFloat(int high, BytecodeStream stream) { + /*package*/ DexNegFloat(int high, BytecodeStream stream) { super(high, stream); } - public NegFloat(int dest, int source) { + public DexNegFloat(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/NegInt.java b/src/main/java/com/android/tools/r8/dex/code/DexNegInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/NegInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexNegInt.java index 82e7b86..fda8099 100644 --- a/src/main/java/com/android/tools/r8/code/NegInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNegInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NegInt extends Format12x { +public class DexNegInt extends DexFormat12x { public static final int OPCODE = 0x7b; public static final String NAME = "NegInt"; public static final String SMALI_NAME = "neg-int"; - /*package*/ NegInt(int high, BytecodeStream stream) { + /*package*/ DexNegInt(int high, BytecodeStream stream) { super(high, stream); } - public NegInt(int dest, int source) { + public DexNegInt(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/NegLong.java b/src/main/java/com/android/tools/r8/dex/code/DexNegLong.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/NegLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexNegLong.java index 3b2a304..43a8780 100644 --- a/src/main/java/com/android/tools/r8/code/NegLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNegLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NegLong extends Format12x { + +public class DexNegLong extends DexFormat12x { public static final int OPCODE = 0x7d; public static final String NAME = "NegLong"; public static final String SMALI_NAME = "neg-long"; - /*package*/ NegLong(int high, BytecodeStream stream) { + /*package*/ DexNegLong(int high, BytecodeStream stream) { super(high, stream); } - public NegLong(int dest, int source) { + public DexNegLong(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/NewArray.java b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/NewArray.java rename to src/main/java/com/android/tools/r8/dex/code/DexNewArray.java index 35b3187..8d35555 100644 --- a/src/main/java/com/android/tools/r8/code/NewArray.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNewArray.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,17 +15,17 @@ import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; import java.nio.ShortBuffer; -public class NewArray extends Format22c<DexType> { +public class DexNewArray extends DexFormat22c<DexType> { public static final int OPCODE = 0x23; public static final String NAME = "NewArray"; public static final String SMALI_NAME = "new-array"; - /*package*/ NewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexNewArray(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); } - public NewArray(int dest, int size, DexType type) { + public DexNewArray(int dest, int size, DexType type) { super(dest, size, type); } @@ -45,12 +46,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/NewInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/NewInstance.java rename to src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java index 1aed86e..4382e71 100644 --- a/src/main/java/com/android/tools/r8/code/NewInstance.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNewInstance.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -15,17 +16,17 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -public class NewInstance extends Format21c<DexType> { +public class DexNewInstance extends DexFormat21c<DexType> { public static final int OPCODE = 0x22; public static final String NAME = "NewInstance"; public static final String SMALI_NAME = "new-instance"; - NewInstance(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexNewInstance(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getTypeMap()); } - public NewInstance(int AA, DexType BBBB) { + public DexNewInstance(int AA, DexType BBBB) { super(AA, BBBB); } @@ -45,18 +46,18 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) { spec.withItem(i -> i.BBBB); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexType rewritten = graphLens.lookupType(getType()); - rewritten.collectIndexedItems(indexedItems); + DexType rewritten = appView.graphLens().lookupType(getType()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java similarity index 89% rename from src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java rename to src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java index 9909ac6..387952c 100644 --- a/src/main/java/com/android/tools/r8/code/DexNewUnboxedEnumInstance.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNewUnboxedEnumInstance.java
@@ -1,10 +1,11 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -16,7 +17,7 @@ import java.nio.ShortBuffer; /** The dex representation of {@link com.android.tools.r8.ir.code.NewUnboxedEnumInstance}. */ -public class DexNewUnboxedEnumInstance extends Format21c<DexType> { +public class DexNewUnboxedEnumInstance extends DexFormat21c<DexType> { public static final int OPCODE = 0x22; public static final String NAME = "NewUnboxedEnumInstance"; @@ -45,15 +46,15 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexType>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexType>, ?> spec) { spec.withItem(i -> i.BBBB); } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { throw new Unreachable(); }
diff --git a/src/main/java/com/android/tools/r8/code/Nop.java b/src/main/java/com/android/tools/r8/dex/code/DexNop.java similarity index 71% rename from src/main/java/com/android/tools/r8/code/Nop.java rename to src/main/java/com/android/tools/r8/dex/code/DexNop.java index 1e46cfc..f25e0ec 100644 --- a/src/main/java/com/android/tools/r8/code/Nop.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNop.java
@@ -1,40 +1,39 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.utils.structural.CompareToVisitor; -public class Nop extends Format10x { +public class DexNop extends DexFormat10x { public static final int OPCODE = 0x0; public static final String NAME = "Nop"; public static final String SMALI_NAME = "nop"; - Nop(int high, BytecodeStream stream) { + DexNop(int high, BytecodeStream stream) { super(high, stream); } - public Nop() { - } + public DexNop() {} - public static Nop create(int high, BytecodeStream stream) { + public static DexNop create(int high, BytecodeStream stream) { switch (high) { case 0x01: - return new PackedSwitchPayload(high, stream); + return new DexPackedSwitchPayload(high, stream); case 0x02: - return new SparseSwitchPayload(high, stream); + return new DexSparseSwitchPayload(high, stream); case 0x03: - return new FillArrayDataPayload(high, stream); + return new DexFillArrayDataPayload(high, stream); default: - return new Nop(high, stream); + return new DexNop(high, stream); } } // Notice that this must be overridden by the "Nop" subtypes! @Override - int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { + int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { return DexCompareHelper.compareIdUniquelyDeterminesEquality(this, other); }
diff --git a/src/main/java/com/android/tools/r8/code/NotInt.java b/src/main/java/com/android/tools/r8/dex/code/DexNotInt.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/NotInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexNotInt.java index c9681a7..0dde493 100644 --- a/src/main/java/com/android/tools/r8/code/NotInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNotInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NotInt extends Format12x { +public class DexNotInt extends DexFormat12x { public static final int OPCODE = 0x7c; public static final String NAME = "NotInt"; public static final String SMALI_NAME = "not-int"; - NotInt(int high, BytecodeStream stream) { + DexNotInt(int high, BytecodeStream stream) { super(high, stream); } - public NotInt(int dest, int source) { + public DexNotInt(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/NotLong.java b/src/main/java/com/android/tools/r8/dex/code/DexNotLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/NotLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexNotLong.java index fcbf475..ec5af4d 100644 --- a/src/main/java/com/android/tools/r8/code/NotLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexNotLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class NotLong extends Format12x { + +public class DexNotLong extends DexFormat12x { public static final int OPCODE = 0x7e; public static final String NAME = "NotLong"; public static final String SMALI_NAME = "not-long"; - NotLong(int high, BytecodeStream stream) { + DexNotLong(int high, BytecodeStream stream) { super(high, stream); } - public NotLong(int dest, int source) { + public DexNotLong(int dest, int source) { super(dest, source); }
diff --git a/src/main/java/com/android/tools/r8/code/OrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexOrInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/OrInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrInt.java index b7aeba4..61be0ac 100644 --- a/src/main/java/com/android/tools/r8/code/OrInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrInt.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrInt extends Format23x { + +public class DexOrInt extends DexFormat23x { public static final int OPCODE = 0x96; public static final String NAME = "OrInt"; public static final String SMALI_NAME = "or-int"; - OrInt(int high, BytecodeStream stream) { + DexOrInt(int high, BytecodeStream stream) { super(high, stream); } - public OrInt(int dest, int left, int right) { + public DexOrInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/OrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/OrInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java index 869be4d..a152de8 100644 --- a/src/main/java/com/android/tools/r8/code/OrInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrInt2Addr extends Format12x { +public class DexOrInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb6; public static final String NAME = "OrInt2Addr"; public static final String SMALI_NAME = "or-int/2addr"; - OrInt2Addr(int high, BytecodeStream stream) { + DexOrInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public OrInt2Addr(int left, int right) { + public DexOrInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/OrIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/OrIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java index 73e384d..9d3f245 100644 --- a/src/main/java/com/android/tools/r8/code/OrIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrIntLit16 extends Format22s { +public class DexOrIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd6; public static final String NAME = "OrIntLit16"; public static final String SMALI_NAME = "or-int/lit16"; - OrIntLit16(int high, BytecodeStream stream) { + DexOrIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public OrIntLit16(int dest, int register, int constant) { + public DexOrIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/OrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/OrIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java index 8c37e7b..4810953 100644 --- a/src/main/java/com/android/tools/r8/code/OrIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrIntLit8 extends Format22b { +public class DexOrIntLit8 extends DexFormat22b { public static final int OPCODE = 0xde; public static final String NAME = "OrIntLit8"; public static final String SMALI_NAME = "or-int/lit8"; - OrIntLit8(int high, BytecodeStream stream) { + DexOrIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public OrIntLit8(int dest, int register, int constant) { + public DexOrIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/OrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexOrLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/OrLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrLong.java index 0cef69b..02c9f52 100644 --- a/src/main/java/com/android/tools/r8/code/OrLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrLong extends Format23x { + +public class DexOrLong extends DexFormat23x { public static final int OPCODE = 0xA1; public static final String NAME = "OrLong"; public static final String SMALI_NAME = "or-long"; - OrLong(int high, BytecodeStream stream) { + DexOrLong(int high, BytecodeStream stream) { super(high, stream); } - public OrLong(int dest, int left, int right) { + public DexOrLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/OrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/OrLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java index 175a4a7..5fffef9 100644 --- a/src/main/java/com/android/tools/r8/code/OrLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexOrLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class OrLong2Addr extends Format12x { +public class DexOrLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc1; public static final String NAME = "OrLong2Addr"; public static final String SMALI_NAME = "or-long/2addr"; - OrLong2Addr(int high, BytecodeStream stream) { + DexOrLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public OrLong2Addr(int left, int right) { + public DexOrLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/PackedSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/PackedSwitch.java rename to src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java index 070b870..34029d8 100644 --- a/src/main/java/com/android/tools/r8/code/PackedSwitch.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitch.java
@@ -2,22 +2,22 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.naming.ClassNameMapper; -public class PackedSwitch extends Format31t { +public class DexPackedSwitch extends DexFormat31t { public static final int OPCODE = 0x2b; public static final String NAME = "PackedSwitch"; public static final String SMALI_NAME = "packed-switch"; - PackedSwitch(int high, BytecodeStream stream) { + DexPackedSwitch(int high, BytecodeStream stream) { super(high, stream); } - public PackedSwitch(int valueRegister) { + public DexPackedSwitch(int valueRegister) { super(valueRegister, -1); }
diff --git a/src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java rename to src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java index 3d297bb..2b0a21f 100644 --- a/src/main/java/com/android/tools/r8/code/PackedSwitchPayload.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexPackedSwitchPayload.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,17 +14,17 @@ import java.nio.ShortBuffer; import java.util.Arrays; -public class PackedSwitchPayload extends SwitchPayload { +public class DexPackedSwitchPayload extends DexSwitchPayload { public final int size; public final int first_key; public final /* offset */ int[] targets; - private static void specify(StructuralSpecification<PackedSwitchPayload, ?> spec) { + private static void specify(StructuralSpecification<DexPackedSwitchPayload, ?> spec) { spec.withInt(i -> i.size).withInt(i -> i.first_key).withIntArray(i -> i.targets); } - public PackedSwitchPayload(int high, BytecodeStream stream) { + public DexPackedSwitchPayload(int high, BytecodeStream stream) { super(high, stream); size = read16BitValue(stream); first_key = readSigned32BitValue(stream); @@ -34,8 +34,8 @@ } } - public PackedSwitchPayload(int first_key, int[] targets) { - assert targets.length > 0; // Empty switches should be eliminated. + public DexPackedSwitchPayload(int first_key, int[] targets) { + assert targets.length > 0; // Empty switches should be eliminated. this.size = targets.length; this.first_key = first_key; this.targets = targets; @@ -53,7 +53,7 @@ GraphLens graphLens, ObjectToOffsetMapping mapping, LensCodeRewriterUtils rewriter) { - writeFirst(1, dest); // Pseudo-opcode = 0x0100 + writeFirst(1, dest); // Pseudo-opcode = 0x0100 write16BitValue(size, dest); write32BitValue(first_key, dest); for (int i = 0; i < size; i++) { @@ -62,8 +62,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (PackedSwitchPayload) other, PackedSwitchPayload::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexPackedSwitchPayload) other, DexPackedSwitchPayload::specify); } @Override @@ -92,7 +92,7 @@ @Override public int[] keys() { - return new int[]{first_key}; + return new int[] {first_key}; } @Override @@ -101,7 +101,7 @@ } @Override - public String toString(ClassNameMapper naming, Instruction payloadUser) { + public String toString(ClassNameMapper naming, DexInstruction payloadUser) { StringBuilder builder = new StringBuilder("[PackedSwitchPayload"); if (payloadUser == null) { builder.append(" offsets relative to associated PackedSwitch"); @@ -121,7 +121,7 @@ } @Override - public String toSmaliString(Instruction payloadUser) { + public String toSmaliString(DexInstruction payloadUser) { StringBuilder builder = new StringBuilder(); builder.append(" "); builder.append(".packed-switch ");
diff --git a/src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java similarity index 90% rename from src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java rename to src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java index 13cde75..0c03729 100644 --- a/src/main/java/com/android/tools/r8/code/DexRecordFieldValues.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRecordFieldValues.java
@@ -1,10 +1,11 @@ -// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file +// Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -20,7 +21,7 @@ import java.nio.ShortBuffer; import java.util.Arrays; -public class DexRecordFieldValues extends Instruction { +public class DexRecordFieldValues extends DexInstruction { public static final String NAME = "RecordFieldValues"; public static final String SMALI_NAME = "record-field-values*"; @@ -37,12 +38,12 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { for (DexField field : fields) { - field.collectIndexedItems(indexedItems); + field.collectIndexedItems(appView, indexedItems); } } @@ -73,7 +74,7 @@ } @Override - int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { + int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { return visitor.visit(this, (DexRecordFieldValues) other, DexRecordFieldValues::specify); }
diff --git a/src/main/java/com/android/tools/r8/code/RemDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/RemDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java index 4107bf0..8ca18cb 100644 --- a/src/main/java/com/android/tools/r8/code/RemDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemDouble extends Format23x { +public class DexRemDouble extends DexFormat23x { public static final int OPCODE = 0xaf; public static final String NAME = "RemDouble"; public static final String SMALI_NAME = "rem-double"; - RemDouble(int high, BytecodeStream stream) { + DexRemDouble(int high, BytecodeStream stream) { super(high, stream); } - public RemDouble(int dest, int left, int right) { + public DexRemDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/RemDouble2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java index a538dfd..022087a 100644 --- a/src/main/java/com/android/tools/r8/code/RemDouble2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemDouble2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemDouble2Addr extends Format12x { + +public class DexRemDouble2Addr extends DexFormat12x { public static final int OPCODE = 0xcf; public static final String NAME = "RemDouble2Addr"; public static final String SMALI_NAME = "rem-double/2addr"; - RemDouble2Addr(int high, BytecodeStream stream) { + DexRemDouble2Addr(int high, BytecodeStream stream) { super(high, stream); } - public RemDouble2Addr(int left, int right) { + public DexRemDouble2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/RemFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java index 944332b..ac5984b 100644 --- a/src/main/java/com/android/tools/r8/code/RemFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemFloat extends Format23x { + +public class DexRemFloat extends DexFormat23x { public static final int OPCODE = 0xaA; public static final String NAME = "RemFloat"; public static final String SMALI_NAME = "rem-float"; - RemFloat(int high, BytecodeStream stream) { + DexRemFloat(int high, BytecodeStream stream) { super(high, stream); } - public RemFloat(int dest, int left, int right) { + public DexRemFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/RemFloat2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java index ddfdb15..fcad4b1 100644 --- a/src/main/java/com/android/tools/r8/code/RemFloat2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemFloat2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemFloat2Addr extends Format12x { + +public class DexRemFloat2Addr extends DexFormat12x { public static final int OPCODE = 0xca; public static final String NAME = "RemFloat2Addr"; public static final String SMALI_NAME = "rem-float/2addr"; - RemFloat2Addr(int high, BytecodeStream stream) { + DexRemFloat2Addr(int high, BytecodeStream stream) { super(high, stream); } - public RemFloat2Addr(int left, int right) { + public DexRemFloat2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemInt.java b/src/main/java/com/android/tools/r8/dex/code/DexRemInt.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/RemInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemInt.java index f345fc6..3b6850e 100644 --- a/src/main/java/com/android/tools/r8/code/RemInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemInt extends Format23x { +public class DexRemInt extends DexFormat23x { public static final int OPCODE = 0x94; public static final String NAME = "RemInt"; public static final String SMALI_NAME = "rem-int"; - RemInt(int high, BytecodeStream stream) { + DexRemInt(int high, BytecodeStream stream) { super(high, stream); } - public RemInt(int dest, int left, int right) { + public DexRemInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/RemInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java index 5e357d6..f1d1d8d 100644 --- a/src/main/java/com/android/tools/r8/code/RemInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemInt2Addr extends Format12x { +public class DexRemInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb4; public static final String NAME = "RemInt2Addr"; public static final String SMALI_NAME = "rem-int/2addr"; - RemInt2Addr(int high, BytecodeStream stream) { + DexRemInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public RemInt2Addr(int left, int right) { + public DexRemInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/RemIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java index 80f3277..630b564 100644 --- a/src/main/java/com/android/tools/r8/code/RemIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemIntLit16 extends Format22s { +public class DexRemIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd4; public static final String NAME = "RemIntLit16"; public static final String SMALI_NAME = "rem-int/lit16"; - RemIntLit16(int high, BytecodeStream stream) { + DexRemIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public RemIntLit16(int dest, int register, int constant) { + public DexRemIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/RemIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/RemIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java index d1fcc7f..15ec213 100644 --- a/src/main/java/com/android/tools/r8/code/RemIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemIntLit8.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemIntLit8 extends Format22b { + +public class DexRemIntLit8 extends DexFormat22b { public static final int OPCODE = 0xdc; public static final String NAME = "RemIntLit8"; public static final String SMALI_NAME = "rem-int/lit8"; - RemIntLit8(int high, BytecodeStream stream) { + DexRemIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public RemIntLit8(int dest, int register, int constant) { + public DexRemIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/RemLong.java b/src/main/java/com/android/tools/r8/dex/code/DexRemLong.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/RemLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemLong.java index fa48d0c..46f1278 100644 --- a/src/main/java/com/android/tools/r8/code/RemLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemLong extends Format23x { +public class DexRemLong extends DexFormat23x { public static final int OPCODE = 0x9f; public static final String NAME = "RemLong"; public static final String SMALI_NAME = "rem-long"; - RemLong(int high, BytecodeStream stream) { + DexRemLong(int high, BytecodeStream stream) { super(high, stream); } - public RemLong(int dest, int left, int right) { + public DexRemLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/RemLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/RemLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java index ec14f4f..dcf2dc3 100644 --- a/src/main/java/com/android/tools/r8/code/RemLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRemLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RemLong2Addr extends Format12x { +public class DexRemLong2Addr extends DexFormat12x { public static final int OPCODE = 0xbf; public static final String NAME = "RemLong2Addr"; public static final String SMALI_NAME = "rem-long/2addr"; - RemLong2Addr(int high, BytecodeStream stream) { + DexRemLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public RemLong2Addr(int left, int right) { + public DexRemLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/Return.java b/src/main/java/com/android/tools/r8/dex/code/DexReturn.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/Return.java rename to src/main/java/com/android/tools/r8/dex/code/DexReturn.java index 6792c3a..2d3662d 100644 --- a/src/main/java/com/android/tools/r8/code/Return.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexReturn.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Return extends Format11x { +public class DexReturn extends DexFormat11x { public static final int OPCODE = 0xf; public static final String NAME = "Return"; public static final String SMALI_NAME = "return"; - Return(int high, BytecodeStream stream) { + DexReturn(int high, BytecodeStream stream) { super(high, stream); } - public Return(int AA) { + public DexReturn(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/ReturnObject.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/ReturnObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java index c5008c7..07a795d 100644 --- a/src/main/java/com/android/tools/r8/code/ReturnObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnObject.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ReturnObject extends Format11x { +public class DexReturnObject extends DexFormat11x { public static final int OPCODE = 0x11; public static final String NAME = "ReturnObject"; public static final String SMALI_NAME = "return-object"; - ReturnObject(int high, BytecodeStream stream) { + DexReturnObject(int high, BytecodeStream stream) { super(high, stream); } - public ReturnObject(int AA) { + public DexReturnObject(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/ReturnVoid.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/ReturnVoid.java rename to src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java index 32d75f8..fae79fc 100644 --- a/src/main/java/com/android/tools/r8/code/ReturnVoid.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnVoid.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.utils.structural.CompareToVisitor; -public class ReturnVoid extends Format10x { +public class DexReturnVoid extends DexFormat10x { public static final int OPCODE = 0xe; public static final String NAME = "ReturnVoid"; public static final String SMALI_NAME = "return-void"; - ReturnVoid(int high, BytecodeStream stream) { + DexReturnVoid(int high, BytecodeStream stream) { super(high, stream); } - public ReturnVoid() {} + public DexReturnVoid() {} @Override public String getName() { @@ -34,7 +34,7 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { return DexCompareHelper.compareIdUniquelyDeterminesEquality(this, other); }
diff --git a/src/main/java/com/android/tools/r8/code/ReturnWide.java b/src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/ReturnWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java index f1f40b2..c3670f0 100644 --- a/src/main/java/com/android/tools/r8/code/ReturnWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexReturnWide.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ReturnWide extends Format11x { +public class DexReturnWide extends DexFormat11x { public static final int OPCODE = 0x10; public static final String NAME = "ReturnWide"; public static final String SMALI_NAME = "return-wide"; - ReturnWide(int high, BytecodeStream stream) { + DexReturnWide(int high, BytecodeStream stream) { super(high, stream); } - public ReturnWide(int AA) { + public DexReturnWide(int AA) { super(AA); } @@ -43,4 +43,4 @@ public void buildIR(IRBuilder builder) { builder.addReturn(AA); } -} \ No newline at end of file +}
diff --git a/src/main/java/com/android/tools/r8/code/RsubInt.java b/src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/RsubInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java index 410f81a..7a2d7bd 100644 --- a/src/main/java/com/android/tools/r8/code/RsubInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRsubInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RsubInt extends Format22s { +public class DexRsubInt extends DexFormat22s { public static final int OPCODE = 0xd1; public static final String NAME = "RsubInt"; public static final String SMALI_NAME = "rsub-int"; - RsubInt(int high, BytecodeStream stream) { + DexRsubInt(int high, BytecodeStream stream) { super(high, stream); } - public RsubInt(int dest, int register, int constant) { + public DexRsubInt(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/RsubIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/RsubIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java index 242a3ba..8ea9a48 100644 --- a/src/main/java/com/android/tools/r8/code/RsubIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexRsubIntLit8.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class RsubIntLit8 extends Format22b { + +public class DexRsubIntLit8 extends DexFormat22b { public static final int OPCODE = 0xd9; public static final String NAME = "RsubIntLit8"; public static final String SMALI_NAME = "rsub-int/lit8"; - RsubIntLit8(int high, BytecodeStream stream) { + DexRsubIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public RsubIntLit8(int dest, int register, int constant) { + public DexRsubIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java b/src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java similarity index 68% rename from src/main/java/com/android/tools/r8/code/SafeCheckCast.java rename to src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java index 8f19396..004708b 100644 --- a/src/main/java/com/android/tools/r8/code/SafeCheckCast.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSafeCheckCast.java
@@ -1,21 +1,21 @@ -// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file +// Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SafeCheckCast extends CheckCast { +public class DexSafeCheckCast extends DexCheckCast { - SafeCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSafeCheckCast(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping); } - public SafeCheckCast(int valueRegister, DexType type) { + public DexSafeCheckCast(int valueRegister, DexType type) { super(valueRegister, type, true); }
diff --git a/src/main/java/com/android/tools/r8/code/Sget.java b/src/main/java/com/android/tools/r8/dex/code/DexSget.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/Sget.java rename to src/main/java/com/android/tools/r8/dex/code/DexSget.java index 2bd4653..91bfbd9 100644 --- a/src/main/java/com/android/tools/r8/code/Sget.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSget.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Sget extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSget extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x60; public static final String NAME = "Sget"; public static final String SMALI_NAME = "sget"; - Sget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSget(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public Sget(int AA, DexField BBBB) { + public DexSget(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java index fb51776..1f669e0 100644 --- a/src/main/java/com/android/tools/r8/code/SgetBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetBoolean.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetBoolean extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetBoolean extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x63; public static final String NAME = "SgetBoolean"; public static final String SMALI_NAME = "sget-boolean"; - SgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetBoolean(int AA, DexField BBBB) { + public DexSgetBoolean(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetByte.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java index ee693ac..ace5c84 100644 --- a/src/main/java/com/android/tools/r8/code/SgetByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetByte.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetByte extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetByte extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x64; public static final String NAME = "SgetByte"; public static final String SMALI_NAME = "sget-byte"; - SgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetByte(int AA, DexField BBBB) { + public DexSgetByte(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetChar.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java index 5f61f90..4219043 100644 --- a/src/main/java/com/android/tools/r8/code/SgetChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetChar.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetChar extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetChar extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x65; public static final String NAME = "SgetChar"; public static final String SMALI_NAME = "sget-char"; - SgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetChar(int AA, DexField BBBB) { + public DexSgetChar(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetObject.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java index 8e5018e..7894adf 100644 --- a/src/main/java/com/android/tools/r8/code/SgetObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetObject.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetObject extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetObject extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x62; public static final String NAME = "SgetObject"; public static final String SMALI_NAME = "sget-object"; - SgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetObject(int AA, DexField BBBB) { + public DexSgetObject(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetOrSput.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java similarity index 72% rename from src/main/java/com/android/tools/r8/code/SgetOrSput.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java index 499d679..85c8ea3 100644 --- a/src/main/java/com/android/tools/r8/code/SgetOrSput.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetOrSput.java
@@ -1,9 +1,10 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -12,24 +13,24 @@ import com.android.tools.r8.utils.structural.StructuralSpecification; import java.nio.ShortBuffer; -abstract class SgetOrSput extends Format21c<DexField> { +abstract class DexSgetOrSput extends DexFormat21c<DexField> { - SgetOrSput(int high, BytecodeStream stream, DexField[] map) { + DexSgetOrSput(int high, BytecodeStream stream, DexField[] map) { super(high, stream, map); } - protected SgetOrSput(int AA, DexField BBBB) { + protected DexSgetOrSput(int AA, DexField BBBB) { super(AA, BBBB); } @Override public final void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - DexField rewritten = graphLens.lookupField(getField()); - rewritten.collectIndexedItems(indexedItems); + DexField rewritten = appView.graphLens().lookupField(getField()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override @@ -50,7 +51,7 @@ } @Override - void internalSubSpecify(StructuralSpecification<Format21c<DexField>, ?> spec) { + void internalSubSpecify(StructuralSpecification<DexFormat21c<DexField>, ?> spec) { spec.withItem(i -> i.BBBB); } }
diff --git a/src/main/java/com/android/tools/r8/code/SgetShort.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java index 99fc4ee..b98797d 100644 --- a/src/main/java/com/android/tools/r8/code/SgetShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetShort.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetShort extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetShort extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x66; public static final String NAME = "SgetShort"; public static final String SMALI_NAME = "sget-short"; - SgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetShort(int AA, DexField BBBB) { + public DexSgetShort(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SgetWide.java b/src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SgetWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java index 75a4343..5964d85 100644 --- a/src/main/java/com/android/tools/r8/code/SgetWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSgetWide.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SgetWide extends SgetOrSput implements CfOrDexStaticFieldRead { +public class DexSgetWide extends DexSgetOrSput implements CfOrDexStaticFieldRead { public static final int OPCODE = 0x61; public static final String NAME = "SgetWide"; public static final String SMALI_NAME = "sget-wide"; - SgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSgetWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SgetWide(int AA, DexField BBBB) { + public DexSgetWide(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/ShlInt.java b/src/main/java/com/android/tools/r8/dex/code/DexShlInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShlInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexShlInt.java index 2f724c0..1b8780e 100644 --- a/src/main/java/com/android/tools/r8/code/ShlInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShlInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShlInt extends Format23x { +public class DexShlInt extends DexFormat23x { public static final int OPCODE = 0x98; public static final String NAME = "ShlInt"; public static final String SMALI_NAME = "shl-int"; - ShlInt(int high, BytecodeStream stream) { + DexShlInt(int high, BytecodeStream stream) { super(high, stream); } - public ShlInt(int dest, int left, int right) { + public DexShlInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShlInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShlInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java index 97a0c89..88ee095 100644 --- a/src/main/java/com/android/tools/r8/code/ShlInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShlInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShlInt2Addr extends Format12x { +public class DexShlInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb8; public static final String NAME = "ShlInt2Addr"; public static final String SMALI_NAME = "shl-int/2addr"; - ShlInt2Addr(int high, BytecodeStream stream) { + DexShlInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public ShlInt2Addr(int left, int right) { + public DexShlInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShlIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/ShlIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java index 173acdc..948680f 100644 --- a/src/main/java/com/android/tools/r8/code/ShlIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShlIntLit8.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShlIntLit8 extends Format22b { + +public class DexShlIntLit8 extends DexFormat22b { public static final int OPCODE = 0xe0; public static final String NAME = "ShlIntLit8"; public static final String SMALI_NAME = "shl-int/lit8"; - ShlIntLit8(int high, BytecodeStream stream) { + DexShlIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public ShlIntLit8(int dest, int register, int constant) { + public DexShlIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/ShlLong.java b/src/main/java/com/android/tools/r8/dex/code/DexShlLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShlLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexShlLong.java index 54b98f9..1fcc10e 100644 --- a/src/main/java/com/android/tools/r8/code/ShlLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShlLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShlLong extends Format23x { +public class DexShlLong extends DexFormat23x { public static final int OPCODE = 0xA3; public static final String NAME = "ShlLong"; public static final String SMALI_NAME = "shl-long"; - ShlLong(int high, BytecodeStream stream) { + DexShlLong(int high, BytecodeStream stream) { super(high, stream); } - public ShlLong(int dest, int left, int right) { + public DexShlLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShlLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShlLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java index e7f35b0..36151a2 100644 --- a/src/main/java/com/android/tools/r8/code/ShlLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShlLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShlLong2Addr extends Format12x { +public class DexShlLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc3; public static final String NAME = "ShlLong2Addr"; public static final String SMALI_NAME = "shl-long/2addr"; - ShlLong2Addr(int high, BytecodeStream stream) { + DexShlLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public ShlLong2Addr(int left, int right) { + public DexShlLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexShrInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShrInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexShrInt.java index d51cce7..d86bdd6 100644 --- a/src/main/java/com/android/tools/r8/code/ShrInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShrInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShrInt extends Format23x { +public class DexShrInt extends DexFormat23x { public static final int OPCODE = 0x99; public static final String NAME = "ShrInt"; public static final String SMALI_NAME = "shr-int"; - ShrInt(int high, BytecodeStream stream) { + DexShrInt(int high, BytecodeStream stream) { super(high, stream); } - public ShrInt(int dest, int left, int right) { + public DexShrInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShrInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java index b90172b..10023c2 100644 --- a/src/main/java/com/android/tools/r8/code/ShrInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShrInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShrInt2Addr extends Format12x { +public class DexShrInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb9; public static final String NAME = "ShrInt2Addr"; public static final String SMALI_NAME = "shr-int/2addr"; - ShrInt2Addr(int high, BytecodeStream stream) { + DexShrInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public ShrInt2Addr(int left, int right) { + public DexShrInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/ShrIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java index ecb58ff..0e5e6e9 100644 --- a/src/main/java/com/android/tools/r8/code/ShrIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShrIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShrIntLit8 extends Format22b { +public class DexShrIntLit8 extends DexFormat22b { public static final int OPCODE = 0xe1; public static final String NAME = "ShrIntLit8"; public static final String SMALI_NAME = "shr-int/lit8"; - ShrIntLit8(int high, BytecodeStream stream) { + DexShrIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public ShrIntLit8(int dest, int register, int constant) { + public DexShrIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/ShrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexShrLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShrLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexShrLong.java index fbf9ef2..913535b 100644 --- a/src/main/java/com/android/tools/r8/code/ShrLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShrLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShrLong extends Format23x { +public class DexShrLong extends DexFormat23x { public static final int OPCODE = 0xA4; public static final String NAME = "ShrLong"; public static final String SMALI_NAME = "shr-long"; - ShrLong(int high, BytecodeStream stream) { + DexShrLong(int high, BytecodeStream stream) { super(high, stream); } - public ShrLong(int dest, int left, int right) { + public DexShrLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/ShrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/ShrLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java index 4732c39..c73273f 100644 --- a/src/main/java/com/android/tools/r8/code/ShrLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexShrLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class ShrLong2Addr extends Format12x { +public class DexShrLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc4; public static final String NAME = "ShrLong2Addr"; public static final String SMALI_NAME = "shr-long/2addr"; - ShrLong2Addr(int high, BytecodeStream stream) { + DexShrLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public ShrLong2Addr(int left, int right) { + public DexShrLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SparseSwitch.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java similarity index 86% rename from src/main/java/com/android/tools/r8/code/SparseSwitch.java rename to src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java index b0a048a..4f15ab7 100644 --- a/src/main/java/com/android/tools/r8/code/SparseSwitch.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitch.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; import com.android.tools.r8.naming.ClassNameMapper; -public class SparseSwitch extends Format31t { +public class DexSparseSwitch extends DexFormat31t { public static final int OPCODE = 0x2c; public static final String NAME = "SparseSwitch"; public static final String SMALI_NAME = "sparse-switch"; - SparseSwitch(int high, BytecodeStream stream) { + DexSparseSwitch(int high, BytecodeStream stream) { super(high, stream); } - public SparseSwitch(int value) { + public DexSparseSwitch(int value) { super(value, -1); }
diff --git a/src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java rename to src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java index 9dac193e..f9ed49e 100644 --- a/src/main/java/com/android/tools/r8/code/SparseSwitchPayload.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSparseSwitchPayload.java
@@ -1,7 +1,7 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; @@ -14,17 +14,17 @@ import java.nio.ShortBuffer; import java.util.Arrays; -public class SparseSwitchPayload extends SwitchPayload { +public class DexSparseSwitchPayload extends DexSwitchPayload { public final int size; public final int[] keys; public final /* offset */ int[] targets; - private static void specify(StructuralSpecification<SparseSwitchPayload, ?> spec) { + private static void specify(StructuralSpecification<DexSparseSwitchPayload, ?> spec) { spec.withInt(i -> i.size).withIntArray(i -> i.keys).withIntArray(i -> i.targets); } - public SparseSwitchPayload(int high, BytecodeStream stream) { + public DexSparseSwitchPayload(int high, BytecodeStream stream) { super(high, stream); size = read16BitValue(stream); keys = new int[size]; @@ -38,8 +38,8 @@ } } - public SparseSwitchPayload(int[] keys, int[] targets) { - assert targets.length > 0; // Empty switches should be eliminated. + public DexSparseSwitchPayload(int[] keys, int[] targets) { + assert targets.length > 0; // Empty switches should be eliminated. this.size = targets.length; this.keys = keys; this.targets = targets; @@ -57,7 +57,7 @@ GraphLens graphLens, ObjectToOffsetMapping mapping, LensCodeRewriterUtils rewriter) { - writeFirst(2, dest); // Pseudo-opcode = 0x0200 + writeFirst(2, dest); // Pseudo-opcode = 0x0200 write16BitValue(size, dest); for (int i = 0; i < size; i++) { write32BitValue(keys[i], dest); @@ -68,8 +68,8 @@ } @Override - final int internalAcceptCompareTo(Instruction other, CompareToVisitor visitor) { - return visitor.visit(this, (SparseSwitchPayload) other, SparseSwitchPayload::specify); + final int internalAcceptCompareTo(DexInstruction other, CompareToVisitor visitor) { + return visitor.visit(this, (DexSparseSwitchPayload) other, DexSparseSwitchPayload::specify); } @Override @@ -107,7 +107,7 @@ } @Override - public String toString(ClassNameMapper naming, Instruction payloadUser) { + public String toString(ClassNameMapper naming, DexInstruction payloadUser) { StringBuilder builder = new StringBuilder("[SparseSwitchPayload"); if (payloadUser == null) { builder.append(" offsets relative to associated SparseSwitch"); @@ -127,7 +127,7 @@ } @Override - public String toSmaliString(Instruction payloadUser) { + public String toSmaliString(DexInstruction payloadUser) { StringBuilder builder = new StringBuilder(); builder.append(" "); builder.append(".sparse-switch");
diff --git a/src/main/java/com/android/tools/r8/code/Sput.java b/src/main/java/com/android/tools/r8/dex/code/DexSput.java similarity index 84% rename from src/main/java/com/android/tools/r8/code/Sput.java rename to src/main/java/com/android/tools/r8/dex/code/DexSput.java index e9e7f56..8a7ab46 100644 --- a/src/main/java/com/android/tools/r8/code/Sput.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSput.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Sput extends SgetOrSput { +public class DexSput extends DexSgetOrSput { public static final int OPCODE = 0x67; public static final String NAME = "Sput"; public static final String SMALI_NAME = "sput"; - Sput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + DexSput(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public Sput(int AA, DexField BBBB) { + public DexSput(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputBoolean.java b/src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/SputBoolean.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java index d3ba949..1bc6555 100644 --- a/src/main/java/com/android/tools/r8/code/SputBoolean.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputBoolean.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputBoolean extends SgetOrSput { +public class DexSputBoolean extends DexSgetOrSput { public static final int OPCODE = 0x6a; public static final String NAME = "SputBoolean"; public static final String SMALI_NAME = "sput-boolean"; - /*package*/ SputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputBoolean(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputBoolean(int AA, DexField BBBB) { + public DexSputBoolean(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputByte.java b/src/main/java/com/android/tools/r8/dex/code/DexSputByte.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/SputByte.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputByte.java index e1c09f5..40f754e 100644 --- a/src/main/java/com/android/tools/r8/code/SputByte.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputByte.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputByte extends SgetOrSput { +public class DexSputByte extends DexSgetOrSput { public static final int OPCODE = 0x6b; public static final String NAME = "SputByte"; public static final String SMALI_NAME = "sput-byte"; - /*package*/ SputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputByte(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputByte(int AA, DexField BBBB) { + public DexSputByte(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputChar.java b/src/main/java/com/android/tools/r8/dex/code/DexSputChar.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/SputChar.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputChar.java index 2497f76..c4a1174 100644 --- a/src/main/java/com/android/tools/r8/code/SputChar.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputChar.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputChar extends SgetOrSput { +public class DexSputChar extends DexSgetOrSput { public static final int OPCODE = 0x6c; public static final String NAME = "SputChar"; public static final String SMALI_NAME = "sput-char"; - /*package*/ SputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputChar(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputChar(int AA, DexField BBBB) { + public DexSputChar(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputObject.java b/src/main/java/com/android/tools/r8/dex/code/DexSputObject.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/SputObject.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputObject.java index 43a92b6..91dfca4 100644 --- a/src/main/java/com/android/tools/r8/code/SputObject.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputObject.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputObject extends SgetOrSput { +public class DexSputObject extends DexSgetOrSput { public static final int OPCODE = 0x69; public static final String NAME = "SputObject"; public static final String SMALI_NAME = "sput-object"; - /*package*/ SputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputObject(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputObject(int AA, DexField BBBB) { + public DexSputObject(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputShort.java b/src/main/java/com/android/tools/r8/dex/code/DexSputShort.java similarity index 82% rename from src/main/java/com/android/tools/r8/code/SputShort.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputShort.java index 2335606..d4aec47 100644 --- a/src/main/java/com/android/tools/r8/code/SputShort.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputShort.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputShort extends SgetOrSput { +public class DexSputShort extends DexSgetOrSput { public static final int OPCODE = 0x6d; public static final String NAME = "SputShort"; public static final String SMALI_NAME = "sput-short"; - /*package*/ SputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputShort(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputShort(int AA, DexField BBBB) { + public DexSputShort(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SputWide.java b/src/main/java/com/android/tools/r8/dex/code/DexSputWide.java similarity index 83% rename from src/main/java/com/android/tools/r8/code/SputWide.java rename to src/main/java/com/android/tools/r8/dex/code/DexSputWide.java index 278418a..a3a8003 100644 --- a/src/main/java/com/android/tools/r8/code/SputWide.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSputWide.java
@@ -1,24 +1,24 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.OffsetToObjectMapping; import com.android.tools.r8.graph.UseRegistry; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SputWide extends SgetOrSput { +public class DexSputWide extends DexSgetOrSput { public static final int OPCODE = 0x68; public static final String NAME = "SputWide"; public static final String SMALI_NAME = "sput-wide"; - /*package*/ SputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { + /*package*/ DexSputWide(int high, BytecodeStream stream, OffsetToObjectMapping mapping) { super(high, stream, mapping.getFieldMap()); } - public SputWide(int AA, DexField BBBB) { + public DexSputWide(int AA, DexField BBBB) { super(AA, BBBB); }
diff --git a/src/main/java/com/android/tools/r8/code/SubDouble.java b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubDouble.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java index f68b270..fc2176e 100644 --- a/src/main/java/com/android/tools/r8/code/SubDouble.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubDouble extends Format23x { +public class DexSubDouble extends DexFormat23x { public static final int OPCODE = 0xac; public static final String NAME = "SubDouble"; public static final String SMALI_NAME = "sub-double"; - SubDouble(int high, BytecodeStream stream) { + DexSubDouble(int high, BytecodeStream stream) { super(high, stream); } - public SubDouble(int dest, int left, int right) { + public DexSubDouble(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubDouble2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/SubDouble2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java index 2cd16ac..3b99bfc 100644 --- a/src/main/java/com/android/tools/r8/code/SubDouble2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubDouble2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubDouble2Addr extends Format12x { +public class DexSubDouble2Addr extends DexFormat12x { public static final int OPCODE = 0xcc; public static final String NAME = "SubDouble2Addr"; public static final String SMALI_NAME = "sub-double/2addr"; - SubDouble2Addr(int high, BytecodeStream stream) { + DexSubDouble2Addr(int high, BytecodeStream stream) { super(high, stream); } - public SubDouble2Addr(int left, int right) { + public DexSubDouble2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubFloat.java b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubFloat.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java index e49e843..45fa530 100644 --- a/src/main/java/com/android/tools/r8/code/SubFloat.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubFloat extends Format23x { +public class DexSubFloat extends DexFormat23x { public static final int OPCODE = 0xA7; public static final String NAME = "SubFloat"; public static final String SMALI_NAME = "sub-float"; - SubFloat(int high, BytecodeStream stream) { + DexSubFloat(int high, BytecodeStream stream) { super(high, stream); } - public SubFloat(int dest, int left, int right) { + public DexSubFloat(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubFloat2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/SubFloat2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java index 42c4442..4df6f33 100644 --- a/src/main/java/com/android/tools/r8/code/SubFloat2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubFloat2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubFloat2Addr extends Format12x { +public class DexSubFloat2Addr extends DexFormat12x { public static final int OPCODE = 0xc7; public static final String NAME = "SubFloat2Addr"; public static final String SMALI_NAME = "sub-float/2addr"; - SubFloat2Addr(int high, BytecodeStream stream) { + DexSubFloat2Addr(int high, BytecodeStream stream) { super(high, stream); } - public SubFloat2Addr(int left, int right) { + public DexSubFloat2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubInt.java b/src/main/java/com/android/tools/r8/dex/code/DexSubInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubInt.java index d187ea3..a161d5c 100644 --- a/src/main/java/com/android/tools/r8/code/SubInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubInt extends Format23x { +public class DexSubInt extends DexFormat23x { public static final int OPCODE = 0x91; public static final String NAME = "SubInt"; public static final String SMALI_NAME = "sub-int"; - SubInt(int high, BytecodeStream stream) { + DexSubInt(int high, BytecodeStream stream) { super(high, stream); } - public SubInt(int dest, int left, int right) { + public DexSubInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java index 97f94a4..314744c 100644 --- a/src/main/java/com/android/tools/r8/code/SubInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubInt2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubInt2Addr extends Format12x { + +public class DexSubInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb1; public static final String NAME = "SubInt2Addr"; public static final String SMALI_NAME = "sub-int/2addr"; - SubInt2Addr(int high, BytecodeStream stream) { + DexSubInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public SubInt2Addr(int left, int right) { + public DexSubInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubLong.java b/src/main/java/com/android/tools/r8/dex/code/DexSubLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubLong.java index a2a0697..e418a52 100644 --- a/src/main/java/com/android/tools/r8/code/SubLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubLong extends Format23x { +public class DexSubLong extends DexFormat23x { public static final int OPCODE = 0x9c; public static final String NAME = "SubLong"; public static final String SMALI_NAME = "sub-long"; - SubLong(int high, BytecodeStream stream) { + DexSubLong(int high, BytecodeStream stream) { super(high, stream); } - public SubLong(int dest, int left, int right) { + public DexSubLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SubLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/SubLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java index 40d2c6b..75e13b7 100644 --- a/src/main/java/com/android/tools/r8/code/SubLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSubLong2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class SubLong2Addr extends Format12x { + +public class DexSubLong2Addr extends DexFormat12x { public static final int OPCODE = 0xbc; public static final String NAME = "SubLong2Addr"; public static final String SMALI_NAME = "sub-long/2addr"; - SubLong2Addr(int high, BytecodeStream stream) { + DexSubLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public SubLong2Addr(int left, int right) { + public DexSubLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/SwitchPayload.java b/src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java similarity index 76% rename from src/main/java/com/android/tools/r8/code/SwitchPayload.java rename to src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java index 0525e41..7f18ec2 100644 --- a/src/main/java/com/android/tools/r8/code/SwitchPayload.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexSwitchPayload.java
@@ -2,20 +2,21 @@ // 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public abstract class SwitchPayload extends Nop { - SwitchPayload(int high, BytecodeStream stream) { +public abstract class DexSwitchPayload extends DexNop { + DexSwitchPayload(int high, BytecodeStream stream) { super(high, stream); } - public SwitchPayload() { - } + public DexSwitchPayload() {} public abstract int[] keys(); + public abstract int numberOfKeys(); + public abstract int[] switchTargetOffsets(); @Override
diff --git a/src/main/java/com/android/tools/r8/code/Throw.java b/src/main/java/com/android/tools/r8/dex/code/DexThrow.java similarity index 84% rename from src/main/java/com/android/tools/r8/code/Throw.java rename to src/main/java/com/android/tools/r8/dex/code/DexThrow.java index 40d69f1..2df333a 100644 --- a/src/main/java/com/android/tools/r8/code/Throw.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexThrow.java
@@ -1,21 +1,21 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.conversion.IRBuilder; -public class Throw extends Format11x { +public class DexThrow extends DexFormat11x { public static final int OPCODE = 0x27; public static final String NAME = "Throw"; public static final String SMALI_NAME = "throw"; - Throw(int high, BytecodeStream stream) { + DexThrow(int high, BytecodeStream stream) { super(high, stream); } - public Throw(int AA) { + public DexThrow(int AA) { super(AA); }
diff --git a/src/main/java/com/android/tools/r8/code/UshrInt.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/UshrInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java index 6f480b1..c3ac597 100644 --- a/src/main/java/com/android/tools/r8/code/UshrInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class UshrInt extends Format23x { +public class DexUshrInt extends DexFormat23x { public static final int OPCODE = 0x9A; public static final String NAME = "UshrInt"; public static final String SMALI_NAME = "ushr-int"; - UshrInt(int high, BytecodeStream stream) { + DexUshrInt(int high, BytecodeStream stream) { super(high, stream); } - public UshrInt(int dest, int left, int right) { + public DexUshrInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/UshrInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/UshrInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java index 3d9c135..fc5e4a7 100644 --- a/src/main/java/com/android/tools/r8/code/UshrInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrInt2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class UshrInt2Addr extends Format12x { +public class DexUshrInt2Addr extends DexFormat12x { public static final int OPCODE = 0xba; public static final String NAME = "UshrInt2Addr"; public static final String SMALI_NAME = "ushr-int/2addr"; - UshrInt2Addr(int high, BytecodeStream stream) { + DexUshrInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public UshrInt2Addr(int left, int right) { + public DexUshrInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/UshrIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/UshrIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java index 499c34d..625e1ee 100644 --- a/src/main/java/com/android/tools/r8/code/UshrIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class UshrIntLit8 extends Format22b { +public class DexUshrIntLit8 extends DexFormat22b { public static final int OPCODE = 0xe2; public static final String NAME = "UshrIntLit8"; public static final String SMALI_NAME = "ushr-int/lit8"; - UshrIntLit8(int high, BytecodeStream stream) { + DexUshrIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public UshrIntLit8(int dest, int register, int constant) { + public DexUshrIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/UshrLong.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/UshrLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java index 43b816a..0aed94f 100644 --- a/src/main/java/com/android/tools/r8/code/UshrLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class UshrLong extends Format23x { + +public class DexUshrLong extends DexFormat23x { public static final int OPCODE = 0xa5; public static final String NAME = "UshrLong"; public static final String SMALI_NAME = "ushr-long"; - UshrLong(int high, BytecodeStream stream) { + DexUshrLong(int high, BytecodeStream stream) { super(high, stream); } - public UshrLong(int dest, int left, int right) { + public DexUshrLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/UshrLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/UshrLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java index 1651d6d..d140899 100644 --- a/src/main/java/com/android/tools/r8/code/UshrLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexUshrLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class UshrLong2Addr extends Format12x { +public class DexUshrLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc5; public static final String NAME = "UshrLong2Addr"; public static final String SMALI_NAME = "ushr-long/2addr"; - UshrLong2Addr(int high, BytecodeStream stream) { + DexUshrLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public UshrLong2Addr(int left, int right) { + public DexUshrLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/XorInt.java b/src/main/java/com/android/tools/r8/dex/code/DexXorInt.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/XorInt.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorInt.java index 3e68cf6..063e107 100644 --- a/src/main/java/com/android/tools/r8/code/XorInt.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorInt.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorInt extends Format23x { +public class DexXorInt extends DexFormat23x { public static final int OPCODE = 0x97; public static final String NAME = "XorInt"; public static final String SMALI_NAME = "xor-int"; - XorInt(int high, BytecodeStream stream) { + DexXorInt(int high, BytecodeStream stream) { super(high, stream); } - public XorInt(int dest, int left, int right) { + public DexXorInt(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/XorInt2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/XorInt2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java index 1c0f1a6..b927dba 100644 --- a/src/main/java/com/android/tools/r8/code/XorInt2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorInt2Addr.java
@@ -1,21 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorInt2Addr extends Format12x { + +public class DexXorInt2Addr extends DexFormat12x { public static final int OPCODE = 0xb7; public static final String NAME = "XorInt2Addr"; public static final String SMALI_NAME = "xor-int/2addr"; - XorInt2Addr(int high, BytecodeStream stream) { + DexXorInt2Addr(int high, BytecodeStream stream) { super(high, stream); } - public XorInt2Addr(int left, int right) { + public DexXorInt2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/XorIntLit16.java b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/XorIntLit16.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java index 8efa8ac..e55d037 100644 --- a/src/main/java/com/android/tools/r8/code/XorIntLit16.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit16.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorIntLit16 extends Format22s { +public class DexXorIntLit16 extends DexFormat22s { public static final int OPCODE = 0xd7; public static final String NAME = "XorIntLit16"; public static final String SMALI_NAME = "xor-int/lit16"; - XorIntLit16(int high, BytecodeStream stream) { + DexXorIntLit16(int high, BytecodeStream stream) { super(high, stream); } - public XorIntLit16(int dest, int register, int constant) { + public DexXorIntLit16(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/XorIntLit8.java b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java similarity index 80% rename from src/main/java/com/android/tools/r8/code/XorIntLit8.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java index 8447abb..0cdceff 100644 --- a/src/main/java/com/android/tools/r8/code/XorIntLit8.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorIntLit8.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorIntLit8 extends Format22b { +public class DexXorIntLit8 extends DexFormat22b { public static final int OPCODE = 0xdf; public static final String NAME = "XorIntLit8"; public static final String SMALI_NAME = "xor-int/lit8"; - XorIntLit8(int high, BytecodeStream stream) { + DexXorIntLit8(int high, BytecodeStream stream) { super(high, stream); } - public XorIntLit8(int dest, int register, int constant) { + public DexXorIntLit8(int dest, int register, int constant) { super(dest, register, constant); }
diff --git a/src/main/java/com/android/tools/r8/code/XorLong.java b/src/main/java/com/android/tools/r8/dex/code/DexXorLong.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/XorLong.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorLong.java index c2f7b7f..53a3deb 100644 --- a/src/main/java/com/android/tools/r8/code/XorLong.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorLong.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorLong extends Format23x { +public class DexXorLong extends DexFormat23x { public static final int OPCODE = 0xA2; public static final String NAME = "XorLong"; public static final String SMALI_NAME = "xor-long"; - XorLong(int high, BytecodeStream stream) { + DexXorLong(int high, BytecodeStream stream) { super(high, stream); } - public XorLong(int dest, int left, int right) { + public DexXorLong(int dest, int left, int right) { super(dest, left, right); }
diff --git a/src/main/java/com/android/tools/r8/code/XorLong2Addr.java b/src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java similarity index 81% rename from src/main/java/com/android/tools/r8/code/XorLong2Addr.java rename to src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java index ec3f5ef..6e8ddb3 100644 --- a/src/main/java/com/android/tools/r8/code/XorLong2Addr.java +++ b/src/main/java/com/android/tools/r8/dex/code/DexXorLong2Addr.java
@@ -1,22 +1,22 @@ // Copyright (c) 2016, 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.code; +package com.android.tools.r8.dex.code; import com.android.tools.r8.ir.code.NumericType; import com.android.tools.r8.ir.conversion.IRBuilder; -public class XorLong2Addr extends Format12x { +public class DexXorLong2Addr extends DexFormat12x { public static final int OPCODE = 0xc2; public static final String NAME = "XorLong2Addr"; public static final String SMALI_NAME = "xor-long/2addr"; - XorLong2Addr(int high, BytecodeStream stream) { + DexXorLong2Addr(int high, BytecodeStream stream) { super(high, stream); } - public XorLong2Addr(int left, int right) { + public DexXorLong2Addr(int left, int right) { super(left, right); }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java new file mode 100644 index 0000000..7279ee7 --- /dev/null +++ b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
@@ -0,0 +1,47 @@ +// Copyright (c) 2022, 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.experimental.startup; + +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexType; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.PrunedItems; +import java.util.Collection; +import java.util.Collections; + +public class EmptyStartupOrder extends StartupOrder { + + EmptyStartupOrder() {} + + @Override + public boolean contains(DexType type) { + return false; + } + + @Override + public Collection<DexType> getClasses() { + return Collections.emptyList(); + } + + @Override + public boolean isEmpty() { + return true; + } + + @Override + public EmptyStartupOrder rewrittenWithLens(GraphLens graphLens) { + return this; + } + + @Override + public StartupOrder toStartupOrderForWriting(AppView<?> appView) { + return this; + } + + @Override + public EmptyStartupOrder withoutPrunedItems(PrunedItems prunedItems) { + return this; + } +}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java new file mode 100644 index 0000000..0427fc37 --- /dev/null +++ b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
@@ -0,0 +1,149 @@ +// Copyright (c) 2022, 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.experimental.startup; + +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.graph.DexType; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.PrunedItems; +import java.util.ArrayList; +import java.util.Collection; +import java.util.IdentityHashMap; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; + +public class NonEmptyStartupOrder extends StartupOrder { + + private final LinkedHashSet<DexType> startupClasses; + + NonEmptyStartupOrder(LinkedHashSet<DexType> startupClasses) { + assert !startupClasses.isEmpty(); + this.startupClasses = startupClasses; + } + + @Override + public boolean contains(DexType type) { + return startupClasses.contains(type); + } + + @Override + public Collection<DexType> getClasses() { + return startupClasses; + } + + @Override + public boolean isEmpty() { + return false; + } + + @Override + public StartupOrder rewrittenWithLens(GraphLens graphLens) { + LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size()); + for (DexType startupClass : startupClasses) { + DexType rewrittenStartupClass = graphLens.lookupType(startupClass); + rewrittenStartupClasses.add(rewrittenStartupClass); + } + return createNonEmpty(rewrittenStartupClasses); + } + + @Override + public StartupOrder toStartupOrderForWriting(AppView<?> appView) { + LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size()); + Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses = + new IdentityHashMap<>(); + for (DexProgramClass clazz : appView.appInfo().classes()) { + if (appView.getSyntheticItems().isSyntheticClass(clazz)) { + for (DexType synthesizingContextType : + appView.getSyntheticItems().getSynthesizingContextTypes(clazz.getType())) { + syntheticContextsToSyntheticClasses + .computeIfAbsent(synthesizingContextType, ignoreKey -> new ArrayList<>()) + .add(clazz); + } + } + } + for (DexType startupClass : startupClasses) { + addClassAndParentClasses( + startupClass, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView); + } + return createNonEmpty(rewrittenStartupClasses); + } + + private static boolean addClass( + DexProgramClass clazz, LinkedHashSet<DexType> rewrittenStartupClasses) { + return rewrittenStartupClasses.add(clazz.getType()); + } + + private static void addClassAndParentClasses( + DexType type, + LinkedHashSet<DexType> rewrittenStartupClasses, + Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses, + AppView<?> appView) { + DexProgramClass definition = appView.app().programDefinitionFor(type); + if (definition != null) { + addClassAndParentClasses( + definition, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView); + } + } + + private static void addClassAndParentClasses( + DexProgramClass clazz, + LinkedHashSet<DexType> rewrittenStartupClasses, + Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses, + AppView<?> appView) { + if (addClass(clazz, rewrittenStartupClasses)) { + addSyntheticClassesAndParentClasses( + clazz, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView); + addParentClasses( + clazz, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView); + } + } + + private static void addSyntheticClassesAndParentClasses( + DexProgramClass clazz, + LinkedHashSet<DexType> rewrittenStartupClasses, + Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses, + AppView<?> appView) { + List<DexProgramClass> derivedClasses = + syntheticContextsToSyntheticClasses.remove(clazz.getType()); + if (derivedClasses != null) { + for (DexProgramClass derivedClass : derivedClasses) { + addClassAndParentClasses( + derivedClass, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView); + } + } + } + + private static void addParentClasses( + DexProgramClass clazz, + LinkedHashSet<DexType> rewrittenStartupClasses, + Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses, + AppView<?> appView) { + clazz.forEachImmediateSupertype( + supertype -> + addClassAndParentClasses( + supertype, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView)); + } + + @Override + public StartupOrder withoutPrunedItems(PrunedItems prunedItems) { + LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size()); + for (DexType startupClass : startupClasses) { + if (!prunedItems.isRemoved(startupClass)) { + rewrittenStartupClasses.add(startupClass); + } + } + return createNonEmpty(rewrittenStartupClasses); + } + + private StartupOrder createNonEmpty(LinkedHashSet<DexType> startupClasses) { + if (startupClasses.isEmpty()) { + assert false; + return empty(); + } + return new NonEmptyStartupOrder(startupClasses); + } +}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java index 0c1425c..7e78009 100644 --- a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java +++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
@@ -14,6 +14,7 @@ import com.android.tools.r8.utils.Reporter; import com.android.tools.r8.utils.StringDiagnostic; import java.io.IOException; +import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.List; @@ -46,15 +47,18 @@ public static StartupConfiguration createStartupConfiguration( DexItemFactory dexItemFactory, Reporter reporter) { String propertyValue = System.getProperty("com.android.tools.r8.startup.config"); - if (propertyValue == null) { - return null; - } + return propertyValue != null + ? createStartupConfigurationFromFile(dexItemFactory, reporter, Paths.get(propertyValue)) + : null; + } + public static StartupConfiguration createStartupConfigurationFromFile( + DexItemFactory dexItemFactory, Reporter reporter, Path path) { reporter.warning("Use of startupconfig is experimental"); List<String> startupDescriptors; try { - startupDescriptors = FileUtils.readAllLines(Paths.get(propertyValue)); + startupDescriptors = FileUtils.readAllLines(path); } catch (IOException e) { throw reporter.fatalError(new ExceptionDiagnostic(e)); }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java new file mode 100644 index 0000000..da68a15 --- /dev/null +++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
@@ -0,0 +1,46 @@ +// Copyright (c) 2022, 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.experimental.startup; + +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexType; +import com.android.tools.r8.graph.GraphLens; +import com.android.tools.r8.graph.PrunedItems; +import com.android.tools.r8.utils.InternalOptions; +import java.util.Collection; +import java.util.LinkedHashSet; + +public abstract class StartupOrder { + + StartupOrder() {} + + public static StartupOrder createInitialStartupOrder(InternalOptions options) { + if (!options.getStartupOptions().hasStartupConfiguration()) { + return empty(); + } + StartupConfiguration startupConfiguration = + options.getStartupOptions().getStartupConfiguration(); + if (!startupConfiguration.hasStartupClasses()) { + return empty(); + } + return new NonEmptyStartupOrder(new LinkedHashSet<>(startupConfiguration.getStartupClasses())); + } + + public static StartupOrder empty() { + return new EmptyStartupOrder(); + } + + public abstract boolean contains(DexType type); + + public abstract Collection<DexType> getClasses(); + + public abstract boolean isEmpty(); + + public abstract StartupOrder rewrittenWithLens(GraphLens graphLens); + + public abstract StartupOrder toStartupOrderForWriting(AppView<?> appView); + + public abstract StartupOrder withoutPrunedItems(PrunedItems prunedItems); +}
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java index 2547884..836f1a5 100644 --- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java +++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -7,6 +7,7 @@ import static com.android.tools.r8.utils.TraversalContinuation.doBreak; import static com.android.tools.r8.utils.TraversalContinuation.doContinue; +import com.android.tools.r8.experimental.startup.StartupOrder; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.ir.analysis.type.InterfaceCollection; import com.android.tools.r8.ir.analysis.type.InterfaceCollection.Builder; @@ -48,15 +49,18 @@ DexApplication application, ClassToFeatureSplitMap classToFeatureSplitMap, MainDexInfo mainDexInfo, - GlobalSyntheticsStrategy globalSyntheticsStrategy) { + GlobalSyntheticsStrategy globalSyntheticsStrategy, + StartupOrder startupOrder) { return new AppInfoWithClassHierarchy( SyntheticItems.createInitialSyntheticItems(application, globalSyntheticsStrategy), classToFeatureSplitMap, mainDexInfo, - MissingClasses.empty()); + MissingClasses.empty(), + startupOrder); } private final ClassToFeatureSplitMap classToFeatureSplitMap; + private final StartupOrder startupOrder; /** Set of types that are mentioned in the program, but for which no definition exists. */ // TODO(b/175659048): Consider hoisting to AppInfo to allow using MissingClasses in D8 desugar. @@ -67,10 +71,12 @@ CommittedItems committedItems, ClassToFeatureSplitMap classToFeatureSplitMap, MainDexInfo mainDexInfo, - MissingClasses missingClasses) { + MissingClasses missingClasses, + StartupOrder startupOrder) { super(committedItems, mainDexInfo); this.classToFeatureSplitMap = classToFeatureSplitMap; this.missingClasses = missingClasses; + this.startupOrder = startupOrder; } // For desugaring. @@ -80,6 +86,7 @@ // TODO(b/175659048): Migrate the reporting of missing classes in D8 desugar to MissingClasses, // and use the missing classes from AppInfo instead of MissingClasses.empty(). this.missingClasses = MissingClasses.empty(); + this.startupOrder = StartupOrder.empty(); } public static AppInfoWithClassHierarchy createForDesugaring(AppInfo appInfo) { @@ -89,7 +96,11 @@ public final AppInfoWithClassHierarchy rebuildWithClassHierarchy(CommittedItems commit) { return new AppInfoWithClassHierarchy( - commit, getClassToFeatureSplitMap(), getMainDexInfo(), getMissingClasses()); + commit, + getClassToFeatureSplitMap(), + getMainDexInfo(), + getMissingClasses(), + getStartupOrder()); } public AppInfoWithClassHierarchy rebuildWithClassHierarchy( @@ -99,7 +110,8 @@ getSyntheticItems().commit(fn.apply(app())), getClassToFeatureSplitMap(), getMainDexInfo(), - getMissingClasses()); + getMissingClasses(), + getStartupOrder()); } @Override @@ -110,7 +122,8 @@ getSyntheticItems().commit(app()), getClassToFeatureSplitMap(), mainDexInfo, - getMissingClasses()); + getMissingClasses(), + getStartupOrder()); } @Override @@ -126,7 +139,8 @@ getSyntheticItems().commitPrunedItems(prunedItems), getClassToFeatureSplitMap().withoutPrunedItems(prunedItems), getMainDexInfo().withoutPrunedItems(prunedItems), - getMissingClasses()); + getMissingClasses(), + getStartupOrder().withoutPrunedItems(prunedItems)); } public ClassToFeatureSplitMap getClassToFeatureSplitMap() { @@ -137,6 +151,10 @@ return missingClasses; } + public StartupOrder getStartupOrder() { + return startupOrder; + } + @Override public boolean hasClassHierarchy() { assert checkIfObsolete();
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 1cc7843..6dd2ee7 100644 --- a/src/main/java/com/android/tools/r8/graph/AppView.java +++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.contexts.CompilationContext; import com.android.tools.r8.contexts.CompilationContext.ProcessorContext; import com.android.tools.r8.errors.dontwarn.DontWarnConfiguration; +import com.android.tools.r8.experimental.startup.StartupOrder; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.graph.DexValue.DexValueString; import com.android.tools.r8.graph.GraphLens.NonIdentityGraphLens; @@ -29,6 +30,7 @@ import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoFactory; import com.android.tools.r8.ir.optimize.library.LibraryMemberOptimizer; import com.android.tools.r8.ir.optimize.library.LibraryMethodSideEffectModelCollection; +import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.SeedMapper; import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagator; import com.android.tools.r8.optimize.interfaces.collection.OpenClosedInterfacesCollection; @@ -77,6 +79,7 @@ private GraphLens codeLens = GraphLens.getIdentityLens(); private GraphLens graphLens = GraphLens.getIdentityLens(); private InitClassLens initClassLens; + private NamingLens namingLens = NamingLens.getIdentityLens(); private ProguardCompatibilityActions proguardCompatibilityActions; private RootSet rootSet; private MainDexRootSet mainDexRootSet = null; @@ -201,12 +204,14 @@ DexApplication application, MainDexInfo mainDexInfo) { ClassToFeatureSplitMap classToFeatureSplitMap = ClassToFeatureSplitMap.createInitialClassToFeatureSplitMap(application.options); + StartupOrder startupOrder = StartupOrder.createInitialStartupOrder(application.options); AppInfoWithClassHierarchy appInfo = AppInfoWithClassHierarchy.createInitialAppInfoWithClassHierarchy( application, classToFeatureSplitMap, mainDexInfo, - GlobalSyntheticsStrategy.forSingleOutputMode()); + GlobalSyntheticsStrategy.forSingleOutputMode(), + startupOrder); return new AppView<>(appInfo, WholeProgramOptimizations.ON, defaultTypeRewriter(appInfo)); } @@ -244,8 +249,12 @@ return appInfo; } + public AppInfoWithClassHierarchy appInfoWithClassHierarchy() { + return hasClassHierarchy() ? appInfo.withClassHierarchy() : null; + } + public AppInfoWithLiveness appInfoWithLiveness() { - return appInfo.hasLiveness() ? appInfo.withLiveness() : null; + return hasLiveness() ? appInfo.withLiveness() : null; } public AppInfoWithClassHierarchy appInfoForDesugaring() { @@ -571,6 +580,14 @@ return getKeepInfo().getMethodInfo(method); } + public NamingLens getNamingLens() { + return namingLens; + } + + public void setNamingLens(NamingLens namingLens) { + this.namingLens = namingLens; + } + public boolean hasProguardCompatibilityActions() { return proguardCompatibilityActions != null; }
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 3a727a8..321c775 100644 --- a/src/main/java/com/android/tools/r8/graph/CfCode.java +++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -18,8 +18,8 @@ import com.android.tools.r8.cf.code.CfPosition; import com.android.tools.r8.cf.code.CfReturnVoid; import com.android.tools.r8.cf.code.CfTryCatch; -import com.android.tools.r8.code.Base5Format; -import com.android.tools.r8.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.DexBase5Format; import com.android.tools.r8.errors.InvalidDebugInfoException; import com.android.tools.r8.errors.Unimplemented; import com.android.tools.r8.errors.Unreachable; @@ -303,7 +303,7 @@ @Override public int estimatedDexCodeSizeUpperBoundInBytes() { - return estimatedSizeForInlining() * Base5Format.SIZE; + return estimatedSizeForInlining() * DexBase5Format.SIZE; } public int bytecodeSizeUpperBound() {
diff --git a/src/main/java/com/android/tools/r8/graph/ClasspathOrLibraryClass.java b/src/main/java/com/android/tools/r8/graph/ClasspathOrLibraryClass.java index da19912..d666539 100644 --- a/src/main/java/com/android/tools/r8/graph/ClasspathOrLibraryClass.java +++ b/src/main/java/com/android/tools/r8/graph/ClasspathOrLibraryClass.java
@@ -5,5 +5,14 @@ package com.android.tools.r8.graph; public interface ClasspathOrLibraryClass extends ClassDefinition, ClasspathOrLibraryDefinition { + + void appendInstanceField(DexEncodedField field); + DexClass asDexClass(); + + DexEncodedField lookupField(DexField field); + + static ClasspathOrLibraryClass asClasspathOrLibraryClass(DexClass clazz) { + return clazz != null ? clazz.asClasspathOrLibraryClass() : null; + } }
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java index 8152305..0edeb6f 100644 --- a/src/main/java/com/android/tools/r8/graph/Code.java +++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -3,8 +3,8 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; -import com.android.tools.r8.code.CfOrDexInstruction; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.CfOrDexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata; import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadata;
diff --git a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java index 07fd8c4..5569e34 100644 --- a/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java +++ b/src/main/java/com/android/tools/r8/graph/DefaultInstanceInitializerCode.java
@@ -9,11 +9,11 @@ import com.android.tools.r8.cf.code.CfInvoke; import com.android.tools.r8.cf.code.CfLoad; import com.android.tools.r8.cf.code.CfReturnVoid; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.ReturnVoid; import com.android.tools.r8.dex.CodeToKeep; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription; @@ -169,16 +169,17 @@ @Override public int codeSizeInBytes() { - return InvokeDirect.SIZE + ReturnVoid.SIZE; + return DexInvokeDirect.SIZE + DexReturnVoid.SIZE; } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { - getParentConstructor(context, rewriter.dexItemFactory()).collectIndexedItems(indexedItems); + getParentConstructor(context, rewriter.dexItemFactory()) + .collectIndexedItems(appView, indexedItems); } @Override @@ -369,9 +370,9 @@ GraphLens graphLens, LensCodeRewriterUtils lensCodeRewriter, ObjectToOffsetMapping mapping) { - new InvokeDirect(1, getParentConstructor(context, mapping.dexItemFactory()), 0, 0, 0, 0, 0) + new DexInvokeDirect(1, getParentConstructor(context, mapping.dexItemFactory()), 0, 0, 0, 0, 0) .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); - new ReturnVoid().write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); + new DexReturnVoid().write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java index d26278f..44ac005 100644 --- a/src/main/java/com/android/tools/r8/graph/DexAnnotation.java +++ b/src/main/java/com/android/tools/r8/graph/DexAnnotation.java
@@ -101,8 +101,8 @@ return visibility + " " + annotation; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - annotation.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + annotation.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java index d2d763e..c0060f3 100644 --- a/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java +++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationDirectory.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.utils.structural.CompareToVisitor; import java.util.ArrayList; import java.util.List; +import java.util.function.Consumer; public class DexAnnotationDirectory extends DexItem { @@ -41,6 +42,46 @@ } } + public void visitAnnotations( + Consumer<DexAnnotation> annotationConsumer, + Consumer<DexAnnotationSet> annotationSetConsumer, + Consumer<ParameterAnnotationsList> parameterAnnotationsListConsumer) { + visitAnnotationSet(clazz.annotations(), annotationConsumer, annotationSetConsumer); + clazz.forEachField( + field -> + visitAnnotationSet(field.annotations(), annotationConsumer, annotationSetConsumer)); + clazz.forEachMethod( + method -> { + visitAnnotationSet(method.annotations(), annotationConsumer, annotationSetConsumer); + visitParameterAnnotationsList( + method.getParameterAnnotations(), + annotationConsumer, + annotationSetConsumer, + parameterAnnotationsListConsumer); + }); + } + + private void visitAnnotationSet( + DexAnnotationSet annotationSet, + Consumer<DexAnnotation> annotationConsumer, + Consumer<DexAnnotationSet> annotationSetConsumer) { + annotationSetConsumer.accept(annotationSet); + for (DexAnnotation annotation : annotationSet.getAnnotations()) { + annotationConsumer.accept(annotation); + } + } + + private void visitParameterAnnotationsList( + ParameterAnnotationsList parameterAnnotationsList, + Consumer<DexAnnotation> annotationConsumer, + Consumer<DexAnnotationSet> annotationSetConsumer, + Consumer<ParameterAnnotationsList> parameterAnnotationsListConsumer) { + parameterAnnotationsListConsumer.accept(parameterAnnotationsList); + for (DexAnnotationSet annotationSet : parameterAnnotationsList.getAnnotationSets()) { + visitAnnotationSet(annotationSet, annotationConsumer, annotationSetConsumer); + } + } + public DexAnnotationSet getClazzAnnotations() { return clazz.annotations(); }
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java index f351642..a2be262 100644 --- a/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java +++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationElement.java
@@ -60,9 +60,9 @@ return name + "=" + value; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { name.collectIndexedItems(indexedItems); - value.collectIndexedItems(indexedItems); + value.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java index 40ff50e..bcddd66 100644 --- a/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java +++ b/src/main/java/com/android/tools/r8/graph/DexAnnotationSet.java
@@ -65,6 +65,10 @@ return this; } + public DexAnnotation[] getAnnotations() { + return annotations; + } + @Override public StructuralMapping<DexAnnotationSet> getStructuralMapping() { return DexAnnotationSet::specify; @@ -116,9 +120,9 @@ return false; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexAnnotation annotation : annotations) { - annotation.collectIndexedItems(indexedItems); + annotation.collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexCallSite.java b/src/main/java/com/android/tools/r8/graph/DexCallSite.java index 3aa03da..e3b49d1 100644 --- a/src/main/java/com/android/tools/r8/graph/DexCallSite.java +++ b/src/main/java/com/android/tools/r8/graph/DexCallSite.java
@@ -160,20 +160,20 @@ return builder.toString(); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { if (indexedItems.addCallSite(this)) { methodName.collectIndexedItems(indexedItems); - methodProto.collectIndexedItems(indexedItems); - bootstrapMethod.collectIndexedItems(indexedItems); + methodProto.collectIndexedItems(appView, indexedItems); + bootstrapMethod.collectIndexedItems(appView, indexedItems); for (DexValue arg : bootstrapArgs) { - arg.collectIndexedItems(indexedItems); + arg.collectIndexedItems(appView, indexedItems); } } } @Override void collectMixedSectionItems(MixedSectionCollection mixedItems) { - mixedItems.add(getEncodedArray()); + getEncodedArray().collectMixedSectionItems(mixedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java index a615b1f..a377b46 100644 --- a/src/main/java/com/android/tools/r8/graph/DexClass.java +++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -788,6 +788,10 @@ return type; } + public boolean hasSuperType() { + return superType != null; + } + public DexType getSuperType() { return superType; }
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 c99b310..0a485e7 100644 --- a/src/main/java/com/android/tools/r8/graph/DexCode.java +++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -3,14 +3,14 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; -import com.android.tools.r8.code.CfOrDexInstruction; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.SwitchPayload; import com.android.tools.r8.dex.CodeToKeep; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.JumboStringRewriter; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexSwitchPayload; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.DexCode.TryHandler.TypeAddrPair; import com.android.tools.r8.graph.DexDebugEvent.SetPositionFrame; @@ -60,13 +60,13 @@ public final int outgoingRegisterSize; public final Try[] tries; public final TryHandler[] handlers; - public final Instruction[] instructions; + public final DexInstruction[] instructions; public DexString highestSortingString; private DexDebugInfo debugInfo; private DexDebugInfoForWriting debugInfoForWriting; - private final BytecodeMetadata<Instruction> metadata; + private final BytecodeMetadata<DexInstruction> metadata; private static void specify(StructuralSpecification<DexCode, ?> spec) { spec.withInt(c -> c.registerSize) @@ -82,7 +82,7 @@ int registerSize, int insSize, int outsSize, - Instruction[] instructions, + DexInstruction[] instructions, Try[] tries, TryHandler[] handlers, DexDebugInfo debugInfo) { @@ -101,11 +101,11 @@ int registerSize, int insSize, int outsSize, - Instruction[] instructions, + DexInstruction[] instructions, Try[] tries, TryHandler[] handlers, DexDebugInfo debugInfo, - BytecodeMetadata<Instruction> metadata) { + BytecodeMetadata<DexInstruction> metadata) { this.incomingRegisterSize = insSize; this.registerSize = registerSize; this.outgoingRegisterSize = outsSize; @@ -126,7 +126,7 @@ } @Override - public BytecodeMetadata<Instruction> getMetadata() { + public BytecodeMetadata<DexInstruction> getMetadata() { return metadata; } @@ -135,7 +135,7 @@ return getMetadata(instruction.asDexInstruction()); } - public BytecodeInstructionMetadata getMetadata(Instruction instruction) { + public BytecodeInstructionMetadata getMetadata(DexInstruction instruction) { return metadata.getMetadata(instruction); } @@ -157,8 +157,8 @@ firstJumboString = mapping.getFirstString(); } else { assert highestSortingString != null - || Arrays.stream(instructions).noneMatch(Instruction::isConstString); - assert Arrays.stream(instructions).noneMatch(Instruction::isDexItemBasedConstString); + || Arrays.stream(instructions).noneMatch(DexInstruction::isConstString); + assert Arrays.stream(instructions).noneMatch(DexInstruction::isDexItemBasedConstString); if (highestSortingString != null && highestSortingString.isGreaterThanOrEqualTo(mapping.getFirstJumboString())) { firstJumboString = mapping.getFirstJumboString(); @@ -171,7 +171,7 @@ @Override public void setCallSiteContexts(ProgramMethod method) { - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { DexCallSite callSite = instruction.getCallSite(); if (callSite != null) { callSite.setContext(method.getReference(), instruction.getOffset()); @@ -363,7 +363,7 @@ @Override public boolean isEmptyVoidMethod() { - return instructions.length == 1 && instructions[0] instanceof ReturnVoid; + return instructions.length == 1 && instructions[0] instanceof DexReturnVoid; } @Override @@ -421,7 +421,7 @@ private void internalRegisterCodeReferences(DexClassAndMethod method, UseRegistry registry) { assert registry.getTraversalContinuation().shouldContinue(); - for (Instruction insn : instructions) { + for (DexInstruction insn : instructions) { insn.registerUse(registry); if (registry.getTraversalContinuation().shouldBreak()) { return; @@ -456,8 +456,8 @@ builder.append("------------------------------------------------------------\n"); // Collect payload users. - Map<Integer, Instruction> payloadUsers = new HashMap<>(); - for (Instruction dex : instructions) { + Map<Integer, DexInstruction> payloadUsers = new HashMap<>(); + for (DexInstruction dex : instructions) { if (dex.hasPayload()) { payloadUsers.put(dex.getOffset() + dex.getPayloadOffset(), dex); } @@ -472,7 +472,7 @@ } int instructionNumber = 0; Map<Integer, DebugLocalInfo> locals = Collections.emptyMap(); - for (Instruction insn : instructions) { + for (DexInstruction insn : instructions) { debugInfo = advanceToOffset(insn.getOffset() - 1, debugInfo, debugInfoIterator); while (debugInfo != null && debugInfo.address == insn.getOffset()) { if (debugInfo.lineEntry || !locals.equals(debugInfo.locals)) { @@ -484,7 +484,7 @@ StringUtils.appendLeftPadded(builder, Integer.toString(instructionNumber++), 5); builder.append(": "); if (insn.isSwitchPayload()) { - Instruction payloadUser = payloadUsers.get(insn.getOffset()); + DexInstruction payloadUser = payloadUsers.get(insn.getOffset()); builder.append(insn.toString(naming, payloadUser)); } else { builder.append(insn.toString(naming)); @@ -494,7 +494,7 @@ if (isPcBasedInfo) { builder.append(getDebugInfo()).append("\n"); } else if (debugInfoIterator.hasNext()) { - Instruction lastInstruction = ArrayUtils.last(instructions); + DexInstruction lastInstruction = ArrayUtils.last(instructions); debugInfo = advanceToOffset(lastInstruction.getOffset(), debugInfo, debugInfoIterator); if (debugInfo != null) { throw new Unreachable("Could not print all debug information."); @@ -531,12 +531,12 @@ public String toSmaliString(ClassNameMapper naming) { StringBuilder builder = new StringBuilder(); // Find labeled targets. - Map<Integer, Instruction> payloadUsers = new HashMap<>(); + Map<Integer, DexInstruction> payloadUsers = new HashMap<>(); Set<Integer> labledTargets = new HashSet<>(); // Collect payload users and labeled targets for non-payload instructions. - for (Instruction dex : instructions) { + for (DexInstruction dex : instructions) { int[] targets = dex.getTargets(); - if (targets != Instruction.NO_TARGETS && targets != Instruction.EXIT_TARGET) { + if (targets != DexInstruction.NO_TARGETS && targets != DexInstruction.EXIT_TARGET) { assert targets.length <= 2; // For if instructions the second target is the fallthrough, for which no label is needed. labledTargets.add(dex.getOffset() + targets[0]); @@ -546,11 +546,11 @@ } } // Collect labeled targets for payload instructions. - for (Instruction dex : instructions) { + for (DexInstruction dex : instructions) { if (dex.isSwitchPayload()) { - Instruction payloadUser = payloadUsers.get(dex.getOffset()); - if (dex instanceof SwitchPayload) { - SwitchPayload payload = (SwitchPayload) dex; + DexInstruction payloadUser = payloadUsers.get(dex.getOffset()); + if (dex instanceof DexSwitchPayload) { + DexSwitchPayload payload = (DexSwitchPayload) dex; for (int target : payload.switchTargetOffsets()) { labledTargets.add(payloadUser.getOffset() + target); } @@ -558,14 +558,14 @@ } } // Generate smali for all instructions. - for (Instruction dex : instructions) { + for (DexInstruction dex : instructions) { if (labledTargets.contains(dex.getOffset())) { builder.append(" :label_"); builder.append(dex.getOffset()); builder.append("\n"); } if (dex.isSwitchPayload()) { - Instruction payloadUser = payloadUsers.get(dex.getOffset()); + DexInstruction payloadUser = payloadUsers.get(dex.getOffset()); builder.append(dex.toSmaliString(payloadUser)).append('\n'); } else { builder.append(dex.toSmaliString(naming)).append('\n'); @@ -589,14 +589,14 @@ @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { highestSortingString = null; - for (Instruction insn : instructions) { + for (DexInstruction insn : instructions) { assert !insn.isDexItemBasedConstString(); - insn.collectIndexedItems(indexedItems, context, graphLens, rewriter); + insn.collectIndexedItems(appView, indexedItems, context, rewriter); if (insn.isConstString()) { updateHighestSortingString(insn.asConstString().getString()); } else if (insn.isConstStringJumbo()) { @@ -604,10 +604,10 @@ } } if (debugInfo != null) { - getDebugInfoForWriting().collectIndexedItems(indexedItems, graphLens); + getDebugInfoForWriting().collectIndexedItems(appView, indexedItems); } for (TryHandler handler : handlers) { - handler.collectIndexedItems(indexedItems, graphLens); + handler.collectIndexedItems(appView, indexedItems); } } @@ -665,7 +665,7 @@ @Override public int codeSizeInBytes() { - Instruction last = instructions[instructions.length - 1]; + DexInstruction last = instructions[instructions.length - 1]; assert last.hasOffset(); int result = last.getOffset() + last.getSize(); assert result == computeCodeSizeInBytes(); @@ -674,7 +674,7 @@ private int computeCodeSizeInBytes() { int size = 0; - for (Instruction insn : instructions) { + for (DexInstruction insn : instructions) { size += insn.getSize(); } return size; @@ -682,7 +682,7 @@ @Override public void writeKeepRulesForDesugaredLibrary(CodeToKeep desugaredLibraryCodeToKeep) { - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { DexMethod method = instruction.getMethod(); DexField field = instruction.getField(); if (field != null) { @@ -707,7 +707,7 @@ GraphLens graphLens, LensCodeRewriterUtils lensCodeRewriter, ObjectToOffsetMapping mapping) { - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { instruction.write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); } } @@ -813,9 +813,9 @@ return Equatable.equalsImpl(this, other); } - public void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (TypeAddrPair pair : pairs) { - pair.collectIndexedItems(indexedItems, graphLens); + pair.collectIndexedItems(appView, indexedItems); } } @@ -877,9 +877,9 @@ return lens.lookupType(type); } - public void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens) { - DexType rewritten = getType(graphLens); - rewritten.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + DexType rewritten = getType(appView.graphLens()); + rewritten.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java index 27aacbe..16bf079 100644 --- a/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java +++ b/src/main/java/com/android/tools/r8/graph/DexDebugEvent.java
@@ -23,7 +23,7 @@ public static final DexDebugEvent[] EMPTY_ARRAY = {}; - public void collectIndexedItems(IndexedItemCollection collection, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection collection) { // Empty by default. } @@ -350,13 +350,13 @@ } @Override - public void collectIndexedItems(IndexedItemCollection collection, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection collection) { if (name != null) { name.collectIndexedItems(collection); } if (type != null) { - DexType rewritten = graphLens.lookupType(type); - rewritten.collectIndexedItems(collection); + DexType rewritten = appView.graphLens().lookupType(type); + rewritten.collectIndexedItems(appView, collection); } if (signature != null) { signature.collectIndexedItems(collection); @@ -524,7 +524,7 @@ } @Override - public void collectIndexedItems(IndexedItemCollection collection, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection collection) { fileName.collectIndexedItems(collection); }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java index 09f740e..b6f5fd9 100644 --- a/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java +++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfo.java
@@ -3,11 +3,11 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.dex.DebugBytecodeWriter; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.utils.ArrayUtils; import com.android.tools.r8.utils.LebUtils; @@ -144,7 +144,7 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { // No indexed items to collect. } @@ -255,14 +255,14 @@ return visitor.visit(this, other.asEventBasedInfo(), EventBasedDebugInfo::specify); } - public void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexString parameter : parameters) { if (parameter != null) { parameter.collectIndexedItems(indexedItems); } } for (DexDebugEvent event : events) { - event.collectIndexedItems(indexedItems, graphLens); + event.collectIndexedItems(appView, indexedItems); } } @@ -298,7 +298,7 @@ List<DexDebugEvent> events = new ArrayList<>(code.instructions.length); int pc = 0; int delta = 0; - for (Instruction instruction : code.instructions) { + for (DexInstruction instruction : code.instructions) { if (instruction.canThrow()) { DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary(delta, delta, events, factory); pc += delta; @@ -337,8 +337,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens) { - super.collectIndexedItems(indexedItems, graphLens); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + super.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java b/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java index 5f94db9..75cdd80 100644 --- a/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java +++ b/src/main/java/com/android/tools/r8/graph/DexDebugInfoForWriting.java
@@ -13,7 +13,7 @@ void collectMixedSectionItems(MixedSectionCollection collection); - void collectIndexedItems(IndexedItemCollection indexedItems, GraphLens graphLens); + void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems); int estimatedWriteSize();
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java index e338ef5..0d4f388 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedAnnotation.java
@@ -41,10 +41,10 @@ return DexEncodedAnnotation::specify; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - type.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + type.collectIndexedItems(appView, indexedItems); for (DexAnnotationElement element : elements) { - element.collectIndexedItems(indexedItems); + element.collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java b/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java index 19ec6c2..4192720 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedArray.java
@@ -15,9 +15,9 @@ this.values = values; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexValue value : values) { - value.collectIndexedItems(indexedItems); + value.collectIndexedItems(appView, indexedItems); } }
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 4196ca2..73e3420 100644 --- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java +++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -29,16 +29,16 @@ import com.android.tools.r8.cf.code.CfStackInstruction.Opcode; import com.android.tools.r8.cf.code.CfStore; import com.android.tools.r8.cf.code.CfThrow; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InstanceOf; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.NewInstance; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.Throw; -import com.android.tools.r8.code.XorIntLit8; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInstanceOf; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexNewInstance; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexThrow; +import com.android.tools.r8.dex.code.DexXorIntLit8; import com.android.tools.r8.errors.InternalCompilerError; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.DexAnnotation.AnnotatedKind; @@ -889,13 +889,11 @@ return getReference().toSourceString(); } - /** - * Generates a {@link DexCode} object for the given instructions. - */ + /** Generates a {@link DexCode} object for the given instructions. */ private DexCode generateCodeFromTemplate( - int numberOfRegisters, int outRegisters, Instruction... instructions) { + int numberOfRegisters, int outRegisters, DexInstruction... instructions) { int offset = 0; - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { instruction.setOffset(offset); offset += instruction.getSize(); } @@ -937,13 +935,13 @@ } public DexCode buildInstanceOfDexCode(DexType type, boolean negate) { - Instruction[] instructions = new Instruction[2 + BooleanUtils.intValue(negate)]; + DexInstruction[] instructions = new DexInstruction[2 + BooleanUtils.intValue(negate)]; int i = 0; - instructions[i++] = new InstanceOf(0, 0, type); + instructions[i++] = new DexInstanceOf(0, 0, type); if (negate) { - instructions[i++] = new XorIntLit8(0, 0, 1); + instructions[i++] = new DexXorIntLit8(0, 0, 1); } - instructions[i] = new Return(0); + instructions[i] = new DexReturn(0); return generateCodeFromTemplate(1, 0, instructions); } @@ -998,12 +996,12 @@ return generateCodeFromTemplate( 2, 2, - new ConstString(0, tag), - new ConstString(1, message), - new InvokeStatic(2, logMethod, 0, 1, 0, 0, 0), - new NewInstance(0, exceptionType), - new InvokeDirect(2, exceptionInitMethod, 0, 1, 0, 0, 0), - new Throw(0)); + new DexConstString(0, tag), + new DexConstString(1, message), + new DexInvokeStatic(2, logMethod, 0, 1, 0, 0, 0), + new DexNewInstance(0, exceptionType), + new DexInvokeDirect(2, exceptionInitMethod, 0, 1, 0, 0, 0), + new DexThrow(0)); } private CfCode toCfCodeThatLogsError(DexItemFactory itemFactory) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexField.java b/src/main/java/com/android/tools/r8/graph/DexField.java index 1f86536..9fbbdb1 100644 --- a/src/main/java/com/android/tools/r8/graph/DexField.java +++ b/src/main/java/com/android/tools/r8/graph/DexField.java
@@ -143,11 +143,11 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { if (indexedItems.addField(this)) { - holder.collectIndexedItems(indexedItems); - type.collectIndexedItems(indexedItems); - indexedItems.getRenamedName(this).collectIndexedItems(indexedItems); + holder.collectIndexedItems(appView, indexedItems); + type.collectIndexedItems(appView, indexedItems); + appView.getNamingLens().lookupName(this).collectIndexedItems(indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java index 5c9dad2..5bac75e 100644 --- a/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java +++ b/src/main/java/com/android/tools/r8/graph/DexMemberAnnotation.java
@@ -44,9 +44,9 @@ super(item, annotations); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - item.collectIndexedItems(indexedItems); - annotations.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + item.collectIndexedItems(appView, indexedItems); + annotations.collectIndexedItems(appView, indexedItems); } } @@ -56,9 +56,9 @@ super(item, annotations); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - item.collectIndexedItems(indexedItems); - annotations.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + item.collectIndexedItems(appView, indexedItems); + annotations.collectIndexedItems(appView, indexedItems); } } @@ -69,9 +69,9 @@ super(item, annotations); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - item.collectIndexedItems(indexedItems); - annotations.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + item.collectIndexedItems(appView, indexedItems); + annotations.collectIndexedItems(appView, indexedItems); } } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethod.java b/src/main/java/com/android/tools/r8/graph/DexMethod.java index 466e1cf..2fbdbdc 100644 --- a/src/main/java/com/android/tools/r8/graph/DexMethod.java +++ b/src/main/java/com/android/tools/r8/graph/DexMethod.java
@@ -174,23 +174,23 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - if (collectIndexedItemsExceptName(indexedItems)) { - collectIndexedItemsName(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + if (collectIndexedItemsExceptName(appView, indexedItems)) { + collectIndexedItemsName(appView, indexedItems); } } - boolean collectIndexedItemsExceptName(IndexedItemCollection indexedItems) { + boolean collectIndexedItemsExceptName(AppView<?> appView, IndexedItemCollection indexedItems) { if (indexedItems.addMethod(this)) { - holder.collectIndexedItems(indexedItems); - proto.collectIndexedItems(indexedItems); + holder.collectIndexedItems(appView, indexedItems); + proto.collectIndexedItems(appView, indexedItems); return true; } return false; } - void collectIndexedItemsName(IndexedItemCollection indexedItems) { - indexedItems.getRenamedName(this).collectIndexedItems(indexedItems); + void collectIndexedItemsName(AppView<?> appView, IndexedItemCollection indexedItems) { + appView.getNamingLens().lookupName(this).collectIndexedItems(indexedItems); } @Override @@ -269,6 +269,10 @@ return toSourceString(false, false); } + public String toSourceStringWithoutReturnType() { + return toSourceString(true, false); + } + private String toSourceString(boolean includeHolder, boolean includeReturnType) { StringBuilder builder = new StringBuilder(); if (includeReturnType) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java index 63c3261..8859c3c 100644 --- a/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java +++ b/src/main/java/com/android/tools/r8/graph/DexMethodHandle.java
@@ -254,22 +254,22 @@ return builder.toString(); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { if (indexedItems.addMethodHandle(this)) { if (member.isDexField()) { DexField field = member.asDexField(); - field.collectIndexedItems(indexedItems); + field.collectIndexedItems(appView, indexedItems); } else { DexMethod method = member.asDexMethod(); if (rewrittenTarget != null) { // If there is a rewritten target we need to use that to get the right name of the // targeted method (only member rebound methods take part in naming). The rest of the // indexed items are collected from method. - if (method.collectIndexedItemsExceptName(indexedItems)) { - rewrittenTarget.collectIndexedItemsName(indexedItems); + if (method.collectIndexedItemsExceptName(appView, indexedItems)) { + rewrittenTarget.collectIndexedItemsName(appView, indexedItems); } } else { - method.collectIndexedItems(indexedItems); + method.collectIndexedItems(appView, indexedItems); } } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java index 5e30d52..46bebdc 100644 --- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java +++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -401,30 +401,30 @@ } public void collectIndexedItems( - IndexedItemCollection indexedItems, GraphLens graphLens, LensCodeRewriterUtils rewriter) { + AppView<?> appView, IndexedItemCollection indexedItems, LensCodeRewriterUtils rewriter) { if (indexedItems.addClass(this)) { - type.collectIndexedItems(indexedItems); + type.collectIndexedItems(appView, indexedItems); if (superType != null) { - superType.collectIndexedItems(indexedItems); + superType.collectIndexedItems(appView, indexedItems); } else { assert type.toDescriptorString().equals("Ljava/lang/Object;"); } if (sourceFile != null) { sourceFile.collectIndexedItems(indexedItems); } - annotations().collectIndexedItems(indexedItems); + annotations().collectIndexedItems(appView, indexedItems); if (interfaces != null) { - interfaces.collectIndexedItems(indexedItems); + interfaces.collectIndexedItems(appView, indexedItems); } if (getEnclosingMethodAttribute() != null) { - getEnclosingMethodAttribute().collectIndexedItems(indexedItems); + getEnclosingMethodAttribute().collectIndexedItems(appView, indexedItems); } for (InnerClassAttribute attribute : getInnerClasses()) { - attribute.collectIndexedItems(indexedItems); + attribute.collectIndexedItems(appView, indexedItems); } // We are explicitly not adding items referenced in signatures. - forEachProgramField(field -> field.collectIndexedItems(indexedItems)); - forEachProgramMethod(method -> method.collectIndexedItems(indexedItems, graphLens, rewriter)); + forEachProgramField(field -> field.collectIndexedItems(appView, indexedItems)); + forEachProgramMethod(method -> method.collectIndexedItems(appView, indexedItems, rewriter)); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProto.java b/src/main/java/com/android/tools/r8/graph/DexProto.java index 990eccc..80ff41d 100644 --- a/src/main/java/com/android/tools/r8/graph/DexProto.java +++ b/src/main/java/com/android/tools/r8/graph/DexProto.java
@@ -96,11 +96,11 @@ return "Proto " + shorty + " " + returnType + " " + parameters; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { if (indexedItems.addProto(this)) { shorty.collectIndexedItems(indexedItems); - returnType.collectIndexedItems(indexedItems); - parameters.collectIndexedItems(indexedItems); + returnType.collectIndexedItems(appView, indexedItems); + parameters.collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexReference.java b/src/main/java/com/android/tools/r8/graph/DexReference.java index e813d7c..6956170 100644 --- a/src/main/java/com/android/tools/r8/graph/DexReference.java +++ b/src/main/java/com/android/tools/r8/graph/DexReference.java
@@ -45,7 +45,7 @@ throw new Unreachable(); } - public abstract void collectIndexedItems(IndexedItemCollection indexedItems); + public abstract void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems); public abstract int compareTo(DexReference other);
diff --git a/src/main/java/com/android/tools/r8/graph/DexType.java b/src/main/java/com/android/tools/r8/graph/DexType.java index 8a60b81..df11e7e 100644 --- a/src/main/java/com/android/tools/r8/graph/DexType.java +++ b/src/main/java/com/android/tools/r8/graph/DexType.java
@@ -238,9 +238,9 @@ } @Override - public void collectIndexedItems(IndexedItemCollection collection) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection collection) { if (collection.addType(this)) { - collection.getRenamedDescriptor(this).collectIndexedItems(collection); + appView.getNamingLens().lookupDescriptor(this).collectIndexedItems(collection); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexTypeList.java b/src/main/java/com/android/tools/r8/graph/DexTypeList.java index f07c38e..afba589 100644 --- a/src/main/java/com/android/tools/r8/graph/DexTypeList.java +++ b/src/main/java/com/android/tools/r8/graph/DexTypeList.java
@@ -109,9 +109,9 @@ return Arrays.hashCode(values); } - void collectIndexedItems(IndexedItemCollection indexedItems) { + void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexType type : values) { - type.collectIndexedItems(indexedItems); + type.collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java index 52a57bf..2cb6abd 100644 --- a/src/main/java/com/android/tools/r8/graph/DexValue.java +++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -350,7 +350,7 @@ dest.putByte((byte) ((arg << 5) | kind.toByte())); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { // Intentionally left empty } @@ -1218,7 +1218,7 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { value.collectIndexedItems(indexedItems); } @@ -1305,8 +1305,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } public NameComputationInfo<?> getNameComputationInfo() { @@ -1384,8 +1384,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1426,8 +1426,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1468,8 +1468,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1510,8 +1510,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1562,8 +1562,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1606,9 +1606,9 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexValue value : values) { - value.collectIndexedItems(indexedItems); + value.collectIndexedItems(appView, indexedItems); } } @@ -1719,8 +1719,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override @@ -1994,8 +1994,8 @@ } @Override - public void collectIndexedItems(IndexedItemCollection indexedItems) { - value.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + value.collectIndexedItems(appView, indexedItems); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java index ef6bd3b..1458f08 100644 --- a/src/main/java/com/android/tools/r8/graph/DexWritableCode.java +++ b/src/main/java/com/android/tools/r8/graph/DexWritableCode.java
@@ -54,9 +54,9 @@ int codeSizeInBytes(); void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter); void collectMixedSectionItems(MixedSectionCollection mixedItems);
diff --git a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java index d2ea75e..4062f96 100644 --- a/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java +++ b/src/main/java/com/android/tools/r8/graph/EnclosingMethodAttribute.java
@@ -81,12 +81,12 @@ enclosingMethod == ((EnclosingMethodAttribute) obj).enclosingMethod; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { if (enclosingClass != null) { - enclosingClass.collectIndexedItems(indexedItems); + enclosingClass.collectIndexedItems(appView, indexedItems); } if (enclosingMethod != null) { - enclosingMethod.collectIndexedItems(indexedItems); + enclosingMethod.collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolution.java b/src/main/java/com/android/tools/r8/graph/FieldResolution.java index 3dcd872..ce7cbd3 100644 --- a/src/main/java/com/android/tools/r8/graph/FieldResolution.java +++ b/src/main/java/com/android/tools/r8/graph/FieldResolution.java
@@ -28,35 +28,40 @@ definitionFor .contextIndependentDefinitionForWithResolutionResult(type) .forEachClassResolutionResult( - clazz -> builder.addResolutionResult(resolveFieldOn(clazz, field))); + clazz -> resolveFieldOn(clazz, field, clazz, SetUtils.newIdentityHashSet(8), builder)); return builder.buildOrIfEmpty(FieldResolutionResult.failure()); } public FieldResolutionResult resolveFieldOn(DexClass holder, DexField field) { assert holder != null; - return resolveFieldOn(holder, field, holder, SetUtils.newIdentityHashSet(8)); + FieldResolutionResult.Builder builder = FieldResolutionResult.builder(); + resolveFieldOn(holder, field, holder, SetUtils.newIdentityHashSet(8), builder); + return builder.buildOrIfEmpty(FieldResolutionResult.failure()); } - private FieldResolutionResult resolveFieldOn( + private void resolveFieldOn( DexClass holder, DexField field, DexClass initialResolutionHolder, - Set<DexType> visitedInterfaces) { + Set<DexType> visitedInterfaces, + FieldResolutionResult.Builder builder) { assert holder != null; // Step 1: Class declares the field. DexEncodedField definition = holder.lookupField(field); if (definition != null) { - return createSingleFieldResolutionResult(initialResolutionHolder, holder, definition); + builder.addResolutionResult( + createSingleFieldResolutionResult(initialResolutionHolder, holder, definition)); + return; } // Step 2: Apply recursively to direct superinterfaces. First match succeeds. FieldResolutionResult result = resolveFieldOnDirectInterfaces(initialResolutionHolder, holder, field, visitedInterfaces); if (result != null) { - return result; + builder.addResolutionResult(result); + return; } // Step 3: Apply recursively to superclass. if (holder.superType != null) { - FieldResolutionResult.Builder builder = FieldResolutionResult.builder(); definitionFor .contextIndependentDefinitionForWithResolutionResult(holder.superType) .forEachClassResolutionResult( @@ -66,12 +71,12 @@ if (holder.isLibraryClass() && !superClass.isLibraryClass()) { return; } - builder.addResolutionResult( - resolveFieldOn(superClass, field, initialResolutionHolder, visitedInterfaces)); + resolveFieldOn( + superClass, field, initialResolutionHolder, visitedInterfaces, builder); }); - return builder.buildOrIfEmpty(null); + } else { + builder.addResolutionResult(FieldResolutionResult.failure()); } - return FieldResolutionResult.failure(); } private FieldResolutionResult resolveFieldOnDirectInterfaces( @@ -91,9 +96,12 @@ if (clazz.isLibraryClass() && !ifaceClass.isLibraryClass()) { return; } - builder.addResolutionResult( + FieldResolutionResult otherResult = resolveFieldOnInterface( - initialResolutionHolder, ifaceClass, field, visitedInterfaces)); + initialResolutionHolder, ifaceClass, field, visitedInterfaces); + if (otherResult != null) { + builder.addResolutionResult(otherResult); + } }); FieldResolutionResult fieldResolutionResult = builder.buildOrIfEmpty(null); if (fieldResolutionResult != null) {
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java index 029b8e4..196864a 100644 --- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java +++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -504,6 +504,7 @@ private Builder() {} public void addResolutionResult(FieldResolutionResult otherResult) { + assert otherResult != null; if (currentResult == null) { currentResult = otherResult; return;
diff --git a/src/main/java/com/android/tools/r8/graph/InnerClassAttribute.java b/src/main/java/com/android/tools/r8/graph/InnerClassAttribute.java index bb0fbf8..d2f5628 100644 --- a/src/main/java/com/android/tools/r8/graph/InnerClassAttribute.java +++ b/src/main/java/com/android/tools/r8/graph/InnerClassAttribute.java
@@ -87,10 +87,10 @@ access); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - inner.collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + inner.collectIndexedItems(appView, indexedItems); if (outer != null) { - outer.collectIndexedItems(indexedItems); + outer.collectIndexedItems(appView, indexedItems); } if (innerName != null) { innerName.collectIndexedItems(indexedItems);
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolution.java b/src/main/java/com/android/tools/r8/graph/MethodResolution.java index 983c69e..f7271b7 100644 --- a/src/main/java/com/android/tools/r8/graph/MethodResolution.java +++ b/src/main/java/com/android/tools/r8/graph/MethodResolution.java
@@ -658,8 +658,13 @@ // as a target. For deterministic resolution, we return the first mapped method (of the // linked map). if (nonAbstractOnComplete.isEmpty()) { - return singleResultHelper( - initialResolutionHolder, firstNonNullEntry(maximallySpecificMethodsOnCompletePaths)); + Entry<DexClass, DexEncodedMethod> abstractMethod = + firstNonNullEntry(maximallySpecificMethodsOnCompletePaths); + if (abstractMethod == null) { + abstractMethod = firstNonNullEntry(maximallySpecificMethodsOnIncompletePaths); + } + assert abstractMethod != null && abstractMethod.getValue().isAbstract(); + return singleResultHelper(initialResolutionHolder, abstractMethod); } else { // If there is exactly one non-abstract method (a default method) it is the resolution // target. @@ -717,7 +722,6 @@ return entry; } } - assert false : "Should not be called on a collection without any non-null candidates"; return null; } }
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java index 3d987c1..6173bef 100644 --- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java +++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -18,17 +18,16 @@ import it.unimi.dsi.fastutil.objects.Reference2IntMap.Entry; import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; import java.util.List; import java.util.function.Consumer; -import java.util.stream.Collectors; public class ObjectToOffsetMapping { private final static int NOT_FOUND = -1; - private final static int NOT_SET = -2; private final int lazyDexStringsCount; private final AppView<?> appView; @@ -54,7 +53,6 @@ public ObjectToOffsetMapping( AppView<?> appView, - NamingLens namingLens, LensCodeRewriterUtils lensCodeRewriter, Collection<DexProgramClass> classes, Collection<DexProto> protos, @@ -78,7 +76,7 @@ this.lazyDexStringsCount = lazyDexStringsCount; this.appView = appView; this.graphLens = appView.graphLens(); - this.namingLens = namingLens; + this.namingLens = appView.getNamingLens(); this.initClassLens = appView.initClassLens(); this.lensCodeRewriter = lensCodeRewriter; timing.begin("Sort strings"); @@ -94,7 +92,7 @@ new CompareToVisitorWithTypeTable(namingLens, this.strings::getInt, this.types::getInt); timing.end(); timing.begin("Sort classes"); - this.classes = sortClasses(appView.appInfo(), classes, namingLens); + this.classes = sortClasses(classes, visitor); timing.end(); timing.begin("Sort protos"); this.protos = createSortedMap(protos, compare(visitor), this::failOnOverflow); @@ -241,20 +239,19 @@ } } - private static DexProgramClass[] sortClasses( - AppInfo appInfo, Collection<DexProgramClass> classes, NamingLens namingLens) { + private DexProgramClass[] sortClasses( + Collection<DexProgramClass> classes, CompareToVisitor visitor) { // Collect classes in subtyping order, based on a sorted list of classes to start with. - ProgramClassDepthsMemoized classDepths = new ProgramClassDepthsMemoized(appInfo); - List<DexProgramClass> sortedClasses = - classes.stream() - .sorted( - (x, y) -> { - int dx = classDepths.getDepth(x); - int dy = classDepths.getDepth(y); - return dx != dy ? dx - dy : x.type.compareToWithNamingLens(y.type, namingLens); - }) - .collect(Collectors.toList()); - return sortedClasses.toArray(DexProgramClass.EMPTY_ARRAY); + ProgramClassDepthsMemoized classDepths = new ProgramClassDepthsMemoized(appView.appInfo()); + DexProgramClass[] sortedClasses = classes.toArray(DexProgramClass.EMPTY_ARRAY); + Arrays.sort( + sortedClasses, + (x, y) -> { + int dx = classDepths.getDepth(x); + int dy = classDepths.getDepth(y); + return dx != dy ? dx - dy : visitor.visitDexType(x.type, y.type); + }); + return sortedClasses; } private static <T> Collection<T> keysOrEmpty(Reference2IntLinkedOpenHashMap<T> map) { @@ -329,7 +326,6 @@ private <T extends IndexedDexItem> int getOffsetFor(T item, Reference2IntMap<T> map) { int index = map.getInt(item); - assert index != NOT_SET : "Index was not set: " + item; assert index != NOT_FOUND : "Missing dependency: " + item; return index; }
diff --git a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java index fdda61b..5f7c865 100644 --- a/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java +++ b/src/main/java/com/android/tools/r8/graph/ParameterAnnotationsList.java
@@ -119,9 +119,9 @@ return false; } - public void collectIndexedItems(IndexedItemCollection indexedItems) { + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { for (DexAnnotationSet value : values) { - value.collectIndexedItems(indexedItems); + value.collectIndexedItems(appView, indexedItems); } } @@ -132,6 +132,10 @@ mixedItems.add(this); } + public DexAnnotationSet[] getAnnotationSets() { + return values; + } + public boolean isEmpty() { return values.length == 0; }
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramClassVisitor.java b/src/main/java/com/android/tools/r8/graph/ProgramClassVisitor.java index 3414037..06d0943 100644 --- a/src/main/java/com/android/tools/r8/graph/ProgramClassVisitor.java +++ b/src/main/java/com/android/tools/r8/graph/ProgramClassVisitor.java
@@ -3,17 +3,17 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; -import java.util.HashSet; +import com.google.common.collect.Sets; import java.util.Set; /** * Implements traversal of the class hierarchy in topological order. A class is visited after its - * super class and its interfaces are visited. Only visits program classes and does NOT visit + * super class and its interfaces are visited. Only visits program classes and does NOT visit * classpath, nor library classes. * - * NOTE: The visiting is processed by traversing program classes only, which means that - * in presence of classpath it is NOT guaranteed that class C is visited before class D - * if there exists a classpath class X in class hierarchy between C and D, like: + * <p>NOTE: The visiting is processed by traversing program classes only, which means that in + * presence of classpath it is NOT guaranteed that class C is visited before class D if there exists + * a classpath class X in class hierarchy between C and D, like: * * <pre> * class ProgramClassS {} @@ -21,29 +21,24 @@ * class ProgramClassD extends ClasspathClassX {} * </pre> * - * The above consideration does not apply to library classes, since we assume library - * classes never extend or implement program/classpath class. + * The above consideration does not apply to library classes, since we assume library classes never + * extend or implement program/classpath class. */ public abstract class ProgramClassVisitor { - final DexApplication application; - private final Set<DexItem> visited = new HashSet<>(); + final AppView<?> appView; - protected ProgramClassVisitor(DexApplication application) { - this.application = application; + private final Set<DexProgramClass> visited = Sets.newIdentityHashSet(); + + protected ProgramClassVisitor(AppView<?> appView) { + this.appView = appView; } private void accept(DexType type) { - if (type == null || visited.contains(type)) { - return; - } - DexClass clazz = application.programDefinitionFor(type); + DexProgramClass clazz = appView.app().programDefinitionFor(type); if (clazz != null) { accept(clazz); - return; } - visit(type); - visited.add(type); } private void accept(DexTypeList types) { @@ -52,14 +47,14 @@ } } - private void accept(DexClass clazz) { - if (visited.contains(clazz)) { - return; + private void accept(DexProgramClass clazz) { + if (visited.add(clazz)) { + if (clazz.hasSuperType()) { + accept(clazz.getSuperType()); + } + accept(clazz.getInterfaces()); + visit(clazz); } - accept(clazz.superType); - accept(clazz.interfaces); - visit(clazz); - visited.add(clazz); } public void run(DexProgramClass[] classes) { @@ -68,24 +63,6 @@ } } - public void run(Iterable<DexProgramClass> classes) { - for (DexProgramClass clazz : classes) { - accept(clazz); - } - } - - public void run() { - run(application.classes()); - } - - /** - * Called for each library class used in the class hierarchy. A library class is a class that is - * not present in the application. - */ - public abstract void visit(DexType type); - - /** - * Called for each class defined in the application. - */ - public abstract void visit(DexClass clazz); + /** Called for each class defined in the application. */ + public abstract void visit(DexProgramClass clazz); }
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramDexCode.java b/src/main/java/com/android/tools/r8/graph/ProgramDexCode.java deleted file mode 100644 index 4e15eac..0000000 --- a/src/main/java/com/android/tools/r8/graph/ProgramDexCode.java +++ /dev/null
@@ -1,24 +0,0 @@ -// 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.graph; - -public class ProgramDexCode { - - private final DexWritableCode code; - private final ProgramMethod method; - - public ProgramDexCode(DexWritableCode code, ProgramMethod method) { - this.code = code; - this.method = method; - } - - public DexWritableCode getCode() { - return code; - } - - public ProgramMethod getMethod() { - return method; - } -}
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramField.java b/src/main/java/com/android/tools/r8/graph/ProgramField.java index 0007521..85146d6 100644 --- a/src/main/java/com/android/tools/r8/graph/ProgramField.java +++ b/src/main/java/com/android/tools/r8/graph/ProgramField.java
@@ -14,12 +14,12 @@ super(holder, field); } - public void collectIndexedItems(IndexedItemCollection indexedItems) { - getReference().collectIndexedItems(indexedItems); + public void collectIndexedItems(AppView<?> appView, IndexedItemCollection indexedItems) { + getReference().collectIndexedItems(appView, indexedItems); DexEncodedField definition = getDefinition(); - definition.annotations().collectIndexedItems(indexedItems); + definition.annotations().collectIndexedItems(appView, indexedItems); if (definition.isStatic() && definition.hasExplicitStaticValue()) { - definition.getStaticValue().collectIndexedItems(indexedItems); + definition.getStaticValue().collectIndexedItems(appView, indexedItems); } }
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java index 37d165b..7980af2 100644 --- a/src/main/java/com/android/tools/r8/graph/ProgramMethod.java +++ b/src/main/java/com/android/tools/r8/graph/ProgramMethod.java
@@ -65,16 +65,16 @@ } public void collectIndexedItems( - IndexedItemCollection indexedItems, GraphLens graphLens, LensCodeRewriterUtils rewriter) { + AppView<?> appView, IndexedItemCollection indexedItems, LensCodeRewriterUtils rewriter) { DexEncodedMethod definition = getDefinition(); assert !definition.isObsolete(); - getReference().collectIndexedItems(indexedItems); + getReference().collectIndexedItems(appView, indexedItems); if (definition.hasCode()) { Code code = definition.getCode(); - code.asDexWritableCode().collectIndexedItems(indexedItems, this, graphLens, rewriter); + code.asDexWritableCode().collectIndexedItems(appView, indexedItems, this, rewriter); } - definition.annotations().collectIndexedItems(indexedItems); - definition.parameterAnnotationsList.collectIndexedItems(indexedItems); + definition.annotations().collectIndexedItems(appView, indexedItems); + definition.parameterAnnotationsList.collectIndexedItems(appView, indexedItems); } public boolean canBeConvertedToAbstractMethod(AppView<AppInfoWithLiveness> appView) {
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java index 55e6f8c..789bb19 100644 --- a/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java +++ b/src/main/java/com/android/tools/r8/graph/ThrowExceptionCode.java
@@ -4,12 +4,12 @@ package com.android.tools.r8.graph; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.NewInstance; -import com.android.tools.r8.code.Throw; import com.android.tools.r8.dex.CodeToKeep; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexNewInstance; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; @@ -72,19 +72,19 @@ @Override public int codeSizeInBytes() { - return NewInstance.SIZE + InvokeDirect.SIZE + Throw.SIZE; + return DexNewInstance.SIZE + DexInvokeDirect.SIZE + DexThrow.SIZE; } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { rewriter .dexItemFactory() .createInstanceInitializer(exceptionType) - .collectIndexedItems(indexedItems); + .collectIndexedItems(appView, indexedItems); } @Override @@ -216,14 +216,14 @@ int register = 0; int notUsed = 0; int argumentCount = 1; - new NewInstance(register, exceptionType) + new DexNewInstance(register, exceptionType) .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); DexMethod instanceInitializer = lensCodeRewriter.dexItemFactory().createInstanceInitializer(exceptionType); - new InvokeDirect( + new DexInvokeDirect( argumentCount, instanceInitializer, register, notUsed, notUsed, notUsed, notUsed) .write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); - new Throw(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); + new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java index 5b02c12..cac6f7a 100644 --- a/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java +++ b/src/main/java/com/android/tools/r8/graph/ThrowNullCode.java
@@ -5,11 +5,11 @@ package com.android.tools.r8.graph; import com.android.tools.r8.cf.CfVersion; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.Throw; import com.android.tools.r8.dex.CodeToKeep; import com.android.tools.r8.dex.IndexedItemCollection; import com.android.tools.r8.dex.MixedSectionCollection; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; import com.android.tools.r8.graph.proto.RewrittenPrototypeDescription; @@ -81,14 +81,14 @@ @Override public int codeSizeInBytes() { - return Const4.SIZE + Throw.SIZE; + return DexConst4.SIZE + DexThrow.SIZE; } @Override public void collectIndexedItems( + AppView<?> appView, IndexedItemCollection indexedItems, ProgramMethod context, - GraphLens graphLens, LensCodeRewriterUtils rewriter) { // Intentionally empty. } @@ -251,8 +251,8 @@ LensCodeRewriterUtils lensCodeRewriter, ObjectToOffsetMapping mapping) { int register = 0; - new Const4(register, 0).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); - new Throw(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); + new DexConst4(register, 0).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); + new DexThrow(register).write(shortBuffer, context, graphLens, mapping, lensCodeRewriter); } @Override
diff --git a/src/main/java/com/android/tools/r8/graph/UseRegistry.java b/src/main/java/com/android/tools/r8/graph/UseRegistry.java index 6e08e6c..0b066d6 100644 --- a/src/main/java/com/android/tools/r8/graph/UseRegistry.java +++ b/src/main/java/com/android/tools/r8/graph/UseRegistry.java
@@ -3,9 +3,9 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.graph; -import com.android.tools.r8.code.CfOrDexInstanceFieldRead; -import com.android.tools.r8.code.CfOrDexInstruction; -import com.android.tools.r8.code.CfOrDexStaticFieldRead; +import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead; +import com.android.tools.r8.dex.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead; import com.android.tools.r8.ir.code.Invoke; import com.android.tools.r8.utils.TraversalContinuation; import java.util.ListIterator;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java index 02b1abe..be68650 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/IncompleteVirtuallyMergedMethodCode.java
@@ -131,9 +131,13 @@ instructions.add(fallthroughLabel); instructions.add(createCfFrameForSwitchCase(method, maxLocals)); - DexMethod fallthroughTarget = - lens.getNextMethodSignature( - superMethod != null ? superMethod : mappedMethods.get(mappedMethods.lastIntKey())); + DexMethod fallthroughTarget; + if (superMethod == null) { + fallthroughTarget = + lens.getNextMethodSignature(mappedMethods.get(mappedMethods.lastIntKey())); + } else { + fallthroughTarget = lens.lookupInvokeSuper(superMethod, method).getReference(); + } instructions.add( new CfInvoke(Opcodes.INVOKESPECIAL, fallthroughTarget, method.getHolder().isInterface()));
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java index eb5b57e..70f752e 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/PolicyScheduler.java
@@ -12,6 +12,7 @@ import com.android.tools.r8.horizontalclassmerging.policies.AllInstantiatedOrUninstantiated; import com.android.tools.r8.horizontalclassmerging.policies.CheckAbstractClasses; import com.android.tools.r8.horizontalclassmerging.policies.CheckSyntheticClasses; +import com.android.tools.r8.horizontalclassmerging.policies.ComputeApiLevelOfSyntheticClass; import com.android.tools.r8.horizontalclassmerging.policies.FinalizeMergeGroup; import com.android.tools.r8.horizontalclassmerging.policies.LimitClassGroups; import com.android.tools.r8.horizontalclassmerging.policies.LimitInterfaceGroups; @@ -137,7 +138,8 @@ ImmutableList.Builder<SingleClassPolicy> builder = ImmutableList.<SingleClassPolicy>builder() .add(new CheckSyntheticClasses(appView)) - .add(new OnlyClassesWithStaticDefinitionsAndNoClassInitializer()); + .add(new OnlyClassesWithStaticDefinitionsAndNoClassInitializer()) + .add(new ComputeApiLevelOfSyntheticClass(appView)); assert verifySingleClassPoliciesIrrelevantForMergingSyntheticsInD8(appView, mode, builder); return builder.build(); }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java new file mode 100644 index 0000000..3568c17 --- /dev/null +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/ComputeApiLevelOfSyntheticClass.java
@@ -0,0 +1,207 @@ +// Copyright (c) 2022, 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.horizontalclassmerging.policies; + +import com.android.tools.r8.androidapi.AndroidApiLevelCompute; +import com.android.tools.r8.androidapi.ComputedApiLevel; +import com.android.tools.r8.dex.code.CfOrDexInstruction; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexCallSite; +import com.android.tools.r8.graph.DexEncodedMethod; +import com.android.tools.r8.graph.DexField; +import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.DexMethodHandle; +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.ProgramMethod; +import com.android.tools.r8.graph.UseRegistry; +import com.android.tools.r8.horizontalclassmerging.SingleClassPolicy; +import com.android.tools.r8.synthesis.SyntheticItems; +import java.util.ListIterator; + +public class ComputeApiLevelOfSyntheticClass extends SingleClassPolicy { + + private final AppView<?> appView; + private final SyntheticItems syntheticItems; + + public ComputeApiLevelOfSyntheticClass(AppView<?> appView) { + this.appView = appView; + this.syntheticItems = appView.getSyntheticItems(); + } + + @Override + public boolean canMerge(DexProgramClass clazz) { + assert syntheticItems.isSyntheticClass(clazz); + clazz.forEachProgramMethod( + programMethod -> { + DexEncodedMethod definition = programMethod.getDefinition(); + if (definition.getApiLevelForCode().isNotSetApiLevel()) { + ComputeApiLevelUseRegistry computeApiLevel = + new ComputeApiLevelUseRegistry(appView, programMethod, appView.apiLevelCompute()); + computeApiLevel.accept(programMethod); + ComputedApiLevel maxApiReferenceLevel = computeApiLevel.getMaxApiReferenceLevel(); + assert !maxApiReferenceLevel.isNotSetApiLevel(); + definition.setApiLevelForCode(maxApiReferenceLevel); + definition.setApiLevelForDefinition(computeApiLevel.getMaxApiReferenceLevel()); + } + }); + return true; + } + + @Override + public String getName() { + return "ComputeApiLevelOfSyntheticClass"; + } + + private static class ComputeApiLevelUseRegistry extends UseRegistry<ProgramMethod> { + + private final AppView<?> appView; + private final AndroidApiLevelCompute apiLevelCompute; + private ComputedApiLevel maxApiReferenceLevel; + + public ComputeApiLevelUseRegistry( + AppView<?> appView, ProgramMethod context, AndroidApiLevelCompute apiLevelCompute) { + super(appView, context); + this.appView = appView; + this.apiLevelCompute = apiLevelCompute; + maxApiReferenceLevel = appView.computedMinApiLevel(); + } + + @Override + public void registerInitClass(DexType clazz) { + assert false : "Unexpected call to an instruction that should not exist on DEX"; + } + + @Override + public void registerRecordFieldValues(DexField[] fields) { + assert false : "Unexpected call to an instruction that should not exist on DEX"; + } + + @Override + public void registerInvokeVirtual(DexMethod invokedMethod) { + setMaxApiReferenceLevel(invokedMethod); + } + + @Override + public void registerInvokeDirect(DexMethod invokedMethod) { + setMaxApiReferenceLevel(invokedMethod); + } + + @Override + public void registerInvokeStatic(DexMethod invokedMethod) { + setMaxApiReferenceLevel(invokedMethod); + } + + @Override + public void registerInvokeInterface(DexMethod invokedMethod) { + setMaxApiReferenceLevel(invokedMethod); + } + + @Override + public void registerInvokeSuper(DexMethod invokedMethod) { + setMaxApiReferenceLevel(invokedMethod); + } + + @Override + public void registerInstanceFieldRead(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerInstanceFieldReadFromMethodHandle(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerInstanceFieldWrite(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerInstanceFieldWriteFromMethodHandle(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerNewInstance(DexType type) { + setMaxApiReferenceLevel(type); + } + + @Override + public void registerStaticFieldRead(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerStaticFieldReadFromMethodHandle(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerStaticFieldWrite(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerStaticFieldWriteFromMethodHandle(DexField field) { + setMaxApiReferenceLevel(field); + } + + @Override + public void registerConstClass( + DexType type, + ListIterator<? extends CfOrDexInstruction> iterator, + boolean ignoreCompatRules) { + // Intentionally empty. + } + + @Override + public void registerCheckCast(DexType type, boolean ignoreCompatRules) { + // Intentionally empty. + } + + @Override + public void registerSafeCheckCast(DexType type) { + // Intentionally empty. + } + + @Override + public void registerTypeReference(DexType type) { + // Intentionally empty. + } + + @Override + public void registerInstanceOf(DexType type) { + // Intentionally empty. + } + + @Override + public void registerExceptionGuard(DexType guard) { + setMaxApiReferenceLevel(guard); + } + + @Override + public void registerMethodHandle(DexMethodHandle methodHandle, MethodHandleUse use) { + assert false : "Unexpected call to an instruction that should not exist on DEX"; + } + + @Override + public void registerCallSite(DexCallSite callSite) { + assert false : "Unexpected call to an instruction that should not exist on DEX"; + } + + private void setMaxApiReferenceLevel(DexReference reference) { + maxApiReferenceLevel = + maxApiReferenceLevel.max( + apiLevelCompute.computeApiLevelForLibraryReference( + reference, apiLevelCompute.getPlatformApiLevelOrUnknown(appView))); + } + + public ComputedApiLevel getMaxApiReferenceLevel() { + return maxApiReferenceLevel; + } + } +}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java index 0b2c884..744154c 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoClassInitializerCycles.java
@@ -9,7 +9,7 @@ import static com.android.tools.r8.ir.desugar.LambdaDescriptor.isLambdaMetafactoryMethod; import static com.android.tools.r8.utils.MapUtils.ignoreKey; -import com.android.tools.r8.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.CfOrDexInstruction; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; import com.android.tools.r8.graph.DexClassAndMethod;
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java index ac73202..043bd34 100644 --- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java +++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/NoDefaultInterfaceMethodMerging.java
@@ -6,18 +6,21 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedMethod; +import com.android.tools.r8.graph.DexMethodSignature; import com.android.tools.r8.graph.DexProgramClass; +import com.android.tools.r8.graph.DexType; import com.android.tools.r8.horizontalclassmerging.HorizontalClassMerger.Mode; import com.android.tools.r8.horizontalclassmerging.MergeGroup; import com.android.tools.r8.horizontalclassmerging.MultiClassPolicy; -import com.android.tools.r8.utils.InternalOptions; -import com.android.tools.r8.utils.ListUtils; +import com.android.tools.r8.utils.WorkList; +import com.android.tools.r8.utils.collections.DexMethodSignatureMap; import com.android.tools.r8.utils.collections.DexMethodSignatureSet; import com.google.common.collect.Lists; import java.util.Collection; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; +import java.util.function.Function; /** * For interfaces, we cannot introduce an instance field `int $r8$classId`. Therefore, we can't @@ -29,42 +32,61 @@ */ public class NoDefaultInterfaceMethodMerging extends MultiClassPolicy { - private final Mode mode; - private final InternalOptions options; + private final AppView<?> appView; + private final DexType MULTIPLE_SENTINEL; public NoDefaultInterfaceMethodMerging(AppView<?> appView, Mode mode) { - this.mode = mode; - this.options = appView.options(); + this.appView = appView; + // Use the java.lang.Object type to indicate more than one interface type, as that type + // itself is not an interface type. + this.MULTIPLE_SENTINEL = appView.dexItemFactory().objectType; } @Override public Collection<MergeGroup> apply(MergeGroup group) { - if (!group.isInterfaceGroup()) { - return ListUtils.newLinkedList(group); - } - // Split the group into smaller groups such that no default methods collide. - Map<MergeGroup, DexMethodSignatureSet> newGroups = new LinkedHashMap<>(); + // TODO(b/229951607): This fixes the ICCE issue for synthetic lambda classes, but a more + // general solution possibly extending the policy NoDefaultInterfaceMethodCollisions. + Map<MergeGroup, DexMethodSignatureMap<DexType>> newGroups = new LinkedHashMap<>(); for (DexProgramClass clazz : group) { - addClassToGroup(clazz, newGroups); + addClassToGroup( + clazz, + newGroups, + group.isInterfaceGroup() + ? this::collectDefaultMethodsInInterfaces + : this::collectDefaultMethodsInImplementedInterfaces); } return removeTrivialGroups(Lists.newLinkedList(newGroups.keySet())); } private void addClassToGroup( - DexProgramClass clazz, Map<MergeGroup, DexMethodSignatureSet> newGroups) { - DexMethodSignatureSet classSignatures = DexMethodSignatureSet.create(); - classSignatures.addAllMethods(clazz.virtualMethods(DexEncodedMethod::isDefaultMethod)); + DexProgramClass clazz, + Map<MergeGroup, DexMethodSignatureMap<DexType>> newGroups, + Function<DexProgramClass, DexMethodSignatureMap<DexType>> fn) { + DexMethodSignatureMap<DexType> classSignatures = fn.apply(clazz); // Find a group that does not have any collisions with `clazz`. - for (Entry<MergeGroup, DexMethodSignatureSet> entry : newGroups.entrySet()) { + nextGroup: + for (Entry<MergeGroup, DexMethodSignatureMap<DexType>> entry : newGroups.entrySet()) { MergeGroup group = entry.getKey(); - DexMethodSignatureSet groupSignatures = entry.getValue(); - if (!groupSignatures.containsAnyOf(classSignatures)) { - groupSignatures.addAll(classSignatures); + DexMethodSignatureMap<DexType> groupSignatures = entry.getValue(); + if (!groupSignatures.containsAnyKeyOf(classSignatures.keySet())) { + groupSignatures.putAll(classSignatures); group.add(clazz); return; + } else { + DexMethodSignatureSet overlappingSignatures = + groupSignatures.intersectionWithKeys(classSignatures.keySet()); + for (DexMethodSignature signature : overlappingSignatures) { + if ((groupSignatures.get(signature) != classSignatures.get(signature)) + || (groupSignatures.get(signature) == MULTIPLE_SENTINEL)) { + continue nextGroup; + } + groupSignatures.putAll(classSignatures); + group.add(clazz); + return; + } } } @@ -72,13 +94,59 @@ newGroups.put(new MergeGroup(clazz), classSignatures); } - @Override - public String getName() { - return "NoDefaultInterfaceMethodMerging"; + private void addDefaultMethods(DexMethodSignatureMap<DexType> signatures, DexProgramClass iface) { + // When the same signature is added from several interfaces just move to the "multiple" state + // and do not keep track of the actual interfaces. + iface.forEachProgramVirtualMethodMatching( + DexEncodedMethod::isDefaultMethod, + method -> + signatures.merge( + method.getDefinition(), + iface.getType(), + (ignoreKey, current) -> current == iface.getType() ? current : MULTIPLE_SENTINEL)); + } + + private DexMethodSignatureMap<DexType> collectDefaultMethodsInInterfaces(DexProgramClass iface) { + assert iface.isInterface(); + DexMethodSignatureMap<DexType> signatures = DexMethodSignatureMap.create(); + WorkList<DexProgramClass> workList = WorkList.newIdentityWorkList(); + workList.addIfNotSeen(iface); + while (workList.hasNext()) { + DexProgramClass item = workList.next(); + assert item.isInterface(); + addDefaultMethods(signatures, item); + addInterfacesToWorklist(item, workList); + } + return signatures; + } + + // TODO(b/229951607): This only adresses the ICCE issue for synthetic lambda classes. + private DexMethodSignatureMap<DexType> collectDefaultMethodsInImplementedInterfaces( + DexProgramClass clazz) { + assert !clazz.isInterface(); + DexMethodSignatureMap<DexType> signatures = DexMethodSignatureMap.create(); + WorkList<DexProgramClass> workList = WorkList.newIdentityWorkList(); + addInterfacesToWorklist(clazz, workList); + while (workList.hasNext()) { + DexProgramClass item = workList.next(); + assert item.isInterface(); + addDefaultMethods(signatures, item); + addInterfacesToWorklist(item, workList); + } + return signatures; + } + + private void addInterfacesToWorklist(DexProgramClass clazz, WorkList<DexProgramClass> worklist) { + for (DexType iface : clazz.getInterfaces()) { + DexProgramClass ifaceDefinition = appView.programDefinitionFor(iface, clazz); + if (ifaceDefinition != null && ifaceDefinition.isInterface()) { + worklist.addIfNotSeen(ifaceDefinition); + } + } } @Override - public boolean shouldSkipPolicy() { - return !options.horizontalClassMergerOptions().isInterfaceMergingEnabled(mode); + public String getName() { + return "NoDefaultInterfaceMethodMerging"; } }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java index d2b1d3b..acc6daa 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -9,8 +9,8 @@ import static com.android.tools.r8.shaking.ObjectAllocationInfoCollectionUtils.mayHaveFinalizeMethodDirectlyOrIndirectly; import static com.android.tools.r8.utils.MapUtils.ignoreKey; -import com.android.tools.r8.code.CfOrDexInstanceFieldRead; -import com.android.tools.r8.code.CfOrDexStaticFieldRead; +import com.android.tools.r8.dex.code.CfOrDexInstanceFieldRead; +import com.android.tools.r8.dex.code.CfOrDexStaticFieldRead; import com.android.tools.r8.graph.AbstractAccessContexts; import com.android.tools.r8.graph.AbstractAccessContexts.ConcreteAccessContexts; import com.android.tools.r8.graph.AppView;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractState.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractState.java index 68b456b..914cc9e 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractState.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractState.java
@@ -8,7 +8,13 @@ /** The abstract state of the dataflow analysis, which is computed for each {@link BasicBlock}. */ public abstract class AbstractState<StateType extends AbstractState<StateType>> - implements TransferFunctionResult<StateType> { + implements Cloneable, TransferFunctionResult<StateType> { + + @Override + public StateType clone() { + // For immutable states there is no need to clone. + return asAbstractState(); + } public abstract StateType join(StateType state);
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractTransferFunction.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractTransferFunction.java index a3013e3..4e73e2a 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractTransferFunction.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/AbstractTransferFunction.java
@@ -13,6 +13,10 @@ TransferFunctionResult<StateType> apply(Instruction instruction, StateType state); + default StateType computeInitialState(Block entryBlock, StateType bottom) { + return bottom; + } + default StateType computeBlockEntryState( Block block, Block predecessor, StateType predecessorExitState) { return predecessorExitState;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/ControlFlowGraph.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/ControlFlowGraph.java index a6150bc..db0d7ca 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/ControlFlowGraph.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/ControlFlowGraph.java
@@ -12,6 +12,8 @@ public interface ControlFlowGraph<Block, Instruction> { + Block getEntryBlock(); + default boolean hasUniquePredecessor(Block block) { return TraversalUtils.isSingleton(counter -> traversePredecessors(block, counter)); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraProceduralDataflowAnalysisBase.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraProceduralDataflowAnalysisBase.java index f904da3..2cc7448 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraProceduralDataflowAnalysisBase.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/IntraProceduralDataflowAnalysisBase.java
@@ -111,7 +111,10 @@ return new SuccessfulDataflowAnalysisResult<>(blockExitStates); } - StateType computeBlockEntryState(Block block) { + public StateType computeBlockEntryState(Block block) { + if (block == cfg.getEntryBlock()) { + return transfer.computeInitialState(block, bottom); + } if (shouldCacheBlockEntryStateFor(block)) { return blockEntryStatesCache.getOrDefault(block, bottom); } @@ -125,7 +128,7 @@ return TraversalContinuation.doContinue(entryState.join(edgeState)); }, bottom); - return traversalContinuation.asContinue().getValue(); + return traversalContinuation.asContinue().getValue().clone(); } boolean setBlockExitState(Block block, StateType state) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfBlock.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfBlock.java index b86915c..357ff33 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfBlock.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfBlock.java
@@ -8,7 +8,10 @@ import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.utils.SetUtils; import java.util.ArrayList; +import java.util.Collection; +import java.util.LinkedHashSet; import java.util.List; +import java.util.Set; /** A basic block for {@link com.android.tools.r8.graph.CfCode}. */ public class CfBlock { @@ -21,7 +24,7 @@ // The predecessors of the block. These are stored explicitly (unlike the successors) since they // cannot efficiently be computed from the block. - final List<CfBlock> predecessors = new ArrayList<>(); + final Set<CfBlock> predecessors = new LinkedHashSet<>(); // The exceptional predecessors of the block. final List<CfBlock> exceptionalPredecessors = new ArrayList<>(); @@ -48,7 +51,7 @@ return lastInstructionIndex; } - public List<CfBlock> getPredecessors() { + public Collection<CfBlock> getPredecessors() { return predecessors; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfControlFlowGraph.java b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfControlFlowGraph.java index 4cf9e5e..ff69065 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfControlFlowGraph.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/framework/intraprocedural/cf/CfControlFlowGraph.java
@@ -57,6 +57,7 @@ return blocks.get(blockEntry); } + @Override public CfBlock getEntryBlock() { return getBlock(code.getInstructions().get(0)); }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java index 253665f..13495c35 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/ProtoEnqueuerUseRegistry.java
@@ -7,7 +7,7 @@ import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull; import com.android.tools.r8.androidapi.AndroidApiLevelCompute; -import com.android.tools.r8.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.CfOrDexInstruction; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeElement.java index eea19ef..e00ecf9 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/BooleanTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "boolean"; + } + + @Override boolean isBoolean() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeElement.java index c9e5e9f..849f508 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ByteTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "byte"; + } + + @Override boolean isByte() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeElement.java index 0d33bfd..5a47cda 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/CharTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "char"; + } + + @Override boolean isChar() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeElement.java index e9632a8..85a501c 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/DoubleTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "double"; + } + + @Override public boolean isDouble() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeElement.java index 386981d..9efadf8 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/FloatTypeElement.java
@@ -11,6 +11,11 @@ } @Override + public String getTypeName() { + return "float"; + } + + @Override public boolean isFloat() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeElement.java index 5ecb417..881cb19 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/IntTypeElement.java
@@ -11,6 +11,11 @@ } @Override + public String getTypeName() { + return "int"; + } + + @Override public boolean isInt() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeElement.java index caf2ed3..7f71468 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/LongTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "long"; + } + + @Override public boolean isLong() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java index 4e9b5f1a..9797274 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/PrimitiveTypeElement.java
@@ -12,6 +12,8 @@ /** A {@link TypeElement} that abstracts primitive types. */ public abstract class PrimitiveTypeElement extends TypeElement { + public abstract String getTypeName(); + @Override public Nullability nullability() { return Nullability.definitelyNotNull();
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeElement.java index 61b8514..fd7d65a 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/ShortTypeElement.java
@@ -12,6 +12,11 @@ } @Override + public String getTypeName() { + return "short"; + } + + @Override boolean isShort() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeElement.java index 40436d1..5d3d16b 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/SinglePrimitiveTypeElement.java
@@ -3,6 +3,8 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.analysis.type; +import com.android.tools.r8.errors.Unreachable; + /** A {@link TypeElement} that abstracts primitive types, which fit in 32 bits. */ public class SinglePrimitiveTypeElement extends PrimitiveTypeElement { @@ -17,6 +19,11 @@ } @Override + public String getTypeName() { + throw new Unreachable("Unexpected attempt to get type name of " + this); + } + + @Override public boolean isSinglePrimitive() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java index 879e5a3..a0fd66f 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
@@ -14,11 +14,8 @@ import com.android.tools.r8.ir.code.Phi; import com.android.tools.r8.ir.code.Value; import com.android.tools.r8.shaking.AppInfoWithLiveness; -import com.google.common.collect.Lists; import java.util.ArrayDeque; -import java.util.Comparator; import java.util.Deque; -import java.util.List; public class TypeAnalysis { @@ -72,11 +69,7 @@ } public void narrowing(Iterable<? extends Value> values) { - // TODO(b/125492155) Not sorting causes us to have non-deterministic behaviour. This should be - // removed when the bug is fixed. - List<Value> sortedValues = Lists.newArrayList(values); - sortedValues.sort(Comparator.comparingInt(Value::getNumber)); - analyzeValues(sortedValues, Mode.NARROWING); + analyzeValues(values, Mode.NARROWING); } public boolean verifyValuesUpToDate(Iterable<? extends Value> values) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeElement.java b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeElement.java index 0ae7426..f13800d 100644 --- a/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeElement.java +++ b/src/main/java/com/android/tools/r8/ir/analysis/type/WidePrimitiveTypeElement.java
@@ -3,6 +3,8 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.analysis.type; +import com.android.tools.r8.errors.Unreachable; + /** A {@link TypeElement} that abstracts primitive types, which fit in 64 bits. */ public class WidePrimitiveTypeElement extends PrimitiveTypeElement { @@ -17,6 +19,11 @@ } @Override + public String getTypeName() { + throw new Unreachable("Unexpected attempt to get type name of " + this); + } + + @Override public boolean isWidePrimitive() { return true; }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Add.java b/src/main/java/com/android/tools/r8/ir/code/Add.java index 3a5fa32..dc8cb05 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Add.java +++ b/src/main/java/com/android/tools/r8/ir/code/Add.java
@@ -5,16 +5,17 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.AddDouble; -import com.android.tools.r8.code.AddDouble2Addr; -import com.android.tools.r8.code.AddFloat; -import com.android.tools.r8.code.AddFloat2Addr; -import com.android.tools.r8.code.AddInt; -import com.android.tools.r8.code.AddInt2Addr; -import com.android.tools.r8.code.AddIntLit16; -import com.android.tools.r8.code.AddIntLit8; -import com.android.tools.r8.code.AddLong; -import com.android.tools.r8.code.AddLong2Addr; +import com.android.tools.r8.dex.code.DexAddDouble; +import com.android.tools.r8.dex.code.DexAddDouble2Addr; +import com.android.tools.r8.dex.code.DexAddFloat; +import com.android.tools.r8.dex.code.DexAddFloat2Addr; +import com.android.tools.r8.dex.code.DexAddInt; +import com.android.tools.r8.dex.code.DexAddInt2Addr; +import com.android.tools.r8.dex.code.DexAddIntLit16; +import com.android.tools.r8.dex.code.DexAddIntLit8; +import com.android.tools.r8.dex.code.DexAddLong; +import com.android.tools.r8.dex.code.DexAddLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; public class Add extends ArithmeticBinop { @@ -38,53 +39,53 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new AddInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexAddInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new AddLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexAddLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) { - return new AddFloat(dest, left, right); + public DexInstruction CreateFloat(int dest, int left, int right) { + return new DexAddFloat(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) { - return new AddDouble(dest, left, right); + public DexInstruction CreateDouble(int dest, int left, int right) { + return new DexAddDouble(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new AddInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexAddInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new AddLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexAddLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) { - return new AddFloat2Addr(left, right); + public DexInstruction CreateFloat2Addr(int left, int right) { + return new DexAddFloat2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) { - return new AddDouble2Addr(left, right); + public DexInstruction CreateDouble2Addr(int left, int right) { + return new DexAddDouble2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new AddIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexAddIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new AddIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexAddIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java index ed2cdd8..7f3a0b9 100644 --- a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java +++ b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingDefinition.java
@@ -4,9 +4,9 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.LoadStoreHelper; -import com.android.tools.r8.code.Const16; -import com.android.tools.r8.code.Const4; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConst16; +import com.android.tools.r8.dex.code.DexConst4; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.ir.conversion.CfBuilder; @@ -39,7 +39,8 @@ public void buildDex(DexBuilder builder) { int register = builder.allocatedRegister(outValue, getNumber()); builder.add( - this, (register & 0xf) == register ? new Const4(register, 0) : new Const16(register, 0)); + this, + (register & 0xf) == register ? new DexConst4(register, 0) : new DexConst16(register, 0)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/And.java b/src/main/java/com/android/tools/r8/ir/code/And.java index 86c193b..f7aac6c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/And.java +++ b/src/main/java/com/android/tools/r8/ir/code/And.java
@@ -5,12 +5,13 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.AndInt; -import com.android.tools.r8.code.AndInt2Addr; -import com.android.tools.r8.code.AndIntLit16; -import com.android.tools.r8.code.AndIntLit8; -import com.android.tools.r8.code.AndLong; -import com.android.tools.r8.code.AndLong2Addr; +import com.android.tools.r8.dex.code.DexAndInt; +import com.android.tools.r8.dex.code.DexAndInt2Addr; +import com.android.tools.r8.dex.code.DexAndIntLit16; +import com.android.tools.r8.dex.code.DexAndIntLit8; +import com.android.tools.r8.dex.code.DexAndLong; +import com.android.tools.r8.dex.code.DexAndLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; import java.util.Set; public class And extends LogicalBinop { @@ -45,33 +46,33 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new AndInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexAndInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new AndLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexAndLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new AndInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexAndInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new AndLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexAndLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new AndIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexAndIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new AndIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexAndIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java index a4be195..cf6039c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java +++ b/src/main/java/com/android/tools/r8/ir/code/ArithmeticBinop.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement; @@ -20,25 +20,25 @@ super(type, dest, left, right); } - public abstract com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right); + public abstract DexInstruction CreateInt(int dest, int left, int right); - public abstract Instruction CreateLong(int dest, int left, int right); + public abstract DexInstruction CreateLong(int dest, int left, int right); - public abstract Instruction CreateFloat(int dest, int left, int right); + public abstract DexInstruction CreateFloat(int dest, int left, int right); - public abstract Instruction CreateDouble(int dest, int left, int right); + public abstract DexInstruction CreateDouble(int dest, int left, int right); - public abstract Instruction CreateInt2Addr(int left, int right); + public abstract DexInstruction CreateInt2Addr(int left, int right); - public abstract Instruction CreateLong2Addr(int left, int right); + public abstract DexInstruction CreateLong2Addr(int left, int right); - public abstract Instruction CreateFloat2Addr(int left, int right); + public abstract DexInstruction CreateFloat2Addr(int left, int right); - public abstract Instruction CreateDouble2Addr(int left, int right); + public abstract DexInstruction CreateDouble2Addr(int left, int right); - public abstract Instruction CreateIntLit8(int dest, int left, int constant); + public abstract DexInstruction CreateIntLit8(int dest, int left, int constant); - public abstract Instruction CreateIntLit16(int dest, int left, int constant); + public abstract DexInstruction CreateIntLit16(int dest, int left, int constant); @Override public boolean canBeFolded() { @@ -64,7 +64,7 @@ // Method needsValueInRegister ensures that left value has an allocated register. int left = builder.allocatedRegister(leftValue(), getNumber()); int dest = builder.allocatedRegister(outValue, getNumber()); - Instruction instruction = null; + DexInstruction instruction = null; if (isTwoAddr(builder.getRegisterAllocator())) { int right = builder.allocatedRegister(rightValue(), getNumber()); if (left != dest) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java index 82a2ef7..2bfd3c3 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java +++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -6,14 +6,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfArrayLoad; -import com.android.tools.r8.code.Aget; -import com.android.tools.r8.code.AgetBoolean; -import com.android.tools.r8.code.AgetByte; -import com.android.tools.r8.code.AgetChar; -import com.android.tools.r8.code.AgetObject; -import com.android.tools.r8.code.AgetShort; -import com.android.tools.r8.code.AgetWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexAget; +import com.android.tools.r8.dex.code.DexAgetBoolean; +import com.android.tools.r8.dex.code.DexAgetByte; +import com.android.tools.r8.dex.code.DexAgetChar; +import com.android.tools.r8.dex.code.DexAgetObject; +import com.android.tools.r8.dex.code.DexAgetShort; +import com.android.tools.r8.dex.code.DexAgetWide; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.CompilationError; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; @@ -73,36 +74,36 @@ int dest = builder.allocatedRegister(dest(), getNumber()); int array = builder.allocatedRegister(array(), getNumber()); int index = builder.allocatedRegister(index(), getNumber()); - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; switch (type) { case INT: case FLOAT: - instruction = new Aget(dest, array, index); + instruction = new DexAget(dest, array, index); break; case LONG: case DOUBLE: assert builder.getOptions().canUseSameArrayAndResultRegisterInArrayGetWide() || dest != array; - instruction = new AgetWide(dest, array, index); + instruction = new DexAgetWide(dest, array, index); break; case OBJECT: - instruction = new AgetObject(dest, array, index); + instruction = new DexAgetObject(dest, array, index); break; case BOOLEAN_OR_BYTE: ArrayTypeElement arrayType = array().getType().asArrayType(); if (arrayType != null && arrayType.getMemberType() == TypeElement.getBoolean()) { - instruction = new AgetBoolean(dest, array, index); + instruction = new DexAgetBoolean(dest, array, index); } else { assert array().getType().isDefinitelyNull() || arrayType.getMemberType() == TypeElement.getByte(); - instruction = new AgetByte(dest, array, index); + instruction = new DexAgetByte(dest, array, index); } break; case CHAR: - instruction = new AgetChar(dest, array, index); + instruction = new DexAgetChar(dest, array, index); break; case SHORT: - instruction = new AgetShort(dest, array, index); + instruction = new DexAgetShort(dest, array, index); break; case INT_OR_FLOAT: case LONG_OR_DOUBLE:
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java index a0bf286..14837ee 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java +++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfArrayLength; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexArrayLength; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -55,7 +56,7 @@ public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); int array = builder.allocatedRegister(array(), getNumber()); - builder.add(this, new com.android.tools.r8.code.ArrayLength(dest, array)); + builder.add(this, new DexArrayLength(dest, array)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java index aa70b4f..4e43590 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java +++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -5,14 +5,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfArrayStore; -import com.android.tools.r8.code.Aput; -import com.android.tools.r8.code.AputBoolean; -import com.android.tools.r8.code.AputByte; -import com.android.tools.r8.code.AputChar; -import com.android.tools.r8.code.AputObject; -import com.android.tools.r8.code.AputShort; -import com.android.tools.r8.code.AputWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexAput; +import com.android.tools.r8.dex.code.DexAputBoolean; +import com.android.tools.r8.dex.code.DexAputByte; +import com.android.tools.r8.dex.code.DexAputChar; +import com.android.tools.r8.dex.code.DexAputObject; +import com.android.tools.r8.dex.code.DexAputShort; +import com.android.tools.r8.dex.code.DexAputWide; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.ProgramMethod; @@ -66,34 +67,34 @@ int value = builder.allocatedRegister(value(), getNumber()); int array = builder.allocatedRegister(array(), getNumber()); int index = builder.allocatedRegister(index(), getNumber()); - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; switch (type) { case INT: case FLOAT: - instruction = new Aput(value, array, index); + instruction = new DexAput(value, array, index); break; case LONG: case DOUBLE: - instruction = new AputWide(value, array, index); + instruction = new DexAputWide(value, array, index); break; case OBJECT: - instruction = new AputObject(value, array, index); + instruction = new DexAputObject(value, array, index); break; case BOOLEAN_OR_BYTE: ArrayTypeElement arrayType = array().getType().asArrayType(); if (arrayType != null && arrayType.getMemberType() == TypeElement.getBoolean()) { - instruction = new AputBoolean(value, array, index); + instruction = new DexAputBoolean(value, array, index); } else { assert array().getType().isDefinitelyNull() || arrayType.getMemberType() == TypeElement.getByte(); - instruction = new AputByte(value, array, index); + instruction = new DexAputByte(value, array, index); } break; case CHAR: - instruction = new AputChar(value, array, index); + instruction = new DexAputChar(value, array, index); break; case SHORT: - instruction = new AputShort(value, array, index); + instruction = new DexAputShort(value, array, index); break; case INT_OR_FLOAT: case LONG_OR_DOUBLE:
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java index 5e96f46..ea014e6 100644 --- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java +++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -9,9 +9,10 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfCheckCast; -import com.android.tools.r8.code.MoveObject; -import com.android.tools.r8.code.MoveObjectFrom16; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexCheckCast; +import com.android.tools.r8.dex.code.DexMoveObject; +import com.android.tools.r8.dex.code.DexMoveObjectFrom16; import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; @@ -107,18 +108,18 @@ if (inRegister == outRegister) { builder.add(this, createCheckCast(outRegister)); } else { - com.android.tools.r8.code.CheckCast cast = createCheckCast(outRegister); + DexCheckCast cast = createCheckCast(outRegister); if (outRegister <= Constants.U4BIT_MAX && inRegister <= Constants.U4BIT_MAX) { - builder.add(this, new MoveObject(outRegister, inRegister), cast); + builder.add(this, new DexMoveObject(outRegister, inRegister), cast); } else { - builder.add(this, new MoveObjectFrom16(outRegister, inRegister), cast); + builder.add(this, new DexMoveObjectFrom16(outRegister, inRegister), cast); } } } } - com.android.tools.r8.code.CheckCast createCheckCast(int register) { - return new com.android.tools.r8.code.CheckCast(register, getType(), ignoreCompatRules()); + DexCheckCast createCheckCast(int register) { + return new DexCheckCast(register, getType(), ignoreCompatRules()); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Cmp.java b/src/main/java/com/android/tools/r8/ir/code/Cmp.java index a7b25a3..a03637e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Cmp.java +++ b/src/main/java/com/android/tools/r8/ir/code/Cmp.java
@@ -4,12 +4,13 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfCmp; -import com.android.tools.r8.code.CmpLong; -import com.android.tools.r8.code.CmpgDouble; -import com.android.tools.r8.code.CmpgFloat; -import com.android.tools.r8.code.CmplDouble; -import com.android.tools.r8.code.CmplFloat; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexCmpLong; +import com.android.tools.r8.dex.code.DexCmpgDouble; +import com.android.tools.r8.dex.code.DexCmpgFloat; +import com.android.tools.r8.dex.code.DexCmplDouble; +import com.android.tools.r8.dex.code.DexCmplFloat; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.ir.analysis.constant.Bottom; @@ -53,7 +54,7 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int dest = builder.allocatedRegister(outValue, getNumber()); int left = builder.allocatedRegister(leftValue(), getNumber()); int right = builder.allocatedRegister(rightValue(), getNumber()); @@ -61,24 +62,24 @@ case DOUBLE: assert bias != Bias.NONE; if (bias == Bias.GT) { - instruction = new CmpgDouble(dest, left, right); + instruction = new DexCmpgDouble(dest, left, right); } else { assert bias == Bias.LT; - instruction = new CmplDouble(dest, left, right); + instruction = new DexCmplDouble(dest, left, right); } break; case FLOAT: assert bias != Bias.NONE; if (bias == Bias.GT) { - instruction = new CmpgFloat(dest, left, right); + instruction = new DexCmpgFloat(dest, left, right); } else { assert bias == Bias.LT; - instruction = new CmplFloat(dest, left, right); + instruction = new DexCmplFloat(dest, left, right); } break; case LONG: assert bias == Bias.NONE; - instruction = new CmpLong(dest, left, right); + instruction = new DexCmpLong(dest, left, right); break; default: throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java index 05869bb..1fd0fed 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstClass; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConstClass; import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -79,7 +80,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.ConstClass(dest, clazz, ignoreCompatRules())); + builder.add(this, new DexConstClass(dest, clazz, ignoreCompatRules())); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java index 35cef20..78ee74e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodHandle.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstMethodHandle; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConstMethodHandle; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethodHandle; import com.android.tools.r8.graph.DexType; @@ -58,7 +59,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.ConstMethodHandle(dest, methodHandle)); + builder.add(this, new DexConstMethodHandle(dest, methodHandle)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java index 64359c8..5ce3e31 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstMethodType.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstMethodType; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConstMethodType; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexType; @@ -58,7 +59,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.ConstMethodType(dest, methodType)); + builder.add(this, new DexConstMethodType(dest, methodType)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java index 958816b..8d39b43 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstNumber.java
@@ -7,15 +7,15 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstNull; import com.android.tools.r8.cf.code.CfConstNumber; -import com.android.tools.r8.code.Const; -import com.android.tools.r8.code.Const16; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstHigh16; -import com.android.tools.r8.code.ConstWide; -import com.android.tools.r8.code.ConstWide16; -import com.android.tools.r8.code.ConstWide32; -import com.android.tools.r8.code.ConstWideHigh16; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConst; +import com.android.tools.r8.dex.code.DexConst16; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstHigh16; +import com.android.tools.r8.dex.code.DexConstWide; +import com.android.tools.r8.dex.code.DexConstWide16; +import com.android.tools.r8.dex.code.DexConstWide32; +import com.android.tools.r8.dex.code.DexConstWideHigh16; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; @@ -143,24 +143,24 @@ if (outType().isObject() || outType().isSingle()) { assert NumberUtils.is32Bit(value); if ((register & 0xf) == register && NumberUtils.is4Bit(value)) { - builder.add(this, new Const4(register, (int) value)); + builder.add(this, new DexConst4(register, (int) value)); } else if (NumberUtils.is16Bit(value)) { - builder.add(this, new Const16(register, (int) value)); + builder.add(this, new DexConst16(register, (int) value)); } else if ((value & 0x0000ffffL) == 0) { - builder.add(this, new ConstHigh16(register, ((int) value) >>> 16)); + builder.add(this, new DexConstHigh16(register, ((int) value) >>> 16)); } else { - builder.add(this, new Const(register, (int) value)); + builder.add(this, new DexConst(register, (int) value)); } } else { assert outType().isWide(); if (NumberUtils.is16Bit(value)) { - builder.add(this, new ConstWide16(register, (int) value)); + builder.add(this, new DexConstWide16(register, (int) value)); } else if ((value & 0x0000ffffffffffffL) == 0) { - builder.add(this, new ConstWideHigh16(register, (int) (value >>> 48))); + builder.add(this, new DexConstWideHigh16(register, (int) (value >>> 48))); } else if (NumberUtils.is32Bit(value)) { - builder.add(this, new ConstWide32(register, (int) value)); + builder.add(this, new DexConstWide32(register, (int) value)); } else { - builder.add(this, new ConstWide(register, value)); + builder.add(this, new DexConstWide(register, value)); } } } @@ -222,24 +222,24 @@ if (type.isSingle()) { assert NumberUtils.is32Bit(value); if (NumberUtils.is4Bit(value)) { - return Const4.SIZE; + return DexConst4.SIZE; } else if (NumberUtils.is16Bit(value)) { - return Const16.SIZE; + return DexConst16.SIZE; } else if ((value & 0x0000ffffL) == 0) { - return ConstHigh16.SIZE; + return DexConstHigh16.SIZE; } else { - return Const.SIZE; + return DexConst.SIZE; } } else { assert type.isWide(); if (NumberUtils.is16Bit(value)) { - return ConstWide16.SIZE; + return DexConstWide16.SIZE; } else if ((value & 0x0000ffffffffffffL) == 0) { - return ConstWideHigh16.SIZE; + return DexConstWideHigh16.SIZE; } else if (NumberUtils.is32Bit(value)) { - return ConstWide32.SIZE; + return DexConstWide32.SIZE; } else { - return ConstWide.SIZE; + return DexConstWide.SIZE; } } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstString.java b/src/main/java/com/android/tools/r8/ir/code/ConstString.java index 3df5d13..ca71070 100644 --- a/src/main/java/com/android/tools/r8/ir/code/ConstString.java +++ b/src/main/java/com/android/tools/r8/ir/code/ConstString.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfConstString; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConstString; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexString; @@ -69,7 +70,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.ConstString(dest, value)); + builder.add(this, new DexConstString(dest, value)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java index b7820c1..78a582b 100644 --- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java +++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -83,7 +83,7 @@ int dest = builder.allocatedRegister(outValue(), getNumber()); builder.add( this, - new com.android.tools.r8.code.DexItemBasedConstString(dest, item, nameComputationInfo)); + new com.android.tools.r8.dex.code.DexItemBasedConstString(dest, item, nameComputationInfo)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Div.java b/src/main/java/com/android/tools/r8/ir/code/Div.java index 45a743f..21031fb 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Div.java +++ b/src/main/java/com/android/tools/r8/ir/code/Div.java
@@ -4,16 +4,17 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.DivDouble; -import com.android.tools.r8.code.DivDouble2Addr; -import com.android.tools.r8.code.DivFloat; -import com.android.tools.r8.code.DivFloat2Addr; -import com.android.tools.r8.code.DivInt; -import com.android.tools.r8.code.DivInt2Addr; -import com.android.tools.r8.code.DivIntLit16; -import com.android.tools.r8.code.DivIntLit8; -import com.android.tools.r8.code.DivLong; -import com.android.tools.r8.code.DivLong2Addr; +import com.android.tools.r8.dex.code.DexDivDouble; +import com.android.tools.r8.dex.code.DexDivDouble2Addr; +import com.android.tools.r8.dex.code.DexDivFloat; +import com.android.tools.r8.dex.code.DexDivFloat2Addr; +import com.android.tools.r8.dex.code.DexDivInt; +import com.android.tools.r8.dex.code.DexDivInt2Addr; +import com.android.tools.r8.dex.code.DexDivIntLit16; +import com.android.tools.r8.dex.code.DexDivIntLit8; +import com.android.tools.r8.dex.code.DexDivLong; +import com.android.tools.r8.dex.code.DexDivLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.LatticeElement; import java.util.function.Function; @@ -50,53 +51,53 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new DivInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexDivInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new DivLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexDivLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) { - return new DivFloat(dest, left, right); + public DexInstruction CreateFloat(int dest, int left, int right) { + return new DexDivFloat(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) { - return new DivDouble(dest, left, right); + public DexInstruction CreateDouble(int dest, int left, int right) { + return new DexDivDouble(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new DivInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexDivInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new DivLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexDivLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) { - return new DivFloat2Addr(left, right); + public DexInstruction CreateFloat2Addr(int left, int right) { + return new DexDivFloat2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) { - return new DivDouble2Addr(left, right); + public DexInstruction CreateDouble2Addr(int left, int right) { + return new DexDivDouble2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new DivIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexDivIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new DivIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexDivIntLit16(dest, left, constant); } @Override
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 4656ad8..8f310c8 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
@@ -173,6 +173,11 @@ return blocks.getFirst(); } + @Override + public BasicBlock getEntryBlock() { + return blocks.getFirst(); + } + public Position getEntryPosition() { return entryPosition; }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java index 80351a6..f331383 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java +++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -6,8 +6,8 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfInitClass; -import com.android.tools.r8.code.DexInitClass; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInitClass; import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java index 0bc0830..b88555d 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -7,14 +7,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfInstanceFieldRead; -import com.android.tools.r8.code.Iget; -import com.android.tools.r8.code.IgetBoolean; -import com.android.tools.r8.code.IgetByte; -import com.android.tools.r8.code.IgetChar; -import com.android.tools.r8.code.IgetObject; -import com.android.tools.r8.code.IgetShort; -import com.android.tools.r8.code.IgetWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexIget; +import com.android.tools.r8.dex.code.DexIgetBoolean; +import com.android.tools.r8.dex.code.DexIgetByte; +import com.android.tools.r8.dex.code.DexIgetChar; +import com.android.tools.r8.dex.code.DexIgetObject; +import com.android.tools.r8.dex.code.DexIgetShort; +import com.android.tools.r8.dex.code.DexIgetWide; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; @@ -79,31 +80,31 @@ public void buildDex(DexBuilder builder) { int destRegister = builder.allocatedRegister(dest(), getNumber()); int objectRegister = builder.allocatedRegister(object(), getNumber()); - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; DexField field = getField(); switch (getType()) { case INT: case FLOAT: - instruction = new Iget(destRegister, objectRegister, field); + instruction = new DexIget(destRegister, objectRegister, field); break; case LONG: case DOUBLE: - instruction = new IgetWide(destRegister, objectRegister, field); + instruction = new DexIgetWide(destRegister, objectRegister, field); break; case OBJECT: - instruction = new IgetObject(destRegister, objectRegister, field); + instruction = new DexIgetObject(destRegister, objectRegister, field); break; case BOOLEAN: - instruction = new IgetBoolean(destRegister, objectRegister, field); + instruction = new DexIgetBoolean(destRegister, objectRegister, field); break; case BYTE: - instruction = new IgetByte(destRegister, objectRegister, field); + instruction = new DexIgetByte(destRegister, objectRegister, field); break; case CHAR: - instruction = new IgetChar(destRegister, objectRegister, field); + instruction = new DexIgetChar(destRegister, objectRegister, field); break; case SHORT: - instruction = new IgetShort(destRegister, objectRegister, field); + instruction = new DexIgetShort(destRegister, objectRegister, field); break; default: throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java index 123eb45..4af4442 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfInstanceOf; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstanceOf; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; @@ -52,7 +53,7 @@ public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); int value = builder.allocatedRegister(value(), getNumber()); - builder.addInstanceOf(this, new com.android.tools.r8.code.InstanceOf(dest, value, type)); + builder.addInstanceOf(this, new DexInstanceOf(dest, value, type)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java index 68d7ffc..be3739e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java +++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -6,14 +6,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfInstanceFieldWrite; -import com.android.tools.r8.code.Iput; -import com.android.tools.r8.code.IputBoolean; -import com.android.tools.r8.code.IputByte; -import com.android.tools.r8.code.IputChar; -import com.android.tools.r8.code.IputObject; -import com.android.tools.r8.code.IputShort; -import com.android.tools.r8.code.IputWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexIput; +import com.android.tools.r8.dex.code.DexIputBoolean; +import com.android.tools.r8.dex.code.DexIputByte; +import com.android.tools.r8.dex.code.DexIputChar; +import com.android.tools.r8.dex.code.DexIputObject; +import com.android.tools.r8.dex.code.DexIputShort; +import com.android.tools.r8.dex.code.DexIputWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; @@ -87,33 +88,33 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int valueRegister = builder.allocatedRegister(value(), getNumber()); int objectRegister = builder.allocatedRegister(object(), getNumber()); DexField field = getField(); switch (getType()) { case INT: case FLOAT: - instruction = new Iput(valueRegister, objectRegister, field); + instruction = new DexIput(valueRegister, objectRegister, field); break; case LONG: case DOUBLE: - instruction = new IputWide(valueRegister, objectRegister, field); + instruction = new DexIputWide(valueRegister, objectRegister, field); break; case OBJECT: - instruction = new IputObject(valueRegister, objectRegister, field); + instruction = new DexIputObject(valueRegister, objectRegister, field); break; case BOOLEAN: - instruction = new IputBoolean(valueRegister, objectRegister, field); + instruction = new DexIputBoolean(valueRegister, objectRegister, field); break; case BYTE: - instruction = new IputByte(valueRegister, objectRegister, field); + instruction = new DexIputByte(valueRegister, objectRegister, field); break; case CHAR: - instruction = new IputChar(valueRegister, objectRegister, field); + instruction = new DexIputChar(valueRegister, objectRegister, field); break; case SHORT: - instruction = new IputShort(valueRegister, objectRegister, field); + instruction = new DexIputShort(valueRegister, objectRegister, field); break; default: throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java b/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java index 601f67f..9ccd91e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java +++ b/src/main/java/com/android/tools/r8/ir/code/IntSwitch.java
@@ -8,12 +8,12 @@ import com.android.tools.r8.cf.code.CfLabel; import com.android.tools.r8.cf.code.CfSwitch; import com.android.tools.r8.cf.code.CfSwitch.Kind; -import com.android.tools.r8.code.Nop; -import com.android.tools.r8.code.PackedSwitch; -import com.android.tools.r8.code.PackedSwitchPayload; -import com.android.tools.r8.code.SparseSwitch; -import com.android.tools.r8.code.SparseSwitchPayload; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexNop; +import com.android.tools.r8.dex.code.DexPackedSwitch; +import com.android.tools.r8.dex.code.DexPackedSwitchPayload; +import com.android.tools.r8.dex.code.DexSparseSwitch; +import com.android.tools.r8.dex.code.DexSparseSwitchPayload; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.ir.conversion.CfBuilder; import com.android.tools.r8.ir.conversion.DexBuilder; @@ -202,9 +202,9 @@ public void buildDex(DexBuilder builder) { int value = builder.allocatedRegister(value(), getNumber()); if (emitPacked(InternalOutputMode.DexIndexed)) { - builder.addSwitch(this, new PackedSwitch(value)); + builder.addSwitch(this, new DexPackedSwitch(value)); } else { - builder.addSwitch(this, new SparseSwitch(value)); + builder.addSwitch(this, new DexSparseSwitch(value)); } } @@ -224,14 +224,14 @@ return result; } - public Nop buildPayload(int[] targets, int fallthroughTarget, InternalOutputMode mode) { + public DexNop buildPayload(int[] targets, int fallthroughTarget, InternalOutputMode mode) { assert keys.length == targets.length; assert mode.isGeneratingDex(); if (emitPacked(mode)) { int targetsCount = (int) numberOfTargetsIfPacked(keys); if (targets.length == targetsCount) { // All targets are already present. - return new PackedSwitchPayload(getFirstKey(), targets); + return new DexPackedSwitchPayload(getFirstKey(), targets); } else { // Generate the list of targets for all key values. Set the target for keys not present // to the fallthrough. @@ -247,11 +247,11 @@ } } assert originalIndex == keys.length; - return new PackedSwitchPayload(getFirstKey(), packedTargets); + return new DexPackedSwitchPayload(getFirstKey(), packedTargets); } } else { assert numberOfKeys() == keys.length; - return new SparseSwitchPayload(keys, targets); + return new DexSparseSwitchPayload(keys, targets); } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Invoke.java b/src/main/java/com/android/tools/r8/ir/code/Invoke.java index 9e6d8a6..786a73e 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Invoke.java +++ b/src/main/java/com/android/tools/r8/ir/code/Invoke.java
@@ -3,17 +3,26 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.code; -import com.android.tools.r8.code.InvokeCustomRange; -import com.android.tools.r8.code.InvokeDirectRange; -import com.android.tools.r8.code.InvokeInterfaceRange; -import com.android.tools.r8.code.InvokePolymorphicRange; -import com.android.tools.r8.code.InvokeStaticRange; -import com.android.tools.r8.code.InvokeSuperRange; -import com.android.tools.r8.code.InvokeVirtualRange; -import com.android.tools.r8.code.MoveResult; -import com.android.tools.r8.code.MoveResultObject; -import com.android.tools.r8.code.MoveResultWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeCustom; +import com.android.tools.r8.dex.code.DexInvokeCustomRange; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeDirectRange; +import com.android.tools.r8.dex.code.DexInvokeInterface; +import com.android.tools.r8.dex.code.DexInvokeInterfaceRange; +import com.android.tools.r8.dex.code.DexInvokePolymorphic; +import com.android.tools.r8.dex.code.DexInvokePolymorphicRange; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; +import com.android.tools.r8.dex.code.DexInvokeSuper; +import com.android.tools.r8.dex.code.DexInvokeSuperRange; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; +import com.android.tools.r8.dex.code.DexMoveResult; +import com.android.tools.r8.dex.code.DexMoveResultObject; +import com.android.tools.r8.dex.code.DexMoveResultWide; +import com.android.tools.r8.dex.code.DexNewArray; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; @@ -39,15 +48,15 @@ private static final int NO_SUCH_DEX_INSTRUCTION = -1; public enum Type { - DIRECT(com.android.tools.r8.code.InvokeDirect.OPCODE, InvokeDirectRange.OPCODE), - INTERFACE(com.android.tools.r8.code.InvokeInterface.OPCODE, InvokeInterfaceRange.OPCODE), - STATIC(com.android.tools.r8.code.InvokeStatic.OPCODE, InvokeStaticRange.OPCODE), - SUPER(com.android.tools.r8.code.InvokeSuper.OPCODE, InvokeSuperRange.OPCODE), - VIRTUAL(com.android.tools.r8.code.InvokeVirtual.OPCODE, InvokeVirtualRange.OPCODE), - NEW_ARRAY(com.android.tools.r8.code.NewArray.OPCODE, NO_SUCH_DEX_INSTRUCTION), + DIRECT(DexInvokeDirect.OPCODE, DexInvokeDirectRange.OPCODE), + INTERFACE(DexInvokeInterface.OPCODE, DexInvokeInterfaceRange.OPCODE), + STATIC(DexInvokeStatic.OPCODE, DexInvokeStaticRange.OPCODE), + SUPER(DexInvokeSuper.OPCODE, DexInvokeSuperRange.OPCODE), + VIRTUAL(DexInvokeVirtual.OPCODE, DexInvokeVirtualRange.OPCODE), + NEW_ARRAY(DexNewArray.OPCODE, NO_SUCH_DEX_INSTRUCTION), MULTI_NEW_ARRAY(NO_SUCH_DEX_INSTRUCTION, NO_SUCH_DEX_INSTRUCTION), - CUSTOM(com.android.tools.r8.code.InvokeCustom.OPCODE, InvokeCustomRange.OPCODE), - POLYMORPHIC(com.android.tools.r8.code.InvokePolymorphic.OPCODE, InvokePolymorphicRange.OPCODE); + CUSTOM(DexInvokeCustom.OPCODE, DexInvokeCustomRange.OPCODE), + POLYMORPHIC(DexInvokePolymorphic.OPCODE, DexInvokePolymorphicRange.OPCODE); private final int dexOpcode; private final int dexOpcodeRange; @@ -346,18 +355,17 @@ return true; } - protected void addInvokeAndMoveResult( - com.android.tools.r8.code.Instruction instruction, DexBuilder builder) { + protected void addInvokeAndMoveResult(DexInstruction instruction, DexBuilder builder) { if (outValue != null && outValue.needsRegister()) { TypeElement moveType = outValue.getType(); int register = builder.allocatedRegister(outValue, getNumber()); - com.android.tools.r8.code.Instruction moveResult; + DexInstruction moveResult; if (moveType.isSinglePrimitive()) { - moveResult = new MoveResult(register); + moveResult = new DexMoveResult(register); } else if (moveType.isWidePrimitive()) { - moveResult = new MoveResultWide(register); + moveResult = new DexMoveResultWide(register); } else if (moveType.isReferenceType()) { - moveResult = new MoveResultObject(register); + moveResult = new DexMoveResultObject(register); } else { throw new Unreachable("Unexpected result type " + outType()); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java index 1296742..e43b0f0 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -6,7 +6,9 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfInvokeDynamic; -import com.android.tools.r8.code.InvokeCustomRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeCustom; +import com.android.tools.r8.dex.code.DexInvokeCustomRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite; import com.android.tools.r8.graph.DexType; @@ -123,24 +125,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeCustomRange(firstRegister, argumentRegisters, getCallSite()); + instruction = new DexInvokeCustomRange(firstRegister, argumentRegisters, getCallSite()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeCustom( - argumentRegistersCount, - getCallSite(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeCustom( + argumentRegistersCount, + getCallSite(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java index f57b79f..ff70fed 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -6,8 +6,10 @@ import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokeDirectRange; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeDirectRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexEncodedMethod; @@ -76,24 +78,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeDirectRange(firstRegister, argumentRegisters, getInvokedMethod()); + instruction = new DexInvokeDirectRange(firstRegister, argumentRegisters, getInvokedMethod()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeDirect( - argumentRegistersCount, - getInvokedMethod(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeDirect( + argumentRegistersCount, + getInvokedMethod(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java index 6749695..67e78d6 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
@@ -6,7 +6,9 @@ import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokeInterfaceRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeInterface; +import com.android.tools.r8.dex.code.DexInvokeInterfaceRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexEncodedMethod; @@ -57,24 +59,26 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeInterfaceRange(firstRegister, argumentRegisters, getInvokedMethod()); + instruction = + new DexInvokeInterfaceRange(firstRegister, argumentRegisters, getInvokedMethod()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeInterface( - argumentRegistersCount, - getInvokedMethod(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeInterface( + argumentRegistersCount, + getInvokedMethod(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java index 1b356e3..9bc1728 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -5,8 +5,9 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; -import com.android.tools.r8.code.FilledNewArray; -import com.android.tools.r8.code.FilledNewArrayRange; +import com.android.tools.r8.dex.code.DexFilledNewArray; +import com.android.tools.r8.dex.code.DexFilledNewArrayRange; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; @@ -70,24 +71,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new FilledNewArrayRange(firstRegister, argumentRegisters, type); + instruction = new DexFilledNewArrayRange(firstRegister, argumentRegisters, type); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new FilledNewArray( - argumentRegistersCount, - type, - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexFilledNewArray( + argumentRegistersCount, + type, + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java index ad8c087..c09c441 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
@@ -4,7 +4,9 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokePolymorphicRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokePolymorphic; +import com.android.tools.r8.dex.code.DexInvokePolymorphicRange; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; @@ -71,18 +73,20 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokePolymorphicRange( + instruction = + new DexInvokePolymorphicRange( firstRegister, argumentRegisters, getInvokedMethod(), getProto()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokePolymorphic( + instruction = + new DexInvokePolymorphic( argumentRegistersCount, getInvokedMethod(), getProto(),
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java index b405dbb..8f47b31 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -6,7 +6,9 @@ import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokeStaticRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; @@ -74,24 +76,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeStaticRange(firstRegister, argumentRegisters, getInvokedMethod()); + instruction = new DexInvokeStaticRange(firstRegister, argumentRegisters, getInvokedMethod()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeStatic( - argumentRegistersCount, - getInvokedMethod(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeStatic( + argumentRegistersCount, + getInvokedMethod(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java index d41559e..705c7f9 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -5,7 +5,9 @@ import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokeSuperRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeSuper; +import com.android.tools.r8.dex.code.DexInvokeSuperRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndMethod; import com.android.tools.r8.graph.DexMethod; @@ -58,24 +60,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeSuperRange(firstRegister, argumentRegisters, getInvokedMethod()); + instruction = new DexInvokeSuperRange(firstRegister, argumentRegisters, getInvokedMethod()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeSuper( - argumentRegistersCount, - getInvokedMethod(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeSuper( + argumentRegistersCount, + getInvokedMethod(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java index d0bca6a..fed5f58 100644 --- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java +++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -6,7 +6,9 @@ import static com.android.tools.r8.graph.DexEncodedMethod.asDexClassAndMethodOrNull; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.InvokeVirtualRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexClassAndMethod; @@ -62,24 +64,25 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int argumentRegisters = requiredArgumentRegisters(); builder.requestOutgoingRegisters(argumentRegisters); if (needsRangedInvoke(builder)) { assert argumentsConsecutive(builder); int firstRegister = argumentRegisterValue(0, builder); - instruction = new InvokeVirtualRange(firstRegister, argumentRegisters, getInvokedMethod()); + instruction = new DexInvokeVirtualRange(firstRegister, argumentRegisters, getInvokedMethod()); } else { int[] individualArgumentRegisters = new int[5]; int argumentRegistersCount = fillArgumentRegisters(builder, individualArgumentRegisters); - instruction = new com.android.tools.r8.code.InvokeVirtual( - argumentRegistersCount, - getInvokedMethod(), - individualArgumentRegisters[0], // C - individualArgumentRegisters[1], // D - individualArgumentRegisters[2], // E - individualArgumentRegisters[3], // F - individualArgumentRegisters[4]); // G + instruction = + new DexInvokeVirtual( + argumentRegistersCount, + getInvokedMethod(), + individualArgumentRegisters[0], // C + individualArgumentRegisters[1], // D + individualArgumentRegisters[2], // E + individualArgumentRegisters[3], // F + individualArgumentRegisters[4]); // G } addInvokeAndMoveResult(instruction, builder); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java index b647ecf..c9a1b03 100644 --- a/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java +++ b/src/main/java/com/android/tools/r8/ir/code/LogicalBinop.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement; @@ -20,17 +20,17 @@ super(type, dest, left, right); } - public abstract com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right); + public abstract DexInstruction CreateInt(int dest, int left, int right); - public abstract Instruction CreateLong(int dest, int left, int right); + public abstract DexInstruction CreateLong(int dest, int left, int right); - public abstract Instruction CreateInt2Addr(int left, int right); + public abstract DexInstruction CreateInt2Addr(int left, int right); - public abstract Instruction CreateLong2Addr(int left, int right); + public abstract DexInstruction CreateLong2Addr(int left, int right); - public abstract Instruction CreateIntLit8(int dest, int left, int constant); + public abstract DexInstruction CreateIntLit8(int dest, int left, int constant); - public abstract Instruction CreateIntLit16(int dest, int left, int constant); + public abstract DexInstruction CreateIntLit16(int dest, int left, int constant); @Override public boolean canBeFolded() { @@ -54,7 +54,7 @@ // that will change. int left = builder.allocatedRegister(leftValue(), getNumber()); int dest = builder.allocatedRegister(outValue, getNumber()); - Instruction instruction; + DexInstruction instruction; if (isTwoAddr(builder.getRegisterAllocator())) { int right = builder.allocatedRegister(rightValue(), getNumber()); if (left != dest) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Monitor.java b/src/main/java/com/android/tools/r8/ir/code/Monitor.java index 648c9fd..1e00e9b 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Monitor.java +++ b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
@@ -8,8 +8,8 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfMonitor; -import com.android.tools.r8.code.MonitorEnter; -import com.android.tools.r8.code.MonitorExit; +import com.android.tools.r8.dex.code.DexMonitorEnter; +import com.android.tools.r8.dex.code.DexMonitorExit; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.ProgramMethod; @@ -65,9 +65,9 @@ object = builder.allocatedRegister(object(), getNumber()); } if (type == Type.ENTER) { - builder.add(this, new MonitorEnter(object)); + builder.add(this, new DexMonitorEnter(object)); } else { - builder.add(this, new MonitorExit(object)); + builder.add(this, new DexMonitorExit(object)); } }
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java index efec2dd..616882a 100644 --- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java +++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -6,6 +6,7 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexMoveException; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; @@ -45,7 +46,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.MoveException(dest)); + builder.add(this, new DexMoveException(dest)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Mul.java b/src/main/java/com/android/tools/r8/ir/code/Mul.java index dcc8e1b..ccddf6a 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Mul.java +++ b/src/main/java/com/android/tools/r8/ir/code/Mul.java
@@ -5,16 +5,17 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.MulDouble; -import com.android.tools.r8.code.MulDouble2Addr; -import com.android.tools.r8.code.MulFloat; -import com.android.tools.r8.code.MulFloat2Addr; -import com.android.tools.r8.code.MulInt; -import com.android.tools.r8.code.MulInt2Addr; -import com.android.tools.r8.code.MulIntLit16; -import com.android.tools.r8.code.MulIntLit8; -import com.android.tools.r8.code.MulLong; -import com.android.tools.r8.code.MulLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexMulDouble; +import com.android.tools.r8.dex.code.DexMulDouble2Addr; +import com.android.tools.r8.dex.code.DexMulFloat; +import com.android.tools.r8.dex.code.DexMulFloat2Addr; +import com.android.tools.r8.dex.code.DexMulInt; +import com.android.tools.r8.dex.code.DexMulInt2Addr; +import com.android.tools.r8.dex.code.DexMulIntLit16; +import com.android.tools.r8.dex.code.DexMulIntLit8; +import com.android.tools.r8.dex.code.DexMulLong; +import com.android.tools.r8.dex.code.DexMulLong2Addr; public class Mul extends ArithmeticBinop { @@ -38,65 +39,67 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { + public DexInstruction CreateInt(int dest, int left, int right) { // Flip arguments if dest and right are the same to work around x86 code generation bug on // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android // M. - return dest == right ? new MulInt(dest, right, left) : new MulInt(dest, left, right); + return dest == right ? new DexMulInt(dest, right, left) : new DexMulInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { + public DexInstruction CreateLong(int dest, int left, int right) { // Flip arguments if dest and right are the same to work around x86 code generation bug on // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android // M. - return dest == right ? new MulLong(dest, right, left) : new MulLong(dest, left, right); + return dest == right ? new DexMulLong(dest, right, left) : new DexMulLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) { + public DexInstruction CreateFloat(int dest, int left, int right) { // Flip arguments if dest and right are the same to work around x86 code generation bug on // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android // M. - return dest == right ? new MulFloat(dest, right, left) : new MulFloat(dest, left, right); + return dest == right ? new DexMulFloat(dest, right, left) : new DexMulFloat(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) { + public DexInstruction CreateDouble(int dest, int left, int right) { // Flip arguments if dest and right are the same to work around x86 code generation bug on // Android L. See https://android-review.googlesource.com/#/c/114932/ for the fix for Android // M. - return dest == right ? new MulDouble(dest, right, left) : new MulDouble(dest, left, right); + return dest == right + ? new DexMulDouble(dest, right, left) + : new DexMulDouble(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new MulInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexMulInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new MulLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexMulLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) { - return new MulFloat2Addr(left, right); + public DexInstruction CreateFloat2Addr(int left, int right) { + return new DexMulFloat2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) { - return new MulDouble2Addr(left, right); + public DexInstruction CreateDouble2Addr(int left, int right) { + return new DexMulDouble2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new MulIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexMulIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new MulIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexMulIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Neg.java b/src/main/java/com/android/tools/r8/ir/code/Neg.java index 459c8c5..dde52df 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Neg.java +++ b/src/main/java/com/android/tools/r8/ir/code/Neg.java
@@ -4,10 +4,11 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfNeg; -import com.android.tools.r8.code.NegDouble; -import com.android.tools.r8.code.NegFloat; -import com.android.tools.r8.code.NegInt; -import com.android.tools.r8.code.NegLong; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNegDouble; +import com.android.tools.r8.dex.code.DexNegFloat; +import com.android.tools.r8.dex.code.DexNegInt; +import com.android.tools.r8.dex.code.DexNegLong; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement; @@ -51,21 +52,21 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int dest = builder.allocatedRegister(dest(), getNumber()); int src = builder.allocatedRegister(source(), getNumber()); switch (type) { case INT: - instruction = new NegInt(dest, src); + instruction = new DexNegInt(dest, src); break; case LONG: - instruction = new NegLong(dest, src); + instruction = new DexNegLong(dest, src); break; case FLOAT: - instruction = new NegFloat(dest, src); + instruction = new DexNegFloat(dest, src); break; case DOUBLE: - instruction = new NegDouble(dest, src); + instruction = new DexNegDouble(dest, src); break; default: throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java index 500766c..88bd18d 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -6,8 +6,8 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfNewArray; -import com.android.tools.r8.code.NewArray; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexNewArray; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; @@ -59,7 +59,7 @@ public void buildDex(DexBuilder builder) { int size = builder.allocatedRegister(size(), getNumber()); int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new NewArray(dest, size, type)); + builder.add(this, new DexNewArray(dest, size, type)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java index 260689f..15f7224 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
@@ -4,9 +4,9 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.LoadStoreHelper; -import com.android.tools.r8.code.FillArrayData; -import com.android.tools.r8.code.FillArrayDataPayload; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexFillArrayData; +import com.android.tools.r8.dex.code.DexFillArrayDataPayload; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -50,14 +50,14 @@ return inValues.get(0); } - public FillArrayDataPayload createPayload() { - return new FillArrayDataPayload(element_width, size, data); + public DexFillArrayDataPayload createPayload() { + return new DexFillArrayDataPayload(element_width, size, data); } @Override public void buildDex(DexBuilder builder) { int src = builder.allocatedRegister(src(), getNumber()); - builder.addFillArrayData(this, new FillArrayData(src)); + builder.addFillArrayData(this, new DexFillArrayData(src)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java index 85bae5c..d6c938d 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfNew; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexNewInstance; import com.android.tools.r8.graph.AccessControl; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -68,7 +69,7 @@ @Override public void buildDex(DexBuilder builder) { int dest = builder.allocatedRegister(dest(), getNumber()); - builder.add(this, new com.android.tools.r8.code.NewInstance(dest, clazz)); + builder.add(this, new DexNewInstance(dest, clazz)); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java index b56600f..2274754 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java +++ b/src/main/java/com/android/tools/r8/ir/code/NewUnboxedEnumInstance.java
@@ -6,8 +6,8 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfNewUnboxedEnum; -import com.android.tools.r8.code.DexNewUnboxedEnumInstance; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexNewUnboxedEnumInstance; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Not.java b/src/main/java/com/android/tools/r8/ir/code/Not.java index d000623..097ae22 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Not.java +++ b/src/main/java/com/android/tools/r8/ir/code/Not.java
@@ -4,8 +4,9 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.LoadStoreHelper; -import com.android.tools.r8.code.NotInt; -import com.android.tools.r8.code.NotLong; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNotInt; +import com.android.tools.r8.dex.code.DexNotLong; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.ConstLatticeElement; @@ -62,15 +63,15 @@ @Override public void buildDex(DexBuilder builder) { assert builder.getOptions().canUseNotInstruction(); - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int dest = builder.allocatedRegister(dest(), getNumber()); int src = builder.allocatedRegister(source(), getNumber()); switch (type) { case INT: - instruction = new NotInt(dest, src); + instruction = new DexNotInt(dest, src); break; case LONG: - instruction = new NotLong(dest, src); + instruction = new DexNotLong(dest, src); break; default: throw new Unreachable("Unexpected type " + type);
diff --git a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java index 5f3b592..55ed123 100644 --- a/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java +++ b/src/main/java/com/android/tools/r8/ir/code/NumberConversion.java
@@ -4,21 +4,22 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfNumberConversion; -import com.android.tools.r8.code.DoubleToFloat; -import com.android.tools.r8.code.DoubleToInt; -import com.android.tools.r8.code.DoubleToLong; -import com.android.tools.r8.code.FloatToDouble; -import com.android.tools.r8.code.FloatToInt; -import com.android.tools.r8.code.FloatToLong; -import com.android.tools.r8.code.IntToByte; -import com.android.tools.r8.code.IntToChar; -import com.android.tools.r8.code.IntToDouble; -import com.android.tools.r8.code.IntToFloat; -import com.android.tools.r8.code.IntToLong; -import com.android.tools.r8.code.IntToShort; -import com.android.tools.r8.code.LongToDouble; -import com.android.tools.r8.code.LongToFloat; -import com.android.tools.r8.code.LongToInt; +import com.android.tools.r8.dex.code.DexDoubleToFloat; +import com.android.tools.r8.dex.code.DexDoubleToInt; +import com.android.tools.r8.dex.code.DexDoubleToLong; +import com.android.tools.r8.dex.code.DexFloatToDouble; +import com.android.tools.r8.dex.code.DexFloatToInt; +import com.android.tools.r8.dex.code.DexFloatToLong; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexIntToByte; +import com.android.tools.r8.dex.code.DexIntToChar; +import com.android.tools.r8.dex.code.DexIntToDouble; +import com.android.tools.r8.dex.code.DexIntToFloat; +import com.android.tools.r8.dex.code.DexIntToLong; +import com.android.tools.r8.dex.code.DexIntToShort; +import com.android.tools.r8.dex.code.DexLongToDouble; +import com.android.tools.r8.dex.code.DexLongToFloat; +import com.android.tools.r8.dex.code.DexLongToInt; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement; @@ -54,29 +55,29 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int dest = builder.allocatedRegister(dest(), getNumber()); int src = builder.allocatedRegister(source(), getNumber()); switch (from) { case INT: switch (to) { case BYTE: - instruction = new IntToByte(dest, src); + instruction = new DexIntToByte(dest, src); break; case CHAR: - instruction = new IntToChar(dest, src); + instruction = new DexIntToChar(dest, src); break; case SHORT: - instruction = new IntToShort(dest, src); + instruction = new DexIntToShort(dest, src); break; case LONG: - instruction = new IntToLong(dest, src); + instruction = new DexIntToLong(dest, src); break; case FLOAT: - instruction = new IntToFloat(dest, src); + instruction = new DexIntToFloat(dest, src); break; case DOUBLE: - instruction = new IntToDouble(dest, src); + instruction = new DexIntToDouble(dest, src); break; default: throw new Unreachable("Unexpected types " + from + ", " + to); @@ -85,13 +86,13 @@ case LONG: switch (to) { case INT: - instruction = new LongToInt(dest, src); + instruction = new DexLongToInt(dest, src); break; case FLOAT: - instruction = new LongToFloat(dest, src); + instruction = new DexLongToFloat(dest, src); break; case DOUBLE: - instruction = new LongToDouble(dest, src); + instruction = new DexLongToDouble(dest, src); break; default: throw new Unreachable("Unexpected types " + from + ", " + to); @@ -100,13 +101,13 @@ case FLOAT: switch (to) { case INT: - instruction = new FloatToInt(dest, src); + instruction = new DexFloatToInt(dest, src); break; case LONG: - instruction = new FloatToLong(dest, src); + instruction = new DexFloatToLong(dest, src); break; case DOUBLE: - instruction = new FloatToDouble(dest, src); + instruction = new DexFloatToDouble(dest, src); break; default: throw new Unreachable("Unexpected types " + from + ", " + to); @@ -115,13 +116,13 @@ case DOUBLE: switch (to) { case INT: - instruction = new DoubleToInt(dest, src); + instruction = new DexDoubleToInt(dest, src); break; case LONG: - instruction = new DoubleToLong(dest, src); + instruction = new DexDoubleToLong(dest, src); break; case FLOAT: - instruction = new DoubleToFloat(dest, src); + instruction = new DexDoubleToFloat(dest, src); break; default: throw new Unreachable("Unexpected types " + from + ", " + to);
diff --git a/src/main/java/com/android/tools/r8/ir/code/Or.java b/src/main/java/com/android/tools/r8/ir/code/Or.java index a17cb7f..3fd1a77 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Or.java +++ b/src/main/java/com/android/tools/r8/ir/code/Or.java
@@ -4,12 +4,13 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.OrInt; -import com.android.tools.r8.code.OrInt2Addr; -import com.android.tools.r8.code.OrIntLit16; -import com.android.tools.r8.code.OrIntLit8; -import com.android.tools.r8.code.OrLong; -import com.android.tools.r8.code.OrLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexOrInt; +import com.android.tools.r8.dex.code.DexOrInt2Addr; +import com.android.tools.r8.dex.code.DexOrIntLit16; +import com.android.tools.r8.dex.code.DexOrIntLit8; +import com.android.tools.r8.dex.code.DexOrLong; +import com.android.tools.r8.dex.code.DexOrLong2Addr; import java.util.Set; public class Or extends LogicalBinop { @@ -44,33 +45,33 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new OrInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexOrInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new OrLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexOrLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new OrInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexOrInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new OrLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexOrLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new OrIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexOrIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new OrIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexOrIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java b/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java index a2949d0..db1cfaf 100644 --- a/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java +++ b/src/main/java/com/android/tools/r8/ir/code/RecordFieldValues.java
@@ -6,8 +6,8 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfRecordFieldValues; -import com.android.tools.r8.code.DexRecordFieldValues; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexRecordFieldValues; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.ProgramMethod;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Rem.java b/src/main/java/com/android/tools/r8/ir/code/Rem.java index f6f40fa..df5ffc1 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Rem.java +++ b/src/main/java/com/android/tools/r8/ir/code/Rem.java
@@ -4,16 +4,17 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.RemDouble; -import com.android.tools.r8.code.RemDouble2Addr; -import com.android.tools.r8.code.RemFloat; -import com.android.tools.r8.code.RemFloat2Addr; -import com.android.tools.r8.code.RemInt; -import com.android.tools.r8.code.RemInt2Addr; -import com.android.tools.r8.code.RemIntLit16; -import com.android.tools.r8.code.RemIntLit8; -import com.android.tools.r8.code.RemLong; -import com.android.tools.r8.code.RemLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexRemDouble; +import com.android.tools.r8.dex.code.DexRemDouble2Addr; +import com.android.tools.r8.dex.code.DexRemFloat; +import com.android.tools.r8.dex.code.DexRemFloat2Addr; +import com.android.tools.r8.dex.code.DexRemInt; +import com.android.tools.r8.dex.code.DexRemInt2Addr; +import com.android.tools.r8.dex.code.DexRemIntLit16; +import com.android.tools.r8.dex.code.DexRemIntLit8; +import com.android.tools.r8.dex.code.DexRemLong; +import com.android.tools.r8.dex.code.DexRemLong2Addr; import com.android.tools.r8.ir.analysis.constant.Bottom; import com.android.tools.r8.ir.analysis.constant.LatticeElement; import java.util.function.Function; @@ -50,53 +51,53 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new RemInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexRemInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new RemLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexRemLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) { - return new RemFloat(dest, left, right); + public DexInstruction CreateFloat(int dest, int left, int right) { + return new DexRemFloat(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) { - return new RemDouble(dest, left, right); + public DexInstruction CreateDouble(int dest, int left, int right) { + return new DexRemDouble(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new RemInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexRemInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new RemLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexRemLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) { - return new RemFloat2Addr(left, right); + public DexInstruction CreateFloat2Addr(int left, int right) { + return new DexRemFloat2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) { - return new RemDouble2Addr(left, right); + public DexInstruction CreateDouble2Addr(int left, int right) { + return new DexRemDouble2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new RemIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexRemIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new RemIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexRemIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java index 1ec1a8e..752b30c 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Return.java +++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -6,10 +6,12 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfReturn; import com.android.tools.r8.cf.code.CfReturnVoid; -import com.android.tools.r8.code.ReturnObject; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.ReturnWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexReturnObject; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexReturnWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -60,20 +62,20 @@ return inValues.get(0); } - public com.android.tools.r8.code.Instruction createDexInstruction(DexBuilder builder) { + public DexInstruction createDexInstruction(DexBuilder builder) { if (isReturnVoid()) { - return new ReturnVoid(); + return new DexReturnVoid(); } int register = builder.allocatedRegister(returnValue(), getNumber()); TypeElement returnType = getReturnType(); if (returnType.isReferenceType()) { - return new ReturnObject(register); + return new DexReturnObject(register); } if (returnType.isSinglePrimitive()) { - return new com.android.tools.r8.code.Return(register); + return new DexReturn(register); } if (returnType.isWidePrimitive()) { - return new ReturnWide(register); + return new DexReturnWide(register); } throw new Unreachable(); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java b/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java index b811f86..1aee996 100644 --- a/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java +++ b/src/main/java/com/android/tools/r8/ir/code/SafeCheckCast.java
@@ -5,6 +5,8 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfSafeCheckCast; +import com.android.tools.r8.dex.code.DexCheckCast; +import com.android.tools.r8.dex.code.DexSafeCheckCast; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.ProgramMethod; @@ -26,8 +28,8 @@ } @Override - com.android.tools.r8.code.CheckCast createCheckCast(int register) { - return new com.android.tools.r8.code.SafeCheckCast(register, getType()); + DexCheckCast createCheckCast(int register) { + return new DexSafeCheckCast(register, getType()); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Shl.java b/src/main/java/com/android/tools/r8/ir/code/Shl.java index b297552..d18262a 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Shl.java +++ b/src/main/java/com/android/tools/r8/ir/code/Shl.java
@@ -4,11 +4,12 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.ShlInt; -import com.android.tools.r8.code.ShlInt2Addr; -import com.android.tools.r8.code.ShlIntLit8; -import com.android.tools.r8.code.ShlLong; -import com.android.tools.r8.code.ShlLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexShlInt; +import com.android.tools.r8.dex.code.DexShlInt2Addr; +import com.android.tools.r8.dex.code.DexShlIntLit8; +import com.android.tools.r8.dex.code.DexShlLong; +import com.android.tools.r8.dex.code.DexShlLong2Addr; import com.android.tools.r8.errors.Unreachable; public class Shl extends LogicalBinop { @@ -49,32 +50,32 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new ShlInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexShlInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new ShlLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexShlLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new ShlInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexShlInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new ShlLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexShlLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new ShlIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexShlIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { + public DexInstruction CreateIntLit16(int dest, int left, int constant) { throw new Unreachable("Unsupported instruction ShlIntLit16"); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Shr.java b/src/main/java/com/android/tools/r8/ir/code/Shr.java index 36ff98b..5a93057 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Shr.java +++ b/src/main/java/com/android/tools/r8/ir/code/Shr.java
@@ -4,11 +4,12 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.ShrInt; -import com.android.tools.r8.code.ShrInt2Addr; -import com.android.tools.r8.code.ShrIntLit8; -import com.android.tools.r8.code.ShrLong; -import com.android.tools.r8.code.ShrLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexShrInt; +import com.android.tools.r8.dex.code.DexShrInt2Addr; +import com.android.tools.r8.dex.code.DexShrIntLit8; +import com.android.tools.r8.dex.code.DexShrLong; +import com.android.tools.r8.dex.code.DexShrLong2Addr; import com.android.tools.r8.errors.Unreachable; public class Shr extends LogicalBinop { @@ -49,32 +50,32 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new ShrInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexShrInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new ShrLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexShrLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new ShrInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexShrInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new ShrLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexShrLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new ShrIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexShrIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { + public DexInstruction CreateIntLit16(int dest, int left, int constant) { throw new Unreachable("Unsupported instruction ShrIntLit16"); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java index c4413d0..a078dde 100644 --- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java +++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -6,14 +6,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.TypeVerificationHelper; import com.android.tools.r8.cf.code.CfStaticFieldRead; -import com.android.tools.r8.code.Sget; -import com.android.tools.r8.code.SgetBoolean; -import com.android.tools.r8.code.SgetByte; -import com.android.tools.r8.code.SgetChar; -import com.android.tools.r8.code.SgetObject; -import com.android.tools.r8.code.SgetShort; -import com.android.tools.r8.code.SgetWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexSget; +import com.android.tools.r8.dex.code.DexSgetBoolean; +import com.android.tools.r8.dex.code.DexSgetByte; +import com.android.tools.r8.dex.code.DexSgetChar; +import com.android.tools.r8.dex.code.DexSgetObject; +import com.android.tools.r8.dex.code.DexSgetShort; +import com.android.tools.r8.dex.code.DexSgetWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClassAndField; @@ -97,32 +98,32 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int dest = builder.allocatedRegister(dest(), getNumber()); DexField field = getField(); switch (getType()) { case INT: case FLOAT: - instruction = new Sget(dest, field); + instruction = new DexSget(dest, field); break; case LONG: case DOUBLE: - instruction = new SgetWide(dest, field); + instruction = new DexSgetWide(dest, field); break; case OBJECT: - instruction = new SgetObject(dest, field); + instruction = new DexSgetObject(dest, field); break; case BOOLEAN: - instruction = new SgetBoolean(dest, field); + instruction = new DexSgetBoolean(dest, field); break; case BYTE: - instruction = new SgetByte(dest, field); + instruction = new DexSgetByte(dest, field); break; case CHAR: - instruction = new SgetChar(dest, field); + instruction = new DexSgetChar(dest, field); break; case SHORT: - instruction = new SgetShort(dest, field); + instruction = new DexSgetShort(dest, field); break; default: throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java index b28f281..7d54dbb 100644 --- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java +++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -5,14 +5,15 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfStaticFieldWrite; -import com.android.tools.r8.code.Sput; -import com.android.tools.r8.code.SputBoolean; -import com.android.tools.r8.code.SputByte; -import com.android.tools.r8.code.SputChar; -import com.android.tools.r8.code.SputObject; -import com.android.tools.r8.code.SputShort; -import com.android.tools.r8.code.SputWide; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexSput; +import com.android.tools.r8.dex.code.DexSputBoolean; +import com.android.tools.r8.dex.code.DexSputByte; +import com.android.tools.r8.dex.code.DexSputChar; +import com.android.tools.r8.dex.code.DexSputObject; +import com.android.tools.r8.dex.code.DexSputShort; +import com.android.tools.r8.dex.code.DexSputWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexEncodedField; @@ -65,32 +66,32 @@ @Override public void buildDex(DexBuilder builder) { - com.android.tools.r8.code.Instruction instruction; + DexInstruction instruction; int src = builder.allocatedRegister(value(), getNumber()); DexField field = getField(); switch (getType()) { case INT: case FLOAT: - instruction = new Sput(src, field); + instruction = new DexSput(src, field); break; case LONG: case DOUBLE: - instruction = new SputWide(src, field); + instruction = new DexSputWide(src, field); break; case OBJECT: - instruction = new SputObject(src, field); + instruction = new DexSputObject(src, field); break; case BOOLEAN: - instruction = new SputBoolean(src, field); + instruction = new DexSputBoolean(src, field); break; case BYTE: - instruction = new SputByte(src, field); + instruction = new DexSputByte(src, field); break; case CHAR: - instruction = new SputChar(src, field); + instruction = new DexSputChar(src, field); break; case SHORT: - instruction = new SputShort(src, field); + instruction = new DexSputShort(src, field); break; default: throw new Unreachable("Unexpected type: " + getType());
diff --git a/src/main/java/com/android/tools/r8/ir/code/Sub.java b/src/main/java/com/android/tools/r8/ir/code/Sub.java index e161b8e..fab70d7 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Sub.java +++ b/src/main/java/com/android/tools/r8/ir/code/Sub.java
@@ -5,19 +5,20 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfArithmeticBinop; -import com.android.tools.r8.code.AddIntLit16; -import com.android.tools.r8.code.AddIntLit8; -import com.android.tools.r8.code.RsubInt; -import com.android.tools.r8.code.RsubIntLit8; -import com.android.tools.r8.code.SubDouble; -import com.android.tools.r8.code.SubDouble2Addr; -import com.android.tools.r8.code.SubFloat; -import com.android.tools.r8.code.SubFloat2Addr; -import com.android.tools.r8.code.SubInt; -import com.android.tools.r8.code.SubInt2Addr; -import com.android.tools.r8.code.SubLong; -import com.android.tools.r8.code.SubLong2Addr; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexAddIntLit16; +import com.android.tools.r8.dex.code.DexAddIntLit8; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexRsubInt; +import com.android.tools.r8.dex.code.DexRsubIntLit8; +import com.android.tools.r8.dex.code.DexSubDouble; +import com.android.tools.r8.dex.code.DexSubDouble2Addr; +import com.android.tools.r8.dex.code.DexSubFloat; +import com.android.tools.r8.dex.code.DexSubFloat2Addr; +import com.android.tools.r8.dex.code.DexSubInt; +import com.android.tools.r8.dex.code.DexSubInt2Addr; +import com.android.tools.r8.dex.code.DexSubLong; +import com.android.tools.r8.dex.code.DexSubLong2Addr; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.ir.conversion.DexBuilder; @@ -43,53 +44,53 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new SubInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexSubInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new SubLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexSubLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat(int dest, int left, int right) { - return new SubFloat(dest, left, right); + public DexInstruction CreateFloat(int dest, int left, int right) { + return new DexSubFloat(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble(int dest, int left, int right) { - return new SubDouble(dest, left, right); + public DexInstruction CreateDouble(int dest, int left, int right) { + return new DexSubDouble(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new SubInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexSubInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new SubLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexSubLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateFloat2Addr(int left, int right) { - return new SubFloat2Addr(left, right); + public DexInstruction CreateFloat2Addr(int left, int right) { + return new DexSubFloat2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateDouble2Addr(int left, int right) { - return new SubDouble2Addr(left, right); + public DexInstruction CreateDouble2Addr(int left, int right) { + return new DexSubDouble2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { + public DexInstruction CreateIntLit8(int dest, int left, int constant) { // The sub instructions with constants are rsub, and is handled below. throw new Unreachable("Unsupported instruction SubIntLit8"); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { + public DexInstruction CreateIntLit16(int dest, int left, int constant) { // The sub instructions with constants are rsub, and is handled below. throw new Unreachable("Unsupported instruction SubIntLit16"); } @@ -166,7 +167,7 @@ return; } - com.android.tools.r8.code.Instruction instruction = null; + DexInstruction instruction = null; if (!needsValueInRegister(leftValue())) { // Sub instructions with small left constant is emitted as rsub. assert fitsInDexInstruction(leftValue()); @@ -174,10 +175,10 @@ int right = builder.allocatedRegister(rightValue(), getNumber()); int dest = builder.allocatedRegister(outValue, getNumber()); if (left.is8Bit()) { - instruction = new RsubIntLit8(dest, right, left.getIntValue()); + instruction = new DexRsubIntLit8(dest, right, left.getIntValue()); } else { assert left.is16Bit(); - instruction = new RsubInt(dest, right, left.getIntValue()); + instruction = new DexRsubInt(dest, right, left.getIntValue()); } } else if (!needsValueInRegister(rightValue())) { // Sub instructions with small right constant are emitted as add of the negative constant. @@ -187,10 +188,10 @@ int left = builder.allocatedRegister(leftValue(), getNumber()); ConstNumber right = rightValue().getConstInstruction().asConstNumber(); if (right.negativeIs8Bit()) { - instruction = new AddIntLit8(dest, left, -right.getIntValue()); + instruction = new DexAddIntLit8(dest, left, -right.getIntValue()); } else { assert right.negativeIs16Bit(); - instruction = new AddIntLit16(dest, left, -right.getIntValue()); + instruction = new DexAddIntLit16(dest, left, -right.getIntValue()); } } else { assert type == NumericType.INT;
diff --git a/src/main/java/com/android/tools/r8/ir/code/Throw.java b/src/main/java/com/android/tools/r8/ir/code/Throw.java index 6350255..7968409 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Throw.java +++ b/src/main/java/com/android/tools/r8/ir/code/Throw.java
@@ -6,6 +6,7 @@ import com.android.tools.r8.cf.LoadStoreHelper; import com.android.tools.r8.cf.code.CfThrow; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.type.TypeElement; @@ -36,7 +37,7 @@ @Override public void buildDex(DexBuilder builder) { - builder.add(this, new com.android.tools.r8.code.Throw(builder.allocatedRegister(exception(), getNumber()))); + builder.add(this, new DexThrow(builder.allocatedRegister(exception(), getNumber()))); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Ushr.java b/src/main/java/com/android/tools/r8/ir/code/Ushr.java index 5de1830..4ea3be9 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Ushr.java +++ b/src/main/java/com/android/tools/r8/ir/code/Ushr.java
@@ -4,11 +4,12 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.UshrInt; -import com.android.tools.r8.code.UshrInt2Addr; -import com.android.tools.r8.code.UshrIntLit8; -import com.android.tools.r8.code.UshrLong; -import com.android.tools.r8.code.UshrLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexUshrInt; +import com.android.tools.r8.dex.code.DexUshrInt2Addr; +import com.android.tools.r8.dex.code.DexUshrIntLit8; +import com.android.tools.r8.dex.code.DexUshrLong; +import com.android.tools.r8.dex.code.DexUshrLong2Addr; import com.android.tools.r8.errors.Unreachable; public class Ushr extends LogicalBinop { @@ -49,32 +50,32 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new UshrInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexUshrInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new UshrLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexUshrLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new UshrInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexUshrInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new UshrLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexUshrLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new UshrIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexUshrIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { + public DexInstruction CreateIntLit16(int dest, int left, int constant) { throw new Unreachable("Unsupported instruction ShrIntLit16"); }
diff --git a/src/main/java/com/android/tools/r8/ir/code/Xor.java b/src/main/java/com/android/tools/r8/ir/code/Xor.java index dce5686..657374a 100644 --- a/src/main/java/com/android/tools/r8/ir/code/Xor.java +++ b/src/main/java/com/android/tools/r8/ir/code/Xor.java
@@ -4,12 +4,13 @@ package com.android.tools.r8.ir.code; import com.android.tools.r8.cf.code.CfLogicalBinop; -import com.android.tools.r8.code.XorInt; -import com.android.tools.r8.code.XorInt2Addr; -import com.android.tools.r8.code.XorIntLit16; -import com.android.tools.r8.code.XorIntLit8; -import com.android.tools.r8.code.XorLong; -import com.android.tools.r8.code.XorLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexXorInt; +import com.android.tools.r8.dex.code.DexXorInt2Addr; +import com.android.tools.r8.dex.code.DexXorIntLit16; +import com.android.tools.r8.dex.code.DexXorIntLit8; +import com.android.tools.r8.dex.code.DexXorLong; +import com.android.tools.r8.dex.code.DexXorLong2Addr; import java.util.Set; public class Xor extends LogicalBinop { @@ -44,33 +45,33 @@ } @Override - public com.android.tools.r8.code.Instruction CreateInt(int dest, int left, int right) { - return new XorInt(dest, left, right); + public DexInstruction CreateInt(int dest, int left, int right) { + return new DexXorInt(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong(int dest, int left, int right) { - return new XorLong(dest, left, right); + public DexInstruction CreateLong(int dest, int left, int right) { + return new DexXorLong(dest, left, right); } @Override - public com.android.tools.r8.code.Instruction CreateInt2Addr(int left, int right) { - return new XorInt2Addr(left, right); + public DexInstruction CreateInt2Addr(int left, int right) { + return new DexXorInt2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateLong2Addr(int left, int right) { - return new XorLong2Addr(left, right); + public DexInstruction CreateLong2Addr(int left, int right) { + return new DexXorLong2Addr(left, right); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit8(int dest, int left, int constant) { - return new XorIntLit8(dest, left, constant); + public DexInstruction CreateIntLit8(int dest, int left, int constant) { + return new DexXorIntLit8(dest, left, constant); } @Override - public com.android.tools.r8.code.Instruction CreateIntLit16(int dest, int left, int constant) { - return new XorIntLit16(dest, left, constant); + public DexInstruction CreateIntLit16(int dest, int left, int constant) { + return new DexXorIntLit16(dest, left, constant); } @Override
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java index 4f91695..739fb9f 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/ArrayFilledDataPayloadResolver.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.ir.conversion; -import com.android.tools.r8.code.FillArrayData; -import com.android.tools.r8.code.FillArrayDataPayload; +import com.android.tools.r8.dex.code.DexFillArrayData; +import com.android.tools.r8.dex.code.DexFillArrayDataPayload; import java.util.HashMap; import java.util.Map; @@ -20,21 +20,21 @@ public short[] data; } - private final Map<Integer, FillArrayDataPayload> unresolvedPayload = new HashMap<>(); + private final Map<Integer, DexFillArrayDataPayload> unresolvedPayload = new HashMap<>(); private final Map<Integer, PayloadData> payloadToData = new HashMap<>(); - public void addPayloadUser(FillArrayData dex) { + public void addPayloadUser(DexFillArrayData dex) { int offset = dex.getOffset(); int payloadOffset = offset + dex.getPayloadOffset(); assert !payloadToData.containsKey(payloadOffset); payloadToData.put(payloadOffset, new PayloadData()); if (unresolvedPayload.containsKey(payloadOffset)) { - FillArrayDataPayload payload = unresolvedPayload.remove(payloadOffset); + DexFillArrayDataPayload payload = unresolvedPayload.remove(payloadOffset); resolve(payload); } } - public void resolve(FillArrayDataPayload payload) { + public void resolve(DexFillArrayDataPayload payload) { int payloadOffset = payload.getOffset(); PayloadData data = payloadToData.get(payloadOffset); if (data == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java index de631d3..201c789 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -3,37 +3,38 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.conversion; -import com.android.tools.r8.code.FillArrayData; -import com.android.tools.r8.code.FillArrayDataPayload; -import com.android.tools.r8.code.Format31t; -import com.android.tools.r8.code.Goto; -import com.android.tools.r8.code.Goto16; -import com.android.tools.r8.code.Goto32; -import com.android.tools.r8.code.IfEq; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.IfGe; -import com.android.tools.r8.code.IfGez; -import com.android.tools.r8.code.IfGt; -import com.android.tools.r8.code.IfGtz; -import com.android.tools.r8.code.IfLe; -import com.android.tools.r8.code.IfLez; -import com.android.tools.r8.code.IfLt; -import com.android.tools.r8.code.IfLtz; -import com.android.tools.r8.code.IfNe; -import com.android.tools.r8.code.IfNez; -import com.android.tools.r8.code.InstanceOf; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.Move16; -import com.android.tools.r8.code.MoveFrom16; -import com.android.tools.r8.code.MoveObject; -import com.android.tools.r8.code.MoveObject16; -import com.android.tools.r8.code.MoveObjectFrom16; -import com.android.tools.r8.code.MoveWide; -import com.android.tools.r8.code.MoveWide16; -import com.android.tools.r8.code.MoveWideFrom16; -import com.android.tools.r8.code.Nop; -import com.android.tools.r8.code.Throw; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexFillArrayData; +import com.android.tools.r8.dex.code.DexFillArrayDataPayload; +import com.android.tools.r8.dex.code.DexFormat31t; +import com.android.tools.r8.dex.code.DexGoto; +import com.android.tools.r8.dex.code.DexGoto16; +import com.android.tools.r8.dex.code.DexGoto32; +import com.android.tools.r8.dex.code.DexIfEq; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexIfGe; +import com.android.tools.r8.dex.code.DexIfGez; +import com.android.tools.r8.dex.code.DexIfGt; +import com.android.tools.r8.dex.code.DexIfGtz; +import com.android.tools.r8.dex.code.DexIfLe; +import com.android.tools.r8.dex.code.DexIfLez; +import com.android.tools.r8.dex.code.DexIfLt; +import com.android.tools.r8.dex.code.DexIfLtz; +import com.android.tools.r8.dex.code.DexIfNe; +import com.android.tools.r8.dex.code.DexIfNez; +import com.android.tools.r8.dex.code.DexInstanceOf; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexMove; +import com.android.tools.r8.dex.code.DexMove16; +import com.android.tools.r8.dex.code.DexMoveFrom16; +import com.android.tools.r8.dex.code.DexMoveObject; +import com.android.tools.r8.dex.code.DexMoveObject16; +import com.android.tools.r8.dex.code.DexMoveObjectFrom16; +import com.android.tools.r8.dex.code.DexMoveWide; +import com.android.tools.r8.dex.code.DexMoveWide16; +import com.android.tools.r8.dex.code.DexMoveWideFrom16; +import com.android.tools.r8.dex.code.DexNop; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.DebugLocalInfo; import com.android.tools.r8.graph.DexCode; @@ -86,7 +87,7 @@ private final IRCode ir; // Extra information that should be attached to the bytecode instructions. - private final BytecodeMetadata.Builder<Instruction> bytecodeMetadataBuilder; + private final BytecodeMetadata.Builder<DexInstruction> bytecodeMetadataBuilder; // The register allocator providing register assignments for the code to build. private final RegisterAllocator registerAllocator; @@ -236,7 +237,7 @@ // Build instructions. DexDebugEventBuilder debugEventBuilder = new DexDebugEventBuilder(ir, options); - List<Instruction> dexInstructions = new ArrayList<>(numberOfInstructions); + List<DexInstruction> dexInstructions = new ArrayList<>(numberOfInstructions); int instructionOffset = 0; for (com.android.tools.r8.ir.code.Instruction irInstruction : ir.instructions()) { Info info = getInfo(irInstruction); @@ -244,7 +245,7 @@ info.addInstructions(this, dexInstructions); int instructionStartOffset = instructionOffset; while (previousInstructionCount < dexInstructions.size()) { - Instruction dexInstruction = dexInstructions.get(previousInstructionCount++); + DexInstruction dexInstruction = dexInstructions.get(previousInstructionCount++); dexInstruction.setOffset(instructionOffset); instructionOffset += dexInstruction.getSize(); } @@ -257,7 +258,7 @@ // We could have also changed the block order, however, moving the throwing block higher // led to larger code in all experiments (multiple gmscore version and R8 run on itself). if (options.canHaveTracingPastInstructionsStreamBug() - && dexInstructions.get(dexInstructions.size() - 1) instanceof Throw + && dexInstructions.get(dexInstructions.size() - 1) instanceof DexThrow && hasBackwardsBranch) { // This is the last in a series of different workarounds tried out. // Having an empty non reachable loop make some mediatek vms crash: b/119895393 @@ -275,12 +276,12 @@ // That way we have no unreachable code, and we never end in a throw. The tracer will still // trace to the throw, but after moving to the second goto it will trace back again and see // an instruction it has already seen. - Instruction throwInstruction = dexInstructions.get(dexInstructions.size() -1); + DexInstruction throwInstruction = dexInstructions.get(dexInstructions.size() - 1); offset = throwInstruction.getOffset(); // Generate the new forward and backward gotos, update offsets. - Instruction forward = new Goto(throwInstruction.getSize() + Goto.SIZE); - Instruction backward = new Goto(-throwInstruction.getSize()); + DexInstruction forward = new DexGoto(throwInstruction.getSize() + DexGoto.SIZE); + DexInstruction backward = new DexGoto(-throwInstruction.getSize()); forward.setOffset(offset); offset += forward.getSize(); throwInstruction.setOffset(offset); @@ -298,12 +299,12 @@ for (SwitchPayloadInfo switchPayloadInfo : switchPayloadInfos) { // Align payloads at even addresses. if (offset % 2 != 0) { - Nop nop = new Nop(); + DexNop nop = new DexNop(); nop.setOffset(offset++); dexInstructions.add(nop); } // Create payload and add it to the instruction stream. - Nop payload = createSwitchPayload(switchPayloadInfo, offset); + DexNop payload = createSwitchPayload(switchPayloadInfo, offset); payload.setOffset(offset); offset += payload.getSize(); dexInstructions.add(payload); @@ -313,12 +314,12 @@ for (FillArrayDataInfo info : fillArrayDataInfos) { // Align payloads at even addresses. if (offset % 2 != 0) { - Nop nop = new Nop(); + DexNop nop = new DexNop(); nop.setOffset(offset++); dexInstructions.add(nop); } // Create payload and add it to the instruction stream. - FillArrayDataPayload payload = info.ir.createPayload(); + DexFillArrayDataPayload payload = info.ir.createPayload(); payload.setOffset(offset); info.dex.setPayloadOffset(offset - info.dex.getOffset()); offset += payload.getSize(); @@ -334,7 +335,7 @@ registerAllocator.registersUsed(), inRegisterCount, outRegisterCount, - dexInstructions.toArray(Instruction.EMPTY_ARRAY), + dexInstructions.toArray(DexInstruction.EMPTY_ARRAY), tryInfo.tries, tryInfo.handlers, debugEventBuilder.build(), @@ -584,7 +585,7 @@ } } - private boolean needsNopBetweenMoveAndInstanceOf(InstanceOf instanceOf) { + private boolean needsNopBetweenMoveAndInstanceOf(DexInstanceOf instanceOf) { if (!options.canHaveArtInstanceOfVerifierBug()) { return false; } @@ -608,9 +609,9 @@ return false; } - public void addInstanceOf(com.android.tools.r8.ir.code.InstanceOf ir, InstanceOf instanceOf) { + public void addInstanceOf(com.android.tools.r8.ir.code.InstanceOf ir, DexInstanceOf instanceOf) { if (needsNopBetweenMoveAndInstanceOf(instanceOf)) { - add(ir, new Nop(), instanceOf); + add(ir, new DexNop(), instanceOf); } else { add(ir, instanceOf); } @@ -645,7 +646,7 @@ } public void addNop(com.android.tools.r8.ir.code.Instruction ir) { - add(ir, new FixedSizeInfo(ir, new Nop())); + add(ir, new FixedSizeInfo(ir, new DexNop())); } public void addDebugPosition(DebugPosition position) { @@ -654,24 +655,24 @@ addNop(position); } - public void add(com.android.tools.r8.ir.code.Instruction instr, Instruction dex) { + public void add(com.android.tools.r8.ir.code.Instruction instr, DexInstruction dex) { assert !instr.isGoto(); add(instr, new FixedSizeInfo(instr, dex)); bytecodeMetadataBuilder.setMetadata(instr, dex); } - public void add(com.android.tools.r8.ir.code.Instruction ir, Instruction... dex) { + public void add(com.android.tools.r8.ir.code.Instruction ir, DexInstruction... dex) { assert !ir.isGoto(); add(ir, new MultiFixedSizeInfo(ir, dex)); } - public void addSwitch(IntSwitch s, Format31t dex) { + public void addSwitch(IntSwitch s, DexFormat31t dex) { assert nextBlock == s.fallthroughBlock(); switchPayloadInfos.add(new SwitchPayloadInfo(s, dex)); add(s, dex); } - public void addFillArrayData(NewArrayFilledData nafd, FillArrayData dex) { + public void addFillArrayData(NewArrayFilledData nafd, DexFillArrayData dex) { fillArrayDataInfos.add(new FillArrayDataInfo(nafd, dex)); add(nafd, dex); } @@ -681,7 +682,7 @@ add(argument, new FallThroughInfo(argument)); } - public void addReturn(Return ret, Instruction dex) { + public void addReturn(Return ret, DexInstruction dex) { if (nextBlock != null && ret.identicalAfterRegisterAllocation( nextBlock.entry(), registerAllocator, conversionOptions)) { @@ -759,7 +760,7 @@ } // Helper for computing switch payloads. - private Nop createSwitchPayload(SwitchPayloadInfo info, int offset) { + private DexNop createSwitchPayload(SwitchPayloadInfo info, int offset) { IntSwitch ir = info.ir; // Patch the payload offset in the generated switch instruction now // that the location is known. @@ -951,7 +952,7 @@ // Materialize the actual construction. // All instruction offsets are known at this point. - public abstract void addInstructions(DexBuilder builder, List<Instruction> instructions); + public abstract void addInstructions(DexBuilder builder, List<DexInstruction> instructions); // Lower bound on the size of the instruction. public abstract int minSize(); @@ -1000,9 +1001,9 @@ private static class FixedSizeInfo extends Info { - private final Instruction instruction; + private final DexInstruction instruction; - public FixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, Instruction instruction) { + public FixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, DexInstruction instruction) { super(ir); this.instruction = instruction; } @@ -1029,7 +1030,7 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) { instructions.add(instruction); } @@ -1042,15 +1043,15 @@ private static class MultiFixedSizeInfo extends Info { - private final Instruction[] instructions; + private final DexInstruction[] instructions; private final int size; - public MultiFixedSizeInfo(com.android.tools.r8.ir.code.Instruction ir, - Instruction[] instructions) { + public MultiFixedSizeInfo( + com.android.tools.r8.ir.code.Instruction ir, DexInstruction[] instructions) { super(ir); this.instructions = instructions; int size = 0; - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { size += instruction.getSize(); } this.size = size; @@ -1062,9 +1063,9 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) { int offset = getOffset(); - for (Instruction instruction : this.instructions) { + for (DexInstruction instruction : this.instructions) { instructions.add(instruction); instruction.setOffset(offset); offset += instruction.getSize(); @@ -1110,8 +1111,7 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { - } + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) {} @Override public int minSize() { @@ -1149,13 +1149,13 @@ @Override public int minSize() { - assert new Goto(42).getSize() == 1; + assert new DexGoto(42).getSize() == 1; return 1; } @Override public int maxSize() { - assert new Goto32(0).getSize() == 3; + assert new DexGoto32(0).getSize() == 3; return 3; } @@ -1201,7 +1201,7 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) { com.android.tools.r8.ir.code.Goto jump = getJump(); int source = builder.getInfo(jump).getOffset(); Info targetInfo = builder.getTargetInfo(jump.getTarget()); @@ -1213,7 +1213,7 @@ // size of this instruction. Return ret = targetInfo.getIR().asReturn(); if (ret != null && size == targetInfo.getSize() && ret.getPosition().isNone()) { - Instruction dex = ret.createDexInstruction(builder); + DexInstruction dex = ret.createDexInstruction(builder); dex.setOffset(getOffset()); // for better printing of the dex code. instructions.add(dex); } else if (size == relativeOffset) { @@ -1222,29 +1222,29 @@ // jit crashes on 'goto next instruction' on Android 4.1.1. // TODO(b/34726595): We currently do hit this case and we should see if we can avoid that. for (int i = 0; i < size; i++) { - Instruction dex = new Nop(); + DexInstruction dex = new DexNop(); assert dex.getSize() == 1; dex.setOffset(getOffset() + i); // for better printing of the dex code. instructions.add(dex); } } else { - Instruction dex; + DexInstruction dex; switch (size) { case 1: assert relativeOffset != 0; - dex = new Goto(relativeOffset); + dex = new DexGoto(relativeOffset); break; case 2: if (relativeOffset == 0) { - Nop nop = new Nop(); + DexNop nop = new DexNop(); instructions.add(nop); - dex = new Goto(-nop.getSize()); + dex = new DexGoto(-nop.getSize()); } else { - dex = new Goto16(relativeOffset); + dex = new DexGoto16(relativeOffset); } break; case 3: - dex = new Goto32(relativeOffset); + dex = new DexGoto32(relativeOffset); break; default: throw new Unreachable("Unexpected size for goto instruction: " + size); @@ -1307,7 +1307,7 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) { If branch = getBranch(); int source = builder.getInfo(branch).getOffset(); int target = builder.getInfo(branch.getTrueTarget().entry()).getOffset(); @@ -1320,53 +1320,53 @@ if (size == 3) { assert branchesToSelf(builder); - Nop nop = new Nop(); + DexNop nop = new DexNop(); relativeOffset -= nop.getSize(); instructions.add(nop); } assert relativeOffset != 0; - Instruction instruction = null; + DexInstruction instruction = null; if (branch.isZeroTest()) { switch (getBranch().getType()) { case EQ: - instruction = new IfEqz(register1, relativeOffset); + instruction = new DexIfEqz(register1, relativeOffset); break; case GE: - instruction = new IfGez(register1, relativeOffset); + instruction = new DexIfGez(register1, relativeOffset); break; case GT: - instruction = new IfGtz(register1, relativeOffset); + instruction = new DexIfGtz(register1, relativeOffset); break; case LE: - instruction = new IfLez(register1, relativeOffset); + instruction = new DexIfLez(register1, relativeOffset); break; case LT: - instruction = new IfLtz(register1, relativeOffset); + instruction = new DexIfLtz(register1, relativeOffset); break; case NE: - instruction = new IfNez(register1, relativeOffset); + instruction = new DexIfNez(register1, relativeOffset); break; } } else { int register2 = getRegister(1, builder); switch (getBranch().getType()) { case EQ: - instruction = new IfEq(register1, register2, relativeOffset); + instruction = new DexIfEq(register1, register2, relativeOffset); break; case GE: - instruction = new IfGe(register1, register2, relativeOffset); + instruction = new DexIfGe(register1, register2, relativeOffset); break; case GT: - instruction = new IfGt(register1, register2, relativeOffset); + instruction = new DexIfGt(register1, register2, relativeOffset); break; case LE: - instruction = new IfLe(register1, register2, relativeOffset); + instruction = new DexIfLe(register1, register2, relativeOffset); break; case LT: - instruction = new IfLt(register1, register2, relativeOffset); + instruction = new DexIfLt(register1, register2, relativeOffset); break; case NE: - instruction = new IfNe(register1, register2, relativeOffset); + instruction = new DexIfNe(register1, register2, relativeOffset); break; } } @@ -1456,46 +1456,46 @@ } @Override - public void addInstructions(DexBuilder builder, List<Instruction> instructions) { + public void addInstructions(DexBuilder builder, List<DexInstruction> instructions) { Move move = getMove(); TypeElement moveType = move.getOutType(); int src = srcRegister(builder); int dest = destRegister(builder); - Instruction instruction; + DexInstruction instruction; switch (size) { case 1: if (src == dest) { - instruction = new Nop(); + instruction = new DexNop(); break; } if (moveType.isSinglePrimitive()) { - instruction = new com.android.tools.r8.code.Move(dest, src); + instruction = new DexMove(dest, src); } else if (moveType.isWidePrimitive()) { - instruction = new MoveWide(dest, src); + instruction = new DexMoveWide(dest, src); } else if (moveType.isReferenceType()) { - instruction = new MoveObject(dest, src); + instruction = new DexMoveObject(dest, src); } else { throw new Unreachable("Unexpected type: " + move.outType()); } break; case 2: if (moveType.isSinglePrimitive()) { - instruction = new MoveFrom16(dest, src); + instruction = new DexMoveFrom16(dest, src); } else if (moveType.isWidePrimitive()) { - instruction = new MoveWideFrom16(dest, src); + instruction = new DexMoveWideFrom16(dest, src); } else if (moveType.isReferenceType()) { - instruction = new MoveObjectFrom16(dest, src); + instruction = new DexMoveObjectFrom16(dest, src); } else { throw new Unreachable("Unexpected type: " + move.outType()); } break; case 3: if (moveType.isSinglePrimitive()) { - instruction = new Move16(dest, src); + instruction = new DexMove16(dest, src); } else if (moveType.isWidePrimitive()) { - instruction = new MoveWide16(dest, src); + instruction = new DexMoveWide16(dest, src); } else if (moveType.isReferenceType()) { - instruction = new MoveObject16(dest, src); + instruction = new DexMoveObject16(dest, src); } else { throw new Unreachable("Unexpected type: " + move.outType()); } @@ -1509,13 +1509,13 @@ @Override public int minSize() { - assert new Nop().getSize() == 1 && new com.android.tools.r8.code.Move(0, 0).getSize() == 1; + assert new DexNop().getSize() == 1 && new DexMove(0, 0).getSize() == 1; return 1; } @Override public int maxSize() { - assert new Move16(0, 0).getSize() == 3; + assert new DexMove16(0, 0).getSize() == 3; return 3; } @@ -1560,9 +1560,9 @@ private static class SwitchPayloadInfo { public final IntSwitch ir; - public final Format31t dex; + public final DexFormat31t dex; - public SwitchPayloadInfo(IntSwitch ir, Format31t dex) { + public SwitchPayloadInfo(IntSwitch ir, DexFormat31t dex) { this.ir = ir; this.dex = dex; } @@ -1571,9 +1571,9 @@ private static class FillArrayDataInfo { public final NewArrayFilledData ir; - public final FillArrayData dex; + public final DexFillArrayData dex; - public FillArrayDataInfo(NewArrayFilledData ir, FillArrayData dex) { + public FillArrayDataInfo(NewArrayFilledData ir, DexFillArrayData dex) { this.ir = ir; this.dex = dex; }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java index a8d0ccd..3fbcdc8 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/DexSourceCode.java
@@ -4,31 +4,31 @@ package com.android.tools.r8.ir.conversion; -import com.android.tools.r8.code.FillArrayData; -import com.android.tools.r8.code.FillArrayDataPayload; -import com.android.tools.r8.code.FilledNewArray; -import com.android.tools.r8.code.FilledNewArrayRange; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeCustom; -import com.android.tools.r8.code.InvokeCustomRange; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeDirectRange; -import com.android.tools.r8.code.InvokeInterface; -import com.android.tools.r8.code.InvokeInterfaceRange; -import com.android.tools.r8.code.InvokePolymorphic; -import com.android.tools.r8.code.InvokePolymorphicRange; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeStaticRange; -import com.android.tools.r8.code.InvokeSuper; -import com.android.tools.r8.code.InvokeSuperRange; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.InvokeVirtualRange; -import com.android.tools.r8.code.MoveException; -import com.android.tools.r8.code.MoveResult; -import com.android.tools.r8.code.MoveResultObject; -import com.android.tools.r8.code.MoveResultWide; -import com.android.tools.r8.code.SwitchPayload; -import com.android.tools.r8.code.Throw; +import com.android.tools.r8.dex.code.DexFillArrayData; +import com.android.tools.r8.dex.code.DexFillArrayDataPayload; +import com.android.tools.r8.dex.code.DexFilledNewArray; +import com.android.tools.r8.dex.code.DexFilledNewArrayRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeCustom; +import com.android.tools.r8.dex.code.DexInvokeCustomRange; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeDirectRange; +import com.android.tools.r8.dex.code.DexInvokeInterface; +import com.android.tools.r8.dex.code.DexInvokeInterfaceRange; +import com.android.tools.r8.dex.code.DexInvokePolymorphic; +import com.android.tools.r8.dex.code.DexInvokePolymorphicRange; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; +import com.android.tools.r8.dex.code.DexInvokeSuper; +import com.android.tools.r8.dex.code.DexInvokeSuperRange; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; +import com.android.tools.r8.dex.code.DexMoveException; +import com.android.tools.r8.dex.code.DexMoveResult; +import com.android.tools.r8.dex.code.DexMoveResultObject; +import com.android.tools.r8.dex.code.DexMoveResultWide; +import com.android.tools.r8.dex.code.DexSwitchPayload; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.graph.DebugLocalInfo; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexCode.Try; @@ -66,7 +66,7 @@ private Try currentTryRange = null; private CatchHandlers<Integer> currentCatchHandlers = null; - private Instruction currentDexInstruction = null; + private DexInstruction currentDexInstruction = null; private boolean isBuildingPrelude; private Position currentPosition = null; @@ -126,13 +126,13 @@ public void setUp() { // Collect all payloads in the instruction stream. for (int index = 0; index < code.instructions.length; index++) { - Instruction insn = code.instructions[index]; + DexInstruction insn = code.instructions[index]; offsetToInstructionIndex.put(insn.getOffset(), index); if (insn.isPayload()) { if (insn.isSwitchPayload()) { - switchPayloadResolver.resolve((SwitchPayload) insn); + switchPayloadResolver.resolve((DexSwitchPayload) insn); } else { - arrayFilledDataPayloadResolver.resolve((FillArrayDataPayload) insn); + arrayFilledDataPayloadResolver.resolve((DexFillArrayDataPayload) insn); } } } @@ -183,9 +183,9 @@ @Override public int getMoveExceptionRegister(int instructionIndex) { - Instruction instruction = code.instructions[instructionIndex]; - if (instruction instanceof MoveException) { - MoveException moveException = (MoveException) instruction; + DexInstruction instruction = code.instructions[instructionIndex]; + if (instruction instanceof DexMoveException) { + DexMoveException moveException = (DexMoveException) instruction; return moveException.AA; } return -1; @@ -297,38 +297,38 @@ arrayFilledDataPayloadResolver.getData(payloadOffset)); } - private boolean isInvoke(Instruction dex) { - return dex instanceof InvokeCustom - || dex instanceof InvokeCustomRange - || dex instanceof InvokeDirect - || dex instanceof InvokeDirectRange - || dex instanceof InvokeVirtual - || dex instanceof InvokeVirtualRange - || dex instanceof InvokeInterface - || dex instanceof InvokeInterfaceRange - || dex instanceof InvokeStatic - || dex instanceof InvokeStaticRange - || dex instanceof InvokeSuper - || dex instanceof InvokeSuperRange - || dex instanceof InvokePolymorphic - || dex instanceof InvokePolymorphicRange - || dex instanceof FilledNewArray - || dex instanceof FilledNewArrayRange; + private boolean isInvoke(DexInstruction dex) { + return dex instanceof DexInvokeCustom + || dex instanceof DexInvokeCustomRange + || dex instanceof DexInvokeDirect + || dex instanceof DexInvokeDirectRange + || dex instanceof DexInvokeVirtual + || dex instanceof DexInvokeVirtualRange + || dex instanceof DexInvokeInterface + || dex instanceof DexInvokeInterfaceRange + || dex instanceof DexInvokeStatic + || dex instanceof DexInvokeStaticRange + || dex instanceof DexInvokeSuper + || dex instanceof DexInvokeSuperRange + || dex instanceof DexInvokePolymorphic + || dex instanceof DexInvokePolymorphicRange + || dex instanceof DexFilledNewArray + || dex instanceof DexFilledNewArrayRange; } - private boolean isMoveResult(Instruction dex) { - return dex instanceof MoveResult - || dex instanceof MoveResultObject - || dex instanceof MoveResultWide; + private boolean isMoveResult(DexInstruction dex) { + return dex instanceof DexMoveResult + || dex instanceof DexMoveResultObject + || dex instanceof DexMoveResultWide; } @Override public int traceInstruction(int index, IRBuilder builder) { - Instruction dex = code.instructions[index]; + DexInstruction dex = code.instructions[index]; int offset = dex.getOffset(); assert !dex.isPayload(); int[] targets = dex.getTargets(); - if (targets != Instruction.NO_TARGETS) { + if (targets != DexInstruction.NO_TARGETS) { // Check that we don't ever have instructions that can throw and have targets. assert !dex.canThrow(); for (int relativeOffset : targets) { @@ -339,7 +339,7 @@ if (dex.canThrow()) { // TODO(zerny): Remove this from block computation. if (dex.hasPayload()) { - arrayFilledDataPayloadResolver.addPayloadUser((FillArrayData) dex); + arrayFilledDataPayloadResolver.addPayloadUser((DexFillArrayData) dex); } // If the instruction can throw and is in a try block, add edges to its catch successors. Try tryRange = getTryForOffset(offset); @@ -366,13 +366,13 @@ dex = code.instructions[index]; } // Edge to normal successor if any (fallthrough). - if (!(dex instanceof Throw)) { + if (!(dex instanceof DexThrow)) { builder.ensureNormalSuccessorBlock(offset, dex.getOffset() + dex.getSize()); } return index; } // Close the block if the instruction is a throw, otherwise the block remains open. - return dex instanceof Throw ? index : -1; + return dex instanceof DexThrow ? index : -1; } if (dex.isIntSwitch()) { // TODO(zerny): Remove this from block computation.
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java b/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java index 39e494d..fb2709f 100644 --- a/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java +++ b/src/main/java/com/android/tools/r8/ir/conversion/SwitchPayloadResolver.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.ir.conversion; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.SwitchPayload; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexSwitchPayload; import java.util.Collection; import java.util.HashMap; import java.util.Map; @@ -28,20 +28,20 @@ } } - private final Map<Integer, SwitchPayload> unresolvedPayload = new HashMap<>(); + private final Map<Integer, DexSwitchPayload> unresolvedPayload = new HashMap<>(); private final Map<Integer, PayloadData> payloadToData = new HashMap<>(); - public void addPayloadUser(Instruction dex) { + public void addPayloadUser(DexInstruction dex) { int offset = dex.getOffset(); int payloadOffset = offset + dex.getPayloadOffset(); payloadToData.put(payloadOffset, new PayloadData(offset)); if (unresolvedPayload.containsKey(payloadOffset)) { - SwitchPayload payload = unresolvedPayload.remove(payloadOffset); + DexSwitchPayload payload = unresolvedPayload.remove(payloadOffset); resolve(payload); } } - public void resolve(SwitchPayload payload) { + public void resolve(DexSwitchPayload payload) { int payloadOffset = payload.getOffset(); PayloadData data = payloadToData.get(payloadOffset); if (data == null) { @@ -59,7 +59,7 @@ data.size = payload.numberOfKeys(); } - public int[] absoluteTargets(Instruction dex) { + public int[] absoluteTargets(DexInstruction dex) { assert dex.isIntSwitch(); return absoluteTargets(dex.getOffset() + dex.getPayloadOffset()); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java index 1376bb4..fcf37fb 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -117,6 +117,11 @@ } @Override + public void acceptCovariantRetargetMethod(ProgramMethod method) { + methodProcessor.scheduleMethodForProcessing(method, this); + } + + @Override public void acceptBackportedMethod(ProgramMethod backportedMethod, ProgramMethod context) { methodProcessor.scheduleMethodForProcessing(backportedMethod, this); } @@ -346,6 +351,11 @@ } @Override + public void acceptCovariantRetargetMethod(ProgramMethod method) { + // Intentionally empty. The method will be hit by tracing if required. + } + + @Override public void acceptThrowMethod(ProgramMethod method, ProgramMethod context) { // Intentionally empty. The method will be hit by tracing if required. }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java index 883a44a..e67d55a 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringEventConsumer.java
@@ -76,6 +76,11 @@ } @Override + public void acceptCovariantRetargetMethod(ProgramMethod method) { + addMethodToReprocess(method); + } + + @Override public void acceptInterfaceInjection(DexProgramClass clazz, DexClass newInterface) { // Intentionally empty. } @@ -165,6 +170,11 @@ } @Override + public void acceptCovariantRetargetMethod(ProgramMethod method) { + additions.addLiveMethod(method); + } + + @Override public void acceptForwardingMethod(ProgramMethod method) { additions.addLiveMethod(method); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java index 0ef825c..3c0046f 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/apimodel/ApiInvokeOutlinerDesugaring.java
@@ -104,12 +104,6 @@ || methodApiLevel.isUnknownApiLevel()) { return appView.computedMinApiLevel(); } - // Compute the api level of the holder to see if the method will be stubbed. - ComputedApiLevel holderApiLevel = - apiLevelCompute.computeApiLevelForLibraryReference(holderType, ComputedApiLevel.unknown()); - if (holderApiLevel.isGreaterThanOrEqualTo(methodApiLevel)) { - return appView.computedMinApiLevel(); - } // Check for protected or package private access flags before outlining. if (holder.isInterface()) { return methodApiLevel;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java index 0a35b58..38682e7 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/backports/BackportedMethods.java
@@ -2218,15 +2218,11 @@ new CfGoto(label2), label1, new CfFrame( - new Int2ObjectAVLTreeMap<>( - new int[] {0}, - new FrameType[] {FrameType.initialized(options.itemFactory.floatType)})), + new Int2ObjectAVLTreeMap<>(new int[] {0}, new FrameType[] {FrameType.floatType()})), new CfConstNumber(0, ValueType.INT), label2, new CfFrame( - new Int2ObjectAVLTreeMap<>( - new int[] {0}, - new FrameType[] {FrameType.initialized(options.itemFactory.floatType)}), + new Int2ObjectAVLTreeMap<>(new int[] {0}, new FrameType[] {FrameType.floatType()}), new ArrayDeque<>(Arrays.asList(FrameType.intType()))), new CfReturn(ValueType.INT), label3),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java index 9a0dd0e..189dca8 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -56,6 +56,7 @@ static final String DONT_REWRITE_PREFIX_KEY = "dont_rewrite_prefix"; static final String MAINTAIN_PREFIX_KEY = "maintain_prefix"; static final String RETARGET_STATIC_FIELD_KEY = "retarget_static_field"; + static final String COVARIANT_RETARGET_METHOD_KEY = "covariant_retarget_method"; static final String RETARGET_METHOD_KEY = "retarget_method"; static final String RETARGET_METHOD_EMULATED_DISPATCH_KEY = "retarget_method_with_emulated_dispatch"; @@ -301,6 +302,14 @@ stringDescriptorToDexType(retarget.getValue().getAsString())); } } + if (jsonFlagSet.has(COVARIANT_RETARGET_METHOD_KEY)) { + for (Map.Entry<String, JsonElement> retarget : + jsonFlagSet.get(COVARIANT_RETARGET_METHOD_KEY).getAsJsonObject().entrySet()) { + builder.covariantRetargetMethod( + parseMethod(retarget.getKey()), + stringDescriptorToDexType(retarget.getValue().getAsString())); + } + } if (jsonFlagSet.has(RETARGET_METHOD_EMULATED_DISPATCH_KEY)) { for (Map.Entry<String, JsonElement> retarget : jsonFlagSet.get(RETARGET_METHOD_EMULATED_DISPATCH_KEY).getAsJsonObject().entrySet()) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java index 7c17a74..94ae8d0 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanRewritingFlags.java
@@ -31,6 +31,7 @@ private final Map<String, Map<String, String>> rewriteDerivedPrefix; private final Map<DexType, DexType> emulatedInterfaces; private final Map<DexField, DexType> retargetStaticField; + private final Map<DexMethod, DexType> covariantRetarget; private final Map<DexMethod, DexType> retargetMethod; private final Map<DexMethod, DexType> retargetMethodEmulatedDispatch; private final Map<DexMethod, DexType[]> apiConversionCollection; @@ -49,6 +50,7 @@ Map<String, Map<String, String>> rewriteDerivedPrefix, Map<DexType, DexType> emulateLibraryInterface, Map<DexField, DexType> retargetStaticField, + Map<DexMethod, DexType> covariantRetarget, Map<DexMethod, DexType> retargetMethod, Map<DexMethod, DexType> retargetMethodEmulatedDispatch, Map<DexMethod, DexType[]> apiConversionCollection, @@ -65,6 +67,7 @@ this.rewriteDerivedPrefix = rewriteDerivedPrefix; this.emulatedInterfaces = emulateLibraryInterface; this.retargetStaticField = retargetStaticField; + this.covariantRetarget = covariantRetarget; this.retargetMethod = retargetMethod; this.retargetMethodEmulatedDispatch = retargetMethodEmulatedDispatch; this.apiConversionCollection = apiConversionCollection; @@ -90,6 +93,7 @@ ImmutableMap.of(), ImmutableMap.of(), ImmutableMap.of(), + ImmutableMap.of(), ImmutableSet.of(), ImmutableSet.of(), ImmutableMap.of(), @@ -111,6 +115,7 @@ rewriteDerivedPrefix, emulatedInterfaces, retargetStaticField, + covariantRetarget, retargetMethod, retargetMethodEmulatedDispatch, apiConversionCollection, @@ -147,6 +152,10 @@ return retargetStaticField; } + public Map<DexMethod, DexType> getCovariantRetarget() { + return covariantRetarget; + } + public Map<DexMethod, DexType> getRetargetMethod() { return retargetMethod; } @@ -192,6 +201,7 @@ && rewriteDerivedPrefix.isEmpty() && maintainPrefix.isEmpty() && emulatedInterfaces.isEmpty() + && covariantRetarget.isEmpty() && retargetMethod.isEmpty() && retargetMethodEmulatedDispatch.isEmpty() && retargetStaticField.isEmpty(); @@ -208,6 +218,7 @@ private final Map<String, Map<String, String>> rewriteDerivedPrefix; private final Map<DexType, DexType> emulatedInterfaces; private final Map<DexField, DexType> retargetStaticField; + private final Map<DexMethod, DexType> covariantRetarget; private final Map<DexMethod, DexType> retargetMethod; private final Map<DexMethod, DexType> retargetMethodEmulatedDispatch; private final Map<DexMethod, DexType[]> apiConversionCollection; @@ -234,6 +245,7 @@ new IdentityHashMap<>(), new IdentityHashMap<>(), new IdentityHashMap<>(), + new IdentityHashMap<>(), Sets.newIdentityHashSet(), Sets.newIdentityHashSet(), new IdentityHashMap<>(), @@ -250,6 +262,7 @@ Map<String, Map<String, String>> rewriteDerivedPrefix, Map<DexType, DexType> emulateLibraryInterface, Map<DexField, DexType> retargetStaticField, + Map<DexMethod, DexType> covariantRetarget, Map<DexMethod, DexType> retargetMethod, Map<DexMethod, DexType> retargetMethodEmulatedDispatch, Map<DexMethod, DexType[]> apiConversionCollection, @@ -268,6 +281,7 @@ this.rewriteDerivedPrefix = new HashMap<>(rewriteDerivedPrefix); this.emulatedInterfaces = new IdentityHashMap<>(emulateLibraryInterface); this.retargetStaticField = new IdentityHashMap<>(retargetStaticField); + this.covariantRetarget = new IdentityHashMap<>(covariantRetarget); this.retargetMethod = new IdentityHashMap<>(retargetMethod); this.retargetMethodEmulatedDispatch = new IdentityHashMap<>(retargetMethodEmulatedDispatch); this.apiConversionCollection = new IdentityHashMap<>(apiConversionCollection); @@ -365,6 +379,15 @@ return this; } + public Builder covariantRetargetMethod(DexMethod key, DexType rewrittenType) { + put( + covariantRetarget, + key, + rewrittenType, + HumanDesugaredLibrarySpecificationParser.COVARIANT_RETARGET_METHOD_KEY); + return this; + } + public Builder retargetStaticField(DexField key, DexType rewrittenType) { put( retargetStaticField, @@ -429,6 +452,7 @@ ImmutableMap.copyOf(rewriteDerivedPrefix), ImmutableMap.copyOf(emulatedInterfaces), ImmutableMap.copyOf(retargetStaticField), + ImmutableMap.copyOf(covariantRetarget), ImmutableMap.copyOf(retargetMethod), ImmutableMap.copyOf(retargetMethodEmulatedDispatch), ImmutableMap.copyOf(apiConversionCollection),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java index 0fdbe35..328bbf4 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
@@ -27,7 +27,7 @@ public class LegacyDesugaredLibrarySpecificationParser { - public static final int MAX_SUPPORTED_VERSION = 4; + public static final int MAX_SUPPORTED_VERSION = 5; public static final SemanticVersion MIN_SUPPORTED_VERSION = SemanticVersion.create(1, 0, 9); static final String VERSION_KEY = "version";
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java index 5533d92..4e08dc9 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -100,6 +100,10 @@ return rewritingFlags.getStaticFieldRetarget(); } + public Map<DexMethod, DexMethod> getCovariantRetarget() { + return rewritingFlags.getCovariantRetarget(); + } + public Map<DexMethod, DexMethod> getStaticRetarget() { return rewritingFlags.getStaticRetarget(); }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java index 0b8530b..7245ddc 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -30,6 +30,7 @@ Set<DexType> maintainType, Map<DexType, DexType> rewriteDerivedTypeOnly, Map<DexField, DexField> staticFieldRetarget, + Map<DexMethod, DexMethod> covariantRetarget, Map<DexMethod, DexMethod> staticRetarget, Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget, Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget, @@ -46,6 +47,7 @@ this.maintainType = maintainType; this.rewriteDerivedTypeOnly = rewriteDerivedTypeOnly; this.staticFieldRetarget = staticFieldRetarget; + this.covariantRetarget = covariantRetarget; this.staticRetarget = staticRetarget; this.nonEmulatedVirtualRetarget = nonEmulatedVirtualRetarget; this.emulatedVirtualRetarget = emulatedVirtualRetarget; @@ -71,6 +73,9 @@ // Fields to retarget. private final Map<DexField, DexField> staticFieldRetarget; + // Methods with covariant return type to retarget. + private final Map<DexMethod, DexMethod> covariantRetarget; + // Static methods to retarget. private final Map<DexMethod, DexMethod> staticRetarget; @@ -119,6 +124,10 @@ return staticFieldRetarget; } + public Map<DexMethod, DexMethod> getCovariantRetarget() { + return covariantRetarget; + } + public Map<DexMethod, DexMethod> getStaticRetarget() { return staticRetarget; } @@ -182,7 +191,8 @@ } public boolean hasRetargeting() { - return !staticRetarget.isEmpty() + return !covariantRetarget.isEmpty() + || !staticRetarget.isEmpty() || !nonEmulatedVirtualRetarget.isEmpty() || !emulatedVirtualRetarget.isEmpty() || !staticFieldRetarget.isEmpty(); @@ -223,6 +233,8 @@ private final Map<DexType, DexType> rewriteDerivedTypeOnly = new IdentityHashMap<>(); private final ImmutableMap.Builder<DexField, DexField> staticFieldRetarget = ImmutableMap.builder(); + private final ImmutableMap.Builder<DexMethod, DexMethod> covariantRetarget = + ImmutableMap.builder(); private final ImmutableMap.Builder<DexMethod, DexMethod> staticRetarget = ImmutableMap.builder(); private final ImmutableMap.Builder<DexMethod, DexMethod> nonEmulatedVirtualRetarget = @@ -266,6 +278,10 @@ staticFieldRetarget.put(src, dest); } + public void putCovariantRetarget(DexMethod src, DexMethod dest) { + covariantRetarget.put(src, dest); + } + public void putStaticRetarget(DexMethod src, DexMethod dest) { staticRetarget.put(src, dest); } @@ -324,6 +340,7 @@ maintainType.build(), rewriteDerivedTypeOnly, staticFieldRetarget.build(), + covariantRetarget.build(), staticRetarget.build(), nonEmulatedVirtualRetarget.build(), emulatedVirtualRetarget.build(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java index 8213473..b9c92a6 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -31,8 +31,8 @@ import java.util.Collections; import java.util.List; import java.util.Map; +import java.util.function.BiFunction; import java.util.function.Consumer; -import java.util.function.Function; import org.objectweb.asm.Opcodes; public class DesugaredLibraryRetargeter implements CfInstructionDesugaring { @@ -41,6 +41,7 @@ private final DesugaredLibraryRetargeterSyntheticHelper syntheticHelper; private final Map<DexField, DexField> staticFieldRetarget; + private final Map<DexMethod, DexMethod> covariantRetarget; private final Map<DexMethod, DexMethod> staticRetarget; private final Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget; private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget; @@ -51,6 +52,7 @@ MachineDesugaredLibrarySpecification specification = appView.options().machineDesugaredLibrarySpecification; staticFieldRetarget = specification.getStaticFieldRetarget(); + covariantRetarget = specification.getCovariantRetarget(); staticRetarget = specification.getStaticRetarget(); nonEmulatedVirtualRetarget = specification.getNonEmulatedVirtualRetarget(); emulatedVirtualRetarget = specification.getEmulatedVirtualRetarget(); @@ -76,7 +78,7 @@ if (instruction.isFieldInstruction() && needsDesugaring(instruction, context)) { return desugarFieldInstruction(instruction.asFieldInstruction(), context); } else if (instruction.isInvoke() && needsDesugaring(instruction, context)) { - return desugarInvoke(instruction.asInvoke(), eventConsumer, context); + return desugarInvoke(instruction.asInvoke(), eventConsumer, context, methodProcessingContext); } return null; } @@ -90,10 +92,14 @@ } private List<CfInstruction> desugarInvoke( - CfInvoke invoke, CfInstructionDesugaringEventConsumer eventConsumer, ProgramMethod context) { + CfInvoke invoke, + CfInstructionDesugaringEventConsumer eventConsumer, + ProgramMethod context, + MethodProcessingContext methodProcessingContext) { InvokeRetargetingResult invokeRetargetingResult = computeNewInvokeTarget(invoke, context); assert invokeRetargetingResult.hasNewInvokeTarget(); - DexMethod newInvokeTarget = invokeRetargetingResult.getNewInvokeTarget(eventConsumer); + DexMethod newInvokeTarget = + invokeRetargetingResult.getNewInvokeTarget(eventConsumer, methodProcessingContext); return Collections.singletonList( new CfInvoke(Opcodes.INVOKESTATIC, newInvokeTarget, invoke.isInterface())); } @@ -128,7 +134,7 @@ } return new InvokeRetargetingResult( true, - eventConsumer -> { + (eventConsumer, methodProcessingContext) -> { syntheticHelper.ensureRetargetMethod(retarget, eventConsumer); return retarget; }); @@ -137,15 +143,19 @@ static class InvokeRetargetingResult { static InvokeRetargetingResult NO_REWRITING = - new InvokeRetargetingResult(false, ignored -> null); + new InvokeRetargetingResult(false, (ignored, alsoIgnored) -> null); private final boolean hasNewInvokeTarget; - private final Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod> + private final BiFunction< + DesugaredLibraryRetargeterInstructionEventConsumer, MethodProcessingContext, DexMethod> newInvokeTargetSupplier; private InvokeRetargetingResult( boolean hasNewInvokeTarget, - Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod> + BiFunction< + DesugaredLibraryRetargeterInstructionEventConsumer, + MethodProcessingContext, + DexMethod> newInvokeTargetSupplier) { this.hasNewInvokeTarget = hasNewInvokeTarget; this.newInvokeTargetSupplier = newInvokeTargetSupplier; @@ -156,9 +166,10 @@ } public DexMethod getNewInvokeTarget( - DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) { + DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer, + MethodProcessingContext methodProcessingContext) { assert hasNewInvokeTarget(); - return newInvokeTargetSupplier.apply(eventConsumer); + return newInvokeTargetSupplier.apply(eventConsumer, methodProcessingContext); } } @@ -205,11 +216,21 @@ if (descriptor != null) { return new InvokeRetargetingResult( true, - eventConsumer -> + (eventConsumer, methodProcessingContext) -> superInvoke ? syntheticHelper.ensureForwardingMethod(descriptor, eventConsumer) : syntheticHelper.ensureEmulatedHolderDispatchMethod(descriptor, eventConsumer)); } + if (covariantRetarget.containsKey(singleTarget)) { + return new InvokeRetargetingResult( + true, + (eventConsumer, methodProcessingContext) -> + syntheticHelper.ensureCovariantRetargetMethod( + singleTarget, + covariantRetarget.get(singleTarget), + eventConsumer, + methodProcessingContext)); + } return ensureInvokeRetargetingResult(nonEmulatedVirtualRetarget.get(singleTarget)); } }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSynthesizerEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSynthesizerEventConsumer.java index 7785430..7e86c5b 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSynthesizerEventConsumer.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSynthesizerEventConsumer.java
@@ -17,6 +17,8 @@ interface DesugaredLibraryRetargeterInstructionEventConsumer { void acceptDesugaredLibraryRetargeterDispatchClasspathClass(DexClasspathClass clazz); + + void acceptCovariantRetargetMethod(ProgramMethod method); } interface DesugaredLibraryRetargeterPostProcessingEventConsumer
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java index 1fa4b75..8e6aca3 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter; +import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.CfCode; @@ -13,11 +14,13 @@ import com.android.tools.r8.graph.DexProto; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.MethodAccessFlags; +import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod; import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor; import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterInstructionEventConsumer; import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterL8SynthesizerEventConsumer; import com.android.tools.r8.ir.synthetic.EmulateDispatchSyntheticCfCodeProvider; +import com.android.tools.r8.ir.synthetic.ForwardMethodBuilder; import com.android.tools.r8.synthesis.SyntheticClassBuilder; import com.android.tools.r8.synthesis.SyntheticItems.SyntheticKindSelector; import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind; @@ -31,6 +34,33 @@ this.appView = appView; } + public DexMethod ensureCovariantRetargetMethod( + DexMethod target, + DexMethod retarget, + DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer, + MethodProcessingContext methodProcessingContext) { + ProgramMethod method = + appView + .getSyntheticItems() + .createMethod( + kinds -> kinds.COVARIANT_OUTLINE, + methodProcessingContext.createUniqueContext(), + appView, + methodBuilder -> + methodBuilder + .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic()) + .setProto(appView.dexItemFactory().prependHolderToProto(target)) + .setCode( + m -> + ForwardMethodBuilder.builder(appView.dexItemFactory()) + .setVirtualTarget(retarget, false) + .setNonStaticSource(target) + .setCastResult() + .build())); + eventConsumer.acceptCovariantRetargetMethod(method); + return method.getReference(); + } + public DexMethod ensureRetargetMethod( DexMethod retarget, DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) { DexClass holderClass = appView.definitionFor(retarget.getHolderType());
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java index 56af1fc..7dcb8a8 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
@@ -42,6 +42,9 @@ .getRetargetStaticField() .forEach((field, type) -> convertRetargetField(builder, field, type)); rewritingFlags + .getCovariantRetarget() + .forEach((method, type) -> convertCovariantRetarget(builder, method, type)); + rewritingFlags .getRetargetMethod() .forEach((method, type) -> convertRetargetMethod(builder, method, type)); rewritingFlags @@ -95,6 +98,41 @@ convertEmulatedVirtualRetarget(builder, rewritingFlags, foundMethod, type); } + private void convertCovariantRetarget( + MachineRewritingFlags.Builder builder, DexMethod method, DexType type) { + DexClass holder = appInfo.definitionFor(method.holder); + DexProto proto = method.getProto(); + DexProto newProto = appInfo.dexItemFactory().createProto(type, proto.parameters); + DexMethod covariant = method.withProto(newProto, appInfo.dexItemFactory()); + DexEncodedMethod foundMethod = holder.lookupMethod(covariant); + if (foundMethod == null) { + missingReferences.add(covariant); + return; + } + if (foundMethod.isStatic()) { + appInfo + .app() + .options + .reporter + .warning( + "Static method " + + foundMethod + + " is flagged as having a covariant return type, which is not possible."); + return; + } + if (seemsToNeedEmulatedDispatch(holder, foundMethod)) { + appInfo + .app() + .options + .reporter + .warning( + "Covariant retargeting of non final method " + + foundMethod + + " which could lead to invalid runtime execution in overrides."); + } + builder.putCovariantRetarget(method, covariant); + } + private void convertRetargetMethod( MachineRewritingFlags.Builder builder, DexMethod method, DexType type) { DexClass holder = appInfo.definitionFor(method.holder);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java index f963a21..89a9163 100644 --- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java +++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceProcessor.java
@@ -6,8 +6,8 @@ import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeSuper; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeSuper; import com.android.tools.r8.errors.CompilationError; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.Code; @@ -193,8 +193,8 @@ Code code = method.getDefinition().getCode(); assert code != null; if (code.isDexCode()) { - for (Instruction insn : code.asDexCode().instructions) { - if (insn instanceof InvokeSuper) { + for (DexInstruction insn : code.asDexCode().instructions) { + if (insn instanceof DexInvokeSuper) { return false; } }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java index 3788e98..107bd20 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -7,9 +7,9 @@ import static com.android.tools.r8.ir.optimize.inliner.InlinerUtils.collectAllMonitorEnterValues; import static com.android.tools.r8.utils.AndroidApiLevelUtils.isApiSafeForInlining; -import com.android.tools.r8.code.MoveResult; -import com.android.tools.r8.code.MoveResultObject; -import com.android.tools.r8.code.MoveResultWide; +import com.android.tools.r8.dex.code.DexMoveResult; +import com.android.tools.r8.dex.code.DexMoveResultObject; +import com.android.tools.r8.dex.code.DexMoveResultWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.graph.AppView; @@ -245,9 +245,9 @@ if (appView.options().isGeneratingDex() && invoke.hasOutValue() && invoke.outValue().hasNonDebugUsers()) { - assert MoveResult.SIZE == MoveResultObject.SIZE; - assert MoveResult.SIZE == MoveResultWide.SIZE; - instructionLimit += MoveResult.SIZE; + assert DexMoveResult.SIZE == DexMoveResultObject.SIZE; + assert DexMoveResult.SIZE == DexMoveResultWide.SIZE; + instructionLimit += DexMoveResult.SIZE; } return instructionLimit; }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java index 93b5d8f..12028fb 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerCostAnalysis.java
@@ -9,9 +9,9 @@ import static com.android.tools.r8.ir.code.Opcodes.INSTANCE_PUT; import static com.android.tools.r8.ir.code.Opcodes.RETURN; -import com.android.tools.r8.code.Iget; -import com.android.tools.r8.code.Iput; -import com.android.tools.r8.code.Return; +import com.android.tools.r8.dex.code.DexIget; +import com.android.tools.r8.dex.code.DexIput; +import com.android.tools.r8.dex.code.DexReturn; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexProgramClass; import com.android.tools.r8.graph.ProgramMethod; @@ -130,7 +130,7 @@ if (appView.options().isGeneratingClassFiles()) { result++; } else { - result += instruction.isInstanceGet() ? Iget.SIZE : Iput.SIZE; + result += instruction.isInstanceGet() ? DexIget.SIZE : DexIput.SIZE; } } break; @@ -140,7 +140,7 @@ if (appView.options().isGeneratingClassFiles()) { result++; } else { - result += Return.SIZE; + result += DexReturn.SIZE; } break;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java b/src/main/java/com/android/tools/r8/ir/optimize/library/FieldSynthesis.java similarity index 81% rename from src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java rename to src/main/java/com/android/tools/r8/ir/optimize/library/FieldSynthesis.java index 5cb256c..dcbca18 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryFieldSynthesis.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/library/FieldSynthesis.java
@@ -4,29 +4,29 @@ package com.android.tools.r8.ir.optimize.library; -import static com.android.tools.r8.graph.DexLibraryClass.asLibraryClassOrNull; +import static com.android.tools.r8.graph.ClasspathOrLibraryClass.asClasspathOrLibraryClass; import com.android.tools.r8.dex.Constants; import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.ClasspathOrLibraryClass; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.graph.DexLibraryClass; import com.android.tools.r8.graph.FieldAccessFlags; /** - * This class synthesizes library fields that we rely on for modeling. + * This class synthesizes classpath/library fields that we rely on for modeling. * * <p>For example, we synthesize the field `java.lang.String java.lang.Enum.name` if it is not * present. We use this to model that the constructor `void java.lang.Enum.<init>(java.lang.String, * int)` initializes `java.lang.String java.lang.Enum.name` to the first argument of the * constructor. */ -public class LibraryFieldSynthesis { +public class FieldSynthesis { public static void synthesizeEnumFields(AppView<?> appView) { DexItemFactory dexItemFactory = appView.dexItemFactory(); - DexLibraryClass enumClass = - asLibraryClassOrNull(appView.definitionFor(dexItemFactory.enumType)); + ClasspathOrLibraryClass enumClass = + asClasspathOrLibraryClass(appView.definitionFor(dexItemFactory.enumType)); if (enumClass != null) { dexItemFactory.enumMembers.forEachField( field -> {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java index a7041c8..df2c436 100644 --- a/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java +++ b/src/main/java/com/android/tools/r8/ir/optimize/library/LibraryOptimizationInfoInitializer.java
@@ -68,7 +68,7 @@ EnumMembers enumMembers = dexItemFactory.enumMembers; DexEncodedMethod enumConstructor = lookupMethod(enumMembers.constructor); if (enumConstructor != null) { - LibraryFieldSynthesis.synthesizeEnumFields(appView); + FieldSynthesis.synthesizeEnumFields(appView); InstanceFieldInitializationInfoFactory factory = appView.instanceFieldInitializationInfoFactory(); InstanceFieldInitializationInfoCollection fieldInitializationInfos =
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/APIConversionCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/APIConversionCfCodeProvider.java index 5932c0b..9bd1ba2 100644 --- a/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/APIConversionCfCodeProvider.java +++ b/src/main/java/com/android/tools/r8/ir/synthetic/apiconverter/APIConversionCfCodeProvider.java
@@ -120,17 +120,14 @@ private void generateParameterConvertAndLoads( List<CfInstruction> instructions, boolean isStatic) { - int stackIndex = BooleanUtils.intValue(!isStatic); + int localIndex = BooleanUtils.intValue(!isStatic); for (int i = 0; i < forwardMethod.getArity(); i++) { ValueType valueType = valueTypeFromForwardMethod(forwardMethod.getParameter(i)); - instructions.add(new CfLoad(valueType, stackIndex)); + instructions.add(new CfLoad(valueType, localIndex)); if (parameterConversions[i] != null) { instructions.add(new CfInvoke(Opcodes.INVOKESTATIC, parameterConversions[i], false)); } - if (valueType.isWide()) { - stackIndex++; - } - stackIndex++; + localIndex += valueType.isWide() ? 2 : 1; } }
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 3ac9bc61..418a665 100644 --- a/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java +++ b/src/main/java/com/android/tools/r8/jar/CfApplicationWriter.java
@@ -88,17 +88,15 @@ private final DexApplication application; private final AppView<?> appView; - private final NamingLens namingLens; private final InternalOptions options; private final Marker marker; private final Predicate<DexType> isTypeMissing; private static final CfVersion MIN_VERSION_FOR_COMPILER_GENERATED_CODE = CfVersion.V1_6; - public CfApplicationWriter(AppView<?> appView, Marker marker, NamingLens namingLens) { + public CfApplicationWriter(AppView<?> appView, Marker marker) { this.application = appView.appInfo().app(); this.appView = appView; - this.namingLens = namingLens; this.options = appView.options(); assert marker != null; this.marker = marker; @@ -106,6 +104,10 @@ PredicateUtils.isNull(appView.appInfo()::definitionForWithoutExistenceAssert); } + private NamingLens getNamingLens() { + return appView.getNamingLens(); + } + public void write(ClassFileConsumer consumer) { assert options.proguardMapConsumer == null; write(consumer, null); @@ -138,7 +140,6 @@ runAndWriteMap( inputApp, appView, - namingLens, application.timing, OriginalSourceFiles.fromClasses(), DebugRepresentation.none(options)); @@ -174,9 +175,9 @@ writeClassCatchingErrors( clazz, globalsConsumer, rewriter, markerString, sourceFileEnvironment); } - globalsConsumer.finished(appView, namingLens); + globalsConsumer.finished(appView); } - ApplicationWriter.supplyAdditionalConsumers(application, appView, namingLens, options); + ApplicationWriter.supplyAdditionalConsumers(appView); } private void writeClassCatchingErrors( @@ -248,16 +249,16 @@ if (clazz.isDeprecated()) { access = AsmUtils.withDeprecated(access); } - String desc = namingLens.lookupDescriptor(clazz.type).toString(); - String name = namingLens.lookupInternalName(clazz.type); - String signature = clazz.getClassSignature().toRenamedString(namingLens, isTypeMissing); + String desc = getNamingLens().lookupDescriptor(clazz.type).toString(); + String name = getNamingLens().lookupInternalName(clazz.type); + String signature = clazz.getClassSignature().toRenamedString(getNamingLens(), isTypeMissing); String superName = clazz.type == options.itemFactory.objectType ? null - : namingLens.lookupInternalName(clazz.superType); + : getNamingLens().lookupInternalName(clazz.superType); String[] interfaces = new String[clazz.interfaces.values.length]; for (int i = 0; i < clazz.interfaces.values.length; i++) { - interfaces[i] = namingLens.lookupInternalName(clazz.interfaces.values[i]); + interfaces[i] = getNamingLens().lookupInternalName(clazz.interfaces.values[i]); } assert SyntheticNaming.verifyNotInternalSynthetic(name); writer.visit(version.raw(), access, name, signature, superName, interfaces); @@ -266,15 +267,15 @@ ImmutableMap<DexString, DexValue> defaults = getAnnotationDefaults(clazz.annotations()); if (clazz.getEnclosingMethodAttribute() != null) { - clazz.getEnclosingMethodAttribute().write(writer, namingLens); + clazz.getEnclosingMethodAttribute().write(writer, getNamingLens()); } if (clazz.getNestHostClassAttribute() != null) { - clazz.getNestHostClassAttribute().write(writer, namingLens); + clazz.getNestHostClassAttribute().write(writer, getNamingLens()); } for (NestMemberClassAttribute entry : clazz.getNestMembersClassAttributes()) { - entry.write(writer, namingLens); + entry.write(writer, getNamingLens()); assert clazz.getNestHostClassAttribute() == null : "A nest host cannot also be a nest member."; } @@ -282,17 +283,17 @@ if (clazz.isRecord()) { // TODO(b/169645628): Strip record components if not kept. for (DexEncodedField instanceField : clazz.instanceFields()) { - String componentName = namingLens.lookupName(instanceField.getReference()).toString(); + String componentName = getNamingLens().lookupName(instanceField.getReference()).toString(); String componentDescriptor = - namingLens.lookupDescriptor(instanceField.getReference().type).toString(); + getNamingLens().lookupDescriptor(instanceField.getReference().type).toString(); String componentSignature = - instanceField.getGenericSignature().toRenamedString(namingLens, isTypeMissing); + instanceField.getGenericSignature().toRenamedString(getNamingLens(), isTypeMissing); writer.visitRecordComponent(componentName, componentDescriptor, componentSignature); } } for (InnerClassAttribute entry : clazz.getInnerClasses()) { - entry.write(writer, namingLens, options); + entry.write(writer, getNamingLens(), options); } for (DexEncodedField field : clazz.staticFields()) { @@ -328,11 +329,11 @@ } private int compareTypesThroughLens(DexType a, DexType b) { - return namingLens.lookupDescriptor(a).compareTo(namingLens.lookupDescriptor(b)); + return getNamingLens().lookupDescriptor(a).compareTo(getNamingLens().lookupDescriptor(b)); } private DexString returnTypeThroughLens(DexMethod method) { - return namingLens.lookupDescriptor(method.getReturnType()); + return getNamingLens().lookupDescriptor(method.getReturnType()); } private int compareMethodsThroughLens(ProgramMethod a, ProgramMethod b) { @@ -422,7 +423,7 @@ DexValue[] values = value.asDexValueArray().getValues(); String[] res = new String[values.length]; for (int i = 0; i < values.length; i++) { - res[i] = namingLens.lookupInternalName(values[i].asDexValueType().value); + res[i] = getNamingLens().lookupInternalName(values[i].asDexValueType().value); } return res; } @@ -439,9 +440,9 @@ if (field.isDeprecated()) { access = AsmUtils.withDeprecated(access); } - String name = namingLens.lookupName(field.getReference()).toString(); - String desc = namingLens.lookupDescriptor(field.getReference().type).toString(); - String signature = field.getGenericSignature().toRenamedString(namingLens, isTypeMissing); + String name = getNamingLens().lookupName(field.getReference()).toString(); + String desc = getNamingLens().lookupDescriptor(field.getReference().type).toString(); + String signature = field.getGenericSignature().toRenamedString(getNamingLens(), isTypeMissing); Object value = getStaticValue(field); FieldVisitor visitor = writer.visitField(access, name, desc, signature, value); writeAnnotations(visitor::visitAnnotation, field.annotations().annotations); @@ -454,13 +455,11 @@ LensCodeRewriterUtils rewriter, ClassWriter writer, ImmutableMap<DexString, DexValue> defaults) { - NamingLens namingLens = this.namingLens; - // For "pass through" classes which has already been library desugared use the identity lens. - if (appView.isAlreadyLibraryDesugared(method.getHolder())) { - namingLens = NamingLens.getIdentityLens(); - } - + NamingLens namingLens = + appView.isAlreadyLibraryDesugared(method.getHolder()) + ? NamingLens.getIdentityLens() + : getNamingLens(); DexEncodedMethod definition = method.getDefinition(); int access = definition.getAccessFlags().getAsCfAccessFlags(); if (definition.isDeprecated()) { @@ -540,7 +539,7 @@ } AnnotationVisitor v = visitor.visit( - namingLens.lookupDescriptor(dexAnnotation.annotation.type).toString(), + getNamingLens().lookupDescriptor(dexAnnotation.annotation.type).toString(), dexAnnotation.visibility == DexAnnotation.VISIBILITY_RUNTIME); if (v != null) { writeAnnotation(v, dexAnnotation.annotation); @@ -562,7 +561,7 @@ DexValueAnnotation valueAnnotation = value.asDexValueAnnotation(); AnnotationVisitor innerVisitor = visitor.visitAnnotation( - name, namingLens.lookupDescriptor(valueAnnotation.value.type).toString()); + name, getNamingLens().lookupDescriptor(valueAnnotation.value.type).toString()); if (innerVisitor != null) { writeAnnotation(innerVisitor, valueAnnotation.value); innerVisitor.visitEnd(); @@ -587,8 +586,8 @@ DexField enumField = value.asDexValueEnum().getValue(); visitor.visitEnum( name, - namingLens.lookupDescriptor(enumField.getType()).toString(), - namingLens.lookupName(enumField).toString()); + getNamingLens().lookupDescriptor(enumField.getType()).toString(), + getNamingLens().lookupName(enumField).toString()); break; case FIELD: @@ -610,7 +609,8 @@ case TYPE: visitor.visit( name, - Type.getType(namingLens.lookupDescriptor(value.asDexValueType().value).toString())); + Type.getType( + getNamingLens().lookupDescriptor(value.asDexValueType().value).toString())); break; default:
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java index 6f34ad1..7d9fd7f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationArgumentInfo.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableMap; @@ -28,8 +27,7 @@ private static final Map<String, KotlinAnnotationArgumentInfo> EMPTY_ARGUMENTS = ImmutableMap.of(); - abstract boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens); + abstract boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView); private static KotlinAnnotationArgumentInfo createArgument( KmAnnotationArgument arg, DexItemFactory factory) { @@ -78,12 +76,10 @@ } @Override - boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView) { return value.toRenamedBinaryNameOrDefault( rewrittenValue -> consumer.accept(new KClassValue(rewrittenValue, arrayDimensionCount)), appView, - namingLens, ClassClassifiers.anyName); } } @@ -111,13 +107,11 @@ } @Override - boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView) { return enumClassName.toRenamedBinaryNameOrDefault( rewrittenEnumClassName -> consumer.accept(new EnumValue(rewrittenEnumClassName, enumEntryName)), appView, - namingLens, ClassClassifiers.anyName); } } @@ -142,16 +136,14 @@ } @Override - boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView) { return value.rewrite( rewrittenAnnotation -> { if (rewrittenAnnotation != null) { consumer.accept(new AnnotationValue(rewrittenAnnotation)); } }, - appView, - namingLens); + appView); } } @@ -185,8 +177,7 @@ } @Override - boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView) { List<KmAnnotationArgument> rewrittenArguments = new ArrayList<>(); boolean rewritten = false; for (KotlinAnnotationArgumentInfo kotlinAnnotationArgumentInfo : value) { @@ -197,8 +188,7 @@ rewrittenArguments.add(rewrittenArg); } }, - appView, - namingLens); + appView); } consumer.accept(new ArrayValue(rewrittenArguments)); return rewritten; @@ -223,8 +213,7 @@ } @Override - boolean rewrite( - Consumer<KmAnnotationArgument> consumer, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(Consumer<KmAnnotationArgument> consumer, AppView<?> appView) { consumer.accept(argument); return false; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java index d21cfb1..249f68f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinAnnotationInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.BooleanBox; import com.android.tools.r8.utils.DescriptorUtils; @@ -51,9 +50,7 @@ } boolean rewrite( - KmVisitorProviders.KmAnnotationVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmAnnotationVisitorProvider visitorProvider, AppView<?> appView) { BooleanBox rewritten = new BooleanBox(false); rewritten.or( annotationType.toRenamedDescriptorOrDefault( @@ -74,12 +71,10 @@ rewrittenArguments.put(key, rewrittenArg); } }, - appView, - namingLens))); + appView))); visitorProvider.get(new KmAnnotation(classifier, rewrittenArguments)); }, appView, - namingLens, null)); return rewritten.get(); }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java index bd8696b..9ddddfe 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassInfo.java
@@ -15,7 +15,6 @@ import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexString; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Box; import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.Pair; @@ -255,14 +254,13 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmClass kmClass = new KmClass(); // TODO(b/154348683): Set flags. kmClass.setFlags(flags); // Set potentially renamed class name. DexString originalDescriptor = clazz.type.descriptor; - DexString rewrittenDescriptor = namingLens.lookupDescriptor(clazz.type); + DexString rewrittenDescriptor = appView.getNamingLens().lookupDescriptor(clazz.type); boolean rewritten = !originalDescriptor.equals(rewrittenDescriptor); if (!nameCanBeSynthesizedFromClassOrAnonymousObjectOrigin) { kmClass.setName(this.name); @@ -273,8 +271,7 @@ if (anonymousObjectOrigin != null && name.equals(anonymousObjectOrigin.toKotlinClassifier(true))) { Box<String> rewrittenOrigin = new Box<>(); - anonymousObjectOrigin.toRenamedBinaryNameOrDefault( - rewrittenOrigin::set, appView, namingLens, null); + anonymousObjectOrigin.toRenamedBinaryNameOrDefault(rewrittenOrigin::set, appView, null); if (rewrittenOrigin.isSet()) { rewrittenName = "." + rewrittenOrigin.get(); } @@ -290,19 +287,22 @@ for (DexEncodedField field : clazz.fields()) { if (field.getKotlinInfo().isCompanion()) { rewritten |= - field.getKotlinInfo().asCompanion().rewrite(kmClass, field.getReference(), namingLens); + field + .getKotlinInfo() + .asCompanion() + .rewrite(kmClass, field.getReference(), appView.getNamingLens()); } } // Take all not backed constructors because we will never find them in definitions. for (KotlinConstructorInfo constructorInfo : constructorsWithNoBacking) { - rewritten |= constructorInfo.rewrite(kmClass, null, appView, namingLens); + rewritten |= constructorInfo.rewrite(kmClass, null, appView); } // Find all constructors. KotlinMetadataMembersTracker rewrittenReferences = new KotlinMetadataMembersTracker(appView); for (DexEncodedMethod method : clazz.methods()) { if (method.getKotlinInfo().isConstructor()) { KotlinConstructorInfo constructorInfo = method.getKotlinInfo().asConstructor(); - rewritten |= constructorInfo.rewrite(kmClass, method, appView, namingLens); + rewritten |= constructorInfo.rewrite(kmClass, method, appView); rewrittenReferences.add(method.getReference()); } } @@ -314,17 +314,16 @@ kmClass::visitTypeAlias, clazz, appView, - namingLens, rewrittenReferences); // Rewrite type parameters. for (KotlinTypeParameterInfo typeParameter : typeParameters) { - rewritten |= typeParameter.rewrite(kmClass::visitTypeParameter, appView, namingLens); + rewritten |= typeParameter.rewrite(kmClass::visitTypeParameter, appView); } // Rewrite super types. for (KotlinTypeInfo superType : superTypes) { // Ensure the rewritten super type is not this type. if (clazz.getType() != superType.rewriteType(appView.graphLens())) { - rewritten |= superType.rewrite(kmClass::visitSupertype, appView, namingLens); + rewritten |= superType.rewrite(kmClass::visitSupertype, appView); } else { rewritten = true; } @@ -333,8 +332,7 @@ for (KotlinTypeReference nestedClass : nestedClasses) { Box<String> nestedDescriptorBox = new Box<>(); boolean nestedClassRewritten = - nestedClass.toRenamedBinaryNameOrDefault( - nestedDescriptorBox::set, appView, namingLens, null); + nestedClass.toRenamedBinaryNameOrDefault(nestedDescriptorBox::set, appView, null); if (nestedDescriptorBox.isSet()) { if (nestedClassRewritten) { // If the class is a nested class, it should be on the form Foo.Bar$Baz, where Baz @@ -361,7 +359,6 @@ } }, appView, - namingLens, null); } // TODO(b/154347404): Understand enum entries. @@ -370,8 +367,7 @@ if (inlineClassUnderlyingPropertyName != null && inlineClassUnderlyingType != null) { kmClass.setInlineClassUnderlyingPropertyName(inlineClassUnderlyingPropertyName); rewritten |= - inlineClassUnderlyingType.rewrite( - kmClass::visitInlineClassUnderlyingType, appView, namingLens); + inlineClassUnderlyingType.rewrite(kmClass::visitInlineClassUnderlyingType, appView); } JvmClassExtensionVisitor extensionVisitor = (JvmClassExtensionVisitor) kmClass.visitExtensions(JvmClassExtensionVisitor.TYPE); @@ -386,12 +382,10 @@ } }, appView, - namingLens, null); } rewritten |= - localDelegatedProperties.rewrite( - extensionVisitor::visitLocalDelegatedProperty, appView, namingLens); + localDelegatedProperties.rewrite(extensionVisitor::visitLocalDelegatedProperty, appView); extensionVisitor.visitEnd(); KotlinClassMetadata.Class.Writer writer = new KotlinClassMetadata.Class.Writer(); kmClass.accept(writer);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java index 34c60de..e8f7fd0 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassLevelInfo.java
@@ -6,7 +6,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Pair; import kotlinx.metadata.jvm.KotlinClassHeader; @@ -57,8 +56,7 @@ return null; } - Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens); + Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView); String getPackageName();
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java index 9b2939e..b6ee8e3 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassifierInfo.java
@@ -12,7 +12,6 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.Reporter; @@ -50,7 +49,7 @@ } } - abstract boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens); + abstract boolean rewrite(KmTypeVisitor visitor, AppView<?> appView); public DexType rewriteType(GraphLens graphLens) { return null; @@ -67,14 +66,12 @@ } @Override - boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmTypeVisitor visitor, AppView<?> appView) { return type.toRenamedDescriptorOrDefault( - descriptor -> { - visitor.visitClass( - getKotlinLocalOrAnonymousNameFromDescriptor(descriptor, isLocalOrAnonymous)); - }, + descriptor -> + visitor.visitClass( + getKotlinLocalOrAnonymousNameFromDescriptor(descriptor, isLocalOrAnonymous)), appView, - namingLens, ClassClassifiers.anyDescriptor); } @@ -98,7 +95,7 @@ } @Override - boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmTypeVisitor visitor, AppView<?> appView) { visitor.visitTypeParameter(typeId); return false; } @@ -118,7 +115,7 @@ } @Override - boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmTypeVisitor visitor, AppView<?> appView) { visitor.visitTypeAlias(typeAlias); return false; } @@ -137,7 +134,7 @@ } @Override - boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmTypeVisitor visitor, AppView<?> appView) { visitor.visitClass(classifier); return false; } @@ -156,7 +153,7 @@ } @Override - boolean rewrite(KmTypeVisitor visitor, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmTypeVisitor visitor, AppView<?> appView) { visitor.visitTypeAlias(classifier); return false; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java index dd82d58..4c93733 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinConstructorInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Reporter; import java.util.List; import kotlinx.metadata.KmClass; @@ -55,8 +54,7 @@ : null); } - boolean rewrite( - KmClass kmClass, DexEncodedMethod method, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmClass kmClass, DexEncodedMethod method, AppView<?> appView) { // Note that JvmExtensionsKt.setSignature does not have an overload for KmConstructorVisitor, // thus we rely on creating the KmConstructor manually. // TODO(b/154348683): Check for special flags to pass in. @@ -67,12 +65,10 @@ signature.rewrite( rewrittenSignature -> JvmExtensionsKt.setSignature(kmConstructor, rewrittenSignature), method, - appView, - namingLens); + appView); } for (KotlinValueParameterInfo valueParameterInfo : valueParameters) { - rewritten |= - valueParameterInfo.rewrite(kmConstructor::visitValueParameter, appView, namingLens); + rewritten |= valueParameterInfo.rewrite(kmConstructor::visitValueParameter, appView); } rewritten |= versionRequirements.rewrite(kmConstructor::visitVersionRequirement); kmClass.getConstructors().add(kmConstructor);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java index 2afb66e..c437bba 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinContractInfo.java
@@ -9,7 +9,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -50,16 +49,14 @@ } boolean rewrite( - KmVisitorProviders.KmContractVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmContractVisitorProvider visitorProvider, AppView<?> appView) { if (this == NO_EFFECT) { return false; } boolean rewritten = false; KmContractVisitor kmContractVisitor = visitorProvider.get(); for (KotlinEffectInfo effect : effects) { - rewritten |= effect.rewrite(kmContractVisitor::visitEffect, appView, namingLens); + rewritten |= effect.rewrite(kmContractVisitor::visitEffect, appView); } kmContractVisitor.visitEnd(); return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java index 5022d48..9307053 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinDeclarationContainerInfo.java
@@ -15,7 +15,6 @@ import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.kotlin.KotlinMetadataUtils.KmPropertyProcessor; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -185,12 +184,11 @@ KmVisitorProviders.KmTypeAliasVisitorProvider typeAliasProvider, DexClass clazz, AppView<?> appView, - NamingLens namingLens, KotlinMetadataMembersTracker rewrittenMembersWithKotlinInfo) { // Type aliases only have a representation here, so we can generate them directly. boolean rewritten = false; for (KotlinTypeAliasInfo typeAlias : typeAliases) { - rewritten |= typeAlias.rewrite(typeAliasProvider, appView, namingLens); + rewritten |= typeAlias.rewrite(typeAliasProvider, appView); } // For properties, we need to combine potentially a field, setter and getter. Map<KotlinPropertyInfo, KotlinPropertyGroup> properties = new LinkedHashMap<>(); @@ -205,11 +203,7 @@ } for (DexEncodedMethod method : clazz.methods()) { if (method.getKotlinInfo().isFunction()) { - rewritten |= - method - .getKotlinInfo() - .asFunction() - .rewrite(functionProvider, method, appView, namingLens); + rewritten |= method.getKotlinInfo().asFunction().rewrite(functionProvider, method, appView); rewrittenMembersWithKotlinInfo.add(method.getReference()); continue; } @@ -235,16 +229,14 @@ kotlinPropertyGroup.backingField, kotlinPropertyGroup.getter, kotlinPropertyGroup.setter, - appView, - namingLens); + appView); } // Add all not backed functions and properties. for (KotlinFunctionInfo notBackedFunction : functionsWithNoBacking) { - rewritten |= notBackedFunction.rewrite(functionProvider, null, appView, namingLens); + rewritten |= notBackedFunction.rewrite(functionProvider, null, appView); } for (KotlinPropertyInfo notBackedProperty : propertiesWithNoBacking) { - rewritten |= - notBackedProperty.rewrite(propertyProvider, null, null, null, appView, namingLens); + rewritten |= notBackedProperty.rewrite(propertyProvider, null, null, null, appView); } return rewritten; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java index bc7cda0..18afe26 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectExpressionInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.kotlin.KmVisitorProviders.KmEffectExpressionVisitorProvider; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -85,8 +84,7 @@ forEachApply(orArguments, arg -> arg::trace, definitionSupplier); } - boolean rewrite( - KmEffectExpressionVisitorProvider provider, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmEffectExpressionVisitorProvider provider, AppView<?> appView) { if (this == NO_EXPRESSION) { return false; } @@ -97,13 +95,13 @@ } boolean rewritten = false; if (isInstanceType != null) { - rewritten |= isInstanceType.rewrite(visitor::visitIsInstanceType, appView, namingLens); + rewritten |= isInstanceType.rewrite(visitor::visitIsInstanceType, appView); } for (KotlinEffectExpressionInfo andArgument : andArguments) { - rewritten |= andArgument.rewrite(visitor::visitAndArgument, appView, namingLens); + rewritten |= andArgument.rewrite(visitor::visitAndArgument, appView); } for (KotlinEffectExpressionInfo orArgument : orArguments) { - rewritten |= orArgument.rewrite(visitor::visitAndArgument, appView, namingLens); + rewritten |= orArgument.rewrite(visitor::visitAndArgument, appView); } visitor.visitEnd(); return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java index e581526..e93b126 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinEffectInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.kotlin.KmVisitorProviders.KmEffectVisitorProvider; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import java.util.List; @@ -51,16 +50,12 @@ conclusion.trace(definitionSupplier); } - boolean rewrite( - KmEffectVisitorProvider visitorProvider, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmEffectVisitorProvider visitorProvider, AppView<?> appView) { KmEffectVisitor kmEffectVisitor = visitorProvider.get(type, invocationKind); boolean rewritten = - conclusion.rewrite( - kmEffectVisitor::visitConclusionOfConditionalEffect, appView, namingLens); + conclusion.rewrite(kmEffectVisitor::visitConclusionOfConditionalEffect, appView); for (KotlinEffectExpressionInfo constructorArgument : constructorArguments) { - rewritten |= - constructorArgument.rewrite( - kmEffectVisitor::visitConstructorArgument, appView, namingLens); + rewritten |= constructorArgument.rewrite(kmEffectVisitor::visitConstructorArgument, appView); } kmEffectVisitor.visitEnd(); return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java index 7981195..f112b4f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFileFacadeInfo.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Pair; import java.util.function.Consumer; import kotlinx.metadata.KmPackage; @@ -58,10 +57,9 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmPackage kmPackage = new KmPackage(); - boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView, namingLens); + boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView); KotlinClassMetadata.FileFacade.Writer writer = new KotlinClassMetadata.FileFacade.Writer(); kmPackage.accept(writer); return Pair.create(writer.write().getHeader(), rewritten);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java index e2a2083..35e52f5 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFlexibleTypeUpperBoundInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import kotlinx.metadata.KmFlexibleTypeUpperBound; @@ -39,9 +38,7 @@ } boolean rewrite( - KmVisitorProviders.KmFlexibleUpperBoundVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmFlexibleUpperBoundVisitorProvider visitorProvider, AppView<?> appView) { if (this == NO_FLEXIBLE_UPPER_BOUND) { // Nothing to do. return false; @@ -50,8 +47,7 @@ assert false; return false; } - return kotlinTypeInfo.rewrite( - flags -> visitorProvider.get(flags, typeFlexibilityId), appView, namingLens); + return kotlinTypeInfo.rewrite(flags -> visitorProvider.get(flags, typeFlexibilityId), appView); } @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java index 5001c40..63e7c95 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFunctionInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Reporter; import java.util.List; import kotlinx.metadata.KmFunction; @@ -119,14 +118,13 @@ boolean rewrite( KmVisitorProviders.KmFunctionVisitorProvider visitorProvider, DexEncodedMethod method, - AppView<?> appView, - NamingLens namingLens) { + AppView<?> appView) { // TODO(b/154348683): Check method for flags to pass in. boolean rewritten = false; String finalName = this.name; if (method != null) { String methodName = method.getReference().name.toString(); - String rewrittenName = namingLens.lookupName(method.getReference()).toString(); + String rewrittenName = appView.getNamingLens().lookupName(method.getReference()).toString(); if (!methodName.equals(rewrittenName)) { rewritten = true; finalName = rewrittenName; @@ -134,23 +132,21 @@ } KmFunctionVisitor kmFunction = visitorProvider.get(flags, finalName); // TODO(b/154348149): ReturnType could have been merged to a subtype. - rewritten |= returnType.rewrite(kmFunction::visitReturnType, appView, namingLens); + rewritten |= returnType.rewrite(kmFunction::visitReturnType, appView); for (KotlinValueParameterInfo valueParameterInfo : valueParameters) { - rewritten |= valueParameterInfo.rewrite(kmFunction::visitValueParameter, appView, namingLens); + rewritten |= valueParameterInfo.rewrite(kmFunction::visitValueParameter, appView); } for (KotlinTypeParameterInfo typeParameterInfo : typeParameters) { - rewritten |= typeParameterInfo.rewrite(kmFunction::visitTypeParameter, appView, namingLens); + rewritten |= typeParameterInfo.rewrite(kmFunction::visitTypeParameter, appView); } if (receiverParameterType != null) { - rewritten |= - receiverParameterType.rewrite( - kmFunction::visitReceiverParameterType, appView, namingLens); + rewritten |= receiverParameterType.rewrite(kmFunction::visitReceiverParameterType, appView); } rewritten |= versionRequirements.rewrite(kmFunction::visitVersionRequirement); JvmFunctionExtensionVisitor extensionVisitor = (JvmFunctionExtensionVisitor) kmFunction.visitExtensions(JvmFunctionExtensionVisitor.TYPE); if (signature != null && extensionVisitor != null) { - rewritten |= signature.rewrite(extensionVisitor::visit, method, appView, namingLens); + rewritten |= signature.rewrite(extensionVisitor::visit, method, appView); } if (lambdaClassOrigin != null && extensionVisitor != null) { rewritten |= @@ -161,10 +157,9 @@ } }, appView, - namingLens, null); } - rewritten |= contract.rewrite(kmFunction::visitContract, appView, namingLens); + rewritten |= contract.rewrite(kmFunction::visitContract, appView); return rewritten; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java index 340275a..a7a8f78 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmFieldSignatureInfo.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Box; import java.util.function.Consumer; @@ -38,16 +37,12 @@ KotlinTypeReference.fromDescriptor(fieldSignature.getDesc(), factory)); } - boolean rewrite( - Consumer<JvmFieldSignature> consumer, - DexEncodedField field, - AppView<?> appView, - NamingLens namingLens) { + boolean rewrite(Consumer<JvmFieldSignature> consumer, DexEncodedField field, AppView<?> appView) { boolean rewritten = false; String finalName = name; if (field != null) { String fieldName = field.getReference().name.toString(); - String rewrittenName = namingLens.lookupName(field.getReference()).toString(); + String rewrittenName = appView.getNamingLens().lookupName(field.getReference()).toString(); if (!fieldName.equals(rewrittenName)) { rewritten = true; finalName = rewrittenName; @@ -55,8 +50,7 @@ } String defValue = appView.dexItemFactory().objectType.toDescriptorString(); Box<String> renamedDescriptor = new Box<>(); - rewritten |= - type.toRenamedDescriptorOrDefault(renamedDescriptor::set, appView, namingLens, defValue); + rewritten |= type.toRenamedDescriptorOrDefault(renamedDescriptor::set, appView, defValue); consumer.accept(new JvmFieldSignature(finalName, renamedDescriptor.get())); return rewritten; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java index 5cfa5ac..2760ece 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinJvmMethodSignatureInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.DescriptorUtils; import com.google.common.collect.ImmutableList; @@ -72,10 +71,7 @@ } boolean rewrite( - Consumer<JvmMethodSignature> consumer, - DexEncodedMethod method, - AppView<?> appView, - NamingLens namingLens) { + Consumer<JvmMethodSignature> consumer, DexEncodedMethod method, AppView<?> appView) { if (invalidDescriptor != null) { consumer.accept(new JvmMethodSignature(name, invalidDescriptor)); return false; @@ -85,7 +81,7 @@ boolean rewritten = false; if (method != null) { String methodName = method.getReference().name.toString(); - String rewrittenName = namingLens.lookupName(method.getReference()).toString(); + String rewrittenName = appView.getNamingLens().lookupName(method.getReference()).toString(); if (!methodName.equals(rewrittenName)) { finalName = rewrittenName; rewritten = true; @@ -95,13 +91,10 @@ descBuilder.append("("); String defValue = appView.dexItemFactory().objectType.toDescriptorString(); for (KotlinTypeReference parameter : parameters) { - rewritten |= - parameter.toRenamedDescriptorOrDefault( - descBuilder::append, appView, namingLens, defValue); + rewritten |= parameter.toRenamedDescriptorOrDefault(descBuilder::append, appView, defValue); } descBuilder.append(")"); - rewritten |= - returnType.toRenamedDescriptorOrDefault(descBuilder::append, appView, namingLens, defValue); + rewritten |= returnType.toRenamedDescriptorOrDefault(descBuilder::append, appView, defValue); consumer.accept(new JvmMethodSignature(finalName, descBuilder.toString())); return rewritten; }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java index b9e4f84..ffe08b4 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLambdaInfo.java
@@ -11,7 +11,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import kotlinx.metadata.KmLambda; @@ -60,10 +59,9 @@ boolean rewrite( KmVisitorProviders.KmLambdaVisitorProvider visitorProvider, DexClass clazz, - AppView<?> appView, - NamingLens namingLens) { + AppView<?> appView) { if (!hasBacking) { - function.rewrite(visitorProvider.get()::visitFunction, null, appView, namingLens); + function.rewrite(visitorProvider.get()::visitFunction, null, appView); return true; } DexEncodedMethod backing = null; @@ -73,7 +71,7 @@ break; } } - return function.rewrite(visitorProvider.get()::visitFunction, backing, appView, namingLens); + return function.rewrite(visitorProvider.get()::visitFunction, backing, appView); } @Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java index 9548bde..4bdce09 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinLocalDelegatedPropertyInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.kotlin.KmVisitorProviders.KmPropertyVisitorProvider; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -52,11 +51,10 @@ forEachApply(propertyInfos, prop -> prop::trace, definitionSupplier); } - boolean rewrite( - KmPropertyVisitorProvider visitorProvider, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmPropertyVisitorProvider visitorProvider, AppView<?> appView) { boolean rewritten = false; for (KotlinPropertyInfo propertyInfo : propertyInfos) { - rewritten |= propertyInfo.rewrite(visitorProvider, null, null, null, appView, namingLens); + rewritten |= propertyInfo.rewrite(visitorProvider, null, null, null, appView); } return rewritten; }
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 fb6575c..5353319 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataRewriter.java
@@ -20,7 +20,6 @@ import com.android.tools.r8.graph.DexValue.DexValueArray; import com.android.tools.r8.graph.DexValue.DexValueInt; import com.android.tools.r8.graph.DexValue.DexValueString; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.ConsumerUtils; import com.android.tools.r8.utils.Pair; import com.android.tools.r8.utils.ThreadUtils; @@ -71,13 +70,11 @@ } private final AppView<?> appView; - private final NamingLens lens; private final DexItemFactory factory; private final Kotlin kotlin; - public KotlinMetadataRewriter(AppView<?> appView, NamingLens lens) { + public KotlinMetadataRewriter(AppView<?> appView) { this.appView = appView; - this.lens = lens; this.factory = appView.dexItemFactory(); this.kotlin = factory.kotlin; } @@ -130,7 +127,7 @@ } public void runForD8(ExecutorService executorService) throws ExecutionException { - if (lens.isIdentityLens()) { + if (appView.getNamingLens().isIdentityLens()) { return; } final WriteMetadataFieldInfo writeMetadataFieldInfo = WriteMetadataFieldInfo.rewriteAll(); @@ -158,7 +155,7 @@ DexAnnotation oldMeta, WriteMetadataFieldInfo writeMetadataFieldInfo) { try { - Pair<KotlinClassHeader, Boolean> kotlinClassHeader = kotlinInfo.rewrite(clazz, appView, lens); + Pair<KotlinClassHeader, Boolean> kotlinClassHeader = kotlinInfo.rewrite(clazz, appView); // TODO(b/185756596): Remove when special handling is no longer needed. if (!kotlinClassHeader.getSecond() && appView.options().testing.keepMetadataInR8IfNotRewritten) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java index 1d927fe..d5884f5 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataUtils.java
@@ -14,7 +14,6 @@ import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.InnerClassAttribute; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.ProguardConfiguration; import com.android.tools.r8.shaking.ProguardConfigurationRule; import com.android.tools.r8.shaking.ProguardKeepRule; @@ -51,8 +50,7 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { throw new Unreachable("Should never be called"); }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java index 0545b20..2a89998 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassFacadeInfo.java
@@ -10,7 +10,6 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Pair; import com.google.common.collect.ImmutableList; import java.util.ArrayList; @@ -56,8 +55,7 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { List<String> partClassNameStrings = new ArrayList<>(partClassNames.size()); boolean rewritten = false; for (KotlinTypeReference partClassName : partClassNames) { @@ -69,7 +67,6 @@ } }, appView, - namingLens, null); } KotlinClassMetadata.MultiFileClassFacade.Writer writer =
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java index 24cb385..6c96b8d 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMultiFileClassPartInfo.java
@@ -8,7 +8,6 @@ import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedMethod; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Pair; import java.util.function.Consumer; import kotlinx.metadata.KmPackage; @@ -65,10 +64,9 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { KmPackage kmPackage = new KmPackage(); - boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView, namingLens); + boolean rewritten = packageInfo.rewrite(kmPackage, clazz, appView); KotlinClassMetadata.MultiFileClassPart.Writer writer = new KotlinClassMetadata.MultiFileClassPart.Writer(); kmPackage.accept(writer);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java index fa483ae..f1e2573 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPackageInfo.java
@@ -12,7 +12,6 @@ import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexEncodedMethod; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import java.util.HashMap; import java.util.Map; @@ -74,7 +73,7 @@ originalMembersWithKotlinInfo); } - boolean rewrite(KmPackage kmPackage, DexClass clazz, AppView<?> appView, NamingLens namingLens) { + boolean rewrite(KmPackage kmPackage, DexClass clazz, AppView<?> appView) { KotlinMetadataMembersTracker rewrittenReferences = new KotlinMetadataMembersTracker(appView); boolean rewritten = containerInfo.rewrite( @@ -83,13 +82,11 @@ kmPackage::visitTypeAlias, clazz, appView, - namingLens, rewrittenReferences); JvmPackageExtensionVisitor extensionVisitor = (JvmPackageExtensionVisitor) kmPackage.visitExtensions(JvmPackageExtensionVisitor.TYPE); rewritten |= - localDelegatedProperties.rewrite( - extensionVisitor::visitLocalDelegatedProperty, appView, namingLens); + localDelegatedProperties.rewrite(extensionVisitor::visitLocalDelegatedProperty, appView); extensionVisitor.visitModuleName(moduleName); extensionVisitor.visitEnd(); return rewritten || !originalMembersWithKotlinInfo.isEqual(rewrittenReferences, appView);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java index 39ab90c..6d10139 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinPropertyInfo.java
@@ -11,7 +11,6 @@ import com.android.tools.r8.graph.DexEncodedField; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Box; import com.android.tools.r8.utils.Reporter; import java.util.List; @@ -144,25 +143,22 @@ DexEncodedField field, DexEncodedMethod getter, DexEncodedMethod setter, - AppView<?> appView, - NamingLens namingLens) { + AppView<?> appView) { // TODO(b/154348683): Flags again. KmPropertyVisitor kmProperty = visitorProvider.get(flags, name, getterFlags, setterFlags); // TODO(b/154348149): ReturnType could have been merged to a subtype. boolean rewritten = false; if (returnType != null) { - rewritten = returnType.rewrite(kmProperty::visitReturnType, appView, namingLens); + rewritten = returnType.rewrite(kmProperty::visitReturnType, appView); } if (receiverParameterType != null) { - rewritten |= - receiverParameterType.rewrite( - kmProperty::visitReceiverParameterType, appView, namingLens); + rewritten |= receiverParameterType.rewrite(kmProperty::visitReceiverParameterType, appView); } if (setterParameter != null) { - rewritten |= setterParameter.rewrite(kmProperty::visitSetterParameter, appView, namingLens); + rewritten |= setterParameter.rewrite(kmProperty::visitSetterParameter, appView); } for (KotlinTypeParameterInfo typeParameter : typeParameters) { - rewritten |= typeParameter.rewrite(kmProperty::visitTypeParameter, appView, namingLens); + rewritten |= typeParameter.rewrite(kmProperty::visitTypeParameter, appView); } rewritten |= versionRequirements.rewrite(kmProperty::visitVersionRequirement); JvmPropertyExtensionVisitor extensionVisitor = @@ -170,18 +166,15 @@ if (extensionVisitor != null) { Box<JvmFieldSignature> rewrittenFieldSignature = new Box<>(); if (fieldSignature != null) { - rewritten |= - fieldSignature.rewrite(rewrittenFieldSignature::set, field, appView, namingLens); + rewritten |= fieldSignature.rewrite(rewrittenFieldSignature::set, field, appView); } Box<JvmMethodSignature> rewrittenGetterSignature = new Box<>(); if (getterSignature != null) { - rewritten |= - getterSignature.rewrite(rewrittenGetterSignature::set, getter, appView, namingLens); + rewritten |= getterSignature.rewrite(rewrittenGetterSignature::set, getter, appView); } Box<JvmMethodSignature> rewrittenSetterSignature = new Box<>(); if (setterSignature != null) { - rewritten |= - setterSignature.rewrite(rewrittenSetterSignature::set, setter, appView, namingLens); + rewritten |= setterSignature.rewrite(rewrittenSetterSignature::set, setter, appView); } extensionVisitor.visit( jvmFlags, @@ -191,12 +184,12 @@ if (syntheticMethodForAnnotations != null) { rewritten |= syntheticMethodForAnnotations.rewrite( - extensionVisitor::visitSyntheticMethodForAnnotations, null, appView, namingLens); + extensionVisitor::visitSyntheticMethodForAnnotations, null, appView); } if (syntheticMethodForDelegate != null) { rewritten |= syntheticMethodForDelegate.rewrite( - extensionVisitor::visitSyntheticMethodForDelegate, null, appView, namingLens); + extensionVisitor::visitSyntheticMethodForDelegate, null, appView); } } return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java index ee55f8b..fb9b55f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClassInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexDefinitionSupplier; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.Pair; import kotlinx.metadata.KmLambda; import kotlinx.metadata.jvm.KotlinClassHeader; @@ -74,13 +73,12 @@ } @Override - public Pair<KotlinClassHeader, Boolean> rewrite( - DexClass clazz, AppView<?> appView, NamingLens namingLens) { + public Pair<KotlinClassHeader, Boolean> rewrite(DexClass clazz, AppView<?> appView) { Writer writer = new Writer(); boolean rewritten = false; if (lambda != null) { KmLambda kmLambda = new KmLambda(); - rewritten = lambda.rewrite(() -> kmLambda, clazz, appView, namingLens); + rewritten = lambda.rewrite(() -> kmLambda, clazz, appView); kmLambda.accept(writer); } return Pair.create(writer.write().getHeader(), rewritten);
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java index c4e307b..8f89b9e 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeAliasInfo.java
@@ -9,7 +9,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import java.util.List; @@ -59,19 +58,15 @@ } boolean rewrite( - KmVisitorProviders.KmTypeAliasVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmTypeAliasVisitorProvider visitorProvider, AppView<?> appView) { KmTypeAliasVisitor kmTypeAliasVisitor = visitorProvider.get(flags, name); - boolean rewritten = - underlyingType.rewrite(kmTypeAliasVisitor::visitUnderlyingType, appView, namingLens); - rewritten |= expandedType.rewrite(kmTypeAliasVisitor::visitExpandedType, appView, namingLens); + boolean rewritten = underlyingType.rewrite(kmTypeAliasVisitor::visitUnderlyingType, appView); + rewritten |= expandedType.rewrite(kmTypeAliasVisitor::visitExpandedType, appView); for (KotlinTypeParameterInfo typeParameter : typeParameters) { - rewritten |= - typeParameter.rewrite(kmTypeAliasVisitor::visitTypeParameter, appView, namingLens); + rewritten |= typeParameter.rewrite(kmTypeAliasVisitor::visitTypeParameter, appView); } for (KotlinAnnotationInfo annotation : annotations) { - rewritten |= annotation.rewrite(kmTypeAliasVisitor::visitAnnotation, appView, namingLens); + rewritten |= annotation.rewrite(kmTypeAliasVisitor::visitAnnotation, appView); } rewritten |= versionRequirements.rewrite(kmTypeAliasVisitor::visitVersionRequirement); return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java index 6127754..e83cff6 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeInfo.java
@@ -83,31 +83,24 @@ return arguments.build(); } - boolean rewrite( - KmVisitorProviders.KmTypeVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + boolean rewrite(KmVisitorProviders.KmTypeVisitorProvider visitorProvider, AppView<?> appView) { // TODO(b/154348683): Check for correct flags KmTypeVisitor kmTypeVisitor = visitorProvider.get(flags); - boolean rewritten = classifier.rewrite(kmTypeVisitor, appView, namingLens); + NamingLens namingLens = appView.getNamingLens(); + boolean rewritten = classifier.rewrite(kmTypeVisitor, appView); if (abbreviatedType != null) { - rewritten |= - abbreviatedType.rewrite(kmTypeVisitor::visitAbbreviatedType, appView, namingLens); + rewritten |= abbreviatedType.rewrite(kmTypeVisitor::visitAbbreviatedType, appView); } if (outerType != null) { - rewritten |= outerType.rewrite(kmTypeVisitor::visitOuterType, appView, namingLens); + rewritten |= outerType.rewrite(kmTypeVisitor::visitOuterType, appView); } for (KotlinTypeProjectionInfo argument : arguments) { rewritten |= argument.rewrite( - kmTypeVisitor::visitArgument, - kmTypeVisitor::visitStarProjection, - appView, - namingLens); + kmTypeVisitor::visitArgument, kmTypeVisitor::visitStarProjection, appView); } rewritten |= - flexibleTypeUpperBound.rewrite( - kmTypeVisitor::visitFlexibleTypeUpperBound, appView, namingLens); + flexibleTypeUpperBound.rewrite(kmTypeVisitor::visitFlexibleTypeUpperBound, appView); if (annotations.isEmpty() && !isRaw) { return rewritten; } @@ -115,7 +108,7 @@ (JvmTypeExtensionVisitor) kmTypeVisitor.visitExtensions(JvmTypeExtensionVisitor.TYPE); if (extensionVisitor != null) { for (KotlinAnnotationInfo annotation : annotations) { - rewritten |= annotation.rewrite(extensionVisitor::visitAnnotation, appView, namingLens); + rewritten |= annotation.rewrite(extensionVisitor::visitAnnotation, appView); } extensionVisitor.visit(isRaw); }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java index 21aeaa1..e6cc10f 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeParameterInfo.java
@@ -9,7 +9,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -85,14 +84,11 @@ } boolean rewrite( - KmVisitorProviders.KmTypeParameterVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmTypeParameterVisitorProvider visitorProvider, AppView<?> appView) { KmTypeParameterVisitor kmTypeParameterVisitor = visitorProvider.get(flags, name, id, variance); boolean rewritten = false; for (KotlinTypeInfo originalUpperBound : originalUpperBounds) { - rewritten |= - originalUpperBound.rewrite(kmTypeParameterVisitor::visitUpperBound, appView, namingLens); + rewritten |= originalUpperBound.rewrite(kmTypeParameterVisitor::visitUpperBound, appView); } if (annotations.isEmpty()) { return rewritten; @@ -102,7 +98,7 @@ kmTypeParameterVisitor.visitExtensions(JvmTypeParameterExtensionVisitor.TYPE); if (extensionVisitor != null) { for (KotlinAnnotationInfo annotation : annotations) { - rewritten |= annotation.rewrite(extensionVisitor::visitAnnotation, appView, namingLens); + rewritten |= annotation.rewrite(extensionVisitor::visitAnnotation, appView); } } return rewritten;
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java index 8fe760b..85791fe 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeProjectionInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import kotlinx.metadata.KmTypeProjection; @@ -38,13 +37,12 @@ boolean rewrite( KmVisitorProviders.KmTypeProjectionVisitorProvider visitorProvider, KmVisitorProviders.KmTypeStarProjectionVisitorProvider starProjectionProvider, - AppView<?> appView, - NamingLens namingLens) { + AppView<?> appView) { if (isStarProjection()) { starProjectionProvider.get(); return false; } else { - return typeInfo.rewrite(flags -> visitorProvider.get(flags, variance), appView, namingLens); + return typeInfo.rewrite(flags -> visitorProvider.get(flags, variance), appView); } }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java index 4fd93a0..adbb277 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinTypeReference.java
@@ -12,7 +12,6 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.kotlin.Kotlin.ClassClassifiers; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.DescriptorUtils; import java.util.function.Consumer; @@ -72,7 +71,6 @@ boolean toRenamedDescriptorOrDefault( Consumer<String> rewrittenConsumer, AppView<?> appView, - NamingLens namingLens, String defaultValue) { if (known == null) { rewrittenConsumer.accept(originalName); @@ -91,7 +89,7 @@ return true; } } - String renamedString = namingLens.lookupDescriptor(rewrittenType).toString(); + String renamedString = appView.getNamingLens().lookupDescriptor(rewrittenType).toString(); rewrittenConsumer.accept(renamedString); return !known.toDescriptorString().equals(renamedString); } @@ -107,7 +105,6 @@ boolean toRenamedBinaryNameOrDefault( Consumer<String> rewrittenConsumer, AppView<?> appView, - NamingLens namingLens, String defaultValue) { if (known == null) { // Unknown values are always on the input form, so we can just return it. @@ -124,7 +121,6 @@ } }, appView, - namingLens, defaultValue); }
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java index 293c35a..1e12db6 100644 --- a/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java +++ b/src/main/java/com/android/tools/r8/kotlin/KotlinValueParameterInfo.java
@@ -7,7 +7,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexDefinitionSupplier; import com.android.tools.r8.graph.DexItemFactory; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.shaking.EnqueuerMetadataTraceable; import com.android.tools.r8.utils.Reporter; import com.google.common.collect.ImmutableList; @@ -67,15 +66,12 @@ } boolean rewrite( - KmVisitorProviders.KmValueParameterVisitorProvider visitorProvider, - AppView<?> appView, - NamingLens namingLens) { + KmVisitorProviders.KmValueParameterVisitorProvider visitorProvider, AppView<?> appView) { KmValueParameterVisitor kmValueParameterVisitor = visitorProvider.get(flags, name); - boolean rewritten = type.rewrite(kmValueParameterVisitor::visitType, appView, namingLens); + boolean rewritten = type.rewrite(kmValueParameterVisitor::visitType, appView); if (varargElementType != null) { rewritten |= - varargElementType.rewrite( - kmValueParameterVisitor::visitVarargElementType, appView, namingLens); + varargElementType.rewrite(kmValueParameterVisitor::visitVarargElementType, appView); } return rewritten; }
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java index 0ad986c..ada07f6 100644 --- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java +++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -8,9 +8,9 @@ import com.android.tools.r8.cf.code.CfConstString; import com.android.tools.r8.cf.code.CfDexItemBasedConstString; import com.android.tools.r8.cf.code.CfInstruction; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.DexItemBasedConstString; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexItemBasedConstString; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexClass; @@ -91,9 +91,9 @@ return; } if (code.isDexCode()) { - for (Instruction instruction : code.asDexCode().instructions) { + for (DexInstruction instruction : code.asDexCode().instructions) { if (instruction.isConstString()) { - ConstString cnst = instruction.asConstString(); + DexConstString cnst = instruction.asConstString(); cnst.BBBB = getRenamedStringLiteral(cnst.getString()); } } @@ -163,15 +163,15 @@ Code code = programMethod.getDefinition().getCode(); assert code != null; if (code.isDexCode()) { - Instruction[] instructions = code.asDexCode().instructions; + DexInstruction[] instructions = code.asDexCode().instructions; for (int i = 0; i < instructions.length; ++i) { - Instruction instruction = instructions[i]; + DexInstruction instruction = instructions[i]; if (instruction.isDexItemBasedConstString()) { DexItemBasedConstString cnst = instruction.asDexItemBasedConstString(); DexString replacement = cnst.getNameComputationInfo() .computeNameFor(cnst.getItem(), appView, appView.graphLens(), lens); - ConstString constString = new ConstString(cnst.AA, replacement); + DexConstString constString = new DexConstString(cnst.AA, replacement); constString.setOffset(instruction.getOffset()); instructions[i] = constString; }
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java index 2add666..297c363 100644 --- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java +++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -16,27 +16,20 @@ // Naming lens for rewriting type prefixes. public class PrefixRewritingNamingLens extends NonIdentityNamingLens { - final NamingLens namingLens; - final InternalOptions options; - final AppView<?> appView; + private final AppView<?> appView; + private final NamingLens namingLens; public static NamingLens createPrefixRewritingNamingLens(AppView<?> appView) { - return createPrefixRewritingNamingLens(appView, NamingLens.getIdentityLens()); - } - - public static NamingLens createPrefixRewritingNamingLens( - AppView<?> appView, NamingLens namingLens) { if (!appView.typeRewriter.isRewriting()) { - return namingLens; + return appView.getNamingLens(); } - return new PrefixRewritingNamingLens(namingLens, appView); + return new PrefixRewritingNamingLens(appView); } - public PrefixRewritingNamingLens(NamingLens namingLens, AppView<?> appView) { + public PrefixRewritingNamingLens(AppView<?> appView) { super(appView.dexItemFactory()); this.appView = appView; - this.namingLens = namingLens; - this.options = appView.options(); + this.namingLens = appView.getNamingLens(); } private boolean isRenamed(DexType type) {
diff --git a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java index fe2654f..9fdb66a 100644 --- a/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java +++ b/src/main/java/com/android/tools/r8/naming/RecordRewritingNamingLens.java
@@ -17,25 +17,24 @@ // Naming lens for rewriting java.lang.Record to the internal RecordTag type. public class RecordRewritingNamingLens extends NonIdentityNamingLens { - final NamingLens namingLens; private final DexItemFactory factory; + private final NamingLens namingLens; - public static NamingLens createRecordRewritingNamingLens( - AppView<?> appView, NamingLens namingLens) { + public static NamingLens createRecordRewritingNamingLens(AppView<?> appView) { if (appView.options().shouldDesugarRecords() && appView .appInfo() .definitionForWithoutExistenceAssert(appView.dexItemFactory().recordType) != null) { - return new RecordRewritingNamingLens(namingLens, appView); + return new RecordRewritingNamingLens(appView); } - return namingLens; + return appView.getNamingLens(); } - public RecordRewritingNamingLens(NamingLens namingLens, AppView<?> appView) { + public RecordRewritingNamingLens(AppView<?> appView) { super(appView.dexItemFactory()); - this.namingLens = namingLens; - factory = appView.dexItemFactory(); + this.factory = appView.dexItemFactory(); + this.namingLens = appView.getNamingLens(); } private boolean isRenamed(DexType type) {
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 e50737d..e4b384f 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
@@ -12,7 +12,6 @@ import com.android.tools.r8.graph.GenericSignatureContextBuilder; import com.android.tools.r8.graph.GenericSignaturePartialTypeArgumentApplier; import com.android.tools.r8.graph.GenericSignatureTypeRewriter; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.utils.IterableUtils; import com.android.tools.r8.utils.ThreadUtils; import java.util.concurrent.ExecutionException; @@ -24,23 +23,21 @@ public class GenericSignatureRewriter { private final AppView<?> appView; - private final NamingLens namingLens; private final GenericSignatureContextBuilder contextBuilder; - public GenericSignatureRewriter(AppView<?> appView, NamingLens namingLens) { - this(appView, namingLens, null); + public GenericSignatureRewriter(AppView<?> appView) { + this(appView, null); } public GenericSignatureRewriter( - AppView<?> appView, NamingLens namingLens, GenericSignatureContextBuilder contextBuilder) { + AppView<?> appView, GenericSignatureContextBuilder contextBuilder) { this.appView = appView; - this.namingLens = namingLens; this.contextBuilder = contextBuilder; } public void runForD8(Iterable<? extends DexProgramClass> classes, ExecutorService executorService) throws ExecutionException { - if (namingLens.isIdentityLens()) { + if (appView.getNamingLens().isIdentityLens()) { return; } run(classes, executorService); @@ -50,7 +47,7 @@ throws ExecutionException { // Rewrite signature annotations for applications that are minified or if we have liveness // information, since we could have pruned types. - if (namingLens.isIdentityLens() + if (appView.getNamingLens().isIdentityLens() && !appView.appInfo().hasLiveness() && !appView.options().parseSignatureAttribute()) { return;
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 a03ff91..0f67814 100644 --- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java +++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -291,6 +291,14 @@ return; } + if (method.getHolderType().isArrayType()) { + assert resolutionResult.getResolvedHolder().getType() + == appView.dexItemFactory().objectType; + lensBuilder.map( + method, resolutionResult.getResolvedMethod().getReference(), invokeType); + return; + } + // TODO(b/128404854) Rebind to the lowest library class or program class. For now we allow // searching in library for methods, but this should be done on classpath instead. DexClassAndMethod resolvedMethod = resolutionResult.getResolutionPair();
diff --git a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java index f640d08..09966ca 100644 --- a/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java +++ b/src/main/java/com/android/tools/r8/optimize/bridgehoisting/BridgeHoisting.java
@@ -7,9 +7,9 @@ import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.InvokeVirtualRange; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.BottomUpClassHierarchyTraversal; @@ -332,24 +332,24 @@ } private DexCode createDexCodeForVirtualBridge(DexCode code, DexMethod methodToInvoke) { - Instruction[] newInstructions = new Instruction[code.instructions.length]; + DexInstruction[] newInstructions = new DexInstruction[code.instructions.length]; boolean modified = false; for (int i = 0; i < code.instructions.length; i++) { - Instruction instruction = code.instructions[i]; + DexInstruction instruction = code.instructions[i]; if (instruction.isInvokeVirtual() && instruction.asInvokeVirtual().getMethod() != methodToInvoke) { - InvokeVirtual invoke = instruction.asInvokeVirtual(); - InvokeVirtual newInvoke = - new InvokeVirtual( + DexInvokeVirtual invoke = instruction.asInvokeVirtual(); + DexInvokeVirtual newInvoke = + new DexInvokeVirtual( invoke.A, methodToInvoke, invoke.C, invoke.D, invoke.E, invoke.F, invoke.G); newInvoke.setOffset(invoke.getOffset()); newInstructions[i] = newInvoke; modified = true; } else if (instruction.isInvokeVirtualRange() && instruction.asInvokeVirtualRange().getMethod() != methodToInvoke) { - InvokeVirtualRange invoke = instruction.asInvokeVirtualRange(); - InvokeVirtualRange newInvoke = - new InvokeVirtualRange(invoke.CCCC, invoke.AA, methodToInvoke); + DexInvokeVirtualRange invoke = instruction.asInvokeVirtualRange(); + DexInvokeVirtualRange newInvoke = + new DexInvokeVirtualRange(invoke.CCCC, invoke.AA, methodToInvoke); newInvoke.setOffset(invoke.getOffset()); modified = true; newInstructions[i] = newInvoke;
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java index 3c647b9..fc3c106 100644 --- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/BottomCfFrameState.java
@@ -4,13 +4,11 @@ package com.android.tools.r8.optimize.interfaces.analysis; -import com.android.tools.r8.cf.code.CfAssignability; import com.android.tools.r8.cf.code.CfFrame; import com.android.tools.r8.cf.code.CfFrame.FrameType; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.ValueType; import java.util.function.BiFunction; @@ -31,11 +29,7 @@ @Override public CfFrameState check(AppView<?> appView, CfFrame frame) { - if (CfAssignability.isFrameAssignable(new CfFrame(), frame, appView).isFailed()) { - return error(); - } - CfFrame frameCopy = frame.mutableCopy(); - return new ConcreteCfFrameState(frameCopy.getLocals(), frameCopy.getStack()); + return new ConcreteCfFrameState().check(appView, frame); } @Override @@ -45,60 +39,61 @@ @Override public CfFrameState markInitialized(FrameType uninitializedType, DexType initializedType) { - return error(); + // Initializing an uninitialized type is a no-op when the frame is empty. + return this; } @Override - public CfFrameState pop() { - return error(); + public ErroneousCfFrameState pop() { + return error("Unexpected pop from empty stack"); } @Override - public CfFrameState pop(BiFunction<CfFrameState, FrameType, CfFrameState> fn) { - return error(); + public ErroneousCfFrameState pop(BiFunction<CfFrameState, FrameType, CfFrameState> fn) { + return pop(); } @Override - public CfFrameState popAndInitialize( - AppView<?> appView, DexMethod constructor, ProgramMethod context) { - return error(); + public ErroneousCfFrameState popAndInitialize( + AppView<?> appView, DexMethod constructor, CfAnalysisConfig config) { + return pop(); } @Override - public CfFrameState popInitialized( + public ErroneousCfFrameState popInitialized( AppView<?> appView, DexType expectedType, BiFunction<CfFrameState, FrameType, CfFrameState> fn) { - return error(); + return pop(); } @Override public CfFrameState popInitialized(AppView<?> appView, DexType... expectedTypes) { - return error(); + return expectedTypes.length == 0 ? this : pop(); } @Override - public CfFrameState push(DexType type) { - return new ConcreteCfFrameState().push(type); + public CfFrameState push(CfAnalysisConfig config, DexType type) { + return new ConcreteCfFrameState().push(config, type); } @Override - public CfFrameState push(FrameType frameType) { - return new ConcreteCfFrameState().push(frameType); + public CfFrameState push(CfAnalysisConfig config, FrameType frameType) { + return new ConcreteCfFrameState().push(config, frameType); } @Override - public CfFrameState readLocal( + public ErroneousCfFrameState readLocal( AppView<?> appView, int localIndex, ValueType expectedType, BiFunction<CfFrameState, FrameType, CfFrameState> fn) { - return error(); + return error("Unexpected local read from empty frame"); } @Override - public CfFrameState storeLocal(int localIndex, FrameType frameType) { - return new ConcreteCfFrameState().storeLocal(localIndex, frameType); + public CfFrameState storeLocal(int localIndex, FrameType frameType, CfAnalysisConfig config) { + return new ConcreteCfFrameState().storeLocal(localIndex, frameType, config); } @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfAnalysisConfig.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfAnalysisConfig.java new file mode 100644 index 0000000..bd8a7c9 --- /dev/null +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfAnalysisConfig.java
@@ -0,0 +1,19 @@ +// Copyright (c) 2022, 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.optimize.interfaces.analysis; + +import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.DexType; + +public interface CfAnalysisConfig { + + DexMethod getCurrentContext(); + + int getMaxLocals(); + + int getMaxStack(); + + boolean isImmediateSuperClassOfCurrentContext(DexType type); +}
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java index 1cddb8f..b12cc01 100644 --- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfFrameState.java
@@ -4,6 +4,9 @@ package com.android.tools.r8.optimize.interfaces.analysis; +import static com.android.tools.r8.optimize.interfaces.analysis.ErroneousCfFrameState.formatActual; +import static com.android.tools.r8.optimize.interfaces.analysis.ErroneousCfFrameState.formatExpected; + import com.android.tools.r8.cf.code.CfAssignability; import com.android.tools.r8.cf.code.CfFrame; import com.android.tools.r8.cf.code.CfFrame.FrameType; @@ -11,7 +14,6 @@ import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.analysis.framework.intraprocedural.AbstractState; import com.android.tools.r8.ir.analysis.type.PrimitiveTypeElement; import com.android.tools.r8.ir.code.MemberType; @@ -20,6 +22,7 @@ import com.android.tools.r8.utils.FunctionUtils; import com.android.tools.r8.utils.TriFunction; import java.util.function.BiFunction; +import java.util.function.UnaryOperator; public abstract class CfFrameState extends AbstractState<CfFrameState> { @@ -27,8 +30,39 @@ return BottomCfFrameState.getInstance(); } - public static ErroneousCfFrameState error() { - return ErroneousCfFrameState.getInstance(); + public static ErroneousCfFrameState error(String message) { + return new ErroneousCfFrameState(message); + } + + public static ErroneousCfFrameState errorUnexpectedLocal( + FrameType frameType, ValueType expectedType, int localIndex) { + return internalError( + formatActual(frameType), formatExpected(expectedType), "at local index " + localIndex); + } + + public static ErroneousCfFrameState errorUnexpectedStack( + FrameType frameType, DexType expectedType) { + return internalErrorUnexpectedStack(formatActual(frameType), formatExpected(expectedType)); + } + + public static ErroneousCfFrameState errorUnexpectedStack( + FrameType frameType, FrameType expectedType) { + return internalErrorUnexpectedStack(formatActual(frameType), formatExpected(expectedType)); + } + + public static ErroneousCfFrameState errorUnexpectedStack( + FrameType frameType, ValueType expectedType) { + return internalErrorUnexpectedStack(formatActual(frameType), formatExpected(expectedType)); + } + + private static ErroneousCfFrameState internalErrorUnexpectedStack( + String actual, String expected) { + return internalError(actual, expected, "on stack"); + } + + private static ErroneousCfFrameState internalError( + String actual, String expected, String location) { + return error("Expected " + expected + " " + location + ", but was " + actual); } @Override @@ -36,6 +70,15 @@ return this; } + @Override + public boolean isGreaterThanOrEquals(CfFrameState state) { + if (this == state) { + return true; + } + CfFrameState leastUpperBound = join(state, UnaryOperator.identity()); + return equals(leastUpperBound); + } + public boolean isBottom() { return false; } @@ -52,6 +95,10 @@ return false; } + public ErroneousCfFrameState asError() { + return null; + } + public abstract CfFrameState check(AppView<?> appView, CfFrame frame); public abstract CfFrameState clear(); @@ -64,7 +111,7 @@ public abstract CfFrameState pop(BiFunction<CfFrameState, FrameType, CfFrameState> fn); public abstract CfFrameState popAndInitialize( - AppView<?> appView, DexMethod constructor, ProgramMethod context); + AppView<?> appView, DexMethod constructor, CfAnalysisConfig config); public final CfFrameState popInitialized(AppView<?> appView, DexType expectedType) { return popInitialized(appView, expectedType, FunctionUtils::getFirst); @@ -101,22 +148,26 @@ } public final CfFrameState popObject(BiFunction<CfFrameState, FrameType, CfFrameState> fn) { - return pop((state, head) -> head.isObject() ? fn.apply(state, head) : error()); + return pop( + (state, head) -> + head.isObject() ? fn.apply(state, head) : errorUnexpectedStack(head, ValueType.OBJECT)); } @SuppressWarnings("InconsistentOverloads") public final CfFrameState popObject( AppView<?> appView, DexType expectedType, - ProgramMethod context, + CfAnalysisConfig config, BiFunction<CfFrameState, FrameType, CfFrameState> fn) { return pop( (state, head) -> head.isObject() && CfAssignability.isAssignable( - head.getObjectType(context), expectedType, appView) + head.getObjectType(config.getCurrentContext().getHolderType()), + expectedType, + appView) ? fn.apply(state, head) - : error()); + : errorUnexpectedStack(head, expectedType)); } public final CfFrameState popSingle() { @@ -124,7 +175,11 @@ } public final CfFrameState popSingle(BiFunction<CfFrameState, FrameType, CfFrameState> fn) { - return pop((state, single) -> single.isSingle() ? fn.apply(state, single) : error()); + return pop( + (state, single) -> + single.isSingle() + ? fn.apply(state, single) + : errorUnexpectedStack(single, FrameType.oneWord())); } public final CfFrameState popSingles( @@ -150,61 +205,77 @@ wideFn); } - // TODO(b/214496607): Pushing a value should return an error if the stack grows larger than the - // max stack height. - public abstract CfFrameState push(DexType type); + public abstract CfFrameState push(CfAnalysisConfig config, DexType type); - // TODO(b/214496607): Pushing a value should return an error if the stack grows larger than the - // max stack height. - public abstract CfFrameState push(FrameType frameType); + public abstract CfFrameState push(CfAnalysisConfig config, FrameType frameType); - public final CfFrameState push(FrameType frameType, FrameType frameType2) { - return push(frameType).push(frameType2); - } - - public final CfFrameState push(FrameType frameType, FrameType frameType2, FrameType frameType3) { - return push(frameType).push(frameType2).push(frameType3); + public final CfFrameState push( + CfAnalysisConfig config, FrameType frameType, FrameType frameType2) { + return push(config, frameType).push(config, frameType2); } public final CfFrameState push( - FrameType frameType, FrameType frameType2, FrameType frameType3, FrameType frameType4) { - return push(frameType).push(frameType2).push(frameType3).push(frameType4); + CfAnalysisConfig config, FrameType frameType, FrameType frameType2, FrameType frameType3) { + return push(config, frameType).push(config, frameType2).push(config, frameType3); } public final CfFrameState push( + CfAnalysisConfig config, + FrameType frameType, + FrameType frameType2, + FrameType frameType3, + FrameType frameType4) { + return push(config, frameType) + .push(config, frameType2) + .push(config, frameType3) + .push(config, frameType4); + } + + public final CfFrameState push( + CfAnalysisConfig config, FrameType frameType, FrameType frameType2, FrameType frameType3, FrameType frameType4, FrameType frameType5) { - return push(frameType).push(frameType2).push(frameType3).push(frameType4).push(frameType5); + return push(config, frameType) + .push(config, frameType2) + .push(config, frameType3) + .push(config, frameType4) + .push(config, frameType5); } public final CfFrameState push( + CfAnalysisConfig config, FrameType frameType, FrameType frameType2, FrameType frameType3, FrameType frameType4, FrameType frameType5, FrameType frameType6) { - return push(frameType) - .push(frameType2) - .push(frameType3) - .push(frameType4) - .push(frameType5) - .push(frameType6); + return push(config, frameType) + .push(config, frameType2) + .push(config, frameType3) + .push(config, frameType4) + .push(config, frameType5) + .push(config, frameType6); } - public final CfFrameState push(AppView<?> appView, MemberType memberType) { - return push(FrameType.fromPreciseMemberType(memberType, appView.dexItemFactory())); + @SuppressWarnings("InconsistentOverloads") + public final CfFrameState push( + AppView<?> appView, CfAnalysisConfig config, MemberType memberType) { + return push(config, FrameType.fromPreciseMemberType(memberType, appView.dexItemFactory())); } - public final CfFrameState push(AppView<?> appView, NumericType numericType) { - return push(numericType.toDexType(appView.dexItemFactory())); + @SuppressWarnings("InconsistentOverloads") + public final CfFrameState push( + AppView<?> appView, CfAnalysisConfig config, NumericType numericType) { + return push(config, numericType.toDexType(appView.dexItemFactory())); } - public final CfFrameState push(AppView<?> appView, ValueType valueType) { - return push(valueType.toDexType(appView.dexItemFactory())); + @SuppressWarnings("InconsistentOverloads") + public final CfFrameState push(AppView<?> appView, CfAnalysisConfig config, ValueType valueType) { + return push(config, valueType.toDexType(appView.dexItemFactory())); } public abstract CfFrameState readLocal( @@ -213,20 +284,32 @@ ValueType expectedType, BiFunction<CfFrameState, FrameType, CfFrameState> consumer); - public abstract CfFrameState storeLocal(int localIndex, FrameType frameType); + public abstract CfFrameState storeLocal( + int localIndex, FrameType frameType, CfAnalysisConfig config); public final CfFrameState storeLocal( - int localIndex, PrimitiveTypeElement primitiveType, AppView<?> appView) { + int localIndex, + PrimitiveTypeElement primitiveType, + AppView<?> appView, + CfAnalysisConfig config) { assert primitiveType.isInt() || primitiveType.isFloat() || primitiveType.isLong() || primitiveType.isDouble(); return storeLocal( - localIndex, FrameType.initialized(primitiveType.toDexType(appView.dexItemFactory()))); + localIndex, + FrameType.initialized(primitiveType.toDexType(appView.dexItemFactory())), + config); } @Override public final CfFrameState join(CfFrameState state) { + return join( + state, frameType -> frameType.isSingle() ? FrameType.oneWord() : FrameType.twoWord()); + } + + public final CfFrameState join( + CfFrameState state, UnaryOperator<FrameType> joinWithMissingLocal) { if (state.isBottom() || isError()) { return this; } @@ -235,7 +318,7 @@ } assert isConcrete(); assert state.isConcrete(); - return asConcrete().join(state.asConcrete()); + return asConcrete().join(state.asConcrete(), joinWithMissingLocal); } @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java index 288f281..33e4cf2 100644 --- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/CfOpenClosedInterfacesAnalysis.java
@@ -9,7 +9,9 @@ import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexEncodedMethod; +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.ProgramMethod; import com.android.tools.r8.ir.analysis.framework.intraprocedural.AbstractTransferFunction; import com.android.tools.r8.ir.analysis.framework.intraprocedural.DataflowAnalysisResult; @@ -53,16 +55,41 @@ private class TransferFunction implements AbstractTransferFunction<CfBlock, CfInstruction, CfFrameState> { - private final ProgramMethod context; + private final CfAnalysisConfig config; TransferFunction(ProgramMethod context) { - this.context = context; + CfCode code = context.getDefinition().getCode().asCfCode(); + int maxLocals = code.getMaxLocals(); + int maxStack = code.getMaxStack(); + this.config = + new CfAnalysisConfig() { + + @Override + public DexMethod getCurrentContext() { + return context.getReference(); + } + + @Override + public int getMaxLocals() { + return maxLocals; + } + + @Override + public int getMaxStack() { + return maxStack; + } + + @Override + public boolean isImmediateSuperClassOfCurrentContext(DexType type) { + return type == context.getHolder().getSuperType(); + } + }; } @Override public TransferFunctionResult<CfFrameState> apply( CfInstruction instruction, CfFrameState state) { - return instruction.evaluate(state, context, appView, appView.dexItemFactory()); + return instruction.evaluate(state, appView, config, appView.dexItemFactory()); } @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java index 7f52c1b..a76a6d3 100644 --- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ConcreteCfFrameState.java
@@ -5,8 +5,10 @@ package com.android.tools.r8.optimize.interfaces.analysis; import static com.android.tools.r8.cf.code.CfFrame.getInitializedFrameType; +import static com.android.tools.r8.optimize.interfaces.analysis.ErroneousCfFrameState.formatActual; import com.android.tools.r8.cf.code.CfAssignability; +import com.android.tools.r8.cf.code.CfAssignability.AssignabilityResult; import com.android.tools.r8.cf.code.CfFrame; import com.android.tools.r8.cf.code.CfFrame.FrameType; import com.android.tools.r8.cf.code.frame.SingleFrameType; @@ -14,8 +16,10 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.ValueType; +import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.utils.FunctionUtils; +import com.google.common.collect.Iterables; import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap; import it.unimi.dsi.fastutil.ints.Int2ObjectMap.Entry; @@ -26,19 +30,28 @@ import java.util.Iterator; import java.util.Objects; import java.util.function.BiFunction; +import java.util.function.UnaryOperator; public class ConcreteCfFrameState extends CfFrameState { - private final Int2ObjectSortedMap<FrameType> locals; - private final Deque<FrameType> stack; + private final Int2ObjectAVLTreeMap<FrameType> locals; + private final ArrayDeque<FrameType> stack; + private int stackHeight; ConcreteCfFrameState() { - this(new Int2ObjectAVLTreeMap<>(), new ArrayDeque<>()); + this(new Int2ObjectAVLTreeMap<>(), new ArrayDeque<>(), 0); } - ConcreteCfFrameState(Int2ObjectSortedMap<FrameType> locals, Deque<FrameType> stack) { + ConcreteCfFrameState( + Int2ObjectAVLTreeMap<FrameType> locals, ArrayDeque<FrameType> stack, int stackHeight) { this.locals = locals; this.stack = stack; + this.stackHeight = stackHeight; + } + + @Override + public CfFrameState clone() { + return new ConcreteCfFrameState(locals.clone(), stack.clone(), stackHeight); } @Override @@ -53,11 +66,15 @@ @Override public CfFrameState check(AppView<?> appView, CfFrame frame) { - if (CfAssignability.isFrameAssignable(new CfFrame(), frame, appView).isFailed()) { - return error(); + CfFrame currentFrame = CfFrame.builder().setLocals(locals).setStack(stack).build(); + AssignabilityResult assignabilityResult = + CfAssignability.isFrameAssignable(currentFrame, frame, appView); + if (assignabilityResult.isFailed()) { + return error(assignabilityResult.asFailed().getMessage()); } CfFrame frameCopy = frame.mutableCopy(); - return new ConcreteCfFrameState(frameCopy.getLocals(), frameCopy.getStack()); + return new ConcreteCfFrameState( + frameCopy.getMutableLocals(), frameCopy.getMutableStack(), stackHeight); } @Override @@ -68,7 +85,7 @@ @Override public CfFrameState markInitialized(FrameType uninitializedType, DexType initializedType) { if (uninitializedType.isInitialized()) { - return error(); + return error("Unexpected attempt to initialize already initialized type"); } for (Int2ObjectMap.Entry<FrameType> entry : locals.int2ObjectEntrySet()) { FrameType frameType = entry.getValue(); @@ -78,67 +95,89 @@ } // TODO(b/214496607): By using a collection that supports element replacement this could mutate // the existing stack instead of building a new one. - Deque<FrameType> newStack = new ArrayDeque<>(); + ArrayDeque<FrameType> newStack = new ArrayDeque<>(); for (FrameType frameType : stack) { FrameType initializedFrameType = getInitializedFrameType(uninitializedType, frameType, initializedType); newStack.addLast(initializedFrameType); } - return new ConcreteCfFrameState(locals, newStack); + return new ConcreteCfFrameState(locals, newStack, stackHeight); } @Override public CfFrameState pop() { - if (stack.isEmpty()) { - return error(); - } - stack.removeLast(); - return this; + return pop(FunctionUtils::getFirst); } @Override public CfFrameState pop(BiFunction<CfFrameState, FrameType, CfFrameState> fn) { if (stack.isEmpty()) { - return error(); + // Return the same error as when popping from the bottom state. + return bottom().pop(); } FrameType frameType = stack.removeLast(); + stackHeight -= frameType.getWidth(); return fn.apply(this, frameType); } @Override public CfFrameState popAndInitialize( - AppView<?> appView, DexMethod constructor, ProgramMethod context) { + AppView<?> appView, DexMethod constructor, CfAnalysisConfig config) { return pop( (state, frameType) -> { - if (frameType.isUninitializedThis()) { - if (constructor.getHolderType() == context.getHolderType() - || constructor.getHolderType() == context.getHolder().getSuperType()) { - return state.markInitialized(frameType, context.getHolderType()); + if (frameType.isUninitializedObject()) { + if (frameType.isUninitializedThis()) { + if (constructor.getHolderType() == config.getCurrentContext().getHolderType() + || config.isImmediateSuperClassOfCurrentContext(constructor.getHolderType())) { + return state.markInitialized(frameType, config.getCurrentContext().getHolderType()); + } + } else if (frameType.isUninitializedNew()) { + DexType uninitializedNewType = frameType.getUninitializedNewType(); + if (constructor.getHolderType() == uninitializedNewType) { + return state.markInitialized(frameType, uninitializedNewType); + } } - } else if (frameType.isUninitializedNew()) { - DexType uninitializedNewType = frameType.getUninitializedNewType(); - if (constructor.getHolderType() == uninitializedNewType) { - return state.markInitialized(frameType, uninitializedNewType); - } + return popAndInitializeConstructorMismatchError(frameType, constructor, config); } - return error(); + return popAndInitializeInitializedObjectError(frameType); }); } + private ErroneousCfFrameState popAndInitializeConstructorMismatchError( + FrameType frameType, DexMethod constructor, CfAnalysisConfig config) { + assert frameType.isUninitializedObject(); + StringBuilder message = new StringBuilder("Constructor mismatch, expected constructor from "); + if (frameType.isUninitializedNew()) { + message.append(frameType.getUninitializedNewType().getTypeName()); + } else { + assert frameType.isUninitializedThis(); + message + .append(config.getCurrentContext().getHolderType().getTypeName()) + .append(" or its superclass"); + } + message.append(", but was ").append(constructor.toSourceStringWithoutReturnType()); + return error(message.toString()); + } + + private ErroneousCfFrameState popAndInitializeInitializedObjectError(FrameType frameType) { + return error("Unexpected attempt to initialize " + formatActual(frameType)); + } + @Override public CfFrameState popInitialized( AppView<?> appView, DexType expectedType, BiFunction<CfFrameState, FrameType, CfFrameState> fn) { return pop( - (state, frameType) -> - frameType.isInitialized() - && CfAssignability.isAssignable( - frameType.getInitializedType(appView.dexItemFactory()), - expectedType, - appView) - ? fn.apply(state, frameType) - : error()); + (state, frameType) -> { + if (frameType.isInitialized()) { + DexType initializedType = frameType.getInitializedType(appView.dexItemFactory()); + if (CfAssignability.isAssignable(initializedType, expectedType, appView)) { + return fn.apply(state, frameType); + } + } + return errorUnexpectedStack(frameType, FrameType.initialized(expectedType)); + }); } @Override @@ -151,16 +190,31 @@ } @Override - public CfFrameState push(DexType type) { - return push(FrameType.initialized(type)); + public CfFrameState push(CfAnalysisConfig config, DexType type) { + return push(config, FrameType.initialized(type)); } @Override - public CfFrameState push(FrameType frameType) { - stack.push(frameType); + public CfFrameState push(CfAnalysisConfig config, FrameType frameType) { + int newStackHeight = stackHeight + frameType.getWidth(); + if (newStackHeight > config.getMaxStack()) { + return pushError(config, frameType); + } + stack.addLast(frameType); + stackHeight = newStackHeight; return this; } + private ErroneousCfFrameState pushError(CfAnalysisConfig config, FrameType frameType) { + return error( + "The max stack height of " + + config.getMaxStack() + + " is violated when pushing " + + formatActual(frameType) + + " to existing stack of size " + + stackHeight); + } + @Override public CfFrameState readLocal( AppView<?> appView, @@ -169,21 +223,25 @@ BiFunction<CfFrameState, FrameType, CfFrameState> fn) { FrameType frameType = locals.get(localIndex); if (frameType == null) { - return error(); + return error("Unexpected read of missing local at index " + localIndex); } - if (frameType.isInitialized() - && CfAssignability.isAssignable( - frameType.getInitializedType(appView.dexItemFactory()), expectedType, appView)) { + if (frameType.isInitialized()) { + if (CfAssignability.isAssignable( + frameType.getInitializedType(appView.dexItemFactory()), expectedType, appView)) { + return fn.apply(this, frameType); + } + } else if (frameType.isUninitializedObject() && expectedType.isObject()) { return fn.apply(this, frameType); } - if (frameType.isUninitializedObject() && expectedType.isObject()) { - return fn.apply(this, frameType); - } - return error(); + return errorUnexpectedLocal(frameType, expectedType, localIndex); } @Override - public CfFrameState storeLocal(int localIndex, FrameType frameType) { + public CfFrameState storeLocal(int localIndex, FrameType frameType, CfAnalysisConfig config) { + int maxLocalIndex = localIndex + BooleanUtils.intValue(frameType.isWide()); + if (maxLocalIndex >= config.getMaxLocals()) { + return storeLocalError(localIndex, frameType, config); + } locals.put(localIndex, frameType); if (frameType.isWide()) { locals.put(localIndex + 1, frameType); @@ -191,28 +249,47 @@ return this; } - public CfFrameState join(ConcreteCfFrameState state) { + private ErroneousCfFrameState storeLocalError( + int localIndex, FrameType frameType, CfAnalysisConfig config) { + StringBuilder message = + new StringBuilder("The max locals of ") + .append(config.getMaxLocals()) + .append(" is violated when storing ") + .append(formatActual(frameType)) + .append(" at local index ") + .append(localIndex); + if (frameType.isWide()) { + message.append(" and ").append(localIndex + 1); + } + return error(message.toString()); + } + + public CfFrameState join( + ConcreteCfFrameState state, UnaryOperator<FrameType> joinWithMissingLocal) { CfFrame.Builder builder = CfFrame.builder(); - joinLocals(state.locals, builder); + joinLocals(state.locals, builder, joinWithMissingLocal); ErroneousCfFrameState error = joinStack(state.stack, builder); if (error != null) { return error; } CfFrame frame = builder.buildMutable(); - return new ConcreteCfFrameState(frame.getLocals(), frame.getStack()); + return new ConcreteCfFrameState(frame.getMutableLocals(), frame.getMutableStack(), stackHeight); } - private void joinLocals(Int2ObjectSortedMap<FrameType> locals, CfFrame.Builder builder) { + private void joinLocals( + Int2ObjectSortedMap<FrameType> locals, + CfFrame.Builder builder, + UnaryOperator<FrameType> joinWithMissingLocal) { ObjectBidirectionalIterator<Entry<FrameType>> iterator = this.locals.int2ObjectEntrySet().iterator(); ObjectBidirectionalIterator<Entry<FrameType>> otherIterator = locals.int2ObjectEntrySet().iterator(); while (iterator.hasNext() && otherIterator.hasNext()) { - Entry<FrameType> entry = iterator.next(); + Entry<FrameType> entry = nextLocal(iterator); int localIndex = entry.getIntKey(); FrameType frameType = entry.getValue(); - Entry<FrameType> otherEntry = otherIterator.next(); + Entry<FrameType> otherEntry = nextLocal(otherIterator); int otherLocalIndex = otherEntry.getIntKey(); FrameType otherFrameType = otherEntry.getValue(); @@ -239,8 +316,8 @@ localIndex, frameType, otherFrameType, iterator, otherIterator, builder); } } - iterator.forEachRemaining(entry -> joinLocalOnlyPresentInOne(entry, builder)); - otherIterator.forEachRemaining(entry -> joinLocalOnlyPresentInOne(entry, builder)); + joinLocalsOnlyPresentInOne(iterator, builder, joinWithMissingLocal); + joinLocalsOnlyPresentInOne(otherIterator, builder, joinWithMissingLocal); } private void joinLocalsWithDifferentIndices( @@ -256,7 +333,7 @@ // Check if the smaller local does not overlap with the larger local. if (frameType.isSingle() || localIndex + 1 < otherLocalIndex) { setLocalToTop(localIndex, frameType, builder); - otherIterator.previous(); + previousLocal(otherIterator); return; } @@ -324,7 +401,7 @@ CfFrame.Builder builder) { ObjectBidirectionalIterator<Entry<FrameType>> currentIterator = iterator; while (currentIterator.hasNext()) { - Entry<FrameType> entry = currentIterator.next(); + Entry<FrameType> entry = nextLocal(currentIterator); int currentLocalIndex = entry.getIntKey(); FrameType currentFrameType = entry.getValue(); @@ -332,7 +409,7 @@ // this local is not affected. if (lastLocalIndexMarkedTop < currentLocalIndex) { // The current local still needs to be handled, thus this rewinds the iterator. - currentIterator.previous(); + previousLocal(currentIterator); break; } @@ -355,8 +432,45 @@ } } - private void joinLocalOnlyPresentInOne(Entry<FrameType> entry, CfFrame.Builder builder) { - setLocalToTop(entry.getIntKey(), entry.getValue(), builder); + private void joinLocalsOnlyPresentInOne( + ObjectBidirectionalIterator<Entry<FrameType>> iterator, + CfFrame.Builder builder, + UnaryOperator<FrameType> joinWithMissingLocal) { + while (iterator.hasNext()) { + Entry<FrameType> entry = nextLocal(iterator); + int localIndex = entry.getIntKey(); + FrameType frameType = entry.getValue(); + FrameType joinFrameType = joinWithMissingLocal.apply(frameType); + assert joinFrameType.isSingle() == frameType.isSingle(); + if (joinFrameType.isOneWord() || joinFrameType.isTwoWord()) { + setLocalToTop(localIndex, joinFrameType, builder); + } else { + builder.store(localIndex, joinFrameType); + } + } + } + + private Entry<FrameType> nextLocal(ObjectBidirectionalIterator<Entry<FrameType>> iterator) { + Entry<FrameType> entry = iterator.next(); + FrameType frameType = entry.getValue(); + if (frameType.isWide()) { + assert frameType.isDouble() || frameType.isLong(); + Entry<FrameType> highEntry = iterator.next(); + assert highEntry.getIntKey() == entry.getIntKey() + 1; + assert highEntry.getValue() == frameType; + } + return entry; + } + + private void previousLocal(ObjectBidirectionalIterator<Entry<FrameType>> iterator) { + Entry<FrameType> entry = iterator.previous(); + FrameType frameType = entry.getValue(); + if (frameType.isWide()) { + assert frameType.isDouble() || frameType.isLong(); + Entry<FrameType> lowEntry = iterator.previous(); + assert lowEntry.getIntKey() == entry.getIntKey() - 1; + assert lowEntry.getValue() == frameType; + } } private void setLocalToTop(int localIndex, FrameType frameType, CfFrame.Builder builder) { @@ -380,31 +494,54 @@ } private ErroneousCfFrameState joinStack(Deque<FrameType> stack, CfFrame.Builder builder) { - Iterator<FrameType> iterator = this.stack.descendingIterator(); - Iterator<FrameType> otherIterator = stack.descendingIterator(); + Iterator<FrameType> iterator = this.stack.iterator(); + Iterator<FrameType> otherIterator = stack.iterator(); + int stackIndex = 0; while (iterator.hasNext() && otherIterator.hasNext()) { FrameType frameType = iterator.next(); FrameType otherFrameType = otherIterator.next(); if (frameType.isSingle() != otherFrameType.isSingle()) { - return error(); + return error( + "Cannot join stacks, expected frame types at stack index " + + stackIndex + + " to have the same width, but was: " + + formatActual(frameType) + + " and " + + formatActual(otherFrameType)); } if (frameType.isSingle()) { SingleFrameType join = frameType.asSingle().join(otherFrameType.asSingle()); if (join.isOneWord()) { - return error(); + return joinStackImpreciseJoinError(stackIndex, frameType, otherFrameType); } builder.push(join.asFrameType()); } else { WideFrameType join = frameType.asWide().join(otherFrameType.asWide()); if (join.isTwoWord()) { - return error(); + return joinStackImpreciseJoinError(stackIndex, frameType, otherFrameType); } builder.push(join.asFrameType()); } + stackIndex++; + } + if (iterator.hasNext() || otherIterator.hasNext()) { + return error("Cannot join stacks of different size"); } return null; } + private ErroneousCfFrameState joinStackImpreciseJoinError( + int stackIndex, FrameType first, FrameType second) { + return error( + "Cannot join stacks, expected frame types at stack index " + + stackIndex + + " to join to a precise (non-top) type, but types " + + formatActual(first) + + " and " + + formatActual(second) + + " do not"); + } + @Override public boolean equals(Object o) { if (this == o) { @@ -413,9 +550,8 @@ if (o == null || getClass() != o.getClass()) { return false; } - // TODO(b/214496607): FrameType should implement equals() and hashCode(). ConcreteCfFrameState that = (ConcreteCfFrameState) o; - return locals.equals(that.locals) && stack.equals(that.stack); + return locals.equals(that.locals) && Iterables.elementsEqual(stack, that.stack); } @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ErroneousCfFrameState.java b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ErroneousCfFrameState.java index 23a6351..47e2d24 100644 --- a/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ErroneousCfFrameState.java +++ b/src/main/java/com/android/tools/r8/optimize/interfaces/analysis/ErroneousCfFrameState.java
@@ -9,19 +9,96 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.ValueType; import java.util.function.BiFunction; /** An analysis state representing that the code does not type check. */ public class ErroneousCfFrameState extends CfFrameState { - private static final ErroneousCfFrameState INSTANCE = new ErroneousCfFrameState(); + private enum FormatKind { + ACTUAL, + EXPECTED + } - private ErroneousCfFrameState() {} + private final String message; - static ErroneousCfFrameState getInstance() { - return INSTANCE; + ErroneousCfFrameState(String message) { + this.message = message; + } + + public static String formatExpected(DexType type) { + return format(type); + } + + private static String format(DexType type) { + if (type.isArrayType() || type.isClassType()) { + return type.getTypeName(); + } else if (type.isNullValueType()) { + return "null"; + } else { + assert type.isPrimitiveType(); + return "primitive " + type.getTypeName(); + } + } + + public static String formatActual(FrameType frameType) { + return format(frameType, FormatKind.ACTUAL); + } + + public static String formatExpected(FrameType frameType) { + return format(frameType, FormatKind.EXPECTED); + } + + private static String format(FrameType frameType, FormatKind formatKind) { + if (frameType.isInitialized()) { + if (frameType.isObject()) { + DexType initializedType = frameType.asSingleInitializedType().getInitializedType(); + if (initializedType.isArrayType()) { + return initializedType.getTypeName(); + } else if (initializedType.isClassType()) { + return "initialized " + initializedType.getTypeName(); + } else { + assert initializedType.isNullValueType(); + return "null"; + } + } else { + assert frameType.isPrimitive(); + return "primitive " + frameType.asPrimitive().getTypeName(); + } + } else if (frameType.isUninitializedObject()) { + if (frameType.isUninitializedNew()) { + DexType uninitializedNewType = frameType.getUninitializedNewType(); + if (uninitializedNewType != null) { + return "uninitialized " + uninitializedNewType.getTypeName(); + } + return "uninitialized-new"; + } else { + return "uninitialized-this"; + } + } else { + assert frameType.isOneWord() || frameType.isTwoWord(); + if (formatKind == FormatKind.ACTUAL) { + return "top"; + } else { + return frameType.isOneWord() ? "a single width value" : "a double width value"; + } + } + } + + public static String formatExpected(ValueType valueType) { + return format(valueType); + } + + private static String format(ValueType valueType) { + if (valueType.isObject()) { + return "object"; + } else { + return "primitive " + valueType.toPrimitiveType().getTypeName(); + } + } + + public String getMessage() { + return message; } @Override @@ -30,6 +107,11 @@ } @Override + public ErroneousCfFrameState asError() { + return this; + } + + @Override public CfFrameState check(AppView<?> appView, CfFrame frame) { return this; } @@ -56,7 +138,7 @@ @Override public CfFrameState popAndInitialize( - AppView<?> appView, DexMethod constructor, ProgramMethod context) { + AppView<?> appView, DexMethod constructor, CfAnalysisConfig config) { return this; } @@ -74,12 +156,12 @@ } @Override - public CfFrameState push(DexType type) { + public CfFrameState push(CfAnalysisConfig config, DexType type) { return this; } @Override - public CfFrameState push(FrameType frameType) { + public CfFrameState push(CfAnalysisConfig config, FrameType frameType) { return this; } @@ -93,7 +175,7 @@ } @Override - public CfFrameState storeLocal(int localIndex, FrameType frameType) { + public CfFrameState storeLocal(int localIndex, FrameType frameType, CfAnalysisConfig config) { return this; }
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 6f889ff..711610f 100644 --- a/src/main/java/com/android/tools/r8/relocator/Relocator.java +++ b/src/main/java/com/android/tools/r8/relocator/Relocator.java
@@ -16,7 +16,6 @@ import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexApplication; import com.android.tools.r8.jar.CfApplicationWriter; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.signature.GenericSignatureRewriter; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.AndroidApp; @@ -85,12 +84,11 @@ appView.setAppServices(AppServices.builder(appView).build()); SimplePackagesRewritingMapper packageRemapper = new SimplePackagesRewritingMapper(appView); - NamingLens namingLens = packageRemapper.compute(command.getMapping()); + appView.setNamingLens(packageRemapper.compute(command.getMapping())); - new GenericSignatureRewriter(appView, namingLens).run(appInfo.classes(), executor); + new GenericSignatureRewriter(appView).run(appInfo.classes(), executor); - new CfApplicationWriter(appView, new Marker(Tool.Relocator), namingLens) - .write(command.getConsumer()); + new CfApplicationWriter(appView, new Marker(Tool.Relocator)).write(command.getConsumer()); options.printWarnings(); } catch (ExecutionException e) { throw unwrapExecutionException(e);
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 5a6ef63..94b44d0 100644 --- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java +++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -9,6 +9,7 @@ import static com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult.isOverriding; import com.android.tools.r8.cf.CfVersion; +import com.android.tools.r8.experimental.startup.StartupOrder; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -202,11 +203,12 @@ // TODO(zerny): Clean up the constructors so we have just one. AppInfoWithLiveness( - CommittedItems syntheticItems, + CommittedItems committedItems, ClassToFeatureSplitMap classToFeatureSplitMap, MainDexInfo mainDexInfo, - Set<DexType> deadProtoTypes, MissingClasses missingClasses, + StartupOrder startupOrder, + Set<DexType> deadProtoTypes, Set<DexType> liveTypes, Set<DexMethod> targetedMethods, Set<DexMethod> failedMethodResolutionTargets, @@ -239,7 +241,7 @@ Set<DexType> lockCandidates, Map<DexType, Visibility> initClassReferences, Set<DexMethod> recordFieldValuesReferences) { - super(syntheticItems, classToFeatureSplitMap, mainDexInfo, missingClasses); + super(committedItems, classToFeatureSplitMap, mainDexInfo, missingClasses, startupOrder); this.deadProtoTypes = deadProtoTypes; this.liveTypes = liveTypes; this.targetedMethods = targetedMethods; @@ -281,8 +283,9 @@ committedItems, previous.getClassToFeatureSplitMap(), previous.getMainDexInfo(), - previous.deadProtoTypes, previous.getMissingClasses(), + previous.getStartupOrder(), + previous.deadProtoTypes, CollectionUtils.addAll(previous.liveTypes, committedItems.getCommittedProgramTypes()), previous.targetedMethods, previous.failedMethodResolutionTargets, @@ -326,8 +329,9 @@ previous.getSyntheticItems().commitPrunedItems(prunedItems), previous.getClassToFeatureSplitMap().withoutPrunedItems(prunedItems), previous.getMainDexInfo().withoutPrunedItems(prunedItems), - previous.deadProtoTypes, previous.getMissingClasses(), + previous.getStartupOrder().withoutPrunedItems(prunedItems), + previous.deadProtoTypes, pruneClasses(previous.liveTypes, prunedItems, executorService, futures), pruneMethods(previous.targetedMethods, prunedItems, executorService, futures), pruneMethods(previous.failedMethodResolutionTargets, prunedItems, executorService, futures), @@ -531,8 +535,9 @@ getSyntheticItems().commit(app()), getClassToFeatureSplitMap(), mainDexInfo, - deadProtoTypes, getMissingClasses(), + getStartupOrder(), + deadProtoTypes, liveTypes, targetedMethods, failedMethodResolutionTargets, @@ -610,7 +615,8 @@ previous.getSyntheticItems().commit(previous.app()), previous.getClassToFeatureSplitMap(), previous.getMainDexInfo(), - previous.getMissingClasses()); + previous.getMissingClasses(), + previous.getStartupOrder()); this.deadProtoTypes = previous.deadProtoTypes; this.liveTypes = previous.liveTypes; this.targetedMethods = previous.targetedMethods; @@ -1217,8 +1223,9 @@ committedItems, getClassToFeatureSplitMap().rewrittenWithLens(lens), getMainDexInfo().rewrittenWithLens(getSyntheticItems(), lens), - deadProtoTypes, getMissingClasses(), + getStartupOrder().rewrittenWithLens(lens), + deadProtoTypes, lens.rewriteReferences(liveTypes), lens.rewriteReferences(targetedMethods), lens.rewriteReferences(failedMethodResolutionTargets),
diff --git a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java index 597a07d..192b16a 100644 --- a/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java +++ b/src/main/java/com/android/tools/r8/shaking/DefaultEnqueuerUseRegistry.java
@@ -8,7 +8,7 @@ import com.android.tools.r8.androidapi.AndroidApiLevelCompute; import com.android.tools.r8.androidapi.ComputedApiLevel; -import com.android.tools.r8.code.CfOrDexInstruction; +import com.android.tools.r8.dex.code.CfOrDexInstruction; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexCallSite;
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 c93bdb3..295dc47 100644 --- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java +++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -18,10 +18,10 @@ import com.android.tools.r8.Diagnostic; import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfInvoke; -import com.android.tools.r8.code.CfOrDexInstruction; import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext; import com.android.tools.r8.contexts.CompilationContext.ProcessorContext; import com.android.tools.r8.dex.IndexedItemCollection; +import com.android.tools.r8.dex.code.CfOrDexInstruction; import com.android.tools.r8.errors.InterfaceDesugarMissingTypeDiagnostic; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.experimental.graphinfo.GraphConsumer; @@ -2281,7 +2281,7 @@ // annotation. AnnotationReferenceMarker referenceMarker = new AnnotationReferenceMarker(annotation, annotatedItem); - annotation.annotation.collectIndexedItems(referenceMarker); + annotation.annotation.collectIndexedItems(appView, referenceMarker); } private boolean shouldKeepAnnotation( @@ -4096,11 +4096,12 @@ appInfo.getSyntheticItems().commit(app), appInfo.getClassToFeatureSplitMap(), appInfo.getMainDexInfo(), - deadProtoTypes, mode.isInitialTreeShaking() ? missingClassesBuilder.reportMissingClasses( appView, lambdaSynthesizingContextOracle) : missingClassesBuilder.assertNoMissingClasses(appView), + appInfo.getStartupOrder(), + deadProtoTypes, SetUtils.mapIdentityHashSet(liveTypes.getItems(), DexProgramClass::getType), Enqueuer.toDescriptorSet(targetedMethods.getItems()), failedMethodResolutionTargets,
diff --git a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java index 06ceb79..4cc4154 100644 --- a/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java +++ b/src/main/java/com/android/tools/r8/shaking/MainDexDirectReferenceTracer.java
@@ -93,7 +93,7 @@ } private void traceAnnotationsDirectDependencies(DexAnnotationSet annotations) { - annotations.collectIndexedItems(annotationDirectReferenceCollector); + annotations.collectIndexedItems(appView, annotationDirectReferenceCollector); } private void traceMethodDirectDependencies(DexMethod method, Consumer<DexType> consumer) {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java index f23e6cf..ffba372 100644 --- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java +++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -229,11 +229,11 @@ this.globalSyntheticsStrategy = globalSyntheticsStrategy; } - public Map<DexType, Set<DexType>> getFinalGlobalSyntheticContexts( - AppView appView, NamingLens namingLens) { + public Map<DexType, Set<DexType>> getFinalGlobalSyntheticContexts(AppView appView) { assert isFinalized(); DexItemFactory factory = appView.dexItemFactory(); ImmutableMap<DexType, Set<DexType>> globalContexts = committed.getGlobalContexts(); + NamingLens namingLens = appView.getNamingLens(); Map<DexType, Set<DexType>> rewritten = new IdentityHashMap<>(globalContexts.size()); globalContexts.forEach( (global, contexts) -> {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java index d9ae12f..29ca8e4 100644 --- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java +++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -78,6 +78,7 @@ public final SyntheticKind TWR_CLOSE_RESOURCE = generator.forSingleMethod("TwrCloseResource"); public final SyntheticKind SERVICE_LOADER = generator.forSingleMethod("ServiceLoad"); public final SyntheticKind OUTLINE = generator.forSingleMethod("Outline"); + public final SyntheticKind COVARIANT_OUTLINE = generator.forSingleMethod("CovariantOutline"); public final SyntheticKind API_CONVERSION = generator.forSingleMethod("APIConversion"); public final SyntheticKind API_CONVERSION_PARAMETERS = generator.forSingleMethod("APIConversionParameters");
diff --git a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java index 7f03acb..1344816 100644 --- a/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java +++ b/src/main/java/com/android/tools/r8/tracereferences/TraceReferences.java
@@ -28,7 +28,10 @@ public class TraceReferences { public static void run(TraceReferencesCommand command) throws CompilationFailedException { - ExceptionUtils.withCompilationHandler(command.getReporter(), () -> runInternal(command)); + InternalOptions options = new InternalOptions(); + options.loadAllClassDefinitions = true; + ExceptionUtils.withCompilationHandler( + command.getReporter(), () -> runInternal(command, options)); } private static void forEachDescriptor(ProgramResourceProvider provider, Consumer<String> consumer) @@ -54,7 +57,13 @@ } } - private static void runInternal(TraceReferencesCommand command) + static void runForTesting(TraceReferencesCommand command, InternalOptions options) + throws CompilationFailedException { + ExceptionUtils.withCompilationHandler( + command.getReporter(), () -> runInternal(command, options)); + } + + private static void runInternal(TraceReferencesCommand command, InternalOptions options) throws IOException, ResourceException { AndroidApp.Builder builder = AndroidApp.builder(); command.getLibrary().forEach(builder::addLibraryResourceProvider); @@ -67,9 +76,6 @@ for (ProgramResourceProvider provider : command.getSource()) { forEachDescriptor(provider, targetDescriptors::remove); } - InternalOptions options = new InternalOptions(); - // TODO(b/231928368): enable this - options.loadAllClassDefinitions = false; Tracer tracer = new Tracer(targetDescriptors, builder.build(), command.getReporter(), options); tracer.run(command.getConsumer()); }
diff --git a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java index 3a25350..4b98b5f 100644 --- a/src/main/java/com/android/tools/r8/tracereferences/Tracer.java +++ b/src/main/java/com/android/tools/r8/tracereferences/Tracer.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.dex.ApplicationReader; import com.android.tools.r8.diagnostic.DefinitionContext; import com.android.tools.r8.diagnostic.internal.DefinitionContextUtils; +import com.android.tools.r8.experimental.startup.StartupOrder; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -31,6 +32,7 @@ import com.android.tools.r8.graph.GraphLens.FieldLookupResult; import com.android.tools.r8.graph.GraphLens.MethodLookupResult; import com.android.tools.r8.graph.MethodResolutionResult; +import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult; import com.android.tools.r8.graph.ProgramField; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.graph.UseRegistry; @@ -51,6 +53,7 @@ import java.io.IOException; import java.util.HashSet; import java.util.Set; +import java.util.function.Function; import java.util.function.Predicate; public class Tracer { @@ -71,7 +74,8 @@ new ApplicationReader(inputApp, options, Timing.empty()).read().toDirect(), ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(), MainDexInfo.none(), - GlobalSyntheticsStrategy.forSingleOutputMode())), + GlobalSyntheticsStrategy.forSingleOutputMode(), + StartupOrder.empty())), diagnostics, type -> targetDescriptors.contains(type.toDescriptorString())); } @@ -314,7 +318,9 @@ assert lookupResult.getType().isStatic(); DexMethod rewrittenMethod = lookupResult.getReference(); handleRewrittenMethodResolution( - rewrittenMethod, appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod)); + rewrittenMethod, + appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod), + SingleResolutionResult::getResolutionPair); } @Override @@ -322,16 +328,10 @@ MethodLookupResult lookupResult = graphLens().lookupInvokeSuper(method, getContext()); assert lookupResult.getType().isSuper(); DexMethod rewrittenMethod = lookupResult.getReference(); - MethodResolutionResult resolutionResult = - appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod); - if (resolutionResult.isFailedResolution() - && resolutionResult.asFailedResolution().hasMethodsCausingError()) { - handleRewrittenMethodResolution(rewrittenMethod, resolutionResult); - return; - } - handleRewrittenMethodReference( - rewrittenMethod, - resolutionResult.lookupInvokeSuperTarget(getContext().getHolder(), appInfo())); + handleRewrittenMethodResolution( + method, + appInfo().unsafeResolveMethodDueToDexFormat(rewrittenMethod), + result -> result.lookupInvokeSuperTarget(getContext().getHolder(), appInfo())); } @Override @@ -353,24 +353,29 @@ method, lookupResult.getType().isInterface() ? appInfo().resolveMethodOnInterfaceHolder(method) - : appInfo().resolveMethodOnClassHolder(method)); + : appInfo().resolveMethodOnClassHolder(method), + SingleResolutionResult::getResolutionPair); } private void handleRewrittenMethodResolution( - DexMethod method, MethodResolutionResult resolutionResult) { + DexMethod method, + MethodResolutionResult resolutionResult, + Function<SingleResolutionResult<?>, DexClassAndMethod> getResult) { resolutionResult.forEachMethodResolutionResult( result -> { - if (result.isFailedResolution() - && result.asFailedResolution().hasTypesOrMethodsCausingError()) { + if (result.isFailedResolution()) { result .asFailedResolution() .forEachFailureDependency( type -> addType(type, referencedFrom), methodCausingFailure -> handleRewrittenMethodReference(method, methodCausingFailure)); + if (!result.asFailedResolution().hasTypesOrMethodsCausingError()) { + handleRewrittenMethodReference(method, (DexEncodedMethod) null); + } return; } - handleRewrittenMethodReference(method, result.getResolutionPair()); + handleRewrittenMethodReference(method, getResult.apply(result.asSingleResolution())); }); }
diff --git a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java index 9a521fb..a50dbb9 100644 --- a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java +++ b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
@@ -9,6 +9,7 @@ import com.android.tools.r8.DataResource; import com.android.tools.r8.DiagnosticsHandler; import com.android.tools.r8.ResourceException; +import com.android.tools.r8.androidapi.AndroidApiDataAccess; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.origin.PathOrigin; import com.google.common.io.ByteStreams; @@ -133,7 +134,11 @@ try (InputStream in = content.getByteStream()) { ByteDataView view = ByteDataView.of(ByteStreams.toByteArray(in)); synchronized (this) { - delayedWrites.add(DelayedData.createFile(name, view)); + if (AndroidApiDataAccess.isApiDatabaseEntry(name)) { + writeFileNow(name, view, handler); + } else { + delayedWrites.add(DelayedData.createFile(name, view)); + } } } catch (IOException e) { handleIOException(e, handler); @@ -150,7 +155,11 @@ private void writeFileNow(String name, ByteDataView content, DiagnosticsHandler handler) { try { - ZipUtils.writeToZipStream(getStream(), name, content, ZipEntry.DEFLATED); + ZipUtils.writeToZipStream( + getStream(), + name, + content, + AndroidApiDataAccess.isApiDatabaseEntry(name) ? ZipEntry.STORED : ZipEntry.DEFLATED); } catch (IOException e) { handleIOException(e, handler); }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java b/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java index 81929a2..a1e7b70 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java +++ b/src/main/java/com/android/tools/r8/utils/InternalGlobalSyntheticsProgramConsumer.java
@@ -17,7 +17,6 @@ import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppView; import com.android.tools.r8.graph.DexType; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.references.Reference; import java.io.ByteArrayOutputStream; import java.io.IOException; @@ -117,7 +116,7 @@ } @Override - public void finished(AppView<?> appView, NamingLens namingLens) { + public void finished(AppView<?> appView) { byte[] bytes = null; try { bytes = builder.build(); @@ -201,9 +200,9 @@ } @Override - public void finished(AppView<?> appView, NamingLens namingLens) { + public void finished(AppView<?> appView) { Map<DexType, Set<DexType>> globalsToContexts = - appView.getSyntheticItems().getFinalGlobalSyntheticContexts(appView, namingLens); + appView.getSyntheticItems().getFinalGlobalSyntheticContexts(appView); Map<DexType, Set<DexType>> contextToGlobals = new IdentityHashMap<>(); for (DexType globalType : globalToBytes.keySet()) { // It would be good to assert that the global is a synthetic type, but the naming-lens @@ -249,5 +248,5 @@ } } - public abstract void finished(AppView<?> appView, NamingLens namingLens); + public abstract void finished(AppView<?> appView); }
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 48ac2b9..95120b2 100644 --- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java +++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -256,7 +256,6 @@ enableInitializedClassesAnalysis = false; callSiteOptimizationOptions.disableOptimization(); horizontalClassMergerOptions.setRestrictToSynthetics(); - apiModelTestingOptions.disableApiCallerIdentification(); } public boolean printTimes = System.getProperty("com.android.tools.r8.printtimes") != null; @@ -1644,6 +1643,9 @@ public boolean enableOutliningOfMethods = System.getProperty("com.android.tools.r8.disableApiModeling") == null; + // TODO(b/232823652): Enable when we can compute the offset correctly. + public boolean useMemoryMappedByteBuffer = false; + // A mapping from references to the api-level introducing them. public Map<MethodReference, AndroidApiLevel> methodApiMapping = new HashMap<>(); public Map<FieldReference, AndroidApiLevel> fieldApiMapping = new HashMap<>(); @@ -1669,6 +1671,15 @@ }); } + /** + * Disable the workarounds for missing APIs. This does not disable the use of the database, just + * the introduction of soft-verification workarounds for potentially missing API references. + */ + public void disableMissingApiModeling() { + enableOutliningOfMethods = false; + enableStubbingOfClasses = false; + } + public void disableApiCallerIdentification() { enableApiCallerIdentification = false; } @@ -2506,4 +2517,10 @@ public boolean canHaveInvokeInterfaceToObjectMethodBug() { return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.P); } + + // Until we fully drop support for API levels < 16, we have to emit an empty annotation set to + // work around a DALVIK bug. See b/36951668. + public boolean canHaveDalvikEmptyAnnotationSetBug() { + return minApiLevel.isLessThan(AndroidApiLevel.J_MR1); + } }
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 f277168..fb61406 100644 --- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java +++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -7,6 +7,7 @@ import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfPosition; import com.android.tools.r8.debuginfo.DebugRepresentation.DebugRepresentationPredicate; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; import com.android.tools.r8.graph.AppView; @@ -39,7 +40,6 @@ 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.GraphLens; import com.android.tools.r8.graph.ProgramMethod; import com.android.tools.r8.ir.code.Position; import com.android.tools.r8.ir.code.Position.OutlineCallerPosition; @@ -56,7 +56,6 @@ import com.android.tools.r8.naming.MemberNaming; import com.android.tools.r8.naming.MemberNaming.FieldSignature; import com.android.tools.r8.naming.MemberNaming.MethodSignature; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.naming.ProguardMapSupplier; import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapId; import com.android.tools.r8.naming.Range; @@ -332,7 +331,6 @@ public static ProguardMapId runAndWriteMap( AndroidApp inputApp, AppView<?> appView, - NamingLens namingLens, Timing timing, OriginalSourceFiles originalSourceFiles, DebugRepresentationPredicate representation) { @@ -344,9 +342,7 @@ ClassNameMapper mapper = run( appView, - appView.appInfo().app(), inputApp, - namingLens, originalSourceFiles, representation); timing.end(); @@ -469,9 +465,7 @@ public static ClassNameMapper run( AppView<?> appView, - DexApplication application, AndroidApp inputApp, - NamingLens namingLens, OriginalSourceFiles originalSourceFiles, DebugRepresentationPredicate representation) { // For finding methods in kotlin files based on SourceDebugExtensions, we use a line method map. @@ -489,17 +483,17 @@ : new Pc2PcMappingSupport(appView.options().allowDiscardingResidualDebugInfo()); // Collect which files contain which classes that need to have their line numbers optimized. - for (DexProgramClass clazz : application.classes()) { + for (DexProgramClass clazz : appView.appInfo().classes()) { boolean isSyntheticClass = appView.getSyntheticItems().isSyntheticClass(clazz); IdentityHashMap<DexString, List<ProgramMethod>> methodsByRenamedName = - groupMethodsByRenamedName(appView.graphLens(), namingLens, clazz); + groupMethodsByRenamedName(appView, 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.graphLens().getOriginalType(clazz.type); - DexString renamedDescriptor = namingLens.lookupDescriptor(clazz.getType()); + DexString renamedDescriptor = appView.getNamingLens().lookupDescriptor(clazz.getType()); LazyBox<ClassNaming.Builder> onDemandClassNamingBuilder = new LazyBox<>( () -> @@ -530,8 +524,7 @@ addClassToClassNaming(originalType, renamedDescriptor, onDemandClassNamingBuilder); // First transfer renamed fields to classNamingBuilder. - addFieldsToClassNaming( - appView.graphLens(), namingLens, clazz, originalType, onDemandClassNamingBuilder); + addFieldsToClassNaming(appView, clazz, originalType, onDemandClassNamingBuilder); // Then process the methods, ordered by renamed name. List<DexString> renamedMethodNames = new ArrayList<>(methodsByRenamedName.keySet()); @@ -599,7 +592,8 @@ MethodSignature originalSignature = MethodSignature.fromDexMethod(originalMethod, originalMethod.holder != originalType); - DexString obfuscatedNameDexString = namingLens.lookupName(method.getReference()); + DexString obfuscatedNameDexString = + appView.getNamingLens().lookupName(method.getReference()); String obfuscatedName = obfuscatedNameDexString.toString(); List<MappingInformation> methodMappingInfo = new ArrayList<>(); @@ -902,16 +896,15 @@ } private static void addFieldsToClassNaming( - GraphLens graphLens, - NamingLens namingLens, + AppView<?> appView, DexProgramClass clazz, DexType originalType, LazyBox<Builder> onDemandClassNamingBuilder) { clazz.forEachField( dexEncodedField -> { DexField dexField = dexEncodedField.getReference(); - DexField originalField = graphLens.getOriginalFieldSignature(dexField); - DexString renamedName = namingLens.lookupName(dexField); + DexField originalField = appView.graphLens().getOriginalFieldSignature(dexField); + DexString renamedName = appView.getNamingLens().lookupName(dexField); if (renamedName != originalField.name || originalField.holder != originalType) { FieldSignature originalSignature = FieldSignature.fromDexField(originalField, originalField.holder != originalType); @@ -922,16 +915,16 @@ } public static IdentityHashMap<DexString, List<ProgramMethod>> groupMethodsByRenamedName( - GraphLens graphLens, NamingLens namingLens, DexProgramClass clazz) { + AppView<?> appView, DexProgramClass clazz) { IdentityHashMap<DexString, List<ProgramMethod>> methodsByRenamedName = new IdentityHashMap<>(clazz.getMethodCollection().size()); for (ProgramMethod programMethod : clazz.programMethods()) { // Add method only if renamed, moved, or contains positions. DexEncodedMethod definition = programMethod.getDefinition(); DexMethod method = programMethod.getReference(); - DexString renamedName = namingLens.lookupName(method); + DexString renamedName = appView.getNamingLens().lookupName(method); if (renamedName != method.name - || graphLens.getOriginalMethodSignature(method) != method + || appView.graphLens().getOriginalMethodSignature(method) != method || doesContainPositions(definition) || definition.isD8R8Synthesized()) { methodsByRenamedName @@ -1139,6 +1132,7 @@ EventBasedDebugInfo debugInfo = DexDebugInfo.convertToEventBased(dexCode, appView.dexItemFactory()); assert debugInfo != null; + IntBox firstDefaultEventPc = new IntBox(-1); BooleanBox singleOriginalLine = new BooleanBox(true); Pair<Integer, Position> lastPosition = new Pair<>(); DexDebugEventVisitor visitor = @@ -1149,6 +1143,9 @@ public void visit(Default defaultEvent) { super.visit(defaultEvent); assert getCurrentLine() >= 0; + if (firstDefaultEventPc.get() < 0) { + firstDefaultEventPc.set(getCurrentPc()); + } Position currentPosition = getPositionFromPositionState(this); if (lastPosition.getSecond() != null) { if (singleOriginalLine.isTrue() @@ -1172,6 +1169,20 @@ event.accept(visitor); } + // If the method has a single non-preamble line, check that the preamble is not active on any + // throwing instruction before the single line becomes active. + if (singleOriginalLine.isTrue() && firstDefaultEventPc.get() > 0) { + for (DexInstruction instruction : dexCode.instructions) { + if (instruction.getOffset() < firstDefaultEventPc.get()) { + if (instruction.canThrow()) { + singleOriginalLine.set(false); + } + } else { + break; + } + } + } + int lastInstructionPc = ArrayUtils.last(dexCode.instructions).getOffset(); if (lastPosition.getSecond() != null) { remapAndAddForPc(
diff --git a/src/main/java/com/android/tools/r8/utils/MapUtils.java b/src/main/java/com/android/tools/r8/utils/MapUtils.java index 2f55680..bf80d7a 100644 --- a/src/main/java/com/android/tools/r8/utils/MapUtils.java +++ b/src/main/java/com/android/tools/r8/utils/MapUtils.java
@@ -45,6 +45,13 @@ return map; } + public static <K, V> IdentityHashMap<K, V> newIdentityHashMap( + BiForEachable<K, V> forEachable, int capacity) { + IdentityHashMap<K, V> map = new IdentityHashMap<>(capacity); + forEachable.forEach(map::put); + return map; + } + public static <T> void removeIdentityMappings(Map<T, T> map) { map.entrySet().removeIf(entry -> entry.getKey() == entry.getValue()); }
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java index 9d8cedd..34714e4 100644 --- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java +++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -11,6 +11,7 @@ import com.android.tools.r8.DataEntryResource; import com.android.tools.r8.ProgramResource; import com.android.tools.r8.ResourceException; +import com.android.tools.r8.androidapi.AndroidApiDataAccess; import com.android.tools.r8.errors.CompilationError; import com.google.common.io.ByteStreams; import com.google.common.io.Closer; @@ -44,12 +45,24 @@ public class ZipUtils { + // Beginning of extra field length: https://en.wikipedia.org/wiki/ZIP_(file_format) + private static final int EXTRA_FIELD_LENGTH_OFFSET = 30; + public static void writeResourcesToZip( List<ProgramResource> resources, Set<DataEntryResource> dataResources, Closer closer, ZipOutputStream out) throws IOException, ResourceException { + for (DataEntryResource dataResource : dataResources) { + String entryName = dataResource.getName(); + byte[] bytes = ByteStreams.toByteArray(closer.register(dataResource.getByteStream())); + writeToZipStream( + out, + entryName, + bytes, + AndroidApiDataAccess.isApiDatabaseEntry(entryName) ? ZipEntry.STORED : ZipEntry.DEFLATED); + } for (ProgramResource resource : resources) { assert resource.getClassDescriptors().size() == 1; Iterator<String> iterator = resource.getClassDescriptors().iterator(); @@ -58,11 +71,6 @@ byte[] bytes = ByteStreams.toByteArray(closer.register(resource.getByteStream())); writeToZipStream(out, entryName, bytes, ZipEntry.DEFLATED); } - for (DataEntryResource dataResource : dataResources) { - String entryName = dataResource.getName(); - byte[] bytes = ByteStreams.toByteArray(closer.register(dataResource.getByteStream())); - writeToZipStream(out, entryName, bytes, ZipEntry.DEFLATED); - } } public interface OnEntryHandler { @@ -290,4 +298,25 @@ public static String zipEntryNameForClass(Class<?> clazz) { return DescriptorUtils.getClassBinaryName(clazz) + CLASS_EXTENSION; } + + public static long getOffsetOfResourceInZip(File file, String entry) throws IOException { + // Look into the jar file to see find the offset. + ZipFile zipFile = new ZipFile(file); + Enumeration<? extends ZipEntry> entries = zipFile.entries(); + long offset = 0; + while (entries.hasMoreElements()) { + ZipEntry zipEntry = entries.nextElement(); + byte[] extra = zipEntry.getExtra(); + offset += + EXTRA_FIELD_LENGTH_OFFSET + + zipEntry.getName().length() + + (extra == null ? 0 : extra.length); + if (zipEntry.getName().equals(entry)) { + return zipEntry.getSize() == zipEntry.getCompressedSize() ? offset : -1; + } else if (!zipEntry.isDirectory()) { + offset += zipEntry.getCompressedSize(); + } + } + return -1; + } }
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java index f42a8cd..0787662 100644 --- a/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java +++ b/src/main/java/com/android/tools/r8/utils/collections/DexClassAndMethodSetBase.java
@@ -8,6 +8,7 @@ import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.utils.SetUtils; +import com.google.common.collect.Iterables; import java.util.Collection; import java.util.IdentityHashMap; import java.util.Iterator; @@ -18,7 +19,8 @@ import java.util.function.Supplier; import java.util.stream.Stream; -public abstract class DexClassAndMethodSetBase<T extends DexClassAndMethod> implements Iterable<T> { +public abstract class DexClassAndMethodSetBase<T extends DexClassAndMethod> + implements Collection<T> { protected final Map<DexMethod, T> backing; protected final Supplier<? extends Map<DexMethod, T>> backingFactory; @@ -33,14 +35,20 @@ this.backingFactory = backingFactory; } + @Override public boolean add(T method) { T existing = backing.put(method.getReference(), method); assert existing == null || existing.isStructurallyEqualTo(method); return existing == null; } - public void addAll(Iterable<T> methods) { - methods.forEach(this::add); + @Override + public boolean addAll(Collection<? extends T> methods) { + boolean changed = false; + for (T method : methods) { + changed |= add(method); + } + return changed; } public T get(DexMethod method) { @@ -51,6 +59,15 @@ return iterator().next(); } + @Override + public boolean contains(Object o) { + if (o instanceof DexClassAndMethod) { + DexClassAndMethod method = (DexClassAndMethod) o; + return contains(method.getReference()); + } + return false; + } + public boolean contains(DexMethod method) { return backing.containsKey(method); } @@ -63,10 +80,17 @@ return backing.containsKey(method.getReference()); } + @Override + public boolean containsAll(Collection<?> collection) { + return Iterables.all(collection, this::contains); + } + + @Override public void clear() { backing.clear(); } + @Override public boolean isEmpty() { return backing.isEmpty(); } @@ -76,6 +100,15 @@ return backing.values().iterator(); } + @Override + public boolean remove(Object o) { + if (o instanceof DexClassAndMethod) { + DexClassAndMethod method = (DexClassAndMethod) o; + return remove(method.getReference()); + } + return false; + } + public boolean remove(DexMethod method) { T existing = backing.remove(method); return existing != null; @@ -85,18 +118,45 @@ return remove(method.getReference()); } + @Override + public boolean removeAll(Collection<?> collection) { + boolean changed = false; + for (Object o : collection) { + changed |= remove(o); + } + return changed; + } + + @Override public boolean removeIf(Predicate<? super T> predicate) { return backing.values().removeIf(predicate); } + @Override + public boolean retainAll(Collection<?> collection) { + return backing.values().retainAll(collection); + } + + @Override public int size() { return backing.size(); } + @Override public Stream<T> stream() { return backing.values().stream(); } + @Override + public Object[] toArray() { + return backing.values().toArray(); + } + + @Override + public <S> S[] toArray(S[] ss) { + return backing.values().toArray(ss); + } + public Collection<T> toCollection() { return backing.values(); }
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureMap.java b/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureMap.java new file mode 100644 index 0000000..cff8be7 --- /dev/null +++ b/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureMap.java
@@ -0,0 +1,210 @@ +// Copyright (c) 2022, 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.utils.collections; + +import com.android.tools.r8.graph.DexEncodedMethod; +import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.DexMethodSignature; +import java.util.Collection; +import java.util.HashMap; +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Set; +import java.util.function.BiConsumer; +import java.util.function.BiFunction; +import java.util.function.Function; +import org.jetbrains.annotations.NotNull; + +public class DexMethodSignatureMap<T> implements Map<DexMethodSignature, T> { + + private final Map<DexMethodSignature, T> backing; + + private DexMethodSignatureMap(Map<DexMethodSignature, T> backing) { + this.backing = backing; + } + + public static <T> DexMethodSignatureMap<T> create() { + return new DexMethodSignatureMap<>(new HashMap<>()); + } + + public static <T> DexMethodSignatureMap<T> createLinked() { + return new DexMethodSignatureMap<>(new LinkedHashMap<>()); + } + + @Override + public T put(DexMethodSignature signature, T value) { + return backing.put(signature, value); + } + + public T put(DexMethod method, T value) { + return put(method.getSignature(), value); + } + + public T put(DexEncodedMethod method, T value) { + return put(method.getReference(), value); + } + + @Override + public void clear() { + backing.clear(); + } + + @Override + public Set<DexMethodSignature> keySet() { + return backing.keySet(); + } + + @Override + public Collection<T> values() { + return backing.values(); + } + + @Override + public Set<Entry<DexMethodSignature, T>> entrySet() { + return backing.entrySet(); + } + + @Override + public T getOrDefault(Object key, T defaultValue) { + return backing.getOrDefault(key, defaultValue); + } + + @Override + public void forEach(BiConsumer<? super DexMethodSignature, ? super T> action) { + backing.forEach(action); + } + + @Override + public void replaceAll(BiFunction<? super DexMethodSignature, ? super T, ? extends T> function) { + backing.replaceAll(function); + } + + @Override + public T putIfAbsent(DexMethodSignature key, T value) { + return backing.putIfAbsent(key, value); + } + + @Override + public boolean remove(Object key, Object value) { + return backing.remove(key, value); + } + + @Override + public boolean replace(DexMethodSignature key, T oldValue, T newValue) { + return backing.replace(key, oldValue, newValue); + } + + @Override + public T replace(DexMethodSignature key, T value) { + return backing.replace(key, value); + } + + @Override + public T computeIfAbsent( + DexMethodSignature key, + @NotNull Function<? super DexMethodSignature, ? extends T> mappingFunction) { + return backing.computeIfAbsent(key, mappingFunction); + } + + @Override + public T computeIfPresent( + DexMethodSignature key, + @NotNull BiFunction<? super DexMethodSignature, ? super T, ? extends T> remappingFunction) { + return backing.computeIfPresent(key, remappingFunction); + } + + @Override + public T compute( + DexMethodSignature key, + @NotNull BiFunction<? super DexMethodSignature, ? super T, ? extends T> remappingFunction) { + return backing.compute(key, remappingFunction); + } + + @Override + public T merge( + DexMethodSignature key, + @NotNull T value, + @NotNull BiFunction<? super T, ? super T, ? extends T> remappingFunction) { + return backing.merge(key, value, remappingFunction); + } + + public T merge( + DexMethod method, + @NotNull T value, + @NotNull BiFunction<? super T, ? super T, ? extends T> remappingFunction) { + return merge(method.getSignature(), value, remappingFunction); + } + + public T merge( + DexEncodedMethod method, + @NotNull T value, + @NotNull BiFunction<? super T, ? super T, ? extends T> remappingFunction) { + return merge(method.getReference(), value, remappingFunction); + } + + @Override + public boolean containsKey(Object o) { + return backing.containsKey(o); + } + + @Override + public boolean containsValue(Object value) { + return backing.containsValue(value); + } + + @Override + public T get(Object key) { + return backing.get(key); + } + + public boolean containsKey(DexMethodSignature signature) { + return backing.containsKey(signature); + } + + public boolean containsAnyKeyOf(Iterable<DexMethodSignature> signatures) { + for (DexMethodSignature signature : signatures) { + if (containsKey(signature)) { + return true; + } + } + return false; + } + + public DexMethodSignatureSet intersectionWithKeys(Iterable<DexMethodSignature> signatures) { + DexMethodSignatureSet result = DexMethodSignatureSet.create(); + for (DexMethodSignature signature : signatures) { + if (containsKey(signature)) { + result.add(signature); + } + } + return result; + } + + @Override + public boolean isEmpty() { + return backing.isEmpty(); + } + + @Override + public T remove(Object o) { + return backing.remove(o); + } + + @Override + public void putAll(@NotNull Map<? extends DexMethodSignature, ? extends T> m) {} + + public T remove(DexMethodSignature signature) { + return backing.remove(signature); + } + + public T remove(DexEncodedMethod method) { + return remove(method.getSignature()); + } + + @Override + public int size() { + return backing.size(); + } +}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/LinkedProgramMethodSet.java b/src/main/java/com/android/tools/r8/utils/collections/LinkedProgramMethodSet.java new file mode 100644 index 0000000..b323e7e --- /dev/null +++ b/src/main/java/com/android/tools/r8/utils/collections/LinkedProgramMethodSet.java
@@ -0,0 +1,26 @@ +// Copyright (c) 2022, 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.utils.collections; + +import java.util.LinkedHashMap; + +public class LinkedProgramMethodSet extends ProgramMethodSet { + + LinkedProgramMethodSet() { + super(LinkedProgramMethodSet::createBacking, createBacking()); + } + + LinkedProgramMethodSet(int capacity) { + super(LinkedProgramMethodSet::createBacking, createBacking(capacity)); + } + + private static <K, V> LinkedHashMap<K, V> createBacking() { + return new LinkedHashMap<>(); + } + + private static <K, V> LinkedHashMap<K, V> createBacking(int capacity) { + return new LinkedHashMap<>(capacity); + } +}
diff --git a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java index 12deaa2..81bb460 100644 --- a/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java +++ b/src/main/java/com/android/tools/r8/utils/collections/ProgramMethodSet.java
@@ -13,7 +13,6 @@ import com.android.tools.r8.utils.ForEachable; import com.google.common.collect.ImmutableMap; import java.util.IdentityHashMap; -import java.util.LinkedHashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Supplier; @@ -62,8 +61,12 @@ return new ProgramMethodSet(ConcurrentHashMap::new); } - public static ProgramMethodSet createLinked() { - return new ProgramMethodSet(LinkedHashMap::new); + public static LinkedProgramMethodSet createLinked() { + return new LinkedProgramMethodSet(); + } + + public static LinkedProgramMethodSet createLinked(int capacity) { + return new LinkedProgramMethodSet(capacity); } public static ProgramMethodSet empty() {
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java index aa20557..7b84c77 100644 --- a/src/test/java/com/android/tools/r8/L8TestBuilder.java +++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -43,6 +43,8 @@ private StringResource desugaredLibrarySpecification = StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()); private List<Path> libraryFiles = new ArrayList<>(); + private ProgramConsumer programConsumer; + private boolean finalPrefixVerification = true; private L8TestBuilder(AndroidApiLevel apiLevel, Backend backend, TestState state) { this.apiLevel = apiLevel; @@ -54,6 +56,11 @@ return new L8TestBuilder(apiLevel, backend, state); } + public L8TestBuilder ignoreFinalPrefixVerification() { + finalPrefixVerification = false; + return this; + } + public L8TestBuilder addProgramFiles(Collection<Path> programFiles) { this.additionalProgramFiles.addAll(programFiles); return this; @@ -64,6 +71,11 @@ return this; } + public L8TestBuilder addLibraryFiles(Collection<Path> libraryFiles) { + this.libraryFiles.addAll(libraryFiles); + return this; + } + public L8TestBuilder addLibraryFiles(Path... libraryFiles) { Collections.addAll(this.libraryFiles, libraryFiles); return this; @@ -92,6 +104,11 @@ return this; } + public L8TestBuilder apply(ThrowableConsumer<L8TestBuilder> thenConsumer) { + thenConsumer.acceptWithRuntimeException(this); + return this; + } + public L8TestBuilder applyIf(boolean condition, ThrowableConsumer<L8TestBuilder> thenConsumer) { return applyIf(condition, thenConsumer, ThrowableConsumer.empty()); } @@ -128,6 +145,11 @@ return this; } + public L8TestBuilder setProgramConsumer(ProgramConsumer programConsumer) { + this.programConsumer = programConsumer; + return this; + } + public L8TestBuilder setDesugarJDKLibsCustomConversions(Path desugarJDKLibsConfiguration) { this.customConversions = desugarJDKLibsConfiguration; return this; @@ -148,6 +170,15 @@ options -> options.disableL8AnnotationRemoval = disableL8AnnotationRemoval); } + private ProgramConsumer computeProgramConsumer(AndroidAppConsumers sink) { + if (programConsumer != null) { + return programConsumer; + } + return backend.isCf() + ? sink.wrapProgramConsumer(ClassFileConsumer.emptyConsumer()) + : sink.wrapProgramConsumer(DexIndexedConsumer.emptyConsumer()); + } + public L8TestCompileResult compile() throws IOException, CompilationFailedException, ExecutionException { // We wrap exceptions in a RuntimeException to call this from a lambda. @@ -157,43 +188,50 @@ .addProgramFiles(getProgramFiles()) .addLibraryFiles(getLibraryFiles()) .setMode(mode) + .setIncludeClassesChecksum(true) .addDesugaredLibraryConfiguration(desugaredLibrarySpecification) .setMinApiLevel(apiLevel.getLevel()) - .setProgramConsumer( - backend.isCf() - ? sink.wrapProgramConsumer(ClassFileConsumer.emptyConsumer()) - : sink.wrapProgramConsumer(DexIndexedConsumer.emptyConsumer())); + .setProgramConsumer(computeProgramConsumer(sink)); addProgramClassFileData(l8Builder); Path mapping = null; + ImmutableList<String> allKeepRules = null; if (!keepRules.isEmpty() || generatedKeepRules != null) { mapping = state.getNewTempFile("mapping.txt"); + allKeepRules = + ImmutableList.<String>builder() + .addAll(keepRules) + .addAll( + generatedKeepRules != null + ? ImmutableList.of(generatedKeepRules) + : Collections.emptyList()) + .build(); l8Builder - .addProguardConfiguration( - ImmutableList.<String>builder() - .addAll(keepRules) - .addAll( - generatedKeepRules != null - ? ImmutableList.of(generatedKeepRules) - : Collections.emptyList()) - .build(), - Origin.unknown()) + .addProguardConfiguration(allKeepRules, Origin.unknown()) .setProguardMapOutputPath(mapping); } ToolHelper.runL8(l8Builder.build(), optionsModifier); + // With special program consumer we may not be able to build the resulting app. + if (programConsumer != null) { + return null; + } return new L8TestCompileResult( sink.build(), apiLevel, + allKeepRules, generatedKeepRules, mapping, state, backend.isCf() ? OutputMode.ClassFile : OutputMode.DexIndexed) - .inspect( - inspector -> - inspector.forAllClasses( - clazz -> - assertTrue( - clazz.getFinalName().startsWith("j$.") - || clazz.getFinalName().startsWith("java.")))); + .applyIf( + finalPrefixVerification, + compileResult -> + compileResult.inspect( + inspector -> + inspector.forAllClasses( + clazz -> + assertTrue( + clazz.getFinalName().startsWith("j$.") + || clazz.getFinalName().startsWith("java."))))); } private Collection<Path> getProgramFiles() {
diff --git a/src/test/java/com/android/tools/r8/L8TestCompileResult.java b/src/test/java/com/android/tools/r8/L8TestCompileResult.java index c5ca216..fd5af1c 100644 --- a/src/test/java/com/android/tools/r8/L8TestCompileResult.java +++ b/src/test/java/com/android/tools/r8/L8TestCompileResult.java
@@ -11,25 +11,30 @@ import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.FileUtils; +import com.android.tools.r8.utils.ThrowingConsumer; import com.android.tools.r8.utils.codeinspector.CodeInspector; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; +import java.util.List; import java.util.Set; public class L8TestCompileResult extends TestCompileResult<L8TestCompileResult, L8TestRunResult> { + private final List<String> allKeepRules; private final String generatedKeepRules; private final Path mapping; public L8TestCompileResult( AndroidApp app, AndroidApiLevel apiLevel, + List<String> allKeepRules, String generatedKeepRules, Path mapping, TestState state, OutputMode outputMode) { super(state, app, apiLevel.getLevel(), outputMode); + this.allKeepRules = allKeepRules; this.generatedKeepRules = generatedKeepRules; this.mapping = mapping; } @@ -71,6 +76,12 @@ return this; } + public <E extends Throwable> L8TestCompileResult inspectKeepRules( + ThrowingConsumer<List<String>, E> consumer) throws Throwable { + consumer.accept(allKeepRules); + return self(); + } + public L8TestCompileResult writeGeneratedKeepRules(Path path) throws IOException { assertNotNull(generatedKeepRules); FileUtils.writeTextFile(path, generatedKeepRules);
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java index 08e9395..4383be5 100644 --- a/src/test/java/com/android/tools/r8/TestBase.java +++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -23,9 +23,10 @@ import com.android.tools.r8.ToolHelper.DexVm; import com.android.tools.r8.ToolHelper.ProcessResult; import com.android.tools.r8.cf.CfVersion; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.dex.ApplicationReader; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unreachable; +import com.android.tools.r8.experimental.startup.StartupOrder; import com.android.tools.r8.features.ClassToFeatureSplitMap; import com.android.tools.r8.graph.AppInfo; import com.android.tools.r8.graph.AppInfoWithClassHierarchy; @@ -776,7 +777,8 @@ readApplicationForDexOutput(app, new InternalOptions()), ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(), MainDexInfo.none(), - GlobalSyntheticsStrategy.forSingleOutputMode()); + GlobalSyntheticsStrategy.forSingleOutputMode(), + StartupOrder.empty()); } protected static AppView<AppInfoWithClassHierarchy> computeAppViewWithClassHierarchy( @@ -1544,7 +1546,7 @@ } protected static void checkInstructions( - DexCode code, List<Class<? extends Instruction>> instructions) { + DexCode code, List<Class<? extends DexInstruction>> instructions) { assertEquals(instructions.size(), code.instructions.length); for (int i = 0; i < instructions.size(); ++i) { assertEquals("Unexpected instruction at index " + i, @@ -1552,8 +1554,8 @@ } } - protected Stream<Instruction> filterInstructionKind( - DexCode dexCode, Class<? extends Instruction> kind) { + protected Stream<DexInstruction> filterInstructionKind( + DexCode dexCode, Class<? extends DexInstruction> kind) { return Arrays.stream(dexCode.instructions) .filter(kind::isInstance) .map(kind::cast);
diff --git a/src/test/java/com/android/tools/r8/TestParametersBuilder.java b/src/test/java/com/android/tools/r8/TestParametersBuilder.java index cf33980..59d2bc6 100644 --- a/src/test/java/com/android/tools/r8/TestParametersBuilder.java +++ b/src/test/java/com/android/tools/r8/TestParametersBuilder.java
@@ -187,6 +187,7 @@ private boolean enableApiLevels = false; private boolean enableApiLevelsForCf = false; + private boolean onlyDexRuntimeApiLevel = false; private Predicate<AndroidApiLevel> apiLevelFilter = param -> false; private List<AndroidApiLevel> explicitApiLevels = new ArrayList<>(); @@ -202,6 +203,12 @@ return withApiFilter(api -> true); } + public TestParametersBuilder withOnlyDexRuntimeApiLevel() { + enableApiLevels = true; + onlyDexRuntimeApiLevel = true; + return this; + } + public TestParametersBuilder enableApiLevelsForCf() { enableApiLevelsForCf = true; return this; @@ -266,6 +273,10 @@ if (runtime.isCf() && !enableApiLevelsForCf) { return Stream.of(new TestParameters(runtime)); } + AndroidApiLevel vmLevel = runtime.maxSupportedApiLevel(); + if (onlyDexRuntimeApiLevel) { + return Stream.of(new TestParameters(runtime, vmLevel)); + } List<AndroidApiLevel> sortedApiLevels = AndroidApiLevel.getAndroidApiLevelsSorted().stream() .filter(apiLevelFilter) @@ -273,7 +284,6 @@ if (sortedApiLevels.isEmpty()) { return Stream.of(); } - AndroidApiLevel vmLevel = runtime.maxSupportedApiLevel(); AndroidApiLevel lowestApplicable = sortedApiLevels.get(0); if (vmLevel.getLevel() < lowestApplicable.getLevel()) { return Stream.of(); @@ -281,6 +291,9 @@ if (sortedApiLevels.size() > 1) { for (int i = sortedApiLevels.size() - 1; i >= 0; i--) { AndroidApiLevel highestApplicable = sortedApiLevels.get(i); + if (onlyDexRuntimeApiLevel) { + return Stream.of(new TestParameters(runtime, highestApplicable)); + } if (highestApplicable.getLevel() <= vmLevel.getLevel() && lowestApplicable != highestApplicable) { Set<AndroidApiLevel> set = new TreeSet<>();
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java index f219969..bc5f2e4 100644 --- a/src/test/java/com/android/tools/r8/ToolHelper.java +++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -23,7 +23,6 @@ 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.naming.NamingLens; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.position.Position; import com.android.tools.r8.shaking.FilteredClassPath; @@ -133,7 +132,6 @@ public static final String DEFAULT_DEX_FILENAME = "classes.dex"; public static final String DEFAULT_PROGUARD_MAP_FILE = "proguard.map"; - public static final String JAVA_8_RUNTIME = "third_party/openjdk/openjdk-rt-1.8/rt.jar"; public static final String CORE_LAMBDA_STUBS = "third_party/core-lambda-stubs/core-lambda-stubs.jar"; public static final String JSR223_RI_JAR = "third_party/jsr223-api-1.0/jsr223-api-1.0.jar"; @@ -146,7 +144,9 @@ "third_party/android_jar/lib-v%d/api-versions.xml"; private static final AndroidApiLevel DEFAULT_MIN_SDK = AndroidApiLevel.I; - public static final String JDK_11_TESTS_DIR = "third_party/openjdk/jdk-11-test/"; + public static final String OPEN_JDK_DIR = "third_party/openjdk/"; + public static final String JAVA_8_RUNTIME = OPEN_JDK_DIR + "openjdk-rt-1.8/rt.jar"; + public static final String JDK_11_TESTS_DIR = OPEN_JDK_DIR + "jdk-11-test/"; public static final String JDK_11_TIME_TESTS_DIR = JDK_11_TESTS_DIR + "java/time/"; private static final String PROGUARD5_2_1 = "third_party/proguard/proguard5.2.1/bin/proguard"; @@ -180,15 +180,24 @@ public static final Path DESUGAR_LIB_CONVERSIONS = Paths.get(LIBS_DIR, "library_desugar_conversions.zip"); + public static final String DESUGARED_LIB_RELEASES_DIR = + OPEN_JDK_DIR + "desugar_jdk_libs_releases/"; + public static final Path DESUGARED_JDK_8_LIB_JAR = + Paths.get(OPEN_JDK_DIR + "desugar_jdk_libs/desugar_jdk_libs.jar"); + public static final Path DESUGARED_JDK_11_LIB_JAR = + DesugaredLibraryJDK11Undesugarer.undesugaredJarJDK11( + Paths.get(OPEN_JDK_DIR + "desugar_jdk_libs_11/desugar_jdk_libs.jar")); public static Path getDesugarJDKLibs() { return DesugaredLibraryJDK11Undesugarer.undesugaredJar(); } public static Path getDesugarJDKLibsBazelGeneratedFile() { - return Paths.get( - System.getProperty( - "desugar_jdk_libs", "third_party/openjdk/desugar_jdk_libs/desugar_jdk_libs.jar")); + String property = System.getProperty("desugar_jdk_libs"); + if (property == null) { + return DESUGARED_JDK_8_LIB_JAR; + } + return Paths.get(property); } private static String getDesugarLibraryJsonDir() { @@ -2265,12 +2274,7 @@ public static void writeApplication(AppView<?> appView, InternalOptions options) throws ExecutionException { - R8.writeApplication( - Executors.newSingleThreadExecutor(), - appView, - NamingLens.getIdentityLens(), - options, - null); + R8.writeApplication(appView, null, Executors.newSingleThreadExecutor()); } public static void disassemble(AndroidApp app, PrintStream ps) throws IOException {
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 8a91c84..c80de82 100644 --- a/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java +++ b/src/test/java/com/android/tools/r8/accessrelaxation/InvokeTypeConversionTest.java
@@ -13,8 +13,8 @@ import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper.DexVm.Version; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeVirtual; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.smali.SmaliBuilder; @@ -111,15 +111,18 @@ parameters.getRuntime().asDex().getVm().getVersion().isOlderThanOrEqual(Version.V4_4_4) ? "VerifyError" : "IncompatibleClassChangeError"; - run(builder, expectedError, dexInspector -> { - ClassSubject clazz = dexInspector.clazz(CLASS_NAME); - assertThat(clazz, isPresent()); - DexEncodedMethod method = getMethod(dexInspector, main); - assertNotNull(method); - DexCode code = method.getCode().asDexCode(); - // The given invoke line is remained as-is. - assertTrue(code.instructions[2] instanceof InvokeDirect); - }); + run( + builder, + expectedError, + dexInspector -> { + ClassSubject clazz = dexInspector.clazz(CLASS_NAME); + assertThat(clazz, isPresent()); + DexEncodedMethod method = getMethod(dexInspector, main); + assertNotNull(method); + DexCode code = method.getCode().asDexCode(); + // The given invoke line is remained as-is. + assertTrue(code.instructions[2] instanceof DexInvokeDirect); + }); } // The following test checks invoke-direct, which refers to the private instance method, *is* @@ -139,15 +142,18 @@ public void invokeDirectToPublicizedMethod() throws Exception { SmaliBuilder builder = buildTestClass( "invoke-direct { v1 }, L" + CLASS_NAME + ";->foo()I"); - run(builder, null, dexInspector -> { - ClassSubject clazz = dexInspector.clazz(CLASS_NAME); - assertThat(clazz, isPresent()); - DexEncodedMethod method = getMethod(dexInspector, main); - assertNotNull(method); - DexCode code = method.getCode().asDexCode(); - // The given invoke line is changed to invoke-virtual - assertTrue(code.instructions[2] instanceof InvokeVirtual); - }); + run( + builder, + null, + dexInspector -> { + ClassSubject clazz = dexInspector.clazz(CLASS_NAME); + assertThat(clazz, isPresent()); + DexEncodedMethod method = getMethod(dexInspector, main); + assertNotNull(method); + DexCode code = method.getCode().asDexCode(); + // The given invoke line is changed to invoke-virtual + assertTrue(code.instructions[2] instanceof DexInvokeVirtual); + }); } } \ No newline at end of file
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java index a409fd6..708858e 100644 --- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java +++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGenerator.java
@@ -10,6 +10,7 @@ import static com.android.tools.r8.lightir.ByteUtils.isU2; import static com.android.tools.r8.lightir.ByteUtils.setBitAtIndex; import static com.android.tools.r8.utils.MapUtils.ignoreKey; +import static org.junit.Assert.assertEquals; import com.android.tools.r8.TestBase; import com.android.tools.r8.ToolHelper; @@ -211,12 +212,12 @@ Map<Integer, List<Pair<DexReference, AndroidApiLevel>>> generationMap = new HashMap<>(); ConstantPool constantPool = new ConstantPool(); - int constantPoolMapSize = 1 << AndroidApiDataAccess.entrySizeInBitsForConstantPoolMap(); - int apiMapSize = 1 << AndroidApiDataAccess.entrySizeInBitsForApiLevelMap(); + int constantPoolHashMapSize = 1 << AndroidApiDataAccess.entrySizeInBitsForConstantPoolMap(); + int apiHashMapSize = 1 << AndroidApiDataAccess.entrySizeInBitsForApiLevelMap(); for (Entry<DexReference, AndroidApiLevel> entry : referenceMap.entrySet()) { int newCode = AndroidApiDataAccess.apiLevelHash(entry.getKey()); - assert newCode >= 0 && newCode <= apiMapSize; + assert newCode >= 0 && newCode <= apiHashMapSize; generationMap .computeIfAbsent(newCode, ignoreKey(ArrayList::new)) .add(Pair.create(entry.getKey(), entry.getValue())); @@ -238,6 +239,7 @@ outputStream.writeInt(constantPool.size()); // Write constant pool consisting of <u4:payload_offset><u2:length>. + assertEquals(AndroidApiDataAccess.constantPoolOffset(), outputStream.size()); IntBox lastReadIndex = new IntBox(-1); constantPool.forEach( (string, id) -> { @@ -252,14 +254,14 @@ constantPool.forEach( (string, id) -> { int constantPoolHash = constantPoolHash(string); - assert constantPoolHash >= 0 && constantPoolHash <= constantPoolMapSize; + assert constantPoolHash >= 0 && constantPoolHash <= constantPoolHashMapSize; constantPoolLookupTable .computeIfAbsent(constantPoolHash, ignoreKey(ArrayList::new)) .add(id); }); - int[] constantPoolEntries = new int[constantPoolMapSize]; - int[] constantPoolEntryLengths = new int[constantPoolMapSize]; + int[] constantPoolEntries = new int[constantPoolHashMapSize]; + int[] constantPoolEntryLengths = new int[constantPoolHashMapSize]; for (Entry<Integer, List<Integer>> entry : constantPoolLookupTable.entrySet()) { // Tag if we have a unique value if (entry.getValue().size() == 1) { @@ -276,13 +278,15 @@ } } // Write constant pool lookup entries consisting of <u4:payload_offset><u2:length> + assertEquals( + AndroidApiDataAccess.constantPoolHashMapOffset(constantPool.size()), outputStream.size()); for (int i = 0; i < constantPoolEntries.length; i++) { outputStream.writeInt(constantPoolEntries[i]); outputStream.writeShort(constantPoolEntryLengths[i]); } - int[] apiOffsets = new int[apiMapSize]; - int[] apiOffsetLengths = new int[apiMapSize]; + int[] apiOffsets = new int[apiHashMapSize]; + int[] apiOffsetLengths = new int[apiHashMapSize]; for (Entry<Integer, Pair<Integer, Integer>> hashIndexAndOffset : offsetMap.entrySet()) { assert apiOffsets[hashIndexAndOffset.getKey()] == 0; Pair<Integer, Integer> value = hashIndexAndOffset.getValue(); @@ -293,6 +297,8 @@ } // Write api lookup entries consisting of <u4:payload_offset><u2:length> + assertEquals( + AndroidApiDataAccess.apiLevelHashMapOffset(constantPool.size()), outputStream.size()); for (int i = 0; i < apiOffsets.length; i++) { outputStream.writeInt(apiOffsets[i]); outputStream.writeShort(apiOffsetLengths[i]);
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java index dcf406d..53f5fda 100644 --- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiHashingDatabaseBuilderGeneratorTest.java
@@ -8,6 +8,7 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestDiagnosticMessagesImpl; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper; @@ -19,6 +20,7 @@ import com.android.tools.r8.graph.DexType; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.IntBox; +import com.android.tools.r8.utils.InternalOptions; import com.google.common.collect.ImmutableList; import java.nio.file.Files; import java.nio.file.Path; @@ -117,8 +119,10 @@ AndroidApiVersionsXmlParser.getParsedApiClasses( ToolHelper.getApiVersionsXmlFile(API_LEVEL).toFile(), API_LEVEL); DexItemFactory factory = new DexItemFactory(); + TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl(); AndroidApiLevelHashingDatabaseImpl androidApiLevelDatabase = - new AndroidApiLevelHashingDatabaseImpl(ImmutableList.of()); + new AndroidApiLevelHashingDatabaseImpl( + ImmutableList.of(), new InternalOptions(), diagnosticsHandler); parsedApiClasses.forEach( parsedApiClass -> { DexType type = factory.createType(parsedApiClass.getClassReference().getDescriptor()); @@ -147,6 +151,7 @@ .isLessThanOrEqualTo(fieldApiLevel); })); }); + diagnosticsHandler.assertNoMessages(); } /**
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelHorizontalMergeAndD8MergeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelHorizontalMergeAndD8MergeTest.java new file mode 100644 index 0000000..774de69 --- /dev/null +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelHorizontalMergeAndD8MergeTest.java
@@ -0,0 +1,172 @@ +// Copyright (c) 2022, 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.apimodel; + +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass; +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod; +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import com.android.tools.r8.CompilationMode; +import com.android.tools.r8.OutputMode; +import com.android.tools.r8.SingleTestRunResult; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestCompilerBuilder; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.synthesis.SyntheticItemsTestUtils; +import com.android.tools.r8.synthesis.globals.GlobalSyntheticsTestingConsumer; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class ApiModelHorizontalMergeAndD8MergeTest extends TestBase { + + private final AndroidApiLevel mockLevel = AndroidApiLevel.M; + + @Parameter() public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + } + + private boolean isGreaterOrEqualToMockLevel() { + return parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockLevel); + } + + private void setupTestCompileBuilder(TestCompilerBuilder<?, ?, ?, ?, ?> testBuilder) + throws NoSuchMethodException { + testBuilder + .addLibraryClasses(LibraryClass.class) + .addDefaultRuntimeLibrary(parameters) + .setMinApi(parameters.getApiLevel()) + .apply(ApiModelingTestHelper::enableApiCallerIdentification) + .apply(ApiModelingTestHelper::enableOutliningOfMethods) + .apply(setMockApiLevelForClass(LibraryClass.class, mockLevel)) + .apply(setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("foo"), mockLevel)) + .apply(setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("bar"), mockLevel)); + } + + private boolean addToBootClasspath() { + return parameters.isDexRuntime() + && parameters.getRuntime().maxSupportedApiLevel().isGreaterThanOrEqualTo(mockLevel); + } + + @Test + public void testD8DebugDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.DEBUG); + } + + @Test + public void testD8ReleaseDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.RELEASE); + } + + private Path runD8ForClass( + Class<?> clazz, GlobalSyntheticsTestingConsumer global, CompilationMode mode) + throws Exception { + return testForD8() + .addProgramClasses(clazz) + .setMode(mode) + .setOutputMode(OutputMode.DexFilePerClassFile) + .apply(b -> b.getBuilder().setGlobalSyntheticsConsumer(global)) + .apply(this::setupTestCompileBuilder) + .compile() + .writeToZip(); + } + + public void testD8Merge(CompilationMode mode) throws Exception { + List<Path> paths = new ArrayList<>(); + GlobalSyntheticsTestingConsumer mainGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingFooGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingBarGlobals = new GlobalSyntheticsTestingConsumer(); + paths.add(runD8ForClass(Main.class, mainGlobals, mode)); + paths.add(runD8ForClass(TestCallingFoo.class, testCallingFooGlobals, mode)); + paths.add(runD8ForClass(TestCallingBar.class, testCallingBarGlobals, mode)); + assertFalse(mainGlobals.hasGlobals()); + assertFalse(testCallingFooGlobals.hasGlobals()); + assertFalse(testCallingBarGlobals.hasGlobals()); + testForD8() + .setMode(mode) + .addProgramFiles(paths) + .apply(this::setupTestCompileBuilder) + .addHorizontallyMergedClassesInspector( + inspector -> { + if (isGreaterOrEqualToMockLevel() || mode.isDebug()) { + inspector.assertNoClassesMerged(); + } else { + inspector.assertClassReferencesMerged( + SyntheticItemsTestUtils.syntheticApiOutlineClass(TestCallingFoo.class, 0), + SyntheticItemsTestUtils.syntheticApiOutlineClass(TestCallingBar.class, 0)); + } + }) + .compile() + .inspect(inspector -> inspect(inspector, mode)) + .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) + .run(parameters.getRuntime(), Main.class) + .apply(this::checkOutput); + } + + private void inspect(CodeInspector inspector, CompilationMode mode) { + ClassSubject libraryClassSubject = inspector.clazz(LibraryClass.class); + if (isGreaterOrEqualToMockLevel()) { + assertThat(libraryClassSubject, isAbsent()); + } else { + assertEquals(mode.isRelease() ? 4 : 5, inspector.allClasses().size()); + } + } + + private void checkOutput(SingleTestRunResult<?> runResult) { + runResult.assertSuccessWithOutputLinesIf( + addToBootClasspath(), "LibraryClass::foo", "LibraryClass::bar"); + runResult.assertFailureWithErrorThatThrowsIf(!addToBootClasspath(), NoClassDefFoundError.class); + } + + // Only present form api level 23. + public static class LibraryClass { + + public static void foo() { + System.out.println("LibraryClass::foo"); + } + + public static void bar() { + System.out.println("LibraryClass::bar"); + } + } + + public static class TestCallingFoo { + + public static void callFoo() { + LibraryClass.foo(); + } + } + + public static class TestCallingBar { + + public static void callBar() { + LibraryClass.bar(); + } + } + + public static class Main { + + public static void main(String[] args) { + TestCallingFoo.callFoo(); + TestCallingBar.callBar(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java index 61a9e78..4f31982 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
@@ -65,7 +65,7 @@ .applyIf(isGreaterOrEqualToMockLevel(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) .apply(this::checkOutput) - .inspect(ApiModelingTestHelper::assertNoSynthesizedClasses); + .inspect(this::inspect); } @Test @@ -73,8 +73,6 @@ assumeTrue(parameters.isDexRuntime()); testForD8() .setMode(CompilationMode.RELEASE) - // TODO(b/213552119): Remove when enabled by default. - .apply(ApiModelingTestHelper::enableApiCallerIdentification) .apply(this::setupTestBuilder) .compile() .applyIf(isGreaterOrEqualToMockLevel(), b -> b.addBootClasspathClasses(LibraryClass.class))
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java index ec4a09e..b9476a7 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java
@@ -5,7 +5,6 @@ package com.android.tools.r8.apimodel; import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass; -import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer; import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat; import static org.junit.Assume.assumeTrue; @@ -46,8 +45,7 @@ .addDefaultRuntimeLibrary(parameters) .setMinApi(parameters.getApiLevel()) .apply(ApiModelingTestHelper::enableStubbingOfClasses) - .apply(setMockApiLevelForClass(LibraryClass.class, mockLevel)) - .apply(setMockApiLevelForDefaultInstanceInitializer(LibraryClass.class, mockLevel)); + .apply(setMockApiLevelForClass(LibraryClass.class, mockLevel)); } @Test @@ -57,7 +55,7 @@ .setMode(CompilationMode.DEBUG) .apply(this::setupTestBuilder) .compile() - .inspect(ApiModelingTestHelper::assertNoSynthesizedClasses) + .inspect(this::inspect) .applyIf(isGreaterOrEqualToMockLevel(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) .apply(this::checkOutput); @@ -68,8 +66,6 @@ assumeTrue(parameters.isDexRuntime()); testForD8() .setMode(CompilationMode.RELEASE) - // TODO(b/213552119): Remove when enabled by default. - .apply(ApiModelingTestHelper::enableApiCallerIdentification) .apply(this::setupTestBuilder) .compile() .inspect(this::inspect) @@ -103,7 +99,7 @@ // Only present form api level 23. public static class LibraryClass { - public static void foo() { + public void foo() { System.out.println("Hello World"); } } @@ -111,7 +107,7 @@ public static class Main { public static void main(String[] args) { - LibraryClass.foo(); + new LibraryClass().foo(); } } }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java index 184e984..2f8bd1e 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
@@ -81,10 +81,10 @@ .setMode(CompilationMode.DEBUG) .apply(this::setupTestBuilder) .compile() - .inspect(ApiModelingTestHelper::assertNoSynthesizedClasses) .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) - .apply(this::checkOutput); + .apply(this::checkOutput) + .inspect(this::inspect); } @Test @@ -92,8 +92,6 @@ assumeTrue(parameters.isDexRuntime()); testForD8() .setMode(CompilationMode.RELEASE) - // TODO(b/213552119): Remove when enabled by default. - .apply(ApiModelingTestHelper::enableApiCallerIdentification) .apply(this::setupTestBuilder) .compile() .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) @@ -187,6 +185,7 @@ // Only present from api level 23. public static class LibraryClass { + // Do not model foo. If foo was modeled we would not stub. public void foo() { System.out.println("LibraryClass::foo"); }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java index 78c5fc1..322b30f 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
@@ -64,10 +64,10 @@ .setMode(CompilationMode.DEBUG) .apply(this::setupTestBuilder) .compile() - .inspect(ApiModelingTestHelper::assertNoSynthesizedClasses) .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) - .apply(this::checkOutput); + .apply(this::checkOutput) + .inspect(this::inspect); } @Test @@ -75,8 +75,6 @@ assumeTrue(parameters.isDexRuntime()); testForD8() .setMode(CompilationMode.RELEASE) - // TODO(b/213552119): Remove when enabled by default. - .apply(ApiModelingTestHelper::enableApiCallerIdentification) .apply(this::setupTestBuilder) .compile() .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class))
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java new file mode 100644 index 0000000..5798d5a --- /dev/null +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java
@@ -0,0 +1,182 @@ +// Copyright (c) 2022, 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.apimodel; + +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass; +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer; +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod; +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; + +import com.android.tools.r8.CompilationMode; +import com.android.tools.r8.OutputMode; +import com.android.tools.r8.SingleTestRunResult; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestCompilerBuilder; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.references.Reference; +import com.android.tools.r8.synthesis.globals.GlobalSyntheticsTestingConsumer; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class ApiModelMockMergeTest extends TestBase { + + private final AndroidApiLevel mockLevel = AndroidApiLevel.M; + + @Parameter() public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + } + + private boolean isGreaterOrEqualToMockLevel() { + return parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockLevel); + } + + private void setupTestCompileBuilder( + TestCompilerBuilder<?, ?, ?, ?, ?> testBuilder, Class<?> programClass) + throws NoSuchMethodException { + testBuilder + .addProgramClasses(programClass) + .addLibraryClasses(LibraryClass.class) + .addDefaultRuntimeLibrary(parameters) + .setMinApi(parameters.getApiLevel()) + .apply(ApiModelingTestHelper::enableApiCallerIdentification) + .apply(ApiModelingTestHelper::enableStubbingOfClasses) + .apply(setMockApiLevelForClass(LibraryClass.class, mockLevel)) + .apply(setMockApiLevelForDefaultInstanceInitializer(LibraryClass.class, mockLevel)) + .apply(setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("foo"), mockLevel)) + .apply(setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("bar"), mockLevel)); + } + + private boolean addToBootClasspath() { + return parameters.isDexRuntime() + && parameters.getRuntime().maxSupportedApiLevel().isGreaterThanOrEqualTo(mockLevel); + } + + @Test + public void testD8DebugDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.DEBUG); + } + + @Test + public void testD8ReleaseDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.RELEASE); + } + + private Path runD8ForClass( + Class<?> clazz, GlobalSyntheticsTestingConsumer global, CompilationMode mode) + throws Exception { + return testForD8() + .setMode(mode) + .setOutputMode(OutputMode.DexFilePerClassFile) + .apply(b -> b.getBuilder().setGlobalSyntheticsConsumer(global)) + .apply(builder -> setupTestCompileBuilder(builder, clazz)) + .compile() + .writeToZip(); + } + + public void testD8Merge(CompilationMode mode) throws Exception { + List<Path> paths = new ArrayList<>(); + GlobalSyntheticsTestingConsumer mainGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingFooGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingBarGlobals = new GlobalSyntheticsTestingConsumer(); + paths.add(runD8ForClass(Main.class, mainGlobals, mode)); + paths.add(runD8ForClass(TestCallingFoo.class, testCallingFooGlobals, mode)); + paths.add(runD8ForClass(TestCallingBar.class, testCallingBarGlobals, mode)); + assertFalse(mainGlobals.hasGlobals()); + if (isGreaterOrEqualToMockLevel()) { + assertFalse(testCallingFooGlobals.hasGlobals()); + assertFalse(testCallingBarGlobals.hasGlobals()); + } else { + // The TestCallingX does reference the mock and should have globals. + assertNotNull( + testCallingFooGlobals.getProvider(Reference.classFromClass(TestCallingFoo.class))); + assertNotNull( + testCallingBarGlobals.getProvider(Reference.classFromClass(TestCallingBar.class))); + } + + testForD8() + .setMode(mode) + .addProgramFiles(paths) + .setMinApi(parameters.getApiLevel()) + .apply( + b -> + b.getBuilder() + .addGlobalSyntheticsResourceProviders(testCallingFooGlobals.getProviders()) + .addGlobalSyntheticsResourceProviders(testCallingBarGlobals.getProviders())) + .compile() + .inspect(this::inspect) + .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) + .run(parameters.getRuntime(), Main.class) + .apply(this::checkOutput); + } + + private void inspect(CodeInspector inspector) { + ClassSubject libraryClassSubject = inspector.clazz(LibraryClass.class); + if (isGreaterOrEqualToMockLevel()) { + assertThat(libraryClassSubject, isAbsent()); + } else { + assertThat(libraryClassSubject, isPresent()); + assertThat(libraryClassSubject.uniqueMethodWithName("foo"), isAbsent()); + assertThat(libraryClassSubject.uniqueMethodWithName("bar"), isAbsent()); + } + } + + private void checkOutput(SingleTestRunResult<?> runResult) { + runResult.assertSuccessWithOutputLinesIf( + addToBootClasspath(), "LibraryClass::foo", "LibraryClass::bar"); + runResult.assertFailureWithErrorThatThrowsIf(!addToBootClasspath(), NoClassDefFoundError.class); + } + + // Only present form api level 23. + public static class LibraryClass { + + public void foo() { + System.out.println("LibraryClass::foo"); + } + + public void bar() { + System.out.println("LibraryClass::bar"); + } + } + + public static class TestCallingFoo { + + public static void callFoo() { + new LibraryClass().foo(); + } + } + + public static class TestCallingBar { + + public static void callBar() { + new LibraryClass().bar(); + } + } + + public static class Main { + + public static void main(String[] args) { + TestCallingFoo.callFoo(); + TestCallingBar.callBar(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java index d6911db..5d4fc8f 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
@@ -74,7 +74,6 @@ .setMode(CompilationMode.DEBUG) .apply(this::setupTestBuilder) .compile() - .inspect(ApiModelingTestHelper::assertNoSynthesizedClasses) .applyIf( addLibraryClassesToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class, LibraryInterface.class)) @@ -82,7 +81,8 @@ addOtherLibraryClassesToBootClasspath(), b -> b.addBootClasspathClasses(OtherLibraryClass.class)) .run(parameters.getRuntime(), Main.class) - .apply(this::checkOutput); + .apply(this::checkOutput) + .inspect(this::inspect); } @Test @@ -90,8 +90,6 @@ assumeTrue(parameters.isDexRuntime()); testForD8() .setMode(CompilationMode.RELEASE) - // TODO(b/213552119): Remove when enabled by default. - .apply(ApiModelingTestHelper::enableApiCallerIdentification) .apply(this::setupTestBuilder) .compile() .applyIf(
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoHorizontalMergeAndD8MergeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoHorizontalMergeAndD8MergeTest.java new file mode 100644 index 0000000..e241455 --- /dev/null +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoHorizontalMergeAndD8MergeTest.java
@@ -0,0 +1,167 @@ +// Copyright (c) 2022, 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.apimodel; + +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForClass; +import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod; +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +import com.android.tools.r8.CompilationMode; +import com.android.tools.r8.OutputMode; +import com.android.tools.r8.SingleTestRunResult; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestCompilerBuilder; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.synthesis.globals.GlobalSyntheticsTestingConsumer; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.HorizontallyMergedClassesInspector; +import java.nio.file.Path; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class ApiModelNoHorizontalMergeAndD8MergeTest extends TestBase { + + private final AndroidApiLevel oneMockLevel = AndroidApiLevel.M; + private final AndroidApiLevel otherMockLevel = AndroidApiLevel.N; + + @Parameter() public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + } + + private boolean isGreaterOrEqualToMockLevel() { + return parameters.isDexRuntime() + && parameters.getApiLevel().isGreaterThanOrEqualTo(oneMockLevel); + } + + private void setupTestCompileBuilder(TestCompilerBuilder<?, ?, ?, ?, ?> testBuilder) + throws NoSuchMethodException { + testBuilder + .addLibraryClasses(LibraryClass.class) + .addDefaultRuntimeLibrary(parameters) + .setMinApi(parameters.getApiLevel()) + .apply(ApiModelingTestHelper::enableApiCallerIdentification) + .apply(ApiModelingTestHelper::enableOutliningOfMethods) + .apply(setMockApiLevelForClass(LibraryClass.class, oneMockLevel)) + .apply(setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("foo"), oneMockLevel)) + .apply( + setMockApiLevelForMethod(LibraryClass.class.getDeclaredMethod("bar"), otherMockLevel)); + } + + private boolean addToBootClasspath() { + return parameters.isDexRuntime() + && parameters.getRuntime().maxSupportedApiLevel().isGreaterThanOrEqualTo(oneMockLevel); + } + + @Test + public void testD8DebugDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.DEBUG); + } + + @Test + public void testD8ReleaseDexFilePerClassFile() throws Exception { + testD8Merge(CompilationMode.RELEASE); + } + + private Path runD8ForClass( + Class<?> clazz, GlobalSyntheticsTestingConsumer global, CompilationMode mode) + throws Exception { + return testForD8() + .addProgramClasses(clazz) + .setMode(mode) + .setOutputMode(OutputMode.DexFilePerClassFile) + .apply(b -> b.getBuilder().setGlobalSyntheticsConsumer(global)) + .apply(this::setupTestCompileBuilder) + .compile() + .writeToZip(); + } + + public void testD8Merge(CompilationMode mode) throws Exception { + List<Path> paths = new ArrayList<>(); + GlobalSyntheticsTestingConsumer mainGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingFooGlobals = new GlobalSyntheticsTestingConsumer(); + GlobalSyntheticsTestingConsumer testCallingBarGlobals = new GlobalSyntheticsTestingConsumer(); + paths.add(runD8ForClass(Main.class, mainGlobals, mode)); + paths.add(runD8ForClass(TestCallingFoo.class, testCallingFooGlobals, mode)); + paths.add(runD8ForClass(TestCallingBar.class, testCallingBarGlobals, mode)); + assertFalse(mainGlobals.hasGlobals()); + assertFalse(testCallingFooGlobals.hasGlobals()); + assertFalse(testCallingBarGlobals.hasGlobals()); + testForD8() + .setMode(mode) + .addProgramFiles(paths) + .apply(this::setupTestCompileBuilder) + .addHorizontallyMergedClassesInspector( + HorizontallyMergedClassesInspector::assertNoClassesMerged) + .compile() + .inspect(inspector -> inspect(inspector, mode)) + .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) + .run(parameters.getRuntime(), Main.class) + .apply(this::checkOutput); + } + + private void inspect(CodeInspector inspector, CompilationMode mode) { + ClassSubject libraryClassSubject = inspector.clazz(LibraryClass.class); + if (isGreaterOrEqualToMockLevel()) { + assertThat(libraryClassSubject, isAbsent()); + } else { + assertEquals(5, inspector.allClasses().size()); + } + } + + private void checkOutput(SingleTestRunResult<?> runResult) { + runResult.assertSuccessWithOutputLinesIf( + addToBootClasspath(), "LibraryClass::foo", "LibraryClass::bar"); + runResult.assertFailureWithErrorThatThrowsIf(!addToBootClasspath(), NoClassDefFoundError.class); + } + + // Only present form api level 23. + public static class LibraryClass { + + public static void foo() { + System.out.println("LibraryClass::foo"); + } + + public static void bar() { + System.out.println("LibraryClass::bar"); + } + } + + public static class TestCallingFoo { + + public static void callFoo() { + LibraryClass.foo(); + } + } + + public static class TestCallingBar { + + public static void callBar() { + LibraryClass.bar(); + } + } + + public static class Main { + + public static void main(String[] args) { + TestCallingFoo.callFoo(); + TestCallingBar.callBar(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java index a3183b0..4bb470c 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java
@@ -8,8 +8,8 @@ import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForDefaultInstanceInitializer; import static com.android.tools.r8.apimodel.ApiModelingTestHelper.setMockApiLevelForMethod; import static com.android.tools.r8.apimodel.ApiModelingTestHelper.verifyThat; +import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static org.hamcrest.CoreMatchers.not; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assume.assumeTrue; @@ -79,8 +79,7 @@ .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput(result) - // TODO(b/213552119): Add stubs to D8 - .inspect(inspector -> inspect(inspector, false)); + .inspect(inspector -> inspect(inspector, true, true)); } @Test @@ -94,7 +93,7 @@ .applyIf(addToBootClasspath(), b -> b.addBootClasspathClasses(LibraryClass.class)) .run(parameters.getRuntime(), Main.class) .apply(this::checkOutput) - .inspect(inspector -> inspect(inspector, true)); + .inspect(inspector -> inspect(inspector, true, true)); } private void checkOutput(SingleTestRunResult<?> runResult) { @@ -106,15 +105,21 @@ } } - private void inspect(CodeInspector inspector, boolean canStub) throws Exception { + private void inspect(CodeInspector inspector, boolean canOutline, boolean canStub) + throws Exception { Method methodOn23 = LibraryClass.class.getDeclaredMethod("methodOn23"); Method mainMethod = Main.class.getDeclaredMethod("main", String[].class); assertThat(inspector.method(mainMethod), isPresent()); - verifyThat(inspector, parameters, methodOn23).isNotOutlinedFrom(mainMethod); + if (canOutline) { + verifyThat(inspector, parameters, methodOn23) + .isOutlinedFromUntil(mainMethod, libraryApiLevel); + } else { + verifyThat(inspector, parameters, methodOn23).isNotOutlinedFrom(mainMethod); + } if (canStub) { verifyThat(inspector, parameters, LibraryClass.class).stubbedUntil(libraryApiLevel); } else { - assertThat(inspector.clazz(LibraryClass.class), not(isPresent())); + assertThat(inspector.clazz(LibraryClass.class), isAbsent()); } }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java index 0fbd97c..21db603 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
@@ -140,12 +140,15 @@ && invokesMethodWithName("missingNotReferenced").matches(methodSubject)) .findFirst(); assertFalse(synthesizedMissingNotReferenced.isPresent()); - verifyThat(inspector, parameters, addedOn23()).isNotOutlinedFrom(testMethod); + verifyThat(inspector, parameters, addedOn23()) + .isOutlinedFromUntil(testMethod, initialLibraryMockLevel); verifyThat(inspector, parameters, addedOn27()) .isOutlinedFromUntil(testMethod, finalLibraryMethodLevel); verifyThat(inspector, parameters, LibraryClass.class.getDeclaredMethod("missingAndReferenced")) .isNotOutlinedFrom(testMethod); - if (parameters.getApiLevel().isLessThan(finalLibraryMethodLevel)) { + if (parameters.getApiLevel().isLessThan(initialLibraryMockLevel)) { + assertEquals(5, inspector.allClasses().size()); + } else if (parameters.getApiLevel().isLessThan(finalLibraryMethodLevel)) { assertEquals(4, inspector.allClasses().size()); } else { assertEquals(3, inspector.allClasses().size());
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java index 94f733d..f11b7a1 100644 --- a/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java +++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelingTestHelper.java
@@ -115,6 +115,7 @@ static void enableStubbingOfClasses(TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) { compilerBuilder.addOptionsModification( options -> { + options.apiModelingOptions().enableApiCallerIdentification = true; options.apiModelingOptions().enableStubbingOfClasses = true; }); } @@ -122,6 +123,7 @@ static void enableOutliningOfMethods(TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) { compilerBuilder.addOptionsModification( options -> { + options.apiModelingOptions().enableApiCallerIdentification = true; options.apiModelingOptions().enableOutliningOfMethods = true; }); } @@ -130,6 +132,7 @@ TestCompilerBuilder<?, ?, ?, ?, ?> compilerBuilder) { compilerBuilder.addOptionsModification( options -> { + options.apiModelingOptions().enableApiCallerIdentification = true; options.apiModelingOptions().checkAllApiReferencesAreSet = false; }); }
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java index fb4f27e..57c41a8 100644 --- a/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java +++ b/src/test/java/com/android/tools/r8/bridgeremoval/B77836766.java
@@ -12,8 +12,8 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.ReturnVoid; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.jasmin.JasminBuilder; import com.android.tools.r8.jasmin.JasminBuilder.ClassBuilder; @@ -180,13 +180,15 @@ if (parameters.isDexRuntime()) { DexCode code = fooFromCls2InAbsCls.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - InvokeVirtual invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder); code = fooFromCls1InAbsCls.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(absSubject.getDexProgramClass().type, invoke.getMethod().holder); } }) @@ -304,13 +306,15 @@ if (parameters.isDexRuntime()) { DexCode code = barInCls2.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - InvokeVirtual invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder); code = fooInBase.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder); } }) @@ -405,8 +409,9 @@ if (parameters.isDexRuntime()) { DexCode code = barInSub.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - InvokeVirtual invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder); } }) @@ -491,8 +496,9 @@ if (parameters.isDexRuntime()) { DexCode code = barInSub.getMethod().getCode().asDexCode(); - checkInstructions(code, ImmutableList.of(InvokeVirtual.class, ReturnVoid.class)); - InvokeVirtual invoke = (InvokeVirtual) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexInvokeVirtual.class, DexReturnVoid.class)); + DexInvokeVirtual invoke = (DexInvokeVirtual) code.instructions[0]; assertEquals(baseSubject.getDexProgramClass().type, invoke.getMethod().holder); } })
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionAfterClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionAfterClassMergingTest.java new file mode 100644 index 0000000..f5ba678 --- /dev/null +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionAfterClassMergingTest.java
@@ -0,0 +1,95 @@ +// Copyright (c) 2022, 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.classmerging.horizontal; + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoHorizontalClassMerging; +import com.android.tools.r8.NoUnusedInterfaceRemoval; +import com.android.tools.r8.NoVerticalClassMerging; +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.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class DefaultInterfaceMethodCollisionAfterClassMergingTest extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .addKeepClassAndMembersRules(Main.class) + .addHorizontallyMergedClassesInspector( + inspector -> + inspector.applyIf( + !parameters.canUseDefaultAndStaticInterfaceMethods(), + i -> + i.assertIsCompleteMergeGroup(A.class, B.class) + .assertNoOtherClassesMerged())) + .enableInliningAnnotations() + .enableNoHorizontalClassMergingAnnotations() + .enableNoUnusedInterfaceRemovalAnnotations() + .enableNoVerticalClassMergingAnnotations() + .setMinApi(parameters.getApiLevel()) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("I", "J"); + } + + static class Main { + + public static void main(String[] args) { + test(new A()); + test(new B()); + } + + // @Keep + static void test(I i) { + i.m(); + } + + // @Keep + static void test(J j) { + j.m(); + } + } + + @NoHorizontalClassMerging + @NoUnusedInterfaceRemoval + @NoVerticalClassMerging + interface I { + + @NeverInline + default void m() { + System.out.println("I"); + } + } + + @NoHorizontalClassMerging + @NoUnusedInterfaceRemoval + @NoVerticalClassMerging + interface J { + + @NeverInline + default void m() { + System.out.println("J"); + } + } + + static class A implements I {} + + static class B implements J {} +}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionInSubclassAfterClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionInSubclassAfterClassMergingTest.java new file mode 100644 index 0000000..e8919da --- /dev/null +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/DefaultInterfaceMethodCollisionInSubclassAfterClassMergingTest.java
@@ -0,0 +1,118 @@ +// Copyright (c) 2022, 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.classmerging.horizontal; + +import com.android.tools.r8.NeverInline; +import com.android.tools.r8.NoHorizontalClassMerging; +import com.android.tools.r8.NoUnusedInterfaceRemoval; +import com.android.tools.r8.NoVerticalClassMerging; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.TestRuntime.CfVm; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class DefaultInterfaceMethodCollisionInSubclassAfterClassMergingTest extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .addKeepClassAndMembersRules(Main.class) + .addHorizontallyMergedClassesInspector( + inspector -> + // TODO(b/229951607): Should only merge A and B when desugaring. + inspector.assertIsCompleteMergeGroup(A.class, B.class).assertNoOtherClassesMerged()) + .enableInliningAnnotations() + .enableNoHorizontalClassMergingAnnotations() + .enableNoUnusedInterfaceRemovalAnnotations() + .enableNoVerticalClassMergingAnnotations() + .setMinApi(parameters.getApiLevel()) + .run(parameters.getRuntime(), Main.class) + // TODO(b/229951607): Should always succeed. + .applyIf( + parameters.canUseDefaultAndStaticInterfaceMethods(), + runResult -> + runResult.assertFailureWithErrorThatThrows( + parameters.isCfRuntime() + && parameters.getRuntime().asCf().isNewerThanOrEqual(CfVm.JDK11) + ? AbstractMethodError.class + : IncompatibleClassChangeError.class), + runResult -> runResult.assertSuccessWithOutputLines("A", "I", "J")); + } + + static class Main { + + public static void main(String[] args) { + escape(new A()); + test(new ASub()); + test(new B()); + } + + // @Keep + static void escape(Object o) { + System.out.println(o); + } + + // @Keep + static void test(I i) { + i.m(); + } + + // @Keep + static void test(J j) { + j.m(); + } + } + + @NoHorizontalClassMerging + @NoUnusedInterfaceRemoval + @NoVerticalClassMerging + interface I { + + @NeverInline + default void m() { + System.out.println("I"); + } + } + + @NoHorizontalClassMerging + @NoUnusedInterfaceRemoval + @NoVerticalClassMerging + interface J { + + @NeverInline + default void m() { + System.out.println("J"); + } + } + + @NoVerticalClassMerging + static class A { + + @Override + public String toString() { + return "A"; + } + } + + @NoHorizontalClassMerging + static class ASub extends A implements I {} + + static class B implements J {} +}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/VirtualMethodMergingWithAbsentMethodAndSuperClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/VirtualMethodMergingWithAbsentMethodAndSuperClassMergingTest.java new file mode 100644 index 0000000..8ee3476 --- /dev/null +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/VirtualMethodMergingWithAbsentMethodAndSuperClassMergingTest.java
@@ -0,0 +1,119 @@ +// Copyright (c) 2022, 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.classmerging.horizontal; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.google.common.collect.ImmutableList; +import com.google.common.collect.Iterables; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +/** Reproduction of b/231900726. */ +@RunWith(Parameterized.class) +public class VirtualMethodMergingWithAbsentMethodAndSuperClassMergingTest extends TestBase { + + @Parameter(0) + public Class<?> upperMergeTarget; + + @Parameter(1) + public Class<?> lowerMergeTarget; + + @Parameter(2) + public TestParameters parameters; + + @Parameters(name = "{2}, upper merge target: {0}, lower merge target: {1}") + public static List<Object[]> data() { + return buildParameters( + ImmutableList.of(A.class, B.class), + ImmutableList.of(C.class, D.class), + getTestParameters().withAllRuntimesAndApiLevels().build()); + } + + @Test + public void test() throws Exception { + testForR8(parameters.getBackend()) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) + // Control the targets of the horizontal class merger. + .addOptionsModification( + options -> + options.testing.horizontalClassMergingTarget = + (appView, candidates, target) -> { + if (Iterables.any( + candidates, + candidate -> candidate.getTypeName().equals(A.class.getTypeName()))) { + return Iterables.find( + candidates, + candidate -> + candidate.getTypeName().equals(upperMergeTarget.getTypeName())); + } + if (Iterables.any( + candidates, + candidate -> candidate.getTypeName().equals(C.class.getTypeName()))) { + return Iterables.find( + candidates, + candidate -> + candidate.getTypeName().equals(lowerMergeTarget.getTypeName())); + } + return target; + }) + // Verify that the targets are as expected. + .addHorizontallyMergedClassesInspector( + inspector -> + inspector + .applyIf( + upperMergeTarget == A.class, + i -> i.assertMergedInto(B.class, A.class), + i -> i.assertMergedInto(A.class, B.class)) + .applyIf( + lowerMergeTarget == C.class, + i -> i.assertMergedInto(D.class, C.class), + i -> i.assertMergedInto(C.class, D.class)) + .assertNoOtherClassesMerged()) + .setMinApi(parameters.getApiLevel()) + .compile() + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines("A", "B", "C", "A"); + } + + static class Main { + + public static void main(String[] args) { + new A().m(); + new B().m(); + new C().m(); + new D().m(); + } + } + + static class A { + + void m() { + System.out.println("A"); + } + } + + static class B { + + void m() { + System.out.println("B"); + } + } + + static class C extends A { + + @Override + void m() { + System.out.println("C"); + } + } + + static class D extends A {} +}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/CollisionWithDefaultMethodsTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/CollisionWithDefaultMethodsTest.java index 072962b..c4313e1 100644 --- a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/CollisionWithDefaultMethodsTest.java +++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/CollisionWithDefaultMethodsTest.java
@@ -4,6 +4,8 @@ package com.android.tools.r8.classmerging.horizontal.interfaces; +import static org.junit.Assert.assertEquals; + import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.utils.StringUtils; @@ -25,7 +27,8 @@ getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); } - private static final String EXPECTED_OUTPUT = StringUtils.lines("Event1", "Event2"); + private static final String EXPECTED_OUTPUT = + StringUtils.lines("Event1", "Event2", "Event1!", "Event2!", "Event1#", "Event2#"); @Test public void testDesugaring() throws Exception { @@ -42,12 +45,17 @@ .addKeepMainRule(TestClass.class) .setMinApi(parameters.getApiLevel()) .addKeepRules("-keep class ** { *; }") + .addHorizontallyMergedClassesInspector( + inspector -> { + if (parameters.isCfRuntime()) { + inspector.assertNoClassesMerged(); + } else if (parameters.isDexRuntime() + && parameters.canUseDefaultAndStaticInterfaceMethods()) { + assertEquals(2, inspector.getMergeGroups().size()); + } + }) .run(parameters.getRuntime(), TestClass.class) - // TODO(b/229951607): This should never throw ICCE. - .applyIf( - parameters.isDexRuntime() && hasDefaultInterfaceMethodsSupport(parameters), - r -> r.assertFailureWithErrorThatThrows(IncompatibleClassChangeError.class), - r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT)); + .assertSuccessWithOutput(EXPECTED_OUTPUT); } static class Event {} @@ -96,6 +104,11 @@ public static void main(String[] args) throws Exception { eventOnListener1(System.out::println); eventOnListener2(System.out::println); + // This will create two merge groups with default methods in the implemented interfaces. + eventOnListener1(e -> System.out.println(e.toString() + "!")); + eventOnListener2(e -> System.out.println(e.toString() + "!")); + eventOnListener1(e -> System.out.println(e.toString() + "#")); + eventOnListener2(e -> System.out.println(e.toString() + "#")); } } }
diff --git a/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java b/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java index a1cfe7b..3476df7 100644 --- a/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java +++ b/src/test/java/com/android/tools/r8/code/InstructionFactoryTest.java
@@ -5,6 +5,8 @@ import static org.junit.Assert.assertTrue; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInstructionFactory; import com.android.tools.r8.graph.OffsetToObjectMapping; import java.nio.ByteBuffer; import org.junit.Test; @@ -17,8 +19,8 @@ @Test public void emptyBuffer() { ByteBuffer emptyBuffer = ByteBuffer.allocate(0); - InstructionFactory factory = new InstructionFactory(); - Instruction[] instructions = + DexInstructionFactory factory = new DexInstructionFactory(); + DexInstruction[] instructions = factory.readSequenceFrom(emptyBuffer.asShortBuffer(), 0, 0, new OffsetToObjectMapping()); assertTrue(instructions.length == 0); }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java index 2521e02..3d3aecc 100644 --- a/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java +++ b/src/test/java/com/android/tools/r8/compatproguard/AtomicFieldUpdaterTest.java
@@ -6,10 +6,10 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.ConstClass; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.ReturnVoid; +import com.android.tools.r8.dex.code.DexConstClass; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.smali.SmaliBuilder; import com.android.tools.r8.utils.codeinspector.ClassSubject; @@ -52,12 +52,12 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstClass); - assertTrue(code.instructions[1] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexConstClass); + assertTrue(code.instructions[1] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[1]; assertNotEquals("foo", constString.getString().toString()); - assertTrue(code.instructions[2] instanceof InvokeStatic); - assertTrue(code.instructions[3] instanceof ReturnVoid); + assertTrue(code.instructions[2] instanceof DexInvokeStatic); + assertTrue(code.instructions[3] instanceof DexReturnVoid); } @Test @@ -88,12 +88,12 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstClass); - assertTrue(code.instructions[1] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexConstClass); + assertTrue(code.instructions[1] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[1]; assertNotEquals("foo", constString.getString().toString()); - assertTrue(code.instructions[2] instanceof InvokeStatic); - assertTrue(code.instructions[3] instanceof ReturnVoid); + assertTrue(code.instructions[2] instanceof DexInvokeStatic); + assertTrue(code.instructions[3] instanceof DexReturnVoid); } @Test @@ -125,12 +125,12 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstClass); - assertTrue(code.instructions[1] instanceof ConstClass); - assertTrue(code.instructions[2] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[2]; + assertTrue(code.instructions[0] instanceof DexConstClass); + assertTrue(code.instructions[1] instanceof DexConstClass); + assertTrue(code.instructions[2] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[2]; assertNotEquals("foo", constString.getString().toString()); - assertTrue(code.instructions[3] instanceof InvokeStatic); - assertTrue(code.instructions[4] instanceof ReturnVoid); + assertTrue(code.instructions[3] instanceof DexInvokeStatic); + assertTrue(code.instructions[4] instanceof DexReturnVoid); } }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java index b79721f..a5a9f0a1 100644 --- a/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java +++ b/src/test/java/com/android/tools/r8/compatproguard/ForNameTest.java
@@ -7,9 +7,9 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.ReturnVoid; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.smali.SmaliBuilder; import com.android.tools.r8.utils.AndroidApiLevel; @@ -52,11 +52,11 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[0]; assertNotEquals(BOO, constString.getString().toString()); - assertTrue(code.instructions[1] instanceof InvokeStatic); - assertTrue(code.instructions[2] instanceof ReturnVoid); + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + assertTrue(code.instructions[2] instanceof DexReturnVoid); } @Test @@ -88,11 +88,11 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[0]; assertEquals(BOO, constString.getString().toString()); - assertTrue(code.instructions[1] instanceof InvokeStatic); - assertTrue(code.instructions[2] instanceof ReturnVoid); + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + assertTrue(code.instructions[2] instanceof DexReturnVoid); } }
diff --git a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java index 5771019..7a30afd 100644 --- a/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java +++ b/src/test/java/com/android/tools/r8/compatproguard/GetMembersTest.java
@@ -6,13 +6,13 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.AputObject; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstClass; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.NewArray; -import com.android.tools.r8.code.ReturnVoid; +import com.android.tools.r8.dex.code.DexAputObject; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstClass; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexNewArray; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.smali.SmaliBuilder; import com.android.tools.r8.utils.codeinspector.ClassSubject; @@ -53,12 +53,12 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstClass); - assertTrue(code.instructions[1] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexConstClass); + assertTrue(code.instructions[1] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[1]; assertNotEquals("foo", constString.getString().toString()); - assertTrue(code.instructions[2] instanceof InvokeVirtual); - assertTrue(code.instructions[3] instanceof ReturnVoid); + assertTrue(code.instructions[2] instanceof DexInvokeVirtual); + assertTrue(code.instructions[3] instanceof DexReturnVoid); } @Test @@ -93,17 +93,17 @@ assertTrue(method.isPresent()); DexCode code = method.getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstClass); - assertTrue(code.instructions[1] instanceof Const4); - assertTrue(code.instructions[2] instanceof NewArray); - assertTrue(code.instructions[3] instanceof Const4); - assertTrue(code.instructions[4] instanceof AputObject); - assertTrue(code.instructions[5] instanceof ConstClass); - assertTrue(code.instructions[6] instanceof ConstString); - ConstString constString = (ConstString) code.instructions[6]; + assertTrue(code.instructions[0] instanceof DexConstClass); + assertTrue(code.instructions[1] instanceof DexConst4); + assertTrue(code.instructions[2] instanceof DexNewArray); + assertTrue(code.instructions[3] instanceof DexConst4); + assertTrue(code.instructions[4] instanceof DexAputObject); + assertTrue(code.instructions[5] instanceof DexConstClass); + assertTrue(code.instructions[6] instanceof DexConstString); + DexConstString constString = (DexConstString) code.instructions[6]; assertNotEquals("foo", constString.getString().toString()); - assertTrue(code.instructions[7] instanceof InvokeVirtual); - assertTrue(code.instructions[8] instanceof ReturnVoid); + assertTrue(code.instructions[7] instanceof DexInvokeVirtual); + assertTrue(code.instructions[8] instanceof DexReturnVoid); } }
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java index 70aa283..0dcd986 100644 --- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java +++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -18,6 +18,7 @@ import com.android.tools.r8.compilerapi.sourcefile.CustomSourceFileTest; import com.android.tools.r8.compilerapi.testsetup.ApiTestingSetUpTest; import com.android.tools.r8.compilerapi.wrappers.CommandLineParserTest; +import com.android.tools.r8.compilerapi.wrappers.EnableMissingLibraryApiModelingTest; import com.google.common.collect.ImmutableList; import java.nio.file.Path; import java.nio.file.Paths; @@ -41,7 +42,10 @@ DesugarDependenciesTest.ApiTest.class); private static final List<Class<? extends CompilerApiTest>> CLASSES_PENDING_BINARY_COMPATIBILITY = - ImmutableList.of(GlobalSyntheticsTest.ApiTest.class, CommandLineParserTest.ApiTest.class); + ImmutableList.of( + GlobalSyntheticsTest.ApiTest.class, + CommandLineParserTest.ApiTest.class, + EnableMissingLibraryApiModelingTest.ApiTest.class); private final TemporaryFolder temp;
diff --git a/src/test/java/com/android/tools/r8/compilerapi/wrappers/EnableMissingLibraryApiModelingTest.java b/src/test/java/com/android/tools/r8/compilerapi/wrappers/EnableMissingLibraryApiModelingTest.java new file mode 100644 index 0000000..115212d --- /dev/null +++ b/src/test/java/com/android/tools/r8/compilerapi/wrappers/EnableMissingLibraryApiModelingTest.java
@@ -0,0 +1,45 @@ +// Copyright (c) 2022, 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.compilerapi.wrappers; + +import com.android.tools.r8.D8Command; +import com.android.tools.r8.R8Command; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.compilerapi.CompilerApiTest; +import com.android.tools.r8.compilerapi.CompilerApiTestRunner; +import org.junit.Test; + +public class EnableMissingLibraryApiModelingTest extends CompilerApiTestRunner { + + public EnableMissingLibraryApiModelingTest(TestParameters parameters) { + super(parameters); + } + + @Override + public Class<? extends CompilerApiTest> binaryTestClass() { + return ApiTest.class; + } + + @Test + public void test() throws Exception { + new ApiTest(ApiTest.PARAMETERS).run(); + } + + public static class ApiTest extends CompilerApiTest { + + public ApiTest(Object parameters) { + super(parameters); + } + + public void run() throws Exception { + D8Command.builder().setEnableExperimentalMissingLibraryApiModeling(true); + R8Command.builder().setEnableExperimentalMissingLibraryApiModeling(true); + } + + @Test + public void test() throws Exception { + run(); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java index a275033..1f41abc 100644 --- a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java +++ b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
@@ -7,9 +7,9 @@ import static org.junit.Assert.assertTrue; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.debuginfo.DebugInfoInspector; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexDebugEntry; import com.android.tools.r8.naming.MemberNaming.MethodSignature; import com.android.tools.r8.smali.SmaliBuilder; @@ -111,10 +111,10 @@ AndroidApp.builder().addProgramFiles(outs).build(), CLASS, new MethodSignature(methodName, "int", new String[] {"int"})); - IfEqz cond = null; - for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) { - if (instruction.getOpcode() == IfEqz.OPCODE) { - cond = (IfEqz) instruction; + DexIfEqz cond = null; + for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) { + if (instruction.getOpcode() == DexIfEqz.OPCODE) { + cond = (DexIfEqz) instruction; break; } }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java index 1f6520e..1ac5aff 100644 --- a/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java +++ b/src/test/java/com/android/tools/r8/debuginfo/CodeGeneratorTestRunner.java
@@ -6,10 +6,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.AddInt; -import com.android.tools.r8.code.AddInt2Addr; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.Return; +import com.android.tools.r8.dex.code.DexAddInt; +import com.android.tools.r8.dex.code.DexAddInt2Addr; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexReturn; import com.android.tools.r8.utils.AndroidApp; import org.junit.Test; @@ -31,11 +31,11 @@ DebugInfoInspector inspector = inspectMethod(d8App, clazz, "int", "intAddition", "int", "int", "int"); - Instruction[] instructions = inspector.getMethod().getCode().asDexCode().instructions; - assertTrue(instructions[0] instanceof AddInt2Addr); - assertTrue(instructions[1] instanceof AddInt2Addr); - assertTrue(instructions[2] instanceof AddInt); - assertTrue(instructions[3] instanceof Return); + DexInstruction[] instructions = inspector.getMethod().getCode().asDexCode().instructions; + assertTrue(instructions[0] instanceof DexAddInt2Addr); + assertTrue(instructions[1] instanceof DexAddInt2Addr); + assertTrue(instructions[2] instanceof DexAddInt); + assertTrue(instructions[3] instanceof DexReturn); } }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java new file mode 100644 index 0000000..f8e88c6 --- /dev/null +++ b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
@@ -0,0 +1,254 @@ +// Copyright (c) 2022, 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.debuginfo; + +import static org.hamcrest.MatcherAssert.assertThat; +import static org.junit.Assume.assumeFalse; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.naming.retrace.StackTrace; +import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine; +import com.android.tools.r8.references.MethodReference; +import com.android.tools.r8.transformers.MethodTransformer; +import com.android.tools.r8.utils.BooleanUtils; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.objectweb.asm.Label; + +@RunWith(Parameterized.class) +public class NoLineInfoTest extends TestBase { + + private static final String INPUT_SOURCE_FILE = "InputSourceFile.java"; + private static final String CUSTOM_SOURCE_FILE = "TaggedSourceFile"; + private static final String DEFAULT_SOURCE_FILE = "SourceFile"; + private static final String UNKNOWN_SOURCE_FILE = "Unknown Source"; + + private final TestParameters parameters; + private final boolean customSourceFile; + + @Parameterized.Parameters(name = "{0}, custom-sf:{1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values()); + } + + public NoLineInfoTest(TestParameters parameters, boolean customSourceFile) { + this.parameters = parameters; + this.customSourceFile = customSourceFile; + } + + private byte[] getTestClassTransformed() throws IOException { + return transformer(TestClass.class) + .setSourceFile(INPUT_SOURCE_FILE) + .addMethodTransformer( + new MethodTransformer() { + private final Map<MethodReference, Integer> lines = new HashMap<>(); + + @Override + public void visitLineNumber(int line, Label start) { + Integer nextLine = lines.getOrDefault(getContext().getReference(), 0); + if (nextLine > 0) { + super.visitLineNumber(nextLine, start); + } + // Increment the actual line content by 100 so that each one is clearly distinct + // from a PC value for any of the methods. + lines.put(getContext().getReference(), nextLine + 100); + } + }) + .transform(); + } + + public boolean isRuntimeWithPcAsLineNumberSupport() { + return parameters.isDexRuntime() + && parameters + .getRuntime() + .maxSupportedApiLevel() + .isGreaterThanOrEqualTo(apiLevelWithPcAsLineNumberSupport()); + } + + public boolean isCompileWithPcAsLineNumberSupport() { + return parameters.isDexRuntime() + && parameters.getApiLevel().isGreaterThanOrEqualTo(apiLevelWithPcAsLineNumberSupport()); + } + + @Test + public void testReference() throws Exception { + assumeFalse(customSourceFile); + testForRuntime(parameters) + .addProgramClassFileData(getTestClassTransformed()) + .run(parameters.getRuntime(), TestClass.class) + .assertFailureWithErrorThatThrows(NullPointerException.class) + .inspectStackTrace( + stacktrace -> { + if (isRuntimeWithPcAsLineNumberSupport()) { + // On VMs with PC support the lack of a line will emit the PC instead. + assertThat(stacktrace, StackTrace.isSame(getExpectedInputStacktraceOnPcVms())); + } else { + assertThat(stacktrace, StackTrace.isSame(getExpectedInputStacktrace())); + } + }); + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addProgramClassFileData(getTestClassTransformed()) + .addKeepClassAndMembersRules(TestClass.class) + .addKeepAttributeSourceFile() + .addKeepAttributeLineNumberTable() + .setMinApi(parameters.getApiLevel()) + .addOptionsModification(o -> o.testing.forcePcBasedEncoding = true) + .applyIf( + customSourceFile, + b -> b.getBuilder().setSourceFileProvider(environment -> CUSTOM_SOURCE_FILE)) + .run(parameters.getRuntime(), TestClass.class) + .assertFailureWithErrorThatThrows(NullPointerException.class) + .inspectOriginalStackTrace( + stackTrace -> + assertThat( + "Unexpected residual stacktrace", + stackTrace, + StackTrace.isSame(getResidualStacktrace()))) + .inspectStackTrace( + stacktrace -> + assertThat( + "Unexpected input-source stacktrace", + stacktrace, + StackTrace.isSame(getUnexpectedRetracedStacktrace()))); + } + + private StackTraceLine line(String file, String method, int line) { + return StackTraceLine.builder() + .setClassName(typeName(TestClass.class)) + .setFileName(file) + .setMethodName(method) + .setLineNumber(line) + .build(); + } + + // Normal reference line from the input. + private StackTraceLine inputLine(String method, int line) { + return line(INPUT_SOURCE_FILE, method, line); + } + + // Line as printed for PC supporting VMs when the line is absent (D8 compilation). + private StackTraceLine inputPcLine(String method, int pc) { + return line(UNKNOWN_SOURCE_FILE, method, pc); + } + + // Residual line depends on the source file parameter. + private StackTraceLine residualLine(String method, int line) { + String defaultFile = + isCompileWithPcAsLineNumberSupport() ? UNKNOWN_SOURCE_FILE : DEFAULT_SOURCE_FILE; + String file = customSourceFile ? CUSTOM_SOURCE_FILE : defaultFile; + return line(file, method, line); + } + + // This is the real "reference" stack trace as given by JVM on inputs and should be retraced to. + private StackTrace getExpectedInputStacktrace() { + return StackTrace.builder() + .add(inputLine("foo", -1)) + .add(inputLine("bar", -1)) + .add(inputLine("baz", -1)) + .add(inputLine("main", 200)) + .build(); + } + + // When D8 compiling reference inputs directly there is (currently) no way to recover from the PC + // printing. Thus, this is the expected stack trace on those VMs. + private StackTrace getExpectedInputStacktraceOnPcVms() { + return StackTrace.builder() + .add(inputPcLine("foo", 1)) + .add(inputPcLine("bar", 0)) + .add(inputPcLine("baz", 0)) + .add(inputLine("main", 200)) + .build(); + } + + // TODO(b/232212653): The retraced stack trace should be the same as `getExpectedInputStacktrace`. + private StackTrace getUnexpectedRetracedStacktrace() { + + // TODO(b/232212653): Retracing the PC 1 preserves it but it should map to <noline> + StackTraceLine fooLine = + isRuntimeWithPcAsLineNumberSupport() ? inputLine("foo", 1) : inputLine("foo", -1); + + // TODO(b/232212653): Normal line-opt will cause a single-line mapping. Retrace should not + // optimize that to mean it represents a single possible line. (<noline> should not match 1:x). + StackTraceLine barLine = parameters.isCfRuntime() ? inputLine("bar", 100) : inputLine("bar", 0); + + // TODO(b/232212653): The retracing in CF where the line table is preserved is incorrect. + // same issue as for bar. + StackTraceLine bazLine = parameters.isCfRuntime() ? inputLine("baz", 100) : inputLine("baz", 0); + + return StackTrace.builder() + .add(fooLine) + .add(barLine) + .add(bazLine) + .add(inputLine("main", 200)) + .build(); + } + + private StackTrace getResidualStacktrace() { + if (parameters.isCfRuntime()) { + // For CF compilation the line number increments are used and each preamble is retained as + // such. This is the expected output. + return StackTrace.builder() + .add(residualLine("foo", -1)) + .add(residualLine("bar", -1)) + .add(residualLine("baz", -1)) + .add(residualLine("main", 101)) // TODO(b/232212653) Why is this 101? + .build(); + } + + // TODO(b/232212653): The correct line should be with CUSTOM_SOURCE_FILE and PC 1. + // When compiling with debug info encoding PCs this is almost the expected output. The issue + // being that even "foo" should have PC based encoding too to ensure the SF remains on + // newer VMs too. + StackTraceLine fooLine = + isRuntimeWithPcAsLineNumberSupport() + ? line(UNKNOWN_SOURCE_FILE, "foo", 1) + : residualLine("foo", -1); + + return StackTrace.builder() + .add(fooLine) + .add(residualLine("bar", 0)) + .add(residualLine("baz", 0)) + .add(residualLine("main", 6)) + .build(); + } + + // Test with a call stack where each initial line is stripped (see getTestClassTransformed) + // Line numbers are indicated in comments. The stacktrace is marked by ***. + static class TestClass { + + public static void nop() {} + + public static void foo() { + throw null; // noline *** + } + + public static void bar() { + foo(); // noline *** + nop(); // 100 + } + + public static void baz() { + bar(); // noline *** + nop(); // 100 + nop(); // 200 + } + + public static void main(String[] args) { + nop(); // noline + nop(); // 100 + baz(); // 200 *** + } + } +}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java index be25d4a..f144498 100644 --- a/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java +++ b/src/test/java/com/android/tools/r8/debuginfo/Regress111337896TestRunner.java
@@ -9,8 +9,8 @@ import com.android.tools.r8.D8; import com.android.tools.r8.D8Command; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.Nop; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNop; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.AndroidApp; import com.android.tools.r8.utils.AndroidAppConsumers; @@ -51,8 +51,8 @@ info.checkStartLine(12); assertEquals(1, info.checkLineExists(18)); int nopsFound = 0; - for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) { - if (instruction instanceof Nop) { + for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) { + if (instruction instanceof DexNop) { nopsFound++; } } @@ -103,8 +103,8 @@ info.checkStartLine(11); assertEquals(1, info.checkLineExists(13)); int nopsFound = 0; - for (Instruction instruction : info.getMethod().getCode().asDexCode().instructions) { - if (instruction instanceof Nop) { + for (DexInstruction instruction : info.getMethod().getCode().asDexCode().instructions) { + if (instruction instanceof DexNop) { nopsFound++; } }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java b/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java index ac4be8c..92a8a3d 100644 --- a/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java +++ b/src/test/java/com/android/tools/r8/debuginfo/Regress216178582Test.java
@@ -10,7 +10,7 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexDebugEntry; import com.android.tools.r8.graph.DexDebugEntryBuilder; @@ -68,7 +68,7 @@ new DexDebugEntryBuilder(method, inspector.getFactory()).build(); Iterator<DexDebugEntry> it = entries.iterator(); int pc = 0; - for (Instruction instruction : code.instructions) { + for (DexInstruction instruction : code.instructions) { if (instruction.canThrow()) { DexDebugEntry next = it.next(); assertEquals(
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java index 2297f3f..9444833 100644 --- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java +++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
@@ -13,8 +13,8 @@ import com.android.tools.r8.cf.code.CfArithmeticBinop; import com.android.tools.r8.cf.code.CfArithmeticBinop.Opcode; import com.android.tools.r8.cf.code.CfInstruction; -import com.android.tools.r8.code.AddLong2Addr; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexAddLong2Addr; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.ir.code.NumericType; @@ -47,8 +47,8 @@ && (((CfArithmeticBinop) instruction).getType() == NumericType.LONG); } - private boolean isDexAddLong(Instruction instruction) { - return instruction instanceof AddLong2Addr; + private boolean isDexAddLong(DexInstruction instruction) { + return instruction instanceof DexAddLong2Addr; } private boolean boxedDoubleIsFiniteInvoke(InstructionSubject instruction) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java index 6b4cf39..4022ff8 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ConcurrentHashMapSubclassTest.java
@@ -4,17 +4,18 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.StringUtils; -import java.nio.file.Path; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -27,93 +28,35 @@ StringUtils.lines("1.0", "2.0", "10.0", "1.0", "2.0", "10.0", "1.0", "2.0", "10.0"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters() + .withAllRuntimes() + .withAllApiLevelsAlsoForCf() + .withApiLevel(AndroidApiLevel.N) + .build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public ConcurrentHashMapSubclassTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public ConcurrentHashMapSubclassTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testCustomCollectionD8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(ConcurrentHashMapSubclassTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - - @Test - public void testCustomCollectionD8CF() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path jar = - testForD8(Backend.CF) - .addInnerClasses(ConcurrentHashMapSubclassTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - } - - @Test - public void testCustomCollectionR8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(Backend.DEX) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(ConcurrentHashMapSubclassTest.class) - .setMinApi(parameters.getApiLevel()) - .addKeepClassAndMembersRules(Executor.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + public void test() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_RESULT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java index f2beac6..48c1d63 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionForwardingTest.java
@@ -4,8 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.util.ArrayList; import java.util.Collection; @@ -23,53 +27,31 @@ public class CustomCollectionForwardingTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public CustomCollectionForwardingTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public CustomCollectionForwardingTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testCustomCollectionD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionForwardingTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput( - StringUtils.lines("false", "false", "false", "false", "false", "false")); - } - - @Test - public void testCustomCollectionR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionForwardingTest.class) + public void testCollection() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Executor.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput( StringUtils.lines("false", "false", "false", "false", "false", "false"));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java index 371b114..5d35c07 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionInterfaceSuperTest.java
@@ -4,10 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assume.assumeTrue; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.util.Collection; import java.util.Collections; @@ -22,21 +24,6 @@ @RunWith(Parameterized.class) public class CustomCollectionInterfaceSuperTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; - - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") - public static List<Object[]> data() { - return buildParameters( - BooleanUtils.values(), getTestParameters().withAllRuntimes().withAllApiLevels().build()); - } - - public CustomCollectionInterfaceSuperTest( - boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; - this.parameters = parameters; - } - private static final String EXPECTED_OUTPUT = StringUtils.lines( "removeIf from MyCol1", @@ -46,51 +33,32 @@ "removeIf from MyCol2", "removeIf from MyCol1"); - @Test - public void testCustomCollectionD8() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(CustomCollectionInterfaceSuperTest.class) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionInterfaceSuperTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .assertNoMessages() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); + } + + public CustomCollectionInterfaceSuperTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testCustomCollectionR8() throws Exception { - // Desugared library tests do not make sense in the Cf to Cf, and the JVM is already tested - // in the D8 test. Just return. - assumeTrue(parameters.isDexRuntime()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionInterfaceSuperTest.class) + public void testCollection() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Main.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .assertNoMessages() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput(EXPECTED_OUTPUT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java index d770fdb..c597d50 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionSuperCallsTest.java
@@ -4,13 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; -import java.nio.file.Path; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.util.ArrayList; import java.util.List; import java.util.Spliterator; @@ -24,101 +23,37 @@ public class CustomCollectionSuperCallsTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public CustomCollectionSuperCallsTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public CustomCollectionSuperCallsTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testCustomCollectionSuperCallsD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult d8TestRunResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionSuperCallsTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertLines2By2Correct(d8TestRunResult.getStdOut()); - } - - @Test - public void testCustomCollectionSuperCallsD8Cf2Cf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path jar = - testForD8(Backend.CF) - .addInnerClasses(CustomCollectionSuperCallsTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .allowStdoutMessages() - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - D8TestRunResult d8TestRunResult; - if (parameters.getRuntime().isDex()) { - d8TestRunResult = - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .allowStdoutMessages() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertLines2By2Correct(d8TestRunResult.getStdOut()); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - } - } - - @Test - public void testCustomCollectionSuperCallsR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult r8TestRunResult = - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionSuperCallsTest.class) + public void testCollection() throws Exception { + String stdOut = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Executor.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertLines2By2Correct(r8TestRunResult.getStdOut()); + .assertSuccess() + .getStdOut(); + assertLines2By2Correct(stdOut); } static class Executor {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java index 473153c..4681e27 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
@@ -4,18 +4,17 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.InstructionSubject; import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode; import com.android.tools.r8.utils.codeinspector.MethodSubject; -import java.nio.file.Path; import java.util.ArrayList; import java.util.Collection; import java.util.Collections; @@ -33,124 +32,56 @@ public class CustomCollectionTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "machine: {0}, shrink: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public CustomCollectionTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public CustomCollectionTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } - private final String EXECUTOR = - "com.android.tools.r8.desugar.desugaredlibrary.CustomCollectionTest$Executor"; - @Test - public void testCustomCollectionD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult d8TestRunResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) + public void testCollection() throws Throwable { + String stdOut = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Executor.class) .compile() - .assertNoMessages() .inspect(this::assertCustomCollectionCallsCorrect) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertResultCorrect(d8TestRunResult.getStdOut()); - } - - @Test - public void testCustomCollectionD8Cf2Cf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - // Use D8 to desugar with Java classfile output. - Path jar = - testForD8(Backend.CF) - .addInnerClasses(CustomCollectionTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .writeToZip(); - if (parameters.getRuntime().isDex()) { - // Collection keep rules is only implemented in the DEX writer. - String desugaredLibraryKeepRules = keepRuleConsumer.get(); - if (desugaredLibraryKeepRules != null) { - assertEquals(0, desugaredLibraryKeepRules.length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - D8TestRunResult d8TestRunResult = - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .assertNoMessages() - .inspect(this::assertCustomCollectionCallsCorrect) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), EXECUTOR) - .assertSuccess(); - assertResultCorrect(d8TestRunResult.getStdOut()); - } else { - // Build the desugared library in class file format. - Path desugaredLib = getDesugaredLibraryInCF(parameters, o -> {}); - - // Run on the JVM with desuagred library on classpath. - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(desugaredLib) - .run(parameters.getRuntime(), EXECUTOR) - .assertSuccess(); - } + .assertSuccess() + .getStdOut(); + assertResultCorrect(stdOut); } private void assertResultCorrect(String stdOut) { - if (requiresEmulatedInterfaceCoreLibDesugaring(parameters) && !shrinkDesugaredLibrary) { + if (requiresEmulatedInterfaceCoreLibDesugaring(parameters) + && !compilationSpecification.isL8Shrink()) { // When shrinking the class names are not printed correctly anymore due to minification. // Expected output is emulated interfaces expected output. assertLines2By2Correct(stdOut); } } - @Test - public void testCustomCollectionR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult r8TestRunResult = - testForR8(Backend.DEX) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomCollectionTest.class) - .setMinApi(parameters.getApiLevel()) - .addKeepClassAndMembersRules(Executor.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .inspect(this::assertCustomCollectionCallsCorrect) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertResultCorrect(r8TestRunResult.getStdOut()); - } - private void assertCustomCollectionCallsCorrect(CodeInspector inspector) { - MethodSubject direct = inspector.clazz(EXECUTOR).uniqueMethodWithName("directTypes"); + if (compilationSpecification.isProgramShrink()) { + return; + } + MethodSubject direct = inspector.clazz(Executor.class).uniqueMethodWithName("directTypes"); + System.out.println(direct); if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)) { assertTrue( direct @@ -164,7 +95,8 @@ } else { assertTrue(direct.streamInstructions().noneMatch(instr -> instr.toString().contains("$-EL"))); } - MethodSubject inherited = inspector.clazz(EXECUTOR).uniqueMethodWithName("inheritedTypes"); + MethodSubject inherited = + inspector.clazz(Executor.class).uniqueMethodWithName("inheritedTypes"); if (!requiresEmulatedInterfaceCoreLibDesugaring(parameters)) { assertTrue( inherited.streamInstructions().noneMatch(instr -> instr.toString().contains("$-EL")));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java index c4e379c..7306204 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomMapHierarchyTest.java
@@ -4,14 +4,15 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.shaking.ProguardKeepAttributes; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; -import java.nio.file.Path; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -28,18 +29,38 @@ StringUtils.lines("B::getOrDefault", "default 1", "B::getOrDefault", "default 2"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), - BooleanUtils.values()); + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public CustomMapHierarchyTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { + public CustomMapHierarchyTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + } + + @Test + public void testCollection() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) + .addKeepAllClassesRuleWithAllowObfuscation() + .addKeepAttributes( + ProguardKeepAttributes.SIGNATURE, + ProguardKeepAttributes.INNER_CLASSES, + ProguardKeepAttributes.ENCLOSING_METHOD) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutput(EXPECTED); } @Test @@ -55,93 +76,6 @@ .assertSuccessWithOutput(EXPECTED); } - @Test - public void testD8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomMapHierarchyTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED); - } - - @Test - public void testD8Cf2Cf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - - Path jar = - testForD8(Backend.CF) - .addInnerClasses(CustomMapHierarchyTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .setMinApi(parameters.getApiLevel()) - .allowStdoutMessages() - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .allowStdoutMessages() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED); - } - } - - @Test - public void testR8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(CustomMapHierarchyTest.class) - .addKeepMainRule(Main.class) - .addKeepAllClassesRuleWithAllowObfuscation() - .addKeepAttributes( - ProguardKeepAttributes.SIGNATURE, - ProguardKeepAttributes.INNER_CLASSES, - ProguardKeepAttributes.ENCLOSING_METHOD) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED); - } - public static class Main { public static void main(String[] args) { System.out.println(new B<String>().getOrDefault("Not found", "default 1"));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java index 2d4640a..8f725ba 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DateTimeFormatterTest.java
@@ -4,10 +4,14 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -22,67 +26,42 @@ @RunWith(Parameterized.class) public class DateTimeFormatterTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String expectedOutputDesugaredLib = StringUtils.lines("2/3/01 4:05 AM - Feb 3, 1 4:05 AM"); private static final String expectedOutput = StringUtils.lines("2/3/01, 4:05 AM - Feb 3, 1, 4:05 AM"); - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public DateTimeFormatterTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public DateTimeFormatterTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult run = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DateTimeFormatterTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), TestClass.class); - if (requiresTimeDesugaring(parameters)) { - run.assertSuccessWithOutput(expectedOutputDesugaredLib); - } else { - run.assertSuccessWithOutput(expectedOutput); - } - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult run = - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .noMinification() + public void testFormatter() throws Throwable { + SingleTestRunResult<?> run = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(TestClass.class) - .addInnerClasses(DateTimeFormatterTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), TestClass.class); - if (requiresTimeDesugaring(parameters)) { + .run(parameters.getRuntime(), TestClass.class) + .assertSuccess(); + if (requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) { run.assertSuccessWithOutput(expectedOutputDesugaredLib); } else { run.assertSuccessWithOutput(expectedOutput);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java index 7d73298..5e79404 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibrary2Test.java
@@ -3,15 +3,17 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRunResult; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.google.common.collect.ImmutableList; import java.io.IOException; import java.lang.reflect.Method; @@ -22,6 +24,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; /** * This test checks that if a default interface method in a library interface conflicts with a @@ -34,14 +37,24 @@ public class DefaultMethodOverrideConflictWithLibrary2Test extends DesugaredLibraryTestBase { private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DefaultMethodOverrideConflictWithLibrary2Test(TestParameters parameters) { + public DefaultMethodOverrideConflictWithLibrary2Test( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } private List<Class<?>> getClasses() { @@ -75,14 +88,10 @@ .run(parameters.getRuntime(), Main.class) .apply(this::checkResult); } else { - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(getClasses()) .addProgramClassFileData(getTransforms()) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .compile() + .addKeepMainRule(Main.class) .run(parameters.getRuntime(), Main.class) .apply(this::checkResult); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java index 21abdb5..b608d74 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideConflictWithLibraryTest.java
@@ -3,16 +3,18 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.google.common.collect.ImmutableList; import java.io.IOException; import java.lang.reflect.Method; @@ -24,6 +26,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; /** * This test checks that if a default interface method in a library is not overridden by a class @@ -44,14 +47,24 @@ } private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DefaultMethodOverrideConflictWithLibraryTest(TestParameters parameters) { + public DefaultMethodOverrideConflictWithLibraryTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test @@ -77,14 +90,10 @@ .run(parameters.getRuntime(), Main.class) .assertFailureWithErrorThatMatches(getExpectedError()); } else { - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(CLASSES) .addProgramClassFileData(getTransforms()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .compile() + .addKeepMainRule(Main.class) .run(parameters.getRuntime(), Main.class) .assertFailureWithErrorThatMatches(getExpectedError()); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java index 14d4f62..0230e38 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DefaultMethodOverrideInLibraryTest.java
@@ -3,18 +3,21 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.TestRuntime.CfVm; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -23,6 +26,7 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; /** * This test checks that if a default interface method in a library is overridden by a class method @@ -39,14 +43,24 @@ static final String EXPECTED = StringUtils.lines("0", "42", "0", "0", "42", "42"); private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withAllRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DefaultMethodOverrideInLibraryTest(TestParameters parameters) { + public DefaultMethodOverrideInLibraryTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test @@ -65,19 +79,15 @@ .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput(EXPECTED); } else { - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) - .addInnerClasses(DefaultMethodOverrideInLibraryTest.class) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .compile() + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) .run(parameters.getRuntime(), Main.class) .apply(this::checkResult); } } - private void checkResult(D8TestRunResult result) { + private void checkResult(SingleTestRunResult<?> result) { // TODO(b/145504401): Execution on Art 7.0.0 has the wrong runtime behavior (non-desugared). if (parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java index 912e353..02e844e 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredGenericSignatureTest.java
@@ -4,6 +4,8 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertEquals; @@ -11,22 +13,21 @@ import com.android.tools.r8.NeverInline; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.shaking.ProguardKeepAttributes; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; import java.io.Serializable; import java.lang.reflect.ParameterizedType; import java.lang.reflect.Type; -import java.nio.file.Path; import java.time.LocalDate; import java.util.AbstractSequentialList; import java.util.LinkedHashMap; import java.util.List; import java.util.function.UnaryOperator; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -36,91 +37,30 @@ public class DesugaredGenericSignatureTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), - BooleanUtils.values()); + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public DesugaredGenericSignatureTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { + public DesugaredGenericSignatureTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredGenericSignatureTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .compile() - .inspect(this::checkRewrittenSignature) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(expected(parameters, false)); - } - - @Test - public void testD8Cf2Cf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - - Path jar = - testForD8(Backend.CF) - .addInnerClasses(DesugaredGenericSignatureTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .setMinApi(parameters.getApiLevel()) - .allowStdoutMessages() - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .allowStdoutMessages() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(expected(parameters, true)); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(expected(parameters, true)); - } - } - - @Test - public void testR8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredGenericSignatureTest.class) + public void testGenericSignature() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Main.class) .addKeepAllClassesRuleWithAllowObfuscation() .addKeepAttributes( @@ -128,17 +68,10 @@ ProguardKeepAttributes.INNER_CLASSES, ProguardKeepAttributes.ENCLOSING_METHOD) .enableInliningAnnotations() - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) .compile() .inspect(this::checkRewrittenSignature) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(expected(parameters, false)); + .assertSuccessWithOutput(expected(parameters, compilationSpecification.isCfToCf())); } private void checkRewrittenSignature(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java index 4d87dbf..24969a0 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
@@ -4,76 +4,54 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import com.android.tools.r8.StringResource; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_CHM_ONLY; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification; -import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser; -import com.android.tools.r8.utils.InternalOptions; -import com.android.tools.r8.utils.codeinspector.CodeInspector; -import java.nio.file.Path; -import java.util.Collections; -import org.junit.Assume; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.google.common.collect.ImmutableList; +import java.util.List; 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 DesugaredLibraryCHMOnlyContentTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withNoneRuntime().build(), + ImmutableList.of(JDK11_CHM_ONLY), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); } - public DesugaredLibraryCHMOnlyContentTest(TestParameters parameters) { - this.parameters = parameters; + public DesugaredLibraryCHMOnlyContentTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testDesugaredLibraryContentCHMOnlyD8() throws Exception { - Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters)); - Assume.assumeTrue(isJDK11DesugaredLibrary()); - Path desugaredLib = - buildDesugaredLibrary( - parameters.getApiLevel(), - "", - false, - Collections.emptyList(), - options -> - setDesugaredLibrarySpecificationForTesting( - options, chmOnlyConfiguration(options, true, parameters))); - CodeInspector inspector = new CodeInspector(desugaredLib); - assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent(); - } - - @Test - public void testDesugaredLibraryContentCHMOnlyR8() throws Exception { - Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters)); - Assume.assumeTrue(isJDK11DesugaredLibrary()); - Path desugaredLib = - buildDesugaredLibrary( - parameters.getApiLevel(), - "-keep class * { *; }", - true, - Collections.emptyList(), - options -> - setDesugaredLibrarySpecificationForTesting( - options, chmOnlyConfiguration(options, true, parameters))); - CodeInspector inspector = new CodeInspector(desugaredLib); - assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent(); - } - - DesugaredLibrarySpecification chmOnlyConfiguration( - InternalOptions options, boolean libraryCompilation, TestParameters parameters) { - return DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification( - StringResource.fromFile(ToolHelper.getCHMOnlyDesugarLibJsonForTesting()), - options.dexItemFactory(), - options.reporter, - libraryCompilation, - parameters.getApiLevel().getLevel()); + public void testDesugaredLibraryContentCHMOnly() throws Throwable { + testForL8(AndroidApiLevel.B) + .apply( + b -> + libraryDesugaringSpecification.configureL8TestBuilder( + b, compilationSpecification.isL8Shrink(), "-keep class * { *; }")) + .compile() + .inspect( + inspector -> { + assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent(); + }); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java index e2565d6..506cb9c 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryChecksumsTest.java
@@ -3,52 +3,53 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; -import com.android.tools.r8.CompilationMode; -import com.android.tools.r8.L8; -import com.android.tools.r8.L8Command; -import com.android.tools.r8.OutputMode; -import com.android.tools.r8.StringResource; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.FoundClassSubject; -import java.nio.file.Path; +import com.google.common.collect.ImmutableList; +import java.util.List; 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 DesugaredLibraryChecksumsTest extends DesugaredLibraryTestBase { - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withNoneRuntime().build(); + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withNoneRuntime().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DesugaredLibraryChecksumsTest(TestParameters parameters) { - parameters.assertNoneRuntime(); + public DesugaredLibraryChecksumsTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test public void test() throws Exception { - Path out = temp.newFolder().toPath().resolve("out.jar"); - L8.run( - L8Command.builder() - .setIncludeClassesChecksum(true) - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(ToolHelper.getDesugarJDKLibs()) - .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS) - .setMode(CompilationMode.DEBUG) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting())) - .setMinApiLevel(AndroidApiLevel.B.getLevel()) - .setOutput(out, OutputMode.DexIndexed) - .build()); - CodeInspector inspector = new CodeInspector(out); - for (FoundClassSubject clazz : inspector.allClasses()) { - clazz.getDexProgramClass().getChecksum(); - } + testForL8(AndroidApiLevel.B) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .compile() + .inspect( + inspector -> { + for (FoundClassSubject clazz : inspector.allClasses()) { + clazz.getDexProgramClass().getChecksum(); + } + }); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java index b7a9374..9a8b258 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCloneTest.java
@@ -4,8 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.time.DayOfWeek; import java.util.List; import org.junit.Test; @@ -16,54 +20,34 @@ @RunWith(Parameterized.class) public class DesugaredLibraryCloneTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; - private final String EXPECTED = "Just another manic MONDAY"; + private static final String EXPECTED = "Just another manic MONDAY"; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values()); + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public DesugaredLibraryCloneTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { + public DesugaredLibraryCloneTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(getClass()) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutputLines(EXPECTED); - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) + public void testClone() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addInnerClasses(getClass()) .addKeepMainRule(Main.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutputLines(EXPECTED); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java index 6ce91e1..38845cc 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -5,6 +5,9 @@ package com.android.tools.r8.desugar.desugaredlibrary; import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.CoreMatchers.startsWith; @@ -14,52 +17,70 @@ import static org.junit.Assert.assertNotEquals; import com.android.tools.r8.D8TestBuilder; -import com.android.tools.r8.L8Command; import com.android.tools.r8.LibraryDesugaringTestConfiguration; -import com.android.tools.r8.OutputMode; import com.android.tools.r8.StringResource; import com.android.tools.r8.TestDiagnosticMessages; -import com.android.tools.r8.TestDiagnosticMessagesImpl; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.FoundMethodSubject; import com.android.tools.r8.utils.codeinspector.InstructionSubject; +import com.google.common.collect.ImmutableList; import java.nio.file.Path; import java.util.ArrayList; +import java.util.List; import org.hamcrest.CoreMatchers; import org.junit.Assume; 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 DesugaredLibraryContentTest extends DesugaredLibraryTestBase { private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DesugaredLibraryContentTest(TestParameters parameters) { + public DesugaredLibraryContentTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test public void testInvalidLibrary() { Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); + // This is handwritten since this is really a special case: library desugaring with an + // invalid library file passed. D8TestBuilder testBuilder = testForD8() .setMinApi(parameters.getApiLevel()) .addProgramClasses(GuineaPig.class) .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.L)) .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())); + LibraryDesugaringTestConfiguration.builder() + .setMinApi(parameters.getApiLevel()) + .addDesugaredLibraryConfiguration( + StringResource.fromFile(libraryDesugaringSpecification.getSpecification())) + .dontAddRunClasspath() + .build()); try { testBuilder.compile(); } catch (Throwable t) { @@ -77,19 +98,12 @@ } @Test - public void testDesugaredLibraryContentD8() throws Exception { + public void testDesugaredLibraryContent() throws Exception { Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - CodeInspector inspector = new CodeInspector(buildDesugaredLibrary(parameters.getApiLevel())); - assertCorrect(inspector); - } - - @Test - public void testDesugaredLibraryContentR8() throws Exception { - Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - CodeInspector inspector = - new CodeInspector( - buildDesugaredLibrary(parameters.getApiLevel(), "-keep class * { *; }", true)); - assertCorrect(inspector); + testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .compile() + .inspect(this::assertCorrect); } @Test @@ -97,37 +111,31 @@ Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); ArrayList<Path> coreLambdaStubs = new ArrayList<>(); coreLambdaStubs.add(ToolHelper.getCoreLambdaStubs()); - CodeInspector inspector = - new CodeInspector( - buildDesugaredLibrary(parameters.getApiLevel(), "", false, coreLambdaStubs)); - assertCorrect(inspector); + testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .addProgramFiles(coreLambdaStubs) + .compile() + .inspect(this::assertCorrect); } @Test public void testDesugaredLibraryContentWithCoreLambdaStubsAsLibrary() throws Exception { Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl(); - Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip"); - L8Command.Builder l8Builder = - L8Command.builder(diagnosticsHandler) - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(ToolHelper.getDesugarJDKLibs()) - .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS) - .addLibraryFiles(ToolHelper.getCoreLambdaStubs()) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting())) - .setMinApiLevel(parameters.getApiLevel().getLevel()) - .setOutput(desugaredLib, OutputMode.DexIndexed); - ToolHelper.runL8(l8Builder.build(), options -> {}); - CodeInspector codeInspector = new CodeInspector(desugaredLib); - assertCorrect(codeInspector); - if (isJDK11DesugaredLibrary()) { - diagnosticsHandler.assertNoErrors(); - diagnosticsHandler.assertAllWarningsMatch( - diagnosticMessage(containsString("Specification conversion"))); - } else { - diagnosticsHandler.assertNoMessages(); - } + testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .addLibraryFiles(ToolHelper.getCoreLambdaStubs()) + .compile() + .inspect(this::assertCorrect) + .inspectDiagnosticMessages( + diagnosticsHandler -> { + if (libraryDesugaringSpecification == JDK8) { + diagnosticsHandler.assertNoMessages(); + } else { + diagnosticsHandler.assertNoErrors(); + diagnosticsHandler.assertAllWarningsMatch( + diagnosticMessage(containsString("Specification conversion"))); + } + }); } private void assertCorrect(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java index bc0be98..810f1d0 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDeterminismTest.java
@@ -3,15 +3,20 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.DeterminismChecker; import com.android.tools.r8.utils.InternalOptions; +import com.google.common.collect.ImmutableList; import java.nio.file.Path; +import java.util.List; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Consumer; @@ -19,18 +24,30 @@ 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 DesugaredLibraryDeterminismTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withDexRuntimes().build(); + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DesugaredLibraryDeterminismTest(TestParameters parameters) { + public DesugaredLibraryDeterminismTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } private void setDeterminismChecks( @@ -44,23 +61,34 @@ Set<String> contextsRoundOne = ConcurrentHashMap.newKeySet(); Set<String> contextsRoundTwo = ConcurrentHashMap.newKeySet(); Path determinismLogDir = temp.newFolder().toPath(); - AndroidApiLevel minApiLevel = parameters.getRuntime().asDex().getMinApiLevel(); - Assume.assumeTrue(minApiLevel.isLessThan(AndroidApiLevel.O)); + Assume.assumeTrue( + requiresAnyCoreLibDesugaring( + parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)); + Path libDexFile1 = - buildDesugaredLibrary( - minApiLevel, o -> setDeterminismChecks(o, determinismLogDir, contextsRoundOne::add)); + testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .addOptionsModifier( + o -> setDeterminismChecks(o, determinismLogDir, contextsRoundOne::add)) + .compile() + .writeToZip(); Path libDexFile2 = - buildDesugaredLibrary( - minApiLevel, - o -> - setDeterminismChecks( - o, - determinismLogDir, - context -> { - assertTrue( - "Did not find context: " + context, contextsRoundOne.contains(context)); - contextsRoundTwo.add(context); - })); + testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .addOptionsModifier( + o -> + setDeterminismChecks( + o, + determinismLogDir, + context -> { + assertTrue( + "Did not find context: " + context, + contextsRoundOne.contains(context)); + contextsRoundTwo.add(context); + })) + .compile() + .writeToZip(); + assertEquals(contextsRoundOne, contextsRoundTwo); uploadJarsToCloudStorageIfTestFails( (file1, file2) -> {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java index 92e689b..46743c8 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
@@ -3,15 +3,18 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.CoreMatchers.containsString; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; +import com.android.tools.r8.DiagnosticsMatcher; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.ZipUtils; -import com.google.common.collect.ImmutableList; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; @@ -22,78 +25,47 @@ 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 DesugaredLibraryDumpInputsTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public DesugaredLibraryDumpInputsTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public DesugaredLibraryDumpInputsTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8DumpToDirectory() throws Exception { + public void testDumpToDirectory() throws Exception { Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); Path dumpDir = temp.newFolder().toPath(); - testForD8(parameters.getBackend()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(TestClass.class) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) - .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - (minAPILevel, keepRules, shrink) -> - this.buildDesugaredLibrary( - minAPILevel, - keepRules, - shrink, - ImmutableList.of(), - opt -> opt.dumpInputToDirectory = dumpDir.toString()), - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), TestClass.class) - .assertSuccessWithOutputLines("PT42S"); - verifyDumpDir(dumpDir); - } - - @Test - public void testR8DumpToDirectory() throws Exception { - Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path dumpDir = temp.newFolder().toPath(); - testForR8(parameters.getBackend()) - .addProgramClasses(TestClass.class) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) .addKeepMainRule(TestClass.class) .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString()) .allowDiagnosticInfoMessages() - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) .compile() - .addDesugaredCoreLibraryRunClassPath( - (minAPILevel, keepRules, shrink) -> - this.buildDesugaredLibrary( - minAPILevel, - keepRules, - shrink, - ImmutableList.of(), - opt -> opt.dumpInputToDirectory = dumpDir.toString()), - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .assertAllInfoMessagesMatch(containsString("Dumped compilation inputs to:")) + .inspectDiagnosticMessages( + diagnosticMessages -> + diagnosticMessages.assertAllInfosMatch( + DiagnosticsMatcher.diagnosticMessage( + containsString("Dumped compilation inputs to:")))) .run(parameters.getRuntime(), TestClass.class) .assertSuccessWithOutputLines("PT42S"); verifyDumpDir(dumpDir); @@ -102,7 +74,7 @@ private void verifyDumpDir(Path dumpDir) throws IOException { assertTrue(Files.isDirectory(dumpDir)); List<Path> paths = Files.walk(dumpDir, 1).collect(Collectors.toList()); - assertEquals(3, paths.size()); + assertEquals(2, paths.size()); boolean hasVerified = false; for (Path path : paths) { if (!path.equals(dumpDir)) { @@ -128,7 +100,7 @@ assertTrue(buildProperties.get(0).startsWith("tool=")); boolean isD8 = buildProperties.get(0).equals("tool=D8"); boolean isR8 = buildProperties.get(0).equals("tool=R8"); - if ((shrinkDesugaredLibrary || isR8) && !isD8) { + if ((compilationSpecification.isL8Shrink() || isR8) && !isD8) { assertTrue(Files.exists(unzipped.resolve("proguard.config"))); } else { assertFalse(Files.exists(unzipped.resolve("proguard.config")));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java index 6ade9c9..91fa3d5 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryMismatchTest.java
@@ -6,6 +6,9 @@ import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.CoreMatchers.allOf; import static org.hamcrest.CoreMatchers.containsString; @@ -13,13 +16,16 @@ import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.StringResource; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.errors.DesugaredLibraryMismatchDiagnostic; import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification; import com.android.tools.r8.origin.Origin; -import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.Box; +import com.google.common.collect.ImmutableList; import java.nio.file.Path; -import java.util.Collection; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -29,20 +35,30 @@ public class DesugaredLibraryMismatchTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final AndroidApiLevel apiLevel; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "API level: {1}") - public static Collection<Object[]> data() { + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { return buildParameters( - getTestParameters().withNoneRuntime().build(), - new AndroidApiLevel[] { - AndroidApiLevel.LATEST, AndroidApiLevel.O, AndroidApiLevel.N_MR1, AndroidApiLevel.B - }); + getTestParameters() + .withDexRuntime(Version.first()) + .withDexRuntime(Version.V7_0_0) + .withDexRuntime(Version.V8_1_0) + .withDexRuntime(Version.last()) + .withOnlyDexRuntimeApiLevel() + .build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public DesugaredLibraryMismatchTest(TestParameters parameters, AndroidApiLevel apiLevel) { + public DesugaredLibraryMismatchTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.apiLevel = apiLevel; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test @@ -51,21 +67,19 @@ Path libraryDex = testForD8(Backend.DEX) .addProgramClasses(Library.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compile() .writeToZip(); // Combine DEX input without library desugaring with dexing with library desugaring. try { - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(libraryDex) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) - .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel)) .compileWithExpectedDiagnostics( diagnostics -> { - if (requiresAnyCoreLibDesugaring(apiLevel)) { + if (requiresAnyCoreLibDesugaring( + parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) { diagnostics.assertNoInfos(); diagnostics.assertAllWarningsMatch( diagnosticMessage( @@ -89,17 +103,14 @@ Path desugaredLibrary = testForD8(Backend.CF) .addProgramClasses(Library.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compile() .writeToZip(); // Combine CF desugared input without library desugaring with dexing with library desugaring. - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(desugaredLibrary) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) - .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel)) .compile(); } @@ -109,7 +120,7 @@ Path desugaredLibrary = testForD8(Backend.CF) .addProgramClasses(Library.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compile() .writeToZip(); @@ -117,17 +128,14 @@ Path desugaredLibraryDex = testForD8(Backend.DEX) .addProgramFiles(desugaredLibrary) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .disableDesugaring() .compile() .writeToZip(); - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(desugaredLibraryDex) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) - .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel)) .compile(); } @@ -137,8 +145,9 @@ Path desugaredLibrary = testForD8(Backend.CF) .addProgramClasses(Library.class) - .setMinApi(apiLevel) - .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel)) + .setMinApi(parameters.getApiLevel()) + .enableCoreLibraryDesugaring( + LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) .compile() .writeToZip(); @@ -147,10 +156,10 @@ testForD8() .addProgramFiles(desugaredLibrary) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compileWithExpectedDiagnostics( diagnostics -> { - if (requiresAnyCoreLibDesugaring(apiLevel)) { + if (requiresAnyCoreLibDesugaring(parameters.getApiLevel())) { diagnostics.assertOnlyErrors(); diagnostics.assertErrorsMatch( diagnosticType(DesugaredLibraryMismatchDiagnostic.class)); @@ -166,11 +175,9 @@ public void testMergeLibraryDesugaredWithNotLibraryDesugared() throws Exception { // DEX code with library desugaring. Path libraryDex = - testForD8(Backend.DEX) - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Library.class) - .setMinApi(apiLevel) - .enableCoreLibraryDesugaring(LibraryDesugaringTestConfiguration.forApiLevel(apiLevel)) .compile() .writeToZip(); @@ -178,7 +185,7 @@ Path programDex = testForD8(Backend.DEX) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compile() .writeToZip(); @@ -186,10 +193,11 @@ testForD8() .addProgramFiles(libraryDex) .addProgramFiles(programDex) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compileWithExpectedDiagnostics( diagnostics -> { - if (requiresAnyCoreLibDesugaring(apiLevel)) { + if (requiresAnyCoreLibDesugaring( + parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)) { diagnostics.assertOnlyErrors(); diagnostics.assertErrorsMatch( diagnosticType(DesugaredLibraryMismatchDiagnostic.class)); @@ -209,10 +217,10 @@ Path libraryDex = testForD8(Backend.DEX) .addProgramClasses(Library.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .enableCoreLibraryDesugaring( LibraryDesugaringTestConfiguration.builder() - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) // Minimal configuration with a different identifier. // The j$.time is rewritten because empty flags are equivalent to an empty // specification, and no marker is set for empty specifications. @@ -241,7 +249,7 @@ Path programDex = testForD8(Backend.DEX) .addProgramClasses(TestRunner.class) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compile() .writeToZip(); @@ -249,7 +257,7 @@ testForD8() .addProgramFiles(libraryDex) .addProgramFiles(programDex) - .setMinApi(apiLevel) + .setMinApi(parameters.getApiLevel()) .compileWithExpectedDiagnostics( diagnostics -> { diagnostics.assertOnlyErrors();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java index 9bac396..6024ccb 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -107,20 +107,26 @@ return parameters.getApiLevel().isLessThan(apiLevelWithDefaultInterfaceMethodsSupport()); } - protected boolean requiresTimeDesugaring(TestParameters parameters) { + protected boolean requiresTimeDesugaring(TestParameters parameters, boolean isJDK11) { return parameters.getApiLevel().getLevel() - < (isJDK11DesugaredLibrary() ? AndroidApiLevel.S.getLevel() : AndroidApiLevel.O.getLevel()); + < (isJDK11 ? AndroidApiLevel.S.getLevel() : AndroidApiLevel.O.getLevel()); + } + + protected boolean requiresTimeDesugaring(TestParameters parameters) { + return requiresTimeDesugaring(parameters, isJDK11DesugaredLibrary()); } protected boolean requiresAnyCoreLibDesugaring(TestParameters parameters) { return requiresAnyCoreLibDesugaring(parameters.getApiLevel()); } - protected boolean requiresAnyCoreLibDesugaring(AndroidApiLevel apiLevel) { + protected boolean requiresAnyCoreLibDesugaring(AndroidApiLevel apiLevel, boolean isJDK11) { return apiLevel.getLevel() - <= (isJDK11DesugaredLibrary() - ? AndroidApiLevel.Sv2.getLevel() - : AndroidApiLevel.N_MR1.getLevel()); + <= (isJDK11 ? AndroidApiLevel.Sv2.getLevel() : AndroidApiLevel.N_MR1.getLevel()); + } + + protected boolean requiresAnyCoreLibDesugaring(AndroidApiLevel apiLevel) { + return requiresAnyCoreLibDesugaring(apiLevel, isJDK11DesugaredLibrary()); } protected DesugaredLibraryTestBuilder<?> testForDesugaredLibrary( @@ -223,7 +229,7 @@ } } - protected static Path[] getAllFilesWithSuffixInDirectory(Path directory, String suffix) + public static Path[] getAllFilesWithSuffixInDirectory(Path directory, String suffix) throws IOException { return Files.walk(directory) .filter(path -> path.toString().endsWith(suffix))
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java index 1a7981a..2bd0f31 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -5,23 +5,21 @@ package com.android.tools.r8.desugar.desugaredlibrary; import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.StringContains.containsString; -import com.android.tools.r8.CompilationMode; -import com.android.tools.r8.L8Command; -import com.android.tools.r8.OutputMode; -import com.android.tools.r8.StringResource; -import com.android.tools.r8.TestDiagnosticMessagesImpl; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.origin.Origin; -import com.android.tools.r8.utils.BooleanUtils; -import java.nio.file.Path; -import java.util.Arrays; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.google.common.collect.ImmutableList; import java.util.List; 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 DesugaredLibraryWarningTest extends DesugaredLibraryTestBase { @@ -36,44 +34,44 @@ + "-keep class j$.util.function.Function { *; }"; private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); } - public DesugaredLibraryWarningTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public DesugaredLibraryWarningTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test public void testDesugaredLibraryContent() throws Exception { - TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl(); - Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip"); - L8Command.Builder l8Builder = - L8Command.builder(diagnosticsHandler) - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(ToolHelper.getDesugarJDKLibs()) - .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS) - .setMode(shrinkDesugaredLibrary ? CompilationMode.RELEASE : CompilationMode.DEBUG) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting())) - .setMinApiLevel(parameters.getApiLevel().getLevel()) - .setOutput(desugaredLib, OutputMode.DexIndexed); - if (shrinkDesugaredLibrary) { - l8Builder.addProguardConfiguration( - Arrays.asList(FUNCTION_KEEP.split(System.lineSeparator())), Origin.unknown()); - } - ToolHelper.runL8(l8Builder.build(), options -> {}); - if (isJDK11DesugaredLibrary()) { - diagnosticsHandler.assertNoErrors(); - diagnosticsHandler.assertAllWarningsMatch( - diagnosticMessage(containsString("Specification conversion"))); - } else { - diagnosticsHandler.assertNoMessages(); - } + testForL8(parameters.getApiLevel()) + .apply( + l8TestBuilder -> + libraryDesugaringSpecification.configureL8TestBuilder( + l8TestBuilder, compilationSpecification.isL8Shrink(), FUNCTION_KEEP)) + .compile() + .inspectDiagnosticMessages( + diagnosticsHandler -> { + if (libraryDesugaringSpecification != JDK8) { + diagnosticsHandler.assertNoErrors(); + diagnosticsHandler.assertAllWarningsMatch( + diagnosticMessage(containsString("Specification conversion"))); + } else { + + diagnosticsHandler.assertNoMessages(); + } + }); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java index 1245c7e..2505e7f 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectedTypePassedToStaticType.java
@@ -4,12 +4,15 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.StringContains.containsString; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.LocalDate; import java.util.List; @@ -21,69 +24,42 @@ @RunWith(Parameterized.class) public class DesugaredLocalDateReflectedTypePassedToStaticType extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED = StringUtils.lines("1992"); - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } public DesugaredLocalDateReflectedTypePassedToStaticType( - TestParameters parameters, boolean shrinkDesugaredLibrary) { + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult runResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class); - if (shrinkDesugaredLibrary && requiresTimeDesugaring(parameters)) { - runResult.assertFailureWithErrorThatMatches( - containsString("java.lang.NoSuchMethodException")); - } else { - runResult.assertSuccessWithOutput(EXPECTED); - } - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult runResult = - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) + public void testDate() throws Exception { + SingleTestRunResult<?> run = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) .addInnerClasses(DesugaredLocalDateReflectedTypePassedToStaticType.class) .addKeepMainRule(Main.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class); - if (shrinkDesugaredLibrary && requiresTimeDesugaring(parameters)) { - runResult.assertFailureWithErrorThatMatches( - containsString("java.lang.NoSuchMethodException")); + if (compilationSpecification.isL8Shrink() + && requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) { + run.assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodException")); } else { - runResult.assertSuccessWithOutput(EXPECTED); + run.assertSuccessWithOutput(EXPECTED); } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java index ebc0f68..43dc91b 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLocalDateReflectionTest.java
@@ -4,13 +4,15 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.StringContains.containsString; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; import com.android.tools.r8.ToolHelper.DexVm; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.util.List; import org.junit.Test; @@ -21,63 +23,36 @@ @RunWith(Parameterized.class) public class DesugaredLocalDateReflectionTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED = StringUtils.lines("1992"); - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } public DesugaredLocalDateReflectionTest( - TestParameters parameters, boolean shrinkDesugaredLibrary) { + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult runResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredLocalDateReflectionTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class); - if (parameters.getRuntime().asDex().getVm().isNewerThan(DexVm.ART_7_0_0_HOST)) { - runResult.assertSuccessWithOutput(EXPECTED); - } else { - runResult.assertFailureWithErrorThatMatches( - containsString("java.lang.ClassNotFoundException: java.time.LocalDate")); - } - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult runResult = - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredLocalDateReflectionTest.class) + public void testDate() throws Exception { + SingleTestRunResult<?> runResult = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Main.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class); if (parameters.getRuntime().asDex().getVm().isNewerThan(DexVm.ART_7_0_0_HOST)) { runResult.assertSuccessWithOutput(EXPECTED);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java index 139103d..6c1f23f 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredReflectedDesugaredTypePassedToStaticTypeTest.java
@@ -4,12 +4,15 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.StringContains.containsString; -import com.android.tools.r8.D8TestRunResult; -import com.android.tools.r8.R8TestRunResult; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.LocalDate; import java.util.List; @@ -22,65 +25,37 @@ public class DesugaredReflectedDesugaredTypePassedToStaticTypeTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED = StringUtils.lines("1992", "1992"); + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getTestParameters().withDexRuntimes().withAllApiLevels().build(), BooleanUtils.values()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } public DesugaredReflectedDesugaredTypePassedToStaticTypeTest( - TestParameters parameters, boolean shrinkDesugaredLibrary) { + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult runResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setIncludeClassesChecksum(true) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class); - if (!requiresTimeDesugaring(parameters)) { - runResult.assertFailureWithErrorThatMatches( - containsString("java.lang.ClassNotFoundException: j$.time.LocalDate")); - } else { - runResult.assertSuccessWithOutput(EXPECTED); - } - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - R8TestRunResult runResult = - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(DesugaredReflectedDesugaredTypePassedToStaticTypeTest.class) + public void testDate() throws Exception { + SingleTestRunResult<?> runResult = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Main.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Main.class); - if (!requiresTimeDesugaring(parameters)) { + if (!requiresTimeDesugaring(parameters, libraryDesugaringSpecification != JDK8)) { runResult.assertFailureWithErrorThatMatches( containsString("java.lang.ClassNotFoundException: j$.time.LocalDate")); } else {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DisableDesugarTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DisableDesugarTest.java index f686167..7fecd40 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DisableDesugarTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DisableDesugarTest.java
@@ -4,16 +4,18 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.CoreMatchers.containsString; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.fail; import com.android.tools.r8.CompilationFailedException; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestDiagnosticMessages; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import java.util.List; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -23,14 +25,39 @@ public class DisableDesugarTest extends DesugaredLibraryTestBase { private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public DisableDesugarTest(TestParameters parameters) { + public DisableDesugarTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + } + + @Test + public void testDisableDesugar() throws Exception { + try { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(TestClass.class) + .disableDesugaring() + .compileWithExpectedDiagnostics(this::checkExpectedDiagnostics); + } catch (CompilationFailedException e) { + // Expected compilation failed. + return; + } + fail("Expected test to fail with CompilationFailedException"); } private void checkExpectedDiagnostics(TestDiagnosticMessages messages) { @@ -42,41 +69,6 @@ containsString("Using desugared library configuration requires desugaring to be enabled")); } - @Test - public void testDisableDesugarD8() throws Exception { - try { - testForD8() - .addInnerClasses(DisableDesugarTest.class) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(AndroidApiLevel.B)) - .compileWithExpectedDiagnostics(this::checkExpectedDiagnostics); - } catch (CompilationFailedException e) { - // Expected compilation failed. - return; - } - fail("Expected test to fail with CompilationFailedException"); - } - - @Test - public void testDisableDesugarR8() throws Exception { - try { - testForR8(parameters.getBackend()) - .addInnerClasses(DisableDesugarTest.class) - .addKeepMainRule(TestClass.class) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(AndroidApiLevel.B)) - .compileWithExpectedDiagnostics(this::checkExpectedDiagnostics); - } catch (CompilationFailedException e) { - // Expected compilation failed. - return; - } - fail("Expected test to fail with CompilationFailedException"); - } - static class TestClass { public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java index 7e94671..70554a0 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DontKeepBootstrapClassesTest.java
@@ -3,49 +3,70 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; -import static org.hamcrest.CoreMatchers.containsString; -import static org.hamcrest.MatcherAssert.assertThat; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; +import static org.junit.Assert.assertTrue; -import com.android.tools.r8.LibraryDesugaringTestConfiguration.PresentKeepRuleConsumer; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.CustomLibrarySpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; import java.util.Arrays; +import java.util.List; import java.util.function.Consumer; 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 DontKeepBootstrapClassesTest extends DesugaredLibraryTestBase { - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withNoneRuntime().build(); + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - final AndroidApiLevel minApiLevel = AndroidApiLevel.B; - - public DontKeepBootstrapClassesTest(TestParameters parameters) { - parameters.assertNoneRuntime(); + public DontKeepBootstrapClassesTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void test() throws Exception { - KeepRuleConsumer keepRuleConsumer = new PresentKeepRuleConsumer(); - testForD8() - .addLibraryFiles(getLibraryFile()) + public void testDontKeep() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(TestClass.class) - .setMinApi(minApiLevel) - .addLibraryClasses(CustomLibClass.class) - .enableCoreLibraryDesugaring(minApiLevel, keepRuleConsumer) - .compile(); - assertThat(keepRuleConsumer.get(), containsString("-keep class j$.util.function.Consumer")); - // TODO(b/158635415): Don't generate keep rules targeting items outside desugared library. - assertThat(keepRuleConsumer.get(), containsString("-keep class java.util")); + .addKeepMainRule(TestClass.class) + .setCustomLibrarySpecification( + new CustomLibrarySpecification(CustomLibClass.class, AndroidApiLevel.N)) + .compile() + .inspectKeepRules( + keepRule -> { + if (requiresEmulatedInterfaceCoreLibDesugaring(parameters)) { + assertTrue( + keepRule.stream() + .anyMatch(kr -> kr.contains("-keep class j$.util.function.Consumer"))); + // TODO(b/158635415): Don't generate keep rules targeting items outside desugared + // library. + assertTrue(keepRule.stream().anyMatch(kr -> kr.contains("-keep class java.util"))); + } + }); } static class CustomLibClass { + public static <T> Consumer<T> id(Consumer<T> fn) { return fn; }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java index 89b293f..d366e33 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DoubleUtilityClassTest.java
@@ -4,45 +4,55 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.IsNot.not; import static org.hamcrest.core.StringContains.containsString; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.time.LocalDateTime; import java.time.ZoneOffset; import java.time.zone.ZoneOffsetTransition; +import java.util.List; import java.util.Objects; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; // In this test both the desugared library and the program have the same utility class. @RunWith(Parameterized.class) public class DoubleUtilityClassTest extends DesugaredLibraryTestBase { private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withDexRuntimes().withAllApiLevels().build(); + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public DoubleUtilityClassTest(TestParameters parameters) { + public DoubleUtilityClassTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test public void testDoubleUtility() throws Exception { for (Class<?> executor : new Class<?>[] {ExecutorV1.class, ExecutorV2.class}) { - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(executor) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .setMinApi(parameters.getApiLevel()) - .compile() + .addKeepMainRule(executor) .run(parameters.getRuntime(), executor) .assertSuccess() // Verification error on some Dalvik VMs (4,api 1;4,api 15;4.4,api 1).
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java index 874d45a..2e09671 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmptyDesugaredLibrary.java
@@ -4,22 +4,24 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import com.android.tools.r8.ByteDataView; import com.android.tools.r8.DexIndexedConsumer; import com.android.tools.r8.DiagnosticsHandler; -import com.android.tools.r8.L8Command; -import com.android.tools.r8.OutputMode; -import com.android.tools.r8.StringResource; +import com.android.tools.r8.L8TestBuilder; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; +import com.google.common.collect.ImmutableList; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; -import java.util.ArrayList; import java.util.List; import java.util.Set; import java.util.zip.ZipFile; @@ -31,39 +33,30 @@ @RunWith(Parameterized.class) public class EmptyDesugaredLibrary extends DesugaredLibraryTestBase { - private final AndroidApiLevel apiLevel; + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "api: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - range(AndroidApiLevel.K, AndroidApiLevel.LATEST), - getTestParameters().withNoneRuntime().build()); + getTestParameters().withDexRuntimes().withOnlyDexRuntimeApiLevel().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - private static List<AndroidApiLevel> range( - AndroidApiLevel fromIncluding, AndroidApiLevel toIncluding) { - ArrayList<AndroidApiLevel> result = new ArrayList<>(); - for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) { - if (apiLevel.isGreaterThanOrEqualTo(fromIncluding) - && apiLevel.isLessThanOrEqualTo(toIncluding)) { - result.add(apiLevel); - } - } - return result; + public EmptyDesugaredLibrary( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } - public EmptyDesugaredLibrary(AndroidApiLevel apiLevel, TestParameters parameters) { - parameters.assertNoneRuntime(); - this.apiLevel = apiLevel; - } - - private L8Command.Builder prepareL8Builder(AndroidApiLevel minApiLevel) { - return L8Command.builder() - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(ToolHelper.getDesugarJDKLibs()) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting())) - .setMinApiLevel(minApiLevel.getLevel()); + private L8TestBuilder prepareL8() { + return testForL8(parameters.getApiLevel()) + .apply(libraryDesugaringSpecification::configureL8TestBuilder); } static class CountingProgramConsumer extends DexIndexedConsumer.ForwardingConsumer { @@ -82,38 +75,26 @@ } private boolean expectsEmptyDesugaredLibrary(AndroidApiLevel apiLevel) { + if (libraryDesugaringSpecification != JDK8) { + return apiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.S); + } return !requiresAnyCoreLibDesugaring(apiLevel); } @Test public void testEmptyDesugaredLibrary() throws Exception { CountingProgramConsumer programConsumer = new CountingProgramConsumer(); - ToolHelper.runL8(prepareL8Builder(apiLevel).setProgramConsumer(programConsumer).build()); - assertEquals(expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1, programConsumer.count); + prepareL8().setProgramConsumer(programConsumer).compile(); + assertEquals( + expectsEmptyDesugaredLibrary(parameters.getApiLevel()) ? 0 : 1, programConsumer.count); } @Test public void testEmptyDesugaredLibraryDexZip() throws Exception { - Path desugaredLibraryZip = temp.newFolder().toPath().resolve("desugar_jdk_libs_dex.zip"); - ToolHelper.runL8( - prepareL8Builder(apiLevel).setOutput(desugaredLibraryZip, OutputMode.DexIndexed).build()); + Path desugaredLibraryZip = prepareL8().compile().writeToZip(); assertTrue(Files.exists(desugaredLibraryZip)); assertEquals( - expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1, + expectsEmptyDesugaredLibrary(parameters.getApiLevel()) ? 0 : 1, new ZipFile(desugaredLibraryZip.toFile(), StandardCharsets.UTF_8).size()); } - - @Test - public void testEmptyDesugaredLibraryDexDirectory() throws Exception { - Path desugaredLibraryDirectory = temp.newFolder().toPath(); - ToolHelper.runL8( - prepareL8Builder(apiLevel) - .setOutput(desugaredLibraryDirectory, OutputMode.DexIndexed) - .build()); - assertEquals( - expectsEmptyDesugaredLibrary(apiLevel) ? 0 : 1, - Files.walk(desugaredLibraryDirectory) - .filter(path -> path.toString().endsWith(".dex")) - .count()); - } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java index b3d3ddd..1ca61c5 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/EmulatedInterfacesTest.java
@@ -4,6 +4,9 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringForTesting.getEmulateLibraryClassNameSuffix; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static junit.framework.TestCase.assertEquals; @@ -12,13 +15,15 @@ import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexEncodedMethod; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.FoundClassSubject; import com.android.tools.r8.utils.codeinspector.InstructionSubject; +import com.google.common.collect.ImmutableList; import java.util.List; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -32,26 +37,37 @@ public class EmulatedInterfacesTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); } - public EmulatedInterfacesTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public EmulatedInterfacesTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test public void testEmulatedInterface() throws Exception { Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters)); CodeInspector inspector = - new CodeInspector( - buildDesugaredLibrary( - parameters.getApiLevel(), "-keep class **$-EL", shrinkDesugaredLibrary)); + testForL8(parameters.getApiLevel()) + .apply( + l8Builder -> + libraryDesugaringSpecification.configureL8TestBuilder( + l8Builder, compilationSpecification.isL8Shrink(), "-keep class **$-EL")) + .compile() + .inspector(); assertEmulateInterfaceClassesPresentWithDispatchMethods(inspector); assertCollectionMethodsPresentWithCorrectDispatch(inspector); } @@ -85,7 +101,7 @@ int numCheckCast = (int) Stream.of(method.getCode().asDexCode().instructions) - .filter(Instruction::isCheckCast) + .filter(DexInstruction::isCheckCast) .count(); if (method.qualifiedName().contains("spliterator")) { assertEquals(5, numCheckCast);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java index 0c4d6f6..f0be12b 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ExtractWrapperTypesTest.java
@@ -3,6 +3,7 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static com.android.tools.r8.utils.DescriptorUtils.descriptorToJavaType; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; @@ -11,8 +12,8 @@ import com.android.tools.r8.GenerateLintFiles; import com.android.tools.r8.StringResource; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification; @@ -47,6 +48,7 @@ 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 ExtractWrapperTypesTest extends DesugaredLibraryTestBase { @@ -94,19 +96,23 @@ // TODO(b/159304624): Does this need custom conversion? "java.time.Period"); - @Parameterized.Parameters(name = "{0}") - public static TestParametersCollection data() { - return getTestParameters().withNoneRuntime().build(); + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters(getTestParameters().withNoneRuntime().build(), getJdk8Jdk11()); + } + + public ExtractWrapperTypesTest( + TestParameters parameters, LibraryDesugaringSpecification libraryDesugaringSpecification) { + parameters.assertNoneRuntime(); + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } // TODO: parameterize to check both api<=23 as well as 23<api<26 for which the spec differs. private final AndroidApiLevel minApi = AndroidApiLevel.B; private final AndroidApiLevel targetApi = AndroidApiLevel.Q; - public ExtractWrapperTypesTest(TestParameters parameters) { - parameters.assertNoneRuntime(); - } - @Test public void checkConsistency() { List<Set<String>> sets = @@ -134,7 +140,7 @@ DexItemFactory factory = new DexItemFactory(); DesugaredLibrarySpecification spec = DesugaredLibrarySpecificationParser.parseDesugaredLibrarySpecification( - StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()), + StringResource.fromFile(libraryDesugaringSpecification.getSpecification()), factory, null, false,
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java index 88580f5..42ee197 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FeatureSplitTest.java
@@ -4,28 +4,32 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.R8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.R8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; import static org.junit.Assume.assumeTrue; -import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.ArtCommandBuilder; import com.android.tools.r8.ToolHelper.ProcessResult; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.dexsplitter.SplitterTestBase; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; import dalvik.system.PathClassLoader; import java.io.IOException; import java.net.MalformedURLException; import java.nio.file.Path; import java.util.ArrayList; import java.util.List; -import java.util.concurrent.ExecutionException; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -35,21 +39,28 @@ public class FeatureSplitTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(R8_L8DEBUG, R8_L8SHRINK)); } - public FeatureSplitTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public FeatureSplitTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testTwoFeatures() throws CompilationFailedException, IOException, ExecutionException { + public void testTwoFeatures() throws Throwable { CompiledWithFeature compiledWithFeature = new CompiledWithFeature().invoke(this); Path basePath = compiledWithFeature.getBasePath(); Path feature1Path = compiledWithFeature.getFeature1Path(); @@ -72,6 +83,9 @@ if (parameters.getApiLevel().getLevel() >= AndroidApiLevel.N.getLevel()) { return; } + if (!compilationSpecification.isL8Shrink()) { + return; + } // Ensure count, toArray and forEach are kept. assertTrue( keepRules.contains( @@ -84,8 +98,7 @@ + " java.lang.Object[] toArray();")); } - private void assertClassPresent(Path appPath, Class<?> present) - throws IOException, ExecutionException { + private void assertClassPresent(Path appPath, Class<?> present) throws IOException { CodeInspector inspector = new CodeInspector(appPath); assertTrue(inspector.clazz(present).isPresent()); } @@ -227,38 +240,36 @@ return keepRules; } - public CompiledWithFeature invoke(FeatureSplitTest tester) - throws IOException, CompilationFailedException { + public CompiledWithFeature invoke(FeatureSplitTest tester) throws Throwable { basePath = temp.newFile("base.zip").toPath(); feature1Path = temp.newFile("feature1.zip").toPath(); feature2Path = temp.newFile("feature2.zip").toPath(); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addProgramClasses(BaseClass.class, RunInterface.class, SplitRunner.class) - .setMinApi(parameters.getApiLevel()) - .addFeatureSplit( - builder -> - SplitterTestBase.simpleSplitProvider( - builder, feature1Path, temp, FeatureClass.class)) - .addFeatureSplit( - builder -> - SplitterTestBase.simpleSplitProvider( - builder, feature2Path, temp, FeatureClass2.class)) - .addKeepAllClassesRule() - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .writeToZip(basePath); + DesugaredLibraryTestCompileResult<?> compileResult = + tester + .testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addProgramClasses(BaseClass.class, RunInterface.class, SplitRunner.class) + .addFeatureSplit( + builder -> + SplitterTestBase.simpleSplitProvider( + builder, feature1Path, temp, FeatureClass.class)) + .addFeatureSplit( + builder -> + SplitterTestBase.simpleSplitProvider( + builder, feature2Path, temp, FeatureClass2.class)) + .addKeepAllClassesRule() + .compile() + .writeToZip(basePath); + // Stream desugaring is not needed >= N. if (parameters.getApiLevel().getLevel() >= AndroidApiLevel.N.getLevel()) { return this; } - desugaredLibrary = - tester.buildDesugaredLibrary( - parameters.getApiLevel(), keepRuleConsumer.get(), shrinkDesugaredLibrary); - keepRules = keepRuleConsumer.get(); + + desugaredLibrary = compileResult.writeL8ToZip(); + compileResult.inspectKeepRules(kr -> keepRules = StringUtils.join("\n", kr)); return this; } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java index 8a04ae3..4ac3eaa 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FreezePeriodTest.java
@@ -3,17 +3,18 @@ // BSD-style license that can be found in the LICENSE file. package com.android.tools.r8.desugar.desugaredlibrary.conversiontests; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.CustomLibrarySpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; -import java.nio.file.Path; import java.time.MonthDay; import java.util.List; -import org.junit.BeforeClass; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -23,7 +24,9 @@ public class FreezePeriodTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; + private static final AndroidApiLevel MIN_SUPPORTED = AndroidApiLevel.O; private static final String EXPECTED_RESULT = StringUtils.lines( @@ -31,109 +34,31 @@ "FP:--05-05;--06-06", "FP:--05-05;--06-0601", "MFP:--05-05;--06-06"); - private static Path CUSTOM_LIB; - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getConversionParametersUpToExcluding(MIN_SUPPORTED), BooleanUtils.values()); + getConversionParametersUpToExcluding(MIN_SUPPORTED), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public FreezePeriodTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public FreezePeriodTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; - } - - @BeforeClass - public static void compileCustomLib() throws Exception { - CUSTOM_LIB = - testForD8(getStaticTemp()) - .addProgramClasses(FreezePeriod.class) - .setMinApi(MIN_SUPPORTED) - .compile() - .writeToZip(); + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test - public void testD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + public void testFreezePeriod() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Executor.class, MyFreezePeriod.class) - .addLibraryClasses(FreezePeriod.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .addRunClasspathFiles(CUSTOM_LIB) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - - @Test - public void testD8CfToCf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path jar = - testForD8(Backend.CF) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) - .addProgramClasses(Executor.class, MyFreezePeriod.class) - .addLibraryClasses(FreezePeriod.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .addRunClasspathFiles(CUSTOM_LIB) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .addRunClasspathFiles(CUSTOM_LIB) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - } - - @Test - public void testR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + .setCustomLibrarySpecification( + new CustomLibrarySpecification(FreezePeriod.class, MIN_SUPPORTED)) .addKeepMainRule(Executor.class) - .addProgramClasses(Executor.class, MyFreezePeriod.class) - .addLibraryClasses(FreezePeriod.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .allowStdoutMessages() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .addRunClasspathFiles(CUSTOM_LIB) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_RESULT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java index 0b443a8..12ff1ae 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/FunctionOnlyTest.java
@@ -4,28 +4,18 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_MINIMAL; -import com.android.tools.r8.CompilationFailedException; -import com.android.tools.r8.CompilationMode; -import com.android.tools.r8.L8Command; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; -import com.android.tools.r8.OutputMode; -import com.android.tools.r8.StringResource; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser; -import com.android.tools.r8.utils.BooleanUtils; -import com.android.tools.r8.utils.InternalOptions; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import com.google.common.collect.ImmutableList; -import java.io.IOException; -import java.nio.file.Path; import java.util.List; import java.util.function.BiFunction; import java.util.function.BinaryOperator; import java.util.function.BooleanSupplier; -import java.util.function.Consumer; import java.util.function.DoublePredicate; import java.util.function.DoubleSupplier; import java.util.function.Function; @@ -33,7 +23,6 @@ import java.util.function.LongConsumer; import java.util.function.LongSupplier; import java.util.function.Supplier; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -42,139 +31,35 @@ @RunWith(Parameterized.class) public class FunctionOnlyTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED_RESULT = StringUtils.lines(" true true true", "2", "false", "3", "true", "5", "42.0"); - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( getTestParameters().withDexRuntimes().withAllApiLevelsAlsoForCf().build(), - BooleanUtils.values()); + ImmutableList.of(JDK11_MINIMAL), + SPECIFICATIONS_WITH_CF2CF); } - public FunctionOnlyTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public FunctionOnlyTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testFunctionCompositionD8() throws Exception { - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + public void testFunction() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addInnerClasses(getClass()) - .enableCoreLibraryDesugaring(minimalConfiguration()) - .compile() - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - - private LibraryDesugaringTestConfiguration minimalConfiguration() { - if (!isJDK11DesugaredLibrary()) { - return LibraryDesugaringTestConfiguration.builder() - .setMinApi(parameters.getApiLevel()) - .setMode(CompilationMode.RELEASE) - .withKeepRuleConsumer() - .build(); - } - return LibraryDesugaringTestConfiguration.builder() - .setMinApi(parameters.getApiLevel()) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonMinimalForTesting())) - .setMode(shrinkDesugaredLibrary ? CompilationMode.RELEASE : CompilationMode.DEBUG) - .withKeepRuleConsumer() - .build(); - } - - @Test - public void testFunctionCompositionD8Cf2Cf() throws Exception { - Assume.assumeTrue(isJDK11DesugaredLibrary()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path jar = - testForD8(Backend.CF) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) - .addInnerClasses(FunctionOnlyTest.class) - .enableCoreLibraryDesugaring( - parameters.getApiLevel(), - keepRuleConsumer, - StringResource.fromFile(ToolHelper.getDesugarLibJsonMinimalForTesting())) - .compile() - .writeToZip(); - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class java.util.function.* { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - (api, keep, shrink) -> - buildDesugaredLibrary( - api, - keep, - shrink, - ImmutableList.of(), - opt -> - opt.setDesugaredLibrarySpecification( - DesugaredLibrarySpecificationParser - .parseDesugaredLibrarySpecification( - StringResource.fromFile( - ToolHelper.getDesugarLibJsonMinimalForTesting()), - opt.itemFactory, - opt.reporter, - true, - parameters.getApiLevel().getLevel()))), - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCFMinimal(parameters, options -> {})) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - } - - public Path getDesugaredLibraryInCFMinimal( - TestParameters parameters, Consumer<InternalOptions> configurationForLibraryCompilation) - throws IOException, CompilationFailedException { - Path desugaredLib = temp.newFolder().toPath().resolve("desugar_jdk_libs.jar"); - L8Command.Builder l8Builder = - L8Command.builder() - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(ToolHelper.getDesugarJDKLibs()) - .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS) - .setMode(CompilationMode.DEBUG) - .addDesugaredLibraryConfiguration( - StringResource.fromFile(ToolHelper.getDesugarLibJsonMinimalForTesting())) - .setMinApiLevel(parameters.getApiLevel().getLevel()) - .setOutput(desugaredLib, OutputMode.ClassFile); - ToolHelper.runL8(l8Builder.build(), configurationForLibraryCompilation); - return desugaredLib; - } - - @Test - public void testFunctionCompositionR8() throws Exception { - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) .addKeepMainRule(Executor.class) - .addInnerClasses(getClass()) - .enableCoreLibraryDesugaring(minimalConfiguration()) - .allowStdoutMessages() - .compile() .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_RESULT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java index 90a302f..f4caa40 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ImplementedInterfacesTest.java
@@ -4,14 +4,20 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.MatcherAssert.assertThat; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; import java.io.Serializable; import java.util.Collection; import java.util.List; @@ -26,22 +32,39 @@ public class ImplementedInterfacesTest extends DesugaredLibraryTestBase { private final TestParameters parameters; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; private final boolean canUseDefaultAndStaticInterfaceMethods; - @Parameters(name = "{0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); } - public ImplementedInterfacesTest(TestParameters parameters) { + public ImplementedInterfacesTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; this.canUseDefaultAndStaticInterfaceMethods = parameters .getApiLevel() .isGreaterThanOrEqualTo(apiLevelWithDefaultInterfaceMethodsSupport()); } + @Test + public void testImplementedInterfaces() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .compile() + .inspect(this::checkInterfaces); + } + private String desugaredJavaTypeNameFor(Class<?> clazz) { return clazz.getTypeName().replace("java.", "j$."); } @@ -63,18 +86,6 @@ } } - @Test - public void testInterfaces() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(ImplementedInterfacesTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .inspect(this::checkInterfaces); - } - abstract static class MultipleInterfaces<T> implements List<T>, Serializable, Set<T> { // Disambiguate between default methods List.spliterator() and Set.spliterator()
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java index d3c8a4d..e16b428 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InstantTest.java
@@ -4,8 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.time.Instant; import java.time.ZoneOffset; import java.util.List; @@ -18,52 +22,31 @@ public class InstantTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public InstantTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public InstantTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test - public void testInstantD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(InstantTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutputLines("1970-01-02T10:17:36.789Z"); - } - - @Test - public void testInstantR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(InstantTest.class) - .setMinApi(parameters.getApiLevel()) - .addKeepClassAndMembersRules(Executor.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + public void testInstant() throws Exception { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutputLines("1970-01-02T10:17:36.789Z"); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java index 760fc1c..397a46f 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InvalidLibraryTest.java
@@ -4,104 +4,95 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.core.StringContains.containsString; +import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.TestDiagnosticMessages; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.CustomLibrarySpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.errors.InvalidLibrarySuperclassDiagnostic; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; +import java.io.IOException; import java.nio.file.Path; import java.time.Instant; import java.util.Date; import java.util.List; import org.junit.Assume; -import org.junit.BeforeClass; 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 InvalidLibraryTest extends DesugaredLibraryTestBase { - private static Path customLib; - private static Path superclassAsClasspath; private static final String EXPECTED_RESULT = StringUtils.lines("1970-01-02T10:17:36.789Z", "1970-01-12T10:20:54.321123456Z"); private static final String INVALID_RESULT = StringUtils.lines("1970-01-02T10:17:36.789Z", "1970-01-12T10:20:54.321Z"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameterized.Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); } - public InvalidLibraryTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public InvalidLibraryTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } - @BeforeClass - public static void compileCustomLib() throws Exception { - customLib = - testForD8(getStaticTemp()) - .addProgramClasses(CustomLibraryClass.class) - .setMinApi(AndroidApiLevel.B) - .compile() - .writeToZip(); - superclassAsClasspath = - testForD8(getStaticTemp()) - .addProgramClasses(SuperLibraryClass.class) - .setMinApi(AndroidApiLevel.B) - .compile() - .writeToZip(); + private Path getSuperclassAsClasspath() throws CompilationFailedException, IOException { + return testForD8(getStaticTemp()) + .addProgramClasses(SuperLibraryClass.class) + .setMinApi(AndroidApiLevel.B) + .compile() + .writeToZip(); } @Test public void testProgramSupertype() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses( Executor.class, SuperLibraryClass.class, LocalClass.class, LocalClassOverride.class) - .addLibraryClasses(CustomLibraryClass.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .addRunClasspathFiles(customLib) + .setCustomLibrarySpecification( + new CustomLibrarySpecification(CustomLibraryClass.class, AndroidApiLevel.B)) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_RESULT); } @Test public void testClasspathSupertype() throws Exception { - Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + Assume.assumeTrue( + requiresAnyCoreLibDesugaring( + parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)); + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class) .addClasspathClasses(SuperLibraryClass.class) - .addLibraryClasses(CustomLibraryClass.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) + .setCustomLibrarySpecification( + new CustomLibrarySpecification(CustomLibraryClass.class, AndroidApiLevel.B)) + .addKeepMainRule(Executor.class) .compile() - .inspectDiagnosticMessages(this::assertWarningInvalidLibrary) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .addRunClasspathFiles(customLib, superclassAsClasspath) + .addRunClasspathFiles(getSuperclassAsClasspath()) .run(parameters.getRuntime(), Executor.class) // The code requires desugaring to be run correctly, but with the classpath superclass, // desugaring is incorrectly performed. The code therefore falls-backs to the default @@ -112,22 +103,17 @@ @Test public void testNullSupertype() throws Exception { - Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters)); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .setMinApi(parameters.getApiLevel()) + Assume.assumeTrue( + requiresAnyCoreLibDesugaring( + parameters.getApiLevel(), libraryDesugaringSpecification != JDK8)); + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Executor.class, LocalClass.class, LocalClassOverride.class) - .addLibraryClasses(CustomLibraryClass.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) + .setCustomLibrarySpecification( + new CustomLibrarySpecification(CustomLibraryClass.class, AndroidApiLevel.B)) + .addKeepMainRule(Executor.class) .compile() .inspectDiagnosticMessages(this::assertWarningInvalidLibrary) - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .addRunClasspathFiles(customLib, superclassAsClasspath) + .addRunClasspathFiles(getSuperclassAsClasspath()) .run(parameters.getRuntime(), Executor.class) // The code requires desugaring to be run correctly, but with the missing supertype, // desugaring could not be performed and the code cannot simply run (Warning was raised).
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java index 8fd4cd4..5389a79 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterableTest.java
@@ -4,17 +4,16 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.MatcherAssert.assertThat; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestRuntime.CfVm; -import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.CodeMatchers; -import java.nio.file.Path; import java.util.Arrays; import java.util.Collection; import java.util.Iterator; @@ -22,7 +21,6 @@ import java.util.function.Consumer; import java.util.stream.Stream; import java.util.stream.StreamSupport; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -31,24 +29,45 @@ @RunWith(Parameterized.class) public class IterableTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED_OUTPUT = StringUtils.lines("1", "2", "3", "4", "5", "Count: 4", "1", "2", "3", "4", "5"); - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + private final TestParameters parameters; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public IterableTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public IterableTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; + } + + @Test + public void testIterable() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) + .compile() + .inspect(this::inspect) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutput(EXPECTED_OUTPUT); } private void inspect(CodeInspector inspector) { + if (compilationSpecification.isProgramShrink()) { + return; + } if (parameters .getApiLevel() .isGreaterThanOrEqualTo(apiLevelWithDefaultInterfaceMethodsSupport())) { @@ -62,71 +81,6 @@ } } - @Test - public void testIterableD8Cf() throws Exception { - // Only test without shrinking desugared library. - Assume.assumeFalse(shrinkDesugaredLibrary); - // Use D8 to desugar with Java classfile output. - Path jar = - testForD8(Backend.CF) - .addInnerClasses(IterableTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .compile() - .inspect(this::inspect) - .writeToZip(); - - if (parameters.getRuntime().isDex()) { - // Convert to DEX without desugaring and run. - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addRunClasspathFiles(buildDesugaredLibrary(parameters.getApiLevel())) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } else { - // Run on the JVM with desugared library on classpath. - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel())) - .run(parameters.getRuntime(), Main.class) - .applyIf( - // TODO(b/227161271): Figure out the cause and resolution for this issue. - parameters.isCfRuntime(CfVm.JDK17) - && parameters.getApiLevel().equals(AndroidApiLevel.B), - r -> r.assertFailureWithErrorThatThrows(ExceptionInInitializerError.class), - r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT)); - } - } - - @Test - public void testIterable() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(IterableTest.class) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(IterableTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } - static class Main { public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java index daa7978..d69ebe8 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IterateTest.java
@@ -4,14 +4,15 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; -import java.nio.file.Path; import java.util.List; import java.util.stream.IntStream; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -20,77 +21,34 @@ @RunWith(Parameterized.class) public class IterateTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; private static final String EXPECTED_OUTPUT = StringUtils.lines("1"); - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + private final TestParameters parameters; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public IterateTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public IterateTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test - public void testIterateD8Cf() throws Exception { - // Only test without shrinking desugared library. - Assume.assumeFalse(shrinkDesugaredLibrary); - // Use D8 to desugar with Java classfile output. - Path jar = - testForD8(Backend.CF) - .addInnerClasses(IterateTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) - .compile() - .writeToZip(); - - if (parameters.getRuntime().isDex()) { - // Convert to DEX without desugaring and run. - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addRunClasspathFiles(buildDesugaredLibrary(parameters.getApiLevel())) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } else { - // Run on the JVM with desugared library on classpath. - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel())) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } - } - - @Test - public void testIterate() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(IterateTest.class) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(IterateTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + public void testIterable() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput(EXPECTED_OUTPUT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java index 3664076..605854a 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/IteratorTest.java
@@ -4,20 +4,19 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8CF2CF_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.fail; -import static org.hamcrest.CoreMatchers.containsString; -import com.android.tools.r8.CompilationFailedException; -import com.android.tools.r8.LibraryDesugaringTestConfiguration.AbsentKeepRuleConsumer; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; -import com.android.tools.r8.utils.DescriptorUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; -import com.android.tools.r8.utils.ZipUtils; -import java.nio.file.Path; +import com.android.tools.r8.utils.codeinspector.ClassSubject; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; import java.util.Iterator; import java.util.List; import java.util.function.Consumer; @@ -29,22 +28,28 @@ @RunWith(Parameterized.class) public class IteratorTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; - private final boolean canUseDefaultAndStaticInterfaceMethods; - private static final String EXPECTED_OUTPUT = StringUtils.lines("1", "2", "3"); - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + private final TestParameters parameters; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; + private final boolean canUseDefaultAndStaticInterfaceMethods; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK, D8CF2CF_L8DEBUG)); } - public IteratorTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public IteratorTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; this.canUseDefaultAndStaticInterfaceMethods = parameters .getApiLevel() @@ -52,126 +57,28 @@ } @Test - public void testIterator() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(IteratorTest.class) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(IteratorTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) + public void testIterator() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Main.class) .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + .inspect(this::assertInterface) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput(EXPECTED_OUTPUT); } - @Test - public void testD8Cf() throws Exception { - // Use D8 to desugar with Java classfile output. - Path firstJar = - testForD8(Backend.CF) - .setMinApi(parameters.getApiLevel()) - .addProgramClasses(Main.class, MyIterator.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), new AbsentKeepRuleConsumer()) - .compile() - .writeToZip(); - - ClassFileInfo info = - extractClassFileInfo( - ZipUtils.readSingleEntry(firstJar, ZipUtils.zipEntryNameForClass(MyIterator.class))); - assertEquals( - MyIterator.class.getTypeName(), - DescriptorUtils.getJavaTypeFromBinaryName(info.getClassBinaryName())); + private void assertInterface(CodeInspector inspector) { + ClassSubject clazz = inspector.clazz(MyIterator.class); assertEquals( canUseDefaultAndStaticInterfaceMethods ? 0 : 1, - info.getInterfaces().stream().filter(name -> name.equals("j$/util/Iterator")).count()); + clazz.getDexProgramClass().getInterfaces().stream() + .filter(name -> name.toString().equals("j$.util.Iterator")) + .count()); assertEquals( canUseDefaultAndStaticInterfaceMethods ? 1 : 2, - info.getMethodNames().stream().filter(name -> name.equals("forEachRemaining")).count()); - - AndroidApiLevel apiLevelNotRequiringDesugaring = AndroidApiLevel.N; - if (parameters.getApiLevel().isLessThan(apiLevelNotRequiringDesugaring)) { - try { - // Use D8 to desugar with Java classfile output. - testForD8(Backend.CF) - .setMinApi(parameters.getApiLevel()) - .addProgramFiles(firstJar) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), new AbsentKeepRuleConsumer()) - .compileWithExpectedDiagnostics( - diagnostics -> - diagnostics.assertErrorsMatch( - diagnosticMessage( - containsString( - "Code has already been library desugared. " - + "Interface Lj$/util/Iterator; is already implemented by " - + "Lcom/android/tools/r8/desugar/desugaredlibrary/" - + "IteratorTest$MyIterator;")))); - fail("Expected failure"); - } catch (CompilationFailedException e) { - // Expected. - } - } - - // Use D8 to desugar with Java classfile output. - Path secondJar = - testForD8(Backend.CF) - .addOptionsModification( - options -> - options.desugarSpecificOptions().allowAllDesugaredInput = - parameters.getApiLevel().isLessThan(apiLevelNotRequiringDesugaring)) - .setMinApi(parameters.getApiLevel()) - .addProgramFiles(firstJar) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), new AbsentKeepRuleConsumer()) - .compile() - .writeToZip(); - - info = - extractClassFileInfo( - ZipUtils.readSingleEntry(secondJar, ZipUtils.zipEntryNameForClass(MyIterator.class))); - assertEquals( - MyIterator.class.getTypeName(), - DescriptorUtils.getJavaTypeFromBinaryName(info.getClassBinaryName())); - assertEquals( - canUseDefaultAndStaticInterfaceMethods ? 0 : 1, - info.getInterfaces().stream().filter(name -> name.equals("j$/util/Iterator")).count()); - assertEquals( - canUseDefaultAndStaticInterfaceMethods ? 1 : 2, - info.getMethodNames().stream().filter(name -> name.equals("forEachRemaining")).count()); - - if (parameters.getRuntime().isDex()) { - // Convert to DEX without desugaring and run. - testForD8() - .addProgramFiles(firstJar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - collectKeepRulesWithTraceReferences( - firstJar, buildDesugaredLibraryClassFile(parameters.getApiLevel())), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } else { - // Run on the JVM with desugared library on classpath. - testForJvm() - .addProgramFiles(firstJar) - .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel())) - .run(parameters.getRuntime(), Main.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } + clazz.getDexProgramClass().allMethodsSorted().stream() + .filter(m -> m.getReference().getName().toString().equals("forEachRemaining")) + .count()); } static class Main {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java index 371443d..18d1613 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
@@ -4,6 +4,8 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static junit.framework.TestCase.assertTrue; import com.android.tools.r8.TestParameters; @@ -11,6 +13,9 @@ import com.android.tools.r8.TestRuntime.CfVm; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.google.common.collect.ImmutableList; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; @@ -27,8 +32,6 @@ @RunWith(Parameterized.class) public class J$ExtensionTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; - private static final String MAIN_CLASS_NAME = "Main"; private static final String MAIN_CLASS = "import java.time.LocalTimeAccess;\n" @@ -51,13 +54,25 @@ + "}"; private static Path[] compiledClasses = new Path[2]; - @Parameters(name = "{0}") + private final TestParameters parameters; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { - return buildParameters(getTestParameters().withAllRuntimes().withAllApiLevels().build()); + return buildParameters( + getTestParameters().withAllRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public J$ExtensionTest(TestParameters parameters) { + public J$ExtensionTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @BeforeClass @@ -134,21 +149,13 @@ } @Test - public void testJ$ExtensionDesugaring() throws Exception { + public void testJ$ExtensionDesugaring() throws Throwable { Assume.assumeFalse(parameters.isCfRuntime()); - // Above O no desugaring is required. Assume.assumeTrue(requiresTimeDesugaring(parameters)); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - String stdErr = - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(compiledClasses) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, parameters.getApiLevel()) .run(parameters.getRuntime(), MAIN_CLASS_NAME) .assertFailure() .getStdErr();
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LocaleDateGetEraTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LocaleDateGetEraTest.java new file mode 100644 index 0000000..6aa9243 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LocaleDateGetEraTest.java
@@ -0,0 +1,134 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary; + +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; +import static org.hamcrest.CoreMatchers.containsString; + +import com.android.tools.r8.SingleTestRunResult; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.transformers.MethodTransformer; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.DescriptorUtils; +import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.time.LocalDate; +import java.time.chrono.ChronoLocalDate; +import java.time.chrono.Era; +import java.time.chrono.IsoEra; +import java.util.Collection; +import java.util.List; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameters; +import org.objectweb.asm.Opcodes; + +@RunWith(Parameterized.class) +public class LocaleDateGetEraTest extends DesugaredLibraryTestBase { + + private static final String EXPECTED_RESULT = StringUtils.lines("CE"); + + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final Class<?> eraClass; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters() + .withAllRuntimes() + .withAllApiLevelsAlsoForCf() + .withApiLevel(AndroidApiLevel.N) + .build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF, + ImmutableList.of(IsoEra.class, Era.class)); + } + + public LocaleDateGetEraTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification, + Class<?> eraClass) { + this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.eraClass = eraClass; + } + + @Test + public void testLocaleDate() throws Throwable { + SingleTestRunResult<?> run = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addProgramClassFileData(getProgramClassFileData()) + .addKeepMainRule(Executor.class) + .run(parameters.getRuntime(), Executor.class); + if (parameters.getRuntime().isCf() + && parameters.getRuntime().asCf().isOlderThan(CfVm.JDK9) + && eraClass == IsoEra.class + // We desugar up to 30 at this point... + && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.S)) { + // The method with the covariant return type is present only from JDK9. + run.assertFailureWithErrorThatMatches( + containsString( + "java.lang.NoSuchMethodError:" + + " java.time.LocalDate.getEra()Ljava/time/chrono/IsoEra;")); + } else if (parameters.getRuntime().isDex() + && eraClass == IsoEra.class + && parameters.getApiLevel().betweenBothIncluded(AndroidApiLevel.O, AndroidApiLevel.S) + && libraryDesugaringSpecification == JDK8) { + // No support for this desugaring in JDK8 desugared library. + run.assertFailureWithErrorThatMatches(containsString("java.lang.NoSuchMethodError")); + } else { + run.assertSuccessWithOutput(EXPECTED_RESULT); + } + } + + private Collection<byte[]> getProgramClassFileData() throws IOException { + return ImmutableList.of( + transformer(Executor.class) + .addMethodTransformer( + new MethodTransformer() { + @Override + public void visitMethodInsn( + int opcode, + String owner, + String name, + String descriptor, + boolean isInterface) { + if (opcode == Opcodes.INVOKEINTERFACE && name.equals("getEra")) { + super.visitMethodInsn( + Opcodes.INVOKEVIRTUAL, + "java/time/LocalDate", + name, + "()" + DescriptorUtils.javaTypeToDescriptor(eraClass.getTypeName()), + false); + return; + } + if (opcode == Opcodes.CHECKCAST) { + return; + } + super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); + } + }) + .transform()); + } + + static class Executor { + + public static void main(String[] args) { + System.out.println(((ChronoLocalDate) LocalDate.ofEpochDay(123456789L)).getEra()); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java index 568de28..ccef7e8 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
@@ -5,6 +5,7 @@ package com.android.tools.r8.desugar.desugaredlibrary; import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification.EXTENSION_PATH; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; import static org.hamcrest.CoreMatchers.containsString; @@ -22,7 +23,7 @@ import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11DesugaredLibraryTestBase; +import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification; import com.android.tools.r8.errors.DuplicateTypesDiagnostic; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.codeinspector.CodeInspector; @@ -30,13 +31,14 @@ import com.google.common.collect.ImmutableMap; import java.nio.file.Path; import java.util.List; +import org.junit.Assume; 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 MergingJ$Test extends Jdk11DesugaredLibraryTestBase { +public class MergingJ$Test extends DesugaredLibraryTestBase { @Parameters(name = "{0}") public static TestParametersCollection data() { @@ -118,12 +120,16 @@ } private Path buildSplitDesugaredLibraryPart2() throws Exception { + Assume.assumeFalse( + "getAllFilesWithSuffixInDirectory() seems to find different files on Windows", + ToolHelper.isWindows()); Path outputDex = temp.newFolder().toPath().resolve("merger-input-split-dex.zip"); + Jdk11TestLibraryDesugaringSpecification.setUp(); L8.run( L8Command.builder() .addLibraryFiles(getLibraryFile()) .addLibraryFiles(ToolHelper.getDesugarJDKLibs()) - .addProgramFiles(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES) + .addProgramFiles(EXTENSION_PATH) .addDesugaredLibraryConfiguration( StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting())) .setMinApiLevel(AndroidApiLevel.B.getLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java index 6eeabe2..cfb5b67 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingWithDesugaredLibraryTest.java
@@ -26,7 +26,6 @@ import com.android.tools.r8.TestDiagnosticMessages; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11DesugaredLibraryTestBase; import com.android.tools.r8.dex.Marker; import com.android.tools.r8.dex.Marker.Tool; import com.android.tools.r8.utils.AndroidApiLevel; @@ -40,7 +39,7 @@ import org.junit.runners.Parameterized; @RunWith(Parameterized.class) -public class MergingWithDesugaredLibraryTest extends Jdk11DesugaredLibraryTestBase { +public class MergingWithDesugaredLibraryTest extends DesugaredLibraryTestBase { private static final String JAVA_RESULT = "java.util.stream.ReferencePipeline$Head"; private static final String J$_RESULT = "j$.util.stream.ReferencePipeline$Head";
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java index 44625b1..a343168 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ReleasedVersionsSmokeTest.java
@@ -4,12 +4,18 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import com.android.tools.r8.CompilationMode; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; -import com.android.tools.r8.LibraryDesugaringTestConfiguration.Configuration; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_LEGACY; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; + import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; import java.time.Clock; import java.time.Duration; import java.time.ZoneId; @@ -22,73 +28,60 @@ @RunWith(Parameterized.class) public class ReleasedVersionsSmokeTest extends DesugaredLibraryTestBase { + private static final String EXPECTED_OUTPUT = + StringUtils.lines( + "true", + "Caught java.time.format.DateTimeParseException", + "true", + "1970-01-02T10:17:36.789Z", + "GMT", + "GMT", + "1000", + "Hello, world"); + private static final String EXPECTED_OUTPUT_1_0_9 = + StringUtils.lines( + "true", + "Caught java.time.format.DateTimeParseException", + "true", + "1970-01-02T10:17:36.789Z", + "1000", + "Hello, world"); + private final TestParameters parameters; - private final Configuration configuration; - private static final String expectedOutput = - StringUtils.lines( - "true", - "Caught java.time.format.DateTimeParseException", - "true", - "1970-01-02T10:17:36.789Z", - "GMT", - "GMT", - "1000", - "Hello, world"); - private static final String expectedOutput_1_0_9 = - StringUtils.lines( - "true", - "Caught java.time.format.DateTimeParseException", - "true", - "1970-01-02T10:17:36.789Z", - "1000", - "Hello, world"); + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}, {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { + ImmutableList.Builder<LibraryDesugaringSpecification> builder = ImmutableList.builder(); + builder.addAll(LibraryDesugaringSpecification.getReleased()); + builder.add(JDK8, JDK11, JDK11_LEGACY, JDK11_PATH); return buildParameters( - Configuration.getReleased(), - getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.B).build()); + getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.B).build(), + builder.build(), + DEFAULT_SPECIFICATIONS); } - public ReleasedVersionsSmokeTest(Configuration configuration, TestParameters parameters) { - this.configuration = configuration; + public ReleasedVersionsSmokeTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testD8() throws Exception { - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(ReleasedVersionsSmokeTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.builder() - .setMinApi(parameters.getApiLevel()) - .setConfiguration(configuration) - .withKeepRuleConsumer() - .setMode(CompilationMode.DEBUG) - .build()) - .run(parameters.getRuntime(), TestClass.class, configuration.name()) - .assertSuccessWithOutput( - configuration != Configuration.RELEASED_1_0_9 ? expectedOutput : expectedOutput_1_0_9); - } - - @Test - public void testR8() throws Exception { - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(ReleasedVersionsSmokeTest.class) + public void testSmoke() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(TestClass.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.builder() - .setMinApi(parameters.getApiLevel()) - .withKeepRuleConsumer() - .setMode(CompilationMode.RELEASE) - .build()) - .run(parameters.getRuntime(), TestClass.class, configuration.name()) + .ignoreL8FinalPrefixVerification() + .run(parameters.getRuntime(), TestClass.class, libraryDesugaringSpecification.toString()) .assertSuccessWithOutput( - configuration != Configuration.RELEASED_1_0_9 ? expectedOutput : expectedOutput_1_0_9); + libraryDesugaringSpecification != LibraryDesugaringSpecification.RELEASED_1_0_9 + ? EXPECTED_OUTPUT + : EXPECTED_OUTPUT_1_0_9); } static class TestClass { @@ -106,7 +99,7 @@ java.util.Date.from(new java.util.Date(123456789).toInstant()).toInstant()); // Support for this was added in 1.0.10. - if (!configurationVersion.equals("RELEASED_1_0_9")) { + if (!configurationVersion.equals("RELEASED_1.0.9")) { java.util.TimeZone timeZone = java.util.TimeZone.getTimeZone(ZoneId.of("GMT")); System.out.println(timeZone.getID()); System.out.println(timeZone.toZoneId().getId());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java index 5780701..6a957ef 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RequiredNonNullWithSupplierTest.java
@@ -4,8 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.util.List; import java.util.Objects; @@ -13,6 +17,7 @@ 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 RequiredNonNullWithSupplierTest extends DesugaredLibraryTestBase { @@ -20,41 +25,31 @@ private static final String EXPECTED_OUTPUT = StringUtils.lines("SuppliedString2", "OK"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameterized.Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withAllRuntimesAndApiLevels().build()); + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } public RequiredNonNullWithSupplierTest( - boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testRequiredNonNullWithSupplierTest() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(RequiredNonNullWithSupplierTest.class) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(RequiredNonNullWithSupplierTest.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setMinApi(parameters.getApiLevel()) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + public void testRequireNonNull() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_OUTPUT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java index 50f2ce7..6d0d72f 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
@@ -7,6 +7,9 @@ import static org.junit.Assert.assertTrue; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestRuntime.CfVm; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.ToolHelper.DexVm.Version; import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification; import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyRewritingFlags; import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyTopLevelFlags; @@ -27,15 +30,16 @@ @RunWith(Parameterized.class) public class RetargetAndBackportTest extends DesugaredLibraryTestBase implements Opcodes { - Backend backend; + private final TestParameters parameters; @Parameters(name = "{0} {1}") public static List<Object[]> data() { - return buildParameters(getTestParameters().withNoneRuntime().build(), Backend.values()); + return buildParameters( + getTestParameters().withDexRuntime(Version.DEFAULT).withCfRuntime(CfVm.JDK11).build()); } - public RetargetAndBackportTest(TestParameters parameters, Backend backend) { - this.backend = backend; + public RetargetAndBackportTest(TestParameters parameters) { + this.parameters = parameters; } /** @@ -60,10 +64,10 @@ @Test public void test() throws Exception { - testForL8(AndroidApiLevel.B, backend) + testForL8(AndroidApiLevel.B, parameters.getBackend()) .noDefaultDesugarJDKLibs() .addProgramClassFileData(dump()) - .addLibraryFiles(getLibraryFile()) + .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P.getLevel())) .addOptionsModifier(RetargetAndBackportTest::specifyDesugaredLibrary) .compile() .inspect(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java index 5d9cf31..10f3ada 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -4,9 +4,12 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; -import java.nio.file.Path; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.time.Instant; import java.time.ZonedDateTime; import java.util.Date; @@ -14,7 +17,6 @@ import java.util.List; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.IntUnaryOperator; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -24,119 +26,33 @@ public class RetargetOverrideTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrink: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), - getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build()); + getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public RetargetOverrideTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public RetargetOverrideTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testRetargetOverrideCf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path desugaredTwice = - testForD8(Backend.CF) - .addLibraryFiles(getLibraryFile()) - .addProgramFiles( - testForD8(Backend.CF) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(RetargetOverrideTest.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setMinApi(parameters.getApiLevel()) - .compile() - .writeToZip()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setMinApi(parameters.getApiLevel()) - .addOptionsModification( - options -> options.desugarSpecificOptions().allowAllDesugaredInput = true) - .compile() - .writeToZip(); - - String stdout; - if (parameters.getRuntime().isDex()) { - // Convert to DEX without desugaring and run. - stdout = - testForD8(Backend.DEX) - .addProgramFiles(desugaredTwice) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run( - parameters.getRuntime(), - Executor.class, - Boolean.toString(parameters.getRuntime().isCf())) - .assertSuccess() - .getStdOut(); - } else { - // Run on the JVM with desugared library on classpath. - stdout = - testForJvm() - .addProgramFiles(desugaredTwice) - .addRunClasspathFiles(buildDesugaredLibraryClassFile(parameters.getApiLevel())) - .run( - parameters.getRuntime(), - Executor.class, - Boolean.toString(parameters.getRuntime().isCf())) - .assertSuccess() - .getStdOut(); - } - assertLines2By2Correct(stdout); - } - - @Test - public void testRetargetOverrideD8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); + public void testRetargetOverride() throws Throwable { String stdout = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(RetargetOverrideTest.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setMinApi(parameters.getApiLevel()) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run( - parameters.getRuntime(), - Executor.class, - Boolean.toString(parameters.getRuntime().isCf())) - .assertSuccess() - .getStdOut(); - assertLines2By2Correct(stdout); - } - - @Test - public void testRetargetOverrideR8() throws Exception { - Assume.assumeTrue(parameters.getRuntime().isDex()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - String stdout = - testForR8(Backend.DEX) - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Executor.class) - .addInnerClasses(RetargetOverrideTest.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .setMinApi(parameters.getApiLevel()) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run( parameters.getRuntime(), Executor.class,
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java index ffd4166..3cdfedb 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SimpleStreamTest.java
@@ -4,12 +4,17 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; +import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -21,52 +26,32 @@ private static final String EXPECTED_RESULT = StringUtils.lines("3"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public SimpleStreamTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public SimpleStreamTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testStreamD8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(SimpleStreamTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_RESULT); - } - - @Test - public void testStreamR8() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(Backend.DEX) - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(SimpleStreamTest.class) - .setMinApi(parameters.getApiLevel()) - .addKeepClassAndMembersRules(Executor.class) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + public void testSimpleStream() throws Throwable { + Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters)); + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_RESULT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java index 1fc77de..7b45541 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SpliteratorTest.java
@@ -4,12 +4,17 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static junit.framework.TestCase.assertTrue; -import com.android.tools.r8.LibraryDesugaringTestConfiguration; import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.Comparator; import java.util.LinkedList; @@ -23,7 +28,6 @@ @RunWith(Parameterized.class) public class SpliteratorTest extends DesugaredLibraryTestBase { - private final TestParameters parameters; private static final String EXPECTED_OUTPUT_JDK11 = StringUtils.lines( "j$.util.AbstractList$RandomAccessSpliterator", @@ -37,29 +41,37 @@ "j$.util.Spliterators$IteratorSpliterator", "j$.util.Spliterators$IteratorSpliterator"); - @Parameters(name = "{0}") + private final TestParameters parameters; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { - return buildParameters(getTestParameters().withDexRuntimes().withAllApiLevels().build()); + return buildParameters( + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + ImmutableList.of(D8_L8DEBUG)); } - public SpliteratorTest(TestParameters parameters) { + public SpliteratorTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testSpliterator() throws Exception { + public void testSpliterator() throws Throwable { Assume.assumeTrue(requiresEmulatedInterfaceCoreLibDesugaring(parameters)); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(SpliteratorTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring( - LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel())) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .compile() .inspect(this::validateInterfaces) .run(parameters.getRuntime(), Main.class) .assertSuccessWithOutput( - isJDK11DesugaredLibrary() ? EXPECTED_OUTPUT_JDK11 : EXPECTED_OUTPUT_JDK8); + libraryDesugaringSpecification != JDK8 ? EXPECTED_OUTPUT_JDK11 : EXPECTED_OUTPUT_JDK8); } private void validateInterfaces(CodeInspector inspector) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java index f36ae99..d8f056b 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/StaticInterfaceMethodTest.java
@@ -4,16 +4,16 @@ package com.android.tools.r8.desugar.desugaredlibrary; -import static org.junit.Assert.assertEquals; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.SPECIFICATIONS_WITH_CF2CF; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; -import java.nio.file.Path; import java.time.chrono.Chronology; import java.util.List; import java.util.Map; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -25,102 +25,31 @@ private static final String EXPECTED_OUTPUT = StringUtils.lines("false", "java.util.HashSet"); private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build(), - BooleanUtils.values()); + getJdk8Jdk11(), + SPECIFICATIONS_WITH_CF2CF); } - public StaticInterfaceMethodTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public StaticInterfaceMethodTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testStaticInterfaceMethodsD8() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addInnerClasses(StaticInterfaceMethodTest.class) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addInnerClasses(StaticInterfaceMethodTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } - - @Test - public void testStaticInterfaceMethodsD8CfToCf() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - Path jar = - testForD8(Backend.CF) - .addInnerClasses(StaticInterfaceMethodTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .writeToZip(); - - String desugaredLibraryKeepRules = ""; - if (shrinkDesugaredLibrary && keepRuleConsumer.get() != null) { - // Collection keep rules is only implemented in the DEX writer. - assertEquals(0, keepRuleConsumer.get().length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - if (parameters.getRuntime().isDex()) { - testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } else { - testForJvm() - .addProgramFiles(jar) - .addRunClasspathFiles(getDesugaredLibraryInCF(parameters, options -> {})) - .run(parameters.getRuntime(), Executor.class) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } - } - - @Test - public void testStaticInterfaceMethodsR8() throws Exception { - // Desugared library tests do not make sense in the Cf to Cf, and the JVM is already tested - // in the D8 test. Just return. - Assume.assumeFalse(parameters.isCfRuntime()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) + public void testStaticInterfaceMethods() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) + .addInnerClasses(getClass()) .addKeepMainRule(Executor.class) - .addInnerClasses(StaticInterfaceMethodTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(EXPECTED_OUTPUT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java index 025740b..3bff859 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/SynchronizedCollectionTest.java
@@ -4,15 +4,18 @@ package com.android.tools.r8.desugar.desugaredlibrary; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestRuntime.CfVm; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; -import org.junit.Assume; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; @@ -28,9 +31,10 @@ private static final String MAIN_CLASS = "desugaredlib.SynchronizedCollectionMain"; private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final CompilationSpecification compilationSpecification; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; - @Parameters(name = "{0}, shrinkDesugaredLibrary: {1}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( getTestParameters() @@ -38,57 +42,24 @@ .withAllApiLevels() .withCfRuntimesStartingFromIncluding(CfVm.JDK9) .build(), - BooleanUtils.values()); + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public SynchronizedCollectionTest(TestParameters parameters, boolean shrinkDesugaredLibrary) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public SynchronizedCollectionTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.compilationSpecification = compilationSpecification; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; } @Test - public void testExecutionD8() throws Exception { - if (parameters.isCfRuntime()) { - testForJvm() - .addProgramFiles(INPUT_JAR) - .run(parameters.getRuntime(), MAIN_CLASS) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(INPUT_JAR) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .run(parameters.getRuntime(), MAIN_CLASS) - .assertSuccessWithOutput(EXPECTED_OUTPUT); - } - - @Test - public void testExecutionR8() throws Exception { - // Desugared library tests do not make sense in the Cf to Cf, and the JVM is already tested - // in the D8 test. Just return. - Assume.assumeFalse(parameters.isCfRuntime()); - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForR8(parameters.getBackend()) - .addLibraryFiles(getLibraryFile()) + public void testExecution() throws Throwable { + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(INPUT_JAR) .addKeepMainRule(MAIN_CLASS) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) .run(parameters.getRuntime(), MAIN_CLASS) .assertSuccessWithOutput(EXPECTED_OUTPUT); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java index 44ef579..367d791 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionTest.java
@@ -5,8 +5,10 @@ import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_LEGACY; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH; import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; -import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; import static org.hamcrest.CoreMatchers.endsWith; import static org.hamcrest.core.StringContains.containsString; @@ -16,6 +18,7 @@ import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; import java.util.Arrays; import java.util.List; import java.util.Random; @@ -42,7 +45,7 @@ public static List<Object[]> data() { return buildParameters( getConversionParametersUpToExcluding(MIN_SUPPORTED), - getJdk8Jdk11(), + ImmutableList.of(JDK8, JDK11, JDK11_LEGACY, JDK11_PATH), DEFAULT_SPECIFICATIONS); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java index 3ae7873..24169b1 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -8,7 +8,6 @@ import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertTrue; -import com.android.tools.r8.StringResource; import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; @@ -44,11 +43,7 @@ @Test public void testConversionsDex() throws Exception { testForL8(parameters.getApiLevel()) - .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar()) - .noDefaultDesugarJDKLibs() - .addProgramFiles(libraryDesugaringSpecification.getDesugarJdkLibs()) - .setDesugaredLibraryConfiguration( - StringResource.fromFile(libraryDesugaringSpecification.getSpecification())) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) .compile() .apply(c -> checkConversionGeneratedDex(c.inspector())); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java index a6eafe8..366e029 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/GetGenericInterfaceTest.java
@@ -83,8 +83,9 @@ String[] lines = stdOut.split("\n"); for (int i = 0; i < lines.length; i += 4) { String className = lines[i]; - String[] interfaces1 = lines[i + 1].split("(, com|, interface|, j)"); - String[] interfaces2 = lines[i + 2].split("(, com|, interface|, j)"); + String[] interfaces1 = lines[i + 1].substring(1, lines[i + 1].length() - 1).split(","); + String[] interfaces2 = + lines[i + 2].substring(1, lines[i + 2].length() - 1).split("(>, |, interface)"); assertEquals( "Invalid number of interfaces in " + className @@ -95,7 +96,7 @@ interfaces1.length, interfaces2.length); // Ignore the empty list of interface case. - if (!interfaces1[0].equals("[]")) { + if (!interfaces1[0].isEmpty()) { for (int j = 0; j < interfaces1.length; j++) { String interfaceName = interfaces1[j].substring("interface ".length()).trim(); while (interfaceName.charAt(interfaceName.length() - 1) == ']') {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java index cf2a39c..f586605 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11AtomicTests.java
@@ -5,6 +5,8 @@ package com.android.tools.r8.desugar.desugaredlibrary.jdktests; import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.getPathsFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.testNGSupportProgramFiles; import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11; @@ -18,6 +20,7 @@ import com.android.tools.r8.TestRuntime; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; @@ -33,7 +36,7 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) -public class Jdk11AtomicTests extends Jdk11DesugaredLibraryTestBase { +public class Jdk11AtomicTests extends DesugaredLibraryTestBase { private static final Path ATOMIC_TESTS_FOLDER = Paths.get(ToolHelper.JDK_11_TESTS_DIR + "java/util/concurrent/atomic/");
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java index 0aa3ab9..0c4e38a 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11ConcurrentMapTests.java
@@ -5,6 +5,8 @@ package com.android.tools.r8.desugar.desugaredlibrary.jdktests; import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.getPathsFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.testNGSupportProgramFiles; import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11; @@ -18,6 +20,7 @@ import com.android.tools.r8.TestRuntime; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult; import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; @@ -35,7 +38,7 @@ import org.junit.runners.Parameterized.Parameters; @RunWith(Parameterized.class) -public class Jdk11ConcurrentMapTests extends Jdk11DesugaredLibraryTestBase { +public class Jdk11ConcurrentMapTests extends DesugaredLibraryTestBase { private static final Path CONCURRENT_TESTS_FOLDER = Paths.get(ToolHelper.JDK_11_TESTS_DIR + "java/util/concurrent/ConcurrentMap/");
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11DesugaredLibraryTestBase.java deleted file mode 100644 index 248302a..0000000 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11DesugaredLibraryTestBase.java +++ /dev/null
@@ -1,114 +0,0 @@ -// Copyright (c) 2019, 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.desugar.desugaredlibrary.jdktests; - -import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; -import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION; -import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION; - -import com.android.tools.r8.TestRuntime; -import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; -import com.android.tools.r8.utils.AndroidApiLevel; -import com.google.common.collect.ImmutableList; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; -import org.junit.BeforeClass; - -// Provides convenience to use Paths/SafeVarargs which are missing on old Android but -// required by some Jdk tests, and for java.base extensions. - -public class Jdk11DesugaredLibraryTestBase extends DesugaredLibraryTestBase { - - protected static Path[] JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES; - static Path JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR; - private static final Path JDK_11_JAVA_BASE_EXTENSION_FILES_DIR = - Paths.get("third_party/openjdk/jdk-11-test/lib/testlibrary/bootlib/java.base"); - - private static final Path ANDROID_PATHS_FILES_DIR = - Paths.get("third_party/android_jar/lib-v26/xxx/"); - private static final Path ANDROID_SAFE_VAR_ARGS_LOCATION = - Paths.get("third_party/android_jar/lib-v26/java/lang/SafeVarargs.class"); - private static final Path[] ANDROID_PATHS_FILES = - new Path[] { - Paths.get("java/nio/file/Files.class"), - Paths.get("java/nio/file/OpenOption.class"), - Paths.get("java/nio/file/Watchable.class"), - Paths.get("java/nio/file/Path.class"), - Paths.get("java/nio/file/Paths.class") - }; - - protected static Path[] getPathsFiles() { - return Arrays.stream(ANDROID_PATHS_FILES) - .map(ANDROID_PATHS_FILES_DIR::resolve) - .toArray(Path[]::new); - } - - protected static Path getSafeVarArgsFile() { - return ANDROID_SAFE_VAR_ARGS_LOCATION; - } - - protected static Path[] testNGSupportProgramFiles() { - return new Path[] { - Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"), - Paths.get(JDK_TESTS_BUILD_DIR + "jcommander-1.48.jar"), - Paths.get(ToolHelper.JAVA_CLASSES_DIR + "examplesTestNGRunner/TestNGMainRunner.class") - }; - } - - private static Path[] getJavaBaseExtensionsFiles() throws Exception { - Path[] files = - getAllFilesWithSuffixInDirectory(JDK_11_JAVA_BASE_EXTENSION_FILES_DIR, JAVA_EXTENSION); - assert files.length > 0; - return files; - } - - @BeforeClass - public static void compileJavaBaseExtensions() throws Exception { - JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR = getStaticTemp().newFolder("jdk11JavaBaseExt").toPath(); - List<String> options = - Arrays.asList( - "--add-reads", - "java.base=ALL-UNNAMED", - "--patch-module", - "java.base=" + JDK_11_JAVA_BASE_EXTENSION_FILES_DIR); - javac(TestRuntime.getCheckedInJdk11(), getStaticTemp()) - .addOptions(options) - .addClasspathFiles( - Collections.singletonList(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))) - .addSourceFiles(getJavaBaseExtensionsFiles()) - .setOutputPath(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR) - .compile(); - JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES = - getAllFilesWithSuffixInDirectory(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR, CLASS_EXTENSION); - assert JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES.length > 0; - } - - private String getTestNGKeepRules() { - // Keep data providers and their annotations. - return "-keepclasseswithmembers class * {\n" - + " @org.testng.annotations.DataProvider <methods>;\n" - + "}\n" - + "-keepattributes *Annotation*\n" - // Do not even attempt to shrink testNG (unrelated to desugared lib shrinking goal). - + "-keep class org.testng.** { *; }\n" - // There are missing classes in testNG. - + "-dontwarn"; - } - - protected Path buildDesugaredLibraryWithJavaBaseExtension( - AndroidApiLevel apiLevel, String keepRules, boolean shrink) { - // there are missing classes from testNG. - keepRules = getTestNGKeepRules() + keepRules; - return buildDesugaredLibrary( - apiLevel, - keepRules, - shrink, - ImmutableList.copyOf(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES)); - } -}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Paths.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Paths.java new file mode 100644 index 0000000..1409b1b --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Paths.java
@@ -0,0 +1,49 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; + +import com.android.tools.r8.ToolHelper; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.Arrays; + +// Provides convenience to use Paths/SafeVarargs which are missing on old Android but +// required by some Jdk tests, and for java.base extensions. + +public class Jdk11Paths { + + private static final Path ANDROID_PATHS_FILES_DIR = + Paths.get("third_party/android_jar/lib-v26/xxx/"); + private static final Path ANDROID_SAFE_VAR_ARGS_LOCATION = + Paths.get("third_party/android_jar/lib-v26/java/lang/SafeVarargs.class"); + private static final Path[] ANDROID_PATHS_FILES = + new Path[] { + Paths.get("java/nio/file/Files.class"), + Paths.get("java/nio/file/OpenOption.class"), + Paths.get("java/nio/file/Watchable.class"), + Paths.get("java/nio/file/Path.class"), + Paths.get("java/nio/file/Paths.class") + }; + + public static Path[] getPathsFiles() { + return Arrays.stream(ANDROID_PATHS_FILES) + .map(ANDROID_PATHS_FILES_DIR::resolve) + .toArray(Path[]::new); + } + + public static Path getSafeVarArgsFile() { + return ANDROID_SAFE_VAR_ARGS_LOCATION; + } + + public static Path[] testNGSupportProgramFiles() { + return new Path[] { + Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"), + Paths.get(JDK_TESTS_BUILD_DIR + "jcommander-1.48.jar"), + Paths.get(ToolHelper.JAVA_CLASSES_DIR + "examplesTestNGRunner/TestNGMainRunner.class") + }; + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream1Tests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream1Tests.java new file mode 100644 index 0000000..c11f498 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream1Tests.java
@@ -0,0 +1,28 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class Jdk11Stream1Tests extends Jdk11StreamAbstractTests { + + public Jdk11Stream1Tests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + super(parameters, libraryDesugaringSpecification, compilationSpecification); + } + + @Test + public void testStream() throws Throwable { + testStream(firstHalf(getSuccessfulTests()), firstHalf(getFailingTests())); + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream2Tests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream2Tests.java new file mode 100644 index 0000000..607e0ad --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11Stream2Tests.java
@@ -0,0 +1,28 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class Jdk11Stream2Tests extends Jdk11StreamAbstractTests { + + public Jdk11Stream2Tests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + super(parameters, libraryDesugaringSpecification, compilationSpecification); + } + + @Test + public void testStream() throws Throwable { + testStream(secondHalf(getSuccessfulTests()), secondHalf(getFailingTests())); + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java similarity index 66% rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java index 3b6ae0a..b6b3cb1 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamAbstractTests.java
@@ -1,65 +1,88 @@ -// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.getPathsFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.getSafeVarArgsFile; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.testNGSupportProgramFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification.EXTENSION_PATH; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification.JDK11_PATH_JAVA_BASE_EXT; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification.JDK8_JAVA_BASE_EXT; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8CF2CF_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION; import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION; -import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import com.android.tools.r8.D8TestCompileResult; -import com.android.tools.r8.D8TestRunResult; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; import java.nio.file.Path; import java.nio.file.Paths; +import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; +import java.util.Comparator; +import java.util.HashMap; import java.util.IdentityHashMap; import java.util.List; import java.util.Map; import java.util.stream.Collectors; import org.junit.Assume; import org.junit.BeforeClass; -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 Jdk11StreamTests extends Jdk11DesugaredLibraryTestBase { +public abstract class Jdk11StreamAbstractTests extends DesugaredLibraryTestBase { - private final boolean useCf2Cf; - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + final TestParameters parameters; + final LibraryDesugaringSpecification libraryDesugaringSpecification; + final CompilationSpecification compilationSpecification; - @Parameters(name = "{2}, shrinkDesugaredLibrary: {0}, useCf2Cf: {1}") - public static List<Object[]> data() { - // TODO(134732760): Support Dalvik VMs, currently fails because libjavacrypto is required and - // present only in ART runtimes. + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() throws Exception { + List<LibraryDesugaringSpecification> specs; + if (ToolHelper.isWindows()) { + // The library configuration is not available on windows. Do not run anything. + specs = ImmutableList.of(); + } else { + Jdk11TestLibraryDesugaringSpecification.setUp(); + specs = ImmutableList.of(JDK8_JAVA_BASE_EXT, JDK11_PATH_JAVA_BASE_EXT); + } return buildParameters( - BooleanUtils.values(), - BooleanUtils.values(), + // TODO(134732760): Support Dalvik VMs, currently fails because libjavacrypto is required + // and present only in ART runtimes. getTestParameters() .withDexRuntimesStartingFromIncluding(Version.V5_1_1) .withAllApiLevels() - .build()); + .withApiLevel(AndroidApiLevel.N) + .build(), + specs, + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK, D8CF2CF_L8DEBUG)); } - public Jdk11StreamTests( - boolean shrinkDesugaredLibrary, boolean useCf2Cf, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; - this.useCf2Cf = useCf2Cf; + public Jdk11StreamAbstractTests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } private static Path JDK_11_STREAM_TEST_CLASSES_DIR; @@ -154,7 +177,7 @@ }; private boolean streamCloseTestShouldSucceed() { - if (!isJDK11DesugaredLibrary()) { + if (libraryDesugaringSpecification == JDK8_JAVA_BASE_EXT) { return false; } // TODO(b/216047740): Investigate if this runs on Dalvik VMs. @@ -162,9 +185,9 @@ return parameters.getDexRuntimeVersion().isNewerThan(Version.V4_4_4); } - private Map<String, String> getSuccessfulTests() { + Map<String, String> getSuccessfulTests() { Map<String, String> runnableTests = getRunnableTests(SUCCESSFUL_RUNNABLE_TESTS); - if (isJDK11DesugaredLibrary()) { + if (libraryDesugaringSpecification != JDK8_JAVA_BASE_EXT) { runnableTests.putAll(getRunnableTests(SUCCESSFUL_RUNNABLE_TESTS_ON_JDK11_ONLY)); if (parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V7_0_0)) { runnableTests.putAll(getRunnableTests(SUCCESSFUL_RUNNABLE_TESTS_ON_JDK11_AND_V7)); @@ -176,9 +199,9 @@ return runnableTests; } - private Map<String, String> getFailingTests() { + Map<String, String> getFailingTests() { Map<String, String> runnableTests = getRunnableTests(FAILING_RUNNABLE_TESTS); - if (!isJDK11DesugaredLibrary()) { + if (libraryDesugaringSpecification == JDK8_JAVA_BASE_EXT) { runnableTests.putAll(getRunnableTests(SUCCESSFUL_RUNNABLE_TESTS_ON_JDK11_ONLY)); runnableTests.putAll(getRunnableTests(SUCCESSFUL_RUNNABLE_TESTS_ON_JDK11_AND_V7)); } else if (!parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V7_0_0)) { @@ -227,11 +250,11 @@ "--add-reads", "java.base=ALL-UNNAMED", "--patch-module", - "java.base=" + JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR); + "java.base=" + EXTENSION_PATH); javac(TestRuntime.getCheckedInJdk11(), getStaticTemp()) .addOptions(options) .addClasspathFiles( - Collections.singletonList(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))) + ImmutableList.of(EXTENSION_PATH, Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))) .addSourceFiles(getJdk11StreamTestFiles()) .setOutputPath(JDK_11_STREAM_TEST_CLASSES_DIR) .compile(); @@ -240,8 +263,29 @@ assert JDK_11_STREAM_TEST_COMPILED_FILES.length > 0; } - @Test - public void testStream() throws Exception { + Map<String, String> firstHalf(Map<String, String> input) { + return half(input, true); + } + + Map<String, String> secondHalf(Map<String, String> input) { + return half(input, false); + } + + private Map<String, String> half(Map<String, String> input, boolean first) { + ArrayList<String> keys = new ArrayList<>(input.keySet()); + keys.sort(Comparator.naturalOrder()); + int length = keys.size(); + int middle = length / 2 + length % 2; + List<String> half = first ? keys.subList(0, middle) : keys.subList(middle, length); + HashMap<String, String> newMap = new HashMap<>(); + for (String key : half) { + newMap.put(key, input.get(key)); + } + return newMap; + } + + public void testStream(Map<String, String> successes, Map<String, String> failures) + throws Throwable { Assume.assumeFalse( "getAllFilesWithSuffixInDirectory() seems to find different files on Windows", ToolHelper.isWindows()); @@ -249,102 +293,58 @@ "Requires Java base extensions, should add it when not desugaring", parameters.getApiLevel().getLevel() < AndroidApiLevel.N.getLevel()); - D8TestCompileResult compileResult = compileStreamTestsToDex(useCf2Cf); - runSuccessfulTests(compileResult); - runFailingTests(compileResult); + DesugaredLibraryTestCompileResult<?> compileResult = compileStreamTestsToDex(); + runSuccessfulTests(compileResult, successes); + runFailingTests(compileResult, failures); } - private D8TestCompileResult compileStreamTestsToDex(boolean cf2cf) throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); + DesugaredLibraryTestCompileResult<?> compileStreamTestsToDex() throws Exception { List<Path> filesToCompile = Arrays.stream(JDK_11_STREAM_TEST_COMPILED_FILES) .filter(file -> !file.toString().contains("lang/invoke")) .collect(Collectors.toList()); - - if (cf2cf) { - Path jar = - testForD8(Backend.CF) - .addProgramFiles(filesToCompile) - .addProgramFiles(getPathsFiles()) - .addProgramFiles(getSafeVarArgsFile()) - .addProgramFiles(testNGSupportProgramFiles()) - .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true) - .addLibraryFiles(getLibraryFile()) - .addLibraryFiles(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .allowStdoutMessages() - .compile() - .writeToZip(); - // Collection keep rules is only implemented in the DEX writer. - String desugaredLibraryKeepRules = keepRuleConsumer.get(); - if (desugaredLibraryKeepRules != null) { - assertEquals(0, desugaredLibraryKeepRules.length()); - desugaredLibraryKeepRules = "-keep class * { *; }"; - } - return testForD8() - .addProgramFiles(jar) - .setMinApi(parameters.getApiLevel()) - .disableDesugaring() - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibraryWithJavaBaseExtension, - parameters.getApiLevel(), - desugaredLibraryKeepRules, - shrinkDesugaredLibrary) - .withArtFrameworks() - .withArt6Plus64BitsLib(); - - } else { - - return testForD8() - .addProgramFiles(filesToCompile) - .addProgramFiles(getPathsFiles()) - .addProgramFiles(getSafeVarArgsFile()) - .addProgramFiles(testNGSupportProgramFiles()) - .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true) - .addLibraryFiles(getLibraryFile()) - .addLibraryFiles(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibraryWithJavaBaseExtension, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) - .withArtFrameworks() - .withArt6Plus64BitsLib(); - } + return testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) + .addProgramFiles(filesToCompile) + .applyIf( + libraryDesugaringSpecification != JDK11_PATH_JAVA_BASE_EXT, + b -> b.addProgramFiles(getPathsFiles())) + .addProgramFiles(getSafeVarArgsFile()) + .addProgramFiles(testNGSupportProgramFiles()) + .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true) + .disableL8AnnotationRemoval() + .compile() + .withArt6Plus64BitsLib(); } - private void runSuccessfulTests(D8TestCompileResult compileResult) throws Exception { - String verbosity = "2"; // Increase verbosity for debugging. - Map<String, String> runnableTests = getSuccessfulTests(); - for (String path : runnableTests.keySet()) { - assert runnableTests.get(path) != null; - D8TestRunResult result = + private void runSuccessfulTests( + DesugaredLibraryTestCompileResult<?> compileResult, Map<String, String> successes) + throws Exception { + String verbosity = "2"; // Increase verbosity for debugging.DesugaredLibraryTestBuilder + for (String path : successes.keySet()) { + assert successes.get(path) != null; + SingleTestRunResult<?> result = compileResult.run( - parameters.getRuntime(), "TestNGMainRunner", verbosity, runnableTests.get(path)); + parameters.getRuntime(), "TestNGMainRunner", verbosity, successes.get(path)); assertTrue( "Failure in " + path + "\n" + result, result .getStdOut() - .endsWith( - StringUtils.lines("Tests result in " + runnableTests.get(path) + ": SUCCESS"))); + .endsWith(StringUtils.lines("Tests result in " + successes.get(path) + ": SUCCESS"))); } } - private void runFailingTests(D8TestCompileResult compileResult) throws Exception { + private void runFailingTests( + DesugaredLibraryTestCompileResult<?> compileResult, Map<String, String> failures) + throws Exception { // For failing runnable tests, we just ensure that they do not fail due to desugaring, but // due to an expected failure (missing API, etc.). String verbosity = "2"; // Increase verbosity for debugging. - Map<String, String> runnableTests = getFailingTests(); - for (String path : runnableTests.keySet()) { - assert runnableTests.get(path) != null; - D8TestRunResult result = + for (String path : failures.keySet()) { + assert failures.get(path) != null; + SingleTestRunResult<?> result = compileResult.run( - parameters.getRuntime(), "TestNGMainRunner", verbosity, runnableTests.get(path)); + parameters.getRuntime(), "TestNGMainRunner", verbosity, failures.get(path)); String stdout = result.getStdOut(); if (stdout.contains("java.lang.NoSuchMethodError") && Arrays.stream(missingDesugaredMethods()).anyMatch(stdout::contains)) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java new file mode 100644 index 0000000..c208900 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
@@ -0,0 +1,132 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; +import static com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase.getAllFilesWithSuffixInDirectory; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; +import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION; +import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION; + +import com.android.tools.r8.JavaCompilerTool; +import com.android.tools.r8.TestRuntime; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.ToolHelper.ProcessResult; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Collections; +import java.util.HashSet; +import java.util.List; +import java.util.Set; +import org.junit.rules.TemporaryFolder; + +public class Jdk11TestLibraryDesugaringSpecification { + + private static final String EXTENSION_STRING = "build/libs/java_base_extension.jar"; + + private static Path[] JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES; + private static Path JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR; + private static final Path JDK_11_JAVA_BASE_EXTENSION_FILES_DIR = + Paths.get("third_party/openjdk/jdk-11-test/lib/testlibrary/bootlib/java.base"); + + public static Path EXTENSION_PATH; + + public static LibraryDesugaringSpecification JDK8_JAVA_BASE_EXT; + public static LibraryDesugaringSpecification JDK11_JAVA_BASE_EXT; + public static LibraryDesugaringSpecification JDK11_PATH_JAVA_BASE_EXT; + + private static Path[] getJavaBaseExtensionsFiles() throws Exception { + Path[] files = + getAllFilesWithSuffixInDirectory(JDK_11_JAVA_BASE_EXTENSION_FILES_DIR, JAVA_EXTENSION); + assert files.length > 0; + return files; + } + + public static void setUp() throws Exception { + EXTENSION_PATH = Paths.get(EXTENSION_STRING); + ensureJavaBaseExtensionsCompiled(); + JDK8_JAVA_BASE_EXT = createSpecification("JDK8_JAVA_BASE_EXT", JDK8); + JDK11_JAVA_BASE_EXT = createSpecification("JDK11_JAVA_BASE_EXT", JDK11); + JDK11_PATH_JAVA_BASE_EXT = createSpecification("JDK11_PATH_JAVA_BASE_EXT", JDK11_PATH); + } + + private static LibraryDesugaringSpecification createSpecification( + String name, LibraryDesugaringSpecification template) { + Set<Path> desugaredJDKLibFiles = new HashSet<>(template.getDesugarJdkLibs()); + desugaredJDKLibFiles.add(EXTENSION_PATH); + Set<Path> libFiles = new HashSet<>(template.getLibraryFiles()); + libFiles.add(EXTENSION_PATH); + return new LibraryDesugaringSpecification( + name, desugaredJDKLibFiles, template.getSpecification(), libFiles, getTestNGKeepRules()); + } + + private static synchronized void ensureJavaBaseExtensionsCompiled() throws Exception { + if (Files.exists(EXTENSION_PATH)) { + return; + } + + TemporaryFolder folder = + new TemporaryFolder(ToolHelper.isLinux() ? null : Paths.get("build", "tmp").toFile()); + folder.create(); + JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR = folder.newFolder("jdk11JavaBaseExt").toPath(); + List<String> options = + Arrays.asList( + "--add-reads", + "java.base=ALL-UNNAMED", + "--patch-module", + "java.base=" + JDK_11_JAVA_BASE_EXTENSION_FILES_DIR); + JavaCompilerTool.create(TestRuntime.getCheckedInJdk11(), folder) + .addOptions(options) + .addClasspathFiles( + Collections.singletonList(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar"))) + .addSourceFiles(getJavaBaseExtensionsFiles()) + .setOutputPath(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR) + .compile(); + JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES = + getAllFilesWithSuffixInDirectory(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR, CLASS_EXTENSION); + assert JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES.length > 0; + + // Jar the contents. + List<String> cmdline = new ArrayList<>(); + cmdline.add(TestRuntime.getCheckedInJdk11().getJavaExecutable().getParent() + "/jar"); + cmdline.add("cf"); + cmdline.add("tmp.jar"); + for (Path compile : JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES) { + cmdline.add(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR.relativize(compile).toString()); + } + ProcessBuilder builder = new ProcessBuilder(cmdline); + builder.directory(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR.toFile()); + ProcessResult result = ToolHelper.runProcess(builder); + assert result.exitCode == 0; + + // Move the result into the build/libs folder. + List<String> cmdlineMv = new ArrayList<>(); + cmdlineMv.add("mv"); + cmdlineMv.add(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR.resolve("tmp.jar").toString()); + cmdlineMv.add(EXTENSION_STRING); + ProcessResult resultMv = ToolHelper.runProcess(new ProcessBuilder(cmdlineMv)); + assert resultMv.exitCode == 0; + + folder.delete(); + } + + private static String getTestNGKeepRules() { + // Keep data providers and their annotations. + return "-keepclasseswithmembers class * {\n" + + " @org.testng.annotations.DataProvider <methods>;\n" + + "}\n" + + "-keepattributes *Annotation*\n" + // Do not even attempt to shrink testNG (unrelated to desugared lib shrinking goal). + + "-keep class org.testng.** { *; }\n" + // There are missing classes in testNG. + + "-dontwarn"; + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java similarity index 70% rename from src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java rename to src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java index 9d4ad7e..bc89176 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeTests.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeAbstractTests.java
@@ -1,23 +1,31 @@ -// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; import static com.android.tools.r8.ToolHelper.JDK_TESTS_BUILD_DIR; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.getPathsFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11Paths.testNGSupportProgramFiles; +import static com.android.tools.r8.desugar.desugaredlibrary.jdktests.Jdk11TestLibraryDesugaringSpecification.EXTENSION_PATH; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8DEBUG; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8_L8SHRINK; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION; import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.D8TestCompileResult; -import com.android.tools.r8.D8TestRunResult; +import com.android.tools.r8.SingleTestRunResult; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestRuntime; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.ToolHelper.DexVm; import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.AndroidApiLevel; -import com.android.tools.r8.utils.BooleanUtils; import com.android.tools.r8.utils.StringUtils; import com.google.common.collect.ImmutableList; import java.nio.file.Files; @@ -28,34 +36,12 @@ import java.util.List; import java.util.stream.Collectors; import org.junit.BeforeClass; -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 Jdk11TimeTests extends Jdk11DesugaredLibraryTestBase { - - private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; - - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") - public static List<Object[]> data() { - // TODO(134732760): Support Dalvik VMs, currently fails because libjavacrypto is required and - // present only in ART runtimes. - return buildParameters( - BooleanUtils.values(), - getTestParameters() - .withDexRuntimesStartingFromIncluding(Version.V5_1_1) - .withAllApiLevels() - .withApiLevel(AndroidApiLevel.N) - .build()); - } - - public Jdk11TimeTests(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; - this.parameters = parameters; - } +public abstract class Jdk11TimeAbstractTests extends DesugaredLibraryTestBase { private static final Path JDK_11_TCK_TEST_FILES_DIR = Paths.get(ToolHelper.JDK_11_TIME_TESTS_DIR).resolve("tck"); @@ -64,6 +50,33 @@ private static final String JDK_11_TIME_TEST_EXCLUDE = "TestZoneTextPrinterParser.java"; private static Path[] JDK_11_TIME_TEST_COMPILED_FILES; + final TestParameters parameters; + final LibraryDesugaringSpecification libraryDesugaringSpecification; + final CompilationSpecification compilationSpecification; + + @Parameters(name = "{0}, spec: {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + // TODO(134732760): Support Dalvik VMs, currently fails because libjavacrypto is required + // and present only in ART runtimes. + getTestParameters() + .withDexRuntimesStartingFromIncluding(Version.V5_1_1) + .withAllApiLevels() + .withApiLevel(AndroidApiLevel.N) + .build(), + ImmutableList.of(JDK8, JDK11_PATH), + ImmutableList.of(D8_L8DEBUG, D8_L8SHRINK)); + } + + public Jdk11TimeAbstractTests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; + } + private static List<Path> getJdk11TimeTestFiles() throws Exception { List<Path> tckFiles = Files.walk(JDK_11_TCK_TEST_FILES_DIR) @@ -83,14 +96,14 @@ } @BeforeClass - public static void compileJdk11StreamTests() throws Exception { + public static void compileJdk11TimeTests() throws Exception { Path tmpDirectory = getStaticTemp().newFolder("time").toPath(); List<String> options = Arrays.asList( "--add-reads", "java.base=ALL-UNNAMED", "--patch-module", - "java.base=" + JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR); + "java.base=" + EXTENSION_PATH); javac(TestRuntime.getCheckedInJdk11(), getStaticTemp()) .addOptions(options) .addClasspathFiles( @@ -107,7 +120,7 @@ // Following tests are also failing on the Bazel build, they cannot be run easily on // Android (difference in time precision, iAndroid printing, etc.). - private static String[] wontFixFailures = + private static final String[] WONT_FIX_FAILURES = new String[] { "test.java.time.TestZoneTextPrinterParser.java", // Removed by gradle (compile-time error). @@ -132,12 +145,11 @@ "test.java.time.chrono.TestEraDisplayName", "test.java.time.format.TestDateTimeFormatter", "test.java.time.TestLocalDate", - }; - private static String[] formattingProblem = - new String[] { + // Formatting problem "test.java.time.format.TestNarrowMonthNamesAndDayNames", }; - private static String[] successes = new String[] { + static final String[] RAW_TEMPORAL_SUCCESSES = + new String[] { "test.java.time.TestYearMonth", "test.java.time.TestZonedDateTime", "test.java.time.TestClock_Tick", @@ -148,10 +160,6 @@ "test.java.time.TestDuration", "test.java.time.TestZoneOffset", "test.java.time.TestLocalDateTime", - "test.java.time.temporal.TestDateTimeBuilderCombinations", - "test.java.time.temporal.TestJulianFields", - "test.java.time.temporal.TestChronoUnit", - "test.java.time.temporal.TestDateTimeValueRange", "test.java.time.TestClock_Fixed", "test.java.time.TestYear", "test.java.time.TestLocalTime", @@ -159,6 +167,19 @@ "test.java.time.TestOffsetTime", "test.java.time.TestClock_Offset", "test.java.time.TestPeriod", + "test.java.time.TestClock_System", + "test.java.time.TestOffsetDateTime_instants", + "test.java.time.temporal.TestDateTimeBuilderCombinations", + "test.java.time.temporal.TestJulianFields", + "test.java.time.temporal.TestChronoUnit", + "test.java.time.temporal.TestDateTimeValueRange" + }; + static final String[] RAW_TEMPORAL_SUCCESSES_IF_BRIDGE = + new String[] {"tck.java.time.TestIsoChronology"}; + static final String[] RAW_TEMPORAL_SUCCESSES_BUT_12 = + new String[] {"test.java.time.temporal.TestIsoWeekFields"}; + static final String[] FORMAT_CHRONO_SUCCESSES = + new String[] { "test.java.time.format.TestFractionPrinterParser", "test.java.time.format.TestStringLiteralParser", "test.java.time.format.TestZoneOffsetPrinter", @@ -170,56 +191,40 @@ "test.java.time.format.TestZoneOffsetParser", "test.java.time.format.TestReducedParser", "test.java.time.format.TestDateTimeParsing", - "test.java.time.format.TestDateTimeTextProviderWithLocale", "test.java.time.format.TestSettingsParser", "test.java.time.format.TestNumberParser", - "test.java.time.format.TestTextParserWithLocale", - "test.java.time.format.TestTextPrinterWithLocale", "test.java.time.format.TestReducedPrinter", "test.java.time.format.TestCharLiteralParser", - "test.java.time.TestOffsetDateTime_instants", "test.java.time.chrono.TestChronologyPerf", "test.java.time.chrono.TestExampleCode", "test.java.time.chrono.TestJapaneseChronology", "test.java.time.chrono.TestChronoLocalDate", "test.java.time.chrono.TestIsoChronoImpl", - "tck.java.time.TestIsoChronology", - "test.java.time.TestClock_System", - "test.java.time.chrono.TestUmmAlQuraChronology", - "test.java.time.temporal.TestIsoWeekFields", + }; + static final String[] FORMAT_CHRONO_SUCCESSES_UP_TO_11 = + new String[] { + "test.java.time.format.TestDateTimeTextProviderWithLocale", "test.java.time.format.TestUnicodeExtension", "test.java.time.format.TestDateTimeFormatterBuilderWithLocale", + "test.java.time.format.TestTextParserWithLocale", + "test.java.time.format.TestTextPrinterWithLocale", + "test.java.time.chrono.TestUmmAlQuraChronology", }; - @Test - public void testTime() throws Exception { - if (parameters.getRuntime().asDex().getVm().isEqualTo(DexVm.ART_12_0_0_HOST)) { - // TODO(b/197078988): Many additional tests fails with Android 12. - return; - } - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); + void testTime(String[] toRun) throws Exception { String verbosity = "2"; - D8TestCompileResult compileResult = - testForD8() - .addLibraryFiles(getLibraryFile()) - .addProgramFiles(getPathsFiles()) + DesugaredLibraryTestCompileResult<?> compileResult = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramFiles(JDK_11_TIME_TEST_COMPILED_FILES) - .addProgramFiles(Paths.get(JDK_TESTS_BUILD_DIR + "testng-6.10.jar")) - .addProgramFiles(Paths.get(JDK_TESTS_BUILD_DIR + "jcommander-1.48.jar")) - .addProgramFiles( - Paths.get( - ToolHelper.JAVA_CLASSES_DIR + "examplesTestNGRunner/TestNGMainRunner.class")) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) + .addProgramFiles(testNGSupportProgramFiles()) + .applyIf( + libraryDesugaringSpecification != JDK11_PATH, + b -> b.addProgramFiles(getPathsFiles())) .compile() - .withArt6Plus64BitsLib() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary); - for (String success : successes) { - D8TestRunResult result = + .withArt6Plus64BitsLib(); + for (String success : toRun) { + SingleTestRunResult<?> result = compileResult.run(parameters.getRuntime(), "TestNGMainRunner", verbosity, success); if (result.getStdErr().contains("Couldn't find any tzdata")) { // TODO(b/134732760): fix missing time zone data. @@ -231,15 +236,5 @@ result.getStdOut().contains(StringUtils.lines(success + ": SUCCESS"))); } } - for (String issue : formattingProblem) { - D8TestRunResult result = - compileResult.run(parameters.getRuntime(), "TestNGMainRunner", verbosity, issue); - if (requiresTimeDesugaring(parameters)) { - // Fails due to formatting differences in desugared library. - assertTrue(result.getStdOut().contains("for style NARROW")); - } else { - assertTrue(result.getStdOut().contains(StringUtils.lines(issue + ": SUCCESS"))); - } - } } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeFormatChronoTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeFormatChronoTests.java new file mode 100644 index 0000000..772308e --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeFormatChronoTests.java
@@ -0,0 +1,33 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class Jdk11TimeFormatChronoTests extends Jdk11TimeAbstractTests { + + public Jdk11TimeFormatChronoTests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + super(parameters, libraryDesugaringSpecification, compilationSpecification); + } + + @Test + public void testTime() throws Exception { + testTime(FORMAT_CHRONO_SUCCESSES); + if (parameters.getDexRuntimeVersion().isOlderThan(Version.V12_0_0)) { + // Formatting issues starting from 12. + testTime(FORMAT_CHRONO_SUCCESSES_UP_TO_11); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeRawTemporalTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeRawTemporalTests.java new file mode 100644 index 0000000..2b9b95c --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TimeRawTemporalTests.java
@@ -0,0 +1,42 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.jdktests; + +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8; + +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.utils.AndroidApiLevel; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class Jdk11TimeRawTemporalTests extends Jdk11TimeAbstractTests { + + public Jdk11TimeRawTemporalTests( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { + super(parameters, libraryDesugaringSpecification, compilationSpecification); + } + + @Test + public void testTime() throws Exception { + testTime(RAW_TEMPORAL_SUCCESSES); + if (!parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0)) { + // In 12 some ISO is supported that other versions do not support. + testTime(RAW_TEMPORAL_SUCCESSES_BUT_12); + } + // The bridge is always present with JDK11 due to partial desugaring between 26 and 33. + // On JDK8 the bridge is absent in between 26 and 33. + if (libraryDesugaringSpecification != JDK8 + || !parameters.getApiLevel().betweenBothIncluded(AndroidApiLevel.O, AndroidApiLevel.Sv2)) { + testTime(RAW_TEMPORAL_SUCCESSES_IF_BRIDGE); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/legacy/L8TestWithLegacySpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/legacy/L8TestWithLegacySpecification.java new file mode 100644 index 0000000..3a6fd81 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/legacy/L8TestWithLegacySpecification.java
@@ -0,0 +1,186 @@ +// Copyright (c) 2022, 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.desugar.desugaredlibrary.legacy; + +import com.android.tools.r8.CompilationMode; +import com.android.tools.r8.L8; +import com.android.tools.r8.L8Command; +import com.android.tools.r8.OutputMode; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; +import com.android.tools.r8.origin.Origin; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.FileUtils; +import com.android.tools.r8.utils.StringUtils; +import com.google.common.collect.ImmutableList; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class L8TestWithLegacySpecification extends TestBase { + + @Parameter(0) + public AndroidApiLevel apiLevel; + + @Parameter(1) + public CompilationMode mode; + + @Parameter(2) + public L8KeepRules l8KeepRules; + + @Parameter(3) + public TestParameters none; + + @Parameters(name = "{0}, {1}, {2}") + public static List<Object[]> data() { + return buildParameters( + Arrays.stream(AndroidApiLevel.values()) + .sorted() + .filter(apiLevel -> apiLevel.isGreaterThanOrEqualTo(AndroidApiLevel.L)) + .filter(apiLevel -> apiLevel.isLessThan(AndroidApiLevel.ANDROID_PLATFORM)) + .collect(Collectors.toList()), + CompilationMode.values(), + ImmutableList.of( + new L8KeepRules("AGP", agp73KeepRules), + new L8KeepRules("j$", ImmutableList.of("-keep class j$.** { *; }")), + new L8KeepRules("java", ImmutableList.of("-keep class java.** { *; }")), + new L8KeepRules( + "both", + ImmutableList.of("-keep class j$.** { *; }", "-keep class java.** { *; }"))), + getTestParameters().withNoneRuntime().build()); + } + + private static class L8KeepRules { + + private String name; + private List<String> keepRules; + + L8KeepRules(String name, List<String> keepRules) { + this.name = name; + this.keepRules = keepRules; + } + + @Override + public String toString() { + return name; + } + } + + // Keep rules generated by D8 for an empty app with AGP 7.3.0-aplha09. + private static List<String> agp73KeepRules = + StringUtils.splitLines( + "-keep class j$.util.DesugarTimeZone {\n" + + " java.util.TimeZone getTimeZone(java.lang.String);\n" + + "}\n" + + "-keep class java.util.function.IntFunction\n" + + "-keep class j$.util.concurrent.ConcurrentHashMap {\n" + + " void <init>();\n" + + " java.lang.Object get(java.lang.Object);\n" + + " java.lang.Object put(java.lang.Object, java.lang.Object);\n" + + "}\n" + + "-keep class j$.util.function.IntFunction$Wrapper {\n" + + " java.util.function.IntFunction convert(j$.util.function.IntFunction);\n" + + "}\n" + + "-keep class j$.util.function.IntFunction { *; }\n" + + "-keep class j$.util.DesugarCollections {\n" + + " java.util.Map synchronizedMap(java.util.Map);\n" + + "}\n" + + "-keep class java.util.function.Supplier\n" + + "-keep class j$.util.function.Supplier$Wrapper {\n" + + " java.util.function.Supplier convert(j$.util.function.Supplier);\n" + + "}\n" + + "-keep class j$.util.function.Supplier { *; }\n" + + "-keep class java.util.function.Consumer\n" + + "-keep class j$.util.Collection$-EL {\n" + + " boolean removeIf(java.util.Collection, j$.util.function.Predicate);\n" + + "}\n" + + "-keep class j$.util.concurrent.ConcurrentHashMap {\n" + + " void <init>();\n" + + " java.lang.Object get(java.lang.Object);\n" + + " java.lang.Object put(java.lang.Object, java.lang.Object);\n" + + "}\n" + + "-keep class j$.util.function.Consumer$-CC {\n" + + " j$.util.function.Consumer $default$andThen(j$.util.function.Consumer," + + " j$.util.function.Consumer);\n" + + "}\n" + + "-keep class j$.util.function.Consumer$Wrapper {\n" + + " java.util.function.Consumer convert(j$.util.function.Consumer);\n" + + "}\n" + + "-keep class j$.util.function.Consumer { *; }\n" + + "-keep class j$.util.function.Predicate$-CC {\n" + + " j$.util.function.Predicate $default$and(j$.util.function.Predicate," + + " j$.util.function.Predicate);\n" + + " j$.util.function.Predicate $default$negate(j$.util.function.Predicate);\n" + + " j$.util.function.Predicate $default$or(j$.util.function.Predicate," + + " j$.util.function.Predicate);\n" + + "}\n" + + "-keep class j$.util.function.Predicate { *; }\n" + + "-keep class java.util.function.BiConsumer\n" + + "-keep class java.util.function.BiFunction\n" + + "-keep class java.util.function.Consumer\n" + + "-keep class java.util.function.Function\n" + + "-keep class j$.util.Iterator { *; }\n" + + "-keep class j$.util.Map$Entry { *; }\n" + + "-keep class j$.util.Map { *; }\n" + + "-keep class j$.util.Iterator$-CC {\n" + + " void $default$forEachRemaining(java.util.Iterator," + + " j$.util.function.Consumer);\n" + + "}\n" + + "-keep class j$.util.Map$-CC {\n" + + " java.lang.Object $default$compute(java.util.Map, java.lang.Object," + + " j$.util.function.BiFunction);\n" + + " java.lang.Object $default$computeIfAbsent(java.util.Map, java.lang.Object," + + " j$.util.function.Function);\n" + + " java.lang.Object $default$computeIfPresent(java.util.Map, java.lang.Object," + + " j$.util.function.BiFunction);\n" + + " void $default$forEach(java.util.Map, j$.util.function.BiConsumer);\n" + + " java.lang.Object $default$merge(java.util.Map, java.lang.Object," + + " java.lang.Object, j$.util.function.BiFunction);\n" + + " void $default$replaceAll(java.util.Map, j$.util.function.BiFunction);\n" + + "}\n" + + "-keep class j$.util.function.BiConsumer$VivifiedWrapper {\n" + + " j$.util.function.BiConsumer convert(java.util.function.BiConsumer);\n" + + "}\n" + + "-keep class j$.util.function.BiConsumer\n" + + "-keep class j$.util.function.BiFunction$VivifiedWrapper {\n" + + " j$.util.function.BiFunction convert(java.util.function.BiFunction);\n" + + "}\n" + + "-keep class j$.util.function.BiFunction\n" + + "-keep class j$.util.function.Consumer$VivifiedWrapper {\n" + + " j$.util.function.Consumer convert(java.util.function.Consumer);\n" + + "}\n" + + "-keep class j$.util.function.Consumer\n" + + "-keep class j$.util.function.Function$VivifiedWrapper {\n" + + " j$.util.function.Function convert(java.util.function.Function);\n" + + "}\n" + + "-keep class j$.util.function.Function\n"); + + @Test + public void testL8WithLegacyConfigurationAndStudioKeepRules() throws Exception { + L8Command.Builder builder = L8Command.builder(); + L8Command command = + builder + .addLibraryFiles(LibraryDesugaringSpecification.JDK11_LEGACY.getLibraryFiles()) + .addProgramFiles(LibraryDesugaringSpecification.JDK11_LEGACY.getDesugarJdkLibs()) + .addDesugaredLibraryConfiguration( + FileUtils.readTextFile( + LibraryDesugaringSpecification.JDK11_LEGACY.getSpecification(), + StandardCharsets.UTF_8)) + .addProguardConfiguration(l8KeepRules.keepRules, Origin.unknown()) + .setMode(mode) + .setOutput(temp.newFolder().toPath().resolve("out.jar"), OutputMode.DexIndexed) + .setMinApiLevel(apiLevel.getLevel()) + .build(); + // TODO(b/231925782): This should succeed for all API levels. + L8.run(command); + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java index 0752227..6c691dd 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/EnumSetTest.java
@@ -4,9 +4,13 @@ package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.DayOfWeek; import java.time.chrono.IsoEra; @@ -22,33 +26,31 @@ public class EnumSetTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public EnumSetTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public EnumSetTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test public void testEnum() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(EnumSetUser.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + .addKeepMainRule(EnumSetUser.class) .run(parameters.getRuntime(), EnumSetUser.class) .assertSuccessWithOutput(StringUtils.lines("2", "0", "1")); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java index 7da38d7..3f1c8cb 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/FieldAccessTest.java
@@ -4,9 +4,13 @@ package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.ZoneId; import java.util.List; @@ -19,33 +23,31 @@ public class FieldAccessTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public FieldAccessTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public FieldAccessTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test public void testField() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Executor.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) .assertSuccessWithOutput(StringUtils.lines("Australia/Darwin")); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java index fd81f26..899bd19 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/InheritanceTest.java
@@ -4,9 +4,13 @@ package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import com.android.tools.r8.utils.StringUtils; import java.time.Clock; import java.time.Instant; @@ -21,33 +25,31 @@ public class InheritanceTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public InheritanceTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public InheritanceTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test public void testInheritance() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - testForD8() - .addLibraryFiles(getLibraryFile()) + testForDesugaredLibrary(parameters, libraryDesugaringSpecification, compilationSpecification) .addProgramClasses(Impl.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + .addKeepMainRule(Impl.class) .run(parameters.getRuntime(), Impl.class) .assertSuccessWithOutput(StringUtils.lines("123456")); }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java index 26ccf56..573fd89 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/shrinkingtests/KeepRuleShrinkTest.java
@@ -4,10 +4,13 @@ package com.android.tools.r8.desugar.desugaredlibrary.shrinkingtests; -import com.android.tools.r8.D8TestRunResult; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS; +import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11; + import com.android.tools.r8.TestParameters; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; -import com.android.tools.r8.utils.BooleanUtils; +import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification; +import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification; import java.util.List; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @@ -22,37 +25,37 @@ public class KeepRuleShrinkTest extends DesugaredLibraryTestBase { private final TestParameters parameters; - private final boolean shrinkDesugaredLibrary; + private final LibraryDesugaringSpecification libraryDesugaringSpecification; + private final CompilationSpecification compilationSpecification; - @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}") + @Parameters(name = "{0}, spec: {1}, {2}") public static List<Object[]> data() { return buildParameters( - BooleanUtils.values(), getTestParameters().withDexRuntimes().withAllApiLevels().build()); + getTestParameters().withDexRuntimes().withAllApiLevels().build(), + getJdk8Jdk11(), + DEFAULT_SPECIFICATIONS); } - public KeepRuleShrinkTest(boolean shrinkDesugaredLibrary, TestParameters parameters) { - this.shrinkDesugaredLibrary = shrinkDesugaredLibrary; + public KeepRuleShrinkTest( + TestParameters parameters, + LibraryDesugaringSpecification libraryDesugaringSpecification, + CompilationSpecification compilationSpecification) { this.parameters = parameters; + this.libraryDesugaringSpecification = libraryDesugaringSpecification; + this.compilationSpecification = compilationSpecification; } @Test public void testMapProblem() throws Exception { - KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters); - D8TestRunResult d8TestRunResult = - testForD8() - .addLibraryFiles(getLibraryFile()) + String stdOut = + testForDesugaredLibrary( + parameters, libraryDesugaringSpecification, compilationSpecification) .addInnerClasses(KeepRuleShrinkTest.class) - .setMinApi(parameters.getApiLevel()) - .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer) - .compile() - .addDesugaredCoreLibraryRunClassPath( - this::buildDesugaredLibrary, - parameters.getApiLevel(), - keepRuleConsumer.get(), - shrinkDesugaredLibrary) + .addKeepMainRule(Executor.class) .run(parameters.getRuntime(), Executor.class) - .assertSuccess(); - assertLines2By2Correct(d8TestRunResult.getStdOut()); + .assertSuccess() + .getStdOut(); + assertLines2By2Correct(stdOut); } static class Executor {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java index 0efcc59..3aecfba 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/CompilationSpecification.java
@@ -19,14 +19,12 @@ R8_L8SHRINK(true, true, false, RELEASE), // The D8CFTOCF specifications can run either in CF or be dexed afterwards. D8CF2CF_L8DEBUG(false, false, true, DEBUG), - // D8CF2CF_L8SHRINK is to be implemented (Only the dex back-end outputs the keep rule). D8CF2CF_L8SHRINK(false, true, true, RELEASE); public static Set<CompilationSpecification> DEFAULT_SPECIFICATIONS = ImmutableSet.of(D8_L8DEBUG, D8_L8SHRINK, R8_L8SHRINK); - // Add D8CF2CF_L8SHRINK when tracereference is supported. public static Set<CompilationSpecification> SPECIFICATIONS_WITH_CF2CF = - ImmutableSet.of(D8_L8DEBUG, D8_L8SHRINK, R8_L8SHRINK, D8CF2CF_L8DEBUG); + ImmutableSet.of(D8_L8DEBUG, D8_L8SHRINK, R8_L8SHRINK, D8CF2CF_L8DEBUG, D8CF2CF_L8SHRINK); private final boolean programShrink; private final boolean l8Shrink;
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java index 6d777c5..7e11cc5 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -4,8 +4,11 @@ package com.android.tools.r8.desugar.desugaredlibrary.test; +import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.D8CF2CF_L8SHRINK; + import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.D8TestCompileResult; +import com.android.tools.r8.FeatureSplit; import com.android.tools.r8.L8TestBuilder; import com.android.tools.r8.L8TestCompileResult; import com.android.tools.r8.LibraryDesugaringTestConfiguration; @@ -15,17 +18,24 @@ import com.android.tools.r8.TestBase.Backend; import com.android.tools.r8.TestCompileResult; import com.android.tools.r8.TestCompilerBuilder; +import com.android.tools.r8.TestCompilerBuilder.DiagnosticsConsumer; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.TestRunResult; import com.android.tools.r8.TestRuntime; +import com.android.tools.r8.TestShrinkerBuilder; import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase; +import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase.KeepRuleConsumer; import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser; +import com.android.tools.r8.tracereferences.TraceReferences; import com.android.tools.r8.utils.ConsumerUtils; +import com.android.tools.r8.utils.FileUtils; import com.android.tools.r8.utils.InternalOptions; +import com.google.common.base.Charsets; import java.io.IOException; import java.nio.file.Path; +import java.util.ArrayList; import java.util.Collection; import java.util.function.Consumer; +import java.util.function.Function; import org.junit.Assume; public class DesugaredLibraryTestBuilder<T extends DesugaredLibraryTestBase> { @@ -35,9 +45,10 @@ private final LibraryDesugaringSpecification libraryDesugaringSpecification; private final CompilationSpecification compilationSpecification; private final TestCompilerBuilder<?, ?, ?, ? extends SingleTestRunResult<?>, ?> builder; + private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer(); + private boolean l8FinalPrefixVerification = true; private CustomLibrarySpecification customLibrarySpecification = null; - private Consumer<InternalOptions> l8OptionModifier = ConsumerUtils.emptyConsumer(); private TestingKeepRuleConsumer keepRuleConsumer = null; public DesugaredLibraryTestBuilder( @@ -55,15 +66,16 @@ private void setUp() { builder - .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar()) - .setMinApi(parameters.getApiLevel()); + .addLibraryFiles(libraryDesugaringSpecification.getLibraryFiles()) + .setMinApi(parameters.getApiLevel()) + .setMode(compilationSpecification.getProgramCompilationMode()); LibraryDesugaringTestConfiguration.Builder libraryConfBuilder = LibraryDesugaringTestConfiguration.builder() .setMinApi(parameters.getApiLevel()) .addDesugaredLibraryConfiguration( StringResource.fromFile(libraryDesugaringSpecification.getSpecification())) .dontAddRunClasspath(); - if (compilationSpecification.isL8Shrink()) { + if (compilationSpecification.isL8Shrink() && !compilationSpecification.isCfToCf()) { keepRuleConsumer = new TestingKeepRuleConsumer(); libraryConfBuilder.setKeepRuleConsumer(keepRuleConsumer); } @@ -73,6 +85,10 @@ private TestCompilerBuilder<?, ?, ?, ? extends SingleTestRunResult<?>, ?> generateBuilder() { if (compilationSpecification.isCfToCf()) { assert !compilationSpecification.isProgramShrink(); + if (compilationSpecification.isL8Shrink()) { + // L8 with Cf backend and shrinking is not a supported pipeline. + Assume.assumeTrue(parameters.getBackend().isDex()); + } return test.testForD8(Backend.CF); } // Cf back-end is only allowed in Cf to cf compilations. @@ -113,16 +129,37 @@ return this; } + public DesugaredLibraryTestBuilder<T> addClasspathClasses(Class<?>... clazz) throws IOException { + builder.addClasspathClasses(clazz); + return this; + } + public DesugaredLibraryTestBuilder<T> addProgramClasses(Class<?>... clazz) throws IOException { builder.addProgramClasses(clazz); return this; } + public DesugaredLibraryTestBuilder<T> addProgramClasses(Collection<Class<?>> clazz) + throws IOException { + builder.addProgramClasses(clazz); + return this; + } + public DesugaredLibraryTestBuilder<T> addProgramFiles(Path... files) { builder.addProgramFiles(files); return this; } + public DesugaredLibraryTestBuilder<T> addProgramFiles(Collection<Path> files) { + builder.addProgramFiles(files); + return this; + } + + public DesugaredLibraryTestBuilder<T> ignoreL8FinalPrefixVerification() { + l8FinalPrefixVerification = false; + return this; + } + public DesugaredLibraryTestBuilder<T> addProgramClassFileData( Collection<byte[]> programClassFileData) { builder.addProgramClassFileData(programClassFileData); @@ -151,11 +188,31 @@ return this; } + public DesugaredLibraryTestBuilder<T> allowDiagnosticInfoMessages() { + withR8TestBuilder(R8TestBuilder::allowDiagnosticInfoMessages); + return this; + } + public DesugaredLibraryTestBuilder<T> allowDiagnosticWarningMessages() { withR8TestBuilder(R8TestBuilder::allowDiagnosticWarningMessages); return this; } + public DesugaredLibraryTestBuilder<T> addKeepAttributes(String... attributes) { + withR8TestBuilder(b -> b.addKeepAttributes(attributes)); + return this; + } + + public DesugaredLibraryTestBuilder<T> addKeepAllClassesRuleWithAllowObfuscation() { + withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRuleWithAllowObfuscation); + return this; + } + + public DesugaredLibraryTestBuilder<T> addKeepAllClassesRule() { + withR8TestBuilder(TestShrinkerBuilder::addKeepAllClassesRule); + return this; + } + public DesugaredLibraryTestBuilder<T> addKeepMainRule(Class<?> clazz) { withR8TestBuilder(b -> b.addKeepMainRule(clazz)); return this; @@ -171,6 +228,12 @@ return this; } + public DesugaredLibraryTestBuilder<T> addFeatureSplit( + Function<FeatureSplit.Builder, FeatureSplit> featureSplitBuilder) { + withR8TestBuilder(b -> b.addFeatureSplit(featureSplitBuilder)); + return this; + } + public DesugaredLibraryTestBuilder<T> enableInliningAnnotations() { withR8TestBuilder(R8TestBuilder::enableInliningAnnotations); return this; @@ -189,11 +252,27 @@ return this; } + public DesugaredLibraryTestBuilder<T> disableL8AnnotationRemoval() { + l8OptionModifier = + l8OptionModifier.andThen(options -> options.disableL8AnnotationRemoval = true); + return this; + } + public DesugaredLibraryTestCompileResult<T> compile() throws Exception { - // We compile first to generate the keep rules for the l8 compilation. TestCompileResult<?, ? extends SingleTestRunResult<?>> compile = builder.compile(); - String keepRule = keepRuleConsumer == null ? null : keepRuleConsumer.get(); - L8TestCompileResult l8Compile = compileDesugaredLibrary(keepRule); + return internalCompile(compile); + } + + public DesugaredLibraryTestCompileResult<T> compileWithExpectedDiagnostics( + DiagnosticsConsumer consumer) throws Exception { + TestCompileResult<?, ? extends SingleTestRunResult<?>> compile = + builder.compileWithExpectedDiagnostics(consumer); + return internalCompile(compile); + } + + private DesugaredLibraryTestCompileResult<T> internalCompile( + TestCompileResult<?, ? extends SingleTestRunResult<?>> compile) throws Exception { + L8TestCompileResult l8Compile = compileDesugaredLibrary(compile, keepRuleConsumer); D8TestCompileResult customLibCompile = compileCustomLib(); return new DesugaredLibraryTestCompileResult<>( test, @@ -209,36 +288,81 @@ if (customLibrarySpecification == null) { return null; } - return test.testForD8() + return test.testForD8(parameters.getBackend()) .addProgramClasses(customLibrarySpecification.getClasses()) .setMinApi(customLibrarySpecification.getMinApi()) .compile(); } + private L8TestCompileResult compileDesugaredLibrary( + TestCompileResult<?, ? extends SingleTestRunResult<?>> compile, + KeepRuleConsumer keepRuleConsumer) + throws Exception { + if (!compilationSpecification.isL8Shrink()) { + return compileDesugaredLibrary(null); + } + if (!compilationSpecification.isCfToCf()) { + // When going to dex we can get the generated keep rule through the keep rule consumer. + assert keepRuleConsumer != null; + return compileDesugaredLibrary(keepRuleConsumer.get()); + } + // In D8CF2CF_L8SHRINK, we use trace reference to extract the keep rules. + assert compilationSpecification == D8CF2CF_L8SHRINK; + L8TestCompileResult nonShrunk = + test.testForL8(parameters.getApiLevel(), Backend.CF) + .apply(libraryDesugaringSpecification::configureL8TestBuilder) + .apply(this::configure) + .compile(); + String keepRules = + collectKeepRulesWithTraceReferences(compile.writeToZip(), nonShrunk.writeToZip()); + return compileDesugaredLibrary(keepRules); + } + private L8TestCompileResult compileDesugaredLibrary(String keepRule) throws Exception { + assert !compilationSpecification.isL8Shrink() || keepRule != null; return test.testForL8(parameters.getApiLevel(), parameters.getBackend()) - .addProgramFiles(libraryDesugaringSpecification.getDesugarJdkLibs()) - .addLibraryFiles(libraryDesugaringSpecification.getAndroidJar()) - .setDesugaredLibraryConfiguration(libraryDesugaringSpecification.getSpecification()) - .noDefaultDesugarJDKLibs() - .applyIf( - compilationSpecification.isL8Shrink(), - builder -> { - if (keepRule != null && !keepRule.trim().isEmpty()) { - builder.addGeneratedKeepRules(keepRule); - } - }, - L8TestBuilder::setDebug) - .addOptionsModifier(l8OptionModifier) + .apply( + b -> + libraryDesugaringSpecification.configureL8TestBuilder( + b, compilationSpecification.isL8Shrink(), keepRule)) + .apply(this::configure) .compile(); } - public TestRunResult<?> run(TestRuntime runtime, Class<?> mainClass, String... args) + private void configure(L8TestBuilder l8Builder) { + l8Builder + .applyIf(!l8FinalPrefixVerification, L8TestBuilder::ignoreFinalPrefixVerification) + .addOptionsModifier(l8OptionModifier); + } + + public String collectKeepRulesWithTraceReferences( + Path desugaredProgramClassFile, Path desugaredLibraryClassFile) throws Exception { + Path generatedKeepRules = test.temp.newFile().toPath(); + ArrayList<String> args = new ArrayList<>(); + args.add("--keep-rules"); + for (Path libraryFile : libraryDesugaringSpecification.getLibraryFiles()) { + args.add("--lib"); + args.add(libraryFile.toString()); + } + args.add("--target"); + args.add(desugaredLibraryClassFile.toString()); + args.add("--source"); + args.add(desugaredProgramClassFile.toString()); + args.add("--output"); + args.add(generatedKeepRules.toString()); + args.add("--map-diagnostics"); + args.add("error"); + args.add("info"); + TraceReferences.run(args.toArray(new String[0])); + return FileUtils.readTextFile(generatedKeepRules, Charsets.UTF_8); + } + + public SingleTestRunResult<?> run(TestRuntime runtime, Class<?> mainClass, String... args) throws Exception { return compile().run(runtime, mainClass.getTypeName(), args); } - public TestRunResult<?> run(TestRuntime runtime, String mainClass, String... args) + public SingleTestRunResult<?> run(TestRuntime runtime, String mainClass, String... args) throws Exception { return compile().run(runtime, mainClass, args); } @@ -269,4 +393,9 @@ builder.addAndroidBuildVersion(); return this; } + + public DesugaredLibraryTestBuilder<T> disableDesugaring() { + builder.disableDesugaring(); + return this; + } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java index ec53bdf..bd11465 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
@@ -4,6 +4,7 @@ package com.android.tools.r8.desugar.desugaredlibrary.test; +import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.D8TestCompileResult; import com.android.tools.r8.L8TestCompileResult; import com.android.tools.r8.SingleTestRunResult; @@ -16,8 +17,6 @@ import com.android.tools.r8.utils.codeinspector.CodeInspector; import java.io.IOException; import java.nio.file.Path; -import java.util.ArrayList; -import java.util.Collections; import java.util.List; import java.util.function.Consumer; @@ -30,7 +29,9 @@ private final CompilationSpecification compilationSpecification; private final D8TestCompileResult customLibCompile; private final L8TestCompileResult l8Compile; - private final List<Path> runClasspathFiles = new ArrayList<>(); + // In case of Cf2Cf desugaring the run on dex, the compileResult is the Cf desugaring result + // while the runnableCompiledResult is the dexed compiledResult used to run on dex. + private final TestCompileResult<?, ? extends SingleTestRunResult<?>> runnableCompiledResult; public DesugaredLibraryTestCompileResult( T test, @@ -39,7 +40,8 @@ LibraryDesugaringSpecification libraryDesugaringSpecification, CompilationSpecification compilationSpecification, D8TestCompileResult customLibCompile, - L8TestCompileResult l8Compile) { + L8TestCompileResult l8Compile) + throws Exception { this.test = test; this.compileResult = compileResult; this.parameters = parameters; @@ -47,6 +49,7 @@ this.compilationSpecification = compilationSpecification; this.customLibCompile = customLibCompile; this.l8Compile = l8Compile; + this.runnableCompiledResult = computeRunnableCompiledResult(); } public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectCustomLib( @@ -68,6 +71,14 @@ return this; } + public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectKeepRules( + ThrowingConsumer<List<String>, E> consumer) throws Throwable { + if (compilationSpecification.isL8Shrink()) { + l8Compile.inspectKeepRules(consumer); + } + return this; + } + public <E extends Throwable> DesugaredLibraryTestCompileResult<T> apply( ThrowingConsumer<DesugaredLibraryTestCompileResult<T>, E> consumer) throws Throwable { consumer.accept(this); @@ -100,48 +111,52 @@ public SingleTestRunResult<?> run(TestRuntime runtime, String mainClassName, String... args) throws Exception { - - Path desugaredLibrary = l8Compile.writeToZip(); - - if (runtime.getBackend().isCf()) { - assert compilationSpecification.isCfToCf(); - return compileResult.addRunClasspathFiles(desugaredLibrary).run(runtime, mainClassName); - } - - TestCompileResult<?, ? extends SingleTestRunResult<?>> actualCompileResult = - compilationSpecification.isCfToCf() ? convertCompileResultToDex() : compileResult; - - if (customLibCompile != null) { - actualCompileResult.addRunClasspathFiles(customLibCompile.writeToZip()); - } - - actualCompileResult - .addRunClasspathFiles(desugaredLibrary) - .addRunClasspathFiles(runClasspathFiles); - - return actualCompileResult.run(runtime, mainClassName, args); + return runnableCompiledResult.run(runtime, mainClassName, args); } - private TestCompileResult<?, ? extends SingleTestRunResult<?>> convertCompileResultToDex() + private TestCompileResult<?, ? extends SingleTestRunResult<?>> computeRunnableCompiledResult() throws Exception { + TestCompileResult<?, ? extends SingleTestRunResult<?>> runnable = convertToDexIfNeeded(); + if (customLibCompile != null) { + runnable.addRunClasspathFiles(customLibCompile.writeToZip()); + } + runnable.addRunClasspathFiles(l8Compile.writeToZip()); + return runnable; + } + + private TestCompileResult<?, ? extends SingleTestRunResult<?>> convertToDexIfNeeded() + throws CompilationFailedException, IOException { + if (!(compilationSpecification.isCfToCf() && parameters.getBackend().isDex())) { + return compileResult; + } return test.testForD8() - .addProgramFiles(compileResult.writeToZip()) + .addProgramFiles(this.compileResult.writeToZip()) .setMinApi(parameters.getApiLevel()) + .setMode(compilationSpecification.getProgramCompilationMode()) .disableDesugaring() .compile(); } public Path writeToZip() throws IOException { - return compileResult.writeToZip(); + return runnableCompiledResult.writeToZip(); + } + + public DesugaredLibraryTestCompileResult<T> writeToZip(Path path) throws IOException { + runnableCompiledResult.writeToZip(path); + return this; + } + + public Path writeL8ToZip() throws IOException { + return l8Compile.writeToZip(); } public DesugaredLibraryTestCompileResult<T> addRunClasspathFiles(Path... classpathFiles) { - Collections.addAll(runClasspathFiles, classpathFiles); + runnableCompiledResult.addRunClasspathFiles(classpathFiles); return this; } public DesugaredLibraryTestCompileResult<T> withArt6Plus64BitsLib() { - compileResult.withArt6Plus64BitsLib(); + runnableCompiledResult.withArt6Plus64BitsLib(); return this; } }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java index 81415f7..d4e8e32 100644 --- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java +++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/LibraryDesugaringSpecification.java
@@ -1,9 +1,12 @@ // Copyright (c) 2022, 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.desugar.desugaredlibrary.test; +import static com.android.tools.r8.ToolHelper.DESUGARED_JDK_8_LIB_JAR; +import static com.android.tools.r8.ToolHelper.DESUGARED_LIB_RELEASES_DIR; + +import com.android.tools.r8.L8TestBuilder; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.desugar.desugaredlibrary.jdk11.DesugaredLibraryJDK11Undesugarer; import com.android.tools.r8.utils.AndroidApiLevel; @@ -17,79 +20,103 @@ public class LibraryDesugaringSpecification { private static final String RELEASES_DIR = "third_party/openjdk/desugar_jdk_libs_releases/"; - private static final Path DESUGARED_JDK_11_LIB_JAR = + private static final Path UNDESUGARED_JDK_11_LIB_JAR = DesugaredLibraryJDK11Undesugarer.undesugaredJarJDK11( Paths.get("third_party/openjdk/desugar_jdk_libs_11/desugar_jdk_libs.jar")); // Main head specifications. public static LibraryDesugaringSpecification JDK8 = new LibraryDesugaringSpecification( - "JDK8", - Paths.get("third_party/openjdk/desugar_jdk_libs/desugar_jdk_libs.jar"), - Paths.get("src/library_desugar/desugar_jdk_libs.json")); + "JDK8", DESUGARED_JDK_8_LIB_JAR, "desugar_jdk_libs.json", AndroidApiLevel.P); public static LibraryDesugaringSpecification JDK11 = new LibraryDesugaringSpecification( - "JDK11", - DESUGARED_JDK_11_LIB_JAR, - Paths.get("src/library_desugar/jdk11/desugar_jdk_libs.json")); + "JDK11", UNDESUGARED_JDK_11_LIB_JAR, "jdk11/desugar_jdk_libs.json", AndroidApiLevel.R); public static LibraryDesugaringSpecification JDK11_MINIMAL = new LibraryDesugaringSpecification( "JDK11_MINIMAL", - DESUGARED_JDK_11_LIB_JAR, - Paths.get("src/library_desugar/jdk11/desugar_jdk_libs_minimal.json")); + UNDESUGARED_JDK_11_LIB_JAR, + "jdk11/desugar_jdk_libs_minimal.json", + AndroidApiLevel.R); public static LibraryDesugaringSpecification JDK11_PATH = new LibraryDesugaringSpecification( "JDK11_PATH", - DESUGARED_JDK_11_LIB_JAR, - Paths.get("src/library_desugar/jdk11/desugar_jdk_libs_path.json")); + UNDESUGARED_JDK_11_LIB_JAR, + "jdk11/desugar_jdk_libs_path.json", + AndroidApiLevel.R); // Legacy specifications. public static LibraryDesugaringSpecification JDK11_PATH_ALTERNATIVE_3 = new LibraryDesugaringSpecification( "JDK11_PATH_ALTERNATIVE_3", - DESUGARED_JDK_11_LIB_JAR, - Paths.get("src/library_desugar/jdk11/desugar_jdk_libs_path_alternative_3.json")); + UNDESUGARED_JDK_11_LIB_JAR, + "jdk11/desugar_jdk_libs_path_alternative_3.json", + AndroidApiLevel.R); + public static LibraryDesugaringSpecification JDK11_CHM_ONLY = + new LibraryDesugaringSpecification( + "JDK11_CHM_ONLY", + UNDESUGARED_JDK_11_LIB_JAR, + "jdk11/chm_only_desugar_jdk_libs.json", + AndroidApiLevel.R); public static LibraryDesugaringSpecification JDK11_LEGACY = new LibraryDesugaringSpecification( - "DESUGARED_JDK_11_LIB_JAR", - DESUGARED_JDK_11_LIB_JAR, - Paths.get("src/library_desugar/jdk11/desugar_jdk_libs_legacy.json")); - private static final LibraryDesugaringSpecification RELEASED_1_0_9 = - new LibraryDesugaringSpecification("1.0.9"); - private static final LibraryDesugaringSpecification RELEASED_1_0_10 = - new LibraryDesugaringSpecification("1.0.10"); - private static final LibraryDesugaringSpecification RELEASED_1_1_0 = - new LibraryDesugaringSpecification("1.1.0"); - private static final LibraryDesugaringSpecification RELEASED_1_1_1 = - new LibraryDesugaringSpecification("1.1.1"); - private static final LibraryDesugaringSpecification RELEASED_1_1_5 = - new LibraryDesugaringSpecification("1.1.5"); - + "JDK11_LEGACY", + // The legacy specification is not using the undesugared JAR. + Paths.get("third_party/openjdk/desugar_jdk_libs_11/desugar_jdk_libs.jar"), + "jdk11/desugar_jdk_libs_legacy.json", + AndroidApiLevel.R); + public static final LibraryDesugaringSpecification RELEASED_1_0_9 = + new LibraryDesugaringSpecification("1.0.9", AndroidApiLevel.P); + public static final LibraryDesugaringSpecification RELEASED_1_0_10 = + new LibraryDesugaringSpecification("1.0.10", AndroidApiLevel.P); + public static final LibraryDesugaringSpecification RELEASED_1_1_0 = + new LibraryDesugaringSpecification("1.1.0", AndroidApiLevel.P); + public static final LibraryDesugaringSpecification RELEASED_1_1_1 = + new LibraryDesugaringSpecification("1.1.1", AndroidApiLevel.P); + public static final LibraryDesugaringSpecification RELEASED_1_1_5 = + new LibraryDesugaringSpecification("1.1.5", AndroidApiLevel.P); private final String name; private final Set<Path> desugarJdkLibs; private final Path specification; + private final Set<Path> libraryFiles; + private final String extraKeepRules; - LibraryDesugaringSpecification(String name, Path desugarJdkLibs, Path specification) { - this(name, ImmutableSet.of(desugarJdkLibs, ToolHelper.DESUGAR_LIB_CONVERSIONS), specification); + private LibraryDesugaringSpecification( + String name, Path desugarJdkLibs, String specificationPath, AndroidApiLevel androidJarLevel) { + this( + name, + ImmutableSet.of(desugarJdkLibs, ToolHelper.DESUGAR_LIB_CONVERSIONS), + Paths.get("src/library_desugar/" + specificationPath), + ToolHelper.getAndroidJar(androidJarLevel)); } - public LibraryDesugaringSpecification(String name, Path specification) { - this(name, DESUGARED_JDK_11_LIB_JAR, specification); + // This can be used to build custom specifications for testing purposes. + public LibraryDesugaringSpecification( + String name, Set<Path> desugarJdkLibs, Path specification, Path androidJar) { + this(name, desugarJdkLibs, specification, ImmutableSet.of(androidJar), ""); } - public LibraryDesugaringSpecification(String name, Set<Path> desugarJdkLibs, Path specification) { + // This can be used to build custom specifications for testing purposes. + public LibraryDesugaringSpecification( + String name, + Set<Path> desugarJdkLibs, + Path specification, + Set<Path> libraryFiles, + String extraKeepRules) { this.name = name; this.desugarJdkLibs = desugarJdkLibs; this.specification = specification; + this.libraryFiles = libraryFiles; + this.extraKeepRules = extraKeepRules; } - LibraryDesugaringSpecification(String version) { + private LibraryDesugaringSpecification(String version, AndroidApiLevel androidJarLevel) { this( - "Release_" + version, + "RELEASED_" + version, ImmutableSet.of( - Paths.get(RELEASES_DIR, version, "desugar_jdk_libs.jar"), - Paths.get(RELEASES_DIR, version, "desugar_jdk_libs_configuration.jar")), - Paths.get(RELEASES_DIR, version, "desugar.json")); + Paths.get(DESUGARED_LIB_RELEASES_DIR, version, "desugar_jdk_libs.jar"), + Paths.get(DESUGARED_LIB_RELEASES_DIR, version, "desugar_jdk_libs_configuration.jar")), + Paths.get(DESUGARED_LIB_RELEASES_DIR, version, "desugar.json"), + ToolHelper.getAndroidJar(androidJarLevel)); } @Override @@ -105,11 +132,34 @@ return specification; } - public Path getAndroidJar() { - if (this == JDK8) { - return ToolHelper.getAndroidJar(AndroidApiLevel.P); - } - return ToolHelper.getAndroidJar(AndroidApiLevel.R); + public Set<Path> getLibraryFiles() { + return libraryFiles; + } + + public String getExtraKeepRules() { + return extraKeepRules; + } + + public void configureL8TestBuilder(L8TestBuilder l8TestBuilder) { + configureL8TestBuilder(l8TestBuilder, false, ""); + } + + public void configureL8TestBuilder( + L8TestBuilder l8TestBuilder, boolean l8Shrink, String keepRule) { + l8TestBuilder + .addProgramFiles(getDesugarJdkLibs()) + .addLibraryFiles(getLibraryFiles()) + .setDesugaredLibraryConfiguration(getSpecification()) + .noDefaultDesugarJDKLibs() + .applyIf( + l8Shrink, + builder -> { + if (keepRule != null && !keepRule.trim().isEmpty()) { + String totalKeepRules = keepRule + "\n" + getExtraKeepRules(); + builder.addGeneratedKeepRules(totalKeepRules); + } + }, + L8TestBuilder::setDebug); } public static List<LibraryDesugaringSpecification> getReleased() {
diff --git a/src/test/java/com/android/tools/r8/desugar/twr/CheckTwrOutputForJavaCompilersTest.java b/src/test/java/com/android/tools/r8/desugar/twr/CheckTwrOutputForJavaCompilersTest.java new file mode 100644 index 0000000..baf39e2 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/twr/CheckTwrOutputForJavaCompilersTest.java
@@ -0,0 +1,105 @@ +// Copyright (c) 2022, 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.desugar.twr; + +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.TestRuntime.CfVm; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.utils.AndroidApiLevel; +import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.CodeInspector; +import com.android.tools.r8.utils.codeinspector.InstructionSubject; +import com.google.common.collect.ImmutableSet; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import java.util.stream.Collectors; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; + +@RunWith(Parameterized.class) +public class CheckTwrOutputForJavaCompilersTest extends TestBase { + + static final String EXPECTED = StringUtils.lines("no file", "no file"); + + private final TestParameters parameters; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withCfRuntimes().build(); + } + + public CheckTwrOutputForJavaCompilersTest(TestParameters parameters) { + this.parameters = parameters; + } + + /** + * Test to document that the special $closeResource synthesis is only being done in JDK9. + * + * <p>If this ever fails we will need to verify if the same AutoClosable issues might occur and + * amend the tests in the source-sets specific to that JDK version. + * + * <p>This test is not parameterized over DEX VMs as it primarily to check the javac behavior. The + * testing of the JDK9 code and its desugaring on the DEX VM and API level matrix is thus confined + * to just the JDK9 input defined in the source-set tests for JDK9. + */ + @Test + public void test() throws Exception { + Path javacOut = + javac(parameters.getRuntime().asCf()) + .addSourceFiles(ToolHelper.getSourceFileForTestClass(TwrTestSource.class)) + .compile(); + testForJvm() + .addProgramFiles(javacOut) + .run(parameters.getRuntime(), TwrTestSource.class) + .assertSuccessWithOutput(EXPECTED) + .inspect(this::checkUseOfCloseResource); + testForD8(parameters.getBackend()) + .setMinApi(AndroidApiLevel.B) + .addProgramFiles(javacOut) + .run(parameters.getRuntime(), TwrTestSource.class) + .assertSuccessWithOutput(EXPECTED) + .inspect(this::checkNoUseOfCloseResource); + } + + private void checkUseOfCloseResource(CodeInspector inspector) { + Set<String> methods = + inspector.clazz(TwrTestSource.class).allMethods().stream() + .map(m -> m.getMethod().getName().toString()) + .collect(Collectors.toSet()); + Set<InstructionSubject> callsToCloseResource = getCallsToCloseResource(inspector); + if (parameters.isCfRuntime(CfVm.JDK9)) { + assertEquals(ImmutableSet.of("<init>", "main", "$closeResource"), methods); + assertEquals(4, callsToCloseResource.size()); + } else { + assertEquals(ImmutableSet.of("<init>", "main"), methods); + assertEquals(Collections.emptySet(), callsToCloseResource); + } + } + + private void checkNoUseOfCloseResource(CodeInspector inspector) { + Set<InstructionSubject> callsToCloseResource = getCallsToCloseResource(inspector); + assertEquals(Collections.emptySet(), callsToCloseResource); + } + + private Set<InstructionSubject> getCallsToCloseResource(CodeInspector inspector) { + Set<InstructionSubject> callsToCloseResource = new HashSet<>(); + inspector.forAllClasses( + c -> + c.forAllMethods( + m -> + callsToCloseResource.addAll( + m.streamInstructions() + .filter(InstructionSubject::isInvoke) + .filter(i -> i.getMethod().qualifiedName().contains("$closeResource")) + .collect(Collectors.toSet())))); + return callsToCloseResource; + } +}
diff --git a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java b/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java index de907e5..dd43eb9 100644 --- a/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java +++ b/src/test/java/com/android/tools/r8/desugar/twr/TwrCloseResourceDuplicationTest.java
@@ -11,6 +11,7 @@ import com.android.tools.r8.TestParametersCollection; import com.android.tools.r8.TestRuntime.CfVm; import com.android.tools.r8.examples.JavaExampleClassProxy; +import com.android.tools.r8.synthesis.SyntheticItemsTestUtils; import com.android.tools.r8.utils.StringUtils; import com.android.tools.r8.utils.ZipUtils; import com.android.tools.r8.utils.codeinspector.FoundClassSubject; @@ -32,11 +33,11 @@ private static final String PKG = "twrcloseresourceduplication"; private static final String EXAMPLE = "examplesJava9/" + PKG; private final JavaExampleClassProxy MAIN = - new JavaExampleClassProxy(EXAMPLE, PKG + ".TwrCloseResourceDuplication"); + new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication"); private final JavaExampleClassProxy FOO = - new JavaExampleClassProxy(EXAMPLE, PKG + ".TwrCloseResourceDuplication$Foo"); + new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Foo"); private final JavaExampleClassProxy BAR = - new JavaExampleClassProxy(EXAMPLE, PKG + ".TwrCloseResourceDuplication$Bar"); + new JavaExampleClassProxy(EXAMPLE, PKG + "/TwrCloseResourceDuplication$Bar"); static final int INPUT_CLASSES = 3; @@ -139,9 +140,13 @@ ImmutableSet.of(FOO.typeName(), BAR.typeName(), MAIN.typeName()); if (parameters.getApiLevel().isLessThan(apiLevelWithTwrCloseResourceSupport())) { Set<String> classOutputWithSynthetics = new HashSet<>(nonSyntheticClassOutput); - classOutputWithSynthetics.add(BAR.typeName() + "$$ExternalSyntheticBackport0"); classOutputWithSynthetics.add( - BAR.typeName() + "$$ExternalSyntheticTwrCloseResource1"); + SyntheticItemsTestUtils.syntheticBackportClass(BAR.getClassReference(), 0) + .getTypeName()); + classOutputWithSynthetics.add( + SyntheticItemsTestUtils.syntheticTwrCloseResourceClass( + BAR.getClassReference(), 1) + .getTypeName()); assertEquals(classOutputWithSynthetics, foundClasses); } else { assertEquals(nonSyntheticClassOutput, foundClasses);
diff --git a/src/test/java/com/android/tools/r8/desugar/twr/TwrTestSource.java b/src/test/java/com/android/tools/r8/desugar/twr/TwrTestSource.java new file mode 100644 index 0000000..c256929 --- /dev/null +++ b/src/test/java/com/android/tools/r8/desugar/twr/TwrTestSource.java
@@ -0,0 +1,24 @@ +// Copyright (c) 2022, 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.desugar.twr; + +import java.io.FileNotFoundException; +import java.io.IOException; +import java.util.jar.JarFile; + +public class TwrTestSource { + + public static void main(String[] args) throws IOException { + try (JarFile f = new JarFile(args.length > 0 ? args[0] : "")) { + System.out.println(f.stream().count()); + } catch (FileNotFoundException e) { + System.out.println("no file"); + } + try (JarFile f = new JarFile(args.length > 0 ? args[0] : "")) { + System.out.println(f.stream().count()); + } catch (FileNotFoundException e) { + System.out.println("no file"); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java index 066e758..90cf068 100644 --- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java +++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -18,7 +18,6 @@ import com.android.tools.r8.graph.GraphLens; import com.android.tools.r8.graph.ObjectToOffsetMapping; import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.Reporter; @@ -52,7 +51,6 @@ GlobalSyntheticsStrategy.forNonSynthesizing())); return new ObjectToOffsetMapping( appView, - NamingLens.getIdentityLens(), new LensCodeRewriterUtils(appView), Collections.emptyList(), Collections.emptyList(),
diff --git a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java index ce5a517..bf49805 100644 --- a/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java +++ b/src/test/java/com/android/tools/r8/dex/JumboStringProcessing.java
@@ -7,16 +7,16 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstStringJumbo; -import com.android.tools.r8.code.Goto32; -import com.android.tools.r8.code.IfEq; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.IfNe; -import com.android.tools.r8.code.IfNez; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.ReturnVoid; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstStringJumbo; +import com.android.tools.r8.dex.code.DexGoto32; +import com.android.tools.r8.dex.code.DexIfEq; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexIfNe; +import com.android.tools.r8.dex.code.DexIfNez; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexReturnVoid; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexCode.Try; import com.android.tools.r8.graph.DexCode.TryHandler; @@ -42,15 +42,15 @@ public void branching() { DexItemFactory factory = new DexItemFactory(); DexString string = factory.createString("turn into jumbo"); - Instruction[] instructions = buildInstructions(string, false); + DexInstruction[] instructions = buildInstructions(string, false); DexCode code = jumboStringProcess(factory, string, instructions); - Instruction[] rewrittenInstructions = code.instructions; - assert rewrittenInstructions[1] instanceof IfEq; - IfEq condition = (IfEq) rewrittenInstructions[1]; + DexInstruction[] rewrittenInstructions = code.instructions; + assert rewrittenInstructions[1] instanceof DexIfEq; + DexIfEq condition = (DexIfEq) rewrittenInstructions[1]; assert condition.getOffset() + condition.CCCC == rewrittenInstructions[3].getOffset(); - assert rewrittenInstructions[2] instanceof Goto32; - Goto32 jump = (Goto32) rewrittenInstructions[2]; - Instruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1]; + assert rewrittenInstructions[2] instanceof DexGoto32; + DexGoto32 jump = (DexGoto32) rewrittenInstructions[2]; + DexInstruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1]; assert jump.getOffset() + jump.AAAAAAAA == lastInstruction.getOffset(); } @@ -58,58 +58,58 @@ public void branching2() { DexItemFactory factory = new DexItemFactory(); DexString string = factory.createString("turn into jumbo"); - Instruction[] instructions = buildInstructions(string, true); + DexInstruction[] instructions = buildInstructions(string, true); DexCode code = jumboStringProcess(factory, string, instructions); - Instruction[] rewrittenInstructions = code.instructions; - assert rewrittenInstructions[1] instanceof IfEqz; - IfEqz condition = (IfEqz) rewrittenInstructions[1]; + DexInstruction[] rewrittenInstructions = code.instructions; + assert rewrittenInstructions[1] instanceof DexIfEqz; + DexIfEqz condition = (DexIfEqz) rewrittenInstructions[1]; assert condition.getOffset() + condition.BBBB == rewrittenInstructions[3].getOffset(); - assert rewrittenInstructions[2] instanceof Goto32; - Goto32 jump = (Goto32) rewrittenInstructions[2]; - Instruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1]; + assert rewrittenInstructions[2] instanceof DexGoto32; + DexGoto32 jump = (DexGoto32) rewrittenInstructions[2]; + DexInstruction lastInstruction = rewrittenInstructions[rewrittenInstructions.length - 1]; assert jump.getOffset() + jump.AAAAAAAA == lastInstruction.getOffset(); } - private Instruction[] buildInstructions(DexString string, boolean zeroCondition) { - List<Instruction> instructions = new ArrayList<>(); + private DexInstruction[] buildInstructions(DexString string, boolean zeroCondition) { + List<DexInstruction> instructions = new ArrayList<>(); int offset = 0; - Instruction instr = new Const4(0, 0); + DexInstruction instr = new DexConst4(0, 0); instr.setOffset(offset); instructions.add(instr); offset += instr.getSize(); int lastInstructionOffset = 15000 * 2 + 2 + offset; if (zeroCondition) { - instr = new IfNez(0, lastInstructionOffset - offset); + instr = new DexIfNez(0, lastInstructionOffset - offset); } else { - instr = new IfNe(0, 0, lastInstructionOffset - offset); + instr = new DexIfNe(0, 0, lastInstructionOffset - offset); } instr.setOffset(offset); instructions.add(instr); offset += instr.getSize(); for (int i = 0; i < 15000; i++) { - instr = new ConstString(0, string); + instr = new DexConstString(0, string); instr.setOffset(offset); instructions.add(instr); offset += instr.getSize(); } - instr = new ReturnVoid(); + instr = new DexReturnVoid(); instr.setOffset(offset); instructions.add(instr); assert instr.getOffset() == lastInstructionOffset; - return instructions.toArray(Instruction.EMPTY_ARRAY); + return instructions.toArray(DexInstruction.EMPTY_ARRAY); } - private int countJumboStrings(Instruction[] instructions) { + private int countJumboStrings(DexInstruction[] instructions) { int count = 0; - for (Instruction instruction : instructions) { - count += instruction instanceof ConstStringJumbo ? 1 : 0; + for (DexInstruction instruction : instructions) { + count += instruction instanceof DexConstStringJumbo ? 1 : 0; } return count; } - private int countSimpleNops(Instruction[] instructions) { + private int countSimpleNops(DexInstruction[] instructions) { int count = 0; - for (Instruction instruction : instructions) { + for (DexInstruction instruction : instructions) { count += instruction.isSimpleNop() ? 1 : 0; } return count; @@ -135,20 +135,20 @@ "getDataBinder", ImmutableList.of( "android.databinding.DataBindingComponent", "android.view.View", "int")); - Instruction[] instructions = method.getDefinition().getCode().asDexCode().instructions; + DexInstruction[] instructions = method.getDefinition().getCode().asDexCode().instructions; assertEquals(0, countJumboStrings(instructions)); assertEquals(1, countSimpleNops(instructions)); DexItemFactory factory = inspector.getFactory(); DexString string = factory.createString("view must have a tag"); DexCode code = jumboStringProcess(factory, string, instructions); - Instruction[] rewrittenInstructions = code.instructions; + DexInstruction[] rewrittenInstructions = code.instructions; assertEquals(289, countJumboStrings(rewrittenInstructions)); assertEquals(0, countSimpleNops(rewrittenInstructions)); } private DexCode jumboStringProcess( - DexItemFactory factory, DexString string, Instruction[] instructions) { + DexItemFactory factory, DexString string, DexInstruction[] instructions) { DexCode code = new DexCode(1, 0, 0, instructions, new Try[0], new TryHandler[0], null); MethodAccessFlags flags = MethodAccessFlags.fromSharedAccessFlags(Constants.ACC_PUBLIC, false); DexEncodedMethod method =
diff --git a/src/test/java/com/android/tools/r8/examples/JavaExampleClassProxy.java b/src/test/java/com/android/tools/r8/examples/JavaExampleClassProxy.java index 6bbbfd1..6eb4ae4 100644 --- a/src/test/java/com/android/tools/r8/examples/JavaExampleClassProxy.java +++ b/src/test/java/com/android/tools/r8/examples/JavaExampleClassProxy.java
@@ -5,6 +5,8 @@ package com.android.tools.r8.examples; import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.references.ClassReference; +import com.android.tools.r8.references.Reference; import com.android.tools.r8.utils.DescriptorUtils; import com.android.tools.r8.utils.StringUtils; import com.google.common.io.ByteStreams; @@ -50,4 +52,8 @@ public String typeName() { return DescriptorUtils.getJavaTypeFromBinaryName(binaryName); } + + public ClassReference getClassReference() { + return Reference.classFromBinaryName(binaryName); + } }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java index 7a44d53..53d28eb 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/RemoveCheckCastAfterClassInlining.java
@@ -14,7 +14,7 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.utils.codeinspector.ClassSubject; @@ -58,7 +58,7 @@ DexCode code = method.getCode().asDexCode(); int numberOfConstStringInstructions = 0; - for (Instruction instruction : code.instructions) { + for (DexInstruction instruction : code.instructions) { // Make sure that we do not load a const-string and then subsequently use a check-cast // instruction to check if it is actually a string. assertFalse(instruction.isCheckCast());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java index f19dea9..7ba5906 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b111893131/B111893131.java
@@ -14,8 +14,8 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.ToolHelper; import com.android.tools.r8.ToolHelper.ProcessResult; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeVirtual; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeVirtual; import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexClass; import com.android.tools.r8.graph.DexCode; @@ -98,10 +98,10 @@ }); } - private void verifyAbsenceOfStringBuilderAppend(Instruction[] instructions) { - for (Instruction instr : instructions) { - if (instr instanceof InvokeVirtual) { - InvokeVirtual invokeVirtual = (InvokeVirtual) instr; + private void verifyAbsenceOfStringBuilderAppend(DexInstruction[] instructions) { + for (DexInstruction instr : instructions) { + if (instr instanceof DexInvokeVirtual) { + DexInvokeVirtual invokeVirtual = (DexInvokeVirtual) instr; DexMethod invokedMethod = invokeVirtual.getMethod(); if (invokedMethod.holder.getName().endsWith("StringBuilder")) { assertNotEquals("append", invokedMethod.name.toString());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java index 7688f9b..9cd0f5f 100644 --- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java +++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -18,12 +18,12 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.SgetObject; -import com.android.tools.r8.code.SputObject; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexSgetObject; +import com.android.tools.r8.dex.code.DexSputObject; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexType; @@ -358,29 +358,29 @@ MethodSignature signature = new MethodSignature(methodName, retValue, params); DexCode code = clazz.method(signature).getMethod().getCode().asDexCode(); return Streams.concat( - filterInstructionKind(code, SgetObject.class) - .map(Instruction::getField) - .filter(fld -> isTypeOfInterest(fld.holder)) - .map(DexField::toSourceString), - filterInstructionKind(code, SputObject.class) - .map(Instruction::getField) - .filter(fld -> isTypeOfInterest(fld.holder)) - .map(DexField::toSourceString), - filterInstructionKind(code, InvokeStatic.class) - .map(insn -> (InvokeStatic) insn) - .map(InvokeStatic::getMethod) - .filter(method -> isTypeOfInterest(method.holder)) - .map(method -> "STATIC: " + method.toSourceString()), - filterInstructionKind(code, InvokeVirtual.class) - .map(insn -> (InvokeVirtual) insn) - .map(InvokeVirtual::getMethod) - .filter(method -> isTypeOfInterest(method.holder)) - .map(method -> "VIRTUAL: " + method.toSourceString()), - filterInstructionKind(code, InvokeDirect.class) - .map(insn -> (InvokeDirect) insn) - .map(InvokeDirect::getMethod) - .filter(method -> isTypeOfInterest(method.holder)) - .map(method -> "DIRECT: " + method.toSourceString())) + filterInstructionKind(code, DexSgetObject.class) + .map(DexInstruction::getField) + .filter(fld -> isTypeOfInterest(fld.holder)) + .map(DexField::toSourceString), + filterInstructionKind(code, DexSputObject.class) + .map(DexInstruction::getField) + .filter(fld -> isTypeOfInterest(fld.holder)) + .map(DexField::toSourceString), + filterInstructionKind(code, DexInvokeStatic.class) + .map(insn -> (DexInvokeStatic) insn) + .map(DexInvokeStatic::getMethod) + .filter(method -> isTypeOfInterest(method.holder)) + .map(method -> "STATIC: " + method.toSourceString()), + filterInstructionKind(code, DexInvokeVirtual.class) + .map(insn -> (DexInvokeVirtual) insn) + .map(DexInvokeVirtual::getMethod) + .filter(method -> isTypeOfInterest(method.holder)) + .map(method -> "VIRTUAL: " + method.toSourceString()), + filterInstructionKind(code, DexInvokeDirect.class) + .map(insn -> (DexInvokeDirect) insn) + .map(DexInvokeDirect::getMethod) + .filter(method -> isTypeOfInterest(method.holder)) + .map(method -> "DIRECT: " + method.toSourceString())) .map(txt -> txt.replace("java.lang.", "")) .map(txt -> txt.replace("com.android.tools.r8.ir.optimize.staticizer.trivial.", "")) .map(txt -> txt.replace("com.android.tools.r8.ir.optimize.staticizer.", ""))
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java new file mode 100644 index 0000000..f908b95 --- /dev/null +++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringBuilderTests.java
@@ -0,0 +1,525 @@ +// Copyright (c) 2022, 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.string; + +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.NeverInline; +import com.android.tools.r8.R8TestCompileResult; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.utils.StringUtils; +import com.android.tools.r8.utils.codeinspector.CodeMatchers; +import com.android.tools.r8.utils.codeinspector.FoundMethodSubject; +import com.android.tools.r8.utils.codeinspector.MethodSubject; +import java.lang.reflect.Method; +import java.util.List; +import java.util.function.Function; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +public class StringBuilderTests extends TestBase { + + @Parameter(0) + public TestParameters parameters; + + @Parameter(1) + public StringBuilderResult stringBuilderTest; + + @Parameters(name = "{0}, configuration: {1}") + public static List<Object[]> data() { + return buildParameters( + getTestParameters().withAllRuntimesAndApiLevels().build(), getTestExpectations()); + } + + private static class StringBuilderResult { + + private final Method method; + private final String expected; + private final int stringBuilders; + private final int appends; + private final int toStrings; + + private StringBuilderResult( + Method method, String expected, int stringBuilders, int appends, int toStrings) { + this.method = method; + this.expected = expected; + this.stringBuilders = stringBuilders; + this.appends = appends; + this.toStrings = toStrings; + } + + private static StringBuilderResult create( + Method method, String expected, int stringBuilders, int appends, int toStrings) { + return new StringBuilderResult(method, expected, stringBuilders, appends, toStrings); + } + + @Override + public String toString() { + return getMethodName(); + } + + String getMethodName() { + return method.getName(); + } + } + + private static StringBuilderResult[] getTestExpectations() { + try { + return new StringBuilderResult[] { + StringBuilderResult.create( + Main.class.getMethod("emptyStringTest"), StringUtils.lines(""), 0, 0, 0), + StringBuilderResult.create( + Main.class.getMethod("simpleStraightLineTest"), + StringUtils.lines("Hello World"), + 0, + 0, + 0), + StringBuilderResult.create( + Main.class.getMethod("notMaterializing"), StringUtils.lines("Hello World"), 0, 0, 0), + StringBuilderResult.create( + Main.class.getMethod("materializingWithAdditionalUnObservedAppend"), + StringUtils.lines("Hello World"), + 0, + 0, + 0), + StringBuilderResult.create( + Main.class.getMethod("materializingWithAdditionalAppend"), + StringUtils.lines("Hello World", "Hello WorldObservable"), + 1, + 3, + 2), + StringBuilderResult.create( + Main.class.getMethod("appendWithNonConstant"), + StringUtils.lines("Hello World, Hello World"), + 1, + 3, + 1), + StringBuilderResult.create( + Main.class.getMethod("simpleLoopTest"), + StringUtils.lines("Hello WorldHello World"), + 1, + 1, + 1), + // TODO(b/222437581): Should not remove StringBuilder + StringBuilderResult.create( + Main.class.getMethod("simpleLoopTest2"), + StringUtils.lines("Hello World", "Hello WorldHello World"), + 0, + 0, + 0), + StringBuilderResult.create( + Main.class.getMethod("simpleLoopWithStringBuilderInBodyTest"), + StringUtils.lines("Hello World"), + 0, + 0, + 0), + StringBuilderResult.create( + Main.class.getMethod("simpleDiamondTest"), + StringUtils.lines("Message: Hello World"), + 0, + 0, + 0), + StringBuilderResult.create( + Main.class.getMethod("diamondWithUseTest"), StringUtils.lines("Hello World"), 1, 3, 1), + StringBuilderResult.create( + Main.class.getMethod("diamondsWithSingleUseTest"), + StringUtils.lines("Hello World"), + 1, + 3, + 1), + StringBuilderResult.create( + Main.class.getMethod("escapeTest"), StringUtils.lines("Hello World"), 2, 2, 1), + StringBuilderResult.create( + Main.class.getMethod("intoPhiTest"), StringUtils.lines("Hello World"), 2, 2, 1), + StringBuilderResult.create( + Main.class.getMethod("optimizePartial"), StringUtils.lines("Hello World.."), 1, 4, 1), + StringBuilderResult.create( + Main.class.getMethod("multipleToStrings"), + StringUtils.lines("Hello World", "Hello World.."), + 1, + 4, + 2), + StringBuilderResult.create( + Main.class.getMethod("changeAppendType"), StringUtils.lines("1 World"), 1, 3, 1), + StringBuilderResult.create( + Main.class.getMethod("checkCapacity"), StringUtils.lines("true"), 2, 1, 0), + StringBuilderResult.create( + Main.class.getMethod("checkHashCode"), StringUtils.lines("false"), 1, 0, 0), + StringBuilderResult.create( + Main.class.getMethod("stringBuilderWithStringBuilderToString"), + StringUtils.lines("Hello World"), + 1, + 1, + 1), + StringBuilderResult.create( + Main.class.getMethod("stringBuilderWithStringBuilder"), + StringUtils.lines("Hello World"), + 2, + 2, + 1), + StringBuilderResult.create( + Main.class.getMethod("stringBuilderInStringBuilderConstructor"), + StringUtils.lines("Hello World"), + 2, + 1, + 1), + StringBuilderResult.create( + Main.class.getMethod("interDependencyTest"), + StringUtils.lines("World Hello World "), + 2, + 2, + 1), + StringBuilderResult.create( + Main.class.getMethod("stringBuilderSelfReference"), StringUtils.lines(""), 1, 1, 1), + StringBuilderResult.create( + Main.class.getMethod("unknownStringBuilderInstruction"), + StringUtils.lines("Hello World"), + 1, + 2, + 1), + }; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private static final Function<TestParameters, R8TestCompileResult> compilationResults = + memoizeFunction(StringBuilderTests::compileR8); + + private static R8TestCompileResult compileR8(TestParameters parameters) throws Exception { + return testForR8(getStaticTemp(), parameters.getBackend()) + .addProgramClasses(Main.class) + .setMinApi(parameters.getApiLevel()) + .addKeepClassAndMembersRules(Main.class) + .enableInliningAnnotations() + .compile(); + } + + @Test + public void testRuntime() throws Exception { + testForRuntime(parameters) + .addProgramClasses(Main.class) + .run(parameters.getRuntime(), Main.class, stringBuilderTest.getMethodName()) + .assertSuccessWithOutput(stringBuilderTest.expected); + } + + @Test + public void testR8() throws Exception { + boolean hasError = + stringBuilderTest.getMethodName().equals("simpleLoopTest2") && parameters.isDexRuntime(); + compilationResults + .apply(parameters) + .inspect( + inspector -> { + if (parameters.isCfRuntime()) { + // TODO(b/114002137): for now, string concatenation depends on rewriteMoveResult. + return; + } + MethodSubject method = inspector.method(stringBuilderTest.method); + assertThat(method, isPresent()); + FoundMethodSubject foundMethodSubject = method.asFoundMethodSubject(); + assertEquals( + stringBuilderTest.stringBuilders, countStringBuilderInits(foundMethodSubject)); + assertEquals( + stringBuilderTest.appends, countStringBuilderAppends(foundMethodSubject)); + assertEquals( + stringBuilderTest.toStrings, countStringBuilderToStrings(foundMethodSubject)); + }) + .run(parameters.getRuntime(), Main.class, stringBuilderTest.getMethodName()) + // TODO(b/222437581): Incorrect result for string builder inside loop. + .assertSuccessWithOutputLinesIf(hasError, "Hello World", "Hello World") + .assertSuccessWithOutputIf(!hasError, stringBuilderTest.expected); + } + + private long countStringBuilderInits(FoundMethodSubject method) { + return countInstructionsOnStringBuilder(method, "<init>"); + } + + private long countStringBuilderAppends(FoundMethodSubject method) { + return countInstructionsOnStringBuilder(method, "append"); + } + + private long countStringBuilderToStrings(FoundMethodSubject method) { + return countInstructionsOnStringBuilder(method, "toString"); + } + + private long countInstructionsOnStringBuilder(FoundMethodSubject method, String methodName) { + return method + .streamInstructions() + .filter( + instructionSubject -> + CodeMatchers.isInvokeWithTarget(typeName(StringBuilder.class), methodName) + .test(instructionSubject)) + .count(); + } + + public static class Main { + + @NeverInline + public static void emptyStringTest() { + StringBuilder sb = new StringBuilder(); + System.out.println(sb.toString()); + } + + @NeverInline + public static void simpleStraightLineTest() { + StringBuilder sb = new StringBuilder(); + sb = sb.append("Hello "); + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void notMaterializing() { + StringBuilder sb = new StringBuilder(); + sb.append("foo"); + if (System.currentTimeMillis() > 0) { + sb.append("bar"); + } + System.out.println("Hello World"); + } + + @NeverInline + public static void materializingWithAdditionalUnObservedAppend() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + sb.append("World"); + System.out.println(sb.toString()); + sb.append("Not observable"); + } + + @NeverInline + public static void materializingWithAdditionalAppend() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + sb.append("World"); + System.out.println(sb.toString()); + sb.append("Observable"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void appendWithNonConstant() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + String other; + if (System.currentTimeMillis() > 0) { + other = "World, Hello "; + } else { + other = "Hello World"; + } + sb.append(other); + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void simpleLoopTest() { + int count = System.currentTimeMillis() > 0 ? 2 : 0; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < count; i++) { + sb.append("Hello World"); + } + System.out.println(sb.toString()); + } + + @NeverInline + public static void simpleLoopTest2() { + int count = System.currentTimeMillis() > 0 ? 2 : 0; + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < count; i++) { + sb.append("Hello World"); + System.out.println(sb.toString()); + } + } + + @NeverInline + public static void simpleLoopWithStringBuilderInBodyTest() { + int count = System.currentTimeMillis() > 0 ? 1 : 0; + while (count > 0) { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + sb.append("World"); + System.out.println(sb.toString()); + count--; + } + } + + @NeverInline + public static void simpleDiamondTest() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + if (System.currentTimeMillis() > 0) { + System.out.print("Message: "); + } else { + throw new RuntimeException(); + } + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void diamondWithUseTest() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello"); + if (System.currentTimeMillis() > 0) { + sb.append(" "); + } else { + sb.append("Planet"); + } + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void diamondsWithSingleUseTest() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello"); + if (System.currentTimeMillis() > 0) { + sb.append(" "); + } + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void escapeTest() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello"); + StringBuilder sbObject; + if (System.currentTimeMillis() > 0) { + sbObject = sb; + } else { + sbObject = new StringBuilder(); + } + escape(sbObject); + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void escape(Object obj) { + ((StringBuilder) obj).append(" "); + } + + @NeverInline + public static void intoPhiTest() { + StringBuilder sb; + if (System.currentTimeMillis() > 0) { + sb = new StringBuilder(); + sb.append("Hello "); + } else { + sb = new StringBuilder(); + sb.append("Other "); + } + sb.append("World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void optimizePartial() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + if (System.currentTimeMillis() > 0) { + sb.append("World"); + } + sb.append("."); + sb.append("."); + System.out.println(sb.toString()); + } + + @NeverInline + public static void multipleToStrings() { + StringBuilder sb = new StringBuilder(); + sb.append("Hello "); + sb.append("World"); + System.out.println(sb.toString()); + sb.append("."); + sb.append("."); + System.out.println(sb.toString()); + } + + @NeverInline + public static void changeAppendType() { + StringBuilder sb = new StringBuilder(); + if (System.currentTimeMillis() == 0) { + sb.append("foo"); + } + sb.append(1); + sb.append(" World"); + System.out.println(sb.toString()); + } + + @NeverInline + public static void checkCapacity() { + StringBuilder stringBuilder = new StringBuilder(); + stringBuilder.append("foo"); + StringBuilder otherBuilder = new StringBuilder("foo"); + System.out.println(stringBuilder.capacity() != otherBuilder.capacity()); + } + + @NeverInline + public static void checkHashCode() { + StringBuilder sb = new StringBuilder(); + System.out.println(sb.hashCode() == 0); + } + + @NeverInline + public static void stringBuilderWithStringBuilderToString() { + System.out.println( + new StringBuilder() + .append(new StringBuilder().append("Hello World").toString()) + .toString()); + } + + @NeverInline + public static void stringBuilderWithStringBuilder() { + System.out.println( + new StringBuilder().append(new StringBuilder().append("Hello World")).toString()); + } + + @NeverInline + public static void stringBuilderInStringBuilderConstructor() { + System.out.println(new StringBuilder(new StringBuilder().append("Hello World")).toString()); + } + + @NeverInline + public static void interDependencyTest() { + StringBuilder sb1 = new StringBuilder("Hello "); + StringBuilder sb2 = new StringBuilder("World "); + sb1.append(sb2); + sb2.append(sb1); + System.out.println(sb2.toString()); + } + + @NeverInline + public static void stringBuilderSelfReference() { + StringBuilder sb = new StringBuilder(); + sb.append(sb); + System.out.println(sb.toString()); + } + + @NeverInline + public static void unknownStringBuilderInstruction() { + StringBuilder sb = new StringBuilder(); + sb.append("Helloo "); + sb.deleteCharAt(5); + sb.append("World"); + System.out.println(sb.toString()); + } + + public static void main(String[] args) throws Exception { + Method method = Main.class.getMethod(args[0]); + method.invoke(null); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java index 12fe431..b7fe293 100644 --- a/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java +++ b/src/test/java/com/android/tools/r8/kotlin/KotlinClassInlinerTest.java
@@ -20,9 +20,9 @@ import com.android.tools.r8.TestParameters; import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfNew; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.NewInstance; -import com.android.tools.r8.code.SgetObject; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNewInstance; +import com.android.tools.r8.dex.code.DexSgetObject; import com.android.tools.r8.graph.DexType; import com.android.tools.r8.naming.MemberNaming.MethodSignature; import com.android.tools.r8.utils.IntBox; @@ -293,11 +293,11 @@ return instruction.getField().getHolderType(); } } else { - Instruction baseInstruction = instruction.asDexInstruction().getInstruction(); - if (baseInstruction instanceof SgetObject) { + DexInstruction baseInstruction = instruction.asDexInstruction().getInstruction(); + if (baseInstruction instanceof DexSgetObject) { return baseInstruction.getField().getHolderType(); - } else if (baseInstruction instanceof NewInstance) { - return ((NewInstance) baseInstruction).getType(); + } else if (baseInstruction instanceof DexNewInstance) { + return ((DexNewInstance) baseInstruction).getType(); } } return null;
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 a540713..ed70ece 100644 --- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java +++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -67,7 +67,6 @@ import com.android.tools.r8.ir.regalloc.RegisterAllocator; import com.android.tools.r8.ir.synthetic.SynthesizedCode; import com.android.tools.r8.jasmin.JasminBuilder; -import com.android.tools.r8.naming.NamingLens; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.origin.SynthesizedOrigin; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; @@ -892,8 +891,7 @@ AppView.createForD8( AppInfo.createInitialAppInfo( application, GlobalSyntheticsStrategy.forNonSynthesizing())), - null, - NamingLens.getIdentityLens()); + null); ExecutorService executor = ThreadUtils.getExecutorService(options); AndroidAppConsumers compatSink = new AndroidAppConsumers(options); try {
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java new file mode 100644 index 0000000..62de8e6 --- /dev/null +++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingArrayTest.java
@@ -0,0 +1,71 @@ +// Copyright (c) 2022, 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.memberrebinding; + +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 MemberRebindingArrayTest extends TestBase { + + private final TestParameters parameters; + private final String[] EXPECTED = new String[] {"hashCode", "equals"}; + + @Parameterized.Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + public MemberRebindingArrayTest(TestParameters parameters) { + this.parameters = parameters; + } + + @Test + public void testRuntime() throws Exception { + testForRuntime(parameters) + .addProgramClassFileData(getMainWithRewrittenEqualsAndHashCode()) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines(EXPECTED); + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addProgramClassFileData(getMainWithRewrittenEqualsAndHashCode()) + .addKeepMainRule(Main.class) + .setMinApi(parameters.getApiLevel()) + .addOptionsModification( + options -> options.apiModelingOptions().disableApiCallerIdentification()) + .run(parameters.getRuntime(), Main.class) + .assertSuccessWithOutputLines(EXPECTED); + } + + private byte[] getMainWithRewrittenEqualsAndHashCode() throws Exception { + return transformer(Main.class) + .transformMethodInsnInMethod( + "main", + (opcode, owner, name, descriptor, isInterface, visitor) -> { + if (owner.equals(binaryName(Object.class))) { + visitor.visitMethodInsn( + opcode, "[" + descriptor(String.class), name, descriptor, isInterface); + } else { + visitor.visitMethodInsn(opcode, owner, name, descriptor, isInterface); + } + }) + .transform(); + } + + public static class Main { + + public static void main(String[] args) { + System.out.println(args.hashCode() != 0 ? "hashCode" : "error_hashCode"); + System.out.println(args.equals(args.clone()) ? "error_equals" : "equals"); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java index df6d1a5..039ba9a 100644 --- a/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java +++ b/src/test/java/com/android/tools/r8/naming/IdentifierNameStringMarkerTest.java
@@ -12,18 +12,18 @@ import com.android.tools.r8.R8FullTestBuilder; import com.android.tools.r8.R8TestCompileResult; import com.android.tools.r8.ThrowableConsumer; -import com.android.tools.r8.code.AputObject; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstClass; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.IputObject; -import com.android.tools.r8.code.NewArray; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.SgetObject; -import com.android.tools.r8.code.SputObject; +import com.android.tools.r8.dex.code.DexAputObject; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstClass; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexIputObject; +import com.android.tools.r8.dex.code.DexNewArray; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexSgetObject; +import com.android.tools.r8.dex.code.DexSputObject; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.smali.SmaliBuilder; @@ -67,8 +67,8 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, ConstString.class, IputObject.class, ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[1]; + DexInvokeDirect.class, DexConstString.class, DexIputObject.class, DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[1]; assertEquals(BOO, constString.getString().toString()); } @@ -100,16 +100,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - IputObject.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexIputObject.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[4]; + constString = (DexConstString) code.instructions[4]; assertEquals(BOO, constString.getString().toString()); } @@ -143,16 +143,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - IputObject.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexIputObject.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[4]; + constString = (DexConstString) code.instructions[4]; assertNotEquals(BOO, constString.getString().toString()); } @@ -180,11 +180,9 @@ assertNotNull(method); DexCode code = method.getCode().asDexCode(); - checkInstructions(code, ImmutableList.of( - ConstString.class, - SputObject.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[0]; + checkInstructions( + code, ImmutableList.of(DexConstString.class, DexSputObject.class, DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[0]; assertEquals(BOO, constString.getString().toString()); } @@ -212,16 +210,18 @@ assertNotNull(method); DexCode code = method.getCode().asDexCode(); - checkInstructions(code, ImmutableList.of( - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - SputObject.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[1]; + checkInstructions( + code, + ImmutableList.of( + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexSputObject.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[1]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[3]; + constString = (DexConstString) code.instructions[3]; assertEquals(BOO, constString.getString().toString()); } @@ -251,16 +251,18 @@ assertNotNull(method); DexCode code = method.getCode().asDexCode(); - checkInstructions(code, ImmutableList.of( - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - SputObject.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[1]; + checkInstructions( + code, + ImmutableList.of( + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexSputObject.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[1]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[3]; + constString = (DexConstString) code.instructions[3]; assertNotEquals(BOO, constString.getString().toString()); } @@ -395,13 +397,13 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - ConstString.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - String s1 = ((ConstString) code.instructions[1]).getString().toString(); - String s2 = ((ConstString) code.instructions[2]).getString().toString(); + DexInvokeDirect.class, + DexConstString.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + String s1 = ((DexConstString) code.instructions[1]).getString().toString(); + String s2 = ((DexConstString) code.instructions[2]).getString().toString(); assertTrue(BOO.equals(s1) || BOO.equals(s2)); assertTrue("Mixed/form.Boo".equals(s1) || "Mixed/form.Boo".equals(s2)); } @@ -439,16 +441,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[4]; + constString = (DexConstString) code.instructions[4]; assertEquals(BOO, constString.getString().toString()); } @@ -487,16 +489,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - SgetObject.class, - ConstString.class, - InvokeVirtual.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexSgetObject.class, + DexConstString.class, + DexInvokeVirtual.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertEquals(BOO, constString.getString().toString()); - constString = (ConstString) code.instructions[4]; + constString = (DexConstString) code.instructions[4]; assertNotEquals(BOO, constString.getString().toString()); } @@ -541,12 +543,12 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - ConstClass.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexConstClass.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertEquals("foo", constString.getString().toString()); } @@ -591,12 +593,12 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - ConstClass.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[2]; + DexInvokeDirect.class, + DexConstClass.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[2]; assertNotEquals("foo", constString.getString().toString()); } @@ -648,16 +650,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - ConstClass.class, - Const4.class, - NewArray.class, - Const4.class, - AputObject.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[6]; + DexInvokeDirect.class, + DexConstClass.class, + DexConst4.class, + DexNewArray.class, + DexConst4.class, + DexAputObject.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[6]; assertEquals("foo", constString.getString().toString()); } @@ -709,16 +711,16 @@ checkInstructions( code, ImmutableList.of( - InvokeDirect.class, - ConstClass.class, - Const4.class, - NewArray.class, - Const4.class, - AputObject.class, - ConstString.class, - InvokeStatic.class, - ReturnVoid.class)); - ConstString constString = (ConstString) code.instructions[6]; + DexInvokeDirect.class, + DexConstClass.class, + DexConst4.class, + DexNewArray.class, + DexConst4.class, + DexAputObject.class, + DexConstString.class, + DexInvokeStatic.class, + DexReturnVoid.class)); + DexConstString constString = (DexConstString) code.instructions[6]; assertNotEquals("foo", constString.getString().toString()); }
diff --git a/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java b/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java index c09e451..c435b84 100644 --- a/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java +++ b/src/test/java/com/android/tools/r8/reachabilitysensitive/ReachabilitySensitiveTest.java
@@ -12,10 +12,10 @@ import com.android.tools.r8.CompilationMode; import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; -import com.android.tools.r8.code.AddIntLit8; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.dex.Marker.Tool; +import com.android.tools.r8.dex.code.DexAddIntLit8; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexDebugEvent.StartLocal; import com.android.tools.r8.utils.AndroidApiLevel; @@ -145,16 +145,16 @@ private void checkAnnotatedCode(DexCode code) { // All live at the same time: receiver, i, j, k, System.out. assertEquals(5, code.registerSize); - Instruction first = code.instructions[0]; - Instruction second = code.instructions[1]; - Instruction third = code.instructions[2]; + DexInstruction first = code.instructions[0]; + DexInstruction second = code.instructions[1]; + DexInstruction third = code.instructions[2]; // None of the local declarations overwrite other locals. - assertTrue(first instanceof Const4); - assertTrue(second instanceof AddIntLit8); - assertTrue(third instanceof AddIntLit8); - int firstRegister = ((Const4) first).A; - int secondRegister = ((AddIntLit8) second).AA; - int thirdRegister = ((AddIntLit8) third).AA; + assertTrue(first instanceof DexConst4); + assertTrue(second instanceof DexAddIntLit8); + assertTrue(third instanceof DexAddIntLit8); + int firstRegister = ((DexConst4) first).A; + int secondRegister = ((DexAddIntLit8) second).AA; + int thirdRegister = ((DexAddIntLit8) third).AA; assertFalse(firstRegister == secondRegister); assertFalse(firstRegister == thirdRegister); assertFalse(secondRegister == thirdRegister);
diff --git a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java index 33bef6d..535da71 100644 --- a/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java +++ b/src/test/java/com/android/tools/r8/regress/b111250398/B111250398.java
@@ -9,9 +9,9 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.TestBase; -import com.android.tools.r8.code.Iget; -import com.android.tools.r8.code.IgetObject; -import com.android.tools.r8.code.Sget; +import com.android.tools.r8.dex.code.DexIget; +import com.android.tools.r8.dex.code.DexIgetObject; +import com.android.tools.r8.dex.code.DexSget; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.utils.AndroidApp; @@ -214,24 +214,24 @@ private long countIget(DexCode code, DexField field) { return Arrays.stream(code.instructions) - .filter(instruction -> instruction instanceof Iget) - .map(instruction -> (Iget) instruction) + .filter(instruction -> instruction instanceof DexIget) + .map(instruction -> (DexIget) instruction) .filter(get -> get.getField() == field) .count(); } private long countSget(DexCode code, DexField field) { return Arrays.stream(code.instructions) - .filter(instruction -> instruction instanceof Sget) - .map(instruction -> (Sget) instruction) + .filter(instruction -> instruction instanceof DexSget) + .map(instruction -> (DexSget) instruction) .filter(get -> get.getField() == field) .count(); } private long countIgetObject(MethodSubject method, FieldSubject field) { return Arrays.stream(method.getMethod().getCode().asDexCode().instructions) - .filter(instruction -> instruction instanceof IgetObject) - .map(instruction -> (IgetObject) instruction) + .filter(instruction -> instruction instanceof DexIgetObject) + .map(instruction -> (DexIgetObject) instruction) .filter(get -> get.getField() == field.getField().getReference()) .count(); }
diff --git a/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java b/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java index 294dbbc..b6f3d94 100644 --- a/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java +++ b/src/test/java/com/android/tools/r8/regress/b113326860/B113326860.java
@@ -13,9 +13,9 @@ import com.android.tools.r8.CompilationMode; import com.android.tools.r8.D8Command; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.code.Sput; -import com.android.tools.r8.code.SputBoolean; -import com.android.tools.r8.code.SputObject; +import com.android.tools.r8.dex.code.DexSput; +import com.android.tools.r8.dex.code.DexSputBoolean; +import com.android.tools.r8.dex.code.DexSputObject; import com.android.tools.r8.ir.code.SingleConstant; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.AndroidApp; @@ -113,10 +113,12 @@ assertThat(clazz, isPresent()); MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of()); assertThat(method, isPresent()); - assertFalse(Arrays.stream(method.getMethod().getCode().asDexCode().instructions) - .anyMatch(i -> i instanceof SputBoolean || i instanceof Sput)); - assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions) - .anyMatch(i -> i instanceof SputObject)); + assertFalse( + Arrays.stream(method.getMethod().getCode().asDexCode().instructions) + .anyMatch(i -> i instanceof DexSputBoolean || i instanceof DexSput)); + assertTrue( + Arrays.stream(method.getMethod().getCode().asDexCode().instructions) + .anyMatch(i -> i instanceof DexSputObject)); } @Test @@ -128,8 +130,9 @@ assertThat(clazz, isPresent()); MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of()); assertThat(method, isPresent()); - assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions) - .anyMatch(i -> i instanceof SputBoolean)); + assertTrue( + Arrays.stream(method.getMethod().getCode().asDexCode().instructions) + .anyMatch(i -> i instanceof DexSputBoolean)); } @Test @@ -141,8 +144,9 @@ assertThat(clazz, isPresent()); MethodSubject method = clazz.method("void", "<clinit>", ImmutableList.of()); assertThat(method, isPresent()); - assertTrue(Arrays.stream(method.getMethod().getCode().asDexCode().instructions) - .anyMatch(i -> i instanceof SputBoolean)); + assertTrue( + Arrays.stream(method.getMethod().getCode().asDexCode().instructions) + .anyMatch(i -> i instanceof DexSputBoolean)); } @Test
diff --git a/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java b/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java index 5aa5d24..0703498 100644 --- a/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java +++ b/src/test/java/com/android/tools/r8/regress/b115552239/B115552239.java
@@ -12,9 +12,9 @@ import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.D8Command; import com.android.tools.r8.ToolHelper; -import com.android.tools.r8.code.CmpgFloat; -import com.android.tools.r8.code.IfGez; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexCmpgFloat; +import com.android.tools.r8.dex.code.DexIfGez; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.AndroidApp; @@ -58,14 +58,14 @@ throws IOException, CompilationFailedException, ExecutionException { MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.L.getLevel()); boolean previousWasCmp = false; - Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions; - assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof CmpgFloat)); - for (Instruction instruction : instructions) { - if (instruction instanceof CmpgFloat) { + DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions; + assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof DexCmpgFloat)); + for (DexInstruction instruction : instructions) { + if (instruction instanceof DexCmpgFloat) { previousWasCmp = true; continue; } else if (previousWasCmp) { - assertTrue(instruction instanceof IfGez); + assertTrue(instruction instanceof DexIfGez); } previousWasCmp = false; } @@ -76,15 +76,15 @@ throws IOException, CompilationFailedException, ExecutionException { MethodSubject method = compileTestClassAndGetMethod(AndroidApiLevel.M.getLevel()); boolean previousWasCmp = false; - Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions; - assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof CmpgFloat)); - for (Instruction instruction : instructions) { - if (instruction instanceof CmpgFloat) { + DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions; + assertTrue(Arrays.stream(instructions).anyMatch(i -> i instanceof DexCmpgFloat)); + for (DexInstruction instruction : instructions) { + if (instruction instanceof DexCmpgFloat) { previousWasCmp = true; continue; } else if (previousWasCmp) { // We lowered the const instruction as close to its use as possible. - assertFalse(instruction instanceof IfGez); + assertFalse(instruction instanceof DexIfGez); } previousWasCmp = false; }
diff --git a/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java b/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java index 4c092ce..4da22f8 100644 --- a/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java +++ b/src/test/java/com/android/tools/r8/regress/b117907456/B117907456.java
@@ -11,12 +11,9 @@ import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.TestBase; -import com.android.tools.r8.code.Goto; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.ReturnWide; -import com.android.tools.r8.code.Throw; +import com.android.tools.r8.dex.code.DexGoto; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; @@ -37,17 +34,17 @@ public class B117907456 extends TestBase { - private boolean isGoto(Instruction lastInstruction) { - return lastInstruction instanceof Goto; + private boolean isGoto(DexInstruction lastInstruction) { + return lastInstruction instanceof DexGoto; } @Test public void testNopDupInsertionForDalvikTracingBug() throws IOException, CompilationFailedException, ExecutionException { MethodSubject method = getMethodSubject(AndroidApiLevel.K); - Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions; - Instruction lastInstruction = instructions[instructions.length - 1]; - assertFalse(lastInstruction instanceof Throw); + DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions; + DexInstruction lastInstruction = instructions[instructions.length - 1]; + assertFalse(lastInstruction instanceof DexThrow); assertTrue(isGoto(lastInstruction)); } @@ -55,9 +52,9 @@ public void testNoNopDupInsertionForDalvikTracingBug() throws IOException, CompilationFailedException, ExecutionException { MethodSubject method = getMethodSubject(AndroidApiLevel.L); - Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions; - Instruction lastInstruction = instructions[instructions.length - 1]; - assertTrue(lastInstruction instanceof Throw); + DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions; + DexInstruction lastInstruction = instructions[instructions.length - 1]; + assertTrue(lastInstruction instanceof DexThrow); } private MethodSubject getMethodSubject(AndroidApiLevel level)
diff --git a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java index d3604b6..78694ea 100644 --- a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java +++ b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
@@ -10,7 +10,7 @@ import com.android.tools.r8.TestBase; import com.android.tools.r8.TestParameters; import com.android.tools.r8.TestParametersCollection; -import com.android.tools.r8.code.MoveWide; +import com.android.tools.r8.dex.code.DexMoveWide; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; import com.android.tools.r8.utils.codeinspector.MethodSubject; @@ -54,8 +54,9 @@ } private void checkNoMoveWide(MethodSubject m) { - assertTrue(Arrays.stream(m.getMethod().getCode().asDexCode().instructions) - .noneMatch(i -> i instanceof MoveWide)); + assertTrue( + Arrays.stream(m.getMethod().getCode().asDexCode().instructions) + .noneMatch(i -> i instanceof DexMoveWide)); } }
diff --git a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java index 7fb7e88..375b845 100644 --- a/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java +++ b/src/test/java/com/android/tools/r8/regress/b77496850/B77496850.java
@@ -7,8 +7,8 @@ import static org.junit.Assert.assertEquals; import com.android.tools.r8.TestBase; -import com.android.tools.r8.code.InvokeStatic; import com.android.tools.r8.dex.Marker.Tool; +import com.android.tools.r8.dex.code.DexInvokeStatic; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexItemFactory; import com.android.tools.r8.graph.DexMethod; @@ -419,8 +419,8 @@ factory.booleanDescriptor, new DexString[]{factory.doubleDescriptor}); for (int i = 0; i < code.instructions.length; i++) { - if (code.instructions[i] instanceof InvokeStatic) { - InvokeStatic invoke = (InvokeStatic) code.instructions[i]; + if (code.instructions[i] instanceof DexInvokeStatic) { + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[i]; if (invoke.getMethod() == doubleIsNaN) { count++; }
diff --git a/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java b/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java index b3fc08f..1d70128 100644 --- a/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java +++ b/src/test/java/com/android/tools/r8/regress/b80262475/B80262475.java
@@ -5,18 +5,13 @@ package com.android.tools.r8.regress.b80262475; import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; -import static junit.framework.TestCase.assertTrue; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.assertFalse; import com.android.tools.r8.CompilationFailedException; import com.android.tools.r8.TestBase; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.LongToInt; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.ReturnWide; -import com.android.tools.r8.code.Throw; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexLongToInt; import com.android.tools.r8.utils.AndroidApiLevel; import com.android.tools.r8.utils.codeinspector.ClassSubject; import com.android.tools.r8.utils.codeinspector.CodeInspector; @@ -35,9 +30,9 @@ public class B80262475 extends TestBase { - private boolean overlappingLongToIntInputAndOutput(Instruction instruction) { - if (instruction instanceof LongToInt) { - LongToInt longToInt = (LongToInt) instruction; + private boolean overlappingLongToIntInputAndOutput(DexInstruction instruction) { + if (instruction instanceof DexLongToInt) { + DexLongToInt longToInt = (DexLongToInt) instruction; return longToInt.A == longToInt.B; } return false; @@ -47,8 +42,8 @@ public void testLongToIntOverlap() throws IOException, CompilationFailedException, ExecutionException { MethodSubject method = getMethodSubject(AndroidApiLevel.L); - Instruction[] instructions = method.getMethod().getCode().asDexCode().instructions; - for (Instruction instruction : instructions) { + DexInstruction[] instructions = method.getMethod().getCode().asDexCode().instructions; + for (DexInstruction instruction : instructions) { assertFalse(overlappingLongToIntInputAndOutput(instruction)); } }
diff --git a/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificAbstractOnIncompletePathTest.java b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificAbstractOnIncompletePathTest.java new file mode 100644 index 0000000..cf882a8 --- /dev/null +++ b/src/test/java/com/android/tools/r8/resolution/duplicatedefinitions/MaximallySpecificAbstractOnIncompletePathTest.java
@@ -0,0 +1,151 @@ +// Copyright (c) 2022, 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.resolution.duplicatedefinitions; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; +import static org.junit.Assume.assumeTrue; + +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestCompilerBuilder; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.ToolHelper.DexVm.Version; +import com.android.tools.r8.graph.AppInfoWithClassHierarchy; +import com.android.tools.r8.graph.AppView; +import com.android.tools.r8.graph.DexMethod; +import com.android.tools.r8.graph.MethodResolutionResult; +import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult; +import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate; +import com.android.tools.r8.utils.AndroidApp; +import com.android.tools.r8.utils.ZipUtils.ZipBuilder; +import java.nio.file.Path; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +/** + * Reproduction of b/231928368. This is testing resolving Main.f for: + * + * <pre> + * I: I_L { abstract f }, I_P { } + * class Main implements I + * </pre> + */ +@RunWith(Parameterized.class) +public class MaximallySpecificAbstractOnIncompletePathTest extends TestBase { + + @Parameter() public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withAllRuntimesAndApiLevels().build(); + } + + private Path libraryClasses; + + @Before + public void setup() throws Exception { + libraryClasses = temp.newFile("lib.jar").toPath(); + ZipBuilder.builder(libraryClasses) + .addFilesRelative( + ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(I.class)) + .build(); + } + + @Test + public void testResolution() throws Exception { + assumeTrue(parameters.isOrSimulateNoneRuntime()); + AppView<AppInfoWithClassHierarchy> appView = + computeAppViewWithClassHierarchy( + AndroidApp.builder() + .addClassProgramData(getMainWithoutFoo(), getIOnProgram()) + .addLibraryFiles(parameters.getDefaultRuntimeLibrary(), libraryClasses) + .build(), + null, + options -> options.loadAllClassDefinitions = true); + AppInfoWithClassHierarchy appInfo = appView.appInfo(); + DexMethod method = buildNullaryVoidMethod(Main.class, "foo", appInfo.dexItemFactory()); + MethodResolutionResult methodResolutionResult = + appInfo.unsafeResolveMethodDueToDexFormat(method); + assertTrue(methodResolutionResult.isSingleResolution()); + SingleResolutionResult<?> resolution = methodResolutionResult.asSingleResolution(); + assertTrue(resolution.getResolvedHolder().isLibraryClass()); + assertEquals( + "void " + typeName(I.class) + ".foo()", resolution.getResolvedMethod().toSourceString()); + } + + @Test + public void testJvm() throws Exception { + assumeTrue(parameters.isCfRuntime()); + testForJvm() + .addRunClasspathFiles(libraryClasses) + .addProgramClassFileData(getMainWithoutFoo(), getIOnProgram()) + .run(parameters.getRuntime(), Main.class) + .assertFailureWithErrorThatThrows(AbstractMethodError.class); + } + + @Test + public void testD8() throws Exception { + assumeTrue(parameters.isDexRuntime()); + Version dexRuntime = parameters.getDexRuntimeVersion(); + testForD8(parameters.getBackend()) + .apply(this::setupTestBuilder) + .compile() + .addBootClasspathFiles(buildOnDexRuntime(parameters, libraryClasses)) + .run(parameters.getRuntime(), Main.class) + .assertFailureWithErrorThatThrowsIf(dexRuntime.isDalvik(), VerifyError.class) + .assertFailureWithErrorThatThrowsIf(!dexRuntime.isDalvik(), AbstractMethodError.class); + } + + @Test + public void testR8() throws Exception { + testForR8(parameters.getBackend()) + .addKeepMainRule(Main.class) + .apply(this::setupTestBuilder) + .compile() + .addBootClasspathFiles(buildOnDexRuntime(parameters, libraryClasses)) + .run(parameters.getRuntime(), Main.class) + // TODO(b/230289235): Extend to support multiple definition results. + .assertFailureWithErrorThatThrows(NoSuchMethodError.class); + } + + private void setupTestBuilder(TestCompilerBuilder<?, ?, ?, ?, ?> testBuilder) throws Exception { + testBuilder + .addProgramClassFileData(getMainWithoutFoo(), getIOnProgram()) + .addDefaultRuntimeLibrary(parameters) + .addLibraryFiles(libraryClasses) + .setMinApi(parameters.getApiLevel()) + .addOptionsModification(options -> options.loadAllClassDefinitions = true); + } + + private byte[] getMainWithoutFoo() throws Exception { + return transformer(Main.class).removeMethods(MethodPredicate.onName("foo")).transform(); + } + + private byte[] getIOnProgram() throws Exception { + return transformer(I.class).removeMethods(MethodPredicate.all()).transform(); + } + + public interface I { + void foo(); + } + + public static class Main implements I { + + public static void main(String[] args) { + new Main().foo(); + } + + @Override + public void foo() { + System.out.println("Should have been removed"); + } + } +}
diff --git a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java index 662b22e..eb4bb23 100644 --- a/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java +++ b/src/test/java/com/android/tools/r8/rewrite/staticvalues/StaticValuesTest.java
@@ -9,8 +9,8 @@ import static org.junit.Assert.assertTrue; import com.android.tools.r8.ToolHelper.ProcessResult; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.SgetBoolean; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexSgetBoolean; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexValue; import com.android.tools.r8.smali.SmaliBuilder; @@ -393,8 +393,8 @@ assertEquals(("5"), value.asDexValueString().getValue().toString()); DexCode code = inspector.clazz("Test").clinit().getMethod().getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof SgetBoolean); - assertTrue(code.instructions[1] instanceof IfEqz); + assertTrue(code.instructions[0] instanceof DexSgetBoolean); + assertTrue(code.instructions[1] instanceof DexIfEqz); String result = runArt(processedApplication);
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java index bcd4063..03275f0 100644 --- a/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java +++ b/src/test/java/com/android/tools/r8/rewrite/switches/SwitchRewritingTest.java
@@ -8,14 +8,14 @@ import static org.junit.Assert.assertTrue; import com.android.tools.r8.CompilationFailedException; -import com.android.tools.r8.code.Const; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstHigh16; -import com.android.tools.r8.code.IfEq; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.PackedSwitch; -import com.android.tools.r8.code.SparseSwitch; +import com.android.tools.r8.dex.code.DexConst; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstHigh16; +import com.android.tools.r8.dex.code.DexIfEq; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexPackedSwitch; +import com.android.tools.r8.dex.code.DexSparseSwitch; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.smali.SmaliBuilder; @@ -30,10 +30,10 @@ public class SwitchRewritingTest extends SmaliTestBase { - private boolean some16BitConst(Instruction instruction) { - return instruction instanceof Const4 - || instruction instanceof ConstHigh16 - || instruction instanceof Const; + private boolean some16BitConst(DexInstruction instruction) { + return instruction instanceof DexConst4 + || instruction instanceof DexConstHigh16 + || instruction instanceof DexConst; } private void runSingleCaseDexTest(boolean packed, int key) throws CompilationFailedException { @@ -88,11 +88,11 @@ if (key == 0) { assertEquals(5, code.instructions.length); - assertTrue(code.instructions[0] instanceof IfEqz); + assertTrue(code.instructions[0] instanceof DexIfEqz); } else { assertEquals(6, code.instructions.length); assertTrue(some16BitConst(code.instructions[0])); - assertTrue(code.instructions[1] instanceof IfEq); + assertTrue(code.instructions[1] instanceof DexIfEq); } } @@ -158,13 +158,13 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); if (keyStep <= 2) { - assertTrue(code.instructions[0] instanceof PackedSwitch); + assertTrue(code.instructions[0] instanceof DexPackedSwitch); } else { if (additionalLastKey != null && additionalLastKey == Integer.MAX_VALUE) { - assertTrue(code.instructions[0] instanceof Const); - assertTrue(code.instructions[1] instanceof IfEq); + assertTrue(code.instructions[0] instanceof DexConst); + assertTrue(code.instructions[1] instanceof DexIfEq); } else { - assertTrue(code.instructions[0] instanceof SparseSwitch); + assertTrue(code.instructions[0] instanceof DexSparseSwitch); } } }
diff --git a/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java b/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java index 7429b43..afd71b9 100644 --- a/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java +++ b/src/test/java/com/android/tools/r8/smali/BinopLiteralTest.java
@@ -7,11 +7,11 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.Const16; -import com.android.tools.r8.code.Format22b; -import com.android.tools.r8.code.Format22s; -import com.android.tools.r8.code.Return; import com.android.tools.r8.dex.Constants; +import com.android.tools.r8.dex.code.DexConst16; +import com.android.tools.r8.dex.code.DexFormat22b; +import com.android.tools.r8.dex.code.DexFormat22s; +import com.android.tools.r8.dex.code.DexReturn; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import java.util.Arrays; @@ -63,9 +63,9 @@ ); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Format22b); - assertEquals(lit8Value, ((Format22b) code.instructions[0]).CC); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexFormat22b); + assertEquals(lit8Value, ((DexFormat22b) code.instructions[0]).CC); + assertTrue(code.instructions[1] instanceof DexReturn); } } } @@ -88,9 +88,9 @@ ); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Format22s); - assertEquals(lit16Value, ((Format22s) code.instructions[0]).CCCC); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexFormat22s); + assertEquals(lit16Value, ((DexFormat22s) code.instructions[0]).CCCC); + assertTrue(code.instructions[1] instanceof DexReturn); } } } @@ -111,9 +111,9 @@ ); DexCode code = method.getCode().asDexCode(); assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const16); - assertEquals(lit16Value, ((Const16) code.instructions[0]).BBBB); - assertTrue(code.instructions[2] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst16); + assertEquals(lit16Value, ((DexConst16) code.instructions[0]).BBBB); + assertTrue(code.instructions[2] instanceof DexReturn); } } }
diff --git a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java index b9a9dc8..54fe690 100644 --- a/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java +++ b/src/test/java/com/android/tools/r8/smali/ConstantFoldingTest.java
@@ -6,12 +6,12 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.DivIntLit8; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.RemIntLit8; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnWide; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexDivIntLit8; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexRemIntLit8; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexReturnWide; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; @@ -135,13 +135,13 @@ assertTrue(code.instructions[0] instanceof WideConstant); assertEquals(test.result.longValue(), ((WideConstant) code.instructions[0]).decodedValue()); - assertTrue(code.instructions[1] instanceof ReturnWide); + assertTrue(code.instructions[1] instanceof DexReturnWide); } else { assertTrue(code.instructions[0] instanceof SingleConstant); assertEquals( test.result.longValue(), (long) ((SingleConstant) code.instructions[0]).decodedValue()); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } } @@ -211,50 +211,50 @@ testBuilder.addTest( (builder, name, parameters) -> { builder.addStaticMethod( - "int", name, Collections.singletonList("int"), + "int", + name, + Collections.singletonList("int"), 2, " const/4 v0, 1 ", " const/4 v1, 0 ", " div-int/2addr v0, v1 ", - " return v0\n " - ); + " return v0\n "); }, (method, parameters) -> { DexCode code = method.getCode().asDexCode(); // Division by zero is not folded, but div-int/lit8 is used. assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertTrue(code.instructions[1] instanceof DivIntLit8); - assertEquals(0, ((DivIntLit8) code.instructions[1]).CC); - assertTrue(code.instructions[2] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertTrue(code.instructions[1] instanceof DexDivIntLit8); + assertEquals(0, ((DexDivIntLit8) code.instructions[1]).CC); + assertTrue(code.instructions[2] instanceof DexReturn); }, - null - ); + null); } private void addDivIntFoldRemByZero(SmaliBuilderWithCheckers testBuilder) { testBuilder.addTest( (builder, name, parameters) -> { builder.addStaticMethod( - "int", name, Collections.singletonList("int"), - 2, - " const/4 v0, 1 ", - " const/4 v1, 0 ", - " rem-int/2addr v0, v1 ", - " return v0\n " - ); + "int", + name, + Collections.singletonList("int"), + 2, + " const/4 v0, 1 ", + " const/4 v1, 0 ", + " rem-int/2addr v0, v1 ", + " return v0\n "); }, (method, parameters) -> { DexCode code = method.getCode().asDexCode(); // Division by zero is not folded, but rem-int/lit8 is used. assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertTrue(code.instructions[1] instanceof RemIntLit8); - assertEquals(0, ((RemIntLit8) code.instructions[1]).CC); - assertTrue(code.instructions[2] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertTrue(code.instructions[1] instanceof DexRemIntLit8); + assertEquals(0, ((DexRemIntLit8) code.instructions[1]).CC); + assertTrue(code.instructions[2] instanceof DexReturn); }, - null - ); + null); } public class UnopTestData { @@ -302,12 +302,12 @@ if (wide) { assertTrue(code.instructions[0] instanceof WideConstant); assertEquals(test.result.longValue(), ((WideConstant) code.instructions[0]).decodedValue()); - assertTrue(code.instructions[1] instanceof ReturnWide); + assertTrue(code.instructions[1] instanceof DexReturnWide); } else { assertTrue(code.instructions[0] instanceof SingleConstant); assertEquals( test.result.longValue(), (long) ((SingleConstant) code.instructions[0]).decodedValue()); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } } @@ -330,12 +330,12 @@ addUnopTest(testBuilder, new UnopTestData("double", "neg", doubleBits(-0.0), doubleBits(0.0))); } - private void assertConstValue(int expected, Instruction insn) { + private void assertConstValue(int expected, DexInstruction insn) { assertTrue(insn instanceof SingleConstant); assertEquals(expected, ((SingleConstant) insn).decodedValue()); } - private void assertConstValue(long expected, Instruction insn) { + private void assertConstValue(long expected, DexInstruction insn) { assertTrue(insn instanceof WideConstant); assertEquals(expected, ((WideConstant) insn).decodedValue()); } @@ -393,7 +393,7 @@ // Test that this just returns a constant. assertEquals(2, code.instructions.length); assertConstValue(test.expected, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } private void addLogicalOperatorsFoldTests(SmaliBuilderWithCheckers testBuilder) { @@ -476,7 +476,7 @@ // Test that this just returns a constant. assertEquals(2, code.instructions.length); assertConstValue(data.expected, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } public void addShiftOperatorsFolding(SmaliBuilderWithCheckers testBuilder) { @@ -560,7 +560,7 @@ // Test that this just returns a constant. assertEquals(2, code.instructions.length); assertConstValue(data.expected, code.instructions[0]); - assertTrue(code.instructions[1] instanceof ReturnWide); + assertTrue(code.instructions[1] instanceof DexReturnWide); } public void addShiftOperatorsFoldingWide(SmaliBuilderWithCheckers testBuilder) { @@ -598,7 +598,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(~value, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } private void addNotIntFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception { @@ -620,7 +620,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(~value, code.instructions[0]); - assertTrue(code.instructions[1] instanceof ReturnWide); + assertTrue(code.instructions[1] instanceof DexReturnWide); } @@ -650,7 +650,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(-value, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } private void addNegIntFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception { @@ -673,7 +673,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(-value, code.instructions[0]); - assertTrue(code.instructions[1] instanceof ReturnWide); + assertTrue(code.instructions[1] instanceof DexReturnWide); } private void addNegLongFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception { @@ -748,7 +748,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(test.expected ? 1: 0, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } private void addCmpFloatFoldTests(SmaliBuilderWithCheckers testBuilder) throws Exception { @@ -856,7 +856,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(test.expected ? 1: 0, code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } @@ -920,7 +920,7 @@ DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); assertConstValue(Long.compare(values[0], values[1]), code.instructions[0]); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[1] instanceof DexReturn); } private void addCmpLongFold(SmaliBuilderWithCheckers testBuilder) throws Exception {
diff --git a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java index d42de0f..35dee6e 100644 --- a/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java +++ b/src/test/java/com/android/tools/r8/smali/IfSimplificationTest.java
@@ -7,16 +7,16 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.IfGez; -import com.android.tools.r8.code.IfGtz; -import com.android.tools.r8.code.IfLez; -import com.android.tools.r8.code.IfLtz; -import com.android.tools.r8.code.IfNez; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnObject; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexIfGez; +import com.android.tools.r8.dex.code.DexIfGtz; +import com.android.tools.r8.dex.code.DexIfLez; +import com.android.tools.r8.dex.code.DexIfLtz; +import com.android.tools.r8.dex.code.DexIfNez; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexReturnObject; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.ir.code.If.Type; @@ -55,9 +55,9 @@ " goto :label_1"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -75,9 +75,9 @@ " goto :label_1"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(2, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(2, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -99,9 +99,9 @@ " goto :label_1"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -123,9 +123,9 @@ " goto :label_2"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -154,9 +154,9 @@ " goto :label_2"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -181,7 +181,7 @@ " return v0"); DexCode code = method.getCode().asDexCode(); assertEquals(10, code.instructions.length); - assertTrue(code.instructions[9] instanceof Return); + assertTrue(code.instructions[9] instanceof DexReturn); } @Test @@ -199,9 +199,9 @@ " goto :label_2"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertTrue(code.instructions[0] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } @Test @@ -257,10 +257,10 @@ " goto :label_1"); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof Const4); + assertTrue(code.instructions[0] instanceof DexConst4); int expected = test.results[type.ordinal()] ? 1 : 0; - assertEquals(expected, ((Const4) code.instructions[0]).B); - assertTrue(code.instructions[1] instanceof Return); + assertEquals(expected, ((DexConst4) code.instructions[0]).B); + assertTrue(code.instructions[1] instanceof DexReturn); } } } @@ -288,113 +288,121 @@ DexCode code = method.getCode().asDexCode(); assertEquals(5, code.instructions.length); assertTrue(expected.isInstance(code.instructions[0])); - assertTrue(code.instructions[4] instanceof Return); + assertTrue(code.instructions[4] instanceof DexReturn); } @Test public void testRewriteIfWithConstZero() { - runRewriteIfWithConstZeroTest(Type.EQ, true, IfEqz.class); - runRewriteIfWithConstZeroTest(Type.NE, true, IfNez.class); - runRewriteIfWithConstZeroTest(Type.LE, true, IfGez.class); - runRewriteIfWithConstZeroTest(Type.GE, true, IfLez.class); - runRewriteIfWithConstZeroTest(Type.LT, true, IfGtz.class); - runRewriteIfWithConstZeroTest(Type.GT, true, IfLtz.class); + runRewriteIfWithConstZeroTest(Type.EQ, true, DexIfEqz.class); + runRewriteIfWithConstZeroTest(Type.NE, true, DexIfNez.class); + runRewriteIfWithConstZeroTest(Type.LE, true, DexIfGez.class); + runRewriteIfWithConstZeroTest(Type.GE, true, DexIfLez.class); + runRewriteIfWithConstZeroTest(Type.LT, true, DexIfGtz.class); + runRewriteIfWithConstZeroTest(Type.GT, true, DexIfLtz.class); - runRewriteIfWithConstZeroTest(Type.EQ, false, IfEqz.class); - runRewriteIfWithConstZeroTest(Type.NE, false, IfNez.class); - runRewriteIfWithConstZeroTest(Type.LE, false, IfLez.class); - runRewriteIfWithConstZeroTest(Type.GE, false, IfGez.class); - runRewriteIfWithConstZeroTest(Type.LT, false, IfLtz.class); - runRewriteIfWithConstZeroTest(Type.GT, false, IfGtz.class); + runRewriteIfWithConstZeroTest(Type.EQ, false, DexIfEqz.class); + runRewriteIfWithConstZeroTest(Type.NE, false, DexIfNez.class); + runRewriteIfWithConstZeroTest(Type.LE, false, DexIfLez.class); + runRewriteIfWithConstZeroTest(Type.GE, false, DexIfGez.class); + runRewriteIfWithConstZeroTest(Type.LT, false, DexIfLtz.class); + runRewriteIfWithConstZeroTest(Type.GT, false, DexIfGtz.class); } @Test public void x() { - DexEncodedMethod method = oneMethodApplication( - "Test", - Lists.newArrayList("Test", "java.lang.String[]", "java.lang.String", - "java.lang.String[]", "java.lang.String"), - 10, - " const/4 v4, 0x00 # 0", - " invoke-virtual { v10 }, LTest;->a()LTest;", - " if-nez v4, :label_8", - " move-object v0, v4", - " :label_7", - " return-object v0", - " :label_8", - " invoke-static { v14 }, LTest;->a([Ljava/lang/String;)LTest;", - " move-result-object v2", - " invoke-virtual { v2 }, LTest;->a()Z", - " move-result v0", - " if-nez v0, :label_20", - " move-object v0, v4", - " goto :label_7", - " :label_20", - " iget-wide v0, v2, LTest;->a:J", - " iget-wide v6, v2, LTest;->b:J", - " invoke-virtual { v2 }, LTest;->c()Z", - " move-result v2", - " if-eqz v2, :label_33", - " invoke-virtual { v4 }, LTest;->a()V", - " :label_33", - " new-instance v5, LTest;", - " sget-object v2, LTest;->a:[Ljava/lang/String;", - " invoke-direct { v5, v2 }, LTest;-><init>([Ljava/lang/String;)V", - " invoke-virtual { v10 }, LTest;->a()LTest;", - " invoke-virtual { v4, v0, v1, v6, v7 }, LTest;->a(JJ)Ljava/util/List;", - " move-result-object v2", - " invoke-interface { v2 }, Ljava/util/List;->iterator()Ljava/util/Iterator;", - " move-result-object v6", - " move-wide v2, v0", - " :label_52", - " invoke-interface { v6 }, Ljava/util/Iterator;->hasNext()Z", - " move-result v0", - " if-eqz v0, :label_107", - " invoke-interface { v6 }, Ljava/util/Iterator;->next()Ljava/lang/Object;", - " move-result-object v0", - " check-cast v0, LTest;", - " const-wide/16 v8, 0x0000000000000001 # 1", - " add-long/2addr v2, v8", - " invoke-virtual { v5 }, LTest;->newRow()LTest;", - " move-result-object v1", - " invoke-static { v2, v3 }, Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;", - " move-result-object v7", - " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", - " move-result-object v1", - " const-string v7, \"add\"", - " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", - " move-result-object v1", - " iget-object v7, v0, LTest;->a:Ljava/lang/String;", - " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", - " move-result-object v1", - " iget v7, v0, LTest;->b:I", - " invoke-static { v7 }, Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", - " move-result-object v7", - " invoke-virtual { v1, v7 }, LTest;->add(Ljava/lang/Object;)LTest;", - " move-result-object v1", - " iget-object v0, v0, LTest;->a:Ljava/lang/String;", - " invoke-virtual { v1, v0 }, LTest;->add(Ljava/lang/Object;)LTest;", - " goto :label_52", - " :label_107", - " iget-object v0, v4, LTest;->a:LTest;", - " const-string v1, \"text 1\"", - " const/4 v2, 0x00 # 0", - " invoke-virtual { v0, v1, v2 }, LTest;->a(Ljava/lang/String;I)LTest;", - " move-result-object v0", - " const-string v1, \"text 2\"", - " const-string v2, \"\"", - " invoke-interface { v0, v1, v2 }, LTest;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", - " move-result-object v0", - " invoke-static { v5, v0 }, LTest;->a(LTest;Ljava/lang/String;)LTest;", - " move-result-object v0", - " goto :label_7" - ); + DexEncodedMethod method = + oneMethodApplication( + "Test", + Lists.newArrayList( + "Test", + "java.lang.String[]", + "java.lang.String", + "java.lang.String[]", + "java.lang.String"), + 10, + " const/4 v4, 0x00 # 0", + " invoke-virtual { v10 }, LTest;->a()LTest;", + " if-nez v4, :label_8", + " move-object v0, v4", + " :label_7", + " return-object v0", + " :label_8", + " invoke-static { v14 }, LTest;->a([Ljava/lang/String;)LTest;", + " move-result-object v2", + " invoke-virtual { v2 }, LTest;->a()Z", + " move-result v0", + " if-nez v0, :label_20", + " move-object v0, v4", + " goto :label_7", + " :label_20", + " iget-wide v0, v2, LTest;->a:J", + " iget-wide v6, v2, LTest;->b:J", + " invoke-virtual { v2 }, LTest;->c()Z", + " move-result v2", + " if-eqz v2, :label_33", + " invoke-virtual { v4 }, LTest;->a()V", + " :label_33", + " new-instance v5, LTest;", + " sget-object v2, LTest;->a:[Ljava/lang/String;", + " invoke-direct { v5, v2 }, LTest;-><init>([Ljava/lang/String;)V", + " invoke-virtual { v10 }, LTest;->a()LTest;", + " invoke-virtual { v4, v0, v1, v6, v7 }, LTest;->a(JJ)Ljava/util/List;", + " move-result-object v2", + " invoke-interface { v2 }," + + " Ljava/util/List;->iterator()Ljava/util/Iterator;", + " move-result-object v6", + " move-wide v2, v0", + " :label_52", + " invoke-interface { v6 }, Ljava/util/Iterator;->hasNext()Z", + " move-result v0", + " if-eqz v0, :label_107", + " invoke-interface { v6 }, Ljava/util/Iterator;->next()Ljava/lang/Object;", + " move-result-object v0", + " check-cast v0, LTest;", + " const-wide/16 v8, 0x0000000000000001 # 1", + " add-long/2addr v2, v8", + " invoke-virtual { v5 }, LTest;->newRow()LTest;", + " move-result-object v1", + " invoke-static { v2, v3 }," + + " Ljava/lang/Long;->valueOf(J)Ljava/lang/Long;", + " move-result-object v7", + " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", + " move-result-object v1", + " const-string v7, \"add\"", + " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", + " move-result-object v1", + " iget-object v7, v0, LTest;->a:Ljava/lang/String;", + " invoke-virtual { v1, v7 }, LTest;->a(Ljava/lang/Object;)LTest;", + " move-result-object v1", + " iget v7, v0, LTest;->b:I", + " invoke-static { v7 }," + + " Ljava/lang/Integer;->valueOf(I)Ljava/lang/Integer;", + " move-result-object v7", + " invoke-virtual { v1, v7 }, LTest;->add(Ljava/lang/Object;)LTest;", + " move-result-object v1", + " iget-object v0, v0, LTest;->a:Ljava/lang/String;", + " invoke-virtual { v1, v0 }, LTest;->add(Ljava/lang/Object;)LTest;", + " goto :label_52", + " :label_107", + " iget-object v0, v4, LTest;->a:LTest;", + " const-string v1, \"text 1\"", + " const/4 v2, 0x00 # 0", + " invoke-virtual { v0, v1, v2 }, LTest;->a(Ljava/lang/String;I)LTest;", + " move-result-object v0", + " const-string v1, \"text 2\"", + " const-string v2, \"\"", + " invoke-interface { v0, v1, v2 }," + + " LTest;->getString(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", + " move-result-object v0", + " invoke-static { v5, v0 }, LTest;->a(LTest;Ljava/lang/String;)LTest;", + " move-result-object v0", + " goto :label_7"); DexCode code = method.getCode().asDexCode(); assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof InvokeVirtual); - assertTrue(code.instructions[1] instanceof Const4); - assertEquals(0, ((Const4) code.instructions[1]).B); - assertTrue(code.instructions[2] instanceof ReturnObject); + assertTrue(code.instructions[0] instanceof DexInvokeVirtual); + assertTrue(code.instructions[1] instanceof DexConst4); + assertEquals(0, ((DexConst4) code.instructions[1]).B); + assertTrue(code.instructions[2] instanceof DexReturnObject); } @Test
diff --git a/src/test/java/com/android/tools/r8/smali/OutlineTest.java b/src/test/java/com/android/tools/r8/smali/OutlineTest.java index 042bec1..10d96c1 100644 --- a/src/test/java/com/android/tools/r8/smali/OutlineTest.java +++ b/src/test/java/com/android/tools/r8/smali/OutlineTest.java
@@ -9,24 +9,24 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstWide; -import com.android.tools.r8.code.ConstWideHigh16; -import com.android.tools.r8.code.DivInt; -import com.android.tools.r8.code.DivInt2Addr; -import com.android.tools.r8.code.Goto; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeStaticRange; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.MoveResult; -import com.android.tools.r8.code.MoveResultObject; -import com.android.tools.r8.code.MoveResultWide; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnObject; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.ReturnWide; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstWide; +import com.android.tools.r8.dex.code.DexConstWideHigh16; +import com.android.tools.r8.dex.code.DexDivInt; +import com.android.tools.r8.dex.code.DexDivInt2Addr; +import com.android.tools.r8.dex.code.DexGoto; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexMoveResult; +import com.android.tools.r8.dex.code.DexMoveResultObject; +import com.android.tools.r8.dex.code.DexMoveResultWide; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexReturnObject; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexReturnWide; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.graph.DexItemFactory; @@ -158,9 +158,9 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstString); - assertTrue(code.instructions[1] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexConstString); + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -230,10 +230,10 @@ // Up to 4 const instructions before the invoke of the outline. int firstOutlineInvoke = Math.min(i, 4); for (int j = 0; j < firstOutlineInvoke; j++) { - assertTrue(code.instructions[j] instanceof ConstString); + assertTrue(code.instructions[j] instanceof DexConstString); } - assertTrue(code.instructions[firstOutlineInvoke] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[firstOutlineInvoke]; + assertTrue(code.instructions[firstOutlineInvoke] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[firstOutlineInvoke]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -287,9 +287,9 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstString); - assertTrue(code.instructions[1] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexConstString); + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -349,10 +349,10 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstString); - assertTrue(code.instructions[1] instanceof ConstString); - assertTrue(code.instructions[2] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[2]; + assertTrue(code.instructions[0] instanceof DexConstString); + assertTrue(code.instructions[1] instanceof DexConstString); + assertTrue(code.instructions[2] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[2]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -414,16 +414,16 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstWide); + assertTrue(code.instructions[0] instanceof DexConstWide); if (i < 3) { - assertTrue(code.instructions[1] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[1]; + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); } else { - assertTrue(code.instructions[1] instanceof InvokeVirtual); - assertTrue(code.instructions[2] instanceof InvokeVirtual); - assertTrue(code.instructions[3] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[3]; + assertTrue(code.instructions[1] instanceof DexInvokeVirtual); + assertTrue(code.instructions[2] instanceof DexInvokeVirtual); + assertTrue(code.instructions[3] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[3]; assertTrue(isOutlineMethodName(invoke.getMethod())); } @@ -491,16 +491,16 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof ConstWideHigh16); + assertTrue(code.instructions[0] instanceof DexConstWideHigh16); if (i < 3) { - assertTrue(code.instructions[1] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[1]; + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); } else { - assertTrue(code.instructions[1] instanceof InvokeVirtual); - assertTrue(code.instructions[2] instanceof InvokeVirtual); - assertTrue(code.instructions[3] instanceof InvokeStatic); - InvokeStatic invoke = (InvokeStatic) code.instructions[3]; + assertTrue(code.instructions[1] instanceof DexInvokeVirtual); + assertTrue(code.instructions[2] instanceof DexInvokeVirtual); + assertTrue(code.instructions[3] instanceof DexInvokeStatic); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[3]; assertTrue(isOutlineMethodName(invoke.getMethod())); } @@ -572,14 +572,14 @@ assert mainCode.instructions.length == 7; } if (i == 2) { - InvokeStatic invoke = (InvokeStatic) mainCode.instructions[4]; + DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[4]; assertTrue(isOutlineMethodName(invoke.getMethod())); } else if (i == 3) { - InvokeStatic invoke = (InvokeStatic) mainCode.instructions[1]; + DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); } else { assert i == 4 || i == 5; - InvokeStatic invoke = (InvokeStatic) mainCode.instructions[2]; + DexInvokeStatic invoke = (DexInvokeStatic) mainCode.instructions[2]; assertTrue(isOutlineMethodName(invoke.getMethod())); } @@ -661,14 +661,14 @@ DexCode code1 = getMethod(processedApplication, signature1).getCode().asDexCode(); assertEquals(4, code1.instructions.length); - assertTrue(code1.instructions[1] instanceof InvokeStatic); - InvokeStatic invoke1 = (InvokeStatic) code1.instructions[1]; + assertTrue(code1.instructions[1] instanceof DexInvokeStatic); + DexInvokeStatic invoke1 = (DexInvokeStatic) code1.instructions[1]; assertTrue(isOutlineMethodName(invoke1.getMethod())); DexCode code2 = getMethod(processedApplication, signature2).getCode().asDexCode(); assertEquals(5, code2.instructions.length); - assertTrue(code2.instructions[2] instanceof InvokeStatic); - InvokeStatic invoke2 = (InvokeStatic) code2.instructions[2]; + assertTrue(code2.instructions[2] instanceof DexInvokeStatic); + DexInvokeStatic invoke2 = (DexInvokeStatic) code2.instructions[2]; assertTrue(isOutlineMethodName(invoke1.getMethod())); // Run code and check result. @@ -739,12 +739,12 @@ default: outlineInstructionIndex = 2; } - Instruction instruction = code.instructions[outlineInstructionIndex]; - if (instruction instanceof InvokeStatic) { - InvokeStatic invoke = (InvokeStatic) instruction; + DexInstruction instruction = code.instructions[outlineInstructionIndex]; + if (instruction instanceof DexInvokeStatic) { + DexInvokeStatic invoke = (DexInvokeStatic) instruction; assertTrue(isOutlineMethodName(invoke.getMethod())); } else { - InvokeStaticRange invoke = (InvokeStaticRange) instruction; + DexInvokeStaticRange invoke = (DexInvokeStaticRange) instruction; assertTrue(isOutlineMethodName(invoke.getMethod())); } @@ -791,9 +791,9 @@ assertEquals(2, getNumberOfProgramClasses(processedApplication)); DexCode code = getMethod(processedApplication, signature1).getCode().asDexCode(); - InvokeStatic invoke; - assertTrue(code.instructions[0] instanceof InvokeStatic); - invoke = (InvokeStatic) code.instructions[0]; + DexInvokeStatic invoke; + assertTrue(code.instructions[0] instanceof DexInvokeStatic); + invoke = (DexInvokeStatic) code.instructions[0]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -871,7 +871,7 @@ // Collect the return types of the outlines for the body of method1 and method2. List<DexType> r = new ArrayList<>(); for (DexEncodedMethod directMethod : outlineMethods) { - if (directMethod.getCode().asDexCode().instructions[0] instanceof InvokeVirtual) { + if (directMethod.getCode().asDexCode().instructions[0] instanceof DexInvokeVirtual) { r.add(directMethod.getReference().proto.returnType); } } @@ -1022,10 +1022,10 @@ // The calls to set, set and getTimeInMillis was outlined. DexCode code = method.getCode().asDexCode(); assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof InvokeStatic); - assertTrue(code.instructions[1] instanceof MoveResultWide); - assertTrue(code.instructions[2] instanceof ReturnWide); - InvokeStatic invoke = (InvokeStatic) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexInvokeStatic); + assertTrue(code.instructions[1] instanceof DexMoveResultWide); + assertTrue(code.instructions[2] instanceof DexReturnWide); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0]; assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName()); // Run the code and expect a parsable long. @@ -1139,9 +1139,9 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof InvokeStatic); - assertTrue(code.instructions[1] instanceof ReturnObject); - InvokeStatic invoke = (InvokeStatic) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexInvokeStatic); + assertTrue(code.instructions[1] instanceof DexReturnObject); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0]; assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName()); // Run code and check result. @@ -1215,16 +1215,16 @@ DexEncodedMethod method1 = getMethod(processedApplication, signature1); DexCode code1 = method1.getCode().asDexCode(); assertEquals(3, code1.instructions.length); - assertTrue(code1.instructions[0] instanceof InvokeStatic); - assertTrue(code1.instructions[1] instanceof MoveResult); - assertTrue(code1.instructions[2] instanceof Return); - InvokeStatic invoke1 = (InvokeStatic) code1.instructions[0]; + assertTrue(code1.instructions[0] instanceof DexInvokeStatic); + assertTrue(code1.instructions[1] instanceof DexMoveResult); + assertTrue(code1.instructions[2] instanceof DexReturn); + DexInvokeStatic invoke1 = (DexInvokeStatic) code1.instructions[0]; assertTrue(isOutlineMethodName(invoke1.getMethod())); DexEncodedMethod method2 = getMethod(processedApplication, signature2); DexCode code2 = method2.getCode().asDexCode(); - assertTrue(code2.instructions[0] instanceof InvokeStatic); - InvokeStatic invoke2 = (InvokeStatic) code2.instructions[0]; + assertTrue(code2.instructions[0] instanceof DexInvokeStatic); + DexInvokeStatic invoke2 = (DexInvokeStatic) code2.instructions[0]; assertEquals(invoke1.getMethod().qualifiedName(), invoke2.getMethod().qualifiedName()); // Run code and check result. @@ -1293,14 +1293,14 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); assertEquals(7, code.instructions.length); - assertTrue(code.instructions[0] instanceof DivInt); - assertTrue(code.instructions[1] instanceof InvokeStatic); - assertTrue(code.instructions[2] instanceof MoveResult); - assertTrue(code.instructions[3] instanceof DivInt2Addr); - assertTrue(code.instructions[4] instanceof Goto); - assertTrue(code.instructions[5] instanceof Const4); - assertTrue(code.instructions[6] instanceof Return); - InvokeStatic invoke = (InvokeStatic) code.instructions[1]; + assertTrue(code.instructions[0] instanceof DexDivInt); + assertTrue(code.instructions[1] instanceof DexInvokeStatic); + assertTrue(code.instructions[2] instanceof DexMoveResult); + assertTrue(code.instructions[3] instanceof DexDivInt2Addr); + assertTrue(code.instructions[4] instanceof DexGoto); + assertTrue(code.instructions[5] instanceof DexConst4); + assertTrue(code.instructions[6] instanceof DexReturn); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[1]; assertTrue(isOutlineMethodName(invoke.getMethod())); // Run code and check result. @@ -1347,10 +1347,10 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); assertEquals(3, code.instructions.length); - assertTrue(code.instructions[0] instanceof InvokeStatic); - assertTrue(code.instructions[1] instanceof MoveResultObject); - assertTrue(code.instructions[2] instanceof ReturnObject); - InvokeStatic invoke = (InvokeStatic) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexInvokeStatic); + assertTrue(code.instructions[1] instanceof DexMoveResultObject); + assertTrue(code.instructions[2] instanceof DexReturnObject); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0]; assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName()); // Run code and check result. @@ -1405,9 +1405,9 @@ DexEncodedMethod method = getMethod(processedApplication, signature); DexCode code = method.getCode().asDexCode(); assertEquals(2, code.instructions.length); - assertTrue(code.instructions[0] instanceof InvokeStatic); - assertTrue(code.instructions[1] instanceof ReturnVoid); - InvokeStatic invoke = (InvokeStatic) code.instructions[0]; + assertTrue(code.instructions[0] instanceof DexInvokeStatic); + assertTrue(code.instructions[1] instanceof DexReturnVoid); + DexInvokeStatic invoke = (DexInvokeStatic) code.instructions[0]; assertEquals(firstOutlineMethodName(), invoke.getMethod().qualifiedName()); // Run code and check result. @@ -1635,8 +1635,8 @@ runDex2Oat(processedApplication); } - private static boolean isOutlineInvoke(Instruction instruction) { - return instruction instanceof InvokeStatic && isOutlineMethodName(instruction.getMethod()); + private static boolean isOutlineInvoke(DexInstruction instruction) { + return instruction instanceof DexInvokeStatic && isOutlineMethodName(instruction.getMethod()); } private void assertHasOutlineInvoke(DexEncodedMethod method) {
diff --git a/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java b/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java index 4d13ae0..00e8d8f 100644 --- a/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java +++ b/src/test/java/com/android/tools/r8/smali/RunArtSmokeTest.java
@@ -8,10 +8,10 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.SgetObject; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexSgetObject; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.graph.DexEncodedMethod; import com.android.tools.r8.smali.SmaliBuilder.MethodSignature; @@ -42,10 +42,10 @@ assertNotNull(main); DexCode code = main.getCode().asDexCode(); - assertTrue(code.instructions[0] instanceof SgetObject); - assertTrue(code.instructions[1] instanceof ConstString); - assertTrue(code.instructions[2] instanceof InvokeVirtual); - assertTrue(code.instructions[3] instanceof ReturnVoid); + assertTrue(code.instructions[0] instanceof DexSgetObject); + assertTrue(code.instructions[1] instanceof DexConstString); + assertTrue(code.instructions[2] instanceof DexInvokeVirtual); + assertTrue(code.instructions[3] instanceof DexReturnVoid); // Run the generated code in Art. String result = runArt(processedApplication);
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java index b53f301..e3ad2c8 100644 --- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java +++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -42,7 +42,7 @@ } public static MethodReference syntheticBackportMethod(Class<?> clazz, int id, Method method) { - ClassReference syntheticHolder = syntheticClass(clazz, naming.BACKPORT, id); + ClassReference syntheticHolder = syntheticBackportClass(clazz, id); MethodReference originalMethod = Reference.methodFromMethod(method); return Reference.methodFromDescriptor( syntheticHolder.getDescriptor(), @@ -62,6 +62,26 @@ return syntheticClass(clazz, naming.LAMBDA, id); } + public static ClassReference syntheticApiOutlineClass(Class<?> clazz, int id) { + return syntheticClass(clazz, naming.API_MODEL_OUTLINE, id); + } + + public static ClassReference syntheticBackportClass(Class<?> clazz, int id) { + return syntheticClass(clazz, naming.BACKPORT, id); + } + + public static ClassReference syntheticBackportClass(ClassReference classReference, int id) { + return syntheticClass(classReference, naming.BACKPORT, id); + } + + public static ClassReference syntheticTwrCloseResourceClass(Class<?> clazz, int id) { + return syntheticClass(clazz, naming.TWR_CLOSE_RESOURCE, id); + } + + public static ClassReference syntheticTwrCloseResourceClass(ClassReference reference, int id) { + return syntheticClass(reference, naming.TWR_CLOSE_RESOURCE, id); + } + public static MethodReference syntheticLambdaMethod(Class<?> clazz, int id, Method method) { ClassReference syntheticHolder = syntheticLambdaClass(clazz, id); MethodReference originalMethod = Reference.methodFromMethod(method);
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java index 4b77aec..028b100 100644 --- a/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java +++ b/src/test/java/com/android/tools/r8/tracereferences/TraceFieldResolutionWithLibraryAndProgramClassTest.java
@@ -15,6 +15,7 @@ import com.android.tools.r8.references.Reference; import com.android.tools.r8.transformers.ClassFileTransformer.FieldPredicate; import com.android.tools.r8.utils.DescriptorUtils; +import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.ZipUtils.ZipBuilder; import com.google.common.collect.ImmutableSet; import java.nio.file.Path; @@ -83,14 +84,18 @@ ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(Main.class)) .build(); SeenReferencesConsumer consumer = new SeenReferencesConsumer(); - TraceReferences.run( + InternalOptions internalOptions = new InternalOptions(); + internalOptions.loadAllClassDefinitions = true; + // TODO(b/231928368): Remove this when enabled by default. + TraceReferences.runForTesting( TraceReferencesCommand.builder() .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) .addLibraryFiles(libJar) .addTargetFiles(targetJar) .addSourceFiles(sourceJar) .setConsumer(consumer) - .build()); + .build(), + internalOptions); ImmutableSet<FieldReference> expectedSet = ImmutableSet.of( Reference.field(
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceMethodResolutionWithMissingLibraryAndProgramClassTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceMethodResolutionWithMissingLibraryAndProgramClassTest.java index 18ece27..f15630e 100644 --- a/src/test/java/com/android/tools/r8/tracereferences/TraceMethodResolutionWithMissingLibraryAndProgramClassTest.java +++ b/src/test/java/com/android/tools/r8/tracereferences/TraceMethodResolutionWithMissingLibraryAndProgramClassTest.java
@@ -15,6 +15,7 @@ import com.android.tools.r8.references.Reference; import com.android.tools.r8.transformers.ClassFileTransformer.MethodPredicate; import com.android.tools.r8.utils.DescriptorUtils; +import com.android.tools.r8.utils.InternalOptions; import com.android.tools.r8.utils.ZipUtils.ZipBuilder; import com.google.common.collect.ImmutableSet; import java.nio.file.Path; @@ -83,14 +84,18 @@ ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(Main.class)) .build(); SeenReferencesConsumer consumer = new SeenReferencesConsumer(); - TraceReferences.run( + InternalOptions internalOptions = new InternalOptions(); + internalOptions.loadAllClassDefinitions = true; + // TODO(b/231928368): Remove this when enabled by default. + TraceReferences.runForTesting( TraceReferencesCommand.builder() .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) .addLibraryFiles(libJar) .addTargetFiles(targetJar) .addSourceFiles(sourceJar) .setConsumer(consumer) - .build()); + .build(), + internalOptions); ImmutableSet<MethodReference> foundSet = ImmutableSet.of( Reference.methodFromMethod(A.class.getMethod("foo")),
diff --git a/src/test/java/com/android/tools/r8/tracereferences/TraceSuperMethodResolutionWithLibraryAndProgramClassTest.java b/src/test/java/com/android/tools/r8/tracereferences/TraceSuperMethodResolutionWithLibraryAndProgramClassTest.java new file mode 100644 index 0000000..fbfe603 --- /dev/null +++ b/src/test/java/com/android/tools/r8/tracereferences/TraceSuperMethodResolutionWithLibraryAndProgramClassTest.java
@@ -0,0 +1,124 @@ +// Copyright (c) 2022, 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.tracereferences; + +import static org.junit.Assert.assertEquals; + +import com.android.tools.r8.DiagnosticsHandler; +import com.android.tools.r8.TestBase; +import com.android.tools.r8.TestParameters; +import com.android.tools.r8.TestParametersCollection; +import com.android.tools.r8.ToolHelper; +import com.android.tools.r8.references.MethodReference; +import com.android.tools.r8.references.Reference; +import com.android.tools.r8.utils.InternalOptions; +import com.android.tools.r8.utils.ZipUtils.ZipBuilder; +import com.google.common.collect.ImmutableSet; +import java.nio.file.Path; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.Parameterized; +import org.junit.runners.Parameterized.Parameter; +import org.junit.runners.Parameterized.Parameters; + +@RunWith(Parameterized.class) +/* This is regression test for b/226170842. */ +public class TraceSuperMethodResolutionWithLibraryAndProgramClassTest extends TestBase { + + @Parameter() public TestParameters parameters; + + @Parameters(name = "{0}") + public static TestParametersCollection data() { + return getTestParameters().withNoneRuntime().build(); + } + + static class SeenReferencesConsumer implements TraceReferencesConsumer { + + private final Set<MethodReference> seenMethods = new HashSet<>(); + private final Set<MethodReference> seenMissingMethods = new HashSet<>(); + + @Override + public void acceptType(TracedClass tracedClass, DiagnosticsHandler handler) {} + + @Override + public void acceptField(TracedField tracedField, DiagnosticsHandler handler) {} + + @Override + public void acceptMethod(TracedMethod tracedMethod, DiagnosticsHandler handler) { + if (tracedMethod.isMissingDefinition()) { + seenMissingMethods.add(tracedMethod.getReference()); + } else { + seenMethods.add(tracedMethod.getReference()); + } + } + } + + @Test + public void testValidResolution() throws Exception { + Path dir = temp.newFolder().toPath(); + Path libJar = + ZipBuilder.builder(dir.resolve("lib.jar")) + .addFilesRelative( + ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(A.class)) + .build(); + Path targetJar = + ZipBuilder.builder(dir.resolve("target.jar")) + .addFilesRelative( + ToolHelper.getClassPathForTests(), ToolHelper.getClassFileForTestClass(A.class)) + .build(); + Path sourceJar = + ZipBuilder.builder(dir.resolve("source.jar")) + .addFilesRelative( + ToolHelper.getClassPathForTests(), + ToolHelper.getClassFileForTestClass(Main.class), + ToolHelper.getClassFileForTestClass(ProgramClass.class)) + .build(); + SeenReferencesConsumer consumer = new SeenReferencesConsumer(); + InternalOptions internalOptions = new InternalOptions(); + internalOptions.loadAllClassDefinitions = true; + // TODO(b/231928368): Remove this when enabled by default. + TraceReferences.runForTesting( + TraceReferencesCommand.builder() + .addLibraryFiles(ToolHelper.getMostRecentAndroidJar()) + .addLibraryFiles(libJar) + .addTargetFiles(targetJar) + .addSourceFiles(sourceJar) + .setConsumer(consumer) + .build(), + internalOptions); + ImmutableSet<MethodReference> foundSet = + ImmutableSet.of( + Reference.methodFromMethod(A.class.getMethod("foo")), + Reference.methodFromMethod(A.class.getConstructor())); + assertEquals(foundSet, consumer.seenMethods); + assertEquals(Collections.emptySet(), consumer.seenMissingMethods); + } + + // A is added to both library and program. + public static class A { + + public void foo() { + System.out.println("A::foo"); + } + } + + public static class ProgramClass extends A { + + @Override + public void foo() { + super.foo(); + } + } + + public static class Main { + + public static void main(String[] args) { + new ProgramClass().foo(); + } + } +}
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 ebfd956..30274f0 100644 --- a/src/test/java/com/android/tools/r8/utils/Smali.java +++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -11,7 +11,6 @@ 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.naming.NamingLens; import com.android.tools.r8.origin.Origin; import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy; import com.google.common.collect.ImmutableList; @@ -117,8 +116,7 @@ AppView.createForD8( AppInfo.createInitialAppInfo( dexApp, GlobalSyntheticsStrategy.forNonSynthesizing())), - null, - NamingLens.getIdentityLens()); + null); writer.write(executor); return consumer.contents; } finally {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java index ea10ad4..671ec25 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CheckCastDexInstructionSubject.java
@@ -4,20 +4,20 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.CheckCast; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexCheckCast; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexType; public class CheckCastDexInstructionSubject extends DexInstructionSubject implements CheckCastInstructionSubject { - public CheckCastDexInstructionSubject(Instruction instruction, MethodSubject method) { + public CheckCastDexInstructionSubject(DexInstruction instruction, MethodSubject method) { super(instruction, method); assert isCheckCast(); } @Override public DexType getType() { - return ((CheckCast) instruction).getType(); + return ((DexCheckCast) instruction).getType(); } @Override
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 d9869b2..44942ab 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
@@ -8,9 +8,9 @@ import com.android.tools.r8.TestDiagnosticMessagesImpl; import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfTryCatch; -import com.android.tools.r8.code.Instruction; import com.android.tools.r8.dex.ApplicationReader; import com.android.tools.r8.dex.Marker; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unimplemented; import com.android.tools.r8.graph.CfCode; import com.android.tools.r8.graph.Code; @@ -391,7 +391,9 @@ } InstructionSubject createInstructionSubject( - Instruction instruction, MethodSubject method, SwitchPayloadResolver switchPayloadResolver) { + DexInstruction instruction, + MethodSubject method, + SwitchPayloadResolver switchPayloadResolver) { DexInstructionSubject dexInst = new DexInstructionSubject(instruction, method); if (dexInst.isInvoke()) { return new InvokeDexInstructionSubject(this, instruction, method);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java index 76427a3..50a77fe 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeMatchers.java
@@ -194,6 +194,11 @@ } public static Predicate<InstructionSubject> isInvokeWithTarget( + String holderType, String methodName) { + return isInvokeWithTarget(null, holderType, methodName, (List<String>) null); + } + + public static Predicate<InstructionSubject> isInvokeWithTarget( String returnType, String holderType, String methodName, List<String> parameterTypes) { return instruction -> { if (!instruction.isInvoke()) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java index ddff370..62da578 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ConstStringDexInstructionSubject.java
@@ -4,25 +4,25 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstStringJumbo; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstStringJumbo; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexString; public class ConstStringDexInstructionSubject extends DexInstructionSubject implements ConstStringInstructionSubject { - public ConstStringDexInstructionSubject(Instruction instruction, MethodSubject method) { + public ConstStringDexInstructionSubject(DexInstruction instruction, MethodSubject method) { super(instruction, method); assert isConstString(JumboStringMode.ALLOW); } @Override public DexString getString() { - if (instruction instanceof ConstString) { - return ((ConstString) instruction).getString(); + if (instruction instanceof DexConstString) { + return ((DexConstString) instruction).getString(); } else { - assert (instruction instanceof ConstStringJumbo); - return ((ConstStringJumbo) instruction).getString(); + assert (instruction instanceof DexConstStringJumbo); + return ((DexConstStringJumbo) instruction).getString(); } } }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java index 1ea464c..31b85c3 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionIterator.java
@@ -4,8 +4,8 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.SwitchPayload; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexSwitchPayload; import com.android.tools.r8.graph.Code; import com.android.tools.r8.graph.DexCode; import com.android.tools.r8.ir.conversion.SwitchPayloadResolver; @@ -49,12 +49,12 @@ private void ensureSwitchPayloadResolver() { if (switchPayloadResolver == null) { switchPayloadResolver = new SwitchPayloadResolver(); - for (Instruction instruction : code.instructions) { + for (DexInstruction instruction : code.instructions) { if (instruction.isIntSwitch()) { switchPayloadResolver.addPayloadUser(instruction); } if (instruction.isSwitchPayload()) { - switchPayloadResolver.resolve((SwitchPayload) instruction); + switchPayloadResolver.resolve((DexSwitchPayload) instruction); } } }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java index 00cfc92..2785f57 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/DexInstructionSubject.java
@@ -4,109 +4,109 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Aget; -import com.android.tools.r8.code.AgetBoolean; -import com.android.tools.r8.code.AgetByte; -import com.android.tools.r8.code.AgetChar; -import com.android.tools.r8.code.AgetObject; -import com.android.tools.r8.code.AgetShort; -import com.android.tools.r8.code.AgetWide; -import com.android.tools.r8.code.Aput; -import com.android.tools.r8.code.AputBoolean; -import com.android.tools.r8.code.AputByte; -import com.android.tools.r8.code.AputChar; -import com.android.tools.r8.code.AputObject; -import com.android.tools.r8.code.AputShort; -import com.android.tools.r8.code.AputWide; -import com.android.tools.r8.code.ArrayLength; -import com.android.tools.r8.code.CheckCast; -import com.android.tools.r8.code.Const; -import com.android.tools.r8.code.Const16; -import com.android.tools.r8.code.Const4; -import com.android.tools.r8.code.ConstClass; -import com.android.tools.r8.code.ConstHigh16; -import com.android.tools.r8.code.ConstString; -import com.android.tools.r8.code.ConstStringJumbo; -import com.android.tools.r8.code.ConstWide; -import com.android.tools.r8.code.ConstWide16; -import com.android.tools.r8.code.ConstWide32; -import com.android.tools.r8.code.ConstWideHigh16; -import com.android.tools.r8.code.Goto; -import com.android.tools.r8.code.IfEq; -import com.android.tools.r8.code.IfEqz; -import com.android.tools.r8.code.IfGe; -import com.android.tools.r8.code.IfGez; -import com.android.tools.r8.code.IfGt; -import com.android.tools.r8.code.IfGtz; -import com.android.tools.r8.code.IfLe; -import com.android.tools.r8.code.IfLez; -import com.android.tools.r8.code.IfLt; -import com.android.tools.r8.code.IfLtz; -import com.android.tools.r8.code.IfNe; -import com.android.tools.r8.code.IfNez; -import com.android.tools.r8.code.Iget; -import com.android.tools.r8.code.IgetBoolean; -import com.android.tools.r8.code.IgetByte; -import com.android.tools.r8.code.IgetChar; -import com.android.tools.r8.code.IgetObject; -import com.android.tools.r8.code.IgetShort; -import com.android.tools.r8.code.IgetWide; -import com.android.tools.r8.code.InstanceOf; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.InvokeCustom; -import com.android.tools.r8.code.InvokeCustomRange; -import com.android.tools.r8.code.InvokeDirect; -import com.android.tools.r8.code.InvokeDirectRange; -import com.android.tools.r8.code.InvokeInterface; -import com.android.tools.r8.code.InvokeInterfaceRange; -import com.android.tools.r8.code.InvokeStatic; -import com.android.tools.r8.code.InvokeStaticRange; -import com.android.tools.r8.code.InvokeSuper; -import com.android.tools.r8.code.InvokeSuperRange; -import com.android.tools.r8.code.InvokeVirtual; -import com.android.tools.r8.code.InvokeVirtualRange; -import com.android.tools.r8.code.Iput; -import com.android.tools.r8.code.IputBoolean; -import com.android.tools.r8.code.IputByte; -import com.android.tools.r8.code.IputChar; -import com.android.tools.r8.code.IputObject; -import com.android.tools.r8.code.IputShort; -import com.android.tools.r8.code.IputWide; -import com.android.tools.r8.code.MonitorEnter; -import com.android.tools.r8.code.MonitorExit; -import com.android.tools.r8.code.MulDouble; -import com.android.tools.r8.code.MulDouble2Addr; -import com.android.tools.r8.code.MulFloat; -import com.android.tools.r8.code.MulFloat2Addr; -import com.android.tools.r8.code.MulInt; -import com.android.tools.r8.code.MulInt2Addr; -import com.android.tools.r8.code.MulIntLit16; -import com.android.tools.r8.code.MulIntLit8; -import com.android.tools.r8.code.MulLong; -import com.android.tools.r8.code.MulLong2Addr; -import com.android.tools.r8.code.NewArray; -import com.android.tools.r8.code.NewInstance; -import com.android.tools.r8.code.Nop; -import com.android.tools.r8.code.PackedSwitch; -import com.android.tools.r8.code.Return; -import com.android.tools.r8.code.ReturnObject; -import com.android.tools.r8.code.ReturnVoid; -import com.android.tools.r8.code.Sget; -import com.android.tools.r8.code.SgetBoolean; -import com.android.tools.r8.code.SgetByte; -import com.android.tools.r8.code.SgetChar; -import com.android.tools.r8.code.SgetObject; -import com.android.tools.r8.code.SgetShort; -import com.android.tools.r8.code.SgetWide; -import com.android.tools.r8.code.SparseSwitch; -import com.android.tools.r8.code.Sput; -import com.android.tools.r8.code.SputBoolean; -import com.android.tools.r8.code.SputByte; -import com.android.tools.r8.code.SputChar; -import com.android.tools.r8.code.SputObject; -import com.android.tools.r8.code.SputShort; -import com.android.tools.r8.code.SputWide; -import com.android.tools.r8.code.Throw; +import com.android.tools.r8.dex.code.DexAget; +import com.android.tools.r8.dex.code.DexAgetBoolean; +import com.android.tools.r8.dex.code.DexAgetByte; +import com.android.tools.r8.dex.code.DexAgetChar; +import com.android.tools.r8.dex.code.DexAgetObject; +import com.android.tools.r8.dex.code.DexAgetShort; +import com.android.tools.r8.dex.code.DexAgetWide; +import com.android.tools.r8.dex.code.DexAput; +import com.android.tools.r8.dex.code.DexAputBoolean; +import com.android.tools.r8.dex.code.DexAputByte; +import com.android.tools.r8.dex.code.DexAputChar; +import com.android.tools.r8.dex.code.DexAputObject; +import com.android.tools.r8.dex.code.DexAputShort; +import com.android.tools.r8.dex.code.DexAputWide; +import com.android.tools.r8.dex.code.DexArrayLength; +import com.android.tools.r8.dex.code.DexCheckCast; +import com.android.tools.r8.dex.code.DexConst; +import com.android.tools.r8.dex.code.DexConst16; +import com.android.tools.r8.dex.code.DexConst4; +import com.android.tools.r8.dex.code.DexConstClass; +import com.android.tools.r8.dex.code.DexConstHigh16; +import com.android.tools.r8.dex.code.DexConstString; +import com.android.tools.r8.dex.code.DexConstStringJumbo; +import com.android.tools.r8.dex.code.DexConstWide; +import com.android.tools.r8.dex.code.DexConstWide16; +import com.android.tools.r8.dex.code.DexConstWide32; +import com.android.tools.r8.dex.code.DexConstWideHigh16; +import com.android.tools.r8.dex.code.DexGoto; +import com.android.tools.r8.dex.code.DexIfEq; +import com.android.tools.r8.dex.code.DexIfEqz; +import com.android.tools.r8.dex.code.DexIfGe; +import com.android.tools.r8.dex.code.DexIfGez; +import com.android.tools.r8.dex.code.DexIfGt; +import com.android.tools.r8.dex.code.DexIfGtz; +import com.android.tools.r8.dex.code.DexIfLe; +import com.android.tools.r8.dex.code.DexIfLez; +import com.android.tools.r8.dex.code.DexIfLt; +import com.android.tools.r8.dex.code.DexIfLtz; +import com.android.tools.r8.dex.code.DexIfNe; +import com.android.tools.r8.dex.code.DexIfNez; +import com.android.tools.r8.dex.code.DexIget; +import com.android.tools.r8.dex.code.DexIgetBoolean; +import com.android.tools.r8.dex.code.DexIgetByte; +import com.android.tools.r8.dex.code.DexIgetChar; +import com.android.tools.r8.dex.code.DexIgetObject; +import com.android.tools.r8.dex.code.DexIgetShort; +import com.android.tools.r8.dex.code.DexIgetWide; +import com.android.tools.r8.dex.code.DexInstanceOf; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexInvokeCustom; +import com.android.tools.r8.dex.code.DexInvokeCustomRange; +import com.android.tools.r8.dex.code.DexInvokeDirect; +import com.android.tools.r8.dex.code.DexInvokeDirectRange; +import com.android.tools.r8.dex.code.DexInvokeInterface; +import com.android.tools.r8.dex.code.DexInvokeInterfaceRange; +import com.android.tools.r8.dex.code.DexInvokeStatic; +import com.android.tools.r8.dex.code.DexInvokeStaticRange; +import com.android.tools.r8.dex.code.DexInvokeSuper; +import com.android.tools.r8.dex.code.DexInvokeSuperRange; +import com.android.tools.r8.dex.code.DexInvokeVirtual; +import com.android.tools.r8.dex.code.DexInvokeVirtualRange; +import com.android.tools.r8.dex.code.DexIput; +import com.android.tools.r8.dex.code.DexIputBoolean; +import com.android.tools.r8.dex.code.DexIputByte; +import com.android.tools.r8.dex.code.DexIputChar; +import com.android.tools.r8.dex.code.DexIputObject; +import com.android.tools.r8.dex.code.DexIputShort; +import com.android.tools.r8.dex.code.DexIputWide; +import com.android.tools.r8.dex.code.DexMonitorEnter; +import com.android.tools.r8.dex.code.DexMonitorExit; +import com.android.tools.r8.dex.code.DexMulDouble; +import com.android.tools.r8.dex.code.DexMulDouble2Addr; +import com.android.tools.r8.dex.code.DexMulFloat; +import com.android.tools.r8.dex.code.DexMulFloat2Addr; +import com.android.tools.r8.dex.code.DexMulInt; +import com.android.tools.r8.dex.code.DexMulInt2Addr; +import com.android.tools.r8.dex.code.DexMulIntLit16; +import com.android.tools.r8.dex.code.DexMulIntLit8; +import com.android.tools.r8.dex.code.DexMulLong; +import com.android.tools.r8.dex.code.DexMulLong2Addr; +import com.android.tools.r8.dex.code.DexNewArray; +import com.android.tools.r8.dex.code.DexNewInstance; +import com.android.tools.r8.dex.code.DexNop; +import com.android.tools.r8.dex.code.DexPackedSwitch; +import com.android.tools.r8.dex.code.DexReturn; +import com.android.tools.r8.dex.code.DexReturnObject; +import com.android.tools.r8.dex.code.DexReturnVoid; +import com.android.tools.r8.dex.code.DexSget; +import com.android.tools.r8.dex.code.DexSgetBoolean; +import com.android.tools.r8.dex.code.DexSgetByte; +import com.android.tools.r8.dex.code.DexSgetChar; +import com.android.tools.r8.dex.code.DexSgetObject; +import com.android.tools.r8.dex.code.DexSgetShort; +import com.android.tools.r8.dex.code.DexSgetWide; +import com.android.tools.r8.dex.code.DexSparseSwitch; +import com.android.tools.r8.dex.code.DexSput; +import com.android.tools.r8.dex.code.DexSputBoolean; +import com.android.tools.r8.dex.code.DexSputByte; +import com.android.tools.r8.dex.code.DexSputChar; +import com.android.tools.r8.dex.code.DexSputObject; +import com.android.tools.r8.dex.code.DexSputShort; +import com.android.tools.r8.dex.code.DexSputWide; +import com.android.tools.r8.dex.code.DexThrow; import com.android.tools.r8.graph.DexField; import com.android.tools.r8.graph.DexMethod; import com.android.tools.r8.ir.code.SingleConstant; @@ -114,10 +114,10 @@ public class DexInstructionSubject implements InstructionSubject { - protected final Instruction instruction; + protected final DexInstruction instruction; protected final MethodSubject method; - public DexInstructionSubject(Instruction instruction, MethodSubject method) { + public DexInstructionSubject(DexInstruction instruction, MethodSubject method) { this.instruction = instruction; this.method = method; } @@ -149,46 +149,46 @@ @Override public boolean isInstanceGet() { - return instruction instanceof Iget - || instruction instanceof IgetBoolean - || instruction instanceof IgetByte - || instruction instanceof IgetShort - || instruction instanceof IgetChar - || instruction instanceof IgetWide - || instruction instanceof IgetObject; + return instruction instanceof DexIget + || instruction instanceof DexIgetBoolean + || instruction instanceof DexIgetByte + || instruction instanceof DexIgetShort + || instruction instanceof DexIgetChar + || instruction instanceof DexIgetWide + || instruction instanceof DexIgetObject; } @Override public boolean isInstancePut() { - return instruction instanceof Iput - || instruction instanceof IputBoolean - || instruction instanceof IputByte - || instruction instanceof IputShort - || instruction instanceof IputChar - || instruction instanceof IputWide - || instruction instanceof IputObject; + return instruction instanceof DexIput + || instruction instanceof DexIputBoolean + || instruction instanceof DexIputByte + || instruction instanceof DexIputShort + || instruction instanceof DexIputChar + || instruction instanceof DexIputWide + || instruction instanceof DexIputObject; } @Override public boolean isStaticGet() { - return instruction instanceof Sget - || instruction instanceof SgetBoolean - || instruction instanceof SgetByte - || instruction instanceof SgetShort - || instruction instanceof SgetChar - || instruction instanceof SgetWide - || instruction instanceof SgetObject; + return instruction instanceof DexSget + || instruction instanceof DexSgetBoolean + || instruction instanceof DexSgetByte + || instruction instanceof DexSgetShort + || instruction instanceof DexSgetChar + || instruction instanceof DexSgetWide + || instruction instanceof DexSgetObject; } @Override public boolean isStaticPut() { - return instruction instanceof Sput - || instruction instanceof SputBoolean - || instruction instanceof SputByte - || instruction instanceof SputShort - || instruction instanceof SputChar - || instruction instanceof SputWide - || instruction instanceof SputObject; + return instruction instanceof DexSput + || instruction instanceof DexSputBoolean + || instruction instanceof DexSputByte + || instruction instanceof DexSputShort + || instruction instanceof DexSputChar + || instruction instanceof DexSputWide + || instruction instanceof DexSputObject; } @Override @@ -208,17 +208,18 @@ @Override public boolean isInvokeVirtual() { - return instruction instanceof InvokeVirtual || instruction instanceof InvokeVirtualRange; + return instruction instanceof DexInvokeVirtual || instruction instanceof DexInvokeVirtualRange; } @Override public boolean isInvokeInterface() { - return instruction instanceof InvokeInterface || instruction instanceof InvokeInterfaceRange; + return instruction instanceof DexInvokeInterface + || instruction instanceof DexInvokeInterfaceRange; } @Override public boolean isInvokeStatic() { - return instruction instanceof InvokeStatic || instruction instanceof InvokeStaticRange; + return instruction instanceof DexInvokeStatic || instruction instanceof DexInvokeStaticRange; } @Override @@ -227,15 +228,15 @@ } public boolean isInvokeCustom() { - return instruction instanceof InvokeCustom || instruction instanceof InvokeCustomRange; + return instruction instanceof DexInvokeCustom || instruction instanceof DexInvokeCustomRange; } public boolean isInvokeSuper() { - return instruction instanceof InvokeSuper || instruction instanceof InvokeSuperRange; + return instruction instanceof DexInvokeSuper || instruction instanceof DexInvokeSuperRange; } public boolean isInvokeDirect() { - return instruction instanceof InvokeDirect || instruction instanceof InvokeDirectRange; + return instruction instanceof DexInvokeDirect || instruction instanceof DexInvokeDirectRange; } @Override @@ -246,19 +247,19 @@ @Override public boolean isNop() { - return instruction instanceof Nop; + return instruction instanceof DexNop; } @Override public boolean isConstNumber() { - return instruction instanceof Const - || instruction instanceof Const4 - || instruction instanceof Const16 - || instruction instanceof ConstHigh16 - || instruction instanceof ConstWide - || instruction instanceof ConstWide16 - || instruction instanceof ConstWide32 - || instruction instanceof ConstWideHigh16; + return instruction instanceof DexConst + || instruction instanceof DexConst4 + || instruction instanceof DexConst16 + || instruction instanceof DexConstHigh16 + || instruction instanceof DexConstWide + || instruction instanceof DexConstWide16 + || instruction instanceof DexConstWide32 + || instruction instanceof DexConstWideHigh16; } @Override @@ -273,22 +274,22 @@ @Override public boolean isConstString(JumboStringMode jumboStringMode) { - return instruction instanceof ConstString - || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof ConstStringJumbo); + return instruction instanceof DexConstString + || (jumboStringMode == JumboStringMode.ALLOW && instruction instanceof DexConstStringJumbo); } @Override public boolean isConstString(String value, JumboStringMode jumboStringMode) { - return (instruction instanceof ConstString - && ((ConstString) instruction).BBBB.toSourceString().equals(value)) + return (instruction instanceof DexConstString + && ((DexConstString) instruction).BBBB.toSourceString().equals(value)) || (jumboStringMode == JumboStringMode.ALLOW - && instruction instanceof ConstStringJumbo - && ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value)); + && instruction instanceof DexConstStringJumbo + && ((DexConstStringJumbo) instruction).BBBBBBBB.toSourceString().equals(value)); } @Override public boolean isJumboString() { - return instruction instanceof ConstStringJumbo; + return instruction instanceof DexConstStringJumbo; } @Override public long getConstNumber() { @@ -302,44 +303,44 @@ @Override public String getConstString() { - if (instruction instanceof ConstString) { - return ((ConstString) instruction).BBBB.toSourceString(); + if (instruction instanceof DexConstString) { + return ((DexConstString) instruction).BBBB.toSourceString(); } - if (instruction instanceof ConstStringJumbo) { - return ((ConstStringJumbo) instruction).BBBBBBBB.toSourceString(); + if (instruction instanceof DexConstStringJumbo) { + return ((DexConstStringJumbo) instruction).BBBBBBBB.toSourceString(); } return null; } @Override public boolean isConstClass() { - return instruction instanceof ConstClass; + return instruction instanceof DexConstClass; } @Override public boolean isConstClass(String type) { - return isConstClass() && ((ConstClass) instruction).getType().toString().equals(type); + return isConstClass() && ((DexConstClass) instruction).getType().toString().equals(type); } @Override public boolean isGoto() { - return instruction instanceof Goto; + return instruction instanceof DexGoto; } @Override public boolean isIfNez() { - return instruction instanceof IfNez; + return instruction instanceof DexIfNez; } @Override public boolean isIfEq() { - return instruction instanceof IfEq; + return instruction instanceof DexIfEq; } @Override public boolean isIfEqz() { - return instruction instanceof IfEqz; + return instruction instanceof DexIfEqz; } @Override @@ -356,73 +357,72 @@ @Override public boolean isReturn() { - return instruction instanceof Return; + return instruction instanceof DexReturn; } @Override public boolean isReturnVoid() { - return instruction instanceof ReturnVoid; + return instruction instanceof DexReturnVoid; } @Override public boolean isReturnObject() { - return instruction instanceof ReturnObject; + return instruction instanceof DexReturnObject; } @Override public boolean isThrow() { - return instruction instanceof Throw; + return instruction instanceof DexThrow; } @Override public boolean isNewInstance() { - return instruction instanceof NewInstance; + return instruction instanceof DexNewInstance; } @Override public boolean isNewInstance(String type) { - return isNewInstance() - && ((NewInstance) instruction).getType().toString().equals(type); + return isNewInstance() && ((DexNewInstance) instruction).getType().toString().equals(type); } @Override public boolean isCheckCast() { - return instruction instanceof CheckCast; + return instruction instanceof DexCheckCast; } @Override public boolean isCheckCast(String type) { - return isCheckCast() && ((CheckCast) instruction).getType().toString().equals(type); + return isCheckCast() && ((DexCheckCast) instruction).getType().toString().equals(type); } @Override public boolean isInstanceOf() { - return instruction instanceof InstanceOf; + return instruction instanceof DexInstanceOf; } @Override public boolean isInstanceOf(String type) { - return isInstanceOf() && ((InstanceOf) instruction).getType().toString().equals(type); + return isInstanceOf() && ((DexInstanceOf) instruction).getType().toString().equals(type); } public boolean isConst4() { - return instruction instanceof Const4; + return instruction instanceof DexConst4; } @Override public boolean isIf() { - return instruction instanceof IfEq - || instruction instanceof IfEqz - || instruction instanceof IfGe - || instruction instanceof IfGez - || instruction instanceof IfGt - || instruction instanceof IfGtz - || instruction instanceof IfLe - || instruction instanceof IfLez - || instruction instanceof IfLt - || instruction instanceof IfLtz - || instruction instanceof IfNe - || instruction instanceof IfNez; + return instruction instanceof DexIfEq + || instruction instanceof DexIfEqz + || instruction instanceof DexIfGe + || instruction instanceof DexIfGez + || instruction instanceof DexIfGt + || instruction instanceof DexIfGtz + || instruction instanceof DexIfLe + || instruction instanceof DexIfLez + || instruction instanceof DexIfLt + || instruction instanceof DexIfLtz + || instruction instanceof DexIfNe + || instruction instanceof DexIfNez; } @Override @@ -432,68 +432,68 @@ @Override public boolean isPackedSwitch() { - return instruction instanceof PackedSwitch; + return instruction instanceof DexPackedSwitch; } @Override public boolean isSparseSwitch() { - return instruction instanceof SparseSwitch; + return instruction instanceof DexSparseSwitch; } @Override public boolean isMultiplication() { - return instruction instanceof MulInt - || instruction instanceof MulIntLit8 - || instruction instanceof MulIntLit16 - || instruction instanceof MulInt2Addr - || instruction instanceof MulFloat - || instruction instanceof MulFloat2Addr - || instruction instanceof MulLong - || instruction instanceof MulLong2Addr - || instruction instanceof MulDouble - || instruction instanceof MulDouble2Addr; + return instruction instanceof DexMulInt + || instruction instanceof DexMulIntLit8 + || instruction instanceof DexMulIntLit16 + || instruction instanceof DexMulInt2Addr + || instruction instanceof DexMulFloat + || instruction instanceof DexMulFloat2Addr + || instruction instanceof DexMulLong + || instruction instanceof DexMulLong2Addr + || instruction instanceof DexMulDouble + || instruction instanceof DexMulDouble2Addr; } @Override public boolean isNewArray() { - return instruction instanceof NewArray; + return instruction instanceof DexNewArray; } @Override public boolean isArrayLength() { - return instruction instanceof ArrayLength; + return instruction instanceof DexArrayLength; } @Override public boolean isArrayGet() { - return instruction instanceof Aget - || instruction instanceof AgetBoolean - || instruction instanceof AgetByte - || instruction instanceof AgetChar - || instruction instanceof AgetObject - || instruction instanceof AgetShort - || instruction instanceof AgetWide; + return instruction instanceof DexAget + || instruction instanceof DexAgetBoolean + || instruction instanceof DexAgetByte + || instruction instanceof DexAgetChar + || instruction instanceof DexAgetObject + || instruction instanceof DexAgetShort + || instruction instanceof DexAgetWide; } @Override public boolean isArrayPut() { - return instruction instanceof Aput - || instruction instanceof AputBoolean - || instruction instanceof AputByte - || instruction instanceof AputChar - || instruction instanceof AputObject - || instruction instanceof AputShort - || instruction instanceof AputWide; + return instruction instanceof DexAput + || instruction instanceof DexAputBoolean + || instruction instanceof DexAputByte + || instruction instanceof DexAputChar + || instruction instanceof DexAputObject + || instruction instanceof DexAputShort + || instruction instanceof DexAputWide; } @Override public boolean isMonitorEnter() { - return instruction instanceof MonitorEnter; + return instruction instanceof DexMonitorEnter; } @Override public boolean isMonitorExit() { - return instruction instanceof MonitorExit; + return instruction instanceof DexMonitorExit; } @Override @@ -527,7 +527,7 @@ return instruction.toString(); } - public Instruction getInstruction() { + public DexInstruction getInstruction() { return instruction; } }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java index fcfdbbe..64880f5 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FieldAccessDexInstructionSubject.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; public class FieldAccessDexInstructionSubject extends DexInstructionSubject implements FieldAccessInstructionSubject { @@ -12,7 +12,7 @@ private final CodeInspector codeInspector; public FieldAccessDexInstructionSubject( - CodeInspector codeInspector, Instruction instruction, MethodSubject method) { + CodeInspector codeInspector, DexInstruction instruction, MethodSubject method) { super(instruction, method); this.codeInspector = codeInspector; assert isFieldAccess();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java index c8014e7..8a27919 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -8,7 +8,7 @@ import com.android.tools.r8.cf.code.CfInstruction; import com.android.tools.r8.cf.code.CfPosition; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.errors.Unimplemented; import com.android.tools.r8.errors.Unreachable; import com.android.tools.r8.graph.AppInfo; @@ -317,7 +317,7 @@ DexDebugPositionState state = new DexDebugPositionState(info.startLine, getMethod().getReference()); Iterator<DexDebugEvent> iterator = Arrays.asList(info.events).iterator(); - for (Instruction insn : code.instructions) { + for (DexInstruction insn : code.instructions) { int offset = insn.getOffset(); while (state.getCurrentPc() < offset && iterator.hasNext()) { iterator.next().accept(state);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java index 7f5c6ff..5788846 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/InvokeDexInstructionSubject.java
@@ -4,7 +4,7 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Instruction; +import com.android.tools.r8.dex.code.DexInstruction; import com.android.tools.r8.graph.DexMethod; public class InvokeDexInstructionSubject extends DexInstructionSubject @@ -13,7 +13,7 @@ private final CodeInspector codeInspector; public InvokeDexInstructionSubject( - CodeInspector codeInspector, Instruction instruction, MethodSubject method) { + CodeInspector codeInspector, DexInstruction instruction, MethodSubject method) { super(instruction, method); this.codeInspector = codeInspector; assert isInvoke();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java index ef883fa..ff925b5 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/NewInstanceDexInstructionSubject.java
@@ -4,18 +4,18 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.NewInstance; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexNewInstance; import com.android.tools.r8.graph.DexType; public class NewInstanceDexInstructionSubject extends DexInstructionSubject implements NewInstanceInstructionSubject { - public NewInstanceDexInstructionSubject(Instruction instruction, MethodSubject method) { + public NewInstanceDexInstructionSubject(DexInstruction instruction, MethodSubject method) { super(instruction, method); } @Override public DexType getType() { - return ((NewInstance) instruction).getType(); + return ((DexNewInstance) instruction).getType(); } }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java index a49553f..6f94d8c 100644 --- a/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java +++ b/src/test/java/com/android/tools/r8/utils/codeinspector/SwitchDexInstructionSubject.java
@@ -4,9 +4,9 @@ package com.android.tools.r8.utils.codeinspector; -import com.android.tools.r8.code.Instruction; -import com.android.tools.r8.code.PackedSwitch; -import com.android.tools.r8.code.SparseSwitch; +import com.android.tools.r8.dex.code.DexInstruction; +import com.android.tools.r8.dex.code.DexPackedSwitch; +import com.android.tools.r8.dex.code.DexSparseSwitch; import com.android.tools.r8.ir.conversion.SwitchPayloadResolver; import it.unimi.dsi.fastutil.ints.IntArrayList; import java.util.List; @@ -17,7 +17,9 @@ private final SwitchPayloadResolver switchPayloadResolver; public SwitchDexInstructionSubject( - Instruction instruction, MethodSubject method, SwitchPayloadResolver switchPayloadResolver) { + DexInstruction instruction, + MethodSubject method, + SwitchPayloadResolver switchPayloadResolver) { super(instruction, method); assert isSwitch(); assert instruction.isIntSwitch(); @@ -27,7 +29,7 @@ @Override public List<Integer> getKeys() { - if (instruction instanceof PackedSwitch) { + if (instruction instanceof DexPackedSwitch) { assert switchPayloadResolver.getKeys(instruction.getOffset() + instruction.getPayloadOffset()) .length == 1; @@ -44,7 +46,7 @@ } return keys; } else { - assert instruction instanceof SparseSwitch; + assert instruction instanceof DexSparseSwitch; return new IntArrayList( switchPayloadResolver.getKeys(instruction.getOffset() + instruction.getPayloadOffset())); }
diff --git a/tools/compare_apk_sizes.py b/tools/compare_apk_sizes.py index 895633e..1890283 100755 --- a/tools/compare_apk_sizes.py +++ b/tools/compare_apk_sizes.py
@@ -164,7 +164,7 @@ def Main(): (options, args) = parse_options() if len(args) is not 2: - print args + print(args) print('Takes exactly two arguments, the two apps to compare') return 1 app1 = args[0]
diff --git a/tools/desugar_jdk_libs_repository.py b/tools/desugar_jdk_libs_repository.py index 4cace6a..55db5b6 100755 --- a/tools/desugar_jdk_libs_repository.py +++ b/tools/desugar_jdk_libs_repository.py
@@ -4,6 +4,7 @@ # BSD-style license that can be found in the LICENSE file. import argparse +from enum import Enum import os from os.path import join import shutil @@ -13,14 +14,30 @@ import utils import create_maven_release +class Configuration(Enum): + jdk8 = 'jdk8' + jdk11_legacy = 'jdk11-legacy' + + def __str__(self): + return self.value + def parse_options(): - result = argparse.ArgumentParser( - description='Local desugared library repository for JDK 11 legacy configuration') - result.add_argument('--repo-root', '--repo_root', + parser = argparse.ArgumentParser( + description='Local desugared library repository for desugared library configurations') + parser.add_argument('--repo-root', '--repo_root', default='/tmp/repo', metavar=('<path>'), help='Location for Maven repository.') - args = result.parse_args() + parser.add_argument('--clear-repo', '--clear_repo', + default=False, + action='store_true', + help='Clear the Maven repository so it only has one version present') + parser.add_argument('--configuration', default='jdk8', type=Configuration, choices=list(Configuration)) + parser.add_argument('--desugar-jdk-libs-checkout', '--desugar_jdk_libs_checkout', + default=None, + metavar=('<path>'), + help='Use existing checkout of github.com/google/desugar_jdk_libs.') + args = parser.parse_args() return args def jar_or_pom_file(unzip_dir, artifact, version, extension): @@ -41,16 +58,29 @@ def main(): args = parse_options() - shutil.rmtree(args.repo_root, ignore_errors=True) + if args.clear_repo: + shutil.rmtree(args.repo_root, ignore_errors=True) utils.makedirs_if_needed(args.repo_root) + configuration = (utils.DESUGAR_CONFIGURATION + if args.configuration is Configuration.jdk8 + else utils.DESUGAR_CONFIGURATION_JDK11_LEGACY) + implementation = (utils.DESUGAR_IMPLEMENTATION + if args.configuration is Configuration.jdk8 + else utils.DESUGAR_IMPLEMENTATION_JDK11) + version_file = ('VERSION.txt' + if args.configuration is Configuration.jdk8 else + 'VERSION_JDK11.txt') with utils.TempDir() as tmp_dir: - version = utils.desugar_configuration_version(utils.DESUGAR_CONFIGURATION_JDK11_LEGACY) - + version = utils.desugar_configuration_version(configuration) # Checkout desugar_jdk_libs from GitHub - checkout_dir = join(tmp_dir, 'desugar_jdk_libs') - utils.RunCmd(['git', 'clone', 'https://github.com/google/desugar_jdk_libs.git', checkout_dir]) + use_existing_checkout = args.desugar_jdk_libs_checkout != None + checkout_dir = (args.desugar_jdk_libs_checkout + if use_existing_checkout + else join(tmp_dir, 'desugar_jdk_libs')) + if (not use_existing_checkout): + utils.RunCmd(['git', 'clone', 'https://github.com/google/desugar_jdk_libs.git', checkout_dir]) with utils.ChangedWorkingDirectory(checkout_dir): - with open('VERSION_JDK11.txt') as version_file: + with open(version_file) as version_file: version_file_lines = version_file.readlines() for line in version_file_lines: if not line.startswith('#'): @@ -68,8 +98,8 @@ maven_zip = join(tmp_dir, 'desugar_configuration.zip') create_maven_release.generate_desugar_configuration_maven_zip( maven_zip, - utils.DESUGAR_CONFIGURATION_JDK11_LEGACY, - utils.DESUGAR_IMPLEMENTATION_JDK11) + configuration, + implementation) unzip_dir = join(tmp_dir, 'desugar_jdk_libs_configuration_unzipped') cmd = ['unzip', '-q', maven_zip, '-d', unzip_dir] utils.RunCmd(cmd) @@ -91,12 +121,18 @@ 'build', '--spawn_strategy=local', '--verbose_failures', - ':maven_release_jdk11']) + (':maven_release' + if args.configuration is Configuration.jdk8 + else ':maven_release_jdk11')]) unzip_dir = join(tmp_dir, 'desugar_jdk_libs_unzipped') cmd = [ 'unzip', '-q', - join(checkout_dir, 'bazel-bin', 'desugar_jdk_libs_jdk11.zip'), + join(checkout_dir, + 'bazel-bin', + ('desugar_jdk_libs.zip' + if args.configuration is Configuration.jdk8 + else 'desugar_jdk_libs_jdk11.zip')), '-d', unzip_dir] utils.RunCmd(cmd) @@ -122,11 +158,17 @@ print(" url uri('file://" + args.repo_root + "')") print(" }") print() - print("to dependencyResolutionManagement.repositories in settings.gradle.") + print("to dependencyResolutionManagement.repositories in settings.gradle, and use") + print('the "changing" property of the coreLibraryDesugaring dependency:') print() - print("Remember to run gradle with --refresh-dependencies " - + "(./gradlew --refresh-dependencies ...) " - + "to ensure the cache is not used when the same version is published.") + print(" coreLibraryDesugaring('com.android.tools:desugar_jdk_libs:" + version + "') {") + print(" changing = true") + print(" }") + print() + print('If not using the !changing" propertyRemember to run gradle with ' + + " --refresh-dependencies (./gradlew --refresh-dependencies ...) " + + "to ensure the cache is not used when the same version is published." + + "multiple times.") if __name__ == '__main__': sys.exit(main())
diff --git a/tools/retrace.py b/tools/retrace.py index a2df6ef..a7ff23d 100755 --- a/tools/retrace.py +++ b/tools/retrace.py
@@ -122,6 +122,9 @@ else: args.commit_hash = r8_version_or_hash map_path = None + if get_hash_from_map_file(utils.R8LIB_MAP) == maphash: + return utils.R8LIB_MAP + try: map_path = utils.find_cloud_storage_file_from_options( 'r8lib' + ('-exclude-deps' if is_excldeps else '') + '.jar.map', args) @@ -134,23 +137,25 @@ return map_path # If no other map file was found, use the local mapping file. - return utils.R8LIB_JAR + '.map' + return utils.R8LIB_MAP def check_maphash(mapping_path, maphash, args): + infile_maphash = get_hash_from_map_file(mapping_path) + if infile_maphash != maphash: + print('ERROR: The mapping file hash does not match the R8 line') + print(' In mapping file: ' + infile_maphash) + print(' In source file: ' + maphash) + if (not args.exclude_deps): + print('If this could be a version without internalized dependencies ' + + 'try passing --exclude-deps') + sys.exit(1) + +def get_hash_from_map_file(mapping_path): map_hash_header = "# pg_map_hash: SHA-256 " for line in open(mapping_path, 'r'): if line.startswith(map_hash_header): - infile_maphash = line[len(map_hash_header):].strip() - if infile_maphash != maphash: - print('ERROR: The mapping file hash does not match the R8 line') - print(' In mapping file: ' + infile_maphash) - print(' In source file: ' + maphash) - if (not args.exclude_deps): - print('If this could be a version without internalized dependencies ' - + 'try passing --exclude-deps') - sys.exit(1) - + return line[len(map_hash_header):].strip() def main(): args = parse_arguments()
diff --git a/tools/startup/adb_utils.py b/tools/startup/adb_utils.py index 7f1d3bc..b5e2af2 100644 --- a/tools/startup/adb_utils.py +++ b/tools/startup/adb_utils.py
@@ -95,6 +95,16 @@ ['shell', 'echo 3 > /proc/sys/vm/drop_caches'], device_id) subprocess.check_call(cmd, stdout=DEVNULL, stderr=DEVNULL) +def ensure_screen_on(device_id=None): + if get_screen_state(device_id).is_off(): + toggle_screen(device_id) + assert get_screen_state(device_id).is_on() + +def ensure_screen_off(device_id=None): + if get_screen_state(device_id).is_on(): + toggle_screen(device_id) + assert get_screen_state(device_id).is_off() + def force_compilation(app_id, device_id=None): print('Applying AOT (full)') cmd = create_adb_cmd( @@ -268,10 +278,10 @@ # Unlock device. unlock(device_id, device_pin) - tear_down_options = { + teardown_options = { 'previous_screen_off_timeout': previous_screen_off_timeout } - return tear_down_options + return teardown_options def root(device_id=None): cmd = create_adb_cmd('root', device_id) @@ -308,12 +318,15 @@ cmd = create_adb_cmd('shell am force-stop %s' % app_id, device_id) subprocess.check_call(cmd, stdout=DEVNULL, stderr=DEVNULL) -def tear_down_after_interaction_with_device(tear_down_options, device_id=None): +def teardown_after_interaction_with_device(teardown_options, device_id=None): # Reset screen off timeout. set_screen_off_timeout( - tear_down_options['previous_screen_off_timeout'], + teardown_options['previous_screen_off_timeout'], device_id) +def toggle_screen(device_id=None): + issue_key_event('KEYCODE_POWER', device_id) + def uninstall(app_id, device_id=None): print('Uninstalling %s' % app_id) cmd = create_adb_cmd('uninstall %s' % app_id, device_id) @@ -329,10 +342,8 @@ or expected_error in stderr def unlock(device_id=None, device_pin=None): + ensure_screen_on(device_id) screen_state = get_screen_state(device_id) - if screen_state.is_off(): - issue_key_event('KEYCODE_POWER', device_id) - screen_state = get_screen_state(device_id) assert screen_state.is_on(), 'was %s' % screen_state if screen_state.is_on_and_locked(): if device_pin is not None:
diff --git a/tools/startup/measure_startup.py b/tools/startup/measure_startup.py index f0b2ce9..04076ec 100755 --- a/tools/startup/measure_startup.py +++ b/tools/startup/measure_startup.py
@@ -5,6 +5,7 @@ import argparse import os +import statistics import sys import time @@ -35,47 +36,76 @@ # Unlock device. adb_utils.unlock(options.device_id, options.device_pin) - tear_down_options = { + teardown_options = { 'previous_screen_off_timeout': previous_screen_off_timeout } - return tear_down_options + return teardown_options -def tear_down(options, tear_down_options): +def teardown(options, teardown_options): # Reset screen off timeout. adb_utils.set_screen_off_timeout( - tear_down_options['previous_screen_off_timeout'], + teardown_options['previous_screen_off_timeout'], options.device_id) def run_all(apk, options, tmp_dir): # Launch app while collecting information. - data_avg = {} - for iteration in range(options.iterations): + data_total = {} + for iteration in range(1, options.iterations + 1): print('Starting iteration %i' % iteration) out_dir = os.path.join(options.out_dir, str(iteration)) - prepare_for_run(apk, out_dir, options) + teardown_options = setup_for_run(apk, out_dir, options) data = run(out_dir, options, tmp_dir) - add_data(data_avg, data) - print("Result:") + teardown_for_run(options, teardown_options) + add_data(data_total, data) + print('Result:') print(data) - print("Done") - for key, value in data_avg.items(): - if isinstance(value, int): - data_avg[key] = value / options.iterations - print("Average result:") - print(data_avg) - write_data(options.out_dir, data_avg) + print(compute_data_summary(data_total)) + print('Done') + print('Average result:') + data_summary = compute_data_summary(data_total) + print(data_summary) + write_data(options.out_dir, data_summary) -def prepare_for_run(apk, out_dir, options): +def compute_data_summary(data_total): + data_summary = {} + for key, value in data_total.items(): + if not isinstance(value, list): + data_summary[key] = value + continue + data_summary['%s_avg' % key] = round(statistics.mean(value), 1) + data_summary['%s_med' % key] = statistics.median(value) + return data_summary + +def setup_for_run(apk, out_dir, options): adb_utils.root(options.device_id) + + print('Installing') adb_utils.uninstall(options.app_id, options.device_id) adb_utils.install(apk, options.device_id) + os.makedirs(out_dir, exist_ok=True) + + # AOT compile. if options.aot: + print('AOT compiling') if options.baseline_profile: adb_utils.clear_profile_data(options.app_id, options.device_id) adb_utils.install_profile(options.app_id, options.device_id) else: adb_utils.force_compilation(options.app_id, options.device_id) + + # Cooldown and then unlock device. + if options.cooldown > 0: + print('Cooling down for %i seconds' % options.cooldown) + assert adb_utils.get_screen_state(options.device_id).is_off() + time.sleep(options.cooldown) + teardown_options = adb_utils.prepare_for_interaction_with_device( + options.device_id, options.device_pin) + else: + teardown_options = None + + # Prelaunch for hot startup. if options.hot_startup: + print('Prelaunching') adb_utils.launch_activity( options.app_id, options.main_activity, @@ -84,8 +114,20 @@ time.sleep(options.startup_duration) adb_utils.navigate_to_home_screen(options.device_id) time.sleep(1) + + # Drop caches before run. adb_utils.drop_caches(options.device_id) - os.makedirs(out_dir, exist_ok=True) + return teardown_options + +def teardown_for_run(options, teardown_options): + assert adb_utils.get_screen_state(options.device_id).is_on_and_unlocked() + + if options.cooldown > 0: + adb_utils.teardown_after_interaction_with_device( + teardown_options, options.device_id) + adb_utils.ensure_screen_off(options.device_id) + else: + assert teardown_options is None def run(out_dir, options, tmp_dir): assert adb_utils.get_screen_state(options.device_id).is_on_and_unlocked() @@ -113,20 +155,24 @@ write_data(out_dir, data) return data -def add_data(sum_data, data): +def add_data(data_total, data): for key, value in data.items(): + if key == 'app_id': + assert data_total.get(key, value) == value + data_total[key] = value if key == 'time': continue - if key in sum_data: + if key in data_total: if key == 'app_id': - assert sum_data[key] == value + assert data_total[key] == value else: - existing_value = sum_data[key] + existing_value = data_total[key] assert isinstance(value, int) - assert isinstance(existing_value, int) - sum_data[key] = existing_value + value + assert isinstance(existing_value, list) + existing_value.append(value) else: - sum_data[key] = value + assert isinstance(value, int), key + data_total[key] = [value] def compute_data(launch_activity_result, perfetto_trace_path, options): minfl, majfl = adb_utils.get_minor_major_page_faults( @@ -202,6 +248,10 @@ result.add_argument('--apk', help='Path to the APK', required=True) + result.add_argument('--cooldown', + help='Seconds to wait before running each iteration', + default=0, + type=int) result.add_argument('--device-id', help='Device id (e.g., emulator-5554).') result.add_argument('--device-pin', @@ -236,16 +286,33 @@ assert options.aot or not options.baseline_profile return options, args +def global_setup(options): + # If there is no cooldown then unlock the screen once. Otherwise we turn off + # the screen during the cooldown and unlock the screen before each iteration. + teardown_options = None + if options.cooldown == 0: + teardown_options = adb_utils.prepare_for_interaction_with_device( + options.device_id, options.device_pin) + assert adb_utils.get_screen_state(options.device_id).is_on() + else: + adb_utils.ensure_screen_off(options.device_id) + return teardown_options + +def global_teardown(options, teardown_options): + if options.cooldown == 0: + adb_utils.teardown_after_interaction_with_device( + teardown_options, options.device_id) + else: + assert teardown_options is None + def main(argv): (options, args) = parse_options(argv) with utils.TempDir() as tmp_dir: apk = apk_utils.add_baseline_profile_to_apk( options.apk, options.baseline_profile, tmp_dir) - tear_down_options = adb_utils.prepare_for_interaction_with_device( - options.device_id, options.device_pin) + teardown_options = global_setup(options) run_all(apk, options, tmp_dir) - adb_utils.tear_down_after_interaction_with_device( - tear_down_options, options.device_id) + global_teardown(options, teardown_options) if __name__ == '__main__': sys.exit(main(sys.argv[1:])) \ No newline at end of file
diff --git a/tools/utils.py b/tools/utils.py index 27a8feb..85fda69 100644 --- a/tools/utils.py +++ b/tools/utils.py
@@ -54,7 +54,7 @@ R8_JAR = os.path.join(LIBS, 'r8.jar') R8_WITH_RELOCATED_DEPS_JAR = os.path.join(LIBS, 'r8_with_relocated_deps.jar') R8LIB_JAR = os.path.join(LIBS, 'r8lib.jar') -R8LIB_MAP = os.path.join(LIBS, 'r8lib.jar.map') +R8LIB_MAP = '%s.map' % R8LIB_JAR R8_SRC_JAR = os.path.join(LIBS, 'r8-src.jar') R8LIB_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8lib-exclude-deps.jar') R8_FULL_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8-full-exclude-deps.jar')