[vmkit-commits] [vmkit] r63399 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaJIT.cpp VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Jan 30 10:03:28 PST 2009


Author: geoffray
Date: Fri Jan 30 12:03:28 2009
New Revision: 63399

URL: http://llvm.org/viewvc/llvm-project?rev=63399&view=rev
Log:
We don't want to call Java methods when materializing a function because
of the call trace. Therefore make sure the class is loaded before calling
an invokeSpecial.


Modified:
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp

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=63399&r1=63398&r2=63399&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Fri Jan 30 12:03:28 2009
@@ -122,6 +122,12 @@
 ;;; implementation.
 declare void @forceInitialisationCheck(%JavaClass*)
 
+;;; forceLoadedCheck - Force to check if the class was loaded. Since we do
+;;; not want to run Java code in a callback, we have to make sure the class
+;;; of the method that we want to compile is loaded. This is used for
+;;; the invokespecial bytecode.
+declare void @forceLoadedCheck(%JavaCommonClass*)
+
 ;;; getConstantPoolAt - Get the value in the constant pool of this class.
 ;;; This function is removed by Jnjvm after the GVn pass, therefore it does
 ;;; not have an actual implementation.

Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp?rev=63399&r1=63398&r2=63399&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaJIT.cpp Fri Jan 30 12:03:28 2009
@@ -1585,6 +1585,16 @@
     (Function*)ctpInfo->infoOfStaticOrSpecialMethod(index, ACC_VIRTUAL,
                                                       signature, meth);
 
+  if (!meth) {
+    // Make sure the class is loaded before materializing the method.
+    uint32 clIndex = ctpInfo->getClassIndexFromMethod(index);
+    UserCommonClass* cl = 0;
+    Value* Cl = getResolvedCommonClass(clIndex, false, &cl);
+    if (!cl) {
+      CallInst::Create(module->ForceLoadedCheckFunction, Cl, "", currentBlock);
+    }
+  }
+
   if (meth && canBeInlined(meth)) {
     val = invokeInline(meth, args);
   } else {

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=63399&r1=63398&r2=63399&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan 30 12:03:28 2009
@@ -2147,6 +2147,7 @@
    
   InterfaceLookupFunction = module->getFunction("jnjvmVirtualLookup");
   MultiCallNewFunction = module->getFunction("multiCallNew");
+  ForceLoadedCheckFunction = module->getFunction("forceLoadedCheck");
   InitialisationCheckFunction = module->getFunction("initialisationCheck");
   ForceInitialisationCheckFunction = 
     module->getFunction("forceInitialisationCheck");

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=63399&r1=63398&r2=63399&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan 30 12:03:28 2009
@@ -310,6 +310,7 @@
   llvm::Function* InitialiseClassFunction;
   llvm::Function* InitialisationCheckFunction;
   llvm::Function* ForceInitialisationCheckFunction;
+  llvm::Function* ForceLoadedCheckFunction;
   llvm::Function* ClassLookupFunction;
 #ifndef WITHOUT_VTABLE
   llvm::Function* VirtualLookupFunction;

Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=63399&r1=63398&r2=63399&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Fri Jan 30 12:03:28 2009
@@ -459,7 +459,8 @@
             BranchInst::Create(NBB, OKBlock);
             break;
           }
-        } else if (V == module->ForceInitialisationCheckFunction) {
+        } else if (V == module->ForceInitialisationCheckFunction ||
+                   V == module->ForceLoadedCheckFunction ) {
           Changed = true;
           CI->eraseFromParent();
         }





More information about the vmkit-commits mailing list