Support for setting partial compilation seed on test builder
Change-Id: I5d77c88f1cf191843a88016426a7c1ac9c8bc331
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java b/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
index 22b2096..e24bc9b 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialCompilationConfiguration.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.partial;
import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DirectMappedDexApplication;
import com.android.tools.r8.partial.predicate.AllClassesMatcher;
import com.android.tools.r8.partial.predicate.ClassNameMatcher;
import com.android.tools.r8.partial.predicate.ClassPrefixMatcher;
@@ -55,7 +56,22 @@
return excludePredicates;
}
- public boolean test(DexProgramClass clazz) {
+ public void partition(
+ DirectMappedDexApplication app,
+ Consumer<DexProgramClass> d8ClassConsumer,
+ Consumer<DexProgramClass> r8ClassConsumer) {
+ Collection<DexProgramClass> classes =
+ randomizeForTesting != null ? app.classesWithDeterministicOrder() : app.classes();
+ for (DexProgramClass clazz : classes) {
+ if (test(clazz)) {
+ r8ClassConsumer.accept(clazz);
+ } else {
+ d8ClassConsumer.accept(clazz);
+ }
+ }
+ }
+
+ private boolean test(DexProgramClass clazz) {
if (randomizeForTesting != null) {
return randomizeForTesting.nextBoolean();
}
@@ -119,8 +135,11 @@
}
public Builder randomizeForTesting() {
+ return randomizeForTesting(System.currentTimeMillis());
+ }
+
+ public Builder randomizeForTesting(long seed) {
randomizeForTesting = new Random();
- long seed = System.currentTimeMillis();
randomizeForTesting.setSeed(seed);
System.out.println("Partial compilation seed: " + seed);
return this;
diff --git a/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java b/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
index 9f6f2dd..7b8af2b 100644
--- a/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
+++ b/src/main/java/com/android/tools/r8/partial/R8PartialProgramPartioning.java
@@ -19,16 +19,11 @@
private R8PartialProgramPartioning() {}
public static R8PartialProgramPartioning create(DirectMappedDexApplication app) {
- R8PartialProgramPartioning partioning = new R8PartialProgramPartioning();
R8PartialCompilationConfiguration partialCompilationConfiguration =
app.options.partialCompilationConfiguration;
- for (DexProgramClass clazz : app.classes()) {
- if (partialCompilationConfiguration.test(clazz)) {
- partioning.r8Classes.add(clazz);
- } else {
- partioning.d8Classes.add(clazz);
- }
- }
+ R8PartialProgramPartioning partioning = new R8PartialProgramPartioning();
+ partialCompilationConfiguration.partition(
+ app, partioning.d8Classes::add, partioning.r8Classes::add);
// Collect all transitive superclasses of all D8 classes and treat these as D8 classes.
WorkList<DexClass> worklist = WorkList.newIdentityWorkList(partioning.d8Classes);
worklist.process(
diff --git a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
index 7687324..c16f328 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8PartialTestBuilder.java
@@ -222,4 +222,13 @@
o -> o.getTestingOptions().enableEmbeddedKeepAnnotations = true)
.addKeepAnnoLibToClasspath(keepAnnotationLibrary);
}
+
+ @Override
+ public R8PartialTestBuilder setPartialCompilationSeed(TestParameters parameters, long seed) {
+ if (parameters.getPartialCompilationTestParameters().isRandom()) {
+ r8PartialConfiguration =
+ R8PartialCompilationConfiguration.builder().randomizeForTesting(seed).build();
+ }
+ return this;
+ }
}
diff --git a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
index bdcbe32..49cccce 100644
--- a/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/testbase/java/com/android/tools/r8/R8TestBuilder.java
@@ -1111,4 +1111,9 @@
androidPlatformBuild = true;
return self();
}
+
+ public T setPartialCompilationSeed(TestParameters parameters, long seed) {
+ // Intentionally empty. Implemented In R8PartialTestBuilder.
+ return self();
+ }
}