blob: 32a85015509ce4c5bd8ef938d9aa9e2aae0a07d6 [file] [log] [blame]
// Copyright (c) 2020, 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.shaking;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
import com.android.tools.r8.graph.FieldAccessInfoImpl;
import com.google.common.collect.Sets;
import java.util.Set;
/** Used to mutate AppInfoWithLiveness between waves. */
public class AppInfoWithLivenessModifier {
private final Set<DexProgramClass> noLongerInstantiatedClasses = Sets.newConcurrentHashSet();
private final Set<DexField> noLongerWrittenFields = Sets.newConcurrentHashSet();
AppInfoWithLivenessModifier() {}
public boolean isEmpty() {
return noLongerInstantiatedClasses.isEmpty();
}
public void removeInstantiatedType(DexProgramClass clazz) {
noLongerInstantiatedClasses.add(clazz);
}
public void removeWrittenField(DexField field) {
noLongerWrittenFields.add(field);
}
public void modify(AppInfoWithLiveness appInfo) {
// Instantiated classes.
noLongerInstantiatedClasses.forEach(appInfo::removeFromSingleTargetLookupCache);
appInfo.mutateObjectAllocationInfoCollection(
mutator -> noLongerInstantiatedClasses.forEach(mutator::markNoLongerInstantiated));
// Written fields.
FieldAccessInfoCollectionImpl fieldAccessInfoCollection =
appInfo.getMutableFieldAccessInfoCollection();
noLongerWrittenFields.forEach(
field -> {
FieldAccessInfoImpl fieldAccessInfo = fieldAccessInfoCollection.get(field);
if (fieldAccessInfo != null) {
fieldAccessInfo.clearWrites();
}
});
clear();
}
private void clear() {
noLongerInstantiatedClasses.clear();
}
}