[vmkit-commits] [vmkit] r70124 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JITInfo.cpp lib/JnJVM/Compiler/JavaAOTCompiler.cpp lib/JnJVM/Compiler/JavaJITCompiler.cpp lib/JnJVM/Compiler/JnjvmModule.cpp lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll lib/JnJVM/VMCore/VirtualTables.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sun Apr 26 06:28:15 PDT 2009


Author: geoffray
Date: Sun Apr 26 08:28:02 2009
New Revision: 70124

URL: http://llvm.org/viewvc/llvm-project?rev=70124&view=rev
Log:
Code changes when creating tracers. Optimize the case when there is nothing
to trace.


Modified:
    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/Compiler/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll
    vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll
    vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp

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

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Sun Apr 26 08:28:02 2009
@@ -234,6 +234,7 @@
 #ifdef WITH_TRACER
   llvm::Function* MarkAndTraceFunction;
   static const llvm::FunctionType* MarkAndTraceType;
+  llvm::Function* EmptyTracerFunction;  
   llvm::Function* JavaObjectTracerFunction;  
   llvm::Function* JavaArrayTracerFunction;  
   llvm::Function* ArrayObjectTracerFunction;  
@@ -358,9 +359,7 @@
 
 #ifdef WITH_TRACER 
   llvm::Function* internalMakeTracer(Class* cl, bool stat);
-  virtual llvm::Function* makeTracer(Class* cl, bool stat) {
-    return internalMakeTracer(cl, stat);
-  }
+  virtual llvm::Function* makeTracer(Class* cl, bool stat)  = 0;
 #endif
   
   void addJavaPasses();
@@ -502,6 +501,10 @@
 #ifdef SERVICE
   virtual llvm::Value* getIsolate(Jnjvm* vm, llvm::Value* Where);
 #endif
+
+#ifdef WITH_TRACER
+  virtual llvm::Function* makeTracer(Class* cl, bool stat);
+#endif
   
   virtual ~JavaJITCompiler() {}
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JITInfo.cpp Sun Apr 26 08:28:02 2009
@@ -106,14 +106,8 @@
     uint64 size = JnjvmModule::getTypeSize(structType);
     cl->staticSize = size;
 #ifdef WITH_TRACER
-    JavaLLVMCompiler* Mod = 
-      (JavaLLVMCompiler*)cl->classLoader->getCompiler();
-    if (!Mod->isStaticCompiling()) {
-      Function* F = Mod->makeTracer(cl, true);
-      cl->staticTracer = (void (*)(void*)) (uintptr_t)
-        JnjvmModule::executionEngine->getPointerToFunction(F);
-      F->deleteBody();
-    }
+    JavaLLVMCompiler* Mod = (JavaLLVMCompiler*)cl->classLoader->getCompiler();
+    staticTracerFunction = Mod->makeTracer(cl, true);
 #endif
   }
   return staticType;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Sun Apr 26 08:28:02 2009
@@ -1028,7 +1028,8 @@
   // staticTracer
   const Type* FTy = STy->getContainedType(STy->getNumContainedTypes() - 1);
 #ifdef WITH_TRACER
-  Function* F = makeTracer(cl, true);
+  Function* F = getClassInfo(cl)->getStaticTracer();
+  assert(F && "No static tracer");
   Constant* staticTracer = ConstantExpr::getCast(Instruction::BitCast, F, FTy);
 #else
   Constant* staticTracer = ConstantExpr::getNullValue(FTy);
