Use full encoding space of default debug event in jumbo string rewriter
Fixes: 208603998
Change-Id: I2e5963bfad7e5b3039634ac7b77f02b7f5b6fe0b
diff --git a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
index e402ce5..990d545 100644
--- a/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
+++ b/src/main/java/com/android/tools/r8/dex/JumboStringRewriter.java
@@ -4,6 +4,7 @@
package com.android.tools.r8.dex;
import static com.android.tools.r8.graph.DexCode.TryHandler.NO_HANDLER;
+import static com.android.tools.r8.graph.DexDebugEventBuilder.addDefaultEventWithAdvancePcIfNecessary;
import com.android.tools.r8.code.ConstString;
import com.android.tools.r8.code.ConstStringJumbo;
@@ -233,7 +234,7 @@
Instruction target = debugEventTargets.get(lastOriginalOffset);
int lineDelta = defaultEvent.getLineDelta();
int pcDelta = target.getOffset() - lastNewOffset;
- addDefaultEvent(lineDelta, pcDelta, events);
+ addDefaultEventWithAdvancePcIfNecessary(lineDelta, pcDelta, events, factory);
lastNewOffset = target.getOffset();
} else {
events.add(event);
@@ -247,27 +248,6 @@
return code.getDebugInfo();
}
- // Add a default event. If the lineDelta and pcDelta can be encoded in one default event
- // that will be done. Otherwise, this can output an advance line and/or advance pc event
- // followed by a default event. A default event is always emitted as that is what will
- // materialize an entry in the line table.
- private void addDefaultEvent(int lineDelta, int pcDelta, List<DexDebugEvent> events) {
- if (lineDelta < Constants.DBG_LINE_BASE
- || lineDelta - Constants.DBG_LINE_BASE >= Constants.DBG_LINE_RANGE) {
- events.add(factory.createAdvanceLine(lineDelta));
- lineDelta = 0;
- }
- if (pcDelta >= Constants.DBG_ADDRESS_RANGE) {
- events.add(factory.createAdvancePC(pcDelta));
- pcDelta = 0;
- }
- int specialOpcode =
- 0x0a + (lineDelta - Constants.DBG_LINE_BASE) + Constants.DBG_LINE_RANGE * pcDelta;
- assert specialOpcode >= 0x0a;
- assert specialOpcode <= 0xff;
- events.add(factory.createDefault(specialOpcode));
- }
-
private List<Instruction> expandCode() {
LinkedList<Instruction> instructions = new LinkedList<>();
Collections.addAll(instructions, method.getCode().asDexCode().instructions);
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 8091db7..71822f6 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -261,6 +261,11 @@
factory.createSetOutlineCallerFrame(
nextPosition.getOutlineCallee(), nextPosition.getOutlinePositions()));
}
+ addDefaultEventWithAdvancePcIfNecessary(lineDelta, pcDelta, events, factory);
+ }
+
+ public static void addDefaultEventWithAdvancePcIfNecessary(
+ int lineDelta, int pcDelta, List<DexDebugEvent> events, DexItemFactory factory) {
if (lineDelta < Constants.DBG_LINE_BASE
|| lineDelta - Constants.DBG_LINE_BASE >= Constants.DBG_LINE_RANGE) {
events.add(factory.createAdvanceLine(lineDelta));