[vmkit-commits] [vmkit] r86388 - in /vmkit/trunk: include/jnjvm/ include/mvm/ include/mvm/GC/ include/mvm/Threads/ lib/JnJVM/Classpath/ lib/JnJVM/Compiler/ lib/JnJVM/LLVMRuntime/ lib/JnJVM/VMCore/ lib/Mvm/CommonThread/ lib/Mvm/Compiler/ lib/Mvm/Runtime/

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Nov 7 09:42:29 PST 2009


Author: geoffray
Date: Sat Nov  7 11:42:28 2009
New Revision: 86388

URL: http://llvm.org/viewvc/llvm-project?rev=86388&view=rev
Log:
Change JNIFrame into KnownFrame, and put the information in
mvm::Thread. Now the scanner and the stack printer can be shared
by all VMs.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/include/mvm/GC/GC.h
    vmkit/trunk/include/mvm/JIT.h
    vmkit/trunk/include/mvm/Threads/Thread.h
    vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default-thread.ll
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-mmtk-thread.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/Mvm/CommonThread/Sigsegv.cpp
    vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
    vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sat Nov  7 11:42:28 2009
@@ -499,12 +499,6 @@
 
 };
 
-class JavaJITStackScanner : public mvm::JITStackScanner {
-public:
-  virtual llvm::GCFunctionInfo* IPToGCFunctionInfo(mvm::VirtualMachine* vm,
-                                                   void* ip);
-};
-
 class JavaJITMethodInfo : public mvm::JITMethodInfo {
 protected:
   JavaMethod* meth;
@@ -580,7 +574,7 @@
 #ifdef WITH_LLVM_GCC
   virtual mvm::StackScanner* createStackScanner() {
     if (useCooperativeGC())
-      return new JavaJITStackScanner();
+      return new mvm::PreciseStackScanner();
     
     return new mvm::UnpreciseStackScanner();
   }

Modified: vmkit/trunk/include/mvm/GC/GC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/GC/GC.h?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/GC/GC.h (original)
+++ vmkit/trunk/include/mvm/GC/GC.h Sat Nov  7 11:42:28 2009
@@ -67,7 +67,7 @@
   virtual void scanStack(mvm::Thread* th);
 };
 
-class CamlStackScanner : public StackScanner {
+class PreciseStackScanner : public StackScanner {
 public:
   virtual void scanStack(mvm::Thread* th);
 };

Modified: vmkit/trunk/include/mvm/JIT.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/JIT.h?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/JIT.h (original)
+++ vmkit/trunk/include/mvm/JIT.h Sat Nov  7 11:42:28 2009
@@ -202,13 +202,6 @@
    static const char* getHostTriple();
 };
 
-class JITStackScanner : public StackScanner {
-public:
-  virtual void scanStack(mvm::Thread* th);
-  virtual llvm::GCFunctionInfo* IPToGCFunctionInfo(VirtualMachine* vm,
-                                                   void* ip) = 0;
-};
-
 class JITMethodInfo : public MethodInfo {
   llvm::GCFunctionInfo* GCInfo;
 public:

Modified: vmkit/trunk/include/mvm/Threads/Thread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/Threads/Thread.h?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/include/mvm/Threads/Thread.h (original)
+++ vmkit/trunk/include/mvm/Threads/Thread.h Sat Nov  7 11:42:28 2009
@@ -111,6 +111,13 @@
 #endif
 
 
+class KnownFrame {
+public:
+  KnownFrame* previousFrame;
+  void* currentFP;
+};
+
+
 /// Thread - This class is the base of custom virtual machines' Thread classes.
 /// It provides static functions to manage threads. An instance of this class
 /// contains all thread-specific informations.
@@ -329,10 +336,9 @@
     return cpt;
   }
 
-  /// printBacktraceAfterSignal - Print the backtrace during a signal
-  /// handler.
+  /// printBacktrace - Print the backtrace.
   ///
