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(