[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