[llvm-commits] [vmkit] r52407 - in /vmkit/trunk/lib/JnJVM/VMCore: JavaInitialise.cpp Jnjvm.cpp Jnjvm.h JnjvmModule.cpp JnjvmModuleProvider.cpp JnjvmModuleProvider.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jun 17 07:26:15 PDT 2008


Author: geoffray
Date: Tue Jun 17 09:26:15 2008
New Revision: 52407

URL: http://llvm.org/viewvc/llvm-project?rev=52407&view=rev
Log:
Implement Java object finalization.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaInitialise.cpp Tue Jun 17 09:26:15 2008
@@ -182,6 +182,7 @@
   DEF_UTF8(log1p);
   DEF_UTF8(sinh);
   DEF_UTF8(tanh);
+  DEF_UTF8(finalize);
 
 #undef DEF_UTF8
  

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Tue Jun 17 09:26:15 2008
@@ -73,6 +73,7 @@
   DEF_UTF8(log1p);
   DEF_UTF8(sinh);
   DEF_UTF8(tanh);
+  DEF_UTF8(finalize);
 
 #undef DEF_UTF8
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Tue Jun 17 09:26:15 2008
@@ -174,6 +174,7 @@
   static const UTF8* log1p;
   static const UTF8* sinh;
   static const UTF8* tanh;
+  static const UTF8* finalize;
 
 
   void analyseClasspathEnv(const char*);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Tue Jun 17 09:26:15 2008
@@ -191,22 +191,42 @@
     return VT;
   } else {
     JavaMethod* meth = meths->second;
-    JavaMethod* parent = cl->super? 
-      cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) : 0;
-
-    uint64_t offset = 0;
-    if (!parent) {
-      offset = cl->virtualTableSize++;
-      meth->offset = offset;
+    VirtualTable* VT = 0;
+    if (meth->name->equals(Jnjvm::finalize)) {
+      VT = allocateVT(cl, ++meths);
+      meth->offset = 0;
+      Function* func = cl->isolate->TheModuleProvider->parseFunction(meth);
+      if (!cl->super) meth->canBeInlined = true;
+      Function::iterator BB = func->begin();
+      BasicBlock::iterator I = BB->begin();
+      if (isa<ReturnInst>(I)) {
+        ((void**)VT)[0] = 0;
+      } else {
+        ExecutionEngine* EE = mvm::jit::executionEngine;
+        // LLVM does not allow recursive compilation. Create the code now.
+        ((void**)VT)[0] = EE->getPointerToFunction(func);
+      }
     } else {
-      offset = parent->offset;
-      meth->offset = parent->offset;
+    
+      JavaMethod* parent = cl->super? 
+        cl->super->lookupMethodDontThrow(meth->name, meth->type, false, true) :
+        0;
+
+      uint64_t offset = 0;
+      if (!parent) {
+        offset = cl->virtualTableSize++;
+        meth->offset = offset;
+      } else {
+        offset = parent->offset;
+        meth->offset = parent->offset;
+      }
+      VT = allocateVT(cl, ++meths);
+      LLVMMethodInfo* LMI = getMethodInfo(meth);
+      Function* func = LMI->getMethod();
+      ExecutionEngine* EE = mvm::jit::executionEngine;
+      ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func);
     }
-    VirtualTable* VT = allocateVT(cl, ++meths);
-    LLVMMethodInfo* LMI = getMethodInfo(meth);
-    Function* func = LMI->getMethod();
-    ExecutionEngine* EE = mvm::jit::executionEngine;
-    ((void**)VT)[offset] = EE->getPointerToFunctionOrStub(func);
+
     return VT;
   }
 }
@@ -249,7 +269,9 @@
     }
   }
 #endif
- 
+  
+
+
 #ifdef WITH_TRACER
   LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(cl);
   const Type* type = stat ? LCI->getStaticType() : LCI->getVirtualType();

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.cpp Tue Jun 17 09:26:15 2008
@@ -105,6 +105,15 @@
 }
 
 void* JnjvmModuleProvider::materializeFunction(JavaMethod* meth) {
+  Function* func = parseFunction(meth);
+  
+  void* res = mvm::jit::executionEngine->getPointerToGlobal(func);
+  mvm::Code* m = mvm::jit::getCodeFromPointer(res);
+  if (m) m->setMetaInfo(meth);
+  return res;
+}
+
+Function* JnjvmModuleProvider::parseFunction(JavaMethod* meth) {
   LLVMMethodInfo* LMI = ((JnjvmModule*)TheModule)->getMethodInfo(meth);
   Function* func = LMI->getMethod();
   if (func->hasNotBeenReadFromBitcode()) {
@@ -122,11 +131,7 @@
       mvm::jit::runPasses(func, perFunctionPasses);
     }
   }
-  
-  void* res = mvm::jit::executionEngine->getPointerToGlobal(func);
-  mvm::Code* m = mvm::jit::getCodeFromPointer(res);
-  if (m) m->setMetaInfo(meth);
-  return res;
+  return func;
 }
 
 llvm::Function* JnjvmModuleProvider::addCallback(Class* cl, uint32 index,

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModuleProvider.h Tue Jun 17 09:26:15 2008
@@ -51,6 +51,7 @@
 
   bool materializeFunction(Function *F, std::string *ErrInfo = 0);
   void* materializeFunction(JavaMethod* meth);
+  llvm::Function* parseFunction(JavaMethod* meth);
 
   Module* materializeModule(std::string *ErrInfo = 0) { return TheModule; }
 };





More information about the llvm-commits mailing list