blob: 256f80ae4032bff30fb425eda429fe52f3876465 [file] [log] [blame]
// Copyright (c) 2019, 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.ir.optimize.info;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.ir.conversion.FieldOptimizationFeedback;
import com.android.tools.r8.ir.conversion.MethodOptimizationFeedback;
import com.android.tools.r8.shaking.AppInfoWithLivenessModifier;
import com.android.tools.r8.utils.ThreadUtils;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.function.Consumer;
public abstract class OptimizationFeedback
implements FieldOptimizationFeedback, MethodOptimizationFeedback {
public interface OptimizationInfoFixer {
void fixup(DexEncodedField field, MutableFieldOptimizationInfo optimizationInfo);
void fixup(DexEncodedMethod method, UpdatableMethodOptimizationInfo optimizationInfo);
}
public void fixupOptimizationInfos(
AppView<?> appView, ExecutorService executorService, OptimizationInfoFixer fixer)
throws ExecutionException {
ThreadUtils.processItems(
appView.appInfo().classes(),
clazz -> {
for (DexEncodedField field : clazz.fields()) {
FieldOptimizationInfo optimizationInfo = field.getOptimizationInfo();
if (optimizationInfo.isMutableFieldOptimizationInfo()) {
fixer.fixup(field, optimizationInfo.asMutableFieldOptimizationInfo());
} else {
assert optimizationInfo.isDefaultFieldOptimizationInfo();
}
}
for (DexEncodedMethod method : clazz.methods()) {
MethodOptimizationInfo optimizationInfo = method.getOptimizationInfo();
if (optimizationInfo.isUpdatableMethodOptimizationInfo()) {
fixer.fixup(method, optimizationInfo.asUpdatableMethodOptimizationInfo());
} else {
assert optimizationInfo.isDefaultMethodOptimizationInfo();
}
}
},
executorService);
}
public void modifyAppInfoWithLiveness(Consumer<AppInfoWithLivenessModifier> consumer) {
// Intentionally empty.
}
}