New compiler API for passing startup profile to D8/R8
This adds a new setStartupProfileProvider(StartupProfileProvider) API to D8 and R8 command builders (D8Command$Builder and R8Command$Builder).
StartupProfileProvider is an interface with a single get() method that returns the startup profile as a java.lang.String, and is added to the public API of the compiler.
The startup profile is used by D8 and R8 to ensure that classes used during startup will be present in the primary classes.dex file. Moreover, R8 uses the startup profile to guide its optimizations so that (additional) post-startup code is not added to the app's startup classes.
Change-Id: Ic114a3de785219508a2c634a297f3cef226d5bbf
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index 08c7a84..e8e5a04 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -12,6 +12,7 @@
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecificationParser;
import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.DumpInputFlags;
@@ -21,6 +22,7 @@
import com.android.tools.r8.utils.ThreadUtils;
import java.nio.file.Path;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -55,6 +57,7 @@
private final MapIdProvider mapIdProvider;
private final SourceFileProvider sourceFileProvider;
private final boolean isAndroidPlatformBuild;
+ private final List<StartupProfileProvider> startupProfileProviders;
BaseCompilerCommand(boolean printHelp, boolean printVersion) {
super(printHelp, printVersion);
@@ -74,6 +77,7 @@
mapIdProvider = null;
sourceFileProvider = null;
isAndroidPlatformBuild = false;
+ startupProfileProviders = null;
}
BaseCompilerCommand(
@@ -93,7 +97,8 @@
DumpInputFlags dumpInputFlags,
MapIdProvider mapIdProvider,
SourceFileProvider sourceFileProvider,
- boolean isAndroidPlatformBuild) {
+ boolean isAndroidPlatformBuild,
+ List<StartupProfileProvider> startupProfileProviders) {
super(app);
assert minApiLevel > 0;
assert mode != null;
@@ -113,6 +118,7 @@
this.mapIdProvider = mapIdProvider;
this.sourceFileProvider = sourceFileProvider;
this.isAndroidPlatformBuild = isAndroidPlatformBuild;
+ this.startupProfileProviders = startupProfileProviders;
}
/**
@@ -208,6 +214,10 @@
return isAndroidPlatformBuild;
}
+ List<StartupProfileProvider> getStartupProfileProviders() {
+ return startupProfileProviders;
+ }
+
DumpInputFlags getDumpInputFlags() {
return dumpInputFlags;
}
@@ -249,6 +259,7 @@
private MapIdProvider mapIdProvider = null;
private SourceFileProvider sourceFileProvider = null;
private boolean isAndroidPlatformBuild = false;
+ private List<StartupProfileProvider> startupProfileProviders = new ArrayList<>();
abstract CompilationMode defaultCompilationMode();
@@ -664,6 +675,19 @@
return isAndroidPlatformBuild;
}
+ B addStartupProfileProviders(StartupProfileProvider... startupProfileProviders) {
+ return addStartupProfileProviders(Arrays.asList(startupProfileProviders));
+ }
+
+ B addStartupProfileProviders(Collection<StartupProfileProvider> startupProfileProviders) {
+ this.startupProfileProviders.addAll(startupProfileProviders);
+ return self();
+ }
+
+ List<StartupProfileProvider> getStartupProfileProviders() {
+ return startupProfileProviders;
+ }
+
/**
* Allow to skip to dump into file and dump into directory instruction, this is primarily used
* for chained compilation in L8 so there are no duplicated dumps.