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(