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