[vmkit-commits] [vmkit] r180366 - Refactored gcmalloc to vmkitgcmalloc.

Peter Senna Tschudin peter.senna at gmail.com
Thu Apr 25 10:03:41 PDT 2013


Author: peter.senna
Date: Thu Apr 25 12:02:08 2013
New Revision: 180366

URL: http://llvm.org/viewvc/llvm-project?rev=180366&view=rev
Log:
Refactored gcmalloc to vmkitgcmalloc.
Created an optimized gcmalloc for VT based object layout (VTgcmalloc).
Inline VTgcmalloc to restore J3 performance.
J3 uses VTgcmalloc instead of vmkitgcmalloc.
(cherry picked from commit 1c3cd302d091d66e5d0ec95b1b7b23f104b1e99b)

Modified:
    vmkit/trunk/Makefile.rules
    vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h
    vmkit/trunk/lib/j3/Compiler/EscapeAnalysis.cpp
    vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/j3/VMCore/JavaObject.h
    vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/vmkit/Compiler/InlineMalloc.cpp
    vmkit/trunk/lib/vmkit/Compiler/JIT.cpp
    vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll
    vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp
    vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h
    vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java
    vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
    vmkit/trunk/mmtk/magic/LowerMagic.cpp
    vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp

Modified: vmkit/trunk/Makefile.rules
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/Makefile.rules?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/Makefile.rules (original)
+++ vmkit/trunk/Makefile.rules Thu Apr 25 12:02:08 2013
@@ -15,7 +15,7 @@ ifdef VMKIT_RUNTIME
 
 LLVMRuntime.inc : $(LLVMAS) $(LLC) $(VMKIT_RUNTIME)
 	$(Echo) "Building LLVM runtime with $(VMKIT_RUNTIME)"
-	$(Verb) cat $(VMKIT_RUNTIME) | $(LLVMAS) -o - | $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=contents -o $@
+	$(Verb) cat $(VMKIT_RUNTIME) | $(LLVMAS) -o - | $(LLC) -march=cpp -cppgen=contents -o $@
 
 all-local:: LLVMRuntime.inc
 
@@ -37,18 +37,18 @@ glibj.zip.s : $(LOPT) $(LLC) $(VMJC)
 glibj.zip.bc :
 	$(Echo) "Compiling glibj.zip to llvm"
 	$(Verb) if test -d $(GLIBJ); then \
-	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ)/glibj.zip -o glibj.zip.bc; \
+	  $(VMJC) -f -std-compile-opts $(GLIBJ)/glibj.zip -o glibj.zip.bc; \
 	else \
-	  $(VMJC) -f $(VMJC_GLIBJ_FLAGS) $(GLIBJ) -o glibj.zip.bc; \
+	  $(VMJC) -f -std-compile-opts $(GLIBJ) -o glibj.zip.bc; \
 	fi
 	
 glibj-optimized.zip.bc : glibj.zip.bc
 	$(Echo) "Optimizing glibj.zip"
-	$(Verb) $(LOPT) $(OPT_VMJC_FLAGS) -f glibj.zip.bc -o glibj-optimized.zip.bc
+	$(Verb) $(LOPT) -std-compile-opts -f glibj.zip.bc -o glibj-optimized.zip.bc
 
 glibj.zip.s : glibj-optimized.zip.bc
 	$(Echo) "Compiling glibj.zip.bc to native"
-	$(Verb) $(LLC) $(LLC_GLIBJ_FLAGS) -disable-cfi -relocation-model=pic -disable-fp-elim glibj-optimized.zip.bc -o glibj.zip.s
+	$(Verb) $(LLC) -disable-cfi -relocation-model=pic -disable-fp-elim glibj-optimized.zip.bc -o glibj.zip.s
 
 $(ObjDir)/%.o: %.s $(ObjDir)/.dir $(BUILT_SOURCES)
 	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)
@@ -74,22 +74,20 @@ ifeq ($(COMPILE_MMTK), 1)
   all::
 	$(Verb) $(ANT) -buildfile $(PROJ_OBJ_ROOT)/mmtk/java/build.xml
 	$(Echo) Building $(BuildMode) $(JARNAME).jar $(notdir $@)
