[vmkit-commits] [vmkit] r198250 - Better typing for llvmDescriptor
Gael Thomas
gael.thomas at lip6.fr
Mon Dec 30 13:13:46 PST 2013
Author: gthomas
Date: Mon Dec 30 15:13:46 2013
New Revision: 198250
URL: http://llvm.org/viewvc/llvm-project?rev=198250&view=rev
Log:
Better typing for llvmDescriptor
Modified:
vmkit/branches/mcjit/include/j3/j3.h
vmkit/branches/mcjit/include/j3/j3class.h
vmkit/branches/mcjit/include/j3/j3codegen.h
vmkit/branches/mcjit/include/j3/j3method.h
vmkit/branches/mcjit/lib/j3/vm/j3.cc
vmkit/branches/mcjit/lib/j3/vm/j3class.cc
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3method.cc
Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Mon Dec 30 15:13:46 2013
@@ -84,6 +84,7 @@ namespace j3 {
llvm::Type* typeJ3TypePtr;
llvm::Type* typeJ3LayoutPtr;
llvm::Type* typeJ3Thread;
+ llvm::Type* typeJ3ObjectType;
llvm::Type* typeJ3ObjectTypePtr;
llvm::Type* typeJ3Class;
llvm::Type* typeJ3ClassPtr;
Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Mon Dec 30 15:13:46 2013
@@ -59,8 +59,6 @@ namespace j3 {
void* getSymbolAddress();
- virtual llvm::GlobalValue* llvmDescriptor(llvm::Module* module) { return 0; }
-
int isTypeDescriptor() { return 1; }
bool isResolved() { return status >= RESOLVED; }
@@ -170,6 +168,7 @@ namespace j3 {
uint32_t logSize() { return sizeof(uintptr_t) == 8 ? 3 : 2; }
llvm::Type* llvmType();
+ llvm::GlobalValue* unsafe_llvmDescriptor(llvm::Module* module);
J3InterfaceSlotDescriptor* slotDescriptorAt(uint32_t index) { return &_interfaceSlotDescriptors[index]; }
void prepareInterfaceTable();
@@ -279,8 +278,6 @@ namespace j3 {
J3Method* methodAt(uint16_t idx, uint16_t access);
J3Field* fieldAt(uint16_t idx, uint16_t access);
- llvm::GlobalValue* llvmDescriptor(llvm::Module* module);
-
J3ClassBytes* bytes() { return _bytes; }
bool isClass() { return 1; }
@@ -301,9 +298,6 @@ namespace j3 {
public:
J3ArrayClass(J3ClassLoader* loader, J3Type* component, const vmkit::Name* name);
-
- llvm::GlobalValue* llvmDescriptor(llvm::Module* module);
-
J3Type* component() { return _component; }
bool isArrayClass() { return 1; }
};
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Mon Dec 30 15:13:46 2013
@@ -98,16 +98,16 @@ namespace j3 {
llvm::Value* handleToObject(llvm::Value* obj);
llvm::Value* javaClass(J3ObjectType* type);
llvm::Value* staticInstance(J3Class* cl);
- llvm::Value* vt(J3Type* cl, bool resolve=0);
+ llvm::Value* vt(J3ObjectType* cl, bool resolve=0);
llvm::Value* vt(llvm::Value* obj);
- void initialiseJ3Type(J3Type* cl);
+ void initialiseJ3ObjectType(J3ObjectType* cl);
void monitorEnter(llvm::Value* obj);
void monitorExit(llvm::Value* obj);
- llvm::Value* isAssignableTo(llvm::Value* obj, J3Type* type);
- void instanceof(llvm::Value* obj, J3Type* type);
- void checkCast(llvm::Value* obj, J3Type* type);
+ llvm::Value* isAssignableTo(llvm::Value* obj, J3ObjectType* type);
+ void instanceof(llvm::Value* obj, J3ObjectType* type);
+ void checkCast(llvm::Value* obj, J3ObjectType* type);
void floatToInteger(J3Type* from, J3Type* to);
void compareFP(bool isL);
Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Mon Dec 30 15:13:46 2013
@@ -95,7 +95,7 @@ namespace j3 {
J3Method* resolve(J3ObjectHandle* obj);
llvm::Function* unsafe_nativeLLVMFunction(llvm::Module* module); /* call only while compiler locked */
- llvm::GlobalValue* llvmDescriptor(llvm::Module* module);
+ llvm::GlobalValue* unsafe_llvmDescriptor(llvm::Module* module);
llvm::Function* unsafe_llvmFunction(bool isStub, llvm::Module* module, J3Class* from=0); /* call only while compiler locked */
uint32_t index();
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=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Mon Dec 30 15:13:46 2013
@@ -47,7 +47,8 @@ void J3::introspect() {
typeJ3Type = introspectType("class.j3::J3Type");
typeJ3TypePtr = llvm::PointerType::getUnqual(typeJ3Type);
typeJ3LayoutPtr = llvm::PointerType::getUnqual(introspectType("class.j3::J3Layout"));
- typeJ3ObjectTypePtr = llvm::PointerType::getUnqual(introspectType("class.j3::J3ObjectType"));
+ typeJ3ObjectType = introspectType("class.j3::J3ObjectType");
+ typeJ3ObjectTypePtr = llvm::PointerType::getUnqual(typeJ3ObjectType);
typeJ3Thread = llvm::PointerType::getUnqual(introspectType("class.j3::J3Thread"));
typeJ3Class = introspectType("class.j3::J3Class");
typeJ3ClassPtr = llvm::PointerType::getUnqual(typeJ3Class);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Mon Dec 30 15:13:46 2013
@@ -151,6 +151,10 @@ llvm::Type* J3ObjectType::llvmType() {
return loader()->vm()->typeJ3ObjectPtr;
}
+llvm::GlobalValue* J3ObjectType::unsafe_llvmDescriptor(llvm::Module* module) {
+ return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3ObjectType));
+}
+
J3Method* J3ObjectType::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) {
J3::internalError(L"should not happe: %ls::%ls\n", J3ObjectType::name()->cStr(), name->cStr());
}
@@ -290,11 +294,6 @@ J3Class::J3Class(J3ClassLoader* loader,
status = LOADED;
}
-llvm::GlobalValue* J3Class::llvmDescriptor(llvm::Module* module) {
- return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3Class));
-}
-
-
J3Method* J3Class::findVirtualMethod(const vmkit::Name* name, const vmkit::Name* sign, bool error) {
//loader()->vm()->log(L"Lookup: %ls %ls in %ls (%d)", methName->cStr(), methSign->cStr(), name()->cStr(), nbVirtualMethods);
resolve();
@@ -871,10 +870,6 @@ void J3ArrayClass::doInitialise() {
status = INITED;
}
-llvm::GlobalValue* J3ArrayClass::llvmDescriptor(llvm::Module* module) {
- return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3ArrayClass));
-}
-
void J3ArrayClass::doNativeName() {
uint32_t len = component()->nativeNameLength();
_nativeNameLength = len + 2;
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=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Mon Dec 30 15:13:46 2013
@@ -271,14 +271,13 @@ void J3CodeGen::monitorExit(llvm::Value*
builder->CreateBr(ok);
}
-void J3CodeGen::initialiseJ3Type(J3Type* cl) {
+void J3CodeGen::initialiseJ3ObjectType(J3ObjectType* cl) {
if(!cl->isInitialised())
- builder->CreateCall(funcJ3TypeInitialise, builder->CreateBitCast(cl->llvmDescriptor(module()), vm->typeJ3TypePtr));
+ builder->CreateCall(funcJ3TypeInitialise, builder->CreateBitCast(cl->unsafe_llvmDescriptor(module()), vm->typeJ3TypePtr));
}
llvm::Value* J3CodeGen::javaClass(J3ObjectType* type) {
- return builder->CreateCall(funcJ3ObjectTypeJavaClass,
- builder->CreateBitCast(type->llvmDescriptor(module()), vm->typeJ3ObjectTypePtr));
+ return builder->CreateCall(funcJ3ObjectTypeJavaClass, type->unsafe_llvmDescriptor(module()));
}
llvm::Value* J3CodeGen::handleToObject(llvm::Value* obj) {
@@ -287,9 +286,9 @@ llvm::Value* J3CodeGen::handleToObject(l
}
llvm::Value* J3CodeGen::staticInstance(J3Class* cl) {
- initialiseJ3Type(cl);
+ initialiseJ3ObjectType(cl);
return handleToObject(builder->CreateCall(funcJ3ClassStaticInstance,
- cl->llvmDescriptor(module())));
+ builder->CreateBitCast(cl->unsafe_llvmDescriptor(module()), vm->typeJ3ClassPtr)));
}
llvm::Value* J3CodeGen::vt(llvm::Value* obj) {
@@ -300,9 +299,9 @@ llvm::Value* J3CodeGen::vt(llvm::Value*
return res;
}
-llvm::Value* J3CodeGen::vt(J3Type* type, bool doResolve) {
+llvm::Value* J3CodeGen::vt(J3ObjectType* type, bool doResolve) {
llvm::Value* func = doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT;
- return builder->CreateCall(func, builder->CreateBitCast(type->llvmDescriptor(module()), vm->typeJ3TypePtr));
+ return builder->CreateCall(func, builder->CreateBitCast(type->unsafe_llvmDescriptor(module()), vm->typeJ3TypePtr));
}
llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) {
@@ -379,7 +378,7 @@ void J3CodeGen::invokeVirtual(uint32_t i
if(target->isResolved())
funcEntry = builder->getInt32(target->index());
else
- funcEntry = builder->CreateCall(funcJ3MethodIndex, target->llvmDescriptor(module()));
+ funcEntry = builder->CreateCall(funcJ3MethodIndex, target->unsafe_llvmDescriptor(module()));
llvm::Value* obj = nullCheck(stack.top(type->nbIns() - 1));
llvm::Value* gepFunc[] = { builder->getInt32(0),
@@ -393,7 +392,7 @@ void J3CodeGen::invokeVirtual(uint32_t i
void J3CodeGen::invokeStatic(uint32_t idx) {
J3Method* target = cl->methodAt(idx, J3Cst::ACC_STATIC);
- initialiseJ3Type(target->cl());
+ initialiseJ3ObjectType(target->cl());
invoke(target, target->unsafe_llvmFunction(1, module(), cl));
}
@@ -476,7 +475,7 @@ llvm::Value* J3CodeGen::arrayLength(llvm
}
void J3CodeGen::newArray(J3ArrayClass* array) {
- initialiseJ3Type(array);
+ initialiseJ3ObjectType(array);
llvm::Value* length = stack.pop();
llvm::Value* nbb =
builder->CreateAdd(llvm::ConstantInt::get(uintPtrTy, sizeof(J3ArrayObject)),
@@ -510,12 +509,12 @@ void J3CodeGen::newArray(uint8_t atype)
}
void J3CodeGen::newObject(J3Class* cl) {
- initialiseJ3Type(cl);
+ initialiseJ3ObjectType(cl);
llvm::Value* size;
if(!cl->isResolved()) {
- size = builder->CreateCall(funcJ3LayoutStructSize, builder->CreateBitCast(cl->llvmDescriptor(module()), vm->typeJ3LayoutPtr));
+ size = builder->CreateCall(funcJ3LayoutStructSize, builder->CreateBitCast(cl->unsafe_llvmDescriptor(module()), vm->typeJ3LayoutPtr));
} else {
size = builder->getInt64(cl->structSize());
}
@@ -525,7 +524,7 @@ void J3CodeGen::newObject(J3Class* cl) {
stack.push(res);
}
-llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3Type* type) {
+llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3ObjectType* type) {
llvm::Value* vtType = vt(type, 1);
llvm::Value* vtObj = vt(obj);
@@ -542,7 +541,7 @@ llvm::Value* J3CodeGen::isAssignableTo(l
}
}
-void J3CodeGen::instanceof(llvm::Value* obj, J3Type* type) {
+void J3CodeGen::instanceof(llvm::Value* obj, J3ObjectType* type) {
llvm::BasicBlock* after = forwardBranch("instanceof-after", codeReader->tell(), 0, 0);
llvm::BasicBlock* ok = newBB("instanceof-ok");
llvm::BasicBlock* test = newBB("instanceof");
@@ -559,7 +558,7 @@ void J3CodeGen::instanceof(llvm::Value*
builder->CreateBr(after);
}
-void J3CodeGen::checkCast(llvm::Value* obj, J3Type* type) {
+void J3CodeGen::checkCast(llvm::Value* obj, J3ObjectType* type) {
llvm::BasicBlock* succeed = forwardBranch("checkcast-succeed", codeReader->tell(), 0, 0);
llvm::BasicBlock* test = newBB("checkcast");
@@ -641,7 +640,9 @@ void J3CodeGen::ldc(uint32_t idx) {
case J3Cst::CONSTANT_Double: res = llvm::ConstantFP::get(builder->getDoubleTy(), cl->doubleAt(idx)); break;
case J3Cst::CONSTANT_Class: res = handleToObject(javaClass(cl->classAt(idx))); break;
case J3Cst::CONSTANT_String:
- res = handleToObject(builder->CreateCall2(funcJ3ClassStringAt, cl->llvmDescriptor(module()), builder->getInt16(idx)));
+ res = handleToObject(builder->CreateCall2(funcJ3ClassStringAt,
+ builder->CreateBitCast(cl->unsafe_llvmDescriptor(module()), vm->typeJ3ClassPtr),
+ builder->getInt16(idx)));
break;
default:
J3::classFormatError(cl, L"wrong ldc type: %d\n", cl->getCtpType(idx));
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=198250&r1=198249&r2=198250&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Mon Dec 30 15:13:46 2013
@@ -335,7 +335,7 @@ char* J3Method::llvmStubName(J3Class* fr
return _llvmAllNames + 0;
}
-llvm::GlobalValue* J3Method::llvmDescriptor(llvm::Module* module) {
+llvm::GlobalValue* J3Method::unsafe_llvmDescriptor(llvm::Module* module) {
return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(llvmDescriptorName(), cl()->loader()->vm()->typeJ3Method));
}
More information about the vmkit-commits
mailing list