[vmkit-commits] [vmkit] r198406 - delegate to J3ClassLoader the definition of a j3signature.

Gael Thomas gael.thomas at lip6.fr
Fri Jan 3 03:30:23 PST 2014


Author: gthomas
Date: Fri Jan  3 05:30:22 2014
New Revision: 198406

URL: http://llvm.org/viewvc/llvm-project?rev=198406&view=rev
Log:
delegate to J3ClassLoader the definition of a j3signature.

Modified:
    vmkit/branches/mcjit/include/j3/j3classloader.h
    vmkit/branches/mcjit/include/j3/j3method.h
    vmkit/branches/mcjit/include/j3/j3signature.h
    vmkit/branches/mcjit/lib/j3/vm/j3.cc
    vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3signature.cc

Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan  3 05:30:22 2014
@@ -57,6 +57,9 @@ namespace j3 {
 		pthread_mutex_t                      _mutexMethods;
 		MethodRefMap                         methods;      /* all te known method */
 
+		pthread_mutex_t                      _mutexMethodTypes;
+		vmkit::NameMap<J3MethodType*>::map   methodTypes;
+
 	protected:
 		std::vector<void*, vmkit::StdAllocator<void*> > nativeLibraries;
 
@@ -64,6 +67,8 @@ namespace j3 {
 		J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator);
 
 		J3Type*                       getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end);
+		J3Type*                       getType(J3Class* from, const vmkit::Name* type);       /* find a type */
+		J3MethodType*                 getMethodType(J3Class* from, const vmkit::Name* sign); /* get a method type */
 		void                          wrongType(J3Class* from, const vmkit::Name* type);
 
 		uint32_t                      interfaceIndex(J3Method* sign);
