Register markers at creation time into own collection

Change-Id: I2412f93d70330ec9eb448d3eb3468a7e11e40404
diff --git a/src/main/java/com/android/tools/r8/dex/DexParser.java b/src/main/java/com/android/tools/r8/dex/DexParser.java
index 52eafdb..96a4596 100644
--- a/src/main/java/com/android/tools/r8/dex/DexParser.java
+++ b/src/main/java/com/android/tools/r8/dex/DexParser.java
@@ -1296,7 +1296,10 @@
       read = dexReader.get();
       os.write(read);
     } while (read != 0);
-    return dexItemFactory.createString(size, os.toByteArray());
+    byte[] content = os.toByteArray();
+    return Marker.hasMarkerPrefix(content)
+        ? dexItemFactory.createMarkerString(size, content)
+        : dexItemFactory.createString(size, content);
   }
 
   private DexType typeAt(int index) {
diff --git a/src/main/java/com/android/tools/r8/dex/Marker.java b/src/main/java/com/android/tools/r8/dex/Marker.java
index b308d5d..911789d 100644
--- a/src/main/java/com/android/tools/r8/dex/Marker.java
+++ b/src/main/java/com/android/tools/r8/dex/Marker.java
@@ -257,9 +257,7 @@
   // Try to parse str as a marker.
   // Returns null if parsing fails.
   public static Marker parse(DexString dexString) {
-    if (dexString.size > 2
-        && dexString.content[0] == PREFIX_CHAR
-        && dexString.content[1] == PREFIX_CHAR) {
+    if (hasMarkerPrefix(dexString.content)) {
       String str = dexString.toString();
       if (str.startsWith(D8_PREFIX)) {
         return internalParse(Tool.D8, str.substring(D8_PREFIX.length() - 1));
@@ -274,6 +272,10 @@
     return null;
   }
 
+  public static boolean hasMarkerPrefix(byte[] content) {
+    return content.length > 2 && content[0] == PREFIX_CHAR && content[1] == PREFIX_CHAR;
+  }
+
   private static Marker internalParse(Tool tool, String str) {
     try {
       JsonElement result = new JsonParser().parse(str);
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index b10a4f5..9620ee4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -81,6 +81,7 @@
   /** Set of types that may be synthesized during compilation. */
   private final Set<DexType> possibleCompilerSynthesizedTypes = Sets.newIdentityHashSet();
 
+  private final Map<DexString, DexString> markers = new ConcurrentHashMap<>();
   private final Map<DexString, DexString> strings = new ConcurrentHashMap<>();
   private final Map<DexString, DexType> types = new ConcurrentHashMap<>();
   private final Map<DexField, DexField> fields = new ConcurrentHashMap<>();
@@ -2321,6 +2322,22 @@
     return previous == null ? item : previous;
   }
 
+  public DexString createMarkerString(int size, byte[] content) {
+    DexString potentialMarker = createString(size, content);
+    if (Marker.hasMarkerPrefix(potentialMarker.content)) {
+      markers.put(potentialMarker, potentialMarker);
+    }
+    return potentialMarker;
+  }
+
+  public DexString createMarkerString(String marker) {
+    DexString potentialMarker = createString(marker);
+    if (Marker.hasMarkerPrefix(potentialMarker.content)) {
+      markers.put(potentialMarker, potentialMarker);
+    }
+    return potentialMarker;
+  }
+
   public DexString createString(int size, byte[] content) {
     assert !sorted;
     return canonicalize(strings, new DexString(size, content));
@@ -2601,9 +2618,8 @@
   // Debugging support to extract marking string.
   // Find all markers.
   public synchronized Collection<Marker> extractMarkers() {
-    // This is slow but it is not needed for any production code yet.
     Set<Marker> markers = new HashSet<>();
-    for (DexString dexString : strings.keySet()) {
+    for (DexString dexString : this.markers.keySet()) {
       Marker marker = Marker.parse(dexString);
       if (marker != null) {
         markers.add(marker);
diff --git a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
index f648f90..6b9015b 100644
--- a/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
+++ b/src/main/java/com/android/tools/r8/graph/JarClassFileReader.java
@@ -142,7 +142,7 @@
                 CfApplicationWriter.MARKER_STRING_CONSTANT_POOL_INDEX,
                 new char[reader.getMaxStringLength()]);
         if (maybeMarker instanceof String) {
-          application.getFactory().createString((String) maybeMarker);
+          application.getFactory().createMarkerString((String) maybeMarker);
         }
       } catch (IllegalArgumentException e) {
         // Ignore if the type of the constant is not something readConst() allows.