[vmkit-commits] [vmkit] r86374 - in /vmkit/trunk: include/mvm/GC/GC.h include/mvm/MethodInfo.h include/mvm/VirtualMachine.h lib/JnJVM/VMCore/JavaClass.cpp lib/JnJVM/VMCore/JavaClass.h lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JnjvmClassLoader.cpp lib/Mvm/Compiler/JIT.cpp lib/Mvm/Runtime/MethodInfo.cpp lib/Mvm/Runtime/Object.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Nov 7 06:34:51 PST 2009


Author: geoffray
Date: Sat Nov  7 08:34:50 2009
New Revision: 86374

URL: http://llvm.org/viewvc/llvm-project?rev=86374&view=rev
Log:
Use the MethodInfo class to walk the stack.


Modified:
    vmkit/trunk/include/mvm/GC/GC.h
    vmkit/trunk/include/mvm/MethodInfo.h
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/Mvm/Compiler/JIT.cpp
    vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp
    vmkit/trunk/lib/Mvm/Runtime/Object.cpp

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

==============================================================================
--- vmkit/trunk/include/mvm/GC/GC.h (original)
+++ vmkit/trunk/include/mvm/GC/GC.h Sat Nov  7 08:34:50 2009
@@ -11,18 +11,9 @@
 #ifndef MVM_GC_H
 #define MVM_GC_H
 
-#include <dlfcn.h>
 #include <stdint.h>
 #include <map>
 
-
-#if defined(__MACH__)
-#define SELF_HANDLE RTLD_DEFAULT
-#else
-#define SELF_HANDLE 0
-#endif
-
-
 struct VirtualTable {
   uintptr_t destructor;
   uintptr_t operatorDelete;
@@ -61,38 +52,6 @@
   }
 };
 
-class CamlFrame {
-public:
-  void* ReturnAddress;
-  uint16_t FrameSize;
-  uint16_t NumLiveOffsets;
-  int16_t LiveOffsets[1];
-};
-
-class StaticGCMap {
-public:
-  std::map<void*, void*> GCInfos;
-
-  StaticGCMap() {
-    CamlFrame* currentFrame =
-      (CamlFrame*)dlsym(SELF_HANDLE, "camlVmkitoptimized__frametable");
-    
-    if (currentFrame) {
-      while (true) {
-
-        if (!currentFrame->ReturnAddress) break; 
-        GCInfos.insert(std::make_pair(currentFrame->ReturnAddress,
-                                    currentFrame));
-    
-        currentFrame = (CamlFrame*) ((char*)currentFrame + 
-          (currentFrame->NumLiveOffsets % 2) * sizeof(uint16_t) +
-          currentFrame->NumLiveOffsets * sizeof(uint16_t) +
-          sizeof(void*) + sizeof(uint16_t) + sizeof(uint16_t));
-      }
-    }
-  }
-};
-
 namespace mvm {
 
 class Thread;

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

==============================================================================
--- vmkit/trunk/include/mvm/MethodInfo.h (original)
+++ vmkit/trunk/include/mvm/MethodInfo.h Sat Nov  7 08:34:50 2009
@@ -32,18 +32,27 @@
   }
 };
 
+class CamlFrame {
+public:
+  void* ReturnAddress;
+  uint16_t FrameSize;
+  uint16_t NumLiveOffsets;
+  int16_t LiveOffsets[1];
+};
+
 class CamlMethodInfo : public MethodInfo {
   CamlFrame* CF;
 public:
   virtual void scan(void* TL, void* ip, void* addr);
-  CamlMethodInfo(CamlFrame* C) : CF(C) {}
+  CamlMethodInfo(CamlFrame* C, void* ip);
 };
 
 class StaticCamlMethodInfo : public CamlMethodInfo {
   const char* name;
 public:
   virtual void print(void* ip, void* addr);
-  StaticCamlMethodInfo(CamlFrame* CF, const char* n) : CamlMethodInfo(CF) {
+  StaticCamlMethodInfo(CamlFrame* CF, void* ip, const char* n) :
+    CamlMethodInfo(CF, ip) {
     name = n;
   }
 };

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

==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Sat Nov  7 08:34:50 2009
@@ -95,6 +95,13 @@
  
 };
 
+class SharedStartFunctionMap : public StartFunctionMap {
+public: 
+  static BumpPtrAllocator StaticAllocator;
+  SharedStartFunctionMap();
+};
+
+
 
 // Same values than JikesRVM
 #define INITIAL_QUEUE_SIZE 256
@@ -263,8 +270,6 @@
   static CompilationUnit* initialiseCLIVM();
   static VirtualMachine* createCLIVM(CompilationUnit* C = 0);
 
-  static StaticGCMap GCMap;
-    
 private:
   /// WeakReferencesQueue - The queue of weak references.
   ///
