[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