@@ -1153,7 +1154,7 @@
       Tracer = JavaIntrinsics.ArrayObjectTracerFunction;
     }
   } else if (classDef->isClass()) {
-    Tracer = makeTracer(classDef->asClass(), false);
+    Tracer = getClassInfo(classDef->asClass())->getVirtualTracer();
   }
 
   Elemts.push_back(Tracer ? 
@@ -1241,7 +1242,7 @@
 
 #ifdef WITH_TRACER
 llvm::Function* JavaAOTCompiler::makeTracer(Class* cl, bool stat) {
-  if (!generateTracers) {
+  if (!generateTracers || (!cl->super && !stat)) {
     return JavaIntrinsics.JavaObjectTracerFunction;
   } else {
     return internalMakeTracer(cl, stat);
@@ -1453,7 +1454,12 @@
     JavaMethod& meth = cl->virtualMethods[i];
     ((void**)VT)[meth.offset] = &meth;
   }
+
   if (!cl->super) VT->destructor = 0;
+
+  LLVMClassInfo* LCI = getClassInfo(cl);
+  if (!LCI->virtualTracerFunction) 
+    LCI->virtualTracerFunction = makeTracer(cl, false);
 }
 
 void JavaAOTCompiler::setMethod(JavaMethod* meth, void* ptr, const char* name) {
@@ -1467,7 +1473,7 @@
   Function* func = Function::Create(JnjvmModule::MarkAndTraceType,
                                     GlobalValue::ExternalLinkage,
                                     name, getLLVMModule());
-       
+
   LLVMClassInfo* LCI = getClassInfo(VT->cl->asClass());
   LCI->virtualTracerFunction = func;
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Sun Apr 26 08:28:02 2009
@@ -136,6 +136,8 @@
 void JavaJITCompiler::makeVT(Class* cl) { 
   JavaVirtualTable* VT = cl->virtualVT; 
   assert(VT && "No VT was allocated!");
+    
+  LLVMClassInfo* LCI = getClassInfo(cl);
 
 #ifdef WITH_TRACER
   if (VT->tracer) {
@@ -148,7 +150,6 @@
        
     uintptr_t ptr = VT->tracer;
     JnjvmModule::executionEngine->addGlobalMapping(func, (void*)ptr);
-    LLVMClassInfo* LCI = getClassInfo(cl);
     LCI->virtualTracerFunction = func;
 
   }
@@ -193,17 +194,29 @@
   }
 
 #ifdef WITH_TRACER
-  if (!VT->tracer) {
-    Function* func = makeTracer(cl, false);
-  
-    void* codePtr = mvm::MvmModule::executionEngine->getPointerToFunction(func);
-    VT->tracer = (uintptr_t)codePtr;
-    func->deleteBody();
+  if (!LCI->virtualTracerFunction) {
+    LCI->virtualTracerFunction = makeTracer(cl, false);
   }
 #endif
     
 }
 
+Function* JavaJITCompiler::makeTracer(Class* cl, bool stat) {
+  Function* F = cl->super || stat ?
+    internalMakeTracer(cl, stat) : JavaIntrinsics.JavaObjectTracerFunction;
+ 
+  assert(F && "No tracer");
+  if (stat) {
+    cl->staticTracer = (void (*)(void*)) (uintptr_t)
+      JnjvmModule::executionEngine->getPointerToFunction(F);
+  } else {
+    void* codePtr = mvm::MvmModule::executionEngine->getPointerToFunction(F);
+    cl->virtualVT->tracer = (uintptr_t)codePtr;
+  }
+  F->deleteBody();
+  return F;
+}
+
 void JavaJITCompiler::setMethod(JavaMethod* meth, void* ptr, const char* name) {
   Function* func = getMethodInfo(meth)->getMethod();
   func->setName(name);

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Sun Apr 26 08:28:02 2009
@@ -105,6 +105,19 @@
     nbFields = cl->nbVirtualFields;
   }
   
+  uint32 nbReferenceFields = 0;
+  for (uint32 i = 0; i < nbFields; ++i) {
+    JavaField& cur = fields[i];
+    if (cur.getSignature()->trace()) {
+      ++nbReferenceFields;
+    }
+  }
+
+  if (!nbReferenceFields) {
+    if (stat) return JavaIntrinsics.EmptyTracerFunction;
+    else return getClassInfo(cl->super)->getVirtualTracer();
+  }
+  
   Function* func = Function::Create(JnjvmModule::MarkAndTraceType,
                                     GlobalValue::InternalLinkage,
                                     "", getLLVMModule());
@@ -126,16 +139,9 @@
                        Args.end(), "", block);
 
     } else {
-      LLVMClassInfo* LCP = (LLVMClassInfo*)getClassInfo((Class*)(cl->super));
-      Function* F = LCP->virtualTracerFunction;
-      if (!F) {
-        if (isStaticCompiling()) {
-          F = internalMakeTracer(cl->super, false);
-        } else {
-          F = LCP->getVirtualTracer();
-        }
-        assert(F && "Still no virtual tracer for super");
-      }
+      LLVMClassInfo* LCP = getClassInfo(cl->super);
+      Function* F = LCP->getVirtualTracer();
+      assert(F && "Still no virtual tracer for super");
       CallInst::Create(F, Args.begin(), Args.end(), "", block);
     }
   }
@@ -164,12 +170,6 @@
 
   ReturnInst::Create(block);
   
-  if (!stat) {
-    LCI->virtualTracerFunction = func;
-  } else {
-    LCI->staticTracerFunction = func;
-  }
-
   return func;
 }
 #endif
@@ -418,6 +418,7 @@
 #ifdef WITH_TRACER
   MarkAndTraceFunction = module->getFunction("MarkAndTrace");
   JavaObjectTracerFunction = module->getFunction("JavaObjectTracer");
+  EmptyTracerFunction = module->getFunction("EmptyTracer");
   JavaArrayTracerFunction = module->getFunction("JavaArrayTracer");
   ArrayObjectTracerFunction = module->getFunction("ArrayObjectTracer");
 #endif

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll?rev=70124&r1=70123&r2=70124&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-multi-mmap.ll Sun Apr 26 08:28:02 2009
@@ -6,3 +6,4 @@
 declare void @JavaObjectTracer(%JavaObject*, i8*)
 declare void @JavaArrayTracer(%JavaObject*, i8*)
 declare void @ArrayObjectTracer(%JavaObject*, i8*)
+declare void @EmptyTracer(%JavaObject*, i8*)

Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll?rev=70124&r1=70123&r2=70124&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-single-mmap.ll Sun Apr 26 08:28:02 2009
@@ -6,3 +6,4 @@
 declare void @JavaObjectTracer(%JavaObject*)
 declare void @JavaArrayTracer(%JavaObject*)
 declare void @ArrayObjectTracer(%JavaObject*)
+declare void @EmptyTracer(%JavaObject*)

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/VirtualTables.cpp Sun Apr 26 08:28:02 2009
@@ -65,6 +65,12 @@
 #undef INIT
 
 //===----------------------------------------------------------------------===//
+// Empty tracer for static tracers of classes that do not declare static
+// variables.
+//===----------------------------------------------------------------------===//
+extern "C" void EmptyTracer(void*) {}
+
+//===----------------------------------------------------------------------===//
 // Root trace methods for Java objects. There are three types of roots:
 // (1) Object whose class is not an array: needs to trace the classloader and
 //     the lock.
@@ -156,8 +162,8 @@
   
   for (uint32 i =0; i < NR_ISOLATES; ++i) {
     TaskClassMirror &M = IsolateInfo[i];
-    if (M.staticInstance) {
-      ((Class*)this)->staticTracer(M.staticInstance);
+    if (M.staticInstance && staticTracer != EmptyTracer) {
+      staticTracer(M.staticInstance);
     }
   }
 }





More information about the vmkit-commits mailing list