@@ -481,6 +486,7 @@
   StartEndFunctionMap RuntimeFunctions;
   static StartEndFunctionMap SharedRuntimeFunctions;
   StartFunctionMap StaticFunctions;
+  static SharedStartFunctionMap SharedStaticFunctions;
 
   MethodInfo* IPToMethodInfo(void* ip);
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sat Nov  7 08:34:50 2009
@@ -335,7 +335,7 @@
     Jnjvm* vm = JavaThread::get()->getJVM();
     JavaStaticMethodInfo* MI =
       new (classDef->classLoader->allocator, "JavaStaticMethodInfo")
-        JavaStaticMethodInfo(0, this);
+        JavaStaticMethodInfo(0, code, this);
     vm->StaticFunctions.addMethodInfo(MI, code);
     classDef->classLoader->getCompiler()->setMethod(this, ptr, name);
   }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sat Nov  7 08:34:50 2009
@@ -958,8 +958,8 @@
 public:
   virtual void print(void* ip, void* addr);
   
-  JavaStaticMethodInfo(CamlFrame* CF, JavaMethod* M) :
-    mvm::CamlMethodInfo(CF) {
+  JavaStaticMethodInfo(mvm::CamlFrame* CF, void* ip, JavaMethod* M) :
+    mvm::CamlMethodInfo(CF, ip) {
     meth = M;
   }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Sat Nov  7 08:34:50 2009
@@ -306,27 +306,11 @@
   for (std::vector<void*>::iterator i = vals.begin(), e = vals.end(); 
        i != e; ++i) {
     mvm::MethodInfo* MI = vm->IPToMethodInfo(*i);
-    JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
-    assert(meth && "Wrong stack");
-    fprintf(stderr, "; %p in %s.%s\n",  *i,
-            UTF8Buffer(meth->classDef->name).cString(),
-            UTF8Buffer(meth->name).cString());
+    MI->print(*i, 0);
   }
 }
 
 
-#include <dlfcn.h>
-
-static void printFunctionInfo(Jnjvm* vm, void* ip) {
-  Dl_info info;
-  int res = dladdr(ip, &info);
-  if (res != 0) {
-    fprintf(stderr, "; %p in %s\n",  ip, info.dli_sname);
-  } else {
-    fprintf(stderr, "; %p in Unknown method\n", ip);
-  }
-}
-
 void JavaThread::printBacktrace() {
   std::vector<void*>::iterator it = addresses.end();
   Jnjvm* vm = getJVM();
@@ -347,7 +331,8 @@
     // Until we hit the last Java frame.
     do {
       void* ip = FRAME_IP(addr);
-      printFunctionInfo(vm, ip);
+      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+      MI->print(ip, addr);
       oldAddr = addr;
       addr = (void**)addr[0];
     } while (oldAddr != (void**)*it && addr != (void**)*it);
@@ -362,7 +347,8 @@
       --it;
       if (*it == 0) {
         void* ip = FRAME_IP(addr);
-        printFunctionInfo(vm, ip);
+        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+        MI->print(ip, addr);
         addr = (void**)addr[0];
         continue;
       }
@@ -372,14 +358,8 @@
       void* ip = FRAME_IP(addr);
       bool isStub = ((unsigned char*)ip)[0] == 0xCE;
       if (isStub) ip = addr[2];
-      mvm::MethodInfo* MI = getJVM()->IPToMethodInfo(ip);
-      JavaMethod* meth = (JavaMethod*)MI->getMetaInfo();
-      assert(meth && "Wrong stack");
-      fprintf(stderr, "; %p in %s.%s",  ip,
-              UTF8Buffer(meth->classDef->name).cString(),
-              UTF8Buffer(meth->name).cString());
-      if (isStub) fprintf(stderr, " (from stub)");
-      fprintf(stderr, "\n");
+      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
@@ -389,7 +369,8 @@
 
   while (addr < baseSP && addr < addr[0]) {
     void* ip = FRAME_IP(addr);
-    printFunctionInfo(vm, ip);
+    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+    MI->print(ip, addr);
     addr = (void**)addr[0];
   }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sat Nov  7 08:34:50 2009
@@ -1078,7 +1078,7 @@
         JavaMethod& meth = C->virtualMethods[i];
         if (!isAbstract(meth.access) && meth.code) {
           JavaStaticMethodInfo* MI = new (allocator, "JavaStaticMethodInfo")
-            JavaStaticMethodInfo(0, &meth);
+            JavaStaticMethodInfo(0, meth.code, &meth);
           vm->StaticFunctions.addMethodInfo(MI, meth.code);
           M->setMethod(&meth, meth.code, "");
         }
@@ -1088,7 +1088,7 @@
         JavaMethod& meth = C->staticMethods[i];
         if (!isAbstract(meth.access) && meth.code) {
           JavaStaticMethodInfo* MI = new (allocator, "JavaStaticMethodInfo")
-            JavaStaticMethodInfo(0, &meth);
+            JavaStaticMethodInfo(0, meth.code, &meth);
           vm->StaticFunctions.addMethodInfo(MI, meth.code);
           M->setMethod(&meth, meth.code, "");
         }

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

==============================================================================
--- vmkit/trunk/lib/Mvm/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/Mvm/Compiler/JIT.cpp Sat Nov  7 08:34:50 2009
@@ -561,15 +561,8 @@
     // Until we hit the last Java frame.
     do {
       void* ip = FRAME_IP(addr);
-      CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-      if (CF) { 
-        //char* spaddr = (char*)addr + CF->FrameSize + sizeof(void*);
-        uintptr_t spaddr = (uintptr_t)addr[0];
-        for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-          Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-        }
-      }
-      
+      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+      MI->scan(0, ip, addr);
       oldAddr = addr;
       addr = (void**)addr[0];
     } while (oldAddr != (void**)*it && addr != (void**)*it);
