Fix method profiling

Moved a couple of things out of MethodTraceState so they don't get
zeroed after being initialized.

Also, rearranged the native method invocation path slightly so the
common case runs uninterrupted.

Change-Id: I0dad007a7f344d93f30444156e67f20bed6606a4
diff --git a/vm/Globals.h b/vm/Globals.h
index e595df3..8bbc6af 100644
--- a/vm/Globals.h
+++ b/vm/Globals.h
@@ -665,6 +665,8 @@
      * State for method-trace profiling.
      */
     MethodTraceState methodTrace;
+    Method*     methodTraceGcMethod;
+    Method*     methodTraceClassPrepMethod;
 
     /*
      * State for emulator tracing.
diff --git a/vm/InitRefs.c b/vm/InitRefs.c
index 242db43..b0cf449 100644
--- a/vm/InitRefs.c
+++ b/vm/InitRefs.c
@@ -566,12 +566,12 @@
     ClassObject* clazz =
         dvmFindClassNoInit("Ldalvik/system/VMDebug;", NULL);
     assert(clazz != NULL);
-    gDvm.methodTrace.gcMethod =
+    gDvm.methodTraceGcMethod =
         dvmFindDirectMethodByDescriptor(clazz, "startGC", "()V");
-    gDvm.methodTrace.classPrepMethod =
+    gDvm.methodTraceClassPrepMethod =
         dvmFindDirectMethodByDescriptor(clazz, "startClassPrep", "()V");
-    if (gDvm.methodTrace.gcMethod == NULL ||
-        gDvm.methodTrace.classPrepMethod == NULL)
+    if (gDvm.methodTraceGcMethod == NULL ||
+        gDvm.methodTraceClassPrepMethod == NULL)
     {
         LOGE("Unable to find startGC or startClassPrep\n");
         return false;
diff --git a/vm/Profile.c b/vm/Profile.c
index f1acc97..d0d24b8 100644
--- a/vm/Profile.c
+++ b/vm/Profile.c
@@ -651,6 +651,8 @@
     int oldOffset, newOffset;
     u1* ptr;
 
+    assert(method != NULL);
+
     /*
      * We can only access the per-thread CPU clock from within the
      * thread, so we have to initialize the base time on the first use.
@@ -808,11 +810,11 @@
  */
 void dvmMethodTraceGCBegin(void)
 {
-    TRACE_METHOD_ENTER(dvmThreadSelf(), gDvm.methodTrace.gcMethod);
+    TRACE_METHOD_ENTER(dvmThreadSelf(), gDvm.methodTraceGcMethod);
 }
 void dvmMethodTraceGCEnd(void)
 {
-    TRACE_METHOD_EXIT(dvmThreadSelf(), gDvm.methodTrace.gcMethod);
+    TRACE_METHOD_EXIT(dvmThreadSelf(), gDvm.methodTraceGcMethod);
 }
 
 /*
@@ -820,11 +822,11 @@
  */
 void dvmMethodTraceClassPrepBegin(void)
 {
-    TRACE_METHOD_ENTER(dvmThreadSelf(), gDvm.methodTrace.classPrepMethod);
+    TRACE_METHOD_ENTER(dvmThreadSelf(), gDvm.methodTraceClassPrepMethod);
 }
 void dvmMethodTraceClassPrepEnd(void)
 {
-    TRACE_METHOD_EXIT(dvmThreadSelf(), gDvm.methodTrace.classPrepMethod);
+    TRACE_METHOD_EXIT(dvmThreadSelf(), gDvm.methodTraceClassPrepMethod);
 }
 
 
