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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Nov 12 14:26:30 PST 2008


Author: geoffray
Date: Wed Nov 12 16:26:28 2008
New Revision: 59183

URL: http://llvm.org/viewvc/llvm-project?rev=59183&view=rev
Log:
Optimize initialization check and static instance getter in an isolate environment.


Modified:
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
    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=59183&r1=59182&r2=59183&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Wed Nov 12 16:26:28 2008
@@ -10,6 +10,12 @@
 
 %Jnjvm = type {%VT, %JavaClass*, [9 x %JavaClass*]}
 
+;;; The task class mirror in an isolate environment.
+;;; Field 1: The class state
+;;; Field 2: The class delegatee (java/lang/Class)
+;;; Field 3: The static instance
+%TaskClassMirror = type { i32, %JavaObject*, %JavaObject* }
+
 ;;; The type of internal classes. This is not complete, but we only need
 ;;; the first fields for now. 
 ;;; Field 1 - The VT of a class C++ object.
@@ -18,9 +24,9 @@
 ;;; Field 4 - The list of super classes of this class.
 ;;; Field 5 - The depth of the class in its super hierarchy.
 ;;; Field 6 - The class state (resolved, initialized, ...)
-;;; field 7 - The constant pool, only for multi vm environment.
-;;; field 8 - The static instance, only for multi vm environment.
-%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32, i32, %ConstantPool*, %JavaObject* }
+;;; field 7 - The task class mirror, for an isolate environment
+%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32, i32,
+                    [0 x %TaskClassMirror] }
 
 ;;; The root of all Java Objects: a VT, a class and a lock.
 %JavaObject = type { %VT, %JavaClass*, i8* }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Nov 12 16:26:28 2008
@@ -173,6 +173,10 @@
   /// status - The loading/resolve/initialization state of the class.
   ///
   JavaState status;
+  
+#ifdef ISOLATE
+  TaskClassMirror IsolateInfo[NR_ISOLATES];
+#endif
 
 //===----------------------------------------------------------------------===//
 //
@@ -512,7 +516,6 @@
 
 #else
 #if defined(ISOLATE)
-  TaskClassMirror IsolateInfo[NR_ISOLATES];
   
   TaskClassMirror& getCurrentTaskClassMirror();
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Nov 12 16:26:28 2008
@@ -46,24 +46,26 @@
 const llvm::Type* JnjvmModule::JnjvmType = 0;
 const llvm::Type* JnjvmModule::ConstantPoolType = 0;
 
