blob: 7443e490c59997adbefae0a440bfb682764e9e1c [file] [log] [blame]
// Copyright (c) 2023, 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.utils;
import com.android.tools.r8.DiagnosticsHandler;
import com.android.tools.r8.R8TestBuilder;
import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestBuilder;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.profile.art.ArtProfileBuilder;
import com.android.tools.r8.profile.art.ArtProfileClassRuleInfo;
import com.android.tools.r8.profile.art.ArtProfileConsumer;
import com.android.tools.r8.profile.art.ArtProfileMethodRuleInfo;
import com.android.tools.r8.profile.art.ArtProfileProvider;
import com.android.tools.r8.profile.art.ArtProfileRuleConsumer;
import com.android.tools.r8.profile.art.model.ExternalArtProfile;
import com.android.tools.r8.profile.art.model.ExternalArtProfileClassRule;
import com.android.tools.r8.profile.art.model.ExternalArtProfileMethodRule;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import java.util.function.Consumer;
public class ArtProfileTestingUtils {
/**
* Adds the given {@param artProfile} as an ART profile for rewriting. The residual ART profile
* will be forwarded to the given test inspector, {@param residualArtProfileInspector}.
*/
public static void addArtProfileForRewriting(
ExternalArtProfile artProfile,
Consumer<ExternalArtProfile> residualArtProfileInspector,
R8TestBuilder<?> testBuilder) {
testBuilder.addArtProfileForRewriting(
createArtProfileProvider(artProfile),
createResidualArtProfileConsumer(residualArtProfileInspector));
}
public static void addArtProfileForRewriting(
ExternalArtProfile artProfile,
Consumer<ExternalArtProfile> residualArtProfileInspector,
DesugaredLibraryTestBuilder<?> testBuilder) {
testBuilder.addL8ArtProfileForRewriting(
createArtProfileProvider(artProfile),
createResidualArtProfileConsumer(residualArtProfileInspector));
}
// Creates an ArtProfileProvider for passing the given ART profile to a D8/L8/R8 compilation.
private static ArtProfileProvider createArtProfileProvider(ExternalArtProfile artProfile) {
return new ArtProfileProvider() {
@Override
public void getArtProfile(ArtProfileBuilder profileBuilder) {
artProfile.forEach(
classRule ->
profileBuilder.addClassRule(
classRuleBuilder ->
classRuleBuilder.setClassReference(classRule.getClassReference())),
methodRule ->
profileBuilder.addMethodRule(
methodRuleBuilder ->
methodRuleBuilder
.setMethodReference(methodRule.getMethodReference())
.setMethodRuleInfo(
methodRuleInfoBuilder ->
methodRuleInfoBuilder
.setIsHot(methodRule.getMethodRuleInfo().isHot())
.setIsStartup(methodRule.getMethodRuleInfo().isStartup())
.setIsPostStartup(
methodRule.getMethodRuleInfo().isPostStartup()))));
}
@Override
public Origin getOrigin() {
return Origin.unknown();
}
};
}
// Creates an ArtProfileConsumer for accepting the residual ART profile from the compilation.
private static ArtProfileConsumer createResidualArtProfileConsumer(
Consumer<ExternalArtProfile> residualArtProfileInspector) {
return new ArtProfileConsumer() {
final ExternalArtProfile.Builder residualArtProfileBuilder = ExternalArtProfile.builder();
@Override
public ArtProfileRuleConsumer getRuleConsumer() {
return new ArtProfileRuleConsumer() {
@Override
public void acceptClassRule(
ClassReference classReference, ArtProfileClassRuleInfo classRuleInfo) {
residualArtProfileBuilder.addRule(
ExternalArtProfileClassRule.builder().setClassReference(classReference).build());
}
@Override
public void acceptMethodRule(
MethodReference methodReference, ArtProfileMethodRuleInfo methodRuleInfo) {
residualArtProfileBuilder.addRule(
ExternalArtProfileMethodRule.builder()
.setMethodReference(methodReference)
.setMethodRuleInfo(methodRuleInfo)
.build());
}
};
}
@Override
public void finished(DiagnosticsHandler handler) {
residualArtProfileInspector.accept(residualArtProfileBuilder.build());
}
};
}
}