diff --git a/vm/Profile.h b/vm/Profile.h
index 016984d..0cd6495 100644
--- a/vm/Profile.h
+++ b/vm/Profile.h
@@ -36,10 +36,6 @@
  * most of this per-thread.
  */
 typedef struct MethodTraceState {
-    /* these are set during VM init */
-    Method* gcMethod;
-    Method* classPrepMethod;
-
     /* active state */
     pthread_mutex_t startStopLock;
     pthread_cond_t  threadExitCond;
diff --git a/vm/mterp/armv5te/footer.S b/vm/mterp/armv5te/footer.S
index 73e8efa..5c5c5ce 100644
--- a/vm/mterp/armv5te/footer.S
+++ b/vm/mterp/armv5te/footer.S
@@ -624,7 +624,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     1f                          @ skip if not
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r1, r6
+    mov     r1, rSELF
     @ r0=methodToCall, r1=rSELF
     bl      dvmFastMethodTraceEnter
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
@@ -699,18 +699,7 @@
 #endif
 
     ands    lr, #kSubModeMethodTrace    @ method tracing?
-    beq     110f                        @ hop if not
-    @ r2=JNIMethod, r6=rSELF
-    stmfd   sp!, {r2,r6}
-
-    mov     lr, pc                      @ set return addr
-    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
-
-    @ r0=JNIMethod, r1=rSELF
-    ldmfd   sp!, {r0-r1}
-    bl      dvmFastNativeMethodTraceExit
-    b       220f
-110:
+    bne     330f                        @ hop if so
     mov     lr, pc                      @ set return addr
     ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
 220:
@@ -737,6 +726,18 @@
     GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
+330:
+    @ r2=JNIMethod, r6=rSELF
+    stmfd   sp!, {r2,r6}
+
+    mov     lr, pc                      @ set return addr
+    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
+
+    @ r0=JNIMethod, r1=rSELF
+    ldmfd   sp!, {r0-r1}
+    bl      dvmFastNativeMethodTraceExit
+    b       220b
+
 .LstackOverflow:    @ r0=methodToCall
     mov     r1, r0                      @ r1<- methodToCall
     mov     r0, rSELF                   @ r0<- self
@@ -794,7 +795,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     333f
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r0, r6
+    mov     r0, rSELF
     @ r0=rSELF
     bl      dvmFastJavaMethodTraceExit
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
diff --git a/vm/mterp/out/InterpAsm-armv5te-vfp.S b/vm/mterp/out/InterpAsm-armv5te-vfp.S
index 19c152f..bc58367 100644
--- a/vm/mterp/out/InterpAsm-armv5te-vfp.S
+++ b/vm/mterp/out/InterpAsm-armv5te-vfp.S
@@ -20950,7 +20950,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     1f                          @ skip if not
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r1, r6
+    mov     r1, rSELF
     @ r0=methodToCall, r1=rSELF
     bl      dvmFastMethodTraceEnter
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
@@ -21025,18 +21025,7 @@
 #endif
 
     ands    lr, #kSubModeMethodTrace    @ method tracing?
-    beq     110f                        @ hop if not
-    @ r2=JNIMethod, r6=rSELF
-    stmfd   sp!, {r2,r6}
-
-    mov     lr, pc                      @ set return addr
-    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
-
-    @ r0=JNIMethod, r1=rSELF
-    ldmfd   sp!, {r0-r1}
-    bl      dvmFastNativeMethodTraceExit
-    b       220f
-110:
+    bne     330f                        @ hop if so
     mov     lr, pc                      @ set return addr
     ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
 220:
@@ -21063,6 +21052,18 @@
     GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
+330:
+    @ r2=JNIMethod, r6=rSELF
+    stmfd   sp!, {r2,r6}
+
+    mov     lr, pc                      @ set return addr
+    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
+
+    @ r0=JNIMethod, r1=rSELF
+    ldmfd   sp!, {r0-r1}
+    bl      dvmFastNativeMethodTraceExit
+    b       220b
+
 .LstackOverflow:    @ r0=methodToCall
     mov     r1, r0                      @ r1<- methodToCall
     mov     r0, rSELF                   @ r0<- self
@@ -21120,7 +21121,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     333f
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r0, r6
+    mov     r0, rSELF
     @ r0=rSELF
     bl      dvmFastJavaMethodTraceExit
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
diff --git a/vm/mterp/out/InterpAsm-armv5te.S b/vm/mterp/out/InterpAsm-armv5te.S
index a1977ee..47a1cbf 100644
--- a/vm/mterp/out/InterpAsm-armv5te.S
+++ b/vm/mterp/out/InterpAsm-armv5te.S
@@ -21408,7 +21408,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     1f                          @ skip if not
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r1, r6
+    mov     r1, rSELF
     @ r0=methodToCall, r1=rSELF
     bl      dvmFastMethodTraceEnter
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
@@ -21483,18 +21483,7 @@
 #endif
 
     ands    lr, #kSubModeMethodTrace    @ method tracing?
-    beq     110f                        @ hop if not
-    @ r2=JNIMethod, r6=rSELF
-    stmfd   sp!, {r2,r6}
-
-    mov     lr, pc                      @ set return addr
-    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
-
-    @ r0=JNIMethod, r1=rSELF
-    ldmfd   sp!, {r0-r1}
-    bl      dvmFastNativeMethodTraceExit
-    b       220f
-110:
+    bne     330f                        @ hop if so
     mov     lr, pc                      @ set return addr
     ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
 220:
@@ -21521,6 +21510,18 @@
     GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
+330:
+    @ r2=JNIMethod, r6=rSELF
+    stmfd   sp!, {r2,r6}
+
+    mov     lr, pc                      @ set return addr
+    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
+
+    @ r0=JNIMethod, r1=rSELF
+    ldmfd   sp!, {r0-r1}
+    bl      dvmFastNativeMethodTraceExit
+    b       220b
+
 .LstackOverflow:    @ r0=methodToCall
     mov     r1, r0                      @ r1<- methodToCall
     mov     r0, rSELF                   @ r0<- self
@@ -21578,7 +21579,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     333f
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r0, r6
+    mov     r0, rSELF
     @ r0=rSELF
     bl      dvmFastJavaMethodTraceExit
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
diff --git a/vm/mterp/out/InterpAsm-armv7-a-neon.S b/vm/mterp/out/InterpAsm-armv7-a-neon.S
index c7d3707..d0bb6c3 100644
--- a/vm/mterp/out/InterpAsm-armv7-a-neon.S
+++ b/vm/mterp/out/InterpAsm-armv7-a-neon.S
@@ -20888,7 +20888,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     1f                          @ skip if not
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r1, r6
+    mov     r1, rSELF
     @ r0=methodToCall, r1=rSELF
     bl      dvmFastMethodTraceEnter
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
@@ -20963,18 +20963,7 @@
 #endif
 
     ands    lr, #kSubModeMethodTrace    @ method tracing?
-    beq     110f                        @ hop if not
-    @ r2=JNIMethod, r6=rSELF
-    stmfd   sp!, {r2,r6}
-
-    mov     lr, pc                      @ set return addr
-    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
-
-    @ r0=JNIMethod, r1=rSELF
-    ldmfd   sp!, {r0-r1}
-    bl      dvmFastNativeMethodTraceExit
-    b       220f
-110:
+    bne     330f                        @ hop if so
     mov     lr, pc                      @ set return addr
     ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
 220:
@@ -21001,6 +20990,18 @@
     GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
+330:
+    @ r2=JNIMethod, r6=rSELF
+    stmfd   sp!, {r2,r6}
+
+    mov     lr, pc                      @ set return addr
+    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
+
+    @ r0=JNIMethod, r1=rSELF
+    ldmfd   sp!, {r0-r1}
+    bl      dvmFastNativeMethodTraceExit
+    b       220b
+
 .LstackOverflow:    @ r0=methodToCall
     mov     r1, r0                      @ r1<- methodToCall
     mov     r0, rSELF                   @ r0<- self
@@ -21058,7 +21059,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     333f
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r0, r6
+    mov     r0, rSELF
     @ r0=rSELF
     bl      dvmFastJavaMethodTraceExit
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
diff --git a/vm/mterp/out/InterpAsm-armv7-a.S b/vm/mterp/out/InterpAsm-armv7-a.S
index 4756775..d5dfb48 100644
--- a/vm/mterp/out/InterpAsm-armv7-a.S
+++ b/vm/mterp/out/InterpAsm-armv7-a.S
@@ -20888,7 +20888,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     1f                          @ skip if not
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r1, r6
+    mov     r1, rSELF
     @ r0=methodToCall, r1=rSELF
     bl      dvmFastMethodTraceEnter
     ldmfd   sp!, {r0-r3}                @ restore r0-r3
@@ -20963,18 +20963,7 @@
 #endif
 
     ands    lr, #kSubModeMethodTrace    @ method tracing?
-    beq     110f                        @ hop if not
-    @ r2=JNIMethod, r6=rSELF
-    stmfd   sp!, {r2,r6}
-
-    mov     lr, pc                      @ set return addr
-    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
-
-    @ r0=JNIMethod, r1=rSELF
-    ldmfd   sp!, {r0-r1}
-    bl      dvmFastNativeMethodTraceExit
-    b       220f
-110:
+    bne     330f                        @ hop if so
     mov     lr, pc                      @ set return addr
     ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
 220:
@@ -21001,6 +20990,18 @@
     GET_INST_OPCODE(ip)                 @ extract opcode from rINST
     GOTO_OPCODE(ip)                     @ jump to next instruction
 
+330:
+    @ r2=JNIMethod, r6=rSELF
+    stmfd   sp!, {r2,r6}
+
+    mov     lr, pc                      @ set return addr
+    ldr     pc, [r2, #offMethod_nativeFunc] @ pc<- methodToCall->nativeFunc
+
+    @ r0=JNIMethod, r1=rSELF
+    ldmfd   sp!, {r0-r1}
+    bl      dvmFastNativeMethodTraceExit
+    b       220b
+
 .LstackOverflow:    @ r0=methodToCall
     mov     r1, r0                      @ r1<- methodToCall
     mov     r0, rSELF                   @ r0<- self
@@ -21058,7 +21059,7 @@
     ands    lr, #kSubModeMethodTrace    @ method tracing?
     beq     333f
     stmfd   sp!, {r0-r3}                @ preserve r0-r3
-    mov     r0, r6
+    mov     r0, rSELF
     @ r0=rSELF
     bl      dvmFastJavaMethodTraceExit
     ldmfd   sp!, {r0-r3}                @ restore r0-r3