Reland "Update stable map version to 2.0"

This reverts commit da1d0405badf9136812155f6fa838b669a68cc39.

Change-Id: I39519caa67560e9993d9b7b3574536649937c998
diff --git a/doc/retrace.md b/doc/retrace.md
index 3ca198e..ea6a151 100644
--- a/doc/retrace.md
+++ b/doc/retrace.md
@@ -133,3 +133,144 @@
 since that method was not part of the input program it should not be in the
 output mapping information at all.
 
+### RewriteFrame (Introduced at version 2.0)
+
+The RewriteFrame information informs the retrace tool that when retracing a
+frame it should rewrite it. The mapping information has the form:
+
+```
+  # { id: 'com.android.tools.r8.rewriteFrame', "
+      conditions: ['throws(<exceptionDescriptor>)'],
+      actions: ['removeInnerFrames(<count>)'] }
+```
+
+The format is to specify conditions for when the rule should be applied and then
+describe the actions to take. The following conditions exist:
+
+- `throws(<exceptionDescriptor>)`: Will be true if the thrown exception above is
+`<exceptionDescriptor>`
+
+Conditions can be combined by adding more items to the list. The semantics of
+having more elements in the list is that the conditions are AND'ed together. To
+achieve OR one should duplicate the information.
+
+Actions describe what should happen to the retraced frames if the condition
+holds. Multiple specified actions will be applied from left to right. The
+following actions exist:
+
+- `removeInnerFrames(<count>)`: Will remove the number of frames starting with
+inner most frame. It is an error to specify a count higher than all frames.
+
+An example could be to remove an inlined frame if a null-pointer-exception is
+thrown:
+
+```
+some.Class -> a:
+  4:4:void other.Class.inlinee():23:23 -> a
+  4:4:void caller(other.Class):7 -> a\n"
+  # { id: 'com.android.tools.r8.rewriteFrame', "
+      conditions: ['throws(Ljava/lang/NullPointerException;)'],
+      actions: ['removeInnerFrames(1)'] }
+```
+
+When retracing:
+```
+Exception in thread "main" java.lang.NullPointerException: ...
+  at a.a(:4)
+```
+
+It will normally retrace to:
+```
+Exception in thread "main" java.lang.NullPointerException: ...
+  at other.Class.inlinee(Class.java:23)
+  at some.Class.caller(Class.java:7)
+```
+
+Amending the last mapping with the above inline information instructs the
+retracer to discard frames above, resulting in the retrace result:
+```
+Exception in thread "main" java.lang.NullPointerException: ...
+  at some.Class.caller(Class.java:7)
+```
+
+The `rewriteFrame` information will only be applied if the line that is being
+retraced is directly under the exception line.
+
+### Outline (Introduced at version 2.0)
+
+The outline information can be used by compilers to specify that a method is an
+outline. It has the following format:
+
+```
+# { 'id':'com.android.tools.r8.outline' }
+```
+
+When a retracer retraces a frame that has the outline mapping information it
+should carry the reported position to the next frame and use the
+`outlineCallsite` to obtain the correct position.
+
+### Outline Call Site (Introduced at version 2.0)
+
+A position in an outline can correspond to multiple different positions
+depending on the context. The information can be stored in the mapping file with
+the following format:
+
+```
+# { 'id':'com.android.tools.r8.outlineCallsite',
+    'positions': {
+        'outline_pos_1': callsite_pos_1,
+        'outline_pos_2': callsite_pos_2,
+         ...
+     }
+  }
+```
+
+The retracer should when seeing the `outline` information carry the line number
+to the next frame. The position should be rewritten by using the positions map
+before using the resulting position for further retracing. Here is an example:
+
+```
+# { id: 'com.android.tools.r8.mapping', version: '2.0' }
+outline.Class -> a:
+  1:2:int outline() -> a
+# { 'id':'com.android.tools.r8.outline' }
+some.Class -> b:
+  1:1:void foo.bar.Baz.qux():42:42 -> s
+  4:4:int outlineCaller(int):98:98 -> s
+  5:5:int outlineCaller(int):100:100 -> s
+  27:27:int outlineCaller(int):0:0 -> s
+# { 'id':'com.android.tools.r8.outlineCallsite',
+    'positions': { '1': 4, '2': 5 } }
+```
+
+Retracing the following stack trace lines:
+
+```
+  at a.a(:1)
+  at b.s(:27)
+```
+
+Should first retrace the first line and see it is an `outline` and then use
+the `outlineCallsite` for `b.s` at position `27` to map the read position `1` to
+position `4` and then use that to find the actual mapping, resulting in the
+retraced stack:
+
+```
+  at some.Class.outlineCaller(Class.java:98)
+```
+
+It should be such that for all stack traces, if a retracer ever see an outline
+the next obfuscated line should contain `outlineCallSite` information.
+
+### Catch all range for methods with a single unique position
+
+If only a single position is needed for retracing a method correctly one can
+skip emitting the position and rely on retrace to retrace correctly. To ensure
+compatibility R8 emits a catch-all range `0:65535` as such:
+
+```
+0:65535:void foo():33:33 -> a
+```
+
+It does not matter if the mapping is an inline frame. Catch all ranges should
+never be used for overloads.
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index f8bfbeb..8091db7 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -256,7 +256,7 @@
     if (nextPosition.isOutline()) {
       events.add(factory.createSetOutlineFrame());
     }
