[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