[vmkit-commits] [vmkit] r75009 - in /vmkit/trunk: include/jnjvm/JavaCompiler.h include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JITInfo.cpp lib/JnJVM/Compiler/JavaAOTCompiler.cpp lib/JnJVM/Compiler/JavaJITCompiler.cpp lib/JnJVM/VMCore/JavaClass.cpp tools/vmjc/vmjc.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Jul 8 08:34:06 PDT 2009


Author: geoffray
Date: Wed Jul  8 10:33:07 2009
New Revision: 75009

URL: http://llvm.org/viewvc/llvm-project?rev=75009&view=rev
Log:
Preliminary support for clinit'ing before AOT.


Modified:
    vmkit/trunk/include/jnjvm/JavaCompiler.h
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp
    vmkit/trunk/tools/vmjc/vmjc.cpp

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

==============================================================================
--- vmkit/trunk/include/jnjvm/JavaCompiler.h (original)
+++ vmkit/trunk/include/jnjvm/JavaCompiler.h Wed Jul  8 10:33:07 2009
@@ -37,15 +37,6 @@
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name) {
   }
   
-  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                         const char* name) {
-  }
-  
-  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                             const char* name) {
-  }
-  
-  
   virtual bool isStaticCompiling() {
     return false;
   }

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

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Wed Jul  8 10:33:07 2009
@@ -428,10 +428,6 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr) = 0;
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name) = 0;
-  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                         const char* name) = 0;
-  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                             const char* name) = 0;
   
 #ifdef SERVICE
   virtual llvm::Value* getIsolate(Jnjvm* vm, llvm::Value* Where) = 0;
@@ -496,10 +492,6 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr);
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name);
-  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                         const char* name);
-  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                             const char* name);
   
 
 #ifdef SERVICE
@@ -550,10 +542,6 @@
   virtual llvm::Constant* getNativeFunction(JavaMethod* meth, void* natPtr);
   
   virtual void setMethod(JavaMethod* meth, void* ptr, const char* name);
