summaryrefslogtreecommitdiffstats
path: root/vm/interp
diff options
context:
space:
mode:
authorbuzbee <buzbee@google.com>2011-03-14 12:25:24 -0700
committerbuzbee <buzbee@google.com>2011-03-14 12:25:24 -0700
commitd82cebc13cf8ff110f2ad1a299782c9d1e8aada6 (patch)
tree8adda7f37843cb4a25231e3eb520ed8ce50ee302 /vm/interp
parent8f28ebb65f231d2134f52f5d140d8524f7b85ed7 (diff)
downloadandroid_dalvik-d82cebc13cf8ff110f2ad1a299782c9d1e8aada6.tar.gz
android_dalvik-d82cebc13cf8ff110f2ad1a299782c9d1e8aada6.tar.bz2
android_dalvik-d82cebc13cf8ff110f2ad1a299782c9d1e8aada6.zip
Add trace description dump routine for debugging
New dvmJitDumpTraceDescription prints out a trace descriptor. Change-Id: I613fe17cf75e4ee26ad976b15c2cf89ce4552192
Diffstat (limited to 'vm/interp')
-rw-r--r--vm/interp/Jit.c42
-rw-r--r--vm/interp/Jit.h1
2 files changed, 43 insertions, 0 deletions
diff --git a/vm/interp/Jit.c b/vm/interp/Jit.c
index 1a5a10d12..6a4615d3e 100644
--- a/vm/interp/Jit.c
+++ b/vm/interp/Jit.c
@@ -639,6 +639,45 @@ static JitEntry *lookupAndAdd(const u2* dPC, bool callerLocked,
return (idx == chainEndMarker) ? NULL : &gDvmJit.pJitEntryTable[idx];
}
+/* Dump a trace description */
+void dvmJitDumpTraceDesc(JitTraceDescription *trace)
+{
+ int i;
+ bool done = false;
+ const u2* dpc;
+ const u2* dpcBase;
+ int curFrag = 0;
+ LOGD("===========================================");
+ LOGD("Trace dump 0x%x, Method %s starting offset 0x%x",(int)trace,
+ trace->method->name,trace->trace[curFrag].info.frag.startOffset);
+ dpcBase = trace->method->insns;
+ while (!done) {
+ DecodedInstruction decInsn;
+ if (trace->trace[curFrag].isCode) {
+ LOGD("Frag[%d]- Insts: %d, start: 0x%x, hint: 0x%x, end: %d",
+ curFrag, trace->trace[curFrag].info.frag.numInsts,
+ trace->trace[curFrag].info.frag.startOffset,
+ trace->trace[curFrag].info.frag.hint,
+ trace->trace[curFrag].info.frag.runEnd);
+ dpc = dpcBase + trace->trace[curFrag].info.frag.startOffset;
+ for (i=0; i<trace->trace[curFrag].info.frag.numInsts; i++) {
+ dexDecodeInstruction(dpc, &decInsn);
+ LOGD(" 0x%04x - %s",(dpc-dpcBase),
+ dexGetOpcodeName(decInsn.opcode));
+ dpc += dexGetWidthFromOpcode(decInsn.opcode);
+ }
+ if (trace->trace[curFrag].info.frag.runEnd) {
+ done = true;
+ }
+ } else {
+ LOGD("Frag[%d]- META info: 0x%08x", curFrag,
+ (int)trace->trace[curFrag].info.meta);
+ }
+ curFrag++;
+ }
+ LOGD("-------------------------------------------");
+}
+
/*
* Append the class ptr of "this" and the current method ptr to the current
* trace. That is, the trace runs will contain the following components:
@@ -898,6 +937,9 @@ int dvmCheckJit(const u2* pc, Thread* self, const ClassObject* thisClass,
if (dvmCompilerWorkEnqueue(
self->currTraceHead,kWorkOrderTrace,desc)) {
/* Work order successfully enqueued */
+#if defined(SHOW_TRACE)
+ dvmJitDumpTraceDesc(desc);
+#endif
if (gDvmJit.blockingMode) {
dvmCompilerDrainQueue();
}
diff --git a/vm/interp/Jit.h b/vm/interp/Jit.h
index 9597f2f16..6d5d9711e 100644
--- a/vm/interp/Jit.h
+++ b/vm/interp/Jit.h
@@ -161,5 +161,6 @@ JitTraceCounter_t *dvmJitNextTraceCounter(void);
void dvmJitTraceProfilingOff(void);
void dvmJitTraceProfilingOn(void);
void dvmJitChangeProfileMode(TraceProfilingModes newState);
+void dvmJitDumpTraceDesc(JitTraceDescription *trace);
#endif /*_DALVIK_INTERP_JIT*/