[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