[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