-  virtual void printBacktraceAfterSignal() {}
+  void printBacktrace();
 
   /// addresses - The list of return addresses which represent native/app cross
   /// calls.
@@ -350,6 +356,10 @@
     addresses.pop_back();
   }
 
+  /// lastKnownFrame - The last frame that we know of, before resuming to JNI.
+  ///
+  KnownFrame* lastKnownFrame;
+
 };
 
 

Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMRuntime.inc Sat Nov  7 11:42:28 2009
@@ -83,7 +83,7 @@
 typedef int (*onLoad_t)(const void**, void*);
 extern "C" void  jnjvmEndJNI(uint32** old, void** oldBuf);
 extern "C" void  jnjvmStartJNI(uint32* num, uint32** old, void* newBuf,
-                               void** oldBuf, JNIFrame* Frame);
+                               void** oldBuf, mvm::KnownFrame* Frame);
 
 extern "C" void callOnLoad(void* res, JnjvmClassLoader* loader, Jnjvm* vm)
   __attribute__ ((noinline));
@@ -99,7 +99,7 @@
     uint32* old = 0;
     void* oldBuf = 0;
     jmp_buf buf;
-    JNIFrame Frame(0, 0);
+    mvm::KnownFrame Frame;
     
     if (setjmp((jumpbuf_t)buf) == 0) {
       // Push an unmeaningful value in the addresses field to let the

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Sat Nov  7 11:42:28 2009
@@ -296,13 +296,6 @@
   return res;
 }
 
-llvm::GCFunctionInfo*
-JavaJITStackScanner::IPToGCFunctionInfo(mvm::VirtualMachine* vm, void* ip) {
-  mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-  JavaMethod* method = (JavaMethod*)MI->getMetaInfo();
-  return method->getInfo<LLVMMethodInfo>()->GCInfo;
-}
-
 // Helper function to run an executable with a JIT
 extern "C" int StartJnjvmWithJIT(int argc, char** argv, char* mainClass) {
   llvm::llvm_shutdown_obj X; 

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default-thread.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default-thread.ll?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default-thread.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default-thread.ll Sat Nov  7 11:42:28 2009
@@ -13,5 +13,6 @@
 ;;; Field 10: internalThreadID
 ;;; field 11: routine
 ;;; field 12: addresses
+;;; field 13: lastKnownFrame
 %MutatorThread = type { %VT*, %JavaThread*, %JavaThread*, i8*, i8*, i8*, i1, i1,
-                        i1, i8*, i8*, i8*, %Vector}
+                        i1, i8*, i8*, i8*, %Vector, i8*}

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-mmtk-thread.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-mmtk-thread.ll?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-mmtk-thread.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-mmtk-thread.ll Sat Nov  7 11:42:28 2009
@@ -14,8 +14,9 @@
 ;;; Field 10: internalThreadID
 ;;; field 11: routine
 ;;; field 12: addresses
-;;; field 13: allocator
-;;; field 14: MutatorContext
-;;; field 15: realRoutine
+;;; field 13: lastKnownFrame
+;;; field 14: allocator
+;;; field 15: MutatorContext
+;;; field 16: realRoutine
 %MutatorThread = type { %VT*, %JavaThread*, %JavaThread*, i8*, i8*, i8*, i1, i1,
-                        i1, i8*, i8*, i8*, %Vector, %BumpPtrAllocator, i8*, i8*}
+                        i1, i8*, i8*, i8*, %Vector, i8*, %BumpPtrAllocator, i8*, i8*}

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Sat Nov  7 11:42:28 2009
@@ -396,14 +396,14 @@
 extern "C" void** jnjvmStartJNI(uint32* localReferencesNumber,
                                 uint32** oldLocalReferencesNumber,
                                 void* newBuffer, void** oldBuffer,
-                                JNIFrame* Frame) 
+                                mvm::KnownFrame* Frame) 
   __attribute__((noinline));
 
 // Never throws. Does not call Java code. Can not yied a GC.
 extern "C" void** jnjvmStartJNI(uint32* localReferencesNumber,
                                 uint32** oldLocalReferencesNumber,
                                 void* newBuffer, void** oldBuffer,
-                                JNIFrame* Frame) {
+                                mvm::KnownFrame* Frame) {
   
   JavaThread* th = JavaThread::get();
  

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Sat Nov  7 11:42:28 2009
@@ -312,75 +312,6 @@
 }
 
 