@@ -81,9 +86,6 @@ namespace j3 {
 		J3Class*                      findLoadedClass(const vmkit::Name* name);
 		virtual J3Class*              loadClass(const vmkit::Name* name);
 
-		J3Type*                       getType(J3Class* from, const vmkit::Name* type);       /* find a type */
-		J3MethodType*                 getMethodType(J3ObjectType* from, const vmkit::Name* sign); /* get a method type */
-
 		void*                         lookupNativeFunctionPointer(J3Method* method, const char* symb);
 	};
 

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Fri Jan  3 05:30:22 2014
@@ -24,26 +24,7 @@ namespace j3 {
 	class J3Method;
 	class J3Value;
 	class J3ObjectHandle;
-
-	class J3MethodType : public vmkit::PermanentObject {
-		J3LLVMSignature*             _llvmSignature;
-		J3Type*                      _out;
-		uint32_t                     _nbIns;
-		J3Type*                      _ins[1];
-
-	public:
-		J3MethodType(J3Type** args, size_t nbArgs);
-
-		void                setLLVMSignature(J3LLVMSignature* llvmSignature) { _llvmSignature = llvmSignature; }
-		J3LLVMSignature*    llvmSignature() { return _llvmSignature; }
-		J3Type*             out() { return _out; }
-		uint32_t            nbIns() { return _nbIns; }
-		J3Type*             ins(uint32_t idx) { return _ins[idx]; }
-
-		void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) {
-			return vmkit::PermanentObject::operator new(sizeof(J3MethodType) + (n - 1) * sizeof(J3Type*), allocator);
-		}
-	};
+	class J3MethodType;
 
 	class J3MethodCode : public vmkit::Symbol {
 	public:

Modified: vmkit/branches/mcjit/include/j3/j3signature.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3signature.h (original)
+++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan  3 05:30:22 2014
@@ -9,11 +9,32 @@ namespace llvm {
 }
 
 namespace j3 {
-	class J3MethodType;
+	class J3LLVMSignature;
 	class J3Type;
 	class J3Value;
 	class J3CodeGen;
 
+	class J3MethodType : public vmkit::PermanentObject {
+		J3LLVMSignature*             _staticLLVMSignature;
+		J3LLVMSignature*             _virtualLLVMSignature;
+		J3Type*                      _out;
+		uint32_t                     _nbIns;
+		J3Type*                      _ins[1];
+
+	public:
+		J3MethodType(J3Type** args, size_t nbArgs);
+
+		void                setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature);
+		J3LLVMSignature*    llvmSignature(uint32_t access);
+		J3Type*             out() { return _out; }
+		uint32_t            nbIns() { return _nbIns; }
+		J3Type*             ins(uint32_t idx) { return _ins[idx]; }
+
+		void* operator new(size_t unused, vmkit::BumpAllocator* allocator, size_t n) {
+			return vmkit::PermanentObject::operator new(sizeof(J3MethodType) + (n - 1) * sizeof(J3Type*), allocator);
+		}
+	};
+
 	class J3LLVMSignature : vmkit::PermanentObject {
 		friend class J3CodeGen;
 

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=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Fri Jan  3 05:30:22 2014
@@ -243,8 +243,8 @@ void J3::vinternalError(const char* msg,
 	vsnprintf(buf, 65536, msg, va);
 	fprintf(stderr, "Internal error: %s\n", buf);
 	printStackTrace();
-	exit(1);
-	//abort();
+	//exit(1);
+	abort();
 }
 
 void J3::printStackTrace() {

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=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan  3 05:30:22 2014
@@ -28,6 +28,7 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob
 		types(vmkit::Name::less, allocator),
 		interfaces(j3InterfaceMethodLess, allocator),
 		methods(j3MethodLess, allocator),
+		methodTypes(vmkit::Name::less, allocator),
 		nativeLibraries(allocator) {
 	_javaClassLoader = javaClassLoader;
 
@@ -35,6 +36,7 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob
 	pthread_mutex_init(&_mutexTypes, 0);
 	pthread_mutex_init(&_mutexInterfaces, 0);
 	pthread_mutex_init(&_mutexMethods, 0);
+	pthread_mutex_init(&_mutexMethodTypes, 0);
 }
 
 uint32_t J3ClassLoader::interfaceIndex(J3Method* method) {
@@ -165,6 +167,33 @@ J3Type* J3ClassLoader::getType(J3Class*
 
 	return res;
 }
+
+
+J3MethodType* J3ClassLoader::getMethodType(J3Class* from, const vmkit::Name* sign) {
+	pthread_mutex_lock(&_mutexMethodTypes);
+	J3MethodType* res = methodTypes[sign];
+
+	if(!res) {
+		J3Type*            args[1+sign->length()];
+		uint32_t           nbArgs = 0;
+		uint32_t           cur = 1;
+
+		if(sign->cStr()[0] != J3Cst::ID_Left)
+			wrongType(from, sign);
+
+		while(sign->cStr()[cur] != J3Cst::ID_Right) {
+			args[nbArgs++] = getTypeInternal(from, sign, cur, &cur);
+	}
+		args[nbArgs++] = getTypeInternal(from, sign, cur+1, &cur);
+		if(cur != sign->length())
+			wrongType(from, sign);
+		
+		methodTypes[sign] = res = new(allocator(), nbArgs - 1) J3MethodType(args, nbArgs);
+	}
+	pthread_mutex_unlock(&_mutexMethodTypes);
+
+	return res;
+}
 
 J3Method* J3ClassLoader::method(uint16_t access, J3ObjectType* type, const vmkit::Name* name, const vmkit::Name* sign) {
 	if(type->isArrayClass())

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=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan  3 05:30:22 2014
@@ -104,14 +104,15 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 			llvmFunction->dump();
 	}
 
-	if(withCaller && !methodType->llvmSignature()->caller())
-		methodType->llvmSignature()->generateCallerIR(this, module, "generic-caller");
+	uint32_t access = method->access();
+	if(withCaller && !methodType->llvmSignature(access)->caller())
+		methodType->llvmSignature(access)->generateCallerIR(this, module, "generic-caller");
 
 	loader->compileModule(module);
 
-	if(withCaller && !methodType->llvmSignature()->caller()) {
+	if(withCaller && !methodType->llvmSignature(access)->caller()) {
 		J3LLVMSignature::function_t caller = (J3LLVMSignature::function_t)loader->ee()->getFunctionAddress("generic-caller");
-		methodType->llvmSignature()->_caller = caller;
+		methodType->llvmSignature(access)->_caller = caller;
 	}
 
 	if(withMethod) {
@@ -189,7 +190,7 @@ llvm::Value* J3CodeGen::unflatten(llvm::
 
 llvm::FunctionType* J3CodeGen::llvmFunctionType(J3Method* method) {
 	J3MethodType* type = method->methodType(cl);
-	J3LLVMSignature* res = type->llvmSignature();
+	J3LLVMSignature* res = type->llvmSignature(method->access());
 
 	if(!res) {
 		std::vector<llvm::Type*> in;
@@ -204,7 +205,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct
 		res = vm->llvmSignatures[funcType];
 		if(!res)
 			vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType);
-		type->setLLVMSignature(res);
+		type->setLLVMSignature(method->access(), res);
 	}
 	return res->functionType();
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Fri Jan  3 05:30:22 2014
@@ -22,13 +22,6 @@
 
 using namespace j3;
 
-J3MethodType::J3MethodType(J3Type** args, size_t nbArgs) {
-	_out = args[nbArgs-1];
-	_nbIns = nbArgs-1;
-	memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*));
-			
-}
-
 J3Method::J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign) :
 	_selfCode(this) {
 	_access = access;
@@ -120,10 +113,10 @@ J3Value J3Method::internalInvoke(bool st
 
 	//fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->sign()->cStr());
 
-	J3LLVMSignature::function_t caller = methodType()->llvmSignature()->caller();
+	J3LLVMSignature::function_t caller = methodType()->llvmSignature(access())->caller();
 	if(!caller) {
 		J3CodeGen::translate(this, 0, 1);
-		caller = methodType()->llvmSignature()->caller();
+		caller = methodType()->llvmSignature(access())->caller();
 	}
 
 	J3Value res = caller(fn, inArgs);
@@ -226,24 +219,8 @@ J3Value J3Method::invokeVirtual(J3Object
 }
 
 J3MethodType* J3Method::methodType(J3Class* from) {
-	if(!_methodType) {
-		J3ClassLoader*     loader = cl()->loader();
-		J3Type*            args[1+sign()->length()];
-		uint32_t           nbArgs = 0;
-		uint32_t           cur = 1;
-
-		if(sign()->cStr()[0] != J3Cst::ID_Left)
-			loader->wrongType(from, sign());
-
-		while(sign()->cStr()[cur] != J3Cst::ID_Right) {
-			args[nbArgs++] = loader->getTypeInternal(from, sign(), cur, &cur);
-		}
-		args[nbArgs++] = loader->getTypeInternal(from, sign(), cur+1, &cur);
-		if(cur != sign()->length())
-			loader->wrongType(from, sign());
-		
-		_methodType = new(loader->allocator(), nbArgs - 1) J3MethodType(args, nbArgs);
-	}
+	if(!_methodType)
+		_methodType = cl()->loader()->getMethodType(from, sign());
 
 	return _methodType;
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3signature.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3signature.cc?rev=198406&r1=198405&r2=198406&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan  3 05:30:22 2014
@@ -9,6 +9,24 @@
 
 using namespace j3;
 
+J3MethodType::J3MethodType(J3Type** args, size_t nbArgs) {
+	_out = args[nbArgs-1];
+	_nbIns = nbArgs-1;
+	memcpy(_ins, args, (nbArgs-1)*sizeof(J3Type*));
+			
+}
+
+void J3MethodType::setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature) { 
+	if(J3Cst::isStatic(access))
+		_staticLLVMSignature = llvmSignature;
+	else
+		_virtualLLVMSignature = llvmSignature;
+}
+
+J3LLVMSignature* J3MethodType::llvmSignature(uint32_t access) { 
+	return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; 
+}
+
 J3LLVMSignature::J3LLVMSignature(llvm::FunctionType* functionType) {
 	_functionType = functionType;
 }





More information about the vmkit-commits mailing list