[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