[vmkit-commits] [vmkit] r70123 - in /vmkit/trunk: include/jnjvm/JavaCompiler.h include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp lib/JnJVM/Compiler/JavaJITCompiler.cpp lib/JnJVM/VMCore/JavaClass.cpp lib/JnJVM/VMCore/JavaClass.h lib/JnJVM/VMCore/JavaUpcalls.cpp lib/JnJVM/VMCore/Jnjvm.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Apr 26 04:41:54 PDT 2009


Author: geoffray
Date: Sun Apr 26 06:41:24 2009
New Revision: 70123

URL: http://llvm.org/viewvc/llvm-project?rev=70123&view=rev
Log:
Change tracer and destructor of internal Java classes during classpath
initialization, not jnjvm initialization.


Modified:
    vmkit/trunk/include/jnjvm/JavaCompiler.h
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp

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

==============================================================================
--- vmkit/trunk/include/jnjvm/JavaCompiler.h (original)
+++ vmkit/trunk/include/jnjvm/JavaCompiler.h Sun Apr 26 06:41:24 2009
@@ -18,6 +18,7 @@
 
 class Class;
 class JavaMethod;
+class JavaVirtualTable;
 class Signdef;
 
 class JavaCompiler {
@@ -36,6 +37,15 @@
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name) {
   }
   
+  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                         const char* name) {
+  }
+  
+  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                             const char* name) {
+  }
+  
+  
   virtual bool isStaticCompiling() {
     return false;
   }

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

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sun Apr 26 06:41:24 2009
@@ -425,8 +425,11 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr) = 0;
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name) = 0;
+  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                         const char* name) = 0;
+  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                             const char* name) = 0;
   
-
 #ifdef SERVICE
   virtual llvm::Value* getIsolate(Jnjvm* vm, llvm::Value* Where) = 0;
 #endif
@@ -490,6 +493,10 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr);
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name);
+  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                         const char* name);
+  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                             const char* name);
   
 
 #ifdef SERVICE
@@ -540,6 +547,10 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr);
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name);
+  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                         const char* name);
+  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                             const char* name);
   
 
 #ifdef SERVICE

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Sun Apr 26 06:41:24 2009
@@ -1462,6 +1462,24 @@
   func->setLinkage(GlobalValue::ExternalLinkage);
 }
 
+void JavaAOTCompiler::setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                                const char* name) {
+  Function* func = Function::Create(JnjvmModule::MarkAndTraceType,
+                                    GlobalValue::ExternalLinkage,
+                                    name, getLLVMModule());
+       
+  LLVMClassInfo* LCI = getClassInfo(VT->cl->asClass());
+  LCI->virtualTracerFunction = func;
+}
+
+void JavaAOTCompiler::setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                                    const char* name) {
+  // Set the name info directly, the compiler will use the name to
+  // create a LLVM function.
+  VT->destructor = (uintptr_t)name;
+  VT->operatorDelete = (uintptr_t)name;
+}
+
 Function* JavaAOTCompiler::addCallback(Class* cl, uint16 index,
                                       Signdef* sign, bool stat) {
  

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Sun Apr 26 06:41:24 2009
@@ -212,6 +212,26 @@
   func->setLinkage(GlobalValue::ExternalLinkage);
 }
 
+void JavaJITCompiler::setTracer(JavaVirtualTable* VT, uintptr_t ptr,
+                                const char* name) {
+  // So the class has a tracer because either a) the class was vmjced or
+  // b) the boot sequence has set it. Create the tracer as an external
+  // function.
+  Function* func = Function::Create(JnjvmModule::MarkAndTraceType,
+                                    GlobalValue::ExternalLinkage,
+                                    name, getLLVMModule());
+       
+  JnjvmModule::executionEngine->addGlobalMapping(func, (void*)ptr);
+  LLVMClassInfo* LCI = getClassInfo(VT->cl->asClass());
+  LCI->virtualTracerFunction = func;
+}
+
+void JavaJITCompiler::setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
+                                    const char* name) {
+  // Nothing to do: the virtual table has already set its destructor
+  // and no one uses the destructor as a LLVM function.
+}
+
 void* JavaJITCompiler::materializeFunction(JavaMethod* meth) {
   Function* func = parseFunction(meth);
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Sun Apr 26 06:41:24 2009
@@ -360,6 +360,17 @@
   classDef->release();
 }
 
+void JavaVirtualTable::setNativeTracer(uintptr_t ptr, const char* name) {
+  tracer = ptr;
+  cl->classLoader->getCompiler()->setTracer(this, ptr, name);
+}
+
+void JavaVirtualTable::setNativeDestructor(uintptr_t ptr, const char* name) {
+  destructor = ptr;
+  operatorDelete = ptr;
+  cl->classLoader->getCompiler()->setDestructor(this, ptr, name);
+}
+
 const char* JavaMethod::printString() const {
   mvm::PrintBuffer *buf= mvm::PrintBuffer::alloc();
   buf->write("JavaMethod<");

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Sun Apr 26 06:41:24 2009
@@ -196,6 +196,15 @@
   ///
   bool isSubtypeOf(JavaVirtualTable* VT);
 
+  /// setNativeTracer - Set the tracer of this virtual table as a method
+  /// defined by JnJVM.
+  ///
+  void setNativeTracer(uintptr_t tracer, const char* name);
+  
+  /// setNativeDestructor - Set the destructor of this virtual table as a method
+  /// defined by JnJVM.
+  ///
+  void setNativeDestructor(uintptr_t tracer, const char* name);
 
 };
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaUpcalls.cpp Sun Apr 26 06:41:24 2009
@@ -377,6 +377,30 @@
 
 }
 
