[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