Run GenericSignatureRewriter in parallel.
It's been detached from minfier for a while, hence no barrier that we
should run it in sequence.
Change-Id: Ie105a159b3181fc737a9116a50b6851617ea598b
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index e351c92..75f862e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -727,7 +727,8 @@
// Rewrite signature annotations for applications that are not minified.
if (appView.appInfo().hasLiveness()) {
// TODO(b/124726014): Rewrite signature annotations in lens rewriting instead of here?
- new GenericSignatureRewriter(appView.withLiveness()).run(appView.appInfo().classes());
+ new GenericSignatureRewriter(appView.withLiveness())
+ .run(appView.appInfo().classes(), executorService);
}
namingLens = NamingLens.getIdentityLens();
}
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index 1c75720..96cd284 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -13,7 +13,6 @@
import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
@@ -32,10 +31,11 @@
import com.google.common.collect.Sets;
import java.util.Collections;
import java.util.HashMap;
-import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
import java.util.function.Predicate;
class ClassNameMinifier {
@@ -91,11 +91,14 @@
}
}
- ClassRenaming computeRenaming(Timing timing) {
- return computeRenaming(timing, Collections.emptyMap());
+ ClassRenaming computeRenaming(Timing timing, ExecutorService executorService)
+ throws ExecutionException {
+ return computeRenaming(timing, executorService, Collections.emptyMap());
}
- ClassRenaming computeRenaming(Timing timing, Map<DexType, DexString> syntheticClasses) {
+ ClassRenaming computeRenaming(
+ Timing timing, ExecutorService executorService, Map<DexType, DexString> syntheticClasses)
+ throws ExecutionException {
// Externally defined synthetic classes populate an initial renaming.
renaming.putAll(syntheticClasses);
@@ -139,13 +142,8 @@
timing.begin("rename-generic");
new GenericSignatureRewriter(appView, renaming)
.run(
- new Iterable<DexProgramClass>() {
- @Override
- public Iterator<DexProgramClass> iterator() {
- return IteratorUtils.<DexClass, DexProgramClass>filter(
- classes.iterator(), DexClass::isProgramClass);
- }
- });
+ () -> IteratorUtils.filter(classes.iterator(), DexClass::isProgramClass),
+ executorService);
timing.end();
timing.begin("rename-arrays");
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 359de49..f2d7c1a 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -57,7 +57,7 @@
new MinificationPackageNamingStrategy(appView),
// Use deterministic class order to make sure renaming is deterministic.
appView.appInfo().classesWithDeterministicOrder());
- ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing);
+ ClassRenaming classRenaming = classNameMinifier.computeRenaming(timing, executorService);
timing.end();
assert new MinifiedRenaming(
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 7b6d191..471d66f 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -137,7 +137,7 @@
new MinificationPackageNamingStrategy(appView),
mappedClasses);
ClassRenaming classRenaming =
- classNameMinifier.computeRenaming(timing, syntheticCompanionClasses);
+ classNameMinifier.computeRenaming(timing, executorService, syntheticCompanionClasses);
timing.end();
ApplyMappingMemberNamingStrategy nameStrategy =
diff --git a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
index e891f95..b4ddb8e 100644
--- a/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
+++ b/src/main/java/com/android/tools/r8/naming/signature/GenericSignatureRewriter.java
@@ -19,9 +19,12 @@
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.Reporter;
import com.android.tools.r8.utils.StringDiagnostic;
+import com.android.tools.r8.utils.ThreadUtils;
import com.google.common.collect.Maps;
import java.lang.reflect.GenericSignatureFormatError;
import java.util.Map;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
import java.util.function.Predicate;
@@ -44,39 +47,44 @@
this.reporter = appView.options().reporter;
}
- public void run(Iterable<? extends DexProgramClass> classes) {
- final GenericSignatureCollector genericSignatureCollector = new GenericSignatureCollector();
- final GenericSignatureParser<DexType> genericSignatureParser =
- new GenericSignatureParser<>(genericSignatureCollector);
+ public void run(Iterable<? extends DexProgramClass> classes, ExecutorService executorService)
+ throws ExecutionException {
// Classes may not be the same as appInfo().classes() if applymapping is used on classpath
// arguments. If that is the case, the ProguardMapMinifier will pass in all classes that is
// either ProgramClass or has a mapping. This is then transitively called inside the
// ClassNameMinifier.
- for (DexProgramClass clazz : classes) {
- genericSignatureCollector.setCurrentClassContext(clazz);
- clazz.setAnnotations(
- rewriteGenericSignatures(
- clazz.annotations(),
- genericSignatureParser::parseClassSignature,
- genericSignatureCollector::getRenamedSignature,
- (signature, e) -> parseError(clazz, clazz.getOrigin(), signature, e)));
- clazz.forEachField(
- field ->
- field.setAnnotations(
- rewriteGenericSignatures(
- field.annotations(),
- genericSignatureParser::parseFieldSignature,
- genericSignatureCollector::getRenamedSignature,
- (signature, e) -> parseError(field, clazz.getOrigin(), signature, e))));
- clazz.forEachMethod(
- method ->
- method.setAnnotations(
- rewriteGenericSignatures(
- method.annotations(),
- genericSignatureParser::parseMethodSignature,
- genericSignatureCollector::getRenamedSignature,
- (signature, e) -> parseError(method, clazz.getOrigin(), signature, e))));
- }
+ ThreadUtils.processItems(
+ classes,
+ clazz -> {
+ GenericSignatureCollector genericSignatureCollector =
+ new GenericSignatureCollector(clazz);
+ GenericSignatureParser<DexType> genericSignatureParser =
+ new GenericSignatureParser<>(genericSignatureCollector);
+ clazz.setAnnotations(
+ rewriteGenericSignatures(
+ clazz.annotations(),
+ genericSignatureParser::parseClassSignature,
+ genericSignatureCollector::getRenamedSignature,
+ (signature, e) -> parseError(clazz, clazz.getOrigin(), signature, e)));
+ clazz.forEachField(
+ field ->
+ field.setAnnotations(
+ rewriteGenericSignatures(
+ field.annotations(),
+ genericSignatureParser::parseFieldSignature,
+ genericSignatureCollector::getRenamedSignature,
+ (signature, e) -> parseError(field, clazz.getOrigin(), signature, e))));
+ clazz.forEachMethod(
+ method ->
+ method.setAnnotations(
+ rewriteGenericSignatures(
+ method.annotations(),
+ genericSignatureParser::parseMethodSignature,
+ genericSignatureCollector::getRenamedSignature,
+ (signature, e) -> parseError(method, clazz.getOrigin(), signature, e))));
+ },
+ executorService
+ );
}
private DexAnnotationSet rewriteGenericSignatures(
@@ -154,17 +162,17 @@
private class GenericSignatureCollector implements GenericSignatureAction<DexType> {
private StringBuilder renamedSignature;
- private DexProgramClass currentClassContext;
+ private final DexProgramClass currentClassContext;
private DexType lastWrittenType = null;
+ GenericSignatureCollector(DexProgramClass clazz) {
+ this.currentClassContext = clazz;
+ }
+
String getRenamedSignature() {
return renamedSignature.toString();
}
- void setCurrentClassContext(DexProgramClass clazz) {
- currentClassContext = clazz;
- }
-
@Override
public void parsedSymbol(char symbol) {
if (symbol == ';' && lastWrittenType == null) {