Fix Machine Emulated Interface building

- Correctly merge emulated interface information

Change-Id: I594ec19f857ea1bac0d9ece6a0c1e2beb9536cff
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
index 80ca5b3..e3a9dff 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/EmulatedInterfaceDescriptor.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
+import com.google.common.collect.ImmutableMap;
 import java.util.Map;
 import java.util.Objects;
 
@@ -34,6 +35,18 @@
     return emulatedMethods;
   }
 
+  public EmulatedInterfaceDescriptor merge(EmulatedInterfaceDescriptor other) {
+    if (!rewrittenType.isIdenticalTo(other.getRewrittenType())) {
+      throw new UnsupportedOperationException(
+          "Emulated interface descriptor can only be merged on the same rewritten type.");
+    }
+    ImmutableMap.Builder<DexMethod, EmulatedDispatchMethodDescriptor> builder =
+        ImmutableMap.builder();
+    builder.putAll(getEmulatedMethods());
+    builder.putAll(other.getEmulatedMethods());
+    return new EmulatedInterfaceDescriptor(rewrittenType, builder.build());
+  }
+
   @Override
   public Object[] toJsonStruct(
       MultiAPILevelMachineDesugaredLibrarySpecificationJsonExporter exporter) {
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 d27ba9b..f28dae7 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
@@ -362,8 +362,8 @@
         emulatedVirtualRetargetThroughEmulatedInterface = ImmutableMap.builder();
     private final ImmutableMap.Builder<DexMethod, DexMethod[]> apiGenericTypesConversion =
         ImmutableMap.builder();
-    private final ImmutableMap.Builder<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces =
-        ImmutableMap.builder();
+    private final Map<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces =
+        new IdentityHashMap<>();
     private final LinkedHashMap<DexType, WrapperDescriptor> wrappers = new LinkedHashMap<>();
     private final ImmutableMap.Builder<DexType, DexType> legacyBackport = ImmutableMap.builder();
     private final ImmutableSet.Builder<DexType> dontRetarget = ImmutableSet.builder();
@@ -409,8 +409,12 @@
       nonEmulatedVirtualRetarget.put(src, dest);
     }
 
-    public void putEmulatedInterface(DexType src, EmulatedInterfaceDescriptor descriptor) {
-      emulatedInterfaces.put(src, descriptor);
+    public void putEmulatedInterface(DexType src, EmulatedInterfaceDescriptor newDescriptor) {
+      assert newDescriptor != null;
+      EmulatedInterfaceDescriptor oldDescriptor = emulatedInterfaces.get(src);
+      EmulatedInterfaceDescriptor mergedDescriptor =
+          oldDescriptor == null ? newDescriptor : newDescriptor.merge(oldDescriptor);
+      emulatedInterfaces.put(src, mergedDescriptor);
     }
 
     public void putEmulatedVirtualRetarget(DexMethod src, EmulatedDispatchMethodDescriptor dest) {
@@ -487,7 +491,7 @@
           emulatedVirtualRetarget.build(),
           emulatedVirtualRetargetThroughEmulatedInterface.build(),
           apiGenericTypesConversion.build(),
-          emulatedInterfaces.build(),
+          ImmutableMap.copyOf(emulatedInterfaces),
           wrappers,
           legacyBackport.build(),
           dontRetarget.build(),