[vmkit-commits] [vmkit] r199717 - Define vmkit::Symbols for vts, staticObjects and java.lang.Strings. For the moment, only use these symbols for staticObjects.

Gael Thomas gael.thomas at lip6.fr
Tue Jan 21 02:34:54 PST 2014


Author: gthomas
Date: Tue Jan 21 04:34:53 2014
New Revision: 199717

URL: http://llvm.org/viewvc/llvm-project?rev=199717&view=rev
Log:
Define vmkit::Symbols for vts, staticObjects and java.lang.Strings. For the moment, only use these symbols for staticObjects.

Added:
    vmkit/branches/mcjit/include/j3/j3symbols.h
Modified:
    vmkit/branches/mcjit/include/j3/j3.h
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3classloader.h
    vmkit/branches/mcjit/include/j3/j3codegen.h
    vmkit/branches/mcjit/include/j3/j3meta.def
    vmkit/branches/mcjit/include/vmkit/stack.h
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3jni.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Tue Jan 21 04:34:53 2014
@@ -135,6 +135,7 @@ namespace j3 {
 		llvm::Type* typeJ3ArrayObjectPtr;
 		llvm::Type* typeJ3Object;
 		llvm::Type* typeJ3ObjectPtr;
+		llvm::Type* typeJ3ObjectHandle;
 		llvm::Type* typeJ3ObjectHandlePtr;
 		llvm::Type* typeJ3LockRecord;
 		llvm::Type* typeGXXException;

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 04:34:53 2014
@@ -8,6 +8,7 @@
 #include "vmkit/compiler.h"
 
 #include "j3/j3object.h"
+#include "j3/j3symbols.h"
 
 namespace llvm {
 	class Type;
@@ -40,7 +41,6 @@ namespace j3 {
 		J3Method** methods;
 	};
 
-
 	class J3Type : public vmkit::Symbol {
 		pthread_mutex_t        _mutex;
 		J3ClassLoader*         _loader;
@@ -55,7 +55,7 @@ namespace j3 {
 		J3VirtualTable*           _vt; 
 		J3ObjectHandle* volatile  _javaClass;
 
-		volatile int           status;
+		volatile int                status;
 
 		virtual void                doResolve(J3Field* hiddenFields, size_t nbHiddenFields) { status = RESOLVED; }
 		virtual void                doInitialise() { status = INITED; }
@@ -184,30 +184,29 @@ namespace j3 {
 	};
 
 	class J3Class : public J3Layout {
-		J3StaticLayout     _staticLayout;
+		J3StaticLayout         _staticLayout;
 
-		uint16_t           _access;
+		uint16_t               _access;
 
-		size_t             _nbInterfaces;
-		J3Class**          _interfaces;
-		J3Class*           _super;       /* this for root */
+		size_t                 _nbInterfaces;
+		J3Class**              _interfaces;
+		J3Class*               _super;       /* this for root */
 
-		J3Attributes*      _attributes;
+		J3Attributes*          _attributes;
 
-		J3ClassBytes*      _bytes;
-		size_t             nbCtp;
-		uint8_t*           ctpTypes;
-		uint32_t*          ctpValues;
-		void**             ctpResolved;
+		J3ClassBytes*          _bytes;
+		size_t                 nbCtp;
+		uint8_t*               ctpTypes;
+		uint32_t*              ctpValues;
+		void**                 ctpResolved;
 
-		size_t             _nbConstructors;
-		size_t             _nbPublicConstructors;
+		size_t                 _nbConstructors;
+		size_t                 _nbPublicConstructors;
 
-		/* GC Object */
-		J3ObjectHandle*    _staticInstance;
+		J3StaticObjectSymbol*  _staticObjectSymbol;
 
-		J3ObjectHandle*    _protectionDomain;
-		const char*        _source;
+		J3ObjectHandle*        _protectionDomain;
+		const char*            _source;
 
 		J3Attributes* readAttributes(J3Reader* reader);
 		void          readClassBytes(J3Field* hiddenFields, uint32_t nbHiddenFields);
@@ -247,7 +246,8 @@ namespace j3 {
 		uint16_t            access() { return _access; }
 		uint16_t            modifiers();
 
-		J3ObjectHandle*     staticInstance();
+		char*                 staticObjectId();
+		J3StaticObjectSymbol* staticObjectSymbol() { return _staticObjectSymbol; }
 
 		void                registerNative(const vmkit::Name* methName, const vmkit::Name* methSign, void* fnPtr);
 

Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Tue Jan 21 04:34:53 2014
@@ -9,6 +9,7 @@
 #include "vmkit/compiler.h"
 
 #include "j3/j3object.h"
+#include "j3/j3symbols.h"
 
 namespace llvm {
 	class Linker;
@@ -43,6 +44,8 @@ namespace j3 {
 		J3ObjectHandle*                      _javaClassLoader;
 		J3GlobalReferences                   _globalReferences;
 
+		vmkit::LockedStack<J3StaticObjectSymbol> _staticObjects;
+
 		pthread_mutex_t                      _mutexClasses;
 		vmkit::NameMap<J3Class*>::map        classes;      /* classes managed by this class loader */
 
@@ -78,6 +81,7 @@ namespace j3 {
 		uint32_t                      interfaceIndex(J3Method* signature);
 
 		J3GlobalReferences*           globalReferences() { return &_globalReferences; }
+		vmkit::LockedStack<J3StaticObjectSymbol>* staticObjects() { return &_staticObjects; }
 
 		static J3ClassLoader*         nativeClassLoader(J3ObjectHandle* jloader);
 		J3ObjectHandle*               javaClassLoader(bool doPush=1);

Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Jan 21 04:34:53 2014
@@ -123,7 +123,7 @@ namespace j3 {
 
 		llvm::Value*        handleToObject(llvm::Value* obj);
 		llvm::Value*        javaClass(J3ObjectType* type, bool doPush);
-		llvm::Value*        staticInstance(J3Class* cl);
+		llvm::Value*        staticObject(J3Class* cl);
 		llvm::Value*        vt(J3ObjectType* cl, bool resolve=0);
 		llvm::Value*        vt(llvm::Value* obj);
 		void                initialiseJ3ObjectType(J3ObjectType* cl);

Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 04:34:53 2014
@@ -1,7 +1,6 @@
 _x(funcJ3TypeVT,                    "j3::J3Type::vt()")
 _x(funcJ3TypeVTAndResolve,          "j3::J3Type::vtAndResolve()")
 _x(funcJ3TypeInitialise,            "j3::J3Type::initialise()")
-_x(funcJ3ClassStaticInstance,       "j3::J3Class::staticInstance()")
 _x(funcJ3ClassStringAt,             "j3::J3Class::stringAt(unsigned short, bool)")
 _x(funcJ3TypeJavaClass,             "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
 _x(funcJniEnv,                      "j3::J3::jniEnv()")

Added: vmkit/branches/mcjit/include/j3/j3symbols.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199717&view=auto
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbols.h (added)
+++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 04:34:53 2014
@@ -0,0 +1,45 @@
+#ifndef _J3_SYMBOLS_H_
+#define _J3_SYMBOLS_H_
+
+namespace j3 {
+	class J3StringSymbol : public vmkit::Symbol {
+		char*           _id;
+		J3ObjectHandle* _handle;
+	public:
+		J3StringSymbol(char* id, J3ObjectHandle* handle) { _id = id; _handle = handle; }
+
+		char* id() { return _id; }
+		void* getSymbolAddress() { return _handle; }
+	};
+
+	class J3VTSymbol : public vmkit::Symbol {
+		char*           _id;
+		J3VirtualTable* _vt;
+	public:
+		J3VTSymbol() {}
+
+		char* id() { return _id; }
+		void* getSymbolAddress() { return _vt; }
+		
+		void  set(char* id, J3VirtualTable* vt) { _id = id; _vt = vt; }
+	};
+
+	class J3StaticObjectSymbol : public vmkit::Symbol {
+		char* volatile _id;
+		J3ObjectHandle _handle;
+	public:
+		J3StaticObjectSymbol() {}
+
+		void* operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
+
+		J3ObjectHandle* handle() { return &_handle; }
+
+		char* id() { return _id; }
+		void* getSymbolAddress() { return handle(); }
+		
+		void  setId(char* id) { _id = id; }
+		void  setHandle(J3ObjectHandle* handle) { _handle = *handle; }
+	};
+}
+
+#endif

Modified: vmkit/branches/mcjit/include/vmkit/stack.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/stack.h?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/stack.h (original)
+++ vmkit/branches/mcjit/include/vmkit/stack.h Tue Jan 21 04:34:53 2014
@@ -82,6 +82,23 @@ namespace vmkit {
 			head->top = ptr;
 		}
 	};
+
+	template <class T>
+	class LockedStack : private Stack<T> {
+		pthread_mutex_t mutex;
+		
+	public:
+		LockedStack(BumpAllocator* _allocator) : Stack<T>(_allocator) {
+			pthread_mutex_init(&mutex, 0);
+		}
+
+		T* push() {
+			pthread_mutex_lock(&mutex);
+			T* res = Stack<T>::push();
+			pthread_mutex_unlock(&mutex);
+			return res;
+		}
+	};
 }
 
 #endif

Modified: vmkit/branches/mcjit/lib/j3/vm/j3.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Tue Jan 21 04:34:53 2014
@@ -1,3 +1,4 @@
+
 #include <stdio.h>
 #include <dlfcn.h>
 #include <cxxabi.h>
@@ -65,7 +66,8 @@ void J3::introspect() {
 	typeJ3Method            = introspectType("class.j3::J3Method");
 	typeJ3Object            = introspectType("class.j3::J3Object");
 	typeJ3ObjectPtr         = llvm::PointerType::getUnqual(typeJ3Object);
-	typeJ3ObjectHandlePtr   = llvm::PointerType::getUnqual(introspectType("class.j3::J3ObjectHandle"));
+	typeJ3ObjectHandle      = introspectType("class.j3::J3ObjectHandle");
+	typeJ3ObjectHandlePtr   = llvm::PointerType::getUnqual(typeJ3ObjectHandle);
 	typeJ3LockRecord        = introspectType("class.j3::J3LockRecord");
 
 	typeGXXException        = llvm::StructType::get(llvm::Type::getInt8Ty(llvmContext())->getPointerTo(), 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 04:34:53 2014
@@ -319,6 +319,7 @@ J3Class::J3Class(J3ClassLoader* loader,
 	_source = source;
 	_bytes = bytes;
 	status = LOADED;
+	_staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol();
 }
 
 void J3Class::compileAll() {
@@ -498,8 +499,18 @@ void J3Class::registerNative(const vmkit
 	res->registerNative(fnPtr);
 }
 
-J3ObjectHandle* J3Class::staticInstance() { 
-	return _staticInstance; 
+char* J3Class::staticObjectId() {
+	char* id = staticObjectSymbol()->id();
+
+	if(!id) {
+		size_t len = nativeNameLength();
+		id = (char*)loader()->allocator()->allocate(len + 8);
+		memcpy(id, "static_", 7);
+		memcpy(id+7, nativeName(), len+1);
+		staticObjectSymbol()->setId(id);
+	}
+
+	return id;
 }
 
 void J3Class::doInitialise() {
@@ -519,7 +530,7 @@ void J3Class::doInitialise() {
 		J3ObjectHandle* prev = J3Thread::get()->tell();
 		J3ObjectHandle* stacked = J3ObjectHandle::allocate(staticLayout()->vt(), staticLayout()->structSize());
 
-		_staticInstance = loader()->globalReferences()->add(stacked);
+		staticObjectSymbol()->setHandle(stacked);
 		J3Thread::get()->restore(prev);
 
 		for(size_t i=0; i<staticLayout()->nbFields(); i++) {
@@ -535,13 +546,14 @@ void J3Class::doInitialise() {
 					J3::classFormatError(this, "bad length for ConstantAttribute");
 				
 				uint32_t idx = reader.readU2();
+				J3ObjectHandle* staticObject = staticObjectSymbol()->handle();
 
 				switch(getCtpType(idx)) {
-					case J3Cst::CONSTANT_Long:    staticInstance()->setLong(cur, longAt(idx)); break;
-					case J3Cst::CONSTANT_Float:   staticInstance()->setFloat(cur, floatAt(idx)); break;
-					case J3Cst::CONSTANT_Double:  staticInstance()->setDouble(cur, doubleAt(idx)); break;
-					case J3Cst::CONSTANT_Integer: staticInstance()->setInteger(cur, integerAt(idx)); break;
-					case J3Cst::CONSTANT_String:  staticInstance()->setObject(cur, stringAt(idx, 0)); break;
+					case J3Cst::CONSTANT_Long:    staticObject->setLong(cur, longAt(idx)); break;
+					case J3Cst::CONSTANT_Float:   staticObject->setFloat(cur, floatAt(idx)); break;
+					case J3Cst::CONSTANT_Double:  staticObject->setDouble(cur, doubleAt(idx)); break;
+					case J3Cst::CONSTANT_Integer: staticObject->setInteger(cur, integerAt(idx)); break;
+					case J3Cst::CONSTANT_String:  staticObject->setObject(cur, stringAt(idx, 0)); break;
 					default:
 						J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx));
 				}

Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Tue Jan 21 04:34:53 2014
@@ -24,6 +24,7 @@ J3ClassLoader::J3InterfaceMethodLess J3C
 J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) 
 	: CompilationUnit(allocator, "class-loader"),
 		_globalReferences(allocator),
+		_staticObjects(allocator),
 		classes(vmkit::Name::less, allocator),
 		types(vmkit::Name::less, allocator),
 		interfaces(j3InterfaceMethodLess, allocator),

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 04:34:53 2014
@@ -343,10 +343,13 @@ llvm::Value* J3CodeGen::handleToObject(l
 	return builder.CreateLoad(builder.CreateGEP(obj, gep));
 }
 
-llvm::Value* J3CodeGen::staticInstance(J3Class* cl) {
+llvm::Value* J3CodeGen::staticObject(J3Class* cl) {
 	initialiseJ3ObjectType(cl);
-	return handleToObject(builder.CreateCall(funcJ3ClassStaticInstance, 
-																						typeDescriptor(cl, vm->typeJ3ClassPtr)));
+	char* id = cl->staticObjectId();
+	loader->addSymbol(id, cl->staticObjectSymbol());
+	return handleToObject(module->getOrInsertGlobal(id, vm->typeJ3ObjectHandle));
+	//return handleToObject(builder.CreateCall(funcJ3ClassStaticObject, 
+	//typeDescriptor(cl, vm->typeJ3ClassPtr)));
 }
 
 llvm::Value* J3CodeGen::vt(llvm::Value* obj) {
@@ -478,7 +481,7 @@ void J3CodeGen::getField(uint32_t idx) {
 
 void J3CodeGen::getStatic(uint32_t idx) {
 	J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
-	get(staticInstance(f->layout()->asStaticLayout()->cl()), f);
+	get(staticObject(f->layout()->asStaticLayout()->cl()), f);
 }
 
 void J3CodeGen::put(llvm::Value* dest, llvm::Value* val, J3Field* f) {
@@ -487,7 +490,7 @@ void J3CodeGen::put(llvm::Value* dest, l
 
 void J3CodeGen::putStatic(uint32_t idx) {
 	J3Field* f = cl->fieldAt(idx, J3Cst::ACC_STATIC);
-	put(staticInstance(f->layout()->asStaticLayout()->cl()), stack.pop(), f);
+	put(staticObject(f->layout()->asStaticLayout()->cl()), stack.pop(), f);
 }
 
 void J3CodeGen::putField(uint32_t idx) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=199717&r1=199716&r2=199717&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Tue Jan 21 04:34:53 2014
@@ -266,14 +266,14 @@ jmethodID JNICALL GetStaticMethodID(JNIE
 #define defGetSetField(jtype, id, j3type)																\
 	void JNICALL SetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID, jtype value) { \
 		enterJVM();																													\
-		J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->set##j3type(fieldID, value); \
+		J3ObjectType::nativeClass(clazz)->asClass()->staticObjectSymbol()->handle()->set##j3type(fieldID, value); \
 		leaveJVM();																													\
 	}																																			\
 																																				\
 	jtype JNICALL GetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID) { \
 		jtype res;																													\
 		enterJVM();																													\
-		res = J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->get##j3type(fieldID); \
+		res = J3ObjectType::nativeClass(clazz)->asClass()->staticObjectSymbol()->handle()->get##j3type(fieldID); \
 		leaveJVM();																													\
 		return res;																													\
 	}																																			\





More information about the vmkit-commits mailing list