[vmkit-commits] [vmkit] r199740 - Use J3StringSymbol to find string at runtime.

Gael Thomas gael.thomas at lip6.fr
Tue Jan 21 05:23:27 PST 2014


Author: gthomas
Date: Tue Jan 21 07:23:27 2014
New Revision: 199740

URL: http://llvm.org/viewvc/llvm-project?rev=199740&view=rev
Log:
Use J3StringSymbol to find string at runtime.

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

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Jan 21 07:23:27 2014
@@ -263,7 +263,7 @@ namespace j3 {
 		double              doubleAt(uint16_t idx);
 		uint32_t            integerAt(uint16_t idx);
 		uint64_t            longAt(uint16_t idx);
-		J3ObjectHandle*     stringAt(uint16_t idx, bool doPush);
+		J3StringSymbol*     stringAt(uint16_t idx);
 		J3ObjectType*       classAt(uint16_t idx);
 		J3Method*           interfaceMethodAt(uint16_t idx, uint16_t access);
 		J3Method*           methodAt(uint16_t idx, uint16_t access);

Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Tue Jan 21 07:23:27 2014
@@ -44,6 +44,7 @@ namespace j3 {
 		J3ObjectHandle*                      _javaClassLoader;
 		J3GlobalReferences                   _globalReferences;
 
+		vmkit::LockedStack<J3ObjectHandle>       _staticObjectHandles;
 		vmkit::LockedStack<J3StaticObjectSymbol> _staticObjects;
 
 		pthread_mutex_t                      _mutexClasses;
@@ -61,9 +62,12 @@ namespace j3 {
 		pthread_mutex_t                                 _mutexNativeLibraries;
 		std::vector<void*, vmkit::StdAllocator<void*> > nativeLibraries;
 
+		size_t                               _stringSymbolCounter;
 	public:
 		J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator);
 
+		J3StringSymbol*               newStringSymbol(J3ObjectHandle* handle);
+
 		uint32_t                      compilationMode() { return _compilationMode; }
 		void                          setCompilationMode(uint32_t mode) { _compilationMode = mode; }
 
@@ -81,6 +85,8 @@ namespace j3 {
 		uint32_t                      interfaceIndex(J3Method* signature);
 
 		J3GlobalReferences*           globalReferences() { return &_globalReferences; }
+
+		vmkit::LockedStack<J3ObjectHandle>*       staticObjectHandles() { return &_staticObjectHandles; }
 		vmkit::LockedStack<J3StaticObjectSymbol>* staticObjects() { return &_staticObjects; }
 
 		static J3ClassLoader*         nativeClassLoader(J3ObjectHandle* jloader);

Modified: vmkit/branches/mcjit/include/j3/j3meta.def
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3meta.def?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3meta.def (original)
+++ vmkit/branches/mcjit/include/j3/j3meta.def Tue Jan 21 07:23:27 2014
@@ -1,7 +1,6 @@
 _x(funcJ3TypeVT,                    "j3::J3Type::vt()")
 _x(funcJ3ObjectTypeResolve,         "j3::J3Type::resolve()")
 _x(funcJ3ObjectTypeInitialise,      "j3::J3Type::initialise()")
-_x(funcJ3ClassStringAt,             "j3::J3Class::stringAt(unsigned short, bool)")
 _x(funcJ3TypeJavaClass,             "j3::J3Type::javaClass(bool, j3::J3ObjectHandle*)")
 _x(funcJniEnv,                      "j3::J3::jniEnv()")
 _x(funcJ3ArrayObjectMultianewArray, "j3::J3ArrayObject::multianewArray(j3::J3ArrayClass*, unsigned int, unsigned int*)")

Modified: vmkit/branches/mcjit/include/j3/j3symbols.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbols.h?rev=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbols.h (original)
+++ vmkit/branches/mcjit/include/j3/j3symbols.h Tue Jan 21 07:23:27 2014
@@ -2,16 +2,6 @@
 #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 {
 		const char*     _id;
 		J3VirtualTable* _vt;
@@ -28,21 +18,37 @@ namespace j3 {
 	};
 
 	class J3StaticObjectSymbol : public vmkit::Symbol {
-		const char*    _id;
-		J3ObjectHandle _handle;
+		const char*     _id;
+		J3ObjectHandle* _handle;
 	public:
-		J3StaticObjectSymbol() {}
+		J3StaticObjectSymbol(J3ObjectHandle* handle) { _handle = handle; }
 
 		void*           operator new(size_t n, vmkit::LockedStack<J3StaticObjectSymbol>* stack) { return stack->push(); }
 
-		J3ObjectHandle* handle() { return &_handle; }
+		J3ObjectHandle* handle() { return _handle; }
 		const char*     id() { return _id; }
 
 		void*           getSymbolAddress() { return handle(); }
 		
 		void            setId(const char* id) { _id = id; }
-		void            setHandle(J3ObjectHandle* handle) { _handle = *handle; }
+		void            setHandle(J3ObjectHandle* handle) { *_handle = *handle; }
 	};
+
+	/* only symbol accessed with a load because unification implies that the string can not be relocated if it is already defined */
+	class J3StringSymbol : public vmkit::Symbol {
+		J3ObjectHandle*  _handle;
+		char*            _id;
+	public:
+		J3StringSymbol(char* id, J3ObjectHandle* handle) { _id = id; _handle = handle; }
+
+		void* operator new(size_t n, vmkit::BumpAllocator* allocator) { return allocator->allocate(n); }
+
+		char* id() { return _id; }
+		J3ObjectHandle* handle() { return _handle; }
+
+		void* getSymbolAddress() { return &_handle; }
+	};
+
 }
 
 #endif

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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Jan 21 07:23:27 2014
@@ -336,7 +336,8 @@ J3Class::J3Class(J3ClassLoader* loader,
 	_source = source;
 	_bytes = bytes;
 	status = LOADED;
-	_staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol();
+	/* allocating the J3ObjectHande looks a little strange, but it will become important to reload AOT compiled class loaders */
+	_staticObjectSymbol = new(loader->staticObjects()) J3StaticObjectSymbol(loader->staticObjectHandles()->push());
 }
 
 void J3Class::compileAll() {
@@ -565,7 +566,7 @@ void J3Class::doInitialise() {
 					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;
+					case J3Cst::CONSTANT_String:  staticObject->setObject(cur, stringAt(idx)->handle()); break;
 					default:
 						J3::classFormatError(this, "invalid ctp entry ConstantAttribute with type %d", getCtpType(idx));
 				}
@@ -820,13 +821,16 @@ void* J3Class::getCtpResolved(uint16_t i
 	return ctpResolved[idx];
 }
 
-J3ObjectHandle* J3Class::stringAt(uint16_t idx, bool doPush) {
+J3StringSymbol* J3Class::stringAt(uint16_t idx) {
 	check(idx, J3Cst::CONSTANT_String);
-	J3ObjectHandle* res = (J3ObjectHandle*)ctpResolved[idx];
+	J3StringSymbol* res = (J3StringSymbol*)ctpResolved[idx];
+
 	if(!res) {
-		ctpResolved[idx] = res = J3Thread::get()->vm()->nameToString(nameAt(ctpValues[idx]), 0);
+		ctpResolved[idx] = res = loader()->newStringSymbol(J3Thread::get()->vm()->nameToString(nameAt(ctpValues[idx]), 0));
+		loader()->addSymbol(res->id(), res);
 	}
-	return (J3ObjectHandle*)res;
+
+	return res;
 }
 
 float J3Class::floatAt(uint16_t 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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Tue Jan 21 07:23:27 2014
@@ -24,6 +24,7 @@ J3ClassLoader::J3InterfaceMethodLess J3C
 J3ClassLoader::J3ClassLoader(J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator) 
 	: CompilationUnit(allocator, "class-loader"),
 		_globalReferences(allocator),
+		_staticObjectHandles(allocator),
 		_staticObjects(allocator),
 		classes(vmkit::Name::less, allocator),
 		types(vmkit::Name::less, allocator),
@@ -39,6 +40,16 @@ J3ClassLoader::J3ClassLoader(J3ObjectHan
 	_javaClassLoader = globalReferences()->add(javaClassLoader);
 }
 
+J3StringSymbol* J3ClassLoader::newStringSymbol(J3ObjectHandle* handle) {
+	size_t num = __sync_fetch_and_add(&_stringSymbolCounter, 1);
+	char buf[256];
+	snprintf(buf, 256, "jstr%lu", num);
+	size_t len = strlen(buf);
+	char* id = (char*)allocator()->allocate(len+1);
+	memcpy(id, buf, len+1);
+	return new(allocator()) J3StringSymbol(id, handle);
+}
+
 void J3ClassLoader::addNativeLibrary(void* handle) {
 	pthread_mutex_lock(&_mutexNativeLibraries);
 	nativeLibraries.push_back(handle);

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=199740&r1=199739&r2=199740&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Jan 21 07:23:27 2014
@@ -717,10 +717,7 @@ void J3CodeGen::ldc(uint32_t idx) {
 		case J3Cst::CONSTANT_Double:  res = llvm::ConstantFP::get(builder.getDoubleTy(), cl->doubleAt(idx)); break;
 		case J3Cst::CONSTANT_Class:   res = handleToObject(javaClass(cl->classAt(idx), 0)); break;
 		case J3Cst::CONSTANT_String:  
-			res = handleToObject(builder.CreateCall3(funcJ3ClassStringAt, 
-																								typeDescriptor(cl, vm->typeJ3ClassPtr),
-																								builder.getInt16(idx),
-																								builder.getInt1(0)));
+			res = handleToObject(builder.CreateLoad(module->getOrInsertGlobal(cl->stringAt(idx)->id(), vm->typeJ3ObjectHandlePtr)));
 			break;
 		default:
 			J3::classFormatError(cl, "wrong ldc type: %d\n", cl->getCtpType(idx));





More information about the vmkit-commits mailing list