[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