Emit a diagnostic telling the amount of non-startup code in startup dex
Bug: b/298617875
Change-Id: I2babb7ddeb5a884e064cc6de02e9d2a3415889f6
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 72c0e2a..e0b77cb 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.dex;
+import static com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic.Factory.createStartupClassesNonStartupFractionDiagnostic;
import static com.android.tools.r8.errors.StartupClassesOverflowDiagnostic.Factory.createStartupClassesOverflowDiagnostic;
import static com.android.tools.r8.graph.DexProgramClass.asProgramClassOrNull;
import static com.android.tools.r8.utils.ConsumerUtils.emptyConsumer;
@@ -1397,6 +1398,7 @@
private final DexItemFactory dexItemFactory;
private final InternalOptions options;
private final VirtualFileCycler cycler;
+ private final StartupProfile startupProfile;
PackageSplitPopulator(
List<VirtualFile> files,
@@ -1412,6 +1414,7 @@
this.dexItemFactory = appView.dexItemFactory();
this.options = appView.options();
this.cycler = new VirtualFileCycler(files, filesForDistribution, appView, nextFileId);
+ this.startupProfile = startupProfile;
}
static boolean coveredByPrefix(String originalName, String currentPrefix) {
@@ -1474,6 +1477,10 @@
createStartupClassesOverflowDiagnostic(cycler.filesForDistribution.size()));
}
+ options.reporter.info(
+ createStartupClassesNonStartupFractionDiagnostic(
+ classPartioning.getStartupClasses(), startupProfile));
+
if (options.getStartupOptions().isMinimalStartupDexEnabled()) {
cycler.clearFilesForDistribution();
} else {
diff --git a/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java b/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java
new file mode 100644
index 0000000..e024130
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/errors/StartupClassesNonStartupFractionDiagnostic.java
@@ -0,0 +1,131 @@
+// 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.errors;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+import com.android.tools.r8.profile.startup.profile.StartupProfile;
+import it.unimi.dsi.fastutil.ints.Int2IntMap;
+import it.unimi.dsi.fastutil.ints.Int2IntOpenHashMap;
+import java.util.List;
+
+@Keep
+public class StartupClassesNonStartupFractionDiagnostic implements Diagnostic {
+
+ private final int numberOfStartupClasses;
+ private final int numberOfStartupMethods;
+ private final int numberOfNonStartupMethods;
+
+ private final Int2IntMap numberOfStartupClassesByNumberOfStartupMethods;
+
+ StartupClassesNonStartupFractionDiagnostic(
+ int numberOfStartupClasses,
+ int numberOfStartupMethods,
+ int numberOfNonStartupMethods,
+ Int2IntMap numberOfStartupClassesByNumberOfStartupMethods) {
+ this.numberOfStartupClasses = numberOfStartupClasses;
+ this.numberOfStartupMethods = numberOfStartupMethods;
+ this.numberOfNonStartupMethods = numberOfNonStartupMethods;
+ this.numberOfStartupClassesByNumberOfStartupMethods =
+ numberOfStartupClassesByNumberOfStartupMethods;
+ }
+
+ @Override
+ public Origin getOrigin() {
+ return Origin.unknown();
+ }
+
+ @Override
+ public Position getPosition() {
+ return Position.UNKNOWN;
+ }
+
+ @Override
+ public String getDiagnosticMessage() {
+ return String.format(
+ "Startup DEX files contains %d classes and %d methods of which %d (%d%%) are non-startup "
+ + "methods. Distribution of classes by their number of startup methods:\n"
+ + "0: %d classes\n"
+ + "1: %d classes\n"
+ + "2-3: %d classes\n"
+ + "4-5: %d classes\n"
+ + "6-10: %d classes\n"
+ + "11+: %d classes\n",
+ numberOfStartupClasses,
+ numberOfStartupMethods + numberOfNonStartupMethods,
+ numberOfNonStartupMethods,
+ Math.round(
+ (((double) numberOfNonStartupMethods)
+ / (numberOfStartupMethods + numberOfNonStartupMethods))
+ * 100.0),
+ numberOfStartupClassesByNumberOfStartupMethods.get(0),
+ numberOfStartupClassesByNumberOfStartupMethods.get(1),
+ numberOfStartupClassesByNumberOfStartupMethods.get(2)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(3),
+ numberOfStartupClassesByNumberOfStartupMethods.get(4)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(5),
+ numberOfStartupClassesByNumberOfStartupMethods.get(6)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(7)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(8)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(9)
+ + numberOfStartupClassesByNumberOfStartupMethods.get(10),
+ numberOfStartupClassesByNumberOfStartupMethods.int2IntEntrySet().stream()
+ .map(entry -> entry.getIntKey() > 10 ? entry.getIntValue() : 0)
+ .reduce(0, Integer::sum));
+ }
+
+ // Public factory to keep the constructor of the diagnostic out of the public API.
+ public static class Factory {
+
+ public static StartupClassesNonStartupFractionDiagnostic
+ createStartupClassesNonStartupFractionDiagnostic(
+ List<DexProgramClass> startupClasses, StartupProfile startupProfile) {
+ assert !startupClasses.isEmpty();
+ assert !startupProfile.isEmpty();
+ int numberOfStartupClasses = startupClasses.size();
+ int numberOfStartupMethods = 0;
+ int numberOfNonStartupMethods = 0;
+ Int2IntMap numberOfStartupClassesByNumberOfStartupMethods = new Int2IntOpenHashMap();
+ numberOfStartupClassesByNumberOfStartupMethods.defaultReturnValue(0);
+ for (DexProgramClass clazz : startupClasses) {
+ assert startupProfile.isStartupClass(clazz.getType());
+ int numberOfStartupMethodsInClass = 0;
+ for (DexEncodedMethod method : clazz.methods()) {
+ if (startupProfile.containsMethodRule(method.getReference())) {
+ numberOfStartupMethodsInClass++;
+ } else {
+ numberOfNonStartupMethods++;
+ }
+ }
+ numberOfStartupMethods += numberOfStartupMethodsInClass;
+ numberOfStartupClassesByNumberOfStartupMethods.put(
+ numberOfStartupMethodsInClass,
+ numberOfStartupClassesByNumberOfStartupMethods.get(numberOfStartupMethodsInClass) + 1);
+ }
+ return createStartupClassesNonStartupFractionDiagnostic(
+ numberOfStartupClasses,
+ numberOfStartupMethods,
+ numberOfNonStartupMethods,
+ numberOfStartupClassesByNumberOfStartupMethods);
+ }
+
+ public static StartupClassesNonStartupFractionDiagnostic
+ createStartupClassesNonStartupFractionDiagnostic(
+ int numberOfStartupClasses,
+ int numberOfStartupMethods,
+ int numberOfNonStartupMethods,
+ Int2IntMap numberOfStartupClassesByNumberOfStartupMethods) {
+ return new StartupClassesNonStartupFractionDiagnostic(
+ numberOfStartupClasses,
+ numberOfStartupMethods,
+ numberOfNonStartupMethods,
+ numberOfStartupClassesByNumberOfStartupMethods);
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
index a2d7c56..ed922db 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
@@ -4,9 +4,12 @@
package com.android.tools.r8.classmerging.horizontal;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
+
import com.android.tools.r8.NeverInline;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
@@ -82,9 +85,14 @@
return Origin.unknown();
}
})
+ .allowDiagnosticInfoMessages()
.enableInliningAnnotations()
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("StartupA", "StartupB");
}
diff --git a/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java b/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
index 668c2a3..e477b40 100644
--- a/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
+++ b/src/test/java/com/android/tools/r8/startup/DuplicateDescriptorsInStartupProfileTest.java
@@ -4,12 +4,14 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.Reference;
@@ -44,6 +46,7 @@
testForR8(Backend.DEX)
.addInnerClasses(getClass())
.addKeepAllClassesRule()
+ .allowDiagnosticMessages()
.apply(
testBuilder ->
StartupTestingUtils.addStartupProfile(
@@ -74,6 +77,10 @@
.build())))
.setMinApi(AndroidApiLevel.L)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.inspectMultiDex(
primaryInspector -> assertThat(primaryInspector.clazz(Main.class), isPresent()),
secondaryInspector ->
diff --git a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
index b3951cc..2afd17f 100644
--- a/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
+++ b/src/test/java/com/android/tools/r8/startup/ForceInlineAfterVerticalClassMergingStartupTest.java
@@ -4,10 +4,12 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.startup.profile.ExternalStartupClass;
import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -55,9 +57,14 @@
.addKeepMainRule(Main.class)
.addVerticallyMergedClassesInspector(
inspector -> inspector.assertMergedIntoSubtype(A.class))
+ .allowDiagnosticInfoMessages()
.apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupProfile))
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("B");
}
diff --git a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
index ba065b7..ca5a25d 100644
--- a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
+++ b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -11,6 +12,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.startup.profile.ExternalStartupClass;
import com.android.tools.r8.startup.profile.ExternalStartupItem;
@@ -50,6 +52,7 @@
testForR8(parameters.getBackend())
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
+ .allowDiagnosticInfoMessages()
.apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupItems))
.setMinApi(parameters)
.compile()
@@ -68,6 +71,10 @@
postStartupClassSubject.uniqueMethodWithOriginalName("runPostStartup"),
isPresent());
})
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines("Hello, world!");
}
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
index 20e850f..cbe1eb7 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexFromStartupMethodRuleTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -11,6 +12,7 @@
import com.android.tools.r8.TestCompilerBuilder;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.startup.profile.ExternalStartupMethod;
import com.android.tools.r8.startup.utils.StartupTestingUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -44,7 +46,8 @@
@Test
public void testR8() throws Exception {
- runTest(testForR8(parameters.getBackend()).addKeepAllClassesRule());
+ runTest(
+ testForR8(parameters.getBackend()).addKeepAllClassesRule().allowDiagnosticInfoMessages());
}
@SuppressWarnings("unchecked")
@@ -54,6 +57,10 @@
.apply(this::configureStartupConfiguration)
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.inspectMultiDex(
primaryDexInspector -> {
ClassSubject mainClassSubject = primaryDexInspector.clazz(Main.class);
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
index 91f9d7d..c0df783 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static junit.framework.TestCase.assertTrue;
import static org.hamcrest.MatcherAssert.assertThat;
@@ -12,6 +13,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.startup.profile.ExternalStartupItem;
import com.android.tools.r8.startup.utils.StartupTestingUtils;
import com.android.tools.r8.utils.AndroidApiLevel;
@@ -66,10 +68,15 @@
.getStartupOptions()
.setEnableMinimalStartupDex(true)
.setEnableStartupCompletenessCheckForTesting())
+ .allowDiagnosticInfoMessages()
.enableInliningAnnotations()
.apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupList))
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.inspectMultiDex(
primaryDexInspector -> {
// Main should be in the primary dex.
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
index 697aa2d..3c11f22 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
@@ -17,6 +18,7 @@
import com.android.tools.r8.TestCompileResult;
import com.android.tools.r8.TestCompilerBuilder;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.ir.desugar.LambdaClass;
import com.android.tools.r8.references.ClassReference;
@@ -52,11 +54,6 @@
@RunWith(Parameterized.class)
public class StartupSyntheticPlacementTest extends TestBase {
- private enum Compiler {
- D8,
- R8
- }
-
@Parameter(0)
public TestParameters parameters;
@@ -160,12 +157,17 @@
.addInnerClasses(getClass())
.addKeepMainRule(Main.class)
.addKeepClassAndMembersRules(A.class, B.class, C.class)
+ .allowDiagnosticMessages()
.apply(
testBuilder ->
configureStartupOptions(
testBuilder, instrumentationCompileResult.inspector(), startupList))
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
.apply(this::checkCompleteness)
.run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
index 6b21589..f3fe2e0 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
@@ -14,6 +15,7 @@
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.references.ClassReference;
import com.android.tools.r8.references.Reference;
@@ -92,9 +94,14 @@
.getTestingOptions()
.setMixedSectionLayoutStrategyInspector(getMixedSectionLayoutInspector());
})
+ .allowDiagnosticInfoMessages()
.apply(testBuilder -> StartupTestingUtils.addStartupProfile(testBuilder, startupList))
.setMinApi(parameters)
.compile()
+ .inspectDiagnosticMessages(
+ diagnostics ->
+ diagnostics.assertInfosMatch(
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class)))
.inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
.run(parameters.getRuntime(), Main.class)
.assertSuccessWithOutputLines(getExpectedOutput());
diff --git a/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java b/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
index edec3b4..4726e0b 100644
--- a/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
+++ b/src/test/java/com/android/tools/r8/startup/dump/DumpStartupProfileProvidersTest.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.startup.dump;
import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@@ -12,6 +13,7 @@
import com.android.tools.r8.CompilationFailedException;
import com.android.tools.r8.TestBase;
import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.errors.StartupClassesNonStartupFractionDiagnostic;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.startup.StartupProfileBuilder;
@@ -90,7 +92,8 @@
diagnosticMessage(containsString("Dumped compilation inputs to:")));
} else {
diagnostics.assertInfosMatch(
- diagnosticMessage(containsString("Dumped compilation inputs to:")));
+ diagnosticMessage(containsString("Dumped compilation inputs to:")),
+ diagnosticType(StartupClassesNonStartupFractionDiagnostic.class));
}
});
assertFalse("Expected compilation to fail", dumpInputFlags.shouldFailCompilation());