[vmkit-commits] [vmkit] r198485 - Don't use nbIns/ins()/out() ouside j3codegen anymore.

Gael Thomas gael.thomas at lip6.fr
Sat Jan 4 04:14:36 PST 2014


Author: gthomas
Date: Sat Jan  4 06:14:36 2014
New Revision: 198485

URL: http://llvm.org/viewvc/llvm-project?rev=198485&view=rev
Log:
Don't use nbIns/ins()/out() ouside j3codegen anymore.

Modified:
    vmkit/branches/mcjit/include/j3/j3method.h
    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
    vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Sat Jan  4 06:14:36 2014
@@ -5,6 +5,7 @@
 #include <vector>
 
 #include "vmkit/compiler.h"
+#include "j3/j3signature.h"
 
 namespace llvm {
 	class FunctionType;
@@ -53,9 +54,8 @@ namespace j3 {
 		void* volatile               _virtualTrampoline;
 		J3ObjectHandle* volatile     _javaMethod;
 
-		J3Value            internalInvoke(bool statically, J3ObjectHandle* handle, va_list va);
-		J3Value            internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* args);
-		J3Value            internalInvoke(bool statically, J3Value* args);
+		J3Value            internalInvoke(J3ObjectHandle* handle, va_list va);
+		J3Value            internalInvoke(J3ObjectHandle* handle, J3Value* args);
 		void               buildLLVMNames(J3Class* from);
 	public:
 		J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, J3Signature* signature);