@@ -584,14 +577,8 @@
       --it;
       if (*it == 0) {
         void* ip = FRAME_IP(addr);
-        CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-        if (CF) { 
-          //char* spaddr = (char*)addr + CF->FrameSize + sizeof(void*);
-          uintptr_t spaddr = (uintptr_t)addr[0];
-          for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-            Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-          }
-        }
+        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+        MI->scan(0, ip, addr);
         addr = (void**)addr[0];
         continue;
       }
@@ -601,30 +588,8 @@
       void* ip = FRAME_IP(addr);
       bool isStub = ((unsigned char*)ip)[0] == 0xCE;
       if (isStub) ip = addr[2];
-      CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-      if (CF) {
-        //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
-        uintptr_t spaddr = (uintptr_t)addr[0];
-        for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-          Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-        }
-      } else {
-        llvm::GCFunctionInfo* GFI = IPToGCFunctionInfo(vm, ip);
-        
-        if (GFI) {
-          DEBUG(llvm::errs() << GFI->getFunction().getName() << '\n');
-          // All safe points have the same informations currently in LLVM.
-          llvm::GCFunctionInfo::iterator J = GFI->begin();
-          //uintptr_t spaddr = (uintptr_t)addr + GFI->getFrameSize() + sizeof(void*);
-          uintptr_t spaddr = (uintptr_t)addr[0];
-          for (llvm::GCFunctionInfo::live_iterator K = GFI->live_begin(J),
-               KE = GFI->live_end(J); K != KE; ++K) {
-            intptr_t obj = *(intptr_t*)(spaddr + K->StackOffset);
-            // Verify that obj does not come from a JSR bytecode.
-            if (!(obj & 1)) Collector::scanObject((void**)(spaddr + K->StackOffset));
-          }
-        }
-      }
+      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
@@ -635,14 +600,8 @@
 
   while (addr < th->baseSP && addr < addr[0]) {
     void* ip = FRAME_IP(addr);
-    CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-    if (CF) { 
-      //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
-      uintptr_t spaddr = (uintptr_t)addr[0];
-      for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-        Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-      }
-    }
+    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+    MI->scan(0, ip, addr);
     addr = (void**)addr[0];
   }
 

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

==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/MethodInfo.cpp Sat Nov  7 08:34:50 2009
@@ -13,13 +13,21 @@
 
 #include <dlfcn.h>
 
+#if defined(__MACH__)
+#define SELF_HANDLE RTLD_DEFAULT
+#else
+#define SELF_HANDLE 0
+#endif
+
 using namespace mvm;
 
 void CamlMethodInfo::scan(void* TL, void* ip, void* addr) {
-  //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
-  uintptr_t spaddr = ((uintptr_t*)addr)[0];
-  for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-    Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
+  if (CF) {
+    //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
+    uintptr_t spaddr = ((uintptr_t*)addr)[0];
+    for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
+      Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
+    }
   }
 }
 
@@ -63,6 +71,10 @@
         // on something that belongs to our code.
         Functions.insert(std::make_pair(ip, MI));
       }
+    } else {
+      // The method is jitted, and no-one has intercepted its compilation.
+      // Just return the Default MethodInfo object.
+      MI = &DefaultMethodInfo::DM;
     }
   } else {
     MI = I->second;
@@ -79,5 +91,64 @@
   if (MI) return MI;
 
   MI = StaticFunctions.IPToMethodInfo(ip);
+  if (MI != &DefaultMethodInfo::DM) return MI;
+
+  MI = SharedStaticFunctions.IPToMethodInfo(ip);
   return MI;
 }