-	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
-	$(Verb) $(VMJC) $(VMJC_MMTK_FLAGS) -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
-	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) $(OPT_MMTK_FLAGS) -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
+	$(Verb) $(LOPT) -load=$(LibDir)/JITGCPass$(SHLIBEXT) -std-compile-opts -JITGCPass -f $(LibDir)/MMTKAlloc.bc -o $(LibDir)/MMTKAlloc.bc
+	$(Verb) $(VMJC) -std-compile-opts -load=$(LibDir)/MMTKRuntime$(SHLIBEXT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -LowerMagic $(PROJ_OBJ_ROOT)/mmtk/java/$(JARNAME).jar -disable-exceptions -disable-cooperativegc -with-clinit=org/mmtk/vm/VM,org/mmtk/utility/*,org/mmtk/policy/*,org/j3/config/* -Dmmtk.hostjvm=org.j3.mmtk.Factory -o $(JARNAME).bc -Dmmtk.properties=$(PROJ_SRC_ROOT)/mmtk/java/vmkit.properties -disable-stubs -assume-compiled
+	$(Verb) $(LOPT) -load=$(LibDir)/MMTKMagic$(SHLIBEXT) -std-compile-opts -LowerJavaRT -f $(JARNAME).bc -o $(JARNAME)-optimized.bc
 	$(Verb) $(LLVMLINK) -o $(LibDir)/FinalMMTk.bc $(LibDir)/MMTKAlloc.bc $(JARNAME)-optimized.bc $(LibDir)/MMTKRuntime.bc
-	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) $(OPT_MMTK_FLAGS) -StaticGCPass -o $(LibDir)/FinalMMTk.bc
+	$(Verb) $(LOPT) $(LibDir)/FinalMMTk.bc -load=$(LibDir)/StaticGCPass$(SHLIBEXT) -std-compile-opts -StaticGCPass -o $(LibDir)/FinalMMTk.bc
 	$(Verb) $(MKDIR) $(ObjDir)
-	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-fp-elim -disable-cfi -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) $(LibDir)/FinalMMTk.bc -o $(ObjDir)/FinalMMTk.s
-	$(Verb) $(GREP) -v '\.loc[^0-9]\+[0-9]\+ 0' $(ObjDir)/FinalMMTk.s > $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc
-	$(Verb) $(MV) -f $(ObjDir)/FinalMMTk.s.remove_invalid_dot_loc $(ObjDir)/FinalMMTk.s
+	$(Verb) $(LLC) -disable-fp-elim -disable-cfi -disable-debug-info-print -load=$(LibDir)/StaticGCPrinter$(SHLIBEXT) $(LibDir)/FinalMMTk.bc -o $(ObjDir)/FinalMMTk.s
 	$(Verb) $(LLVMCC) -c $(ObjDir)/FinalMMTk.s -o $(ObjDir)/FinalMMTk.o
 	$(Verb) $(Archive) $(LibDir)/libFinalMMTk.a $(ObjDir)/FinalMMTk.o
 	$(Verb) $(Ranlib) $(LibDir)/libFinalMMTk.a
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=gcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkMallocInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=fieldWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkFieldWriteInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=arrayWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkArrayWriteInline.inc
-	$(Verb) $(LLC) $(LLC_CPP_FLAGS) -march=cpp -cppgen=function -cppfor=nonHeapWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkNonHeapWriteInline.inc
+	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=VTgcmalloc $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkMallocInline.inc
+	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=fieldWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkFieldWriteInline.inc
+	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=arrayWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkArrayWriteInline.inc
+	$(Verb) $(LLC) -march=cpp -cppgen=function -cppfor=nonHeapWriteBarrier $(LibDir)/FinalMMTk.bc -o $(PROJ_SRC_ROOT)/mmtk/inline/MMTkNonHeapWriteInline.inc
 endif
 
 clean-local::
@@ -110,11 +108,11 @@ AModule           := $(LibDir)/lib$(MODU
 
 $(ObjectsBCWithGC): $(ObjDir)/%_gc.bc: $(ObjDir)/%.ll $(LOPT)
 	$(Echo) "Compiling $*.ll to $*.bc for $(BuildMode) build (bytecode)"
-	$(Verb) $(LOPT) $< -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPass$(SHLIBEXT) $(OPT_BC_WITH_GC_FLAGS) -StaticGCPass -o $@
+	$(Verb) $(LOPT) $< -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPass$(SHLIBEXT) -std-compile-opts -StaticGCPass -o $@
 
 $(ObjectsSWithGC): $(ObjDir)/%_gc.s: $(ObjDir)/%_gc.bc $(LLC)
 	$(Echo) "Compiling $*.bc to $*.s for $(BuildMode) build"
-	$(Verb) $(LLC) $(LLC_ASM_FLAGS) -disable-cfi -disable-fp-elim -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPrinter$(SHLIBEXT) $< -o $@
+	$(Verb) $(LLC) -disable-cfi -disable-fp-elim -load=$(VMKIT_OBJ_ROOT)/$(BuildMode)/lib/StaticGCPrinter$(SHLIBEXT) $< -o $@
 
 $(ObjectsWithGC): $(ObjDir)/%_gc.o: $(ObjDir)/%_gc.s $(ObjDir)/.dir
 	$(Echo) "Compiling $*.s for $(BuildMode) build" $(PIC_FLAG)

Modified: vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h (original)
+++ vmkit/trunk/lib/j3/ClassLib/VMStaticInstance.h Thu Apr 25 12:02:08 2013
@@ -34,7 +34,7 @@ public:
     VMStaticInstance* res = 0;
     llvm_gcroot(res, 0);
     llvm_gcroot(Class, 0);
-    res = (VMStaticInstance*)gc::operator new(sizeof(VMStaticInstance), &VT);
+    res = (VMStaticInstance*)JavaObject::operator new(sizeof(VMStaticInstance), &VT);
     res->OwningClass = Class;
     printf("VMStaticInstance operator new @%p\n", res);
     fflush(NULL);

Modified: vmkit/trunk/lib/j3/Compiler/EscapeAnalysis.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/EscapeAnalysis.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/EscapeAnalysis.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/EscapeAnalysis.cpp Thu Apr 25 12:02:08 2013
@@ -52,7 +52,7 @@ namespace {
 
 bool EscapeAnalysis::runOnFunction(Function& F) {
   bool Changed = false;
-  Function* Allocator = F.getParent()->getFunction("gcmalloc");
+  Function* Allocator = F.getParent()->getFunction("VTgcmalloc");
   if (!Allocator) return Changed;
 
   LoopInfo* LI = &getAnalysis<LoopInfo>();

Modified: vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/j3/Compiler/JavaJITCompiler.cpp Thu Apr 25 12:02:08 2013
@@ -177,7 +177,7 @@ JavaJITCompiler::JavaJITCompiler(const s
   // Set the pointer to methods that will be inlined, so that these methods
   // do not get compiled by the JIT.
   executionEngine->updateGlobalMapping(
-      JavaIntrinsics.AllocateFunction, (void*)(word_t)gcmalloc);
+      JavaIntrinsics.AllocateFunction, (void*)(word_t)VTgcmalloc);
   executionEngine->updateGlobalMapping(
       JavaIntrinsics.ArrayWriteBarrierFunction, (void*)(word_t)arrayWriteBarrier);
   executionEngine->updateGlobalMapping(

Modified: vmkit/trunk/lib/j3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaClass.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaClass.cpp Thu Apr 25 12:02:08 2013
@@ -281,7 +281,7 @@ JavaObject* UserClassArray::doNew(sint32
     cl->asPrimitiveClass()->logSize : (sizeof(JavaObject*) == 8 ? 3 : 2);
   VirtualTable* VT = virtualVT;
   uint32 size = sizeof(JavaObject) + sizeof(ssize_t) + (n << logSize);
-  res = (JavaObject*)gc::operator new(size, VT);
+  res = (JavaObject*)JavaObject::operator new(size, VT);
   JavaArray::setSize(res, n);
   return res;
 }
@@ -465,7 +465,7 @@ JavaObject* UserClass::doNew(Jnjvm* vm)
           this == classLoader->bootstrapLoader->upcalls->newClass)
          && "Uninitialized class when allocating.");
   assert(getVirtualVT() && "No VT\n");
-  res = (JavaObject*)gc::operator new(getVirtualSize(), getVirtualVT());
+  res = (JavaObject*)JavaObject::operator new(getVirtualSize(), getVirtualVT());
   return res;
 }
 

Modified: vmkit/trunk/lib/j3/VMCore/JavaObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JavaObject.h?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JavaObject.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JavaObject.h Thu Apr 25 12:02:08 2013
@@ -238,6 +238,12 @@ private:
   
 public:
 
+  /// operator new - Optimized operator new for VT based objects
+  ///
+  void* operator new(size_t sz, VirtualTable *VT) {
+	    return VTgcmallocUnresolved(sz, VT);
+	  }
+
   /// getVirtualTable - Returns the java virtual table of this object.
   ///
   JavaVirtualTable* getVirtualTable() const {

Modified: vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/j3/VMCore/Jnjvm.cpp Thu Apr 25 12:02:08 2013
@@ -1378,12 +1378,8 @@ void Jnjvm::scanFinalizationQueue(word_t
 }
 
 void Jnjvm::addFinalizationCandidate(gc* object) {
-	JavaObject* src = 0;
 	llvm_gcroot(object, 0);
-	llvm_gcroot(src, 0);
-  src = (JavaObject*)object;
-  if (src->getVirtualTable()->hasDestructor())
-  	finalizerThread->addFinalizationCandidate(src);
+	finalizerThread->addFinalizationCandidate(object);
 }
 
 void Jnjvm::setType(gc* header, void* type) {

Modified: vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/j3/VMCore/JnjvmClassLoader.h Thu Apr 25 12:02:08 2013
@@ -498,7 +498,7 @@ public:
   static VMClassLoader* allocate() {
     VMClassLoader* res = 0;
     llvm_gcroot(res, 0);
-    res = (VMClassLoader*)gc::operator new(sizeof(VMClassLoader), &VT);
+    res = (VMClassLoader*)JavaObject::operator new(sizeof(VMClassLoader), &VT);
     return res;
   }
 

Modified: vmkit/trunk/lib/vmkit/Compiler/InlineMalloc.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Compiler/InlineMalloc.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Compiler/InlineMalloc.cpp (original)
+++ vmkit/trunk/lib/vmkit/Compiler/InlineMalloc.cpp Thu Apr 25 12:02:08 2013
@@ -40,7 +40,7 @@ namespace vmkit {
 
 
 bool InlineMalloc::runOnFunction(Function& F) {
-  Function* Malloc = F.getParent()->getFunction("gcmalloc");
+  Function* VTMalloc = F.getParent()->getFunction("VTgcmalloc");
   Function* FieldWriteBarrier = F.getParent()->getFunction("fieldWriteBarrier");
   Function* ArrayWriteBarrier = F.getParent()->getFunction("arrayWriteBarrier");
   Function* NonHeapWriteBarrier = F.getParent()->getFunction("nonHeapWriteBarrier");
@@ -57,7 +57,7 @@ bool InlineMalloc::runOnFunction(Functio
       }
       CallSite Call(I);
       Function* Temp = Call.getCalledFunction();
-      if (Temp == Malloc) {
+      if (Temp == VTMalloc) {
         if (dyn_cast<Constant>(Call.getArgument(0))) {
           InlineFunctionInfo IFI(NULL, DL);
           Changed |= InlineFunction(Call, IFI);

Modified: vmkit/trunk/lib/vmkit/Compiler/JIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Compiler/JIT.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Compiler/JIT.cpp (original)
+++ vmkit/trunk/lib/vmkit/Compiler/JIT.cpp Thu Apr 25 12:02:08 2013
@@ -362,7 +362,7 @@ void BaseIntrinsics::init(llvm::Module*
 
   unconditionalSafePoint = module->getFunction("unconditionalSafePoint");
   conditionalSafePoint = module->getFunction("conditionalSafePoint");
-  AllocateUnresolvedFunction = module->getFunction("gcmallocUnresolved");
+  AllocateUnresolvedFunction = module->getFunction("vmkitgcmallocUnresolved");
   assert(AllocateUnresolvedFunction && "No allocateUnresolved function");
   AddFinalizationCandidate = module->getFunction("addFinalizationCandidate");
   assert(AddFinalizationCandidate && "No addFinalizationCandidate function");
@@ -370,7 +370,7 @@ void BaseIntrinsics::init(llvm::Module*
   ArrayWriteBarrierFunction = module->getFunction("arrayWriteBarrier");
   FieldWriteBarrierFunction = module->getFunction("fieldWriteBarrier");
   NonHeapWriteBarrierFunction = module->getFunction("nonHeapWriteBarrier");
-  AllocateFunction = module->getFunction("gcmalloc");
+  AllocateFunction = module->getFunction("vmkitgcmalloc");
 
   SetjmpFunction = module->getFunction("_setjmp");
   RegisterSetjmpFunction = module->getFunction("registerSetjmp");

Modified: vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll (original)
+++ vmkit/trunk/lib/vmkit/Compiler/LLVMRuntime.ll Thu Apr 25 12:02:08 2013
@@ -62,13 +62,16 @@ declare i64 @llvm.atomic.cmp.swap.i64.p0
 declare void @unconditionalSafePoint() nounwind
 declare void @conditionalSafePoint() nounwind
 declare void @llvm.gcroot(i8**, i8*)
-declare i8* @gcmalloc(i32, i8*)
-declare i8* @gcmallocUnresolved(i32, i8*)
+declare i8* @vmkitgcmalloc(i32, i8*)
+declare i8* @vmkitgcmallocUnresolved(i32, i8*)
 declare void @addFinalizationCandidate(i8*)
 declare void @arrayWriteBarrier(i8*, i8**, i8*)
 declare void @fieldWriteBarrier(i8*, i8**, i8*)
 declare void @nonHeapWriteBarrier(i8**, i8*)
-
+;;;;;;;;;;;;;;; Optimized Allocators for VT based Object Layout ;;;;;;;;;;;;;;;
+declare i8* @VTgcmalloc(i32, i8*)
+declare i8* @VTgcmallocUnresolved(i32, i8*)
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
 
 
 declare i32 @_setjmp(i8*) nounwind

Modified: vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp (original)
+++ vmkit/trunk/lib/vmkit/MMTk/VmkitGC.cpp Thu Apr 25 12:02:08 2013
@@ -39,7 +39,7 @@ extern "C" void postalloc(gc* obj, void*
 	vmkit::Thread::get()->MyVM->setType(obj, type);
 }
 
-extern "C" void* gcmalloc(uint32_t sz, void* type) {
+extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) {
   gc* res = 0;
   sz += gcHeader::hiddenHeaderSize();
   res = (gc*) prealloc(sz);
@@ -47,12 +47,42 @@ extern "C" void* gcmalloc(uint32_t sz, v
   return res;
 }
 
-extern "C" void* gcmallocUnresolved(uint32_t sz, void* type) {
-	gc* res = (gc*)gcmalloc(sz, type);
+extern "C" void* vmkitgcmallocUnresolved(uint32_t sz, void* type) {
+	gc* res = (gc*)vmkitgcmalloc(sz, type);
 	vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
 	return res;
 }
 
+/******************************************************************************
+ * Optimized gcmalloc for VT based object layout.                             *
+ *****************************************************************************/
+
+extern "C" void* VTgcmalloc(uint32_t sz, VirtualTable* VT) {
+  gc* res = 0;
+  gcHeader* head = 0;
+  sz += gcHeader::hiddenHeaderSize();
+  sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
+  head = (gcHeader*) malloc(sz);
+  memset((void*)head, 0, sz);
+  res = head->toReference();
+
+  lock.acquire();
+  __InternalSet__.insert(res);
+  lock.release();
+
+  VirtualTable::setVirtualTable(res, VT);
+  return res;
+}
+
+extern "C" void* VTgcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
+	gc* res = (gc*)VTgcmalloc(sz, VT);
+	if (VT->hasDestructor())
+		vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
+	return res;
+}
+
+/*****************************************************************************/
+
 // Do not insert MagicArray ref to InternalSet of references.
 extern "C" void* AllocateMagicArray(int32_t sz, void* length) {
 	gcHeader* head = 0;

Modified: vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h (original)
+++ vmkit/trunk/lib/vmkit/MMTk/VmkitGC.h Thu Apr 25 12:02:08 2013
@@ -59,21 +59,24 @@ class VirtualTable {
   /// getVirtualTable - Returns the virtual table of this reference.
   ///
   static const VirtualTable* getVirtualTable(gc* ref) {
-  	llvm_gcroot(ref, 0);
     return ((VirtualTable**)(ref))[0];
   }
 
   /// setVirtualTable - Sets the virtual table of this reference.
   ///
   static void setVirtualTable(gc* ref, VirtualTable* VT) {
-  	llvm_gcroot(ref, 0);
     ((VirtualTable**)(ref))[0] = VT;
   }
 
 };
 
-extern "C" void* gcmallocUnresolved(uint32_t sz, void* type);
-extern "C" void* gcmalloc(uint32_t sz, void* type);
+extern "C" void* vmkitgcmallocUnresolved(uint32_t sz, void* type);
+extern "C" void* vmkitgcmalloc(uint32_t sz, void* type);
+
+/************** Only for Virtual Table based objects *************************/
+extern "C" void* VTgcmallocUnresolved(uint32_t sz, VirtualTable* VT);
+extern "C" void* VTgcmalloc(uint32_t sz, VirtualTable* VT);
+/*****************************************************************************/
 
 class gc : public gcRoot {
 public:
@@ -84,7 +87,7 @@ public:
   }
 
   void* operator new(size_t sz, void *type) {
-    return gcmallocUnresolved(sz, type);
+    return vmkitgcmallocUnresolved(sz, type);
   }
 };
 

