[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