Add public API for adding ART profiles for rewriting
Bug: b/237043695
Change-Id: I9ff06771807471bf8a20f848f8c681f21d86fd27
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index 0900897..a233e49 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -12,7 +12,9 @@
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.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileConsumer;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
+import com.android.tools.r8.profile.art.ArtProfileProvider;
import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
@@ -58,7 +60,7 @@
private final MapIdProvider mapIdProvider;
private final SourceFileProvider sourceFileProvider;
private final boolean isAndroidPlatformBuild;
- private final List<ArtProfileInput> artProfileInputs;
+ private final List<ArtProfileForRewriting> artProfilesForRewriting;
private final List<StartupProfileProvider> startupProfileProviders;
private final ClassConflictResolver classConflictResolver;
@@ -80,7 +82,7 @@
mapIdProvider = null;
sourceFileProvider = null;
isAndroidPlatformBuild = false;
- artProfileInputs = null;
+ artProfilesForRewriting = null;
startupProfileProviders = null;
classConflictResolver = null;
}
@@ -103,7 +105,7 @@
MapIdProvider mapIdProvider,
SourceFileProvider sourceFileProvider,
boolean isAndroidPlatformBuild,
- List<ArtProfileInput> artProfileInputs,
+ List<ArtProfileForRewriting> artProfilesForRewriting,
List<StartupProfileProvider> startupProfileProviders,
ClassConflictResolver classConflictResolver) {
super(app);
@@ -125,7 +127,7 @@
this.mapIdProvider = mapIdProvider;
this.sourceFileProvider = sourceFileProvider;
this.isAndroidPlatformBuild = isAndroidPlatformBuild;
- this.artProfileInputs = artProfileInputs;
+ this.artProfilesForRewriting = artProfilesForRewriting;
this.startupProfileProviders = startupProfileProviders;
this.classConflictResolver = classConflictResolver;
}
@@ -224,8 +226,8 @@
return isAndroidPlatformBuild;
}
- List<ArtProfileInput> getArtProfileInputs() {
- return artProfileInputs;
+ List<ArtProfileForRewriting> getArtProfilesForRewriting() {
+ return artProfilesForRewriting;
}
List<StartupProfileProvider> getStartupProfileProviders() {
@@ -267,7 +269,6 @@
protected DesugarState desugarState = DesugarState.ON;
private List<StringResource> desugaredLibrarySpecificationResources = new ArrayList<>();
private boolean includeClassesChecksum = false;
- private boolean lookupLibraryBeforeProgram = true;
private boolean optimizeMultidexForLinearAlloc = false;
private BiPredicate<String, Long> dexClassChecksumFilter = (name, checksum) -> true;
private List<AssertionsConfiguration> assertionsConfiguration = new ArrayList<>();
@@ -277,7 +278,7 @@
private MapIdProvider mapIdProvider = null;
private SourceFileProvider sourceFileProvider = null;
private boolean isAndroidPlatformBuild = false;
- private List<ArtProfileInput> artProfileInputs = new ArrayList<>();
+ private List<ArtProfileForRewriting> artProfilesForRewriting = new ArrayList<>();
private List<StartupProfileProvider> startupProfileProviders = new ArrayList<>();
private ClassConflictResolver classConflictResolver = null;
@@ -695,17 +696,21 @@
return isAndroidPlatformBuild;
}
- B addArtProfileInputs(ArtProfileInput... artProfileInputs) {
- return addArtProfileInputs(Arrays.asList(artProfileInputs));
- }
-
- B addArtProfileInputs(Collection<ArtProfileInput> artProfileInputs) {
- this.artProfileInputs.addAll(artProfileInputs);
+ /**
+ * Add an ART profiles that should be rewritten to match the residual application. The ART
+ * profile is given to the compiler by the {@link ArtProfileProvider} and passed back to the
+ * {@link ArtProfileConsumer} at the end of compilation when the ART profile has been fully
+ * rewritten to match the residual application.
+ */
+ public B addArtProfileForRewriting(
+ ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileProvider) {
+ artProfilesForRewriting.add(
+ new ArtProfileForRewriting(artProfileProvider, residualArtProfileProvider));
return self();
}
- List<ArtProfileInput> getArtProfileInputs() {
- return artProfileInputs;
+ List<ArtProfileForRewriting> getArtProfilesForRewriting() {
+ return artProfilesForRewriting;
}
B addStartupProfileProviders(StartupProfileProvider... startupProfileProviders) {
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 687da32..43bcdee 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
import com.android.tools.r8.shaking.ProguardConfigurationParser;
import com.android.tools.r8.shaking.ProguardConfigurationRule;
import com.android.tools.r8.shaking.ProguardConfigurationSource;
@@ -458,7 +458,7 @@
proguardMapConsumer,
enableMissingLibraryApiModeling,
getAndroidPlatformBuild(),
- getArtProfileInputs(),
+ getArtProfilesForRewriting(),
getStartupProfileProviders(),
getClassConflictResolver(),
factory);
@@ -551,7 +551,7 @@
StringConsumer proguardMapConsumer,
boolean enableMissingLibraryApiModeling,
boolean isAndroidPlatformBuild,
- List<ArtProfileInput> artProfileInputs,
+ List<ArtProfileForRewriting> artProfilesForRewriting,
List<StartupProfileProvider> startupProfileProviders,
ClassConflictResolver classConflictResolver,
DexItemFactory factory) {
@@ -573,7 +573,7 @@
mapIdProvider,
null,
isAndroidPlatformBuild,
- artProfileInputs,
+ artProfilesForRewriting,
startupProfileProviders,
classConflictResolver);
this.intermediate = intermediate;
@@ -698,7 +698,10 @@
internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
- internal.getArtProfileOptions().setArtProfileInputs(getArtProfileInputs()).setPassthrough(true);
+ internal
+ .getArtProfileOptions()
+ .setArtProfilesForRewriting(getArtProfilesForRewriting())
+ .setPassthrough(true);
internal.getStartupOptions().setStartupProfileProviders(getStartupProfileProviders());
internal.programClassConflictResolver =
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 123c7d3..783bab0 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.inspector.Inspector;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
import com.android.tools.r8.utils.AndroidApiLevel;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.AssertionConfigurationWithDefault;
@@ -372,8 +373,12 @@
.setMode(getMode())
.setIncludeClassesChecksum(getIncludeClassesChecksum())
.setDexClassChecksumFilter(getDexClassChecksumFilter())
- .setProgramConsumer(getProgramConsumer())
- .addArtProfileInputs(getArtProfileInputs());
+ .setProgramConsumer(getProgramConsumer());
+ for (ArtProfileForRewriting artProfileForRewriting : getArtProfilesForRewriting()) {
+ r8Builder.addArtProfileForRewriting(
+ artProfileForRewriting.getArtProfileProvider(),
+ artProfileForRewriting.getResidualArtProfileConsumer());
+ }
for (ClassFileResourceProvider libraryResourceProvider :
inputs.getLibraryResourceProviders()) {
r8Builder.addLibraryResourceProvider(libraryResourceProvider);
@@ -404,8 +409,12 @@
.setMode(getMode())
.setIncludeClassesChecksum(getIncludeClassesChecksum())
.setDexClassChecksumFilter(getDexClassChecksumFilter())
- .setProgramConsumer(getProgramConsumer())
- .addArtProfileInputs(getArtProfileInputs());
+ .setProgramConsumer(getProgramConsumer());
+ for (ArtProfileForRewriting artProfileForRewriting : getArtProfilesForRewriting()) {
+ d8Builder.addArtProfileForRewriting(
+ artProfileForRewriting.getArtProfileProvider(),
+ artProfileForRewriting.getResidualArtProfileConsumer());
+ }
for (ClassFileResourceProvider libraryResourceProvider :
inputs.getLibraryResourceProviders()) {
d8Builder.addLibraryResourceProvider(libraryResourceProvider);
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 55963a2..8e5a0ec 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -18,7 +18,7 @@
import com.android.tools.r8.naming.SourceFileRewriter;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileInput;
+import com.android.tools.r8.profile.art.ArtProfileForRewriting;
import com.android.tools.r8.shaking.ProguardConfiguration;
import com.android.tools.r8.shaking.ProguardConfigurationParser;
import com.android.tools.r8.shaking.ProguardConfigurationParserOptions;
@@ -663,7 +663,7 @@
getSourceFileProvider(),
enableMissingLibraryApiModeling,
getAndroidPlatformBuild(),
- getArtProfileInputs(),
+ getArtProfilesForRewriting(),
getStartupProfileProviders(),
getClassConflictResolver());
@@ -852,7 +852,7 @@
SourceFileProvider sourceFileProvider,
boolean enableMissingLibraryApiModeling,
boolean isAndroidPlatformBuild,
- List<ArtProfileInput> artProfileInputs,
+ List<ArtProfileForRewriting> artProfilesForRewriting,
List<StartupProfileProvider> startupProfileProviders,
ClassConflictResolver classConflictResolver) {
super(
@@ -873,7 +873,7 @@
mapIdProvider,
sourceFileProvider,
isAndroidPlatformBuild,
- artProfileInputs,
+ artProfilesForRewriting,
startupProfileProviders,
classConflictResolver);
assert proguardConfiguration != null;
@@ -1075,7 +1075,7 @@
internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
- internal.getArtProfileOptions().setArtProfileInputs(getArtProfileInputs());
+ internal.getArtProfileOptions().setArtProfilesForRewriting(getArtProfilesForRewriting());
internal.getStartupOptions().setStartupProfileProviders(getStartupProfileProviders());
internal.programClassConflictResolver =
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
index 37b9011..f4418ba 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfile.java
@@ -42,7 +42,7 @@
(methodRule, builderFactory) ->
builderFactory
.apply(lens.getRenamedMethodSignature(methodRule.getMethod()))
- .internalSetMethodRuleInfo(
+ .acceptMethodRuleInfoBuilder(
methodRuleInfoBuilder ->
methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo())));
}
@@ -55,7 +55,7 @@
(methodRule, builderFactory) ->
builderFactory
.apply(lens.lookupMethod(methodRule.getMethod(), dexItemFactory))
- .internalSetMethodRuleInfo(
+ .acceptMethodRuleInfoBuilder(
methodRuleInfoBuilder ->
methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo())));
}
@@ -71,7 +71,7 @@
if (!prunedItems.isRemoved(methodRule.getMethod())) {
builderFactory
.apply(methodRule.getMethod())
- .internalSetMethodRuleInfo(
+ .acceptMethodRuleInfoBuilder(
methodRuleInfoBuilder ->
methodRuleInfoBuilder.merge(methodRule.getMethodRuleInfo()));
}
@@ -116,9 +116,9 @@
return new ArtProfile(newRules.build());
}
- public void supplyConsumer(ResidualArtProfileConsumer consumer, Reporter reporter) {
+ public void supplyConsumer(ArtProfileConsumer consumer, Reporter reporter) {
if (consumer != null) {
- ResidualArtProfileRuleConsumer ruleConsumer = consumer.getRuleConsumer();
+ ArtProfileRuleConsumer ruleConsumer = consumer.getRuleConsumer();
if (ruleConsumer != null) {
for (ArtProfileRule rule : rules) {
rule.accept(
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
index 930aade..d5af9c8 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileBuilder.java
@@ -4,10 +4,11 @@
package com.android.tools.r8.profile.art;
+import com.android.tools.r8.Keep;
import java.util.function.Consumer;
/** API for building an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
public interface ArtProfileBuilder {
ArtProfileBuilder addClassRule(Consumer<ArtProfileClassRuleBuilder> classRuleBuilderConsumer);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
index 6f02da7..eaeab93 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileClassRuleBuilder.java
@@ -4,10 +4,11 @@
package com.android.tools.r8.profile.art;
+import com.android.tools.r8.Keep;
import com.android.tools.r8.references.ClassReference;
/** API for defining a class rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
public interface ArtProfileClassRuleBuilder {
ArtProfileClassRuleBuilder setClassReference(ClassReference classReference);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
index 1d7c009..16b2d44 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileCollection.java
@@ -18,17 +18,19 @@
public static ArtProfileCollection createInitialArtProfileCollection(InternalOptions options) {
ArtProfileOptions artProfileOptions = options.getArtProfileOptions();
- Collection<ArtProfileInput> artProfileInputs = artProfileOptions.getArtProfileInputs();
- if (artProfileInputs.isEmpty()) {
+ Collection<ArtProfileForRewriting> artProfilesForRewriting =
+ artProfileOptions.getArtProfilesForRewriting();
+ if (artProfilesForRewriting.isEmpty()) {
return empty();
}
if (artProfileOptions.isPassthrough()) {
return passthrough();
}
- List<ArtProfile> artProfiles = new ArrayList<>(artProfileInputs.size());
- for (ArtProfileInput input : options.getArtProfileOptions().getArtProfileInputs()) {
+ List<ArtProfile> artProfiles = new ArrayList<>(artProfilesForRewriting.size());
+ for (ArtProfileForRewriting input :
+ options.getArtProfileOptions().getArtProfilesForRewriting()) {
ArtProfile.Builder artProfileBuilder = ArtProfile.builder(options.dexItemFactory());
- input.getArtProfile(artProfileBuilder);
+ input.getArtProfileProvider().getArtProfile(artProfileBuilder);
artProfiles.add(artProfileBuilder.build());
}
return new NonEmptyArtProfileCollection(artProfiles);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
similarity index 65%
rename from src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java
rename to src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
index fc8183e..6cc123d 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileConsumer.java
@@ -5,19 +5,20 @@
package com.android.tools.r8.profile.art;
import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.Keep;
/**
* API for consuming an ART profile provided by the compiler, which has been rewritten to match the
* residual, optimized app.
*/
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ResidualArtProfileConsumer {
+@Keep
+public interface ArtProfileConsumer {
/**
- * Returns an {@link ResidualArtProfileRuleConsumer} that will receive the rules of the residual
- * ART profile. If this returns <code>null</code> no rules will be emitted.
+ * Returns an {@link ArtProfileRuleConsumer} that will receive the rules of the residual ART
+ * profile. If this returns <code>null</code> no rules will be emitted.
*/
- default ResidualArtProfileRuleConsumer getRuleConsumer() {
+ default ArtProfileRuleConsumer getRuleConsumer() {
return null;
}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java
new file mode 100644
index 0000000..7065f86
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileForRewriting.java
@@ -0,0 +1,31 @@
+// 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.profile.art;
+
+/** Internal pair of an {@link ArtProfileProvider} and {@link ArtProfileConsumer}. */
+public class ArtProfileForRewriting {
+
+ private final ArtProfileProvider artProfileProvider;
+ private final ArtProfileConsumer residualArtProfileConsumer;
+
+ public ArtProfileForRewriting(
+ ArtProfileProvider artProfileProvider, ArtProfileConsumer residualArtProfileConsumer) {
+ this.artProfileProvider = artProfileProvider;
+ this.residualArtProfileConsumer = residualArtProfileConsumer;
+ }
+
+ /** Specifies a provider that performs callbacks to a given {@link ArtProfileBuilder}. */
+ public ArtProfileProvider getArtProfileProvider() {
+ return artProfileProvider;
+ }
+
+ /**
+ * Specifies a consumer that should receive the ART profile after it has been rewritten to match
+ * the residual, optimized application.
+ */
+ public ArtProfileConsumer getResidualArtProfileConsumer() {
+ return residualArtProfileConsumer;
+ }
+}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java
deleted file mode 100644
index 74d0685..0000000
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileInput.java
+++ /dev/null
@@ -1,24 +0,0 @@
-// 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.profile.art;
-
-/**
- * Top-level API for supplying an ART profile to the compiler and retrieving the ART profile after
- * the profile has been rewritten to match the residual, optimized application.
- */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ArtProfileInput {
-
- /**
- * Specifies a consumer that should receive the ART profile after it has been rewritten to match
- * the residual, optimized application.
- */
- // TODO(b/237043695): If this ends up in the public API, maybe rename this method to
- // getResidualArtProfileConsumer() and ResidualArtProfileConsumer to ArtProfileConsumer.
- ResidualArtProfileConsumer getArtProfileConsumer();
-
- /** Provides the ART profile by performing callbacks to the given {@param profileBuilder}. */
- void getArtProfile(ArtProfileBuilder profileBuilder);
-}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
index 2a1f840..57e0639 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRule.java
@@ -122,11 +122,11 @@
@Override
public Builder setMethodRuleInfo(
Consumer<ArtProfileMethodRuleInfoBuilder> methodRuleInfoBuilderConsumer) {
- internalSetMethodRuleInfo(methodRuleInfoBuilderConsumer);
- return this;
+ methodRuleInfoBuilder.clear();
+ return acceptMethodRuleInfoBuilder(methodRuleInfoBuilderConsumer);
}
- public Builder internalSetMethodRuleInfo(
+ public Builder acceptMethodRuleInfoBuilder(
Consumer<? super ArtProfileMethodRuleInfoImpl.Builder> methodRuleInfoBuilderConsumer) {
methodRuleInfoBuilderConsumer.accept(methodRuleInfoBuilder);
return this;
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
index 99c7888..4bae3b3 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleBuilder.java
@@ -4,11 +4,12 @@
package com.android.tools.r8.profile.art;
+import com.android.tools.r8.Keep;
import com.android.tools.r8.references.MethodReference;
import java.util.function.Consumer;
/** API for defining a method rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
public interface ArtProfileMethodRuleBuilder {
ArtProfileMethodRuleBuilder setMethodReference(MethodReference methodReference);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
index a3a4041..11f8b42 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoBuilder.java
@@ -4,8 +4,10 @@
package com.android.tools.r8.profile.art;
+import com.android.tools.r8.Keep;
+
/** API for providing metadata related to a method rule for an ART profile. */
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
+@Keep
public interface ArtProfileMethodRuleInfoBuilder {
ArtProfileMethodRuleInfoBuilder setIsHot(boolean isHot);
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
index 7bf5d15..046a20e 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileMethodRuleInfoImpl.java
@@ -77,6 +77,11 @@
private int flags;
+ Builder clear() {
+ flags = 0;
+ return this;
+ }
+
public Builder merge(ArtProfileMethodRuleInfo methodRuleInfo) {
if (methodRuleInfo.isHot()) {
setIsHot();
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
index accab43..231a2d6 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileOptions.java
@@ -9,17 +9,17 @@
public class ArtProfileOptions {
- private Collection<ArtProfileInput> inputs = Collections.emptyList();
+ private Collection<ArtProfileForRewriting> artProfilesForRewriting = Collections.emptyList();
private boolean passthrough;
public ArtProfileOptions() {}
- public Collection<ArtProfileInput> getArtProfileInputs() {
- return inputs;
+ public Collection<ArtProfileForRewriting> getArtProfilesForRewriting() {
+ return artProfilesForRewriting;
}
- public ArtProfileOptions setArtProfileInputs(Collection<ArtProfileInput> inputs) {
- this.inputs = inputs;
+ public ArtProfileOptions setArtProfilesForRewriting(Collection<ArtProfileForRewriting> inputs) {
+ this.artProfilesForRewriting = inputs;
return this;
}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java
new file mode 100644
index 0000000..87450e5
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileProvider.java
@@ -0,0 +1,15 @@
+// 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.profile.art;
+
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.Resource;
+
+/** API for providing an ART profile to the compiler. */
+@Keep
+public interface ArtProfileProvider extends Resource {
+
+ void getArtProfile(ArtProfileBuilder profileBuilder);
+}
diff --git a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java b/src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
similarity index 86%
rename from src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java
rename to src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
index ae1e950..beab144 100644
--- a/src/main/java/com/android/tools/r8/profile/art/ResidualArtProfileRuleConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/art/ArtProfileRuleConsumer.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.profile.art;
+import com.android.tools.r8.Keep;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
@@ -12,8 +13,8 @@
* #acceptClassRule} and {@link #acceptMethodRule} for each class and method rule (respectively) in
* the profile.
*/
-// TODO(b/237043695): @Keep this when adding a public API for passing ART profiles to the compiler.
-public interface ResidualArtProfileRuleConsumer {
+@Keep
+public interface ArtProfileRuleConsumer {
/** Provides information about a specific class rule to the consumer. */
void acceptClassRule(ClassReference classReference, ArtProfileClassRuleInfo classRuleInfo);
diff --git a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
index c3b420c..f0313ef 100644
--- a/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/EmptyArtProfileCollection.java
@@ -32,7 +32,7 @@
@Override
public void supplyConsumers(AppView<?> appView) {
- assert appView.options().getArtProfileOptions().getArtProfileInputs().isEmpty();
+ assert appView.options().getArtProfileOptions().getArtProfilesForRewriting().isEmpty();
}
@Override
diff --git a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
index 56c9683..e3cbaf7 100644
--- a/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/NonEmptyArtProfileCollection.java
@@ -42,13 +42,14 @@
? this
: rewrittenWithLens(appView.getNamingLens(), appView.dexItemFactory());
InternalOptions options = appView.options();
- Collection<ArtProfileInput> inputs = options.getArtProfileOptions().getArtProfileInputs();
+ Collection<ArtProfileForRewriting> inputs =
+ options.getArtProfileOptions().getArtProfilesForRewriting();
assert !inputs.isEmpty();
assert collection.artProfiles.size() == inputs.size();
- Iterator<ArtProfileInput> inputIterator = inputs.iterator();
+ Iterator<ArtProfileForRewriting> inputIterator = inputs.iterator();
for (ArtProfile artProfile : collection.artProfiles) {
- ArtProfileInput input = inputIterator.next();
- artProfile.supplyConsumer(input.getArtProfileConsumer(), options.reporter);
+ ArtProfileForRewriting input = inputIterator.next();
+ artProfile.supplyConsumer(input.getResidualArtProfileConsumer(), options.reporter);
}
}
diff --git a/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java b/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
index 0ca22c0..0b7e0ac 100644
--- a/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
+++ b/src/main/java/com/android/tools/r8/profile/art/PassthroughArtProfileCollection.java
@@ -36,16 +36,18 @@
@Override
public void supplyConsumers(AppView<?> appView) {
- for (ArtProfileInput artProfileInput :
- appView.options().getArtProfileOptions().getArtProfileInputs()) {
- ResidualArtProfileConsumer artProfileConsumer = artProfileInput.getArtProfileConsumer();
+ for (ArtProfileForRewriting artProfileForRewriting :
+ appView.options().getArtProfileOptions().getArtProfilesForRewriting()) {
+ ArtProfileConsumer artProfileConsumer =
+ artProfileForRewriting.getResidualArtProfileConsumer();
if (artProfileConsumer == null) {
continue;
}
- ResidualArtProfileRuleConsumer ruleConsumer = artProfileConsumer.getRuleConsumer();
+ ArtProfileRuleConsumer ruleConsumer = artProfileConsumer.getRuleConsumer();
if (ruleConsumer != null) {
- artProfileInput.getArtProfile(
+ ArtProfileProvider artProfileProvider = artProfileForRewriting.getArtProfileProvider();
+ artProfileProvider.getArtProfile(
new ArtProfileBuilder() {
@Override