Don't emit unneeded debug positions.
If the same debug position precedes the current in the linear output of the
program (and there are no pending local changes) we don't need to emit the
position.
Change-Id: I6dcd8300c3cfd6f1963719098da44e7006a88c35
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 7020f4b..c1dad50 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -184,9 +184,17 @@
}
private void emitDebugPosition(int pc, int line, DexString file) {
- // The position requires a pc change event and possible events for line, file and local changes.
- // Verify that we do not ever produce two subsequent positions at the same pc.
- assert emittedPc != pc;
+ if (emittedPc == pc) {
+ // The pc is unchanged then this must be the same position as the previous and we do nothing.
+ // If this assert fails, we have likely forgotten to insert a "nop" instruction between two
+ // successive yet distinct debug positions.
+ assert emittedLine == line && emittedFile == file;
+ return;
+ }
+ boolean changedLocals = localsChanged();
+ if (!changedLocals && emittedLine == line && emittedFile == file) {
+ return;
+ }
if (startLine == NO_LINE_INFO) {
assert emittedLine == NO_LINE_INFO;
startLine = line;
@@ -196,7 +204,7 @@
emittedPc = pc;
emittedLine = line;
emittedFile = file;
- if (localsChanged()) {
+ if (changedLocals) {
emitLocalChangeEvents(emittedLocals, pendingLocals, lastKnownLocals, events, factory);
assert localsEqual(emittedLocals, pendingLocals);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
index 92f768e..923dbf1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/DexBuilder.java
@@ -369,7 +369,7 @@
}
}
}
- if (next.isDebugPosition()) {
+ if (next.isDebugPosition() && !position.equals(next.asDebugPosition())) {
add(position, new FixedSizeInfo(position, new Nop()));
} else {
addNop(position);