[vmkit-commits] [vmkit] r120221 - in /vmkit/trunk: include/mvm/VirtualMachine.h lib/J3/VMCore/Jnjvm.cpp lib/J3/VMCore/Jnjvm.h mmtk/mmtk-j3/MMTkObject.h mmtk/mmtk-j3/ObjectModel.cpp mmtk/mmtk-j3/RuntimeHelpers.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Nov 27 07:12:30 PST 2010


Author: geoffray
Date: Sat Nov 27 09:12:30 2010
New Revision: 120221

URL: http://llvm.org/viewvc/llvm-project?rev=120221&view=rev
Log:
Remove all references to JavaObject in mmtk-j3, making virtual methods in VirtualMachine.


Modified:
    vmkit/trunk/include/mvm/VirtualMachine.h
    vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/J3/VMCore/Jnjvm.h
    vmkit/trunk/mmtk/mmtk-j3/MMTkObject.h
    vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
    vmkit/trunk/mmtk/mmtk-j3/RuntimeHelpers.cpp

Modified: vmkit/trunk/include/mvm/VirtualMachine.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/mvm/VirtualMachine.h?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/include/mvm/VirtualMachine.h (original)
+++ vmkit/trunk/include/mvm/VirtualMachine.h Sat Nov 27 09:12:30 2010
@@ -157,6 +157,15 @@
   ///
   virtual void tracer(uintptr_t closure) {}
 
+  /// getObjectSize - Get the size of this object. Used by copying collectors.
+  ///
+  virtual size_t getObjectSize(gc* object) = 0;
+
+  /// getObjectTypeName - Get the type of this object. Used by the GC for
+  /// debugging purposes.
+  ///
+  virtual const char* getObjectTypeName(gc* object) { return "An object"; }
+
   /// rendezvous - The rendezvous implementation for garbage collection.
   ///
 #ifdef WITH_LLVM_GCC

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Sat Nov 27 09:12:30 2010
@@ -1414,6 +1414,45 @@
   finalizerThread->addFinalizationCandidate(object);
 }
 