-llvm::Constant*       JnjvmModule::JavaObjectNullConstant;
-llvm::Constant*       JnjvmModule::UTF8NullConstant;
-llvm::Constant*       JnjvmModule::JavaClassNullConstant;
-llvm::Constant*       JnjvmModule::MaxArraySizeConstant;
-llvm::Constant*       JnjvmModule::JavaObjectSizeConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetObjectSizeInClassConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetVTInClassConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetDepthInClassConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetDisplayInClassConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetStatusInClassConstant;
-llvm::ConstantInt*    JnjvmModule::OffsetCtpInClassConstant;
-llvm::ConstantInt*    JnjvmModule::ClassReadyConstant;
-const llvm::Type*     JnjvmModule::JavaClassType;
-const llvm::Type*     JnjvmModule::VTType;
-llvm::ConstantInt*    JnjvmModule::JavaArrayElementsOffsetConstant;
-llvm::ConstantInt*    JnjvmModule::JavaArraySizeOffsetConstant;
-llvm::ConstantInt*    JnjvmModule::JavaObjectLockOffsetConstant;
-llvm::ConstantInt*    JnjvmModule::JavaObjectClassOffsetConstant;
+llvm::Constant*     JnjvmModule::JavaObjectNullConstant;
+llvm::Constant*     JnjvmModule::UTF8NullConstant;
+llvm::Constant*     JnjvmModule::JavaClassNullConstant;
+llvm::Constant*     JnjvmModule::MaxArraySizeConstant;
+llvm::Constant*     JnjvmModule::JavaObjectSizeConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetObjectSizeInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetVTInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetDepthInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetDisplayInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetStatusInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetTaskClassMirrorInClassConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetStaticInstanceInTaskClassMirrorConstant;
+llvm::ConstantInt*  JnjvmModule::OffsetStatusInTaskClassMirrorConstant;
+llvm::ConstantInt*  JnjvmModule::ClassReadyConstant;
+const llvm::Type*   JnjvmModule::JavaClassType;
+const llvm::Type*   JnjvmModule::VTType;
+llvm::ConstantInt*  JnjvmModule::JavaArrayElementsOffsetConstant;
+llvm::ConstantInt*  JnjvmModule::JavaArraySizeOffsetConstant;
+llvm::ConstantInt*  JnjvmModule::JavaObjectLockOffsetConstant;
+llvm::ConstantInt*  JnjvmModule::JavaObjectClassOffsetConstant;
 
 Value* JnjvmModule::getNativeClass(CommonClass* classDef) {
   llvm::GlobalVariable* varGV = 0;
@@ -991,7 +993,9 @@
   OffsetDisplayInClassConstant = mvm::MvmModule::constantThree;
   OffsetDepthInClassConstant = mvm::MvmModule::constantFour;
   OffsetStatusInClassConstant = mvm::MvmModule::constantFive;
-  OffsetCtpInClassConstant = mvm::MvmModule::constantSix;
+  OffsetTaskClassMirrorInClassConstant = mvm::MvmModule::constantSix;
+  OffsetStaticInstanceInTaskClassMirrorConstant = mvm::MvmModule::constantTwo;
+  OffsetStatusInTaskClassMirrorConstant = mvm::MvmModule::constantZero;
   
   ClassReadyConstant = ConstantInt::get(Type::Int32Ty, ready);
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Nov 12 16:26:28 2008
@@ -329,7 +329,9 @@
   static llvm::ConstantInt* OffsetDepthInClassConstant;
   static llvm::ConstantInt* OffsetDisplayInClassConstant;
   static llvm::ConstantInt* OffsetStatusInClassConstant;
-  static llvm::ConstantInt* OffsetCtpInClassConstant;
+  static llvm::ConstantInt* OffsetTaskClassMirrorInClassConstant;
+  static llvm::ConstantInt* OffsetStaticInstanceInTaskClassMirrorConstant;
+  static llvm::ConstantInt* OffsetStatusInTaskClassMirrorConstant;
   
   static llvm::ConstantInt* ClassReadyConstant;
 

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Nov 12 16:26:28 2008
@@ -22,6 +22,7 @@
 using namespace llvm;
 using namespace jnjvm;
 
+#include <iostream>
 namespace mvm {
 
   class VISIBILITY_HIDDEN LowerConstantCalls : public FunctionPass {
@@ -229,23 +230,44 @@
           }
         } else if (V == module->GetStaticInstanceFunction) {
           Changed = true;
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#if !defined(ISOLATE_SHARING) && !defined(ISOLATE)
           ConstantExpr* CE = dyn_cast<ConstantExpr>(Call.getArgument(0));
           assert(CE && "Wrong use of GetStaticInstanceFunction");
           ConstantInt* C = (ConstantInt*)CE->getOperand(0);
           Class* cl = (Class*)C->getZExtValue();
-          
+
           Value* Replace = module->getStaticInstance(cl);
           Replace = new LoadInst(Replace, "", CI);
           CI->replaceAllUsesWith(Replace);
           CI->eraseFromParent();
+#elif defined(ISOLATE)
+          std::vector<Value*> GEP;
+          GEP.push_back(module->constantZero);
+          GEP.push_back(module->OffsetTaskClassMirrorInClassConstant);
+          Value* TCMArray = GetElementPtrInst::Create(Call.getArgument(0),
+                                                      GEP.begin(), GEP.end(),
+                                                      "", CI);
+          GEP.clear();
+          GEP.push_back(module->constantZero);
+          // TODO get the isolate id
+          GEP.push_back(module->constantZero);
+          Value* TCM = GetElementPtrInst::Create(TCMArray, GEP.begin(),
+                                                 GEP.end(), "", CI);
+          GEP.clear();
+          GEP.push_back(module->constantZero);
+          GEP.push_back(module->OffsetStaticInstanceInTaskClassMirrorConstant);
+          Value* Replace = GetElementPtrInst::Create(TCM, GEP.begin(),
+                                                     GEP.end(), "", CI);
+          Replace = new LoadInst(Replace, "", CI);
+          CI->replaceAllUsesWith(Replace);
+          CI->eraseFromParent();
+#else
+          abort();
 #endif
          
         } else if (V == module->InitialisationCheckFunction) {
           Changed = true;
-#ifdef ISOLATE
-          Call.setCalledFunction(module->InitialiseClassFunction);
-#else
+          
           BasicBlock* NBB = 0;
           if (CI->getParent()->getTerminator() != CI) {
             NBB = II->getParent()->splitBasicBlock(II);
@@ -257,13 +279,33 @@
           }
           
           Value* Cl = Call.getArgument(0); 
+#if !defined(ISOLATE)
           std::vector<Value*> indexes; 
           indexes.push_back(mvm::MvmModule::constantZero);
           indexes.push_back(module->OffsetStatusInClassConstant);
           Value* StatusPtr = GetElementPtrInst::Create(Cl, indexes.begin(),
                                                        indexes.end(), "", CI);
-          Value* Status = new LoadInst(StatusPtr, "", CI);
+
+#else
+          std::vector<Value*> GEP;
+          GEP.push_back(module->constantZero);
+          GEP.push_back(module->OffsetTaskClassMirrorInClassConstant);
+          Value* TCMArray = GetElementPtrInst::Create(Cl, GEP.begin(),
+                                                      GEP.end(), "", CI);
+          GEP.clear();
+          GEP.push_back(module->constantZero);
+          // TODO get the isolate id
+          GEP.push_back(module->constantZero);
+          Value* TCM = GetElementPtrInst::Create(TCMArray, GEP.begin(),
+                                                 GEP.end(), "", CI);
+          GEP.clear();
+          GEP.push_back(module->constantZero);
+          GEP.push_back(module->OffsetStatusInTaskClassMirrorConstant);
+          Value* StatusPtr = GetElementPtrInst::Create(TCM, GEP.begin(),
+                                                     GEP.end(), "", CI);
+#endif 
           
+          Value* Status = new LoadInst(StatusPtr, "", CI);
           
           Value* test = new ICmpInst(ICmpInst::ICMP_EQ, Status,
                                      jnjvm::JnjvmModule::ClassReadyConstant,
@@ -318,7 +360,6 @@
           CI->eraseFromParent();
           BranchInst::Create(NBB, trueCl);
           break;
-#endif
         } else if (V == module->GetConstantPoolAtFunction) {
           Function* resolver = dyn_cast<Function>(Call.getArgument(0));
           assert(resolver && "Wrong use of GetConstantPoolAt");





More information about the vmkit-commits mailing list