[vmkit-commits] [vmkit] r137015 - in /vmkit/trunk: Makefile.rules lib/J3/Compiler/JavaAOTCompiler.cpp lib/Mvm/StaticGCPass/Makefile mmtk/magic/LowerJavaRT.cpp mmtk/mmtk-j3/Makefile

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Aug 6 01:28:57 PDT 2011


Author: geoffray
Date: Sat Aug  6 03:28:57 2011
New Revision: 137015

URL: http://llvm.org/viewvc/llvm-project?rev=137015&view=rev
Log:
Make some changes to how we AOT compile MMTk to prepare cleanup:
- Remove dependency on a lazy jit compiler by making sure the magic methods are compiled before runnin LowerMagic on JITted methods
- Remove dependency on -load-bc by compiling MMTKRuntime to both a shared library and a bytecode library


Modified:
    vmkit/trunk/Makefile.rules
    vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/Mvm/StaticGCPass/Makefile
    vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
    vmkit/trunk/mmtk/mmtk-j3/Makefile

Modified: vmkit/trunk/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=137015&r1=137014&r2=137015&view=diff
==============================================================================
--- vmkit/trunk/Makefile.rules (original)
+++ vmkit/trunk/Makefile.rules Sat Aug  6 03:28:57 2011
@@ -67,13 +67,11 @@
 endif
 
 ifeq ($(COMPILE_MMTK), 1)
-  ADDITIONAL_ARGS := -load-bc=$(LibDir)/MMTKRuntime.bc 
-
   all::
 	$(Verb) $(ANT) -buildfile $(PROJ_OBJ_ROOT)/mmtk/java/build.xml
 	$(Echo) Building $(BuildMode) $(JARNAME).jar $(notdir $@)
 	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) -std-compile-opts -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
-	$(Verb) $(VMJC) -std-compile-opts $(ADDITIONAL_ARGS) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled -llvm-lazy
+	$(Verb) $(VMJC) -std-compile-opts -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
 	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -std-compile-opts -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
 	$(Verb) $(LLVMLD) -r -o $(LibDir)/FinalMMTk.bc $(LibDir)/MMTKAlloc.bc $(JARNAME)-optimized.bc $(LibDir)/MMTKRuntime.bc
 	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) -std-compile-opts -StaticGCPass -o $(LibDir)/FinalMMTk.bc

Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=137015&r1=137014&r2=137015&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Sat Aug  6 03:28:57 2011
@@ -2098,13 +2098,17 @@
 
 static const char* name;
 
+extern "C" void UnreachableMagicMMTk() {
+  UNREACHABLE();
+}
+
 void mainCompilerStart(JavaThread* th) {
   
   Jnjvm* vm = th->getJVM();
   JnjvmBootstrapLoader* bootstrapLoader = vm->bootstrapLoader;
   JavaAOTCompiler* M = (JavaAOTCompiler*)bootstrapLoader->getCompiler();
-  JavaJITCompiler* Comp = 0;
-  mvm::ThreadAllocator allocator;
+  M->addJavaPasses();
+
   bootstrapLoader->analyseClasspathEnv(vm->bootstrapLoader->bootClasspathEnv);
   uint32 size = strlen(name);
   if (size > 4 && 
@@ -2112,6 +2116,7 @@
     bootstrapLoader->analyseClasspathEnv(name);
   }
 
+  JavaJITCompiler* Comp = NULL;
   if (!M->clinits->empty()) {
     Comp = JavaJITCompiler::CreateCompiler("JIT");
     Comp->EmitFunctionName = true;
@@ -2138,9 +2143,6 @@
     }
 
     extractFiles(bytes, M, bootstrapLoader, classes);
-    // Now that we know if we can trust this compiler, add the Java passes.
-    M->addJavaPasses();
-
 
     // First resolve everyone so that there can not be unknown references in
     // constant pools.
@@ -2157,65 +2159,90 @@
       for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
         M->getMethod(&cl->staticMethods[i]);
       }
-
     }
 
     if (!M->clinits->empty()) {
       vm->loadBootstrap();
+      
+      // First, if we have the magic classes available, make sure we
+      // compile them so that we can call them directly and let
+      // LowerMagic lower them later on.
+      for (std::vector<Class*>::iterator ii = classes.begin(),
+           ee = classes.end(); ii != ee; ++ii) {
+        Class* cl = *ii;
+        static const std::string magic = "org/vmmagic";
+        static void* ptr = (void*)(uintptr_t)UnreachableMagicMMTk;
+        if (!strncmp(UTF8Buffer(cl->name).cString(),
+                     magic.c_str(),
+                     magic.length() - 1)) {
+          for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
+            if (!isAbstract(cl->virtualMethods[i].access)) {
+              Function* F = M->getMethod(&cl->virtualMethods[i]);
+              M->setMethod(F, ptr, F->getName().data());
+              cl->virtualMethods[i].compiledPtr();
+            }
+          }
 
-      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();
-              } END_CATCH;
+          for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
+            if (!isAbstract(cl->staticMethods[i].access)) {
+              Function* F = M->getMethod(&cl->staticMethods[i]);
+              M->setMethod(F, ptr, F->getName().data());
+              cl->staticMethods[i].compiledPtr();
             }
           }
