[vmkit-commits] [vmkit] r198411 - Add a function to create a function type without resolving the intermediate J3Types.

Gael Thomas gael.thomas at lip6.fr
Fri Jan 3 05:08:02 PST 2014


Author: gthomas
Date: Fri Jan  3 07:08:02 2014
New Revision: 198411

URL: http://llvm.org/viewvc/llvm-project?rev=198411&view=rev
Log:
Add a function to create a function type without resolving the intermediate J3Types.

Modified:
    vmkit/branches/mcjit/include/j3/j3classloader.h
    vmkit/branches/mcjit/include/j3/j3signature.h
    vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.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=198411&r1=198410&r2=198411&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Fri Jan  3 07:08:02 2014
@@ -66,7 +66,7 @@ namespace j3 {
 	public:
 		J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator);
 
-		J3Type*                       getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end);
+		J3Type*                       getTypeInternal(J3ObjectType* from, const vmkit::Name* type, uint32_t start, uint32_t* end, bool unify);
 		J3Type*                       getType(J3ObjectType* from, const vmkit::Name* type);       /* find a type */
 		J3Signature*                  getSignature(J3ObjectType* from, const vmkit::Name* signature); /* get a method type */
 		void                          wrongType(J3ObjectType* from, const vmkit::Name* type);