-    if (nextPosition.getOutlineCallee() != null) {
+    if (nextPosition.getOutlineCallee() != null && !nextPosition.getOutlinePositions().isEmpty()) {
       events.add(
           factory.createSetOutlineCallerFrame(
               nextPosition.getOutlineCallee(), nextPosition.getOutlinePositions()));
diff --git a/src/main/java/com/android/tools/r8/ir/code/Position.java b/src/main/java/com/android/tools/r8/ir/code/Position.java
index cf718aa..47549e9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Position.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Position.java
@@ -544,6 +544,10 @@
         return this;
       }
 
+      public boolean hasOutlinePositions() {
+        return !outlinePositionsBuilder.isEmpty();
+      }
+
       @Override
       public OutlineCallerPosition build() {
         assert noCheckOfPosition || line >= 0;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 01cc6c74..4a11433 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -145,7 +145,7 @@
   private final CfgPrinter printer;
   public final CodeRewriter codeRewriter;
   private final ConstantCanonicalizer constantCanonicalizer;
-  private final MemberValuePropagation memberValuePropagation;
+  public final MemberValuePropagation memberValuePropagation;
   private final LensCodeRewriter lensCodeRewriter;
   private final Inliner inliner;
   private final IdentifierNameStringMarker identifierNameStringMarker;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
index 921bc7f..d73ac60 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/OutlinerImpl.java
@@ -1243,7 +1243,6 @@
                 // set a new disjoint line.
                 .setLine(0);
         Instruction lastInstruction = null;
-        Position position = Position.none();
         { // Scope for 'instructions'.
           int outlinePositionIndex = 0;
           for (int i = start; i < end; i++) {
@@ -1252,8 +1251,9 @@
               // Leave any const instructions.
               continue;
             }
-            if (current.getPosition() != null) {
-              positionBuilder.addOutlinePosition(outlinePositionIndex++, current.getPosition());
+            int currentPositionIndex = outlinePositionIndex++;
+            if (current.getPosition() != null && current.instructionInstanceCanThrow()) {
+              positionBuilder.addOutlinePosition(currentPositionIndex, current.getPosition());
             }
 
             // Prepare to remove the instruction.
@@ -1284,7 +1284,10 @@
         }
         Invoke outlineInvoke = new InvokeStatic(outlineMethod, returnValue, in);
         outlineInvoke.setBlock(lastInstruction.getBlock());
-        outlineInvoke.setPosition(positionBuilder.build());
+        outlineInvoke.setPosition(
+            positionBuilder.hasOutlinePositions()
+                ? positionBuilder.build()
+                : Position.syntheticNone());
         InstructionListIterator endIterator =
             lastInstruction.getBlock().listIterator(code, lastInstruction);
         Instruction instructionBeforeEnd = endIterator.previous();
@@ -1336,6 +1339,7 @@
       ExecutorService executorService,
       Timing timing)
       throws ExecutionException {
+    assert feedback.noUpdatesLeft();
     converter.printPhase("Outlining");
     timing.begin("IR conversion phase 3");
     ProgramMethodSet methodsSelectedForOutlining = selectMethodsForOutlining();
@@ -1350,12 +1354,15 @@
           executorService);
       List<ProgramMethod> outlineMethods = buildOutlineMethods();
       converter.optimizeSynthesizedMethods(outlineMethods, executorService);
+      feedback.updateVisibleOptimizationInfo();
       forEachSelectedOutliningMethod(
           converter,
           methodsSelectedForOutlining,
           code -> {
             applyOutliningCandidate(code);
             converter.printMethod(code, "IR after outlining (SSA)", null);
+            converter.memberValuePropagation.run(code);
+            converter.codeRewriter.rewriteMoveResult(code);
             converter.removeDeadCodeAndFinalizeIR(
                 code, OptimizationFeedbackIgnore.getInstance(), Timing.empty());
           },
@@ -1728,6 +1735,8 @@
 
     @Override
     public Position getCurrentPosition() {
+      // Always build positions for outlinee - each callsite will only build a position map for
+      // instructions that are actually throwing.
       return OutlinePosition.builder().setLine(position).setMethod(method).build();
     }
 
diff --git a/src/main/java/com/android/tools/r8/naming/MapVersion.java b/src/main/java/com/android/tools/r8/naming/MapVersion.java
index 87412e8..a23196c 100644
--- a/src/main/java/com/android/tools/r8/naming/MapVersion.java
+++ b/src/main/java/com/android/tools/r8/naming/MapVersion.java
@@ -8,10 +8,11 @@
 public enum MapVersion implements Ordered<MapVersion> {
   MAP_VERSION_NONE("none"),
   MAP_VERSION_1_0("1.0"),
+  MAP_VERSION_2_0("2.0"),
   MAP_VERSION_EXPERIMENTAL("experimental"),
   MAP_VERSION_UNKNOWN("unknown");
 
-  public static final MapVersion STABLE = MAP_VERSION_1_0;
+  public static final MapVersion STABLE = MAP_VERSION_2_0;
 
   private final String name;
 
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
index 7f0beee..6cb093d 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
@@ -14,7 +14,7 @@
 
 public class OutlineCallsiteMappingInformation extends MappingInformation {
 
-  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_EXPERIMENTAL;
+  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final String ID = "com.android.tools.r8.outlineCallsite";
 
   private static final String POSITIONS_KEY = "positions";
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
index 20df16d..1914431 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
@@ -11,7 +11,7 @@
 
 public class OutlineMappingInformation extends MappingInformation {
 
-  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_EXPERIMENTAL;
+  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final String ID = "com.android.tools.r8.outline";
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
index b27fe19..82b2a0b 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
@@ -26,7 +26,7 @@
 
 public class RewriteFrameMappingInformation extends MappingInformation {
 
-  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_EXPERIMENTAL;
+  public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final String ID = "com.android.tools.r8.rewriteFrame";
   private static final String CONDITIONS_KEY = "conditions";
   private static final String ACTIONS_KEY = "actions";
diff --git a/src/main/java/com/android/tools/r8/utils/Int2StructuralItemArrayMap.java b/src/main/java/com/android/tools/r8/utils/Int2StructuralItemArrayMap.java
index 9ed1e4f..3f0f761 100644
--- a/src/main/java/com/android/tools/r8/utils/Int2StructuralItemArrayMap.java
+++ b/src/main/java/com/android/tools/r8/utils/Int2StructuralItemArrayMap.java
@@ -90,6 +90,10 @@
       return this;
     }
 
+    public boolean isEmpty() {
+      return keys.isEmpty();
+    }
+
     public Int2StructuralItemArrayMap<T> build() {
       return new Int2StructuralItemArrayMap<T>(Ints.toArray(keys), values.build());
     }
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 16af327..b16cfc4 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -50,7 +50,6 @@
 import com.android.tools.r8.naming.ClassNaming;
 import com.android.tools.r8.naming.ClassNaming.Builder;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
-import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
@@ -363,9 +362,7 @@
         }
       }
 
-      MapVersion mapFileVersion = appView.options().getMapFileVersion();
-
-      if (isSyntheticClass && CompilerSynthesizedMappingInformation.isSupported(mapFileVersion)) {
+      if (isSyntheticClass) {
         onDemandClassNamingBuilder
             .get()
             .addMappingInformation(
@@ -446,8 +443,7 @@
           String obfuscatedName = obfuscatedNameDexString.toString();
 
           List<MappingInformation> methodMappingInfo = new ArrayList<>();
-          if (method.isD8R8Synthesized()
-              && CompilerSynthesizedMappingInformation.isSupported(mapFileVersion)) {
+          if (method.isD8R8Synthesized()) {
             methodMappingInfo.add(CompilerSynthesizedMappingInformation.builder().build());
           }
 
@@ -481,8 +477,7 @@
                       m, key -> MethodSignature.fromDexMethod(m, m.holder != clazz.getType()));
 
           // Check if mapped position is an outline
-          if (mappedPositions.get(0).isOutline
-              && OutlineMappingInformation.isSupported(mapFileVersion)) {
+          if (mappedPositions.get(0).isOutline) {
             outlinesToFix
                 .computeIfAbsent(
                     mappedPositions.get(0).method, ignored -> new OutlineFixupBuilder())
@@ -490,8 +485,6 @@
             methodMappingInfo.add(OutlineMappingInformation.builder().build());
           }
 
-          int outlineCallersCounter = 0;
-
           // Update memberNaming with the collected positions, merging multiple positions into a
           // single region whenever possible.
           for (int i = 0; i < mappedPositions.size(); /* updated in body */ ) {
@@ -559,8 +552,7 @@
               lastMappedRange.addMappingInformation(info, Unreachable::raise);
             }
             // firstPosition will contain a potential outline caller.
-            if (firstPosition.outlineCallee != null
-                && OutlineCallsiteMappingInformation.isSupported(mapFileVersion)) {
+            if (firstPosition.outlineCallee != null) {
               Int2IntMap positionMap = new Int2IntArrayMap();
               int maxPc = ListUtils.last(mappedPositions).obfuscatedLine;
               firstPosition.outlinePositions.forEach(
@@ -587,7 +579,6 @@
                   .computeIfAbsent(
                       firstPosition.outlineCallee, ignored -> new OutlineFixupBuilder())
                   .addMappedRangeForOutlineCallee(lastMappedRange, positionMap);
-              outlineCallersCounter += 1;
             }
             i = j;
           }
@@ -1100,8 +1091,11 @@
     }
 
     public void fixup() {
-      assert mappedOutlinePositions != null;
-      assert !mappedOutlineCalleePositions.isEmpty();
+      if (mappedOutlinePositions == null || mappedOutlineCalleePositions.isEmpty()) {
+        assert mappedOutlinePositions != null : "Mapped outline positions is null";
+        assert false : "Mapped outline positions is empty";
+        return;
+      }
       for (Pair<MappedRange, Int2IntMap> mappingInfo : mappedOutlineCalleePositions) {
         MappedRange mappedRange = mappingInfo.getFirst();
         Int2IntMap positions = mappingInfo.getSecond();
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
index d6f6765..d67f6ee 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
@@ -42,7 +42,7 @@
     private final ClassReference callsiteRenamed = Reference.classFromTypeName("b");
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + "outline.Class -> "
             + outlineRenamed.getTypeName()
             + ":\n"
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
index 326a63c..94824c5 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
@@ -44,7 +44,7 @@
     private final ClassReference callsiteRenamed = Reference.classFromTypeName("c");
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + "outline1.Class -> "
             + outline1Renamed.getTypeName()
             + ":\n"
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
index cae0408..6aaa0fa 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
@@ -42,7 +42,7 @@
     private final ClassReference callsiteRenamed = Reference.classFromTypeName("b");
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + "outline.Class -> "
             + outlineRenamed.getTypeName()
             + ":\n"
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
index a213440..e4ef644 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
@@ -43,7 +43,7 @@
     private final ClassReference callsiteRenamed = Reference.classFromTypeName("b");
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + "outline.Class -> "
             + outlineRenamed.getTypeName()
             + ":\n"
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
index e4a8241..5175ecb 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeResidualTest.java
@@ -51,7 +51,7 @@
     private final ClassReference renamedSomeOtherClass = Reference.classFromTypeName("b");
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + originalException.getTypeName()
             + " -> "
             + renamedException.getTypeName()
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
index e97306c..66bdc03 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiRewriteFrameInlineNpeTest.java
@@ -44,7 +44,7 @@
     private final String npeDescriptor = "Ljava/lang/NullPointerException;";
 
     private final String mapping =
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }\n"
             + "some.Class -> a:\n"
             + "  4:4:void other.Class.inlinee():23:23 -> a\n"
             + "  4:4:void caller(other.Class):7 -> a\n"
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineInOutlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineInOutlineStackTrace.java
index a231a0f..df74712 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineInOutlineStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineInOutlineStackTrace.java
@@ -18,7 +18,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }",
         "outline.Class -> a:",
         "  1:2:int some.inlinee():75:76 -> a",
         "  1:2:int outline():0 -> a",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/NpeInlineRetraceStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/NpeInlineRetraceStackTrace.java
index 3857154..6e9a0be 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/NpeInlineRetraceStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/NpeInlineRetraceStackTrace.java
@@ -19,7 +19,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }",
         "some.Class -> a:",
         "  4:4:void other.Class():23:23 -> a",
         "  4:4:void caller(other.Class):7 -> a",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineInOutlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineInOutlineStackTrace.java
index ae8b52b..95e5185 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineInOutlineStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineInOutlineStackTrace.java
@@ -19,7 +19,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }",
         "outline1.Class -> a:",
         "  4:4:int outline():0:0 -> a",
         "# { 'id':'com.android.tools.r8.outline' }",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineSimpleStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineSimpleStackTrace.java
index ad0dddc..b8109cf 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineSimpleStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineSimpleStackTrace.java
@@ -18,7 +18,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }",
         "outline.Class -> a:",
         "  1:2:int outline() -> a",
         "# { 'id':'com.android.tools.r8.outline' }",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineWithInliningStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineWithInliningStackTrace.java
index a8198a2..238a7d1 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineWithInliningStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/OutlineWithInliningStackTrace.java
@@ -18,7 +18,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }",
+        "# { id: 'com.android.tools.r8.mapping', version: '2.0' }",
         "outline.Class -> a:",
         "  1:2:int outline():0 -> a",
         "# { 'id':'com.android.tools.r8.outline' }",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodStackTrace.java
index 6beaba4..fc7a1e5 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodStackTrace.java
@@ -44,7 +44,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# {'id':'com.android.tools.r8.mapping','version':'experimental'}",
+        "# {'id':'com.android.tools.r8.mapping','version':'1.0'}",
         "example.Main -> example.Main:",
         "  1:1:void main(java.lang.String[]):123 -> main",
         "example.Foo -> a.a:",
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodWithInliningStackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodWithInliningStackTrace.java
index 201700d..bd92f9f 100644
--- a/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodWithInliningStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/SyntheticLambdaMethodWithInliningStackTrace.java
@@ -43,7 +43,7 @@
   @Override
   public String mapping() {
     return StringUtils.lines(
-        "# {'id':'com.android.tools.r8.mapping','version':'experimental'}",
+        "# {'id':'com.android.tools.r8.mapping','version':'1.0'}",
         "example.Main -> example.Main:",
         "  1:1:void main(java.lang.String[]):123 -> main",
         "example.Foo -> a.a:",
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index c035792..ee23c0c 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-b9226752ab462728906b480d8aed7cf69a82a2f4
\ No newline at end of file
+40f612b228f0520a11a2e2f8745400163c70c82f
\ No newline at end of file