-void JavaThread::printBacktrace() {
-  std::vector<void*>::iterator it = addresses.end();
-  Jnjvm* vm = getJVM();
-
-  assert((mvm::Thread::get() == this || waitOnSP()) &&
-         "No last sp on foreign thread");
-  
-  void** addr = mvm::Thread::get() == this ? (void**)FRAME_PTR() :
-                                             (void**)waitOnSP();
-  assert(addr && "No address to start with");
-
-  void** oldAddr = addr;
-
-  // Loop until we cross the first Java frame.
-  while (it != addresses.begin()) {
-    
-    --it;
-    // Until we hit the last Java frame.
-    do {
-      void* ip = FRAME_IP(addr);
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->print(ip, addr);
-      oldAddr = addr;
-      addr = (void**)addr[0];
-    } while (oldAddr != (void**)*it && addr != (void**)*it);
-    
-    // Set the iterator to the next native -> Java call.
-    --it;
-
-    // See if we're from JNI.
-    if (*it == 0) {
-      --it;
-      addr = (void**)*it;
-      --it;
-      if (*it == 0) {
-        void* ip = FRAME_IP(addr);
-        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-        MI->print(ip, addr);
-        addr = (void**)addr[0];
-        continue;
-      }
-    }
-
-    do {
-      void* ip = FRAME_IP(addr);
-      bool isStub = ((unsigned char*)ip)[0] == 0xCE;
-      if (isStub) ip = addr[2];
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->print(ip, addr);
-      addr = (void**)addr[0];
-      // End walking the stack when we cross a native -> Java call. Here
-      // the iterator points to a native -> Java call. We dereference addr twice
-      // because a native -> Java call always contains the signature function.
-    } while (((void***)addr)[0][0] != *it);
-  }
-
-  while (addr < baseSP && addr < addr[0]) {
-    void* ip = FRAME_IP(addr);
-    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-    MI->print(ip, addr);
-    addr = (void**)addr[0];
-  }
-
-}
-
-void JavaThread::printBacktraceAfterSignal() {
-  printBacktrace();
-}
-
 JavaObject** JNILocalReferences::addJNIReference(JavaThread* th,
                                                  JavaObject* obj) {
   llvm_gcroot(obj, 0);

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Sat Nov  7 11:42:28 2009
@@ -48,7 +48,10 @@
   th->leaveUncooperativeCode(); \
   th->addresses.push_back(0); \
   th->startNative(0); \
-  JNIFrame Frame(th->lastKnownFrame, th->addresses.back()); \
+  mvm::KnownFrame Frame; \
+  Frame.previousFrame = th->lastKnownFrame; \
+  Frame.currentFP = th->addresses.back(); \
+  th->lastKnownFrame = &Frame; \
   try {
 
 #define END_JNI_EXCEPTION \
@@ -72,14 +75,6 @@
   return; } \
 
 
-class JNIFrame {
-public:
-  JNIFrame* previousFrame;
-  void* currentFP;
-
-  JNIFrame(JNIFrame* P, void* C) : previousFrame(P), currentFP(C) {}
-};
-
 /// JavaThread - This class is the internal representation of a Java thread.
 /// It maintains thread-specific information such as its state, the current
 /// exception if there is one, the layout of the stack, etc.
@@ -145,10 +140,6 @@
   ///
   uint32_t* currentAddedReferences;
 
-  /// lastKnownFrame - The last frame that we know of, before resuming to JNI.
-  ///
-  JNIFrame* lastKnownFrame;
-
   /// localJNIRefs - List of local JNI references.
   ///
   JNILocalReferences* localJNIRefs;
@@ -299,16 +290,6 @@
   ///
   JavaObject* getNonNullClassLoader();
     
-  /// printBacktrace - Prints the backtrace of this thread.
-  ///
-  void printBacktrace() __attribute__ ((noinline));
-  
-  /// printBacktraceAfterSignal - Prints the backtrace of this thread while
-  /// in a signal handler.
-  ///
-  virtual void printBacktraceAfterSignal() __attribute__ ((noinline));
-  
-  
   /// printJavaBacktrace - Prints the backtrace of this thread. Only prints
   /// the Java methods on the stack.
   ///

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sat Nov  7 11:42:28 2009
@@ -1422,7 +1422,7 @@
 public:
 #ifdef WITH_LLVM_GCC
   virtual mvm::StackScanner* createStackScanner() {
-    return new mvm::CamlStackScanner();
+    return new mvm::PreciseStackScanner();
   }
 #endif
 };

