[vmkit-commits] [vmkit] r71943 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Classpath/ClasspathReflect.h lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp lib/JnJVM/Compiler/JavaJIT.cpp lib/JnJVM/Compiler/JnjvmModule.cpp lib/JnJVM/LLVMRuntime/runtime-default.ll lib/JnJVM/VMCore/JavaRuntimeJIT.cpp lib/JnJVM/VMCore/JavaThread.cpp lib/JnJVM/VMCore/JavaThread.h lib/JnJVM/VMCore/Jnjvm.cpp lib/JnJVM/VMCore/Jnjvm.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Sat May 16 06:09:36 PDT 2009
Author: geoffray
Date: Sat May 16 08:09:35 2009
New Revision: 71943
URL: http://llvm.org/viewvc/llvm-project?rev=71943&view=rev
Log:
Throw an UnsatisfiedLinkError when a native method can not be found.
Modified:
vmkit/trunk/include/jnjvm/JnjvmModule.h
vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sat May 16 08:09:35 2009
@@ -339,6 +339,7 @@
llvm::Function* NegativeArraySizeExceptionFunction;
llvm::Function* ArrayStoreExceptionFunction;
llvm::Function* ArithmeticExceptionFunction;
+ llvm::Function* ThrowExceptionFromJITFunction;
JnjvmModule(llvm::Module*);
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathReflect.h Sat May 16 08:09:35 2009
@@ -141,6 +141,11 @@
JavaObject* vmState;
public:
+
+ void setDetailedMessage(JavaObject* obj) {
+ detailedMessage = obj;
+ }
+
void fillInStackTrace() {
cause = this;
vmState = internalFillInStackTrace(this);
Modified: vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Classpath/ClasspathVMClassLoader.cpp Sat May 16 08:09:35 2009
@@ -37,8 +37,10 @@
Jnjvm* vm = JavaThread::get()->getJVM();
UserClassPrimitive* prim =
UserClassPrimitive::byteIdToPrimitive(byteId, vm->upcalls);
- if (!prim)
- vm->unknownError("unknown byte primitive %c", byteId);
+ if (!prim) {
+ fprintf(stderr, "unknown byte primitive %c", byteId);
+ abort();
+ }
res = (jobject)prim->getClassDelegatee(vm);
Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Sat May 16 08:09:35 2009
@@ -222,6 +222,7 @@
return threadId;
}
+extern "C" void jnjvmThrowExceptionFromJIT();
llvm::Function* JavaJIT::nativeCompile(intptr_t natPtr) {
@@ -231,6 +232,7 @@
bool stat = isStatic(compilingMethod->access);
const FunctionType *funcType = llvmFunction->getFunctionType();
+ const llvm::Type* returnType = funcType->getReturnType();
bool jnjvm = false;
@@ -243,15 +245,24 @@
char* functionName = (char*)alloca(3 + JNI_NAME_PRE_LEN +
((mnlen + clen + mtlen) << 1));
+
if (!natPtr)
natPtr = compilingClass->classLoader->nativeLookup(compilingMethod, jnjvm,
functionName);
if (!natPtr && !TheCompiler->isStaticCompiling()) {
- fprintf(stderr, "Native function %s not found. Probably "
- "not implemented by JnJVM?\n", compilingMethod->printString());
- JavaThread::get()->getJVM()->unknownError("can not find native method %s",
- compilingMethod->printString());
+ currentBlock = createBasicBlock("start");
+ CallInst::Create(module->ThrowExceptionFromJITFunction, "", currentBlock);
+ if (returnType != Type::VoidTy)
+ ReturnInst::Create(Constant::getNullValue(returnType), currentBlock);
+ else
+ ReturnInst::Create(currentBlock);
+
+ PRINT_DEBUG(JNJVM_COMPILE, 1, COLOR_NORMAL, "end native compile %s\n",
+ compilingMethod->printString());
+
+ llvmFunction->setLinkage(GlobalValue::ExternalLinkage);
+ return llvmFunction;
}
@@ -265,7 +276,6 @@
currentBlock = createBasicBlock("start");
BasicBlock* executeBlock = createBasicBlock("execute");
endBlock = createBasicBlock("end block");
- const llvm::Type* returnType = funcType->getReturnType();
Value* buf = llvm::CallInst::Create(module->GetSJLJBufferFunction,
"", currentBlock);
Modified: vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sat May 16 08:09:35 2009
@@ -428,6 +428,8 @@
#endif
GetLockFunction = module->getFunction("getLock");
+ ThrowExceptionFromJITFunction =
+ module->getFunction("jnjvmThrowExceptionFromJIT");
}
Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Sat May 16 08:09:35 2009
@@ -219,6 +219,7 @@
declare %JavaObject* @jnjvmArrayStoreException(%VT*)
declare %JavaObject* @jnjvmArithmeticException()
declare void @jnjvmThrowException(%JavaObject*)
+declare void @jnjvmThrowExceptionFromJIT()
declare void @jnjvmJNIProceedPendingException()
declare i8* @jnjvmGetSJLJBuffer()
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaRuntimeJIT.cpp Sat May 16 08:09:35 2009
@@ -9,6 +9,7 @@
//===----------------------------------------------------------------------===//
+#include "ClasspathReflect.h"
#include "JavaArray.h"
#include "JavaCache.h"
#include "JavaClass.h"
@@ -583,6 +584,26 @@
return exc;
}
+// Create an exception then throws it.
+extern "C" void jnjvmThrowExceptionFromJIT() {
+ JavaObject *exc = 0;
+ JavaThread *th = JavaThread::get();
+
+ BEGIN_NATIVE_EXCEPTION(1)
+
+ JavaMethod* meth = th->getCallingMethod();
+ exc = th->getJVM()->CreateUnsatisfiedLinkError(meth);
+
+ END_NATIVE_EXCEPTION
+
+#ifdef DWARF_EXCEPTIONS
+ th->throwException(exc);
+#else
+ th->pendingException = exc;
+#endif
+
+}
+
extern "C" void jnjvmPrintMethodStart(JavaMethod* meth) {
fprintf(stderr, "[%p] executing %s\n", (void*)mvm::Thread::get(),
meth->printString());
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.cpp Sat May 16 08:09:35 2009
@@ -96,6 +96,19 @@
addresses.push_back(cur);
}
+JavaMethod* JavaThread::getCallingMethod() {
+ // I'm a native function, so try to look at the last Java method.
+ // First take the last caller.
+ void** addr = (void**)addresses.back();
+
+ // Get the IP of the caller.
+ void* ip = FRAME_IP(addr);
+
+ JavaMethod* meth = getJVM()->IPToMethod<JavaMethod>(ip);
+
+ return meth;
+}
+
UserClass* JavaThread::getCallingClass(uint32 level) {
// I'm a native function, so try to look at the last Java method.
// First take the getCallingClass address.
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaThread.h Sat May 16 08:09:35 2009
@@ -209,11 +209,16 @@
addresses.pop_back();
}
- /// getCallingClass - Get the Java method that called the last Java
- /// method on the stack.
+ /// getCallingClass - Get the Java class that called the last Java
+ /// method that called the Java getCallingClass method.
///
UserClass* getCallingClass(uint32 level);
+ /// getCallingMethod - Get the Java method that called the last Java
+ /// method on the stack.
+ ///
+ JavaMethod* getCallingMethod();
+
/// getCallingClassLevel - Get the Java method in the stack at the
/// specified level.
///
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sat May 16 08:09:35 2009
@@ -330,6 +330,12 @@
(JavaString*)0);
}
+JavaObject* Jnjvm::CreateUnsatisfiedLinkError(JavaMethod* meth) {
+ return CreateError(upcalls->UnsatisfiedLinkError,
+ upcalls->InitUnsatisfiedLinkError,
+ (JavaString*)0);
+}
+
JavaObject* Jnjvm::CreateArithmeticException() {
JavaString* str = asciizToStr("/ by zero");
return CreateError(upcalls->ArithmeticException,
Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h?rev=71943&r1=71942&r2=71943&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.h Sat May 16 08:09:35 2009
@@ -252,6 +252,7 @@
JavaObject* CreateStackOverflowError();
JavaObject* CreateLinkageError(const char* msg);
JavaObject* CreateArrayStoreException(JavaVirtualTable* VT);
+ JavaObject* CreateUnsatisfiedLinkError(JavaMethod* meth);
/// Exceptions - These are the only exceptions VMKit will make.
///
More information about the vmkit-commits
mailing list