blob: dc6763bc91209b0487e9db2d652a9848c4d93f35 [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.verticalclassmerging;
import com.android.tools.r8.classmerging.ClassMergerSharedData;
import com.android.tools.r8.classmerging.ClassMergerTreeFixer;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.Timing;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
class VerticalClassMergerTreeFixer
extends ClassMergerTreeFixer<
VerticalClassMergerGraphLens.Builder,
VerticalClassMergerGraphLens,
VerticallyMergedClasses> {
private final List<IncompleteVerticalClassMergerBridgeCode> synthesizedBridges;
VerticalClassMergerTreeFixer(
AppView<AppInfoWithLiveness> appView,
ClassMergerSharedData classMergerSharedData,
VerticalClassMergerResult verticalClassMergerResult) {
super(
appView,
classMergerSharedData,
VerticalClassMergerGraphLens.Builder.createBuilderForFixup(verticalClassMergerResult),
verticalClassMergerResult.getVerticallyMergedClasses());
this.synthesizedBridges = verticalClassMergerResult.getSynthesizedBridges();
}
@Override
public VerticalClassMergerGraphLens run(ExecutorService executorService, Timing timing)
throws ExecutionException {
VerticalClassMergerGraphLens lens = super.run(executorService, timing);
for (IncompleteVerticalClassMergerBridgeCode synthesizedBridge : synthesizedBridges) {
synthesizedBridge.updateMethodSignatures(lens);
}
return lens;
}
@Override
public void preprocess() {
appView
.getKeepInfo()
.forEachPinnedMethod(
method -> {
if (!method.isInstanceInitializer(dexItemFactory)) {
keptSignatures.add(method);
}
},
appView.options());
}
@Override
public void postprocess() {
lensBuilder.fixupContextualVirtualToDirectMethodMaps();
}
@Override
public boolean isRunningBeforePrimaryOptimizationPass() {
return true;
}
}