[vmkit-commits] [vmkit] r89349 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp lib/JnJVM/Compiler/JavaJIT.cpp lib/JnJVM/Compiler/JavaJITCompiler.cpp mmtk/magic/LowerJavaRT.cpp mmtk/magic/LowerMagic.cpp mmtk/mmtk-fake/Selected.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Thu Nov 19 06:18:35 PST 2009


Author: geoffray
Date: Thu Nov 19 08:18:35 2009
New Revision: 89349

URL: http://llvm.org/viewvc/llvm-project?rev=89349&view=rev
Log:
Handle magic arrays in MMTk.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
    vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
    vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
    vmkit/trunk/mmtk/magic/LowerMagic.cpp
    vmkit/trunk/mmtk/mmtk-fake/Selected.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Thu Nov 19 08:18:35 2009
@@ -444,7 +444,7 @@
   static LLVMAssessorInfo& getTypedefInfo(const Typedef* type);
   
 
-  virtual llvm::Constant* getFinalObject(JavaObject* obj) = 0;
+  virtual llvm::Constant* getFinalObject(JavaObject* obj, CommonClass* cl) = 0;
   virtual JavaObject* getFinalObject(llvm::Value* C) = 0;
   virtual llvm::Constant* getNativeClass(CommonClass* cl) = 0;
   virtual llvm::Constant* getJavaClass(CommonClass* cl) = 0;
@@ -550,7 +550,7 @@
   
   virtual void* materializeFunction(JavaMethod* meth);
   
-  virtual llvm::Constant* getFinalObject(JavaObject* obj);
+  virtual llvm::Constant* getFinalObject(JavaObject* obj, CommonClass* cl);
   virtual JavaObject* getFinalObject(llvm::Value* C);
   virtual llvm::Constant* getNativeClass(CommonClass* cl);
   virtual llvm::Constant* getJavaClass(CommonClass* cl);
@@ -616,8 +616,9 @@
                                    bool stat);
   
   virtual void makeVT(Class* cl);
-  
-  virtual llvm::Constant* getFinalObject(JavaObject* obj);
+ 
+  llvm::Constant* HandleMagic(JavaObject* obj, CommonClass* cl);
+  virtual llvm::Constant* getFinalObject(JavaObject* obj, CommonClass* cl);
   virtual JavaObject* getFinalObject(llvm::Value* C);
   virtual llvm::Constant* getNativeClass(CommonClass* cl);
   virtual llvm::Constant* getJavaClass(CommonClass* cl);

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Thu Nov 19 08:18:35 2009
@@ -256,9 +256,52 @@
   return 0;
 }
 
+Constant* JavaAOTCompiler::HandleMagic(JavaObject* obj, CommonClass* objCl) {
 
+  static const UTF8* AddressArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/AddressArray");
+  static const UTF8* WordArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/WordArray");
+  static const UTF8* ExtentArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/ExtentArray");
+  static const UTF8* ObjectReferenceArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/ObjectReferenceArray");
+  static const UTF8* OffsetArray = objCl->classLoader->asciizConstructUTF8("org/vmmagic/unboxed/OffsetArray");
+  const UTF8* name = objCl->name;
+
+  if (name->equals(AddressArray) || name->equals(WordArray) ||
+      name->equals(ExtentArray) || name->equals(ObjectReferenceArray) || 
+      name->equals(OffsetArray)) {
+    
+    intptr_t* realObj = (intptr_t*)obj;
+    intptr_t size = realObj[0];
 
-Constant* JavaAOTCompiler::getFinalObject(JavaObject* obj) {
+    const ArrayType* ATy = ArrayType::get(JnjvmModule::JavaObjectType,
+                                          size + 1);
+  
+    std::vector<Constant*> Vals;
+    for (sint32 i = 0; i < size + 1; ++i) {
+      Constant* CI = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),
+                                      uint64_t(realObj[i]));
+      CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
+      Vals.push_back(CI);
+    }
+
+    Constant* CA = ConstantArray::get(ATy, Vals);
+  
+    GlobalVariable* varGV = new GlobalVariable(*getLLVMModule(), CA->getType(),
+                                               false,
+                                               GlobalValue::InternalLinkage,
+                                               CA, "");
+ 
+    return ConstantExpr::getBitCast(varGV, JnjvmModule::JavaObjectType);
+
+  } else {
+    Constant* CI = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),
+                                    uint64_t(obj));
+    CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
+    return CI;
+  }
+}
+
+
+Constant* JavaAOTCompiler::getFinalObject(JavaObject* obj, CommonClass* objCl) {
   llvm::GlobalVariable* varGV = 0;
   final_object_iterator End = finalObjects.end();
   final_object_iterator I = finalObjects.find(obj);
@@ -320,9 +363,7 @@
       varGV->setInitializer(CreateConstantFromJavaObject(obj));
       return C;
     } else {
-      Constant* CI = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),
-                                      uint64_t(obj));
-      CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
+      Constant* CI = HandleMagic(obj, objCl);
       finalObjects.insert(std::make_pair(obj, CI));
       return CI;
     }