-        } 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();
-            } END_CATCH;
+      // Initialize all classes given with with the -with-clinit
+      // command line argument.
+      for (std::vector<std::string>::iterator i = M->clinits->begin(),
+           e = M->clinits->end(); i != e; ++i) {
+        Class* cl = NULL;
+        TRY {
+          if (i->at(i->length() - 1) == '*') {
+            for (std::vector<Class*>::iterator ii = classes.begin(),
+                 ee = classes.end(); ii != ee; ++ii) {
+              cl = *ii;
+              if (!strncmp(UTF8Buffer(cl->name).cString(), i->c_str(),
+                           i->length() - 1)) {
+                cl->initialiseClass(vm);
+              }
+            }
           } else {
-            fprintf(stderr, "Class %s does not exist or is an array class.\n",
-                    i->c_str());
+            const UTF8* name = bootstrapLoader->asciizConstructUTF8(i->c_str());
+            CommonClass* cls = bootstrapLoader->lookupClass(name);
+            if (cls && cls->isClass()) {
+              cl = cls->asClass();
+              cl->initialiseClass(vm);
+            } else {
+              fprintf(stderr, "Class %s does not exist or is an array class.\n",
+                      i->c_str());
+            }
           }
-        }
+        } CATCH {
+          fprintf(stderr, "Error when initializing %s\n",
+                  UTF8Buffer(cl->name).cString());
+          abort();
+        } END_CATCH;
       }
       bootstrapLoader->setCompiler(M);
     }
-    
+   
+    // Set the thread as the owner of the classes, so that it knows it
+    // has to compile them. 
     for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
          i != e; ++i) {
-      Class* cl = *i;
-      cl->setOwnerClass(JavaThread::get());
+      (*i)->setOwnerClass(JavaThread::get());
     }
     
+    // Finally, compile all classes.
     for (std::vector<Class*>::iterator i = classes.begin(), e = classes.end();
          i != e; ++i) {
-      Class* cl = *i;
-      M->compileClass(cl);
+      M->compileClass(*i);
     }
 
   } else {
-    M->addJavaPasses();
+    mvm::ThreadAllocator allocator;
     char* realName = (char*)allocator.Allocate(size + 1);
     if (size > 6 && !strcmp(&name[size - 6], ".class")) {
       memcpy(realName, name, size - 6);

Modified: vmkit/trunk/lib/Mvm/StaticGCPass/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/StaticGCPass/Makefile?rev=137015&r1=137014&r2=137015&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/StaticGCPass/Makefile (original)
+++ vmkit/trunk/lib/Mvm/StaticGCPass/Makefile Sat Aug  6 03:28:57 2011
@@ -10,7 +10,6 @@
 LEVEL = ../../..
 LIBRARYNAME = StaticGCPass
 LOADABLE_MODULE = 1
-USEDLIBS =
 
 include $(LEVEL)/Makefile.common
 

Modified: vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerJavaRT.cpp?rev=137015&r1=137014&r2=137015&view=diff
==============================================================================
--- vmkit/trunk/mmtk/magic/LowerJavaRT.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerJavaRT.cpp Sat Aug  6 03:28:57 2011
@@ -62,6 +62,16 @@
     }
   }
 
+  // Remove all references to magic methods.
+  for (Module::iterator I = M.begin(), E = M.end(); I != E;) {
+    Function& GV = *I;
+    ++I;
+    if (!strncmp(GV.getName().data(), "JnJVM_org_vmmagic", 17)) {
+      GV.replaceAllUsesWith(Constant::getNullValue(GV.getType()));
+      GV.eraseFromParent();
+    }
+  }
+
   for (Module::global_iterator I = M.global_begin(), E = M.global_end();
        I != E;) {
     GlobalValue& GV = *I;
@@ -69,7 +79,7 @@
     if (!strncmp(GV.getName().data(), "JnJVM_java", 10) ||
         !strncmp(GV.getName().data(), "java", 4) ||
         !strncmp(GV.getName().data(), "JnJVM_gnu", 9) ||
-        !strncmp(GV.getName().data(), "_3", 2) ||
+        !strncmp(GV.getName().data(), "_3", 2) || // Arrays
         !strncmp(GV.getName().data(), "gnu", 3)) {
       GV.replaceAllUsesWith(Constant::getNullValue(GV.getType()));
       GV.eraseFromParent();

Modified: vmkit/trunk/mmtk/mmtk-j3/Makefile
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/Makefile?rev=137015&r1=137014&r2=137015&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/Makefile (original)
+++ vmkit/trunk/mmtk/mmtk-j3/Makefile Sat Aug  6 03:28:57 2011
@@ -12,8 +12,8 @@
 include $(LEVEL)/Makefile.config
 
 MODULE_NAME = MMTKRuntime
+LIBRARYNAME = MMTKRuntime
 LOADABLE_MODULE = 1
-USEDLIBS =
 
 CXX.Flags += -I$(PROJ_SRC_DIR)/../../lib/J3/VMCore
 





More information about the vmkit-commits mailing list