+
+
+BumpPtrAllocator SharedStartFunctionMap::StaticAllocator;
+
+SharedStartFunctionMap::SharedStartFunctionMap() {
+  CamlFrame* currentFrame =
+    (CamlFrame*)dlsym(SELF_HANDLE, "camlVmkitoptimized__frametable");
+
+  Dl_info info;
+  void* previousPtr = 0;
+  const char* previousName = 0;
+  CamlFrame* previousFrame = currentFrame;
+
+  if (currentFrame) {
+    while (true) {
+      if (!currentFrame->ReturnAddress) break;
+      int res = dladdr(currentFrame->ReturnAddress, &info);
+      if (res) {
+        if (previousPtr) {
+          if (info.dli_saddr == previousPtr) {
+            previousFrame = currentFrame;
+          } else {
+            StaticCamlMethodInfo* MI =
+              new(StaticAllocator, "StaticCamlMethodInfo")
+              StaticCamlMethodInfo(previousFrame, previousPtr, previousName);
+            previousName = info.dli_sname;
+            previousFrame = currentFrame;
+            previousPtr = info.dli_saddr;
+            addMethodInfo(MI, previousPtr);
+          }
+        } else {
+          previousName = info.dli_sname;
+          previousFrame = currentFrame;
+        }
+      }   
+
+      currentFrame = (CamlFrame*) ((char*)currentFrame + 
+        (currentFrame->NumLiveOffsets % 2) * sizeof(uint16_t) +
+        currentFrame->NumLiveOffsets * sizeof(uint16_t) +
+        sizeof(void*) + sizeof(uint16_t) + sizeof(uint16_t));
+    }   
+  }
+}
+
+CamlMethodInfo::CamlMethodInfo(CamlFrame* C, void* ip) {
+  if (!C) {
+    MethodInfo* MI = VirtualMachine::SharedStaticFunctions.IPToMethodInfo(ip);
+    if (MI) {
+      C = ((CamlMethodInfo*)MI)->CF;
+    }
+  }
+  CF = C;
+}
+
+StartEndFunctionMap VirtualMachine::SharedRuntimeFunctions;
+SharedStartFunctionMap VirtualMachine::SharedStaticFunctions;

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

==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Sat Nov  7 08:34:50 2009
@@ -261,9 +261,8 @@
   return free(obj); 
 }
 
-StaticGCMap VirtualMachine::GCMap;
-
 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() :
@@ -277,14 +276,8 @@
     // Until we hit the last Java frame.
     do {
       void* ip = FRAME_IP(addr);
-      CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-      if (CF) { 
-        //char* spaddr = (char*)addr + CF->FrameSize + sizeof(void*);
-        uintptr_t spaddr = (uintptr_t)addr[0];
-        for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-          Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-        }
-      }
+      mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+      MI->scan(0, ip, addr);
       oldAddr = addr;
       addr = (void**)addr[0];
     } while (oldAddr != (void**)*it && addr != (void**)*it);
@@ -299,14 +292,8 @@
       --it;
       if (*it == 0) {
         void* ip = FRAME_IP(addr);
-        CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-        if (CF) { 
-          //char* spaddr = (char*)addr + CF->FrameSize + sizeof(void*);
-          uintptr_t spaddr = (uintptr_t)addr[0];
-          for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-            Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-          }
-        }
+        mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+        MI->scan(0, ip, addr);
         addr = (void**)addr[0];
         continue;
       }
@@ -316,14 +303,8 @@
       void* ip = FRAME_IP(addr);
       bool isStub = ((unsigned char*)ip)[0] == 0xCE;
       if (isStub) ip = addr[2];
-      CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-      if (CF) {
-        //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
-        uintptr_t spaddr = (uintptr_t)addr[0];
-        for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-          Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-        }
-      }
+      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
@@ -334,14 +315,8 @@
 
   while (addr < th->baseSP && addr < addr[0]) {
     void* ip = FRAME_IP(addr);
-    CamlFrame* CF = (CamlFrame*)VirtualMachine::GCMap.GCInfos[ip];
-    if (CF) { 
-      //uintptr_t spaddr = (uintptr_t)addr + CF->FrameSize + sizeof(void*);
-      uintptr_t spaddr = (uintptr_t)addr[0];
-      for (uint16 i = 0; i < CF->NumLiveOffsets; ++i) {
-        Collector::scanObject((void**)(spaddr + CF->LiveOffsets[i]));
-      }
-    }
+    mvm::MethodInfo* MI = vm->IPToMethodInfo(ip);
+    MI->scan(0, ip, addr);
     addr = (void**)addr[0];
   }
 }
@@ -359,5 +334,3 @@
     for(; cur<max; cur++) Collector::scanObject((void**)cur);
   }
 }
-
-StartEndFunctionMap VirtualMachine::SharedRuntimeFunctions;





More information about the vmkit-commits mailing list