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();
   }
 }