blob: 0cb809efb6abed7f64299af5979dd97b021ea6b6 [file] [log] [blame]
// Copyright (c) 2022, 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;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.PrunedItems;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.List;
import java.util.function.Function;
public class NonEmptyArtProfileCollection extends ArtProfileCollection
implements Iterable<ArtProfile> {
private final List<ArtProfile> artProfiles;
public NonEmptyArtProfileCollection(List<ArtProfile> artProfiles) {
this.artProfiles = artProfiles;
}
@Override
public boolean isEmpty() {
return false;
}
@Override
public boolean isNonEmpty() {
return true;
}
@Override
public NonEmptyArtProfileCollection asNonEmpty() {
return this;
}
public ArtProfile getLast() {
return ListUtils.last(artProfiles);
}
@Override
public Iterator<ArtProfile> iterator() {
return artProfiles.iterator();
}
@Override
public NonEmptyArtProfileCollection rewrittenWithLens(AppView<?> appView, GraphLens lens) {
return map(artProfile -> artProfile.rewrittenWithLens(appView, lens));
}
@Override
public NonEmptyArtProfileCollection rewrittenWithLens(
NamingLens lens, DexItemFactory dexItemFactory) {
assert !lens.isIdentityLens();
return map(artProfile -> artProfile.rewrittenWithLens(lens, dexItemFactory));
}
@Override
public void supplyConsumers(AppView<?> appView) {
if (appView.options().getArtProfileOptions().isCompletenessCheckForTestingEnabled()) {
assert ArtProfileCompletenessChecker.verify(appView);
ListUtils.removeLast(artProfiles);
if (artProfiles.isEmpty()) {
appView.setArtProfileCollection(ArtProfileCollection.empty());
return;
}
}
NonEmptyArtProfileCollection collection =
appView.getNamingLens().isIdentityLens()
? this
: rewrittenWithLens(appView.getNamingLens(), appView.dexItemFactory());
InternalOptions options = appView.options();
Collection<ArtProfileForRewriting> inputs =
options.getArtProfileOptions().getArtProfilesForRewriting();
assert !inputs.isEmpty();
assert collection.artProfiles.size() == inputs.size();
Iterator<ArtProfileForRewriting> inputIterator = inputs.iterator();
for (ArtProfile artProfile : collection.artProfiles) {
ArtProfileForRewriting input = inputIterator.next();
artProfile.supplyConsumer(input.getResidualArtProfileConsumer(), options.reporter);
}
}
@Override
public ArtProfileCollection withoutMissingItems(AppView<?> appView) {
return map(artProfile -> artProfile.withoutMissingItems(appView));
}
@Override
public NonEmptyArtProfileCollection withoutPrunedItems(PrunedItems prunedItems) {
return map(artProfile -> artProfile.withoutPrunedItems(prunedItems));
}
private NonEmptyArtProfileCollection map(Function<ArtProfile, ArtProfile> fn) {
List<ArtProfile> newArtProfiles = new ArrayList<>(artProfiles.size());
for (ArtProfile artProfile : artProfiles) {
newArtProfiles.add(fn.apply(artProfile));
}
return new NonEmptyArtProfileCollection(newArtProfiles);
}
}