Add runtime support for method based compilation.

Enhanced code cache management to accommodate both trace and method
compilations. Also implemented a hacky dispatch routine for virtual
leaf methods.

Microbenchmark showed 3x speedup in leaf method invocation.

Change-Id: I79d95b7300ba993667b3aa221c1df9c7b0583521
diff --git a/vm/compiler/Dataflow.c b/vm/compiler/Dataflow.c
index ba1b8fd..d935fd5 100644
--- a/vm/compiler/Dataflow.c
+++ b/vm/compiler/Dataflow.c
@@ -1592,7 +1592,7 @@
     char buffer[256];
     int opcode = insn->opcode;
     int dfAttributes = dvmCompilerDataFlowAttributes[opcode];
-    int flags = dexGetFlagsFromOpcode(insn->opcode);
+    int flags;
     char *ret;
 
     buffer[0] = 0;
@@ -1603,8 +1603,10 @@
         else {
             sprintf(buffer, "Opcode 0x%x", opcode);
         }
+        flags = 0;
     } else {
         strcpy(buffer, dexGetOpcodeName(opcode));
+        flags = dexGetFlagsFromOpcode(insn->opcode);
     }
 
     if (note)
@@ -1630,7 +1632,8 @@
                 offset = (int) insn->vA;
                 break;
             default:
-                LOGE("Unexpected branch format: %d", dalvikFormat);
+                LOGE("Unexpected branch format %d / opcode %#x", dalvikFormat,
+                     opcode);
                 dvmAbort();
                 break;
         }