[vmkit-commits] [vmkit] r140148 - in /vmkit/trunk: include/j3/JavaAOTCompiler.h lib/J3/Compiler/JavaAOTCompiler.cpp lib/J3/Compiler/JavaJIT.cpp lib/J3/Compiler/JavaJITCompiler.cpp lib/J3/VMCore/JavaClass.cpp lib/Mvm/MMTk/MvmGC.cpp lib/Mvm/MMTk/MvmGC.h lib/Mvm/Runtime/Object.cpp mmtk/mmtk-alloc/Selected.cpp tests/ tests/InvokeFinalizerTest.java
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Tue Sep 20 09:41:43 PDT 2011
Author: geoffray
Date: Tue Sep 20 11:41:43 2011
New Revision: 140148
URL: http://llvm.org/viewvc/llvm-project?rev=140148&view=rev
Log:
Always put a method for the destructor, in case it gets invoked directly.
Added:
vmkit/trunk/tests/
vmkit/trunk/tests/InvokeFinalizerTest.java
Modified:
vmkit/trunk/include/j3/JavaAOTCompiler.h
vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
vmkit/trunk/lib/J3/Compiler/JavaJIT.cpp
vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp
vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
vmkit/trunk/lib/Mvm/Runtime/Object.cpp
vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
Modified: vmkit/trunk/include/j3/JavaAOTCompiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/j3/JavaAOTCompiler.h?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/include/j3/JavaAOTCompiler.h (original)
+++ vmkit/trunk/include/j3/JavaAOTCompiler.h Tue Sep 20 11:41:43 2011
@@ -175,6 +175,7 @@
llvm::Function* ArrayObjectTracer;
llvm::Function* RegularObjectTracer;
llvm::Function* JavaObjectTracer;
+ llvm::Function* EmptyDestructorFunction;
llvm::Function* ReferenceObjectTracer;
llvm::GlobalVariable* UTF8TombstoneGV;
llvm::GlobalVariable* UTF8EmptyGV;
Modified: vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaAOTCompiler.cpp Tue Sep 20 11:41:43 2011
@@ -1603,14 +1603,15 @@
std::vector<Constant*> Elemts;
// Destructor
- Function* Finalizer = 0;
- JavaMethod* meth = (JavaMethod*)(RealVT->destructor);
- if (meth) {
+ Function* Finalizer = NULL;
+ if (VT->hasDestructor()) {
+ JavaMethod* meth = (JavaMethod*)(RealVT->destructor);
Finalizer = getMethodOrStub(meth);
+ } else {
+ Finalizer = EmptyDestructorFunction;
}
- Elemts.push_back(Finalizer ?
- ConstantExpr::getCast(Instruction::BitCast, Finalizer, PTy) : N);
+ Elemts.push_back(ConstantExpr::getCast(Instruction::BitCast, Finalizer, PTy));
// Delete
Elemts.push_back(N);
@@ -1869,6 +1870,12 @@
GlobalValue::ExternalLinkage,
"ReferenceObjectTracer",
getLLVMModule());
+
+ EmptyDestructorFunction = Function::Create(FTy,
+ GlobalValue::ExternalLinkage,
+ "EmptyDestructor",
+ getLLVMModule());
+
UTF8EmptyGV = new GlobalVariable(*getLLVMModule(),
JavaIntrinsics.UTF8Type->getContainedType(0),
@@ -2004,7 +2011,7 @@
((void**)VT)[meth.offset] = &meth;
}
- if (!cl->super) VT->destructor = 0;
+ if (!cl->super) VT->destructor = reinterpret_cast<uintptr_t>(EmptyDestructor);
}
void JavaAOTCompiler::makeIMT(Class* cl) {
Modified: vmkit/trunk/lib/J3/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaJIT.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaJIT.cpp Tue Sep 20 11:41:43 2011
@@ -1767,7 +1767,7 @@
// Make sure to add the object to the finalization list after it has been
// pushed.
- if (cl && cl->virtualVT->destructor) {
+ if (cl && cl->virtualVT->hasDestructor()) {
CallInst::Create(intrinsics->AddFinalizationCandidate, val, "", currentBlock);
}
}
Modified: vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/J3/Compiler/JavaJITCompiler.cpp Tue Sep 20 11:41:43 2011
@@ -203,9 +203,7 @@
// Special handling for finalize method. Don't put a finalizer
// if there is none, or if it is empty.
if (meth.offset == 0) {
- if (!cl->super) {
- meth.canBeInlined = true;
- } else {
+ if (cl->super != NULL) {
VT->destructor = getPointerOrStub(meth, JavaMethod::Virtual);
}
} else {
Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Tue Sep 20 11:41:43 2011
@@ -1367,7 +1367,6 @@
} else {
tracer = (uintptr_t)RegularObjectTracer;
}
- destructor = 0;
operatorDelete = 0;
// Set IMT.
@@ -1436,7 +1435,6 @@
} else {
// Set the tracer, destructor and delete.
tracer = (uintptr_t)JavaObjectTracer;
- destructor = 0;
operatorDelete = 0;
// Set the class of this VT.
@@ -1447,7 +1445,6 @@
offset = getCacheIndex() + 1;
depth = 0;
display[0] = this;
- destructor = 0;
nbSecondaryTypes = 0;
}
}
@@ -1635,7 +1632,6 @@
} else {
// Set the tracer, destructor and delete
tracer = (uintptr_t)JavaObjectTracer;
- destructor = 0;
operatorDelete = 0;
// Set the class of this VT.
Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.cpp Tue Sep 20 11:41:43 2011
@@ -36,7 +36,7 @@
extern "C" void* gcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
gc* res = (gc*)gcmalloc(sz, VT);
- if (VT->destructor)
+ if (VT->hasDestructor())
mvm::Thread::get()->MyVM->addFinalizationCandidate(res);
return res;
}
Modified: vmkit/trunk/lib/Mvm/MMTk/MvmGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/MMTk/MvmGC.h?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/MMTk/MvmGC.h (original)
+++ vmkit/trunk/lib/Mvm/MMTk/MvmGC.h Tue Sep 20 11:41:43 2011
@@ -14,6 +14,8 @@
#include "mvm/GC/GC.h"
#include <cstdlib>
+extern "C" void EmptyDestructor();
+
class VirtualTable {
public:
uintptr_t destructor;
@@ -39,7 +41,13 @@
tracer = t;
}
- VirtualTable() {}
+ VirtualTable() {
+ destructor = reinterpret_cast<uintptr_t>(EmptyDestructor);
+ }
+
+ bool hasDestructor() {
+ return destructor != reinterpret_cast<uintptr_t>(EmptyDestructor);
+ }
static void emptyTracer(void*) {}
};
Modified: vmkit/trunk/lib/Mvm/Runtime/Object.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/Runtime/Object.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/Runtime/Object.cpp (original)
+++ vmkit/trunk/lib/Mvm/Runtime/Object.cpp Tue Sep 20 11:41:43 2011
@@ -35,6 +35,9 @@
fprintf(stderr, "%p\n", ptr);
}
+extern "C" void EmptyDestructor() {
+}
+
void VirtualMachine::waitForExit() {
threadLock.lock();
Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=140148&r1=140147&r2=140148&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Tue Sep 20 11:41:43 2011
@@ -74,7 +74,7 @@
gc* res = 0;
llvm_gcroot(res, 0);
res = (gc*)gcmalloc(sz, VT);
- if (VT->destructor) addFinalizationCandidate(res);
+ if (VT->hasDestructor()) addFinalizationCandidate(res);
return res;
}
Added: vmkit/trunk/tests/InvokeFinalizerTest.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/tests/InvokeFinalizerTest.java?rev=140148&view=auto
==============================================================================
--- vmkit/trunk/tests/InvokeFinalizerTest.java (added)
+++ vmkit/trunk/tests/InvokeFinalizerTest.java Tue Sep 20 11:41:43 2011
@@ -0,0 +1,5 @@
+public class InvokeFinalizerTest {
+ public static void main(String[] args) throws Throwable {
+ new InvokeFinalizerTest().finalize();
+ }
+}
More information about the vmkit-commits
mailing list