-  virtual void setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                         const char* name);
-  virtual void setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                             const char* name);
   
 
 #ifdef SERVICE

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp Wed Jul  8 10:33:07 2009
@@ -40,10 +40,15 @@
   if (!virtualType) {
     std::vector<const llvm::Type*> fields;
     
-    if (classDef->super && classDef->super->super) {
-      LLVMClassInfo* CLI = 
-        JavaLLVMCompiler::getClassInfo((Class*)classDef->super);
-      fields.push_back(CLI->getVirtualType()->getContainedType(0));
+    if (classDef->super) {
+      LLVMClassInfo* CLI = JavaLLVMCompiler::getClassInfo(classDef->super);
+      const llvm::Type* Ty = CLI->getVirtualType()->getContainedType(0);
+
+      if (classDef->super->super) {
+        fields.push_back(Ty);
+      } else {
+        fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
+      }
     } else {
       fields.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
     }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Wed Jul  8 10:33:07 2009
@@ -381,7 +381,7 @@
 
 Constant* JavaAOTCompiler::CreateConstantFromJavaClass(CommonClass* cl) {
   Class* javaClass = cl->classLoader->bootstrapLoader->upcalls->newClass;
-  LLVMClassInfo* LCI = (LLVMClassInfo*)getClassInfo(javaClass);
+  LLVMClassInfo* LCI = getClassInfo(javaClass);
   const StructType* STy = 
     dyn_cast<StructType>(LCI->getVirtualType()->getContainedType(0));
 
@@ -1131,19 +1131,12 @@
    
   // Destructor
   Function* Finalizer = 0;
-  if (RealVT->operatorDelete) {
-    char* name = (char*)(RealVT->destructor);
-    std::vector<const Type*> Args;
-    const FunctionType* Ty = FunctionType::get(Type::VoidTy, Args, false);
-    Finalizer = Function::Create(Ty, GlobalValue::ExternalLinkage, name,
-                                 getLLVMModule());
-  } else {
-    JavaMethod* meth = (JavaMethod*)(RealVT->destructor);
-    if (meth) {
-      LLVMMethodInfo* LMI = getMethodInfo(meth);
-      Finalizer = LMI->getMethod();
-    }
+  JavaMethod* meth = (JavaMethod*)(RealVT->destructor);
+  if (meth) {
+    LLVMMethodInfo* LMI = getMethodInfo(meth);
+    Finalizer = LMI->getMethod();
   }
+  
   Elemts.push_back(Finalizer ? 
       ConstantExpr::getCast(Instruction::BitCast, Finalizer, PTy) : N);
   
@@ -1479,19 +1472,6 @@
   func->setLinkage(GlobalValue::ExternalLinkage);
 }
 
-void JavaAOTCompiler::setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                                const char* name) {
-  VT->tracer = (uintptr_t)name;
-}
-
-void JavaAOTCompiler::setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                                    const char* name) {
-  // Set the name info into the operatorDelete directly, the compiler
-  // will use the name to create a LLVM function.
-  VT->destructor = (uintptr_t)name;
-  VT->operatorDelete = (uintptr_t)name;
-}
-
 Function* JavaAOTCompiler::addCallback(Class* cl, uint16 index,
                                       Signdef* sign, bool stat) {
  
@@ -1544,9 +1524,15 @@
   JnjvmBootstrapLoader* bootstrapLoader = vm->bootstrapLoader;
   JavaAOTCompiler* M = (JavaAOTCompiler*)bootstrapLoader->getCompiler();
   try {
-
-    bootstrapLoader->analyseClasspathEnv(vm->classpath);
-    bootstrapLoader->upcalls->initialiseClasspath(bootstrapLoader);
+    
+    if (M->runClinit) {
+      JavaJITCompiler* Comp = new JavaJITCompiler("JIT");
+      bootstrapLoader->setCompiler(Comp);
+      bootstrapLoader->analyseClasspathEnv(vm->classpath);
+    } else {
+      bootstrapLoader->analyseClasspathEnv(vm->classpath);
+      bootstrapLoader->upcalls->initialiseClasspath(bootstrapLoader);
+    }
   
     uint32 size = strlen(name);
     
@@ -1607,6 +1593,18 @@
         }
 
       }
+
+      if (M->runClinit) {
+        JavaJITCompiler* Comp = new JavaJITCompiler("JIT");
+        bootstrapLoader->setCompiler(Comp);
+        
+        for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
+             i != e; ++i) {
+          Class* cl = *i;
+          cl->initialiseClass(vm);
+        }
+        bootstrapLoader->setCompiler(M);
+      }
       
       for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
            i != e; ++i) {
@@ -1622,9 +1620,16 @@
       } else {
         memcpy(realName, name, size + 1);
       }
-
+     
       const UTF8* utf8 = bootstrapLoader->asciizConstructUTF8(realName);
       UserClass* cl = bootstrapLoader->loadName(utf8, true, true);
+      
+      if (M->runClinit) {
+        vm->loadBootstrap();
+        cl->initialiseClass(vm);
+        bootstrapLoader->setCompiler(M);
+      }
+      
       cl->setOwnerClass(JavaThread::get());
       M->compileClass(cl);
     }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Wed Jul  8 10:33:07 2009
@@ -185,17 +185,6 @@
   func->setLinkage(GlobalValue::ExternalLinkage);
 }
 
