blob: 2d0f51c78c58a36a71b16033b13f255d1296f903 [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.rewriting;
import static com.android.tools.r8.profile.art.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.ProgramDefinition;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
import com.android.tools.r8.profile.art.ArtProfileOptions;
import java.util.Set;
public class ProfileRewritingCfClassSynthesizerDesugaringEventConsumer
extends CfClassSynthesizerDesugaringEventConsumer {
private final ConcreteProfileCollectionAdditions additionsCollection;
private final ArtProfileOptions options;
private final CfClassSynthesizerDesugaringEventConsumer parent;
private ProfileRewritingCfClassSynthesizerDesugaringEventConsumer(
ConcreteProfileCollectionAdditions additionsCollection,
ArtProfileOptions options,
CfClassSynthesizerDesugaringEventConsumer parent) {
this.additionsCollection = additionsCollection;
this.options = options;
this.parent = parent;
}
public static CfClassSynthesizerDesugaringEventConsumer attach(
AppView<?> appView, CfClassSynthesizerDesugaringEventConsumer eventConsumer) {
return attach(appView, eventConsumer, ProfileCollectionAdditions.create(appView));
}
public static CfClassSynthesizerDesugaringEventConsumer attach(
AppView<?> appView,
CfClassSynthesizerDesugaringEventConsumer eventConsumer,
ProfileCollectionAdditions profileCollectionAdditions) {
if (profileCollectionAdditions.isNop()) {
return eventConsumer;
}
return new ProfileRewritingCfClassSynthesizerDesugaringEventConsumer(
profileCollectionAdditions.asConcrete(),
appView.options().getArtProfileOptions(),
eventConsumer);
}
@Override
public void acceptCollectionConversion(ProgramMethod arrayConversion, ProgramMethod context) {
additionsCollection.addMethodAndHolderIfContextIsInProfile(arrayConversion, context);
parent.acceptCollectionConversion(arrayConversion, context);
}
@Override
public void acceptWrapperProgramClass(DexProgramClass clazz) {
parent.acceptWrapperProgramClass(clazz);
}
@Override
public void acceptEnumConversionProgramClass(DexProgramClass clazz) {
parent.acceptEnumConversionProgramClass(clazz);
}
@Override
public void acceptDesugaredLibraryRetargeterDispatchProgramClass(DexProgramClass clazz) {
parent.acceptDesugaredLibraryRetargeterDispatchProgramClass(clazz);
}
@Override
public void acceptProgramEmulatedInterface(DexProgramClass clazz) {
parent.acceptProgramEmulatedInterface(clazz);
}
@Override
public void acceptRecordClass(DexProgramClass recordClass) {
parent.acceptRecordClass(recordClass);
}
@Override
public void acceptRecordClassContext(
DexProgramClass recordTagClass, DexProgramClass recordClass) {
additionsCollection.applyIfContextIsInProfile(
recordClass, additions -> additions.addClassRule(recordTagClass));
ProgramMethod recordTagInstanceInitializer = recordTagClass.getProgramDefaultInitializer();
if (recordTagInstanceInitializer != null) {
recordClass.forEachProgramInstanceInitializer(
recordInstanceInitializer ->
additionsCollection.applyIfContextIsInProfile(
recordInstanceInitializer,
additionsBuilder -> additionsBuilder.addRule(recordTagInstanceInitializer)));
}
parent.acceptRecordClassContext(recordTagClass, recordClass);
}
@Override
public void acceptVarHandleDesugaringClass(DexProgramClass clazz) {
parent.acceptVarHandleDesugaringClass(clazz);
}
@Override
public void acceptVarHandleDesugaringClassContext(
DexProgramClass clazz, ProgramDefinition context) {
handleVarHandleDesugaringClassContext(clazz, context, additionsCollection, options);
parent.acceptVarHandleDesugaringClassContext(clazz, context);
}
@Override
public void finished(AppView<? extends AppInfoWithClassHierarchy> appView) {
additionsCollection.commit(appView);
parent.finished(appView);
}
@Override
public Set<DexProgramClass> getSynthesizedClasses() {
return parent.getSynthesizedClasses();
}
}