[vmkit-commits] [vmkit] r75434 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp tools/vmjc/vmjc.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Jul 12 14:55:30 PDT 2009


Author: geoffray
Date: Sun Jul 12 16:55:30 2009
New Revision: 75434

URL: http://llvm.org/viewvc/llvm-project?rev=75434&view=rev
Log:
Change how to specify which classes must be clinited.
Also a couple of bugfixes for emitting Java objects and magic objects.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/tools/vmjc/vmjc.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=75434&r1=75433&r2=75434&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sun Jul 12 16:55:30 2009
@@ -11,6 +11,7 @@
 #define JNJVM_MODULE_H
 
 #include <map>
+#include <vector>
 
 #include "mvm/Allocator.h"
 #include "mvm/JIT.h"
@@ -639,8 +640,9 @@
   
   bool generateStubs;
   bool assumeCompiled;
-  bool runClinit;
   bool compileRT;
+
+  std::vector<std::string>* clinits;
   
   
   void CreateStaticInitializer();

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=75434&r1=75433&r2=75434&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Sun Jul 12 16:55:30 2009
@@ -210,21 +210,31 @@
 
 
 Constant* JavaAOTCompiler::getFinalObject(JavaObject* obj) {
-  llvm::Constant* varGV = 0;
+  llvm::GlobalVariable* varGV = 0;
   final_object_iterator End = finalObjects.end();
   final_object_iterator I = finalObjects.find(obj);
   if (I == End) {
-    Constant* CO = CreateConstantFromJavaObject(obj);
-    
-    varGV = new GlobalVariable(CO->getType(), true,
-                               GlobalValue::InternalLinkage,
-                               CO, "", getLLVMModule());
+  
+    if (mvm::Collector::begOf(obj)) {
+
+      const Type* Ty = JnjvmModule::JavaObjectType->getContainedType(0);
+      varGV = new GlobalVariable(Ty, true, GlobalValue::InternalLinkage,
+                                 0, "", getLLVMModule());
 
-    varGV = ConstantExpr::getCast(Instruction::BitCast, varGV,
-                                  JnjvmModule::JavaObjectType);
   
-    finalObjects.insert(std::make_pair(obj, varGV));
-    return varGV;
+      finalObjects.insert(std::make_pair(obj, varGV));
+    
+      Constant* C = ConstantExpr::getBitCast(CreateConstantFromJavaObject(obj),
+                                           Ty);
+    
+      varGV->setInitializer(C);
+      return varGV;
+    } else {
+      Constant* CI = ConstantInt::get(Type::Int64Ty, uint64_t(obj));
+      CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
+      finalObjects.insert(std::make_pair(obj, CI));
+      return CI;
+    }
   } else {
     return I->second;
   }
@@ -505,7 +515,7 @@
     // JavaObject
     Constant* CurConstant = CreateConstantForBaseObject(obj->getClass());
 
-    for (uint32 j = 0; j < cl->virtualVT->depth; ++j) {
+    for (uint32 j = 1; j <= cl->virtualVT->depth; ++j) {
       std::vector<Constant*> TempElts;
       Elmts.push_back(CurConstant);
       TempElts.push_back(CurConstant);
@@ -547,8 +557,14 @@
             abort();
           }
         } else {
-          Constant* C = getFinalObject(field.getObjectField(obj));
-          TempElts.push_back(C);
+          JavaObject* val = field.getObjectField(obj);
+          if (val) {
+            Constant* C = getFinalObject(field.getObjectField(obj));
+            TempElts.push_back(C);
+          } else {
+            const llvm::Type* Ty = JnjvmModule::JavaObjectType;
+            TempElts.push_back(Constant::getNullValue(Ty));
+          }
         }
       }
       CurConstant = ConstantStruct::get(STy, TempElts);
@@ -1115,7 +1131,11 @@
     } else if (Ty->isFloatingPoint()) {
       Vals.push_back(ConstantFP::get(Ty, (double)(size_t)val->elements[i]));
     } else {
-      Vals.push_back(getFinalObject((JavaObject*)(size_t)val->elements[i]));
+      if (val->elements[i]) {
+        Vals.push_back(getFinalObject((JavaObject*)(size_t)val->elements[i]));
+      } else {
+        Vals.push_back(Constant::getNullValue(JnjvmModule::JavaObjectType));
+      }
     }
   }
 
@@ -1575,10 +1595,11 @@
   Jnjvm* vm = th->getJVM();
   JnjvmBootstrapLoader* bootstrapLoader = vm->bootstrapLoader;
   JavaAOTCompiler* M = (JavaAOTCompiler*)bootstrapLoader->getCompiler();
