blob: 0eef997fbc4f0f96a13753753516e7e306862b37 [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.experimental.startup;
import com.android.tools.r8.experimental.startup.profile.StartupItem;
import com.android.tools.r8.experimental.startup.profile.StartupProfile;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
import com.android.tools.r8.profile.art.ArtProfileBuilderUtils.SyntheticToSyntheticContextGeneralization;
import com.android.tools.r8.profile.art.ArtProfileClassRuleInfo;
import com.android.tools.r8.profile.art.ArtProfileMethodRuleInfo;
import com.android.tools.r8.profile.art.ArtProfileRulePredicate;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.startup.StartupProfileBuilder;
import com.android.tools.r8.startup.StartupProfileProvider;
import com.android.tools.r8.startup.diagnostic.MissingStartupProfileItemsDiagnostic;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.UTF8TextInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.file.Path;
public class StartupProfileProviderUtils {
public static StartupProfileProvider createFromHumanReadableArtProfile(Path path) {
return new StartupProfileProvider() {
@Override
public void getStartupProfile(StartupProfileBuilder startupProfileBuilder) {
try {
startupProfileBuilder.addHumanReadableArtProfile(
new UTF8TextInputStream(path),
profileParserBuilder ->
profileParserBuilder.setRulePredicate(
new ArtProfileRulePredicate() {
@Override
public boolean testClassRule(
ClassReference classReference, ArtProfileClassRuleInfo classRuleInfo) {
return false;
}
@Override
public boolean testMethodRule(
MethodReference methodReference,
ArtProfileMethodRuleInfo methodRuleInfo) {
return methodRuleInfo.isStartup();
}
}));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
@Override
public Origin getOrigin() {
return new PathOrigin(path);
}
};
}
/** Serialize the given {@param startupProfileProvider} to a string for writing it to a dump. */
public static String serializeToString(
InternalOptions options, StartupProfileProvider startupProfileProvider) {
// Do not report missing items.
MissingStartupProfileItemsDiagnostic.Builder missingItemsDiagnosticBuilder =
MissingStartupProfileItemsDiagnostic.Builder.nop();
// Do not generalize synthetic items to their synthetic context.
SyntheticToSyntheticContextGeneralization syntheticToSyntheticContextGeneralization =
SyntheticToSyntheticContextGeneralization.createForD8();
StartupProfile.Builder startupProfileBuilder =
StartupProfile.builder(
options,
missingItemsDiagnosticBuilder,
startupProfileProvider,
syntheticToSyntheticContextGeneralization);
// Do not report warnings for lines that cannot be parsed.
startupProfileBuilder.setIgnoreWarnings();
// Populate the startup profile builder.
startupProfileProvider.getStartupProfile(startupProfileBuilder);
// Serialize the startup items.
StringBuilder resultBuilder = new StringBuilder();
for (StartupItem startupItem : startupProfileBuilder.build().getStartupItems()) {
resultBuilder.append(startupItem.serializeToString()).append('\n');
}
return resultBuilder.toString();
}
}