@@ -84,7 +84,6 @@ namespace j3 {
 		uint32_t            index();
 		uint32_t*           indexPtr() { return &_index; }
 		bool                isResolved() { return _index != -1; }
-		bool                isCompiled() { return _fnPtr; }
 
 		J3Attributes*       attributes() const { return _attributes; }
 		uint16_t            access() const { return _access; }
@@ -104,7 +103,9 @@ namespace j3 {
 		J3Value             invokeVirtual(J3ObjectHandle* obj, J3Value* args);
 		J3Value             invokeVirtual(J3ObjectHandle* obj, va_list va);
 
-		void*               fnPtr(bool withCaller);
+		void                ensureCompiled(bool withCaller);
+		J3LLVMSignature::function_t cxxCaller();
+		void*               fnPtr();
 		void*               functionPointerOrStaticTrampoline();
 		void*               functionPointerOrVirtualTrampoline();
 

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=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sat Jan  4 06:14:36 2014
@@ -149,8 +149,12 @@ J3Type* J3ClassLoader::getTypeInternal(J
 
 	*pend = pos;
 		
-	if(prof && !unify)
-		res = res->getArray(prof, start ? 0 : typeName);
+	if(prof) {
+		if(unify)
+			res = vm()->objectClass;
+		else
+			res = res->getArray(prof, start ? 0 : typeName);
+	}
 
 	return res;
 }

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=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan  4 06:14:36 2014
@@ -215,7 +215,7 @@ llvm::FunctionType* J3CodeGen::llvmFunct
 }
 
 llvm::Function* J3CodeGen::buildFunction(J3Method* method, bool isStub) {
-	const char* id = (isStub && !method->isCompiled()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl);
+	const char* id = (isStub && !method->fnPtr()) ? method->llvmStubName(cl) : method->llvmFunctionName(cl);
 	return (llvm::Function*)module->getOrInsertFunction(id, llvmFunctionType(method));
 }
 

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=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sat Jan  4 06:14:36 2014
@@ -44,35 +44,41 @@ void J3Method::markCompiled(llvm::Functi
 	_fnPtr = fnPtr;
 }
 
-void* J3Method::fnPtr(bool withCaller) {
-	if(!isCompiled()) {
-		//fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr());
+void* J3Method::fnPtr() {
+	return _fnPtr;
+}
+
+J3LLVMSignature::function_t J3Method::cxxCaller() {
+	return signature()->llvmSignature(access())->caller();
+}
+
+void J3Method::ensureCompiled(bool withCaller) {
+	if(!fnPtr() || (withCaller && !cxxCaller())) {
+		// fprintf(stderr, "materializing: %s::%s%s\n", this, cl()->name()->cStr(), name()->cStr(), signature()->cStr());
 		if(!isResolved()) {
 			if(cl()->loader()->vm()->options()->debugLinking)
 				fprintf(stderr, "linking %s::%s\n", cl()->name()->cStr(), name()->cStr());
-
+			
 			cl()->initialise();
 			if(!isResolved())
 				J3::noSuchMethodError("unable to find method", cl(), name(), signature());
 		}
 
-		J3CodeGen::translate(this, 1, withCaller);
+		J3CodeGen::translate(this, !fnPtr(), withCaller);
  	}
-
-	return _fnPtr;
 }
 
 void* J3Method::functionPointerOrStaticTrampoline() {
-	if(isCompiled())
-		return _fnPtr;
+	if(fnPtr())
+		return fnPtr();
 	if(!_staticTrampoline)
 		_staticTrampoline = J3Trampoline::buildStaticTrampoline(cl()->loader()->allocator(), this);
 	return _staticTrampoline;
 }
 
 void* J3Method::functionPointerOrVirtualTrampoline() {
-	if(isCompiled())
-		return _fnPtr;
+	if(fnPtr())
+		return fnPtr();
 	if(!_virtualTrampoline)
 		_virtualTrampoline = J3Trampoline::buildVirtualTrampoline(cl()->loader()->allocator(), this);
 	return _virtualTrampoline;
@@ -106,92 +112,79 @@ J3Method* J3Method::resolve(J3ObjectHand
 	return obj->vt()->type()->asObjectType()->findVirtualMethod(name(), signature());
 }
 
-J3Value J3Method::internalInvoke(bool statically, J3Value* inArgs) {
-	J3Method* target = statically ? this : resolve(inArgs[0].valObject);
-
-	void* fn = fnPtr(1);
-
-	//fprintf(stderr, "Internal invoke %s::%s%s\n", target->cl()->name()->cStr(), target->name()->cStr(), target->signature()->cStr());
-
-	J3LLVMSignature::function_t caller = signature()->llvmSignature(access())->caller();
-	if(!caller) {
-		J3CodeGen::translate(this, 0, 1);
-		caller = signature()->llvmSignature(access())->caller();
-	}
-
-	J3Value res = caller(fn, inArgs);
+J3Value J3Method::internalInvoke(J3ObjectHandle* handle, J3Value* inArgs) {
+	ensureCompiled(1);
 
-	return res;
-}
-
-J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, J3Value* inArgs) {
 	J3Value* reIn;
 	if(handle) {
-		reIn = (J3Value*)alloca((signature()->nbIns()+1)*sizeof(J3Value));
+		uint32_t n = signature()->functionType(J3Cst::ACC_STATIC)->getNumParams();
+		reIn = (J3Value*)alloca((n+1)*sizeof(J3Value));
 		reIn[0].valObject = handle;
-		memcpy(reIn+1, inArgs, signature()->nbIns()*sizeof(J3Value));
+		memcpy(reIn+1, inArgs, n*sizeof(J3Value));
 	} else
 		reIn = inArgs;
-	return internalInvoke(statically, reIn);
+	return cxxCaller()(fnPtr(), reIn);
 }
 
-J3Value J3Method::internalInvoke(bool statically, J3ObjectHandle* handle, va_list va) {
-	J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(signature()->nbIns() + 1));
+J3Value J3Method::internalInvoke(J3ObjectHandle* handle, va_list va) {
+	ensureCompiled(1);
+
+	llvm::FunctionType* fType = signature()->functionType(J3Cst::ACC_STATIC);      /* static signature for va */
+	J3Value* args = (J3Value*)alloca(sizeof(J3Value)*(fType->getNumParams() + 1));
 	J3* vm = cl()->loader()->vm();
-	J3Type* cur;
-	uint32_t d = 0;
+	uint32_t i = 0;
 
 	if(handle)
-		args[d++].valObject = handle;
-
-	for(uint32_t i=0; i<signature()->nbIns(); i++) {
-		cur = signature()->ins(i);
-
-		if(cur == vm->typeBoolean)
-			args[i+d].valBoolean = va_arg(va, bool);
-		else if(cur == vm->typeByte)
-			args[i+d].valByte = va_arg(va, int8_t);
-		else if(cur == vm->typeShort)
-			args[i+d].valShort = va_arg(va, int16_t);
-		else if(cur == vm->typeChar)
-			args[i+d].valChar = va_arg(va, uint16_t);
-		else if(cur == vm->typeInteger)
-			args[i+d].valInteger = va_arg(va, int32_t);
-		else if(cur == vm->typeLong)
-			args[i+d].valLong = va_arg(va, int64_t);
-		else if(cur == vm->typeFloat)
-			args[i+d].valFloat = va_arg(va, float);
-		else if(cur == vm->typeDouble)
-			args[i+d].valDouble = va_arg(va, double);
+		args[i++].valObject = handle;
+	
+	for(llvm::FunctionType::param_iterator cur=fType->param_begin(); cur!=fType->param_end(); cur++, i++) {
+		llvm::Type* t = *cur;
+
+		if(t == vm->typeBoolean->llvmType())
+			args[i].valBoolean = va_arg(va, bool);
+		else if(t == vm->typeByte->llvmType())
+			args[i].valByte = va_arg(va, int8_t);
+		else if(t == vm->typeShort->llvmType())
+			args[i].valShort = va_arg(va, int16_t);
+		else if(t == vm->typeChar->llvmType())
+			args[i].valChar = va_arg(va, uint16_t);
+		else if(t == vm->typeInteger->llvmType())
+			args[i].valInteger = va_arg(va, int32_t);
+		else if(t == vm->typeLong->llvmType())
+			args[i].valLong = va_arg(va, int64_t);
+		else if(t == vm->typeFloat->llvmType())
+			args[i].valFloat = va_arg(va, float);
+		else if(t == vm->typeDouble->llvmType())
+			args[i].valDouble = va_arg(va, double);
 		else
-			args[i+d].valObject = va_arg(va, J3ObjectHandle*);
+			args[i].valObject = va_arg(va, J3ObjectHandle*);
 	}
 
-	return internalInvoke(statically, args);
+	return cxxCaller()(fnPtr(), args);
 }
 
 J3Value J3Method::invokeStatic(J3Value* args) {
-	return internalInvoke(1, 0, args);
+	return internalInvoke(0, args);
 }
 
-J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, J3Value* args) {
-	return internalInvoke(1, handle, args);
+J3Value J3Method::invokeStatic(va_list va) {
+	return internalInvoke(0, va);
 }
 
-J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, J3Value* args) {
-	return internalInvoke(0, handle, args);
+J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, J3Value* args) {
+	return internalInvoke(handle, args);
 }
 
-J3Value J3Method::invokeStatic(va_list va) {
-	return internalInvoke(1, 0, va);
+J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, va_list va) {
+	return internalInvoke(handle, va);
 }
 
-J3Value J3Method::invokeSpecial(J3ObjectHandle* handle, va_list va) {
-	return internalInvoke(1, handle, va);
+J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, J3Value* args) {
+	return resolve(handle)->internalInvoke(handle, args);
 }
 
 J3Value J3Method::invokeVirtual(J3ObjectHandle* handle, va_list va) {
-	return internalInvoke(0, handle, va);
+	return resolve(handle)->internalInvoke(handle, va);
 }
 
 J3Value J3Method::invokeStatic(...) {

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=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3signature.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3signature.cc Sat Jan  4 06:14:36 2014
@@ -36,8 +36,8 @@ void J3Signature::checkFunctionType() {
 
 		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);
+		_staticFunctionType = llvm::FunctionType::get(out, sins, 0);
+		_virtualFunctionType = llvm::FunctionType::get(out, vins, 0);
 	}
 }
 

Modified: vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc?rev=198485&r1=198484&r2=198485&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3trampoline.cc Sat Jan  4 06:14:36 2014
@@ -16,7 +16,8 @@ void* J3Trampoline::interfaceTrampoline(
 	void* res;
 
 	if(desc->nbMethods == 1) {
-		res = desc->methods[0]->fnPtr(0);
+		desc->methods[0]->ensureCompiled(0);
+		res = desc->methods[0]->fnPtr();
 		handle->vt()->_interfaceMethodTable[index] = res;
 	} else
 		J3::internalError("implement me: interface Trampoline with collision");
@@ -27,7 +28,8 @@ void* J3Trampoline::interfaceTrampoline(
 }
 
 void* J3Trampoline::staticTrampoline(J3Object* obj, J3Method* target) {
-	return target->fnPtr(0);
+	target->ensureCompiled(0);
+	return target->fnPtr();
 }
 	
 void* J3Trampoline::virtualTrampoline(J3Object* obj, J3Method* target) {
@@ -36,7 +38,8 @@ void* J3Trampoline::virtualTrampoline(J3
 	J3ObjectType* cl = handle->vt()->type()->asObjectType();
 	J3Method* impl = cl == target->cl() ? target : cl->findVirtualMethod(target->name(), target->signature());
 
-	void* res = impl->fnPtr(0);
+	impl->ensureCompiled(0);
+	void* res = impl->fnPtr();
 	handle->vt()->virtualMethods()[impl->index()] = res;
 
 	J3Thread::get()->restore(prev);





More information about the vmkit-commits mailing list