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..0427fc3
--- /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..13495c3 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')