Modified: vmkit/branches/mcjit/include/j3/j3signature.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3signature.h?rev=198411&r1=198410&r2=198411&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3signature.h (original)
+++ vmkit/branches/mcjit/include/j3/j3signature.h Fri Jan  3 07:08:02 2014
@@ -24,17 +24,20 @@ namespace j3 {
 		const vmkit::Name*           _name;
 		J3LLVMSignature*             _staticLLVMSignature;
 		J3LLVMSignature*             _virtualLLVMSignature;
-		J3Type*                      _out;
+		J3Type* volatile             _out;
 		uint32_t                     _nbIns;
 		J3Type**                     _ins;
+		llvm::FunctionType*          _staticFunctionType;
+		llvm::FunctionType* volatile _virtualFunctionType;
 
 		void checkInOut();
-
+		void checkFunctionType();
 	public:
 		J3Signature(J3ClassLoader* loader, const vmkit::Name* name);
 
 		const vmkit::Name*  name() { return _name; }
 		J3ClassLoader*      loader() { return _loader; }
+		llvm::FunctionType* functionType(uint32_t access); /* has to be called when compiler lock is held */
 		void                setLLVMSignature(uint32_t access, J3LLVMSignature* llvmSignature);
 		J3LLVMSignature*    llvmSignature(uint32_t access);
 		J3Type*             out() { checkInOut(); return _out; }

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=198411&r1=198410&r2=198411&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Fri Jan  3 07:08:02 2014
@@ -91,7 +91,7 @@ void J3ClassLoader::wrongType(J3ObjectTy
 	J3::classFormatError(from, "wrong type: %s", type->cStr());
 }
 
-J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend) {
+J3Type* J3ClassLoader::getTypeInternal(J3ObjectType* from, const vmkit::Name* typeName, uint32_t start, uint32_t* pend, bool unify) {
 	J3Type*        res  = 0;
 	const char*    type = typeName->cStr();
 	uint32_t       len  = typeName->length();
@@ -114,7 +114,16 @@ J3Type* J3ClassLoader::getTypeInternal(J
 			case J3Cst::ID_Short:     res = vm()->typeShort; pos++; break;
 			case J3Cst::ID_Boolean:   res = vm()->typeBoolean; pos++; break;
 			case J3Cst::ID_Classname: 
-				{ 
+				if(unify) {
+					uint32_t start = ++pos;
+					for(; pos < len && type[pos] != J3Cst::ID_End; pos++);
+					
+					if(type[pos] != J3Cst::ID_End)
+						wrongType(from, typeName);
+
+					pos++;
+					res = vm()->objectClass;
+				} else {
 					uint32_t start = ++pos;
 					char buf[len + 1 - start], c;
 					
@@ -140,7 +149,7 @@ J3Type* J3ClassLoader::getTypeInternal(J
 
 	*pend = pos;
 		
-	if(prof)
+	if(prof && !unify)
 		res = res->getArray(prof, start ? 0 : typeName);
 
 	return res;
@@ -153,7 +162,7 @@ J3Type* J3ClassLoader::getType(J3ObjectT
 
 	if(!res) {
 		uint32_t end;
-		res = getTypeInternal(from, type, 0, &end);
+		res = getTypeInternal(from, type, 0, &end, 0);
 
 		if(end != type->length())
 			wrongType(from, type);

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=198411&r1=198410&r2=198411&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Fri Jan  3 07:08:02 2014
@@ -210,6 +210,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct
 			vm->llvmSignatures[funcType] = res = new(vm->allocator()) J3LLVMSignature(funcType);
 		type->setLLVMSignature(method->access(), res);
 	}
+
 	return res->functionType();
 }
 

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=198411&r1=198410&r2=198411&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Fri Jan  3 07:08:02 2014
@@ -2,11 +2,13 @@
 #include "j3/j3object.h"
 #include "j3/j3codegen.h"
 #include "j3/j3classloader.h"
+#include "j3/j3class.h"
 #include "j3/j3.h"
 
 #include "llvm/IR/Function.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/IRBuilder.h"
+#include "llvm/IR/Type.h"
 
 using namespace j3;
 
@@ -15,6 +17,35 @@ J3Signature::J3Signature(J3ClassLoader*
 	_name = name;
 }
 
+void J3Signature::checkFunctionType() {
+	if(!_virtualFunctionType) {
+		std::vector<llvm::Type*> vins;
+		std::vector<llvm::Type*> sins;
+		uint32_t                 cur = 1;
+
+		vins.push_back(loader()->vm()->objectClass->llvmType());
+
+		if(name()->cStr()[0] != J3Cst::ID_Left)
+			loader()->wrongType(0, name());
+
+		while(name()->cStr()[cur] != J3Cst::ID_Right) {
+			llvm::Type* in = loader()->getTypeInternal(0, name(), cur, &cur, 1)->llvmType();
+			sins.push_back(in);
+			vins.push_back(in);
+		}
+
+		llvm::Type* out = loader()->getTypeInternal(0, name(), cur+1, &cur, 1)->llvmType();
+
+		_staticFunctionType = llvm::FunctionType::get(out, vins, 0);
+		_virtualFunctionType = llvm::FunctionType::get(out, sins, 0);
+	}
+}
+
+llvm::FunctionType* J3Signature::functionType(uint32_t access) {
+	checkFunctionType();
+	return J3Cst::isStatic(access) ? _staticFunctionType : _virtualFunctionType;
+}
+
 void J3Signature::checkInOut() {
 	if(!_out) {
 		J3Type*            args[1+name()->length()];
@@ -25,13 +56,13 @@ void J3Signature::checkInOut() {
 			loader()->wrongType(0, name());
 
 		while(name()->cStr()[cur] != J3Cst::ID_Right)
-			args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur);
+			args[nbArgs++] = loader()->getTypeInternal(0, name(), cur, &cur, 0);
 
 		_nbIns = nbArgs;
 		_ins = (J3Type**)loader()->allocator()->allocate(nbArgs*sizeof(J3Type*));
 		memcpy(_ins, args, nbArgs*sizeof(J3Type*));
 
-		_out = loader()->getTypeInternal(0, name(), cur+1, &cur);
+		_out = loader()->getTypeInternal(0, name(), cur+1, &cur, 0); /* has to be the last (thread safety) */
 		if(cur != name()->length())
 			loader()->wrongType(0, name());
 	}
@@ -45,6 +76,7 @@ void J3Signature::setLLVMSignature(uint3
 }
 
 J3LLVMSignature* J3Signature::llvmSignature(uint32_t access) { 
+	checkFunctionType();
 	return J3Cst::isStatic(access) ? _staticLLVMSignature : _virtualLLVMSignature; 
 }
 





More information about the vmkit-commits mailing list