[vmkit-commits] [vmkit] r197983 - Fix a bug in checkcast/instanceof: use isAssignableTo instead of slowIsAssignableTo

Gael Thomas gael.thomas at lip6.fr
Tue Dec 24 07:12:13 PST 2013


Author: gthomas
Date: Tue Dec 24 09:12:13 2013
New Revision: 197983

URL: http://llvm.org/viewvc/llvm-project?rev=197983&view=rev
Log:
Fix a bug in checkcast/instanceof: use isAssignableTo instead of slowIsAssignableTo
Fix a bug in vt(J3Type): force the resolution of the class for checkcast/instanceof


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/j3object.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/j3options.cc

Modified: vmkit/branches/mcjit/include/j3/j3.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3.h?rev=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3.h (original)
+++ vmkit/branches/mcjit/include/j3/j3.h Tue Dec 24 09:12:13 2013
@@ -110,6 +110,8 @@ namespace j3 {
 		static void    classCastException() __attribute__((noreturn));
 
 		static void    arrayBoundCheckException() __attribute__((noreturn));
+
+		static void    printStackTrace();
 	};
 }
 

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Tue Dec 24 09:12:13 2013
@@ -65,6 +65,7 @@ namespace j3 {
 		J3Type*                     initialise();
 
 		J3VirtualTable*             vt();
+		J3VirtualTable*             vtAndResolve();
 
 		bool                        isAssignableTo(J3Type* parent);
 

Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Tue Dec 24 09:12:13 2013
@@ -114,7 +114,7 @@ namespace j3 {
 		llvm::Value*       handleToObject(llvm::Value* obj);
 		llvm::Value*       javaClass(J3ObjectType* type);
 		llvm::Value*       staticInstance(J3Class* cl);
-		llvm::Value*       vt(J3Type* cl);
+		llvm::Value*       vt(J3Type* cl, bool resolve=0);
 		llvm::Value*       vt(llvm::Value* obj);
 		void               initialiseJ3Type(J3Type* cl);
 
@@ -170,6 +170,7 @@ namespace j3 {
 
 		llvm::Function*    funcJ3MethodIndex;
 		llvm::Function*    funcJ3TypeVT;
+		llvm::Function*    funcJ3TypeVTAndResolve;
 		llvm::Function*    funcJ3TypeInitialise;
 		llvm::Function*    funcJ3ObjectTypeJavaClass;
 		llvm::Function*    funcJ3ClassSize;
@@ -180,7 +181,7 @@ namespace j3 {
 		llvm::Function*    funcClassCastException;
 		llvm::Function*    funcNullPointerException;
 		llvm::Function*    funcThrowException;
-		llvm::Function*    funcSlowIsAssignableTo;
+		llvm::Function*    funcIsAssignableTo;
 		llvm::Function*    funcFastIsAssignableToPrimaryChecker;
 		llvm::Function*    funcFastIsAssignableToNonPrimaryChecker;
 		llvm::Function*    funcJ3ThreadPushHandle;

Modified: vmkit/branches/mcjit/include/j3/j3object.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3object.h?rev=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3object.h (original)
+++ vmkit/branches/mcjit/include/j3/j3object.h Tue Dec 24 09:12:13 2013
@@ -42,7 +42,7 @@ namespace j3 {
 		friend class J3Trampoline;
 
 	public:
-		static const uint32_t nbInterfaceMethodTable = 23;
+		static const uint32_t nbInterfaceMethodTable = 41;
 		static const uint32_t gepObjectClass = 0;
 		static const uint32_t gepInterfaceMethods = 2;
 		static const uint32_t gepVirtualMethods = 4;

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=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3.cc Tue Dec 24 09:12:13 2013
@@ -174,16 +174,18 @@ void J3::linkageError(J3Method* method)
 }
 
 void J3::vinternalError(const wchar_t* msg, va_list va) {
-	vmkit::Safepoint* sf = 0;
-	vmkit::StackWalker walker;
 	wchar_t buf[65536];
-
 	vswprintf(buf, 65536, msg, va);
-
 	fprintf(stderr, "Internal error: %ls\n", buf);
+	printStackTrace();
+	abort();
+}
+
+void J3::printStackTrace() {
+	vmkit::StackWalker walker;
 
 	while(walker.next()) {
-		vmkit::Safepoint* sf = getSafepoint(walker.ip());
+		vmkit::Safepoint* sf = J3Thread::get()->vm()->getSafepoint(walker.ip());
 
 		if(sf) {
 			J3Method* m = ((J3MethodCode*)sf->unit()->getSymbol(sf->functionName()))->self;
@@ -202,5 +204,5 @@ void J3::vinternalError(const wchar_t* m
 			}
 		}
 	}
-	abort();
 }
+

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=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Tue Dec 24 09:12:13 2013
@@ -38,6 +38,11 @@ J3VirtualTable* J3Type::vt() {
 	return _vt; 
 }
 
+J3VirtualTable* J3Type::vtAndResolve() { 
+	resolve();
+	return vt(); 
+}
+
 void J3Type::dump() {
 	fprintf(stderr, "Type: %ls", name()->cStr());
 }

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=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Tue Dec 24 09:12:13 2013
@@ -59,6 +59,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 
 	funcJ3MethodIndex            = vm->introspectFunction(module(), "j3::J3Method::index()");
 	funcJ3TypeVT                 = vm->introspectFunction(module(), "j3::J3Type::vt()");
+	funcJ3TypeVTAndResolve       = vm->introspectFunction(module(), "j3::J3Type::vtAndResolve()");
 	funcJ3TypeInitialise         = vm->introspectFunction(module(), "j3::J3Type::initialise()");
 	funcJ3ClassSize              = vm->introspectFunction(module(), "j3::J3Class::size()");
 	funcJ3ClassStaticInstance    = vm->introspectFunction(module(), "j3::J3Class::staticInstance()");
@@ -79,7 +80,7 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
 	funcEchoDebugEnter           = vm->introspectFunction(module(), "j3::J3CodeGen::echoDebugEnter(unsigned int, char const*, ...)");
 	funcEchoDebugExecute         = vm->introspectFunction(module(), "j3::J3CodeGen::echoDebugExecute(unsigned int, char const*, ...)");
 
-	funcSlowIsAssignableTo       = vm->introspectFunction(module(), "j3::J3VirtualTable::slowIsAssignableTo(j3::J3VirtualTable*)");
+	funcIsAssignableTo           = vm->introspectFunction(module(), "j3::J3VirtualTable::isAssignableTo(j3::J3VirtualTable*)");
 	funcFastIsAssignableToPrimaryChecker = 
 		vm->introspectFunction(module(), "j3::J3VirtualTable::fastIsAssignableToPrimaryChecker(j3::J3VirtualTable*, unsigned int)");
 	funcFastIsAssignableToNonPrimaryChecker = 
@@ -212,8 +213,9 @@ llvm::Value* J3CodeGen::vt(llvm::Value*
 	return res;
 }
 
-llvm::Value* J3CodeGen::vt(J3Type* type) {
-	return builder->CreateCall(funcJ3TypeVT, builder->CreateBitCast(type->llvmDescriptor(module()), vm->typeJ3TypePtr));
+llvm::Value* J3CodeGen::vt(J3Type* type, bool doResolve) {
+	llvm::Value* func = doResolve && !type->isResolved() ? funcJ3TypeVTAndResolve : funcJ3TypeVT;
+	return builder->CreateCall(func, builder->CreateBitCast(type->llvmDescriptor(module()), vm->typeJ3TypePtr));
 }
 
 llvm::Value* J3CodeGen::nullCheck(llvm::Value* obj) {
@@ -381,6 +383,22 @@ llvm::Value* J3CodeGen::arrayLength(llvm
 	return builder->CreateLoad(arrayLengthPtr(obj));
 }
 
+void J3CodeGen::newArray(J3ArrayClass* array) {
+	initialiseJ3Type(array);
+	llvm::DataLayout* layout = vm->dataLayout();
+	llvm::Value* length = stack.pop();
+	llvm::Value* nbb = 
+		builder->CreateAdd(builder->getInt64(layout->getTypeAllocSize(array->llvmType()->getContainedType(0))),
+											 builder->CreateMul(builder->getInt64(layout->getTypeAllocSize(array->component()->llvmType())), 
+																					builder->CreateZExtOrBitCast(length, builder->getInt64Ty())));
+	
+	llvm::Value* res = builder->CreateCall2(funcJ3ObjectAllocate, vt(array), nbb);
+
+	builder->CreateStore(length, arrayLengthPtr(res));
+
+	stack.push(res);
+}
+
 void J3CodeGen::newArray(uint8_t atype) {
 	J3Primitive* prim = 0;
 
@@ -400,22 +418,6 @@ void J3CodeGen::newArray(uint8_t atype)
 	newArray(prim->getArray());
 }
 
-void J3CodeGen::newArray(J3ArrayClass* array) {
-	initialiseJ3Type(array);
-	llvm::DataLayout* layout = vm->dataLayout();
-	llvm::Value* length = stack.pop();
-	llvm::Value* arraySize = 
-		builder->CreateAdd(builder->getInt64(layout->getTypeAllocSize(array->llvmType()->getContainedType(0))),
-											 builder->CreateMul(builder->getInt64(layout->getTypeAllocSize(array->component()->llvmType())), 
-																					builder->CreateZExtOrBitCast(length, builder->getInt64Ty())));
-	
-	llvm::Value* res = builder->CreateCall2(funcJ3ObjectAllocate, vt(array), arraySize);
-
-	builder->CreateStore(length, arrayLengthPtr(res));
-
-	stack.push(res);
-}
-
 void J3CodeGen::newObject(J3Class* cl) {
 	initialiseJ3Type(cl);
 
@@ -433,8 +435,9 @@ void J3CodeGen::newObject(J3Class* cl) {
 }
 
 llvm::Value* J3CodeGen::isAssignableTo(llvm::Value* obj, J3Type* type) {
-	llvm::Value* vtType = vt(type);
+	llvm::Value* vtType = vt(type, 1);
 	llvm::Value* vtObj = vt(obj);
+
 	if(type->isResolved()) {
 		if(type->vt()->isPrimaryChecker())
 			return builder->CreateCall3(funcFastIsAssignableToPrimaryChecker, 
@@ -443,8 +446,9 @@ llvm::Value* J3CodeGen::isAssignableTo(l
 																	builder->getInt32(type->vt()->offset()));
 		else 
 			return builder->CreateCall2(funcFastIsAssignableToNonPrimaryChecker, vtObj, vtType);
-	} else
-		return builder->CreateCall2(funcSlowIsAssignableTo, vtObj, vtType);
+	} else {
+		return builder->CreateCall2(funcIsAssignableTo, vtObj, vtType);
+	}
 }
 
 void J3CodeGen::instanceof(llvm::Value* obj, J3Type* type) {
@@ -480,6 +484,7 @@ void J3CodeGen::checkCast(llvm::Value* o
 	builder->SetInsertPoint(test);
 
 	llvm::Value* res = isAssignableTo(obj, type);
+
 	builder->CreateCondBr(res, succeed, bbCheckCastFailed);
 
 	builder->SetInsertPoint(bb);

Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=197983&r1=197982&r2=197983&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Tue Dec 24 09:12:13 2013
@@ -19,7 +19,7 @@ J3Options::J3Options() {
 	debugLoad = 0;
 	debugResolve = 0;
 	debugIniting = 0;
-	debugTranslate = 2;
+	debugTranslate = 0;
 	debugLinking = 0;
 
 	genDebugExecute = debugExecute ? 1 : 0;





More information about the vmkit-commits mailing list