-void JavaJITCompiler::setTracer(JavaVirtualTable* VT, uintptr_t ptr,
-                                const char* name) {
-  VT->tracer = ptr;
-}
-
-void JavaJITCompiler::setDestructor(JavaVirtualTable* VT, uintptr_t ptr,
-                                    const char* name) {
-  VT->destructor = ptr;
-  VT->operatorDelete = ptr;
-}
-
 void* JavaJITCompiler::materializeFunction(JavaMethod* meth) {
   Function* func = parseFunction(meth);
  

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.cpp Wed Jul  8 10:33:07 2009
@@ -334,11 +334,12 @@
 }
 
 void JavaVirtualTable::setNativeTracer(uintptr_t ptr, const char* name) {
-  cl->classLoader->getCompiler()->setTracer(this, ptr, name);
+  tracer = ptr;
 }
 
 void JavaVirtualTable::setNativeDestructor(uintptr_t ptr, const char* name) {
-  cl->classLoader->getCompiler()->setDestructor(this, ptr, name);
+  destructor = ptr;
+  operatorDelete = ptr;
 }
 
 JavaMethod* Class::lookupInterfaceMethodDontThrow(const UTF8* name,

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

==============================================================================
--- vmkit/trunk/tools/vmjc/vmjc.cpp (original)
+++ vmkit/trunk/tools/vmjc/vmjc.cpp Wed Jul  8 10:33:07 2009
@@ -106,7 +106,7 @@
 AssumeCompiled("assume-compiled",
               cl::desc("Assume external Java classes are compiled"));
 
-static cl::opt<std::string>
+static cl::opt<bool>
 WithClinit("with-clinit", cl::desc("Clinit the given file"));
 
 static cl::opt<bool> 
@@ -175,8 +175,7 @@
       return 0;
     }
    
-    JavaCompiler* Comp = 0;
-    if (WithClinit.empty()) {
+    if (!WithClinit) {
       Module* TheModule = new Module("bootstrap module",
                                      *(new llvm::LLVMContext()));
       if (!TargetTriple.empty())
@@ -203,36 +202,30 @@
 
 
       mvm::MvmModule::initialise(CodeGenOpt::Default, TheModule, TheTarget);
-      Comp = new JavaAOTCompiler("AOT");
     } else {
       mvm::MvmModule::initialise();
-      Comp = new JavaJITCompiler("JIT");
     }
 
+    JavaAOTCompiler* Comp = new JavaAOTCompiler("AOT");
+
     mvm::Collector::initialise();
     mvm::Collector::enable(0);
 
     JnjvmClassLoader* JCL = mvm::VirtualMachine::initialiseJVM(Comp, false);
     addCommandLinePass(argv);
 
-    if (!WithClinit.empty()) {
-      // TODO
-      Comp = new JavaAOTCompiler("AOT");
-      JCL->setCompiler(Comp);
-    }
-    
-    JavaAOTCompiler* MAOT = (JavaAOTCompiler*)Comp;
-    if (DisableExceptions) MAOT->disableExceptions();
-    if (DisableStubs) MAOT->generateStubs = false;
-    if (AssumeCompiled) MAOT->assumeCompiled = true;
-    MAOT->compileFile(JCL, InputFilename.c_str());
+    if (DisableExceptions) Comp->disableExceptions();
+    if (DisableStubs) Comp->generateStubs = false;
+    if (AssumeCompiled) Comp->assumeCompiled = true;
+    if (WithClinit) Comp->runClinit = true;
+    Comp->compileFile(JCL, InputFilename.c_str());
 
     if (!MainClass.empty()) {
-      MAOT->generateMain(MainClass.c_str(), WithJIT);
+      Comp->generateMain(MainClass.c_str(), WithJIT);
     }
 
     if (PrintStats)
-      MAOT->printStats();
+      Comp->printStats();
 
     if (DontPrint) {
       // Just use stdout.  We won't actually print anything on it.
@@ -280,7 +273,7 @@
     }
     
     if (Force || !CheckBitcodeOutputToConsole(Out,true))
-      WriteBitcodeToFile(MAOT->getLLVMModule(), *Out);
+      WriteBitcodeToFile(Comp->getLLVMModule(), *Out);
 
     if (Out != &std::cout) {
       ((std::ofstream*)Out)->close();





More information about the vmkit-commits mailing list