[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