Merge "Fix test CompatDxTests.singleDexProgramIsTooLarge"
diff --git a/src/main/java/com/android/tools/r8/graph/Code.java b/src/main/java/com/android/tools/r8/graph/Code.java
index 04c01be..dca5e02 100644
--- a/src/main/java/com/android/tools/r8/graph/Code.java
+++ b/src/main/java/com/android/tools/r8/graph/Code.java
@@ -19,7 +19,7 @@
public abstract String toString();
- public abstract String toString(ClassNameMapper naming);
+ public abstract String toString(DexEncodedMethod method, ClassNameMapper naming);
public boolean isDexCode() {
return false;
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index e7485aa..eea0169 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -174,7 +174,7 @@
ps.println("Bytecode for");
ps.println("Class: '" + clazzName + "'");
ps.println("Method: '" + methodName + "':");
- ps.println(method.getCode().toString(naming));
+ ps.println(method.getCode().toString(method, naming));
} catch (IOException e) {
e.printStackTrace();
} finally {
diff --git a/src/main/java/com/android/tools/r8/graph/DexCode.java b/src/main/java/com/android/tools/r8/graph/DexCode.java
index ebfd388..f48e7db 100644
--- a/src/main/java/com/android/tools/r8/graph/DexCode.java
+++ b/src/main/java/com/android/tools/r8/graph/DexCode.java
@@ -15,9 +15,11 @@
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import java.util.Arrays;
+import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Hashtable;
+import java.util.Iterator;
import java.util.Map;
import java.util.Set;
@@ -157,10 +159,10 @@
}
public String toString() {
- return toString(null);
+ return toString(null, null);
}
- public String toString(ClassNameMapper naming) {
+ public String toString(DexEncodedMethod method, ClassNameMapper naming) {
StringBuilder builder = new StringBuilder();
builder.append("registers: ").append(registerSize);
builder.append(", inputs: ").append(incomingRegisterSize);
@@ -168,12 +170,22 @@
builder.append("------------------------------------------------------------\n");
builder.append("inst# offset instruction arguments\n");
builder.append("------------------------------------------------------------\n");
+ DexDebugEntry debugInfo = null;
+ Iterator<DexDebugEntry> debugInfoIterator = Collections.emptyIterator();
+ if (getDebugInfo() != null && method != null) {
+ debugInfoIterator = new DexDebugEntryBuilder(method, new DexItemFactory()).build().iterator();
+ debugInfo = debugInfoIterator.hasNext() ? debugInfoIterator.next() : null;
+ }
int instructionNumber = 0;
for (Instruction insn : instructions) {
StringUtils.appendLeftPadded(builder, Integer.toString(instructionNumber++), 5);
builder.append(": ")
.append(insn.toString(naming))
.append('\n');
+ if (debugInfo != null && debugInfo.address == insn.getOffset()) {
+ builder.append(" ").append(debugInfo).append("\n");
+ debugInfo = debugInfoIterator.hasNext() ? debugInfoIterator.next() : null;
+ }
}
if (tries.length > 0) {
builder.append("Tries (numbers are offsets)\n");
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
index f6d8fb4..4410f2a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEntryBuilder.java
@@ -3,6 +3,7 @@
// BSD-style license that can be found in the LICENSE file.
package com.android.tools.r8.graph;
+import com.android.tools.r8.ir.code.MoveType;
import com.google.common.collect.ImmutableMap;
import java.util.ArrayList;
import java.util.HashMap;
@@ -60,19 +61,19 @@
DexCode code = method.getCode().asDexCode();
DexDebugInfo info = code.getDebugInfo();
int argumentRegister = code.registerSize - code.incomingRegisterSize;
- int argumentCount = code.incomingRegisterSize;
if (!method.accessFlags.isStatic()) {
- --argumentCount;
DexString name = factory.thisName;
DexType type = method.method.getHolder();
- startLocal(argumentRegister++, name, type, null);
+ startLocal(argumentRegister, name, type, null);
+ argumentRegister += MoveType.fromDexType(type).requiredRegisters();
}
DexType[] types = method.method.proto.parameters.values;
DexString[] names = info.parameters;
- for (int i = 0; i < argumentCount; i++) {
+ for (int i = 0; i < types.length; i++) {
// If null, the parameter has a parameterized type and the local is introduced in the stream.
if (names[i] != null) {
- startLocal(argumentRegister++, names[i], types[i], null);
+ startLocal(argumentRegister, names[i], types[i], null);
+ argumentRegister += MoveType.fromDexType(types[i]).requiredRegisters();
}
}
currentLine = info.startLine;
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 35ebaf2..3df2fab 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -348,7 +348,7 @@
}
public String codeToString() {
- return code == null ? "<no code>" : code.toString();
+ return code == null ? "<no code>" : code.toString(this, null);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index 2766684..9a367ff 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -112,7 +112,7 @@
}
@Override
- public String toString(ClassNameMapper naming) {
+ public String toString(DexEncodedMethod method, ClassNameMapper naming) {
return toString();
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index 4ab72f6..0ea5761 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -991,7 +991,7 @@
}
@Override
- public String toString(ClassNameMapper naming) {
+ public String toString(DexEncodedMethod method, ClassNameMapper naming) {
return null;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
index 7716663..3d3f9f1 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/SynthesizedCode.java
@@ -37,7 +37,7 @@
@Override
public final String toString() {
- return toString(null);
+ return toString(null, null);
}
private static void registerReachableDefinitionsDefault(UseRegistry registry) {
@@ -61,7 +61,7 @@
}
@Override
- public final String toString(ClassNameMapper naming) {
+ public final String toString(DexEncodedMethod method, ClassNameMapper naming) {
return "SynthesizedCode: " + sourceCode.toString();
}
}