@@ -387,7 +428,9 @@
         } else {
           JavaObject* val = field.getObjectField(obj);
           if (val) {
-            Constant* CO = getFinalObject(val);
+            JnjvmClassLoader* JCL = cl->classLoader;
+            CommonClass* FieldCl = field.getSignature()->assocClass(JCL);
+            Constant* CO = getFinalObject(val, FieldCl);
             Elts.push_back(CO);
           } else {
             Elts.push_back(Constant::getNullValue(Ty));
@@ -657,7 +700,9 @@
         } else {
           JavaObject* val = field.getObjectField(obj);
           if (val) {
-            Constant* C = getFinalObject(val);
+            JnjvmClassLoader* JCL = cl->classLoader;
+            CommonClass* FieldCl = field.getSignature()->assocClass(JCL);
+            Constant* C = getFinalObject(val, FieldCl);
             TempElts.push_back(C);
           } else {
             const llvm::Type* Ty = JnjvmModule::JavaObjectType;
@@ -1298,7 +1343,8 @@
   std::vector<Constant*> Vals;
   for (sint32 i = 0; i < val->size; ++i) {
     if (val->elements[i]) {
-      Vals.push_back(getFinalObject(val->elements[i]));
+      Vals.push_back(getFinalObject(val->elements[i],
+                                val->getClass()->asArrayClass()->baseClass()));
     } else {
       Vals.push_back(Constant::getNullValue(JnjvmModule::JavaObjectType));
     }

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJIT.cpp Thu Nov 19 08:18:35 2009
@@ -2056,7 +2056,8 @@
       } else {
         if (TheCompiler->isStaticCompiling()) {
           JavaObject* val = field->getObjectField(Obj);
-          Value* V = TheCompiler->getFinalObject(val);
+          JnjvmClassLoader* JCL = field->classDef->classLoader;
+          Value* V = TheCompiler->getFinalObject(val, sign->assocClass(JCL));
           CommonClass* cl = mvm::Collector::begOf(val) ? val->getClass() : NULL;
           push(V, false, cl);
         } else {

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaJITCompiler.cpp Thu Nov 19 08:18:35 2009
@@ -146,7 +146,7 @@
   return 0;
 }
 
-Constant* JavaJITCompiler::getFinalObject(JavaObject* obj) {
+Constant* JavaJITCompiler::getFinalObject(JavaObject* obj, CommonClass* cl) {
   Constant* CI = ConstantInt::get(Type::getInt64Ty(getGlobalContext()),
                                   uint64(obj));
   return ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);

Modified: vmkit/trunk/mmtk/magic/LowerJavaRT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerJavaRT.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/mmtk/magic/LowerJavaRT.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerJavaRT.cpp Thu Nov 19 08:18:35 2009
@@ -78,6 +78,7 @@
  
   // Replace gcmalloc with the allocator of MMTk objects in VMKit
   Function* F = M.getFunction("gcmalloc");
+  Function* Ma = M.getFunction("AllocateMagicArray");
 
   Function* NewFunction = 
     Function::Create(F->getFunctionType(), GlobalValue::ExternalLinkage,
@@ -85,6 +86,9 @@
 
   F->replaceAllUsesWith(NewFunction);
   F->eraseFromParent();
+  
+  Ma->replaceAllUsesWith(NewFunction);
+  Ma->eraseFromParent();
 
   // Declare two global variables for allocating a MutatorContext object
   // and a CollectorContext object.

Modified: vmkit/trunk/mmtk/magic/LowerMagic.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/magic/LowerMagic.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/mmtk/magic/LowerMagic.cpp (original)
+++ vmkit/trunk/mmtk/magic/LowerMagic.cpp Thu Nov 19 08:18:35 2009
@@ -16,8 +16,7 @@
 #include "llvm/Support/CallSite.h"
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/Debug.h"
-
-#include <iostream>
+#include "llvm/Support/raw_ostream.h"
 
 using namespace llvm;
 
@@ -203,6 +202,38 @@
 static Function* CASPtr;
 static Function* CASInt;
 
+static const char* AddressArrayClass = "JnJVM_org_vmmagic_unboxed_AddressArray_";
+static const char* ExtentArrayClass = "JnJVM_org_vmmagic_unboxed_ExtentArray_";
+static const char* ObjectReferenceArrayClass = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_";
+static const char* OffsetArrayClass = "JnJVM_org_vmmagic_unboxed_OffsetArray_";
+static const char* WordArrayClass = "JnJVM_org_vmmagic_unboxed_WordArray_";
+
+static const char* AddressArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_create__I";
+static const char* ExtentArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_create__I";
+static const char* ObjectReferenceArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_create__I";
+static const char* OffsetArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_create__I";
+static const char* WordArrayCreateMethod = "JnJVM_org_vmmagic_unboxed_WordArray_create__I";
+
+static const char* AddressArrayGetMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_get__I";
+static const char* ExtentArrayGetMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_get__I";
+static const char* ObjectReferenceArrayGetMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_get__I";
+static const char* OffsetArrayGetMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_get__I";
+static const char* WordArrayGetMethod = "JnJVM_org_vmmagic_unboxed_WordArray_get__I";
+
+static const char* AddressArraySetMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_set__ILorg_vmmagic_unboxed_Address_2";
+static const char* ExtentArraySetMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_set__ILorg_vmmagic_unboxed_Extent_2";
+static const char* ObjectReferenceArraySetMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_set__ILorg_vmmagic_unboxed_ObjectReference_2";
+static const char* OffsetArraySetMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_set__ILorg_vmmagic_unboxed_Offset_2";
+static const char* WordArraySetMethod = "JnJVM_org_vmmagic_unboxed_WordArray_set__ILorg_vmmagic_unboxed_Word_2";
+
+static const char* AddressArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_AddressArray_lenght__";
+static const char* ExtentArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_ExtentArray_length__";
+static const char* ObjectReferenceArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_ObjectReferenceArray_length__";
+static const char* OffsetArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_OffsetArray_length__";
+static const char* WordArrayLengthMethod = "JnJVM_org_vmmagic_unboxed_WordArray_length__";
+
+
+
 static void initialiseFunctions(Module* M) {
   if (!AddressZeroMethod) {
     AddressZeroMethod = "JnJVM_org_vmmagic_unboxed_Address_zero__";
@@ -321,7 +352,6 @@
   }
 }
 
-#include <iostream>
 
 static bool removePotentialNullCheck(BasicBlock* Cur, Value* Obj) {
   BasicBlock* BB = Cur->getUniquePredecessor();
@@ -353,8 +383,29 @@
   const llvm::Type* pointerSizeType = 
     globalModule->getPointerSize() == llvm::Module::Pointer32 ?
       Type::getInt32Ty(Context) : Type::getInt64Ty(Context);
-  
+ 
+   Constant* constantPtrLogSize = 
+    ConstantInt::get(Type::getInt32Ty(Context), sizeof(void*) == 8 ? 3 : 2);
+
+  const llvm::Type* ptrType = PointerType::getUnqual(Type::getInt8Ty(Context));
+  const llvm::Type* ptrSizeType = PointerType::getUnqual(pointerSizeType);
+
+
   initialiseFunctions(globalModule);
+
+  Function* MMalloc = globalModule->getFunction("AllocateMagicArray");
+  if (!MMalloc) {
+    std::vector<const Type*>FuncTyArgs;
+    FuncTyArgs.push_back(Type::getInt32Ty(Context));
+    FuncTyArgs.push_back(ptrType);
+    FunctionType* FuncTy = FunctionType::get(ptrType, FuncTyArgs, false);
+
+
+    MMalloc = Function::Create(FuncTy, GlobalValue::ExternalLinkage, "AllocateMagicArray",
+                               globalModule);
+  }
+
+
   if (!CASPtr || CASPtr->getParent() != globalModule) {
     if (pointerSizeType == Type::getInt32Ty(Context)) {
       CASPtr = globalModule->getFunction("llvm.atomic.cmp.swap.i32.p0i32");
@@ -1116,6 +1167,85 @@
               fprintf(stderr, "Implement me %s\n", name);
               abort();
             }
+          } else if (
+              (len > strlen(AddressArrayClass) && 
+               !memcmp(AddressArrayClass, name, strlen(AddressArrayClass))) ||
+              (len > strlen(OffsetArrayClass) && 
+               !memcmp(OffsetArrayClass, name, strlen(OffsetArrayClass))) ||
+              (len > strlen(WordArrayClass) && 
+               !memcmp(WordArrayClass, name, strlen(WordArrayClass))) ||
+              (len > strlen(ObjectReferenceArrayClass) && 
+               !memcmp(ObjectReferenceArrayClass, name, strlen(ObjectReferenceArrayClass))) ||
+              (len > strlen(ExtentArrayClass) && 
+               !memcmp(ExtentArrayClass, name, strlen(ExtentArrayClass)))) {
+            Changed = true;
+            
+            if (!strcmp(FCur->getName().data(), AddressArrayCreateMethod) ||
+                !strcmp(FCur->getName().data(), OffsetArrayCreateMethod) ||
+                !strcmp(FCur->getName().data(), WordArrayCreateMethod) ||
+                !strcmp(FCur->getName().data(), ExtentArrayCreateMethod) ||
+                !strcmp(FCur->getName().data(), ObjectReferenceArrayCreateMethod)) {
+              Value* Val = Call.getArgument(0);
+              ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1);
+              Value* Length = BinaryOperator::CreateAdd(Val, One, "", CI);
+              Length = BinaryOperator::CreateShl(Length, constantPtrLogSize, "", CI);
+              Val = new IntToPtrInst(Val, ptrType, "", CI);
+              Value* args[2] = { Length, Val };
+              Value* res = CallInst::Create(MMalloc, args, args + 2, "", CI);
+              res = new BitCastInst(res, FCur->getReturnType(), "", CI);
+              CI->replaceAllUsesWith(res);
+              CI->eraseFromParent();
+
+            } else if (!strcmp(FCur->getName().data(), AddressArrayGetMethod) ||
+                !strcmp(FCur->getName().data(), OffsetArrayGetMethod) ||
+                !strcmp(FCur->getName().data(), WordArrayGetMethod) ||
+                !strcmp(FCur->getName().data(), ExtentArrayGetMethod) ||
+                !strcmp(FCur->getName().data(), ObjectReferenceArrayGetMethod)) {
+              
+              Value* Array = Call.getArgument(0);
+              Value* Index = Call.getArgument(1);
+              ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1);
+              Index = BinaryOperator::CreateAdd(Index, One, "", CI);
+              Array = new BitCastInst(Array, ptrSizeType, "", CI);
+              Value* res = GetElementPtrInst::Create(Array, Index, "", CI);
+              res = new LoadInst(res, "", CI);
+              res = new IntToPtrInst(res, FCur->getReturnType(), "", CI);
+              CI->replaceAllUsesWith(res);
+              CI->eraseFromParent(); 
+            
+            } else if (!strcmp(FCur->getName().data(), AddressArraySetMethod) ||
+                !strcmp(FCur->getName().data(), OffsetArraySetMethod) ||
+                !strcmp(FCur->getName().data(), WordArraySetMethod) ||
+                !strcmp(FCur->getName().data(), ExtentArraySetMethod) ||
+                !strcmp(FCur->getName().data(), ObjectReferenceArraySetMethod)) {
+              
+              Value* Array = Call.getArgument(0);
+              Value* Index = Call.getArgument(1);
+              Value* Element = Call.getArgument(2);
+              ConstantInt* One = ConstantInt::get(Type::getInt32Ty(Context), (uint64_t)1);
+              
+              Index = BinaryOperator::CreateAdd(Index, One, "", CI);
+              Array = new BitCastInst(Array, ptrSizeType, "", CI);
+              Value* ptr = GetElementPtrInst::Create(Array, Index, "", CI);
+              Element = new PtrToIntInst(Element, pointerSizeType, "", CI);
+              new StoreInst(Element, ptr, CI);
+              CI->eraseFromParent(); 
+            
+            } else if (!strcmp(FCur->getName().data(), AddressArrayLengthMethod) ||
+                !strcmp(FCur->getName().data(), OffsetArrayLengthMethod) ||
+                !strcmp(FCur->getName().data(), WordArrayLengthMethod) ||
+                !strcmp(FCur->getName().data(), ExtentArrayLengthMethod) ||
+                !strcmp(FCur->getName().data(), ObjectReferenceArrayLengthMethod)) {
+              
+              Value* Array = Call.getArgument(0);
+              Array = new BitCastInst(Array, ptrSizeType, "", CI);
+              Value* Length = new LoadInst(Array, "", CI);
+              if (Length->getType() != Type::getInt32Ty(Context)) {
+                Length = new TruncInst(Length, Type::getInt32Ty(Context), "", CI);
+              }
+              CI->replaceAllUsesWith(Length);
+              CI->eraseFromParent(); 
+            }
           }
         }
       }

Modified: vmkit/trunk/mmtk/mmtk-fake/Selected.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/mmtk/mmtk-fake/Selected.cpp?rev=89349&r1=89348&r2=89349&view=diff

==============================================================================
--- vmkit/trunk/mmtk/mmtk-fake/Selected.cpp (original)
+++ vmkit/trunk/mmtk/mmtk-fake/Selected.cpp Thu Nov 19 08:18:35 2009
@@ -42,3 +42,9 @@
   mvm::Thread::get()->MyVM->addFinalizationCandidate(obj);
 }
 
+extern "C" void* AllocateMagicArray(int32_t sz, void* length) {
+  gc* res = (gc*)malloc(sz);
+  memset(res, 0, sz);
+  ((void**)res)[0] = length;
+  return res;
+}





More information about the vmkit-commits mailing list