+  JavaJITCompiler* Comp = 0;
   try {
     
-    if (M->runClinit) {
-      JavaJITCompiler* Comp = new JavaJITCompiler("JIT");
+    if (!M->clinits->empty()) {
+      Comp = new JavaJITCompiler("JIT");
       bootstrapLoader->setCompiler(Comp);
       bootstrapLoader->analyseClasspathEnv(vm->classpath);
     } else {
@@ -1646,13 +1667,44 @@
 
       }
 
-      if (M->runClinit) {
+      if (!M->clinits->empty()) {
         vm->loadBootstrap();
-        
-        for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
-             i != e; ++i) {
-          Class* cl = *i;
-          cl->initialiseClass(vm);
+
+        for (std::vector<std::string>::iterator i = M->clinits->begin(),
+             e = M->clinits->end(); i != e; ++i) {
+          
+          if (i->at(i->length() - 1) == '*') {
+            for (std::vector<Class*>::iterator ii = classes.begin(),
+                 ee = classes.end(); ii != ee; ++ii) {
+              Class* cl = *ii;
+              if (!strncmp(UTF8Buffer(cl->name).cString(), i->c_str(),
+                           i->length() - 1)) {
+                try {
+                  cl->asClass()->initialiseClass(vm);
+                } catch (...) {
+                  fprintf(stderr, "Error when initializing %s\n",
+                          UTF8Buffer(cl->name).cString());
+                  abort();
+                }
+              }
+            }
+          } else {
+
+            const UTF8* name = bootstrapLoader->asciizConstructUTF8(i->c_str());
+            CommonClass* cl = bootstrapLoader->lookupClass(name);
+            if (cl && cl->isClass()) {
+              try {
+                cl->asClass()->initialiseClass(vm);
+              } catch (...) {
+                fprintf(stderr, "Error when initializing %s\n",
+                        UTF8Buffer(cl->name).cString());
+                abort();
+              }
+            } else {
+              fprintf(stderr, "Class %s does not exist or is an array class.\n",
+                      i->c_str());
+            }
+          }
         }
         bootstrapLoader->setCompiler(M);
       }
@@ -1675,7 +1727,7 @@
       const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
       UserClass* cl = bootstrapLoader->loadName(utf8, true, true);
       
-      if (M->runClinit) {
+      if (!M->clinits->empty()) {
         vm->loadBootstrap();
         cl->initialiseClass(vm);
         bootstrapLoader->setCompiler(M);

Modified: vmkit/trunk/tools/vmjc/vmjc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tools/vmjc/vmjc.cpp?rev=75434&r1=75433&r2=75434&view=diff

==============================================================================
--- vmkit/trunk/tools/vmjc/vmjc.cpp (original)
+++ vmkit/trunk/tools/vmjc/vmjc.cpp Sun Jul 12 16:55:30 2009
@@ -107,9 +107,6 @@
 AssumeCompiled("assume-compiled",
               cl::desc("Assume external Java classes are compiled"));
 
-static cl::opt<bool>
-WithClinit("with-clinit", cl::desc("Clinit the given file"));
-
 static cl::opt<bool> 
 PrintStats("print-aot-stats", 
            cl::desc("Print stats by the AOT compiler"));
@@ -118,6 +115,10 @@
 static cl::list<std::string> 
 Properties("D", cl::desc("Set a property"), cl::Prefix, cl::ZeroOrMore);
 
+static cl::list<std::string> 
+WithClinit("with-clinit", cl::desc("Set a property"), cl::ZeroOrMore,
+           cl::CommaSeparated);
+
 
 
 inline void addPass(FunctionPassManager *PM, Pass *P) {
@@ -179,7 +180,7 @@
       return 0;
     }
    
-    if (!WithClinit) {
+    if (WithClinit.empty()) {
       Module* TheModule = new Module("bootstrap module",
                                      *(new llvm::LLVMContext()));
       if (!TargetTriple.empty())
@@ -213,7 +214,6 @@
     JavaAOTCompiler* Comp = new JavaAOTCompiler("AOT");
 
     mvm::Collector::initialise();
-    mvm::Collector::enable(0);
 
     JnjvmClassLoader* JCL = mvm::VirtualMachine::initialiseJVM(Comp, false);
     addCommandLinePass(argv);
@@ -221,7 +221,6 @@
     if (DisableExceptions) Comp->disableExceptions();
     if (DisableStubs) Comp->generateStubs = false;
     if (AssumeCompiled) Comp->assumeCompiled = true;
-    if (WithClinit) Comp->runClinit = true;
     
     mvm::BumpPtrAllocator A;
     Jnjvm* vm = new(A, "Bootstrap loader") Jnjvm(A, (JnjvmBootstrapLoader*)JCL);
@@ -240,6 +239,7 @@
       }
     }
 
+    Comp->clinits = &WithClinit;
     Comp->compileFile(vm, InputFilename.c_str());
 
     if (!MainClass.empty()) {





More information about the vmkit-commits mailing list