Modified: vmkit/trunk/lib/Mvm/CommonThread/Sigsegv.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/Sigsegv.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/Sigsegv.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/Sigsegv.cpp Sat Nov  7 11:42:28 2009
@@ -57,7 +57,7 @@
     fprintf(stderr, "I received a SIGSEGV: either the VM code or an external\n"
                     "native method is bogus. Aborting...\n");
   }
-  th->printBacktraceAfterSignal();
+  th->printBacktrace();
   abort();
   
 #if defined(__i386__)

Modified: vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp (original)
+++ vmkit/trunk/lib/Mvm/CommonThread/ctthread.cpp Sat Nov  7 11:42:28 2009
@@ -61,6 +61,29 @@
   addresses.push_back(cur);
 }
 
+void Thread::printBacktrace() {
+  mvm::VirtualMachine* vm = MyVM;
+
+  void** addr = mvm::Thread::get() == this ? 
+    (void**)FRAME_PTR() : (void**)waitOnSP();
+  assert(addr && "No address to start with");
+
+  KnownFrame* currentKnownFrame = lastKnownFrame;
+
+  while (addr < baseSP && addr < addr[0]) {
+    
+    if (currentKnownFrame && addr == currentKnownFrame->currentFP) {
+      currentKnownFrame = currentKnownFrame->previousFrame;
+    }
+
+    void* ip = FRAME_IP(addr);
+    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+    MI->print(ip, addr);
+    addr = (void**)addr[0];
+  }
+}
+
+
 uintptr_t Thread::baseAddr = 0;
 
 // These could be set at runtime.

Modified: vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Compiler/JIT.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Sat Nov  7 11:42:28 2009
@@ -543,70 +543,6 @@
   }
 }
 
