Ensure all art profile method rules have at least one flag set
Fixes: b/278207473
Change-Id: I44e0369e08b4a5fbc442aae1ac7886d1da4acf7c
diff --git a/src/main/java/com/android/tools/r8/profile/AbstractProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/AbstractProfileMethodRule.java
index ddb1225..f39ea03 100644
--- a/src/main/java/com/android/tools/r8/profile/AbstractProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/AbstractProfileMethodRule.java
@@ -20,6 +20,8 @@
MethodRuleBuilder join(MethodRuleBuilder methodRuleBuilder);
+ MethodRuleBuilder setIsStartup();
+
MethodRuleBuilder setMethod(DexMethod method);
MethodRule build();
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 e6dc68a..bc1dfda 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
@@ -53,7 +53,12 @@
clazz.forEachMethod(
method ->
artProfileBuilder.addMethodRule(
- ArtProfileMethodRule.builder().setMethod(method.getReference()).build()));
+ ArtProfileMethodRule.builder()
+ .setMethod(method.getReference())
+ .acceptMethodRuleInfoBuilder(
+ methodRuleInfoBuilder ->
+ methodRuleInfoBuilder.setIsHot().setIsStartup().setIsPostStartup())
+ .build()));
}
return artProfileBuilder.build();
}
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 4b417c9..5f4defc 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
@@ -21,6 +21,7 @@
private final ArtProfileMethodRuleInfoImpl info;
ArtProfileMethodRule(DexMethod method, ArtProfileMethodRuleInfoImpl info) {
+ assert info.getFlags() != 0;
this.method = method;
this.info = info;
}
@@ -141,6 +142,12 @@
}
@Override
+ public Builder setIsStartup() {
+ methodRuleInfoBuilder.setIsStartup();
+ return this;
+ }
+
+ @Override
public Builder setMethodReference(MethodReference methodReference) {
assert dexItemFactory != null;
return setMethod(MethodReferenceUtils.toDexMethod(methodReference, dexItemFactory));
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
index cb799fd..9d133de 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ConcreteProfileCollectionAdditions.java
@@ -65,14 +65,13 @@
applyIfContextIsInProfile(context, additionsBuilder -> additionsBuilder.addRule(method));
}
- public void addMethodIfContextIsInProfile(
- ProgramMethod method,
- DexClassAndMethod context,
- Consumer<AbstractProfileMethodRule.Builder<?, ?>> methodRuleBuilderConsumer) {
+ public void addMethodIfContextIsInProfile(ProgramMethod method, DexClassAndMethod context) {
if (context.isProgramMethod()) {
addMethodIfContextIsInProfile(method, context.asProgramMethod());
} else {
- accept(additions -> additions.addMethodRule(method, methodRuleBuilderConsumer));
+ accept(
+ additions ->
+ additions.addMethodRule(method, AbstractProfileMethodRule.Builder::setIsStartup));
}
}
@@ -82,21 +81,18 @@
}
void applyIfContextIsInProfile(
- ProgramDefinition context,
- Consumer<ProfileAdditions<?, ?, ?, ?, ?, ?, ?, ?>> additionsConsumer,
- Consumer<ProfileAdditionsBuilder> additionsBuilderConsumer) {
+ ProgramDefinition context, Consumer<ProfileAdditionsBuilder> builderConsumer) {
if (context.isProgramClass()) {
- applyIfContextIsInProfile(context.asProgramClass(), additionsConsumer);
+ applyIfContextIsInProfile(context.asProgramClass(), builderConsumer);
} else {
assert context.isProgramMethod();
- applyIfContextIsInProfile(context.asProgramMethod(), additionsBuilderConsumer);
+ applyIfContextIsInProfile(context.asProgramMethod(), builderConsumer);
}
}
void applyIfContextIsInProfile(
- DexProgramClass context,
- Consumer<ProfileAdditions<?, ?, ?, ?, ?, ?, ?, ?>> additionsConsumer) {
- accept(additions -> additions.applyIfContextIsInProfile(context.getType(), additionsConsumer));
+ DexProgramClass context, Consumer<ProfileAdditionsBuilder> builderConsumer) {
+ accept(additions -> additions.applyIfContextIsInProfile(context.getType(), builderConsumer));
}
public void applyIfContextIsInProfile(
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
index 869f88b..1005bcd 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileAdditions.java
@@ -90,9 +90,29 @@
this.profile = profile;
}
- public void applyIfContextIsInProfile(DexType context, Consumer<? super Additions> fn) {
+ public void applyIfContextIsInProfile(
+ DexType context, Consumer<ProfileAdditionsBuilder> builderConsumer) {
if (profile.containsClassRule(context) || classRuleAdditions.containsKey(context)) {
- fn.accept(self());
+ builderConsumer.accept(
+ new ProfileAdditionsBuilder() {
+ @Override
+ public ProfileAdditionsBuilder addClassRule(DexType type) {
+ ProfileAdditions.this.addClassRule(type);
+ return this;
+ }
+
+ @Override
+ public ProfileAdditionsBuilder addMethodRule(DexMethod method) {
+ ProfileAdditions.this.addMethodRule(
+ method, AbstractProfileMethodRule.Builder::setIsStartup);
+ return this;
+ }
+
+ @Override
+ public void removeMovedMethodRule(DexMethod oldMethod, ProgramMethod newMethod) {
+ ProfileAdditions.this.removeMovedMethodRule(oldMethod, newMethod);
+ }
+ });
}
}
@@ -167,7 +187,7 @@
return addMethodRule(method.getReference(), methodRuleBuilderConsumer);
}
- public Additions addMethodRule(
+ private Additions addMethodRule(
DexMethod method, Consumer<? super MethodRuleBuilder> methodRuleBuilderConsumer) {
// Create profile rule for method.
MethodRuleBuilder methodRuleBuilder =
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
index c5bbcf7..33e4b0f 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingApiReferenceStubberEventConsumer.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
-
import com.android.tools.r8.androidapi.ApiReferenceStubberEventConsumer;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexLibraryClass;
@@ -47,10 +45,10 @@
DexProgramClass mockClass, DexLibraryClass libraryClass, DexProgramClass context) {
collectionAdditions.applyIfContextIsInProfile(
context,
- additions ->
- additions
- .addClassRule(mockClass)
- .addMethodRule(mockClass.getProgramClassInitializer(), emptyConsumer()));
+ additionsBuilder ->
+ additionsBuilder
+ .addClassRule(mockClass.getType())
+ .addMethodRule(mockClass.getProgramClassInitializer().getReference()));
parent.acceptMockedLibraryClassContext(mockClass, libraryClass, context);
}
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
index c16dd21..b0e127a 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfClassSynthesizerDesugaringEventConsumer.java
@@ -84,7 +84,7 @@
public void acceptRecordClassContext(
DexProgramClass recordTagClass, DexProgramClass recordClass) {
additionsCollection.applyIfContextIsInProfile(
- recordClass, additions -> additions.addClassRule(recordTagClass));
+ recordClass, additionsBuilder -> additionsBuilder.addClassRule(recordTagClass.getType()));
ProgramMethod recordTagInstanceInitializer = recordTagClass.getProgramDefaultInitializer();
if (recordTagInstanceInitializer != null) {
recordClass.forEachProgramInstanceInitializer(
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
index 0d5c835..81115bb 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfPostProcessingDesugaringEventConsumer.java
@@ -18,6 +18,7 @@
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
import com.android.tools.r8.ir.desugar.itf.InterfaceDesugaringSyntheticHelper;
+import com.android.tools.r8.profile.AbstractProfileMethodRule;
import com.android.tools.r8.profile.art.ArtProfileOptions;
import com.android.tools.r8.utils.BooleanBox;
import java.util.Set;
@@ -80,7 +81,9 @@
public void acceptDesugaredLibraryRetargeterForwardingMethod(
ProgramMethod method, EmulatedDispatchMethodDescriptor descriptor) {
if (options.isIncludingDesugaredLibraryRetargeterForwardingMethodsUnconditionally()) {
- additionsCollection.accept(additions -> additions.addMethodRule(method, emptyConsumer()));
+ additionsCollection.accept(
+ additions ->
+ additions.addMethodRule(method, AbstractProfileMethodRule.Builder::setIsStartup));
}
parent.acceptDesugaredLibraryRetargeterForwardingMethod(method, descriptor);
}
@@ -109,7 +112,7 @@
@Override
public void acceptInterfaceMethodDesugaringForwardingMethod(
ProgramMethod method, DexClassAndMethod baseMethod) {
- additionsCollection.addMethodIfContextIsInProfile(method, baseMethod, emptyConsumer());
+ additionsCollection.addMethodIfContextIsInProfile(method, baseMethod);
parent.acceptInterfaceMethodDesugaringForwardingMethod(method, baseMethod);
}
@@ -128,7 +131,8 @@
});
if (seenMethodCausingError.isFalse()) {
additionsCollection.applyIfContextIsInProfile(
- method.getHolder(), additions -> additions.addMethodRule(method, emptyConsumer()));
+ method.getHolder(),
+ additionsBuilder -> additionsBuilder.addMethodRule(method.getReference()));
}
}
parent.acceptThrowingMethod(method, errorType, resolutionResult);
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
index c7aa6b9..59ca2dc 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingMemberRebindingEventConsumer.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
-
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.ProgramMethod;
@@ -37,7 +35,7 @@
@Override
public void acceptMemberRebindingBridgeMethod(
ProgramMethod bridgeMethod, DexClassAndMethod targetMethod) {
- additionsCollection.addMethodIfContextIsInProfile(bridgeMethod, targetMethod, emptyConsumer());
+ additionsCollection.addMethodIfContextIsInProfile(bridgeMethod, targetMethod);
parent.acceptMemberRebindingBridgeMethod(bridgeMethod, targetMethod);
}
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
index 65cce7f..7d731fb 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -4,13 +4,12 @@
package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
-
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramField;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaringEventConsumer;
+import com.android.tools.r8.profile.AbstractProfileMethodRule;
public class ProfileRewritingNestBasedAccessDesugaringEventConsumer
implements NestBasedAccessDesugaringEventConsumer {
@@ -48,7 +47,9 @@
} else {
additionsCollection.accept(
additions ->
- additions.addClassRule(argumentClass).addMethodRule(bridge, emptyConsumer()));
+ additions
+ .addClassRule(argumentClass)
+ .addMethodRule(bridge, AbstractProfileMethodRule.Builder::setIsStartup));
}
parent.acceptNestConstructorBridge(target, bridge, argumentClass, context);
}
@@ -56,21 +57,21 @@
@Override
public void acceptNestFieldGetBridge(
ProgramField target, ProgramMethod bridge, DexClassAndMethod context) {
- additionsCollection.addMethodIfContextIsInProfile(bridge, context, emptyConsumer());
+ additionsCollection.addMethodIfContextIsInProfile(bridge, context);
parent.acceptNestFieldGetBridge(target, bridge, context);
}
@Override
public void acceptNestFieldPutBridge(
ProgramField target, ProgramMethod bridge, DexClassAndMethod context) {
- additionsCollection.addMethodIfContextIsInProfile(bridge, context, emptyConsumer());
+ additionsCollection.addMethodIfContextIsInProfile(bridge, context);
parent.acceptNestFieldPutBridge(target, bridge, context);
}
@Override
public void acceptNestMethodBridge(
ProgramMethod target, ProgramMethod bridge, DexClassAndMethod context) {
- additionsCollection.addMethodIfContextIsInProfile(bridge, context, emptyConsumer());
+ additionsCollection.addMethodIfContextIsInProfile(bridge, context);
parent.acceptNestMethodBridge(target, bridge, context);
}
}
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
index c9ff809..05f0187 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingVarHandleDesugaringEventConsumerUtils.java
@@ -4,8 +4,6 @@
package com.android.tools.r8.profile.rewriting;
-import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
-
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.profile.art.ArtProfileOptions;
@@ -20,11 +18,6 @@
if (options.isIncludingVarHandleClasses()) {
additionsCollection.applyIfContextIsInProfile(
context,
- additions -> {
- additions.addClassRule(varHandleClass);
- varHandleClass.forEachProgramMethod(
- method -> additions.addMethodRule(method, emptyConsumer()));
- },
additionsBuilder -> {
additionsBuilder.addRule(varHandleClass);
varHandleClass.forEachProgramMethod(additionsBuilder::addRule);
diff --git a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
index e16699f..9c2afae 100644
--- a/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
+++ b/src/main/java/com/android/tools/r8/profile/startup/profile/StartupProfileMethodRule.java
@@ -105,6 +105,12 @@
}
@Override
+ public Builder setIsStartup() {
+ // Intentionally empty, startup profile rules do not have any flags.
+ return this;
+ }
+
+ @Override
public Builder setMethod(DexMethod method) {
this.method = method;
return this;
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
index 1d08f27..e8981e6 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
@@ -71,11 +71,20 @@
return ExternalArtProfile.builder()
.addRules(
ExternalArtProfileClassRule.builder().setClassReference(mainClassReference).build(),
- ExternalArtProfileMethodRule.builder().setMethodReference(mainMethodReference).build(),
+ ExternalArtProfileMethodRule.builder()
+ .setMethodReference(mainMethodReference)
+ .setMethodRuleInfo(ArtProfileMethodRuleInfoImpl.builder().setIsStartup().build())
+ .build(),
ExternalArtProfileClassRule.builder().setClassReference(fooClassReference).build(),
- ExternalArtProfileMethodRule.builder().setMethodReference(helloMethodReference).build(),
+ ExternalArtProfileMethodRule.builder()
+ .setMethodReference(helloMethodReference)
+ .setMethodRuleInfo(ArtProfileMethodRuleInfoImpl.builder().setIsStartup().build())
+ .build(),
ExternalArtProfileClassRule.builder().setClassReference(barClassReference).build(),
- ExternalArtProfileMethodRule.builder().setMethodReference(worldMethodReference).build())
+ ExternalArtProfileMethodRule.builder()
+ .setMethodReference(worldMethodReference)
+ .setMethodRuleInfo(ArtProfileMethodRuleInfoImpl.builder().setIsStartup().build())
+ .build())
.build();
}
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfilePassthroughTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfilePassthroughTest.java
index 1a33d54..e08fd7e 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfilePassthroughTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfilePassthroughTest.java
@@ -78,7 +78,11 @@
profileBuilder
.addClassRule(classRuleBuilder -> classRuleBuilder.setClassReference(mainClassReference))
.addMethodRule(
- methodRuleBuilder -> methodRuleBuilder.setMethodReference(mainMethodReference));
+ methodRuleBuilder ->
+ methodRuleBuilder
+ .setMethodReference(mainMethodReference)
+ .setMethodRuleInfo(
+ methodRuleInfoBuilder -> methodRuleInfoBuilder.setIsStartup(true)));
providerStatus = ProviderStatus.DONE;
}
diff --git a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
index 3cd8e10..b812f2d 100644
--- a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
@@ -82,6 +82,7 @@
.addRule(
ExternalArtProfileMethodRule.builder()
.setMethodReference(forEachMethodReference)
+ .setMethodRuleInfo(ArtProfileMethodRuleInfoImpl.builder().setIsStartup().build())
.build())
.build();
}
diff --git a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
index 9951db3..76cb37b 100644
--- a/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
+++ b/src/test/java/com/android/tools/r8/profile/art/model/ExternalArtProfile.java
@@ -134,7 +134,13 @@
}
public Builder addMethodRule(MethodReference methodReference) {
- return addMethodRule(methodReference, ArtProfileMethodRuleInfoImpl.empty());
+ return addMethodRule(
+ methodReference,
+ ArtProfileMethodRuleInfoImpl.builder()
+ .setIsHot()
+ .setIsStartup()
+ .setIsPostStartup()
+ .build());
}
public Builder addMethodRule(