[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