-void JITStackScanner::scanStack(mvm::Thread* th) {
-  std::vector<void*>::iterator it = th->addresses.end();
-  VirtualMachine* vm = th->MyVM;
-
-  void** addr = mvm::Thread::get() == th ? 
-    (void**)FRAME_PTR() : (void**)th->waitOnSP();
-  assert(addr && "No address to start with");
-  void** oldAddr = addr;
-  DEBUG(fprintf(stderr, "%p trace %p\n", (void*)mvm::Thread::get(), (void*)th));
-  DEBUG(th->printBacktraceAfterSignal());
-
-  // Loop until we cross the first Java frame.
-  while (it != th->addresses.begin()) {
-    
-    --it;
-    // Until we hit the last Java frame.
-    do {
-      void* ip = FRAME_IP(addr);
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->scan(0, ip, addr);
-      oldAddr = addr;
-      addr = (void**)addr[0];
-    } while (oldAddr != (void**)*it && addr != (void**)*it);
-    
-    // Set the iterator to the next native -> Java call.
-    --it;
-
-    // See if we're from JNI.
-    if (*it == 0) {
-      --it;
-      addr = (void**)*it;
-      --it;
-      if (*it == 0) {
-        void* ip = FRAME_IP(addr);
-        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-        MI->scan(0, ip, addr);
-        addr = (void**)addr[0];
-        continue;
-      }
-    }
-
-    do {
-      void* ip = FRAME_IP(addr);
-      bool isStub = ((unsigned char*)ip)[0] == 0xCE;
-      if (isStub) ip = addr[2];
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->scan(0, ip, addr);
-      
-      addr = (void**)addr[0];
-      // End walking the stack when we cross a native -> Java call. Here
-      // the iterator points to a native -> Java call. We dereference addr twice
-      // because a native -> Java call always contains the signature function.
-    } while (((void***)addr)[0][0] != *it);
-  }
-
-  while (addr < th->baseSP && addr < addr[0]) {
-    void* ip = FRAME_IP(addr);
-    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-    MI->scan(0, ip, addr);
-    addr = (void**)addr[0];
-  }
-
-}
-
 void JITMethodInfo::scan(void* TL, void* ip, void* addr) {
   if (GCInfo) {
     DEBUG(llvm::errs() << GCInfo->getFunction().getName() << '\n');

Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=86388&r1=86387&r2=86388&view=diff

==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Sat Nov  7 11:42:28 2009
@@ -261,59 +261,21 @@
   return free(obj); 
 }
 
-void CamlStackScanner::scanStack(mvm::Thread* th) {
-  VirtualMachine* vm = th->MyVM;
-  std::vector<void*>::iterator it = th->addresses.end();
-
-  void** addr = mvm::Thread::get() == th ? (void**)FRAME_PTR() :
-                                           (void**)th->waitOnSP();
-  void** oldAddr = addr;
+void PreciseStackScanner::scanStack(mvm::Thread* th) {
+  mvm::VirtualMachine* vm = th->MyVM;
 
-  // Loop until we cross the first Java frame.
-  while (it != th->addresses.begin()) {
-    
-    --it;
-    // Until we hit the last Java frame.
-    do {
-      void* ip = FRAME_IP(addr);
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->scan(0, ip, addr);
-      oldAddr = addr;
-      addr = (void**)addr[0];
-    } while (oldAddr != (void**)*it && addr != (void**)*it);
-    
-    // Set the iterator to the next native -> Java call.
-    --it;
+  void** addr = mvm::Thread::get() == th ? 
+    (void**)FRAME_PTR() : (void**)th->waitOnSP();
+  assert(addr && "No address to start with");
 
-    // See if we're from JNI.
-    if (*it == 0) {
-      --it;
-      addr = (void**)*it;
-      --it;
-      if (*it == 0) {
-        void* ip = FRAME_IP(addr);
-        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-        MI->scan(0, ip, addr);
-        addr = (void**)addr[0];
-        continue;
-      }
-    }
-
-    do {
-      void* ip = FRAME_IP(addr);
-      bool isStub = ((unsigned char*)ip)[0] == 0xCE;
-      if (isStub) ip = addr[2];
-      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
-      MI->scan(0, ip, addr);
-      
-      addr = (void**)addr[0];
-      // End walking the stack when we cross a native -> Java call. Here
-      // the iterator points to a native -> Java call. We dereference addr twice
-      // because a native -> Java call always contains the signature function.
-    } while (((void***)addr)[0][0] != *it);
-  }
+  KnownFrame* currentKnownFrame = th->lastKnownFrame;
 
   while (addr < th->baseSP && addr < addr[0]) {
+    
+    if (currentKnownFrame && addr == currentKnownFrame->currentFP) {
+      currentKnownFrame = currentKnownFrame->previousFrame;
+    }
+
     void* ip = FRAME_IP(addr);
     mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
     MI->scan(0, ip, addr);
@@ -321,7 +283,6 @@
   }
 }
 
-
 void UnpreciseStackScanner::scanStack(mvm::Thread* th) {
   register unsigned int  **max = (unsigned int**)(void*)th->baseSP;
   if (mvm::Thread::get() != th) {





More information about the vmkit-commits mailing list