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