Modified: vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java (original)
+++ vmkit/trunk/mmtk/java/src/org/j3/bindings/Bindings.java Thu Apr 25 12:02:08 2013
@@ -25,6 +25,7 @@ import org.vmmagic.pragma.Inline;
 import org.vmmagic.unboxed.Address;
 import org.vmmagic.unboxed.Extent;
 import org.vmmagic.unboxed.ObjectReference;
+import org.vmmagic.unboxed.Offset;
 
 import org.vmutil.options.AddressOption;
 import org.vmutil.options.BooleanOption;
@@ -39,15 +40,25 @@ import org.vmutil.options.StringOption;
 
 public final class Bindings {
 	  @Inline
-	  private static Address gcmalloc(int size, ObjectReference virtualTable) {
+	  private static Address vmkitgcmalloc(int size, ObjectReference type) {
 	    Selected.Mutator mutator = Selected.Mutator.get();
 	    int allocator = mutator.checkAllocator(size, 0, 0);
 	    Address res = mutator.alloc(size, 0, 0, allocator, 0);
-	    setType(res.toObjectReference(), virtualTable);
-	    mutator.postAlloc(res.toObjectReference(), virtualTable, size, allocator);
+	    setType(res.toObjectReference(), type);
+	    mutator.postAlloc(res.toObjectReference(), type, size, allocator);
 	    return res;
 	  }
 	
+	  @Inline
+	  private static Address VTgcmalloc(int size, ObjectReference virtualTable) {
+	    Selected.Mutator mutator = Selected.Mutator.get();
+	    int allocator = mutator.checkAllocator(size, 0, 0);
+	    Address res = mutator.alloc(size, 0, 0, allocator, 0);
+	    res.store(virtualTable, Offset.zero().plus(hiddenHeaderSize()));
+	    mutator.postAlloc(res.toObjectReference(), virtualTable, size, allocator);
+	    return res;
+	  }
+
 	@Inline
 	private static Address prealloc(int size) {
 		Selected.Mutator mutator = Selected.Mutator.get();

Modified: vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerJavaRT.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/mmtk/magic/LowerJavaRT.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerJavaRT.cpp Thu Apr 25 12:02:08 2013
@@ -121,8 +121,8 @@ bool LowerJavaRT::runOnModule(Module& M)
   F->replaceAllUsesWith(Constant::getNullValue(F->getType()));
   F->eraseFromParent();
  
-  // Replace gcmalloc with the allocator of MMTk objects in VMKit
-  F = M.getFunction("gcmalloc");
+  // Replace VTgcmalloc with the allocator of MMTk objects in VMKit
+  F = M.getFunction("vmkitgcmalloc");
   Function* Ma = M.getFunction("AllocateMagicArray");
 
   Function* NewFunction = 

Modified: vmkit/trunk/mmtk/magic/LowerMagic.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerMagic.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/mmtk/magic/LowerMagic.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerMagic.cpp Thu Apr 25 12:02:08 2013
@@ -88,7 +88,7 @@ static const char* AddressLoadAddressAtO
 static const char* AddressLoadWordMethod;
 static const char* AddressLoadWordAtOffsetMethod;
 static const char* AddressStoreObjectReferenceMethod;
-//static const char* AddressStoreObjectReferenceAtOffsetMethod;
+static const char* AddressStoreObjectReferenceAtOffsetMethod;
 static const char* AddressStoreAddressMethod;
 static const char* AddressStoreAddressAtOffsetMethod;
 //static const char* AddressStoreFloatMethod;
@@ -243,6 +243,7 @@ static void initialiseFunctions(Module*
     AddressZeroMethod = "JnJVM_org_vmmagic_unboxed_Address_zero__";
     AddressMaxMethod = "JnJVM_org_vmmagic_unboxed_Address_max__";
     AddressStoreObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_ObjectReference_2";
+    AddressStoreObjectReferenceAtOffsetMethod = "JnJVM_org_vmmagic_unboxed_Address_store__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Offset_2";
     AddressLoadObjectReferenceMethod = "JnJVM_org_vmmagic_unboxed_Address_loadObjectReference__";
     AddressLoadAddressMethod = "JnJVM_org_vmmagic_unboxed_Address_loadAddress__";
     AddressLoadWordMethod = "JnJVM_org_vmmagic_unboxed_Address_loadWord__";
@@ -672,7 +673,8 @@ bool LowerMagic::runOnFunction(Function&
             } else if (!strcmp(FCur->getName().data(), AddressStoreWordAtOffsetMethod) ||
                        !strcmp(FCur->getName().data(), AddressStoreAddressAtOffsetMethod) ||
                        !strcmp(FCur->getName().data(), AddressStoreByteAtOffsetMethod) ||
-                       !strcmp(FCur->getName().data(), AddressStoreShortAtOffsetMethod)) {
+                       !strcmp(FCur->getName().data(), AddressStoreShortAtOffsetMethod) ||
+                       !strcmp(FCur->getName().data(), AddressStoreObjectReferenceAtOffsetMethod)) {
               Value* Ptr = Call.getArgument(0);
               Value* Val = Call.getArgument(1);
               Value* Offset = Call.getArgument(2);

Modified: vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp?rev=180366&r1=180365&r2=180366&view=diff
==============================================================================
--- vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-alloc/Selected.cpp Thu Apr 25 12:02:08 2013
@@ -60,9 +60,27 @@ extern "C" void* JnJVM_org_j3_bindings_B
 extern "C" void* JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(
 		void* object, void* type, int sz) ALWAYS_INLINE;
 
-extern "C" void* JnJVM_org_j3_bindings_Bindings_gcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(
+extern "C" void* JnJVM_org_j3_bindings_Bindings_vmkitgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(
     int sz, void* VT) ALWAYS_INLINE;
 
+extern "C" void* JnJVM_org_j3_bindings_Bindings_VTgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(
+    int sz, void* VT) ALWAYS_INLINE;
+
+extern "C" void addFinalizationCandidate(gc* obj) ALWAYS_INLINE;
+
+/**************************************
+ * Sample of code using pre/post alloc. It is slower but you can have
+ * a better control of objects allocation.
+ *
+extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) {
+  gc* res = 0;
+  llvm_gcroot(res, 0);
+	sz += gcHeader::hiddenHeaderSize();
+	res = (gc*) prealloc(sz);
+	postalloc(res, type, sz);
+	return res;
+}
+*/
 extern "C" void* prealloc(uint32_t size) {
 	gc* res = 0;
   gcHeader* head = 0;
@@ -78,44 +96,51 @@ extern "C" void postalloc(gc* obj, void*
 	JnJVM_org_j3_bindings_Bindings_postalloc__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_ObjectReference_2I(obj, type, size);
 }
 
-/**************************************
- * Sample of code using pre/post alloc. It is slower but you can have
- * a better control of objects allocation.
- *
-extern "C" void* gcmalloc(uint32_t sz, void* type) {
+extern "C" void* vmkitgcmalloc(uint32_t sz, void* type) {
   gc* res = 0;
   llvm_gcroot(res, 0);
 	sz += gcHeader::hiddenHeaderSize();
-	res = (gc*) prealloc(sz);
-	postalloc(res, type, sz);
+	sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
+	res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_vmkitgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, type))->toReference();
 	return res;
 }
-*/
 
-extern "C" void* gcmalloc(uint32_t sz, void* type) {
+extern "C" void* vmkitgcmallocUnresolved(uint32_t sz, void* type) {
+  gc* res = 0;
+  llvm_gcroot(res, 0);
+  res = (gc*)vmkitgcmalloc(sz, type);
+	addFinalizationCandidate(res);
+  return res;
+}
+
+/******************************************************************************
+ * Optimized gcmalloc for VT based object layout.                             *
+ *****************************************************************************/
+
+extern "C" void* VTgcmalloc(uint32_t sz, VirtualTable* VT) {
   gc* res = 0;
   llvm_gcroot(res, 0);
 	sz += gcHeader::hiddenHeaderSize();
-	res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_gcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, type))->toReference();
+	sz = llvm::RoundUpToAlignment(sz, sizeof(void*));
+	res = ((gcHeader*)JnJVM_org_j3_bindings_Bindings_VTgcmalloc__ILorg_vmmagic_unboxed_ObjectReference_2(sz, VT))->toReference();
 	return res;
 }
 
-extern "C" void* gcmallocUnresolved(uint32_t sz, void* type) {
+extern "C" void* VTgcmallocUnresolved(uint32_t sz, VirtualTable* VT) {
   gc* res = 0;
   llvm_gcroot(res, 0);
-  res = (gc*)gcmalloc(sz, type);
-	vmkit::Thread::get()->MyVM->addFinalizationCandidate(res);
+  res = (gc*)VTgcmalloc(sz, VT);
+  if (VT->hasDestructor()) addFinalizationCandidate(res);
   return res;
 }
 
-extern "C" void addFinalizationCandidate(gc* obj) __attribute__((always_inline));
+/*****************************************************************************/
 
 extern "C" void addFinalizationCandidate(gc* obj) {
   llvm_gcroot(obj, 0);
   vmkit::Thread::get()->MyVM->addFinalizationCandidate(obj);
 }
 
-
 extern "C" void arrayWriteBarrier(void* ref, void** ptr, void* value) {
   JnJVM_org_j3_bindings_Bindings_arrayWriteBarrier__Lorg_vmmagic_unboxed_ObjectReference_2Lorg_vmmagic_unboxed_Address_2Lorg_vmmagic_unboxed_ObjectReference_2(
       (gc*)ref, (gc**)ptr, (gc*)value);





More information about the vmkit-commits mailing list