+extern "C" void nativeJavaObjectClassTracer(JavaObjectClass* obj) {
+  JavaObjectClass::staticTracer(obj);
+}
+
+extern "C" void nativeJavaObjectFieldTracer(JavaObjectField* obj) {
+  JavaObjectField::staticTracer(obj);
+}
+
+extern "C" void nativeJavaObjectMethodTracer(JavaObjectMethod* obj) {
+  JavaObjectMethod::staticTracer(obj);
+}
+
+extern "C" void nativeJavaObjectConstructorTracer(JavaObjectConstructor* obj) {
+  JavaObjectConstructor::staticTracer(obj);
+}
+
+extern "C" void nativeJavaObjectReferenceTracer(JavaObjectReference* obj) {
+  JavaObjectReference::staticTracer(obj);
+}
+
+extern "C" void nativeJavaObjectVMThreadDestructor(JavaObjectVMThread* obj) {
+  JavaObjectVMThread::staticDestructor(obj);
+}
+
 void Classpath::initialiseClasspath(JnjvmClassLoader* loader) {
 
   newClassLoader = 
@@ -787,6 +811,15 @@
   getAnnotations->setCompiledPtr((void*)(intptr_t)nativeGetDeclaredAnnotations,
                                  "nativeGetDeclaredAnnotations");
 
+//===----------------------------------------------------------------------===//
+//
+// Weak/Soft/Phantom references support. We modify each constructor to register
+// the reference to the VM. Also, the tracer of the Reference class is modified
+// to not trace the referent.
+//
+//===----------------------------------------------------------------------===//
+
+ 
   newReference =
     loader->loadName(loader->asciizConstructUTF8("java/lang/ref/Reference"),
                      false, false);
@@ -835,7 +868,39 @@
       (void*)(intptr_t)nativeInitPhantomReferenceQ,
       "nativeInitPhantomReferenceQ");
   
-
+  newReference->getVirtualVT()->setNativeTracer(
+      (uintptr_t)nativeJavaObjectReferenceTracer,
+      "nativeJavaObjectReferenceTracer");
+
+//===----------------------------------------------------------------------===//
+//
+// To make classes non GC-allocated, we have to bypass the tracer functions of
+// java.lang.Class, java.lang.reflect.Field, java.lang.reflect.Method and
+// java.lang.reflect.constructor. The new tracer functions trace the classloader
+// instead of the class/field/method.
+//
+//===----------------------------------------------------------------------===//
+ 
+  newClass->getVirtualVT()->setNativeTracer(
+      (uintptr_t)nativeJavaObjectClassTracer,
+      "nativeJavaObjectClassTracer");
+  
+  newConstructor->getVirtualVT()->setNativeTracer(
+      (uintptr_t)nativeJavaObjectConstructorTracer,
+      "nativeJavaObjectConstructorTracer");
+  
+  newMethod->getVirtualVT()->setNativeTracer(
+      (uintptr_t)nativeJavaObjectMethodTracer,
+      "nativeJavaObjectMethodTracer");
+  
+  newField->getVirtualVT()->setNativeTracer(
+      (uintptr_t)nativeJavaObjectFieldTracer,
+      "nativeJavaObjectFieldTracer");
+  
+
+  newVMThread->getVirtualVT()->setNativeDestructor(
+      (uintptr_t)nativeJavaObjectVMThreadDestructor,
+      "nativeJavaObjectVMThreadDestructorr");
 }
 
 gc* Jnjvm::getReferent(gc* _obj) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Apr 26 06:41:24 2009
@@ -820,32 +820,7 @@
       (uintptr_t)JavaString::stringDestructor;
   }
   upcalls->newString->initialiseClass(this);
-
-  // To make classes non GC-allocated, we have to bypass the tracer
-  // functions of java.lang.Class, java.lang.reflect.Field,
-  // java.lang.reflect.Method and java.lang.reflect.constructor. The new
-  // tracer functions trace the classloader instead of the class/field/method.
-  LOAD_CLASS(upcalls->newClass);
-  uintptr_t* ptr = ((uintptr_t*)upcalls->newClass->getVirtualVT());
-  ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectClass::staticTracer;
-
-  LOAD_CLASS(upcalls->newConstructor);
-  ptr = ((uintptr_t*)upcalls->newConstructor->getVirtualVT());
-  ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectConstructor::staticTracer;
-
-  
-  LOAD_CLASS(upcalls->newMethod);
-  ptr = ((uintptr_t*)upcalls->newMethod->getVirtualVT());
-  ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectMethod::staticTracer;
-  
-  LOAD_CLASS(upcalls->newField);
-  ptr = ((uintptr_t*)upcalls->newField->getVirtualVT());
-  ptr[VT_TRACER_OFFSET] = (uintptr_t)JavaObjectField::staticTracer;
-  
-  LOAD_CLASS(upcalls->newVMThread);
-  ptr = ((uintptr_t*)upcalls->newVMThread->getVirtualVT());
-  ptr[VT_DESTRUCTOR_OFFSET] = (uintptr_t)JavaObjectVMThread::staticDestructor;
-   
+ 
 #ifdef SERVICE
   if (!IsolateID)
 #endif
@@ -853,6 +828,11 @@
   // to get the Java thread, so we create the Java thread object first.
   upcalls->InitializeThreading(this);
   
+  LOAD_CLASS(upcalls->newClass);
+  LOAD_CLASS(upcalls->newConstructor);
+  LOAD_CLASS(upcalls->newField);
+  LOAD_CLASS(upcalls->newMethod);
+  LOAD_CLASS(upcalls->newVMThread);
   LOAD_CLASS(upcalls->newStackTraceElement);
   LOAD_CLASS(upcalls->newVMThrowable);
   LOAD_CLASS(upcalls->boolClass);





More information about the vmkit-commits mailing list