Use more machine desugared library flags
Bug: 184026720
Change-Id: I08a01bfc2e31e866ac6e85c09ec33e7aa1de9fed
diff --git a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
index 8bdf5a1..eaec5a0 100644
--- a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
+++ b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
import com.android.tools.r8.naming.NamingLens;
import com.android.tools.r8.references.ArrayReference;
import com.android.tools.r8.references.ClassReference;
@@ -32,13 +32,11 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.NopDiagnosticsHandler;
-import com.android.tools.r8.utils.SetUtils;
import com.android.tools.r8.utils.Timing;
import com.android.tools.r8.utils.TypeReferenceUtils;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
-import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Predicate;
@@ -80,18 +78,15 @@
}
private Predicate<DexType> createTargetPredicate() {
- LegacyDesugaredLibrarySpecification desugaredLibrarySpecification =
- options.desugaredLibrarySpecification;
- Set<DexType> potentialTypesToKeep =
- SetUtils.newIdentityHashSet(
- desugaredLibrarySpecification.getCustomConversions().values(),
- desugaredLibrarySpecification.getEmulateLibraryInterface().values());
+ MachineDesugaredLibrarySpecification desugaredLibrarySpecification =
+ options.machineDesugaredLibrarySpecification;
byte[] synthesizedLibraryClassesPackageDescriptorPrefix =
DexString.encodeToMutf8(
"L" + desugaredLibrarySpecification.getSynthesizedLibraryClassesPackagePrefix());
return type ->
namingLens.prefixRewrittenType(type) != null
- || potentialTypesToKeep.contains(type)
+ || desugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type)
+ || desugaredLibrarySpecification.isCustomConversionRewrittenType(type)
|| type.getDescriptor().startsWith(synthesizedLibraryClassesPackageDescriptorPrefix);
}
diff --git a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
index 3adc951..3e33ca8 100644
--- a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
+++ b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
@@ -57,22 +57,18 @@
}
private final NamingLens namingLens;
- private final Set<DexType> potentialTypesToKeep = Sets.newIdentityHashSet();
private final Map<DexType, KeepStruct> toKeep = new ConcurrentHashMap<>();
private final InternalOptions options;
public DesugaredLibraryCodeToKeep(NamingLens namingLens, InternalOptions options) {
this.namingLens = namingLens;
this.options = options;
- potentialTypesToKeep.addAll(
- options.machineDesugaredLibrarySpecification.getEmulatedInterfaceRewrittenTypes());
- potentialTypesToKeep.addAll(
- options.desugaredLibrarySpecification.getCustomConversions().values());
}
private boolean shouldKeep(DexType type) {
return namingLens.prefixRewrittenType(type) != null
- || potentialTypesToKeep.contains(type)
+ || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(type)
+ || options.machineDesugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type)
// TODO(b/158632510): This should prefix match on DexString.
|| type.toDescriptorString()
.startsWith(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
index 9b07615..b66a96a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
@@ -20,13 +20,13 @@
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryAPICallbackSynthesizorEventConsumer;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APICallbackWrapperCfCodeProvider;
import com.android.tools.r8.utils.OptionalBool;
import com.android.tools.r8.utils.WorkList;
import com.google.common.collect.Sets;
import java.util.ArrayList;
import java.util.Collection;
-import java.util.Map;
import java.util.Set;
import java.util.concurrent.ExecutorService;
@@ -181,10 +181,10 @@
if (appView.options().machineDesugaredLibrarySpecification.supportAllCallbacksFromLibrary()) {
return true;
}
- Map<DexType, DexType> emulateLibraryInterfaces =
- appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface();
- return !(emulateLibraryInterfaces.containsKey(dexClass.type)
- || emulateLibraryInterfaces.containsValue(dexClass.type));
+ MachineDesugaredLibrarySpecification specification =
+ appView.options().machineDesugaredLibrarySpecification;
+ return !(specification.getEmulatedInterfaces().containsKey(dexClass.type)
+ || specification.isEmulatedInterfaceRewrittenType(dexClass.type));
}
private ProgramMethod generateCallbackMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index 3769787..71442ac 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -465,9 +465,8 @@
if (holderClass == null) {
assert appView
.options()
- .desugaredLibrarySpecification
- .getEmulateLibraryInterface()
- .containsValue(method.getHolderType());
+ .machineDesugaredLibrarySpecification
+ .isEmulatedInterfaceRewrittenType(method.getHolderType());
isInterface = true;
} else {
isInterface = holderClass.isInterface();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 7cf54a8..e1368e3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -109,8 +109,12 @@
return rewritingFlags.getEmulatedInterfaceEmulatedDispatchMethodDescriptor(method);
}
- public Set<DexType> getEmulatedInterfaceRewrittenTypes() {
- return rewritingFlags.getEmulatedInterfaceRewrittenTypes();
+ public boolean isCustomConversionRewrittenType(DexType type) {
+ return rewritingFlags.isCustomConversionRewrittenType(type);
+ }
+
+ public boolean isEmulatedInterfaceRewrittenType(DexType type) {
+ return rewritingFlags.isEmulatedInterfaceRewrittenType(type);
}
public Map<DexType, List<DexMethod>> getWrappers() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index 666c766..c5c77c6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -11,7 +11,7 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
+import com.google.common.collect.Iterables;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
@@ -106,14 +106,6 @@
return emulatedInterfaces;
}
- public Set<DexType> getEmulatedInterfaceRewrittenTypes() {
- Set<DexType> rewrittenTypes = Sets.newIdentityHashSet();
- emulatedInterfaces
- .values()
- .forEach(descriptor -> rewrittenTypes.add(descriptor.getRewrittenType()));
- return rewrittenTypes;
- }
-
public Map<DexType, List<DexMethod>> getWrappers() {
return wrappers;
}
@@ -126,6 +118,10 @@
return dontRetarget;
}
+ public boolean isCustomConversionRewrittenType(DexType type) {
+ return Iterables.any(customConversions.values(), pair -> pair.getFirst() == type);
+ }
+
public Map<DexType, Pair<DexType, DexString>> getCustomConversions() {
return customConversions;
}
@@ -136,6 +132,11 @@
|| !emulatedVirtualRetarget.isEmpty();
}
+ public boolean isEmulatedInterfaceRewrittenType(DexType type) {
+ return Iterables.any(
+ emulatedInterfaces.values(), descriptor -> descriptor.getRewrittenType() == type);
+ }
+
public boolean hasEmulatedInterfaces() {
return !emulatedInterfaces.isEmpty();
}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index a77507a..cb4a537 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -38,6 +38,7 @@
import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.ClasspathEmulatedInterfaceSynthesizerEventConsumer;
import com.android.tools.r8.synthesis.SyntheticClassBuilder;
import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
@@ -45,9 +46,6 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.structural.Ordered;
import com.google.common.collect.ImmutableList;
-import java.util.IdentityHashMap;
-import java.util.Map;
-import java.util.Set;
import java.util.function.Predicate;
public class InterfaceDesugaringSyntheticHelper {
@@ -66,37 +64,32 @@
static final String PRIVATE_METHOD_PREFIX = "$private$";
private final AppView<?> appView;
- private final Map<DexType, DexType> emulatedInterfaces;
private final Predicate<DexType> shouldIgnoreFromReportsPredicate;
public InterfaceDesugaringSyntheticHelper(AppView<?> appView) {
this.appView = appView;
- emulatedInterfaces = new IdentityHashMap<>();
- appView
- .options()
- .machineDesugaredLibrarySpecification
- .getEmulatedInterfaces()
- .forEach(
- (ei, descriptor) -> {
- emulatedInterfaces.put(ei, descriptor.getRewrittenType());
- });
this.shouldIgnoreFromReportsPredicate = getShouldIgnoreFromReportsPredicate(appView);
}
boolean isEmulatedInterface(DexType itf) {
- return emulatedInterfaces.containsKey(itf);
+ return appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .getEmulatedInterfaces()
+ .containsKey(itf);
}
boolean isRewrittenEmulatedInterface(DexType itf) {
- return emulatedInterfaces.containsValue(itf);
- }
-
- Set<DexType> getEmulatedInterfaces() {
- return emulatedInterfaces.keySet();
+ return appView
+ .options()
+ .machineDesugaredLibrarySpecification
+ .isEmulatedInterfaceRewrittenType(itf);
}
DexType getEmulatedInterface(DexType type) {
- return emulatedInterfaces.get(type);
+ EmulatedInterfaceDescriptor interfaceDescriptor =
+ appView.options().machineDesugaredLibrarySpecification.getEmulatedInterfaces().get(type);
+ return interfaceDescriptor == null ? null : interfaceDescriptor.getRewrittenType();
}
boolean isInDesugaredLibrary(DexClass clazz) {
@@ -584,7 +577,7 @@
return appView.rewritePrefix.hasRewrittenType(type, appView)
|| descriptor.endsWith(companionClassNameDescriptorSuffix)
|| isRewrittenEmulatedInterface(type)
- || options.desugaredLibrarySpecification.getCustomConversions().containsValue(type)
+ || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(type)
|| appView.getDontWarnConfiguration().matches(type);
};
}
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 3c46d21..cf095b1 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -639,7 +639,11 @@
"--lib",
ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
assertFalse(
- d8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+ d8Command
+ .getInternalOptions()
+ .machineDesugaredLibrarySpecification
+ .getRewriteType()
+ .isEmpty());
}
@Test
diff --git a/src/test/java/com/android/tools/r8/L8CommandTest.java b/src/test/java/com/android/tools/r8/L8CommandTest.java
index 73da19e..358d863 100644
--- a/src/test/java/com/android/tools/r8/L8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/L8CommandTest.java
@@ -361,7 +361,11 @@
"--lib",
ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
assertFalse(
- l8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+ l8Command
+ .getInternalOptions()
+ .machineDesugaredLibrarySpecification
+ .getRewriteType()
+ .isEmpty());
}
private void checkSingleForceAllAssertion(
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index 2c0a77e..325344f 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -770,7 +770,11 @@
"--lib",
ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
assertFalse(
- r8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+ r8Command
+ .getInternalOptions()
+ .machineDesugaredLibrarySpecification
+ .getRewriteType()
+ .isEmpty());
}
@Test
@@ -785,7 +789,11 @@
"--desugared-lib-pg-conf-output",
pgout.toString());
assertFalse(
- r8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+ r8Command
+ .getInternalOptions()
+ .machineDesugaredLibrarySpecification
+ .getRewriteType()
+ .isEmpty());
}
@Test