[vmkit-commits] [vmkit] r72720 - /vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Jun 2 00:20:30 PDT 2009


Author: geoffray
Date: Tue Jun  2 02:20:30 2009
New Revision: 72720

URL: http://llvm.org/viewvc/llvm-project?rev=72720&view=rev
Log:
For a class, trace the super fields ourselves instead of calling the super tracer.


Modified:
    vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JnjvmModule.cpp Tue Jun  2 02:20:30 2009
@@ -89,6 +89,32 @@
 
   enabledException = true;
 }
+  
+void JavaLLVMCompiler::traceAllFields(uint32 nbFields, JavaField* fields,
+                                      BasicBlock* block, Value* realArg) {
+  Constant* zero = mvm::MvmModule::constantZero;
+  for (uint32 i = 0; i < nbFields; ++i) {
+    JavaField& cur = fields[i];
+    if (cur.getSignature()->trace()) {
+      LLVMFieldInfo* LFI = getFieldInfo(&cur);
+      std::vector<Value*> args; //size = 2
+      args.push_back(zero);
+      args.push_back(LFI->getOffset());
+      Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), 
+                                             "",block);
+      Value* val = new LoadInst(ptr, "", block);
+      Value* valCast = new BitCastInst(val, JnjvmModule::JavaObjectType, "",
+                                       block);
+      std::vector<Value*> Args;
+      Args.push_back(valCast);
+#ifdef MULTIPLE_GC
+      Args.push_back(GC);
+#endif
+      CallInst::Create(JavaIntrinsics.MarkAndTraceFunction, Args.begin(),
+                       Args.end(), "", block);
+    }
+  }
+}
 
 #ifdef WITH_TRACER
 llvm::Function* JavaLLVMCompiler::internalMakeTracer(Class* cl, bool stat) {
@@ -115,14 +141,13 @@
 
   if (!nbReferenceFields) {
     if (stat) return JavaIntrinsics.EmptyTracerFunction;
-    else return getClassInfo(cl->super)->getVirtualTracer();
+    else if (cl->super) return getClassInfo(cl->super)->getVirtualTracer();
   }
   
   Function* func = Function::Create(JnjvmModule::MarkAndTraceType,
                                     GlobalValue::InternalLinkage,
                                     "", getLLVMModule());
 
-  Constant* zero = mvm::MvmModule::constantZero;
   Argument* arg = func->arg_begin();
   BasicBlock* block = BasicBlock::Create("", func);
   llvm::Value* realArg = new BitCastInst(arg, type, "", block);
@@ -133,38 +158,18 @@
   Value* GC = ++func->arg_begin();
   Args.push_back(GC);
 #endif
-  if (!stat) {
-    if (cl->super == 0) {
-      CallInst::Create(JavaIntrinsics.JavaObjectTracerFunction, Args.begin(),
-                       Args.end(), "", block);
 
-    } else {
-      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);
-    }
-  }
-  
-  for (uint32 i = 0; i < nbFields; ++i) {
-    JavaField& cur = fields[i];
-    if (cur.getSignature()->trace()) {
-      LLVMFieldInfo* LFI = getFieldInfo(&cur);
-      std::vector<Value*> args; //size = 2
-      args.push_back(zero);
-      args.push_back(LFI->getOffset());
-      Value* ptr = GetElementPtrInst::Create(realArg, args.begin(), args.end(), 
-                                             "",block);
-      Value* val = new LoadInst(ptr, "", block);
-      Value* valCast = new BitCastInst(val, JnjvmModule::JavaObjectType, "",
-                                       block);
-      std::vector<Value*> Args;
-      Args.push_back(valCast);
-#ifdef MULTIPLE_GC
-      Args.push_back(GC);
-#endif
-      CallInst::Create(JavaIntrinsics.MarkAndTraceFunction, Args.begin(),
-                       Args.end(), "", block);
+  if (stat) {
+    traceAllFields(nbFields, fields, block, realArg);
+  } else {
+    CallInst::Create(JavaIntrinsics.JavaObjectTracerFunction, Args.begin(),
+                     Args.end(), "", block);
+    Class* cur = cl;
+    while (cur->super != 0) {
+      traceAllFields(cur->nbVirtualFields, cur->virtualFields, block, realArg);
+      cur = cur->super;
+      const Type* Ty = getClassInfo(cur)->getVirtualType();
+      realArg = new BitCastInst(realArg, Ty, "", block);
     }
   }
 





More information about the vmkit-commits mailing list