[vmkit-commits] [vmkit] r61626 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmClassLoader.cpp JnjvmModule.cpp JnjvmModule.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Jan 4 05:39:44 PST 2009


Author: geoffray
Date: Sun Jan  4 07:39:35 2009
New Revision: 61626

URL: http://llvm.org/viewvc/llvm-project?rev=61626&view=rev
Log:
Add a static initializer when static compiling. The initializer records
the classes in the given class loader and loads the class required.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Sun Jan  4 07:39:35 2009
@@ -1181,13 +1181,11 @@
     }
    
     // Set the linkage to External, so that the printer does not complain.
-    llvm::Module* M = bootstrapLoader->getModule();
-    for (Module::iterator i = M->begin(), e = M->end(); i != e; ++i) {
-      i->setLinkage(llvm::GlobalValue::ExternalLinkage);
-    }
+    JnjvmModule* M = bootstrapLoader->getModule();
+    M->CreateStaticInitializer();
 
     // Print stats before quitting.
-    bootstrapLoader->getModule()->printStats();
+    M->printStats();
     bootstrapLoader->getModuleProvider()->printStats();
 
   } catch(std::string str) {

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sun Jan  4 07:39:35 2009
@@ -920,3 +920,20 @@
   }
   return res;
 }
+
+
+// Extern "C" functions called by the vmjc static intializer.
+extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
+                                        CommonClass* cl) {
+  JCL->getClasses()->map.insert(std::make_pair(cl->name, cl));
+  cl->classLoader = JCL;
+}
+
+extern "C" void vmjcGetClassArray(JnjvmClassLoader* JCL, ClassArray** ptr,
+                              const UTF8* name) {
+  *ptr = JCL->constructArray(name);
+}
+
+extern "C" void vmjcLoadClass(JnjvmClassLoader* JCL, const UTF8* name) {
+  JCL->loadName(name, true, true);
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sun Jan  4 07:39:35 2009
@@ -32,6 +32,7 @@
 
 llvm::Constant* JnjvmModule::PrimitiveArrayVT;
 llvm::Constant* JnjvmModule::ReferenceArrayVT;
+llvm::Function* JnjvmModule::StaticInitializer;
 
 extern void* JavaArrayVT[];
 extern void* ArrayObjectVT[];
@@ -97,12 +98,12 @@
 llvm::ConstantInt*  JnjvmModule::JavaObjectClassOffsetConstant;
 
 
-bool JnjvmModule::isCompiling(CommonClass* cl) {
+bool JnjvmModule::isCompiling(const CommonClass* cl) const {
   if (cl->isClass()) {
     // A class is being static compiled if owner class is not null.
-    return (cl->asClass()->getOwnerClass() != 0);
+    return (((Class*)cl)->getOwnerClass() != 0);
   } else if (cl->isArray()) {
-    return isCompiling(cl->asArrayClass()->baseClass());
+    return isCompiling(((ClassArray*)cl)->baseClass());
   } else {
     return false;
   }
@@ -702,7 +703,7 @@
   ATy = dyn_cast<ArrayType>(STy->getContainedType(2));
   assert(ATy && "Malformed type");
 
-  Constant* TCM[1] = { Constant::getNullValue(JavaObjectType) };
+  Constant* TCM[1] = { getJavaClass(cl) };
   CommonClassElts.push_back(ConstantArray::get(ATy, TCM, 1));
   
   // access
@@ -740,8 +741,10 @@
     CommonClassElts.push_back(Constant::getNullValue(JavaClassType));
   }
 
-  // classLoader
-  CommonClassElts.push_back(Constant::getNullValue(ptrType));
+  // classLoader: store the static initializer, it will be overriden once
+  // the class is loaded.
+  Constant* loader = ConstantExpr::getBitCast(StaticInitializer, ptrType);
+  CommonClassElts.push_back(loader);
  
   return ConstantStruct::get(STy, CommonClassElts);
 }
@@ -1909,6 +1912,13 @@
 
 #undef PRIMITIVE_ARRAY
 
+    std::vector<const llvm::Type*> llvmArgs;
+    llvmArgs.push_back(ptrType); // class loader.
+    const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+  
+    StaticInitializer = Function::Create(FTy, GlobalValue::InternalLinkage,
+                                         "Init", this);
+
   } else {
     PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty,
                                                          uint64(JavaArrayVT)),