+size_t Jnjvm::getObjectSize(gc* object) {
+  // TODO: because this is called during GC, there is no need to do
+  // llvm_gcroot. For clarity, it may be useful to have a special type
+  // in this case.
+  size_t size = 0;
+  JavaObject* src = (JavaObject*)object;
+  VirtualTable* VT = src->getVirtualTable();
+  if (VMClassLoader::isVMClassLoader(src)) {
+    size = sizeof(VMClassLoader);
+  } else {
+    CommonClass* cl = JavaObject::getClass(src);
+    if (cl->isArray()) {
+      UserClassArray* array = cl->asArrayClass();
+      UserCommonClass* base = array->baseClass();
+      uint32 logSize = base->isPrimitive() ? 
+        base->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2); 
+
+      size = sizeof(JavaObject) + sizeof(ssize_t) + 
+                    (JavaArray::getSize(src) << logSize);
+    } else {
+      assert(cl->isClass() && "Not a class!");
+      size = cl->asClass()->getVirtualSize();
+    }
+  }
+  return size;
+}
+
+const char* Jnjvm::getObjectTypeName(gc* object) {
+  JavaObject* src = (JavaObject*)object;
+  if (VMClassLoader::isVMClassLoader(src)) {
+    return "VMClassLoader";
+  } else {
+    CommonClass* cl = JavaObject::getClass(src);
+    // This code is only used for debugging on a fatal error. It is fine to
+    // allocate in the C++ heap.
+    return (new UTF8Buffer(cl->name))->cString();
+  }
+}
+
 // Helper function to run J3 without JIT.
 extern "C" int StartJnjvmWithoutJIT(int argc, char** argv, char* mainClass) {
   mvm::Collector::initialise();

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.h?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.h (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.h Sat Nov 27 09:12:30 2010
@@ -135,6 +135,8 @@
   virtual void scanPhantomReferencesQueue(uintptr_t closure);
   virtual void scanFinalizationQueue(uintptr_t closure);
   virtual void addFinalizationCandidate(gc* obj);
+  virtual size_t getObjectSize(gc* obj);
+  virtual const char* getObjectTypeName(gc* obj);
 
   /// CreateError - Creates a Java object of the specified exception class
   /// and calling its <init> function.

Modified: vmkit/trunk/mmtk/mmtk-j3/MMTkObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/MMTkObject.h?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/MMTkObject.h (original)
+++ vmkit/trunk/mmtk/mmtk-j3/MMTkObject.h Sat Nov 27 09:12:30 2010
@@ -12,11 +12,22 @@
 
 #include <stdint.h>
 #include "MutatorThread.h"
+#include "MvmGC.h"
 
 namespace mmtk {
 
+class MMTkObject;
+
+struct MMTkClass {
+  MMTkObject* delegatee;
+};
+
+struct MMTkVirtualTable : public VirtualTable {
+  MMTkClass* cl;
+};
+
 struct MMTkObject {
-  uintptr_t virtual_table;
+  MMTkVirtualTable* virtualTable;
   uintptr_t header;
 };
 

Modified: vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/ObjectModel.cpp Sat Nov 27 09:12:30 2010
@@ -7,18 +7,14 @@
 //
 //===----------------------------------------------------------------------===//
 
-#include "JavaArray.h"
-#include "JavaClass.h"
-#include "JavaObject.h"
-
+#include "mvm/VirtualMachine.h"
 #include "MMTkObject.h"
-
 #include "debug.h"
 
 namespace mmtk {
 
 extern "C" intptr_t Java_org_j3_mmtk_ObjectModel_getArrayBaseOffset__ (MMTkObject* OM) {
-  return sizeof(j3::JavaObject) + sizeof(ssize_t);
+  return sizeof(MMTkObject) + sizeof(ssize_t);
 }
 
 extern "C" intptr_t Java_org_j3_mmtk_ObjectModel_GC_1HEADER_1OFFSET__ (MMTkObject* OM) {
@@ -89,27 +85,10 @@
 
 extern "C" uintptr_t Java_org_j3_mmtk_ObjectModel_copy__Lorg_vmmagic_unboxed_ObjectReference_2I (
     MMTkObject* OM, gc* src, int allocator) {
-  size_t size = 0;
-  VirtualTable* VT = src->getVirtualTable();
-  if (j3::VMClassLoader::isVMClassLoader((j3::JavaObject*)src)) {
-    size = sizeof(j3::VMClassLoader);
-  } else {
-    j3::CommonClass* cl = j3::JavaObject::getClass((j3::JavaObject*)src);
-    if (cl->isArray()) {
-      j3::UserClassArray* array = cl->asArrayClass();
-      j3::UserCommonClass* base = array->baseClass();
-      uint32 logSize = base->isPrimitive() ? 
-        base->asPrimitiveClass()->logSize : (sizeof(j3::JavaObject*) == 8 ? 3 : 2); 
-
-      size = sizeof(j3::JavaObject) + sizeof(ssize_t) + 
-                    (j3::JavaArray::getSize((j3::JavaObject*)src) << logSize);
-    } else {
-      assert(cl->isClass() && "Not a class!");
-      size = cl->asClass()->getVirtualSize();
-    }
-  }
+  size_t size = mvm::Thread::get()->MyVM->getObjectSize(src);
   size = llvm::RoundUpToAlignment(size, sizeof(void*));
-  uintptr_t res = JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(src, VT, size, allocator);
+  uintptr_t res = JnJVM_org_j3_bindings_Bindings_copy__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2II(
+      src, src->getVirtualTable(), size, allocator);
   assert((((uintptr_t*)res)[1] & ~mvm::GCBitMask) == (((uintptr_t*)src)[1] & ~mvm::GCBitMask));
   return res;
 }
@@ -151,13 +130,6 @@
       elements[i] = name[i];
     }
   }
-  
-  FakeByteArray(const j3::UTF8* name) {
-    length = name->size;
-    for (uint32 i = 0; i < length; i++) {
-      elements[i] = name->elements[i];
-    }
-  }
  private:
   size_t length;
   uint8_t elements[1];
@@ -165,15 +137,12 @@
 
 extern "C" FakeByteArray* Java_org_j3_mmtk_ObjectModel_getTypeDescriptor__Lorg_vmmagic_unboxed_ObjectReference_2 (
     MMTkObject* OM, gc* src) {
-  if (j3::VMClassLoader::isVMClassLoader((j3::JavaObject*)src)) {
-    return new (14) FakeByteArray("VMClassLoader");
-  } else {
-    j3::CommonClass* cl = j3::JavaObject::getClass((j3::JavaObject*)src);
-    return new (cl->name->size) FakeByteArray(cl->name);
-  }
+  const char* name = mvm::Thread::get()->MyVM->getObjectTypeName(src);
+  // This code is only used for debugging on a fatal error. It is fine to
+  // allocate in the C++ heap.
+  return new (strlen(name)) FakeByteArray(name);
 }
 
-
 extern "C" void Java_org_j3_mmtk_ObjectModel_getArrayLength__Lorg_vmmagic_unboxed_ObjectReference_2 (
     MMTkObject* OM, uintptr_t object) { UNIMPLEMENTED(); }
 

Modified: vmkit/trunk/mmtk/mmtk-j3/RuntimeHelpers.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-j3/RuntimeHelpers.cpp?rev=120221&r1=120220&r2=120221&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-j3/RuntimeHelpers.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-j3/RuntimeHelpers.cpp Sat Nov 27 09:12:30 2010
@@ -8,8 +8,6 @@
 //===----------------------------------------------------------------------===//
 
 #include "MMTkObject.h"
-#include "JavaObject.h"
-#include "JavaClass.h"
 
 namespace mmtk {
 
@@ -17,8 +15,8 @@
   return str->value->elements[index];
 }
 
-extern "C" j3::JavaObject* MMTkGetClass(j3::JavaObject* obj) {
-  return ((j3::JavaVirtualTable*)obj->getVirtualTable())->cl->delegatee[0];
+extern "C" MMTkObject* MMTkGetClass(MMTkObject* obj) {
+  return obj->virtualTable->cl->delegatee;
 }
 
 }





More information about the vmkit-commits mailing list