[llvm-commits] [vmkit] r50101 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaClass.cpp JavaClass.h JavaConstantPool.cpp JavaIsolate.cpp JavaJIT.cpp JavaMetaJIT.cpp JavaUpcalls.cpp Jnjvm.cpp Jnjvm.h JnjvmModuleProvider.cpp JnjvmModuleProvider.h LockedMap.h ServiceDomain.cpp VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Apr 22 08:25:02 PDT 2008


Author: geoffray
Date: Tue Apr 22 10:25:01 2008
New Revision: 50101

URL: http://llvm.org/viewvc/llvm-project?rev=50101&view=rev
Log:
Implement C++-like virtual tables.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h
    vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h
    vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Tue Apr 22 10:25:01 2008
@@ -208,23 +208,18 @@
   else {
     classDef->aquire();
     if (code == 0) {
-      if (isStatic(access)) {
-        llvmType = signature->staticType;
-      } else {
-        llvmType = signature->virtualType;
-      }
-      if (!methPtr) {
+      if (llvmFunction->hasNotBeenReadFromBitcode()) {
         JavaJIT jit;
         jit.compilingClass = classDef;
         jit.compilingMethod = this;
         if (isNative(access)) {
-          methPtr = jit.nativeCompile();
+          llvmFunction = jit.nativeCompile();
         } else {
-          methPtr = jit.javaCompile();
+          llvmFunction = jit.javaCompile();
         }
       }
       // We can compile it, since if we're here, it's for a  good reason
-      void* val = mvm::jit::executionEngine->getPointerToGlobal(methPtr);
+      void* val = mvm::jit::executionEngine->getPointerToGlobal(llvmFunction);
 #ifndef MULTIPLE_GC
       mvm::Code* temp = (mvm::Code*)(Collector::begOf(val));
 #else

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Tue Apr 22 10:25:01 2008
@@ -104,7 +104,7 @@
   JavaState status;
   unsigned int access;
   Jnjvm *isolate;
-
+  unsigned int virtualTableSize;
 
   static const int MaxDisplay;
   static JavaObject* jnjvmClassLoader;
@@ -240,7 +240,8 @@
 class JavaMethod : public mvm::Object {
 public:
   static VirtualTable* VT;
-  llvm::Function* methPtr;
+  llvm::Function* llvmFunction;
+  llvm::ConstantInt* offset;
   unsigned int access;
   Signdef* signature;
   std::vector<Attribut*, gc_allocator<Attribut*> > attributs;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaConstantPool.cpp Tue Apr 22 10:25:01 2008
@@ -410,8 +410,11 @@
     // lookup the method
     meth = cl->lookupMethodDontThrow(utf8, sign->keyName, isStatic(access), false);
     if (meth) { // don't throw if no meth, the exception will be thrown just in time  
-      if (meth->methPtr) {
-        ctpRes[index] = (void*)meth->methPtr;
+      if (meth->llvmFunction) {
+        if (meth->llvmFunction->hasNotBeenReadFromBitcode()) {
+          meth->classDef->isolate->functionDefs->hash(meth->llvmFunction, meth);
+        }
+        ctpRes[index] = (void*)meth->llvmFunction;
         return (llvm::Function*)ctpRes[index];
       }
     }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaIsolate.cpp Tue Apr 22 10:25:01 2008
@@ -435,10 +435,12 @@
   isolate->analyseClasspathEnv(isolate->bootClasspathEnv);
 
   isolate->functions = vm_new(isolate, FunctionMap)();
+  isolate->functionDefs = vm_new(isolate, FunctionDefMap)();
   isolate->module = new llvm::Module("Isolate JnJVM");
   isolate->protectModule = mvm::Lock::allocNormal();
   isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->module, 
-                                                       isolate->functions);  
+                                                       isolate->functions,
+                                                       isolate->functionDefs);
   JavaJIT::initialiseJITIsolateVM(isolate);
   
   isolate->bootstrapThread = vm_new(isolate, JavaThread)();
@@ -497,10 +499,12 @@
   isolate->analyseClasspathEnv(isolate->bootClasspathEnv);
   
   isolate->functions = vm_new(isolate, FunctionMap)();
+  isolate->functionDefs = vm_new(isolate, FunctionDefMap)();
   isolate->protectModule = mvm::Lock::allocNormal();
   isolate->module = new llvm::Module("Bootstrap JnJVM");
   isolate->TheModuleProvider = new JnjvmModuleProvider(isolate->module, 
-                                                       isolate->functions);  
+                                                       isolate->functions,
+                                                       isolate->functionDefs); 
   JavaJIT::initialiseJITBootstrapVM(isolate);
   
   isolate->bootstrapThread = vm_new(isolate, JavaThread)();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Tue Apr 22 10:25:01 2008
@@ -120,13 +120,7 @@
   
   
   
-  compilingClass->isolate->protectModule->lock();
-  Function* func = llvmFunction = 
-    llvm::Function::Create(funcType, GlobalValue::ExternalLinkage,
-                           compilingMethod->printString(),
-                           compilingClass->isolate->module);
-  compilingClass->isolate->protectModule->unlock();
-  
+  Function* func = llvmFunction = compilingMethod->llvmFunction;
   if (jnjvm) {
     mvm::jit::executionEngine->addGlobalMapping(func, natPtr);
     return llvmFunction;
@@ -207,6 +201,8 @@
   PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "end native compile %s\n",
               compilingMethod->printString());
   
+  func->setLinkage(GlobalValue::ExternalLinkage);
+  
   return llvmFunction;
 }
 
@@ -374,13 +370,8 @@
   const FunctionType *funcType = compilingMethod->llvmType;
   returnType = funcType->getReturnType();
   
-  compilingClass->isolate->protectModule->lock();
-  Function* func = llvmFunction = 
-    llvm::Function::Create(funcType, GlobalValue::ExternalLinkage,
-                           compilingMethod->printString(),
-                           compilingClass->isolate->module);
-  compilingClass->isolate->protectModule->unlock();
-  
+  Function* func = llvmFunction = compilingMethod->llvmFunction;
+
   BasicBlock* startBlock = currentBlock = createBasicBlock("start");
   endExceptionBlock = createBasicBlock("endExceptionBlock");
   unifiedUnreachable = createBasicBlock("unifiedUnreachable"); 
@@ -514,6 +505,7 @@
     new UnreachableInst(unifiedUnreachable);
   }
   
+  func->setLinkage(GlobalValue::ExternalLinkage);
   mvm::jit::runPasses(llvmFunction, JavaThread::get()->perFunctionPasses);
   
   /*

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaMetaJIT.cpp Tue Apr 22 10:25:01 2008
@@ -171,10 +171,50 @@
   va_end(ap);
 }
 
+VirtualTable* allocateVT(Class* cl, std::vector<JavaMethod*>::iterator meths) {
+  if (meths == cl->virtualMethods.end()) {
+    uint64 size = cl->virtualTableSize;
+    VirtualTable* VT = (VirtualTable*)malloc(size * sizeof(void*));
+    if (cl->super) {
+      memcpy(VT, cl->super->VT, cl->super->virtualTableSize * sizeof(void*));
+    } else {
+      memcpy(VT, JavaObject::VT, VT_SIZE);
+    }
+    return VT;
+  } else {
+    JavaMethod* meth = *meths;
+    JavaMethod* parent = cl->super? 
+      cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : 0;
+
+    uint64_t offset = 0;
+    if (!parent) {
+      offset = cl->virtualTableSize++;
+      mvm::jit::protectConstants();
+      meth->offset = ConstantInt::get(Type::Int32Ty, offset);
+      mvm::jit::unprotectConstants();
+    } else {
+      offset = parent->offset->getZExtValue();
+      meth->offset = parent->offset;
+    }
+    VirtualTable* VT = allocateVT(cl, meths + 1);
+    Function* func = meth->llvmFunction;
+    ExecutionEngine* EE = mvm::jit::executionEngine;
+    ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func);
+    return VT;
+  }
+}
+
+
+
 VirtualTable* JavaJIT::makeVT(Class* cl, bool stat) {
   
-  VirtualTable * res = malloc(VT_SIZE);
-  memcpy(res, JavaObject::VT, VT_SIZE);
+  VirtualTable* res = 0;
+  if (stat) {
+    res = (VirtualTable*)malloc(VT_SIZE);
+    memcpy(res, JavaObject::VT, VT_SIZE);
+  } else {
+    res = allocateVT(cl, cl->virtualMethods.begin());
+  }
  
 #ifdef WITH_TRACER
   const Type* type = stat ? cl->staticType : cl->virtualType;
@@ -239,10 +279,10 @@
   
   if (!stat) {
     cl->virtualTracer = func;
-    cl->codeVirtualTracer = (mvm::Code*)((unsigned*)codePtr - 1);
+    cl->codeVirtualTracer = mvm::Code::getCodeFromPointer(codePtr);
   } else {
     cl->staticTracer = func;
-    cl->codeStaticTracer = (mvm::Code*)((unsigned*)codePtr - 1);
+    cl->codeStaticTracer = mvm::Code::getCodeFromPointer(codePtr);
   }
 #endif
   return res;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Tue Apr 22 10:25:01 2008
@@ -227,7 +227,7 @@
   const llvm::FunctionType* type = 
     llvm::FunctionType::get(JavaObject::llvmType, args, false);
 
-  Classpath::getCallingClassLoader->methPtr =
+  Classpath::getCallingClassLoader->llvmFunction =
     llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
                        "_ZN5jnjvm7JavaJIT21getCallingClassLoaderEv",
                        vm->module);
@@ -244,7 +244,7 @@
   const llvm::FunctionType* type = 
     llvm::FunctionType::get(JavaObject::llvmType, args, false);
 
-  internString->methPtr =
+  internString->llvmFunction =
     llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
                        "internString",
                        vm->module);
@@ -260,7 +260,7 @@
 #endif
   const llvm::FunctionType* type = 
     llvm::FunctionType::get(llvm::Type::Int8Ty, args, false);
-  isArray->methPtr =
+  isArray->llvmFunction =
     llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
                        "isArray",
                        vm->module);
@@ -287,7 +287,7 @@
   const llvm::FunctionType* type = 
     llvm::FunctionType::get(JavaObject::llvmType, args, false);
 
-  getCallingClass->methPtr =
+  getCallingClass->llvmFunction =
     llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
                        "getCallingClass",
                        vm->module);
@@ -302,7 +302,7 @@
   const llvm::FunctionType* type = 
     llvm::FunctionType::get(JavaObject::llvmType, args, false);
 
-  getCallingClassLoader->methPtr =
+  getCallingClassLoader->llvmFunction =
     llvm::Function::Create(type, llvm::GlobalValue::ExternalLinkage,
                        "getCallingClassLoader",
                        vm->module);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Apr 22 10:25:01 2008
@@ -176,10 +176,12 @@
   if (super == 0) {
     cl->depth = 0;
     cl->display.push_back(cl);
+    cl->virtualTableSize = VT_SIZE;
   } else {
     cl->super = loadName(super, classLoader, true, false, true);
     int depth = cl->super->depth;
     cl->depth = depth + 1;
+    cl->virtualTableSize = cl->super->virtualTableSize;
     for (uint32 i = 0; i < cl->super->display.size(); ++i) {
       cl->display.push_back(cl->super->display[i]);
     }
@@ -760,7 +762,7 @@
 
 JavaField* Jnjvm::constructField(Class* cl, const UTF8* name, const UTF8* type,
                                   uint32 access){
-  FieldCmp CC(name, cl, type);
+  FieldCmp CC(name, cl, type, 0);
   JavaField* f = loadedFields->lookupOrCreate(CC, this, fieldDup); 
   f->access = access;
   f->offset = 0;
@@ -769,7 +771,7 @@
 
 JavaField* Jnjvm::lookupField(CommonClass* cl, const UTF8* name, 
                               const UTF8* type) {
-  FieldCmp CC(name, cl, type);
+  FieldCmp CC(name, cl, type, 0);
   JavaField* f = loadedFields->lookup(CC); 
   return f;
 }
@@ -780,16 +782,26 @@
   method->type = cmp.type;
   method->classDef = (Class*)cmp.classDef;
   method->signature = (Signdef*)vm->constructType(method->type);
-  method->methPtr = 0;
   method->code = 0;
+  method->access = cmp.access;
+  if (isStatic(method->access)) {
+    method->llvmType =method->signature->staticType;
+  } else {
+    method->llvmType = method->signature->virtualType;
+  }
+  method->classDef->isolate->protectModule->lock();
+  method->llvmFunction = 
+    llvm::Function::Create(method->llvmType, llvm::GlobalValue::GhostLinkage,
+                           method->printString(),
+                           method->classDef->isolate->module);
+  method->classDef->isolate->protectModule->unlock();
   return method;
 }
 
 JavaMethod* Jnjvm::constructMethod(Class* cl, const UTF8* name,
                                     const UTF8* type, uint32 access) {
-  FieldCmp CC(name, cl, type);
+  FieldCmp CC(name, cl, type, access);
   JavaMethod* f = loadedMethods->lookupOrCreate(CC, this, methodDup);
-  f->access = access;
   return f;
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Tue Apr 22 10:25:01 2008
@@ -53,6 +53,7 @@
 class TypeMap;
 class FunctionMap;
 class FunctionDefMap;
+class FunctionDefMap;
 class AllocationMap;
 
 
@@ -263,6 +264,7 @@
   llvm::Module* module;
   JnjvmModuleProvider* TheModuleProvider;
   FunctionMap* functions;
+  FunctionDefMap* functionDefs;
 
 #ifndef MULTIPLE_GC
   void* allocateObject(unsigned int sz, VirtualTable* VT) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Apr 22 10:25:01 2008
@@ -40,7 +40,7 @@
   
   meth->compiledPtr();
 
-  ctpInfo->ctpRes[index] = meth->methPtr;
+  ctpInfo->ctpRes[index] = meth->llvmFunction;
 
   return meth;
 }
@@ -48,21 +48,24 @@
 
 bool JnjvmModuleProvider::materializeFunction(Function *F, 
                                               std::string *ErrInfo) {
-  std::pair<Class*, uint32> * p = functions->lookup(F);
-  if (!p) {
-    // VT methods
+  
+  if (mvm::jit::executionEngine->getPointerToGlobalIfAvailable(F))
+    return false;
+
+  if (!(F->hasNotBeenReadFromBitcode())) 
     return false;
-  } else {
-    if (mvm::jit::executionEngine->getPointerToGlobalIfAvailable(F)) {
-      return false;
-    } else {
-      JavaMethod* meth = staticLookup(p->first, p->second);
-      void* val = meth->compiledPtr();
-      if (F->isDeclaration())
-        mvm::jit::executionEngine->updateGlobalMapping(F, val);
-      return false;
-    }
   
+  JavaMethod* meth = functionDefs->lookup(F);
+  
+  if (!meth) {
+    // It's a callback
+    std::pair<Class*, uint32> * p = functions->lookup(F);
+    meth = staticLookup(p->first, p->second); 
   }
+  
+  void* val = meth->compiledPtr();
+  if (F->isDeclaration())
+    mvm::jit::executionEngine->updateGlobalMapping(F, val);
+  return false;
 }
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Tue Apr 22 10:25:01 2008
@@ -21,9 +21,11 @@
 class JnjvmModuleProvider : public ModuleProvider {
 public:
   FunctionMap* functions;
-  JnjvmModuleProvider(Module *m, FunctionMap* fm) {
+  FunctionDefMap* functionDefs;
+  JnjvmModuleProvider(Module *m, FunctionMap* fm, FunctionDefMap* fdm) {
     TheModule = m;
     functions = fm;
+    functionDefs= fdm;
   }
   
   bool materializeFunction(Function *F, std::string *ErrInfo = 0);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Tue Apr 22 10:25:01 2008
@@ -139,9 +139,10 @@
   const UTF8* name;
   CommonClass* classDef;
   const UTF8* type;
+  uint32_t access;
 
-  FieldCmp(const UTF8* n, CommonClass* c, const UTF8* t) : name(n), classDef(c), 
-    type(t) {}
+  FieldCmp(const UTF8* n, CommonClass* c, const UTF8* t, uint32 a) : name(n), classDef(c), 
+    type(t), access(a) {}
   
   inline bool operator<(const FieldCmp &cmp) const {
     if (name < cmp.name) return true;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/ServiceDomain.cpp Tue Apr 22 10:25:01 2008
@@ -71,10 +71,12 @@
 #endif
 
   service->functions = vm_new(service, FunctionMap)();
+  service->functionDefs = vm_new(service, FunctionDefMap)();
   service->module = new llvm::Module("Service Domain");
   service->protectModule = mvm::Lock::allocNormal();
   service->TheModuleProvider = new JnjvmModuleProvider(service->module, 
-                                                       service->functions);  
+                                                       service->functions,
+                                                       service->functionDefs);  
 
 #ifdef MULTIPLE_GC
   mvm::jit::memoryManager->addGCForModule(service->module, service->GC);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Tue Apr 22 10:25:01 2008
@@ -244,6 +244,7 @@
   TRACE_VECTOR(JavaObject*, gc_allocator, globalRefs);
   //globalRefsLock->MARK_AND_TRACE;
   functions->MARK_AND_TRACE;
+  functionDefs->MARK_AND_TRACE;
 #ifdef MULTIPLE_VM
   statics->MARK_AND_TRACE;
   delegatees->MARK_AND_TRACE;





More information about the llvm-commits mailing list