@@ -2212,3 +2222,72 @@
   }
 }
 #endif
+
+void JnjvmModule::CreateStaticInitializer() {
+
+  // Set the linkage of all functions to External, so that the printer does
+  // not complain.
+  for (Module::iterator i = begin(), e = end(); i != e; ++i) {
+    i->setLinkage(GlobalValue::ExternalLinkage);
+  }
+
+  std::vector<const llvm::Type*> llvmArgs;
+  llvmArgs.push_back(ptrType); // class loader
+  llvmArgs.push_back(JavaCommonClassType); // cl
+  const FunctionType* FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+
+  Function* AddClass = Function::Create(FTy, GlobalValue::ExternalLinkage,
+                                        "vmjcAddPreCompiledClass", this);
+ 
+  llvmArgs.clear();
+  llvmArgs.push_back(ptrType); // class loader
+  llvmArgs.push_back(PointerType::getUnqual(JavaClassArrayType)); // array ptr
+  llvmArgs.push_back(UTF8Type); // name
+  FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+  
+  Function* GetClassArray = Function::Create(FTy, GlobalValue::ExternalLinkage,
+                                             "vmjcGetClassArray", this);
+  
+  llvmArgs.clear();
+  llvmArgs.push_back(ptrType); // class loader
+  llvmArgs.push_back(UTF8Type); // name
+  FTy = FunctionType::get(Type::VoidTy, llvmArgs, false);
+  
+  Function* LoadClass = Function::Create(FTy, GlobalValue::ExternalLinkage,
+                                         "vmjcLoadClass", this);
+
+  
+  BasicBlock* currentBlock = BasicBlock::Create("enter", StaticInitializer);
+  Function::arg_iterator loader = StaticInitializer->arg_begin();
+
+  Value* Args[3];
+  for (native_class_iterator i = nativeClasses.begin(), 
+       e = nativeClasses.end(); i != e; ++i) {
+    if (isCompiling(i->first)) {
+      Args[0] = loader;
+      Args[1] = ConstantExpr::getBitCast(i->second, JavaCommonClassType);
+      CallInst::Create(AddClass, Args, Args + 2, "", currentBlock);
+    }
+  }
+  
+  for (native_class_iterator i = nativeClasses.begin(), 
+       e = nativeClasses.end(); i != e; ++i) {
+    if (!isCompiling(i->first)) {
+      Args[0] = loader;
+      Args[1] = getUTF8(i->first->name);
+      CallInst::Create(LoadClass, Args, Args + 2, "", currentBlock);
+    }
+  }
+
+  for (array_class_iterator i = arrayClasses.begin(), 
+       e = arrayClasses.end(); i != e; ++i) {
+    if (!(i->first->baseClass()->isPrimitive())) {
+      Args[0] = loader;
+      Args[1] = i->second;
+      Args[2] = getUTF8(i->first->name);
+      CallInst::Create(GetClassArray, Args, Args + 3, "", currentBlock);
+    }
+  }
+
+  ReturnInst::Create(currentBlock);
+}

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Sun Jan  4 07:39:35 2009
@@ -233,6 +233,8 @@
   static llvm::Constant* PrimitiveArrayVT;
   static llvm::Constant* ReferenceArrayVT;
   
+  static llvm::Function* StaticInitializer;
+  
 public:
 
   bool isStaticCompiling() {
@@ -421,7 +423,9 @@
 #endif
   
 
-  bool isCompiling(CommonClass* cl);
+  bool isCompiling(const CommonClass* cl) const;
+  
+  void CreateStaticInitializer();
 
 private:
   static llvm::Module* initialModule;
@@ -444,6 +448,7 @@
   llvm::Constant* CreateConstantFromJavaClass(CommonClass* cl);
   llvm::Constant* CreateConstantForJavaObject(CommonClass* cl);
   llvm::Constant* getUTF8(const UTF8* val);
+
 };
 
 }





More information about the vmkit-commits mailing list