[vmkit-commits] [vmkit] r84332 - in /vmkit/trunk/lib/N3: Mono/Mono.cpp Mono/MonoMSCorlib.cpp Mono/MonoString.cpp PNetLib/PNetLib.cpp PNetLib/PNetMSCorlib.cpp PNetLib/PNetString.cpp VMCore/Assembly.cpp VMCore/CLIJitMeta.cpp VMCore/CLIRuntimeJIT.cpp VMCore/N3.cpp VMCore/Opcodes.cpp VMCore/VMClass.cpp VMCore/VMClass.h VMCore/VirtualTables.cpp
Gael Thomas
gael.thomas at lip6.fr
Sat Oct 17 06:54:20 PDT 2009
Author: gthomas
Date: Sat Oct 17 08:54:19 2009
New Revision: 84332
URL: http://llvm.org/viewvc/llvm-project?rev=84332&view=rev
Log:
All objects of VMCore are now marked with gcroot
Modified:
vmkit/trunk/lib/N3/Mono/Mono.cpp
vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
vmkit/trunk/lib/N3/Mono/MonoString.cpp
vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
vmkit/trunk/lib/N3/PNetLib/PNetString.cpp
vmkit/trunk/lib/N3/VMCore/Assembly.cpp
vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp
vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
vmkit/trunk/lib/N3/VMCore/N3.cpp
vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.cpp
vmkit/trunk/lib/N3/VMCore/VMClass.h
vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/N3/Mono/Mono.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/Mono.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/Mono.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/Mono.cpp Sat Oct 17 08:54:19 2009
@@ -112,7 +112,9 @@
if (want_name && *int_code_page == -1) {
N3 *vm = (N3*)VMThread::get()->getVM();
- return (MonoString*)(vm->arrayToString(vm->asciizToArray(cset)));
+ declare_gcroot(ArrayChar*, array_res) = vm->asciizToArray(cset);
+ declare_gcroot(MonoString*, res) = (MonoString*)(vm->arrayToString(array_res));
+ return res;
} else
return NULL;
}
@@ -160,10 +162,13 @@
{
N3 *vm = (N3*)VMThread::get()->getVM();
#if defined (PLATFORM_WIN32)
- return (MonoString*)(vm->arrayToString(vm->asciizToArray("\r\n")));
+ declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\r\n");
#else
- return (MonoString*)(vm->arrayToString(vm->asciizToArray("\n")));
+ declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\n");
#endif
+
+ declare_gcroot(MonoString*, res) = (MonoString*)vm->arrayToString(array);
+ return res;
}
extern "C" void
@@ -262,7 +267,7 @@
extern "C" VMObject* System_Object_MemberwiseClone(VMObject* obj) {
uint64 size = obj->objectSize();
- VMObject* res = ((VMClass*)obj->classOf)->doNew();
+ declare_gcroot(VMObject*, res) = ((VMClass*)obj->classOf)->doNew();
memcpy(res, obj, size);
res->lockObj = 0;
return res;
@@ -282,7 +287,7 @@
extern "C" void
System_String__ctor(MonoString* str, ArrayChar* array, sint32 startIndex, sint32 count) {
N3* vm = VMThread::get()->getVM();
- const ArrayChar* value = vm->bufToArray(&(array->elements[startIndex]), count);
+ declare_gcroot(const ArrayChar*, value) = vm->bufToArray(&(array->elements[startIndex]), count);
str->length = count;
str->startChar = array->elements[startIndex];
str->value = value;
@@ -334,14 +339,15 @@
}
N3* vm = (N3*)VMThread::get()->getVM();
- const ArrayChar* array = vm->bufToArray(dest, length);
- return (MonoString*)vm->arrayToString(array);
+ declare_gcroot(const ArrayChar*, array) = vm->bufToArray(dest, length);
+ declare_gcroot(MonoString*, res) = (MonoString*)vm->arrayToString(array);
+ return res;
}
extern "C" MonoString *
System_String_InternalAllocateStr (sint32 length)
{
- MonoString* str = (MonoString*)(MSCorlib::pString->doNew());
+ declare_gcroot(MonoString*, str) = (MonoString*)MSCorlib::pString->doNew();
str->length = length;
return str;
}
Modified: vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoMSCorlib.cpp Sat Oct 17 08:54:19 2009
@@ -150,7 +150,7 @@
VMObject* VMCommonClass::getClassDelegatee() {
declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
if (!delegatee) {
- ooo_delegatee = delegatee = (*MSCorlib::clrType)();
+ ooo_delegatee = delegatee = MSCorlib::clrType->doNew();
MSCorlib::typeClrType->setIntPtr(delegatee, (int*)this);
}
return delegatee;
@@ -169,6 +169,6 @@
vm->asciizToUTF8("Thread"),
vm->asciizToUTF8("System.Threading"),
true, true, true, true);
- declare_gcroot(VMObject*, appThread) = (*cl)();
+ declare_gcroot(VMObject*, appThread) = cl->doNew();
VMThread::get()->ooo_appThread = appThread;
}
Modified: vmkit/trunk/lib/N3/Mono/MonoString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/Mono/MonoString.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/Mono/MonoString.cpp (original)
+++ vmkit/trunk/lib/N3/Mono/MonoString.cpp Sat Oct 17 08:54:19 2009
@@ -26,7 +26,7 @@
CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
- MonoString* obj = (MonoString*)(*MSCorlib::pString)();
+ declare_gcroot(MonoString*, obj) = (MonoString*)MSCorlib::pString->doNew();
obj->length = array->size;
if (array->size == 0) {
obj->startChar = 0;
@@ -38,7 +38,8 @@
}
const ArrayChar* CLIString::strToArray(N3* vm) const {
- return ((MonoString *)this)->value;
+ declare_gcroot(const ArrayChar*, res) = ((MonoString *)this)->value;
+ return res;
}
GlobalVariable* CLIString::llvmVar() {
Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Sat Oct 17 08:54:19 2009
@@ -164,14 +164,16 @@
extern "C" VMObject* System_Globalization_CultureInfo_InternalCultureName() {
char* val = ILGetCultureName();
N3* vm = (N3*)(VMThread::get()->getVM());
+ declare_gcroot(ArrayChar*, array) = 0;
+
if (val) {
- VMObject* ret = vm->arrayToString(vm->asciizToArray(val));
+ array = vm->asciizToArray(val);
free(val);
- return ret;
} else {
- VMObject* ret = vm->arrayToString(vm->asciizToArray("iv"));
- return ret;
+ array = vm->asciizToArray("iv");
}
+ declare_gcroot(VMObject*, res) = vm->arrayToString(array);
+ return res;
}
static const ArrayChar* newBuilder(N3* vm, PNetString* value, uint32 length) {
@@ -191,19 +193,22 @@
}
}
- return vm->bufToArray(buf, strLength);
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, strLength);
+ return array_res;
}
extern "C" VMObject* System_String_NewBuilder(PNetString* value,
uint32 length) {
N3* vm = (N3*)(VMThread::get()->getVM());
- PNetString* str = (PNetString*)vm->arrayToString(newBuilder(vm, value, length));
+ declare_gcroot(PNetString*, str) = (PNetString*)vm->arrayToString(newBuilder(vm, value, length));
return str;
}
extern "C" VMObject* Platform_SysCharInfo_GetNewLine() {
N3* vm = (N3*)(VMThread::get()->getVM());
- return vm->arrayToString(vm->asciizToArray("\n"));
+ declare_gcroot(ArrayChar*, array) = vm->asciizToArray("\n");
+ declare_gcroot(VMObject*, res) = vm->arrayToString(array);
+ return res;
}
extern "C" void System_String_CopyToChecked(PNetString* str, sint32 sstart,
@@ -258,14 +263,14 @@
}
extern "C" PNetString* System_String_NewString(uint32 size) {
- PNetString* str = (PNetString*)(MSCorlib::pString->doNew());
+ declare_gcroot(PNetString*, str) = (PNetString*)MSCorlib::pString->doNew();
str->length = size;
return str;
}
extern "C" void System_String_Copy_3(PNetString* dest, sint32 pos,
PNetString* src) {
- ArrayChar* arr = (ArrayChar*)MSCorlib::arrayChar->doNew(pos + src->value->size);
+ declare_gcroot(ArrayChar*, arr) = (ArrayChar*)MSCorlib::arrayChar->doNew(pos + src->value->size);
for (sint32 i = 0; i < pos; ++i) {
arr->elements[i] = dest->value->elements[i];
@@ -303,7 +308,8 @@
else
dest->length = top;
- dest->value = VMThread::get()->getVM()->bufToArray(buf, dest->length);
+ declare_gcroot(ArrayChar*, array) = VMThread::get()->getVM()->bufToArray(buf, dest->length);
+ dest->value = array;
}
// printf("---> %s\n", mvm::PrintBuffer(VMThread::get()->getVM()->arrayToUTF8(dest->value)).cString());
}
@@ -379,7 +385,8 @@
}
buf[index] = value;
- PNetString* str = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+ declare_gcroot(PNetString*, str) = (PNetString*)vm->arrayToString(array_res);
obj->buildString = str;
return obj;
@@ -411,7 +418,8 @@
(buildLength - index) * sizeof(uint16));
}
- PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+ declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
obj->buildString = val;
return obj;
@@ -429,7 +437,8 @@
memcpy(buf, array->elements, length * sizeof(uint16));
buf[length] = value;
- PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length + 1));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length + 1);
+ declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
obj->buildString = val;
return obj;
}
@@ -450,7 +459,8 @@
memcpy(buf, buildArray->elements, buildLength * sizeof(uint16));
memcpy(&(buf[buildLength]), strArray->elements, strLength * sizeof(uint16));
- PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, length));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, length);
+ declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
obj->buildString = val;
return obj;
}
@@ -530,7 +540,8 @@
memcpy(buf, a1->elements, len1 * sizeof(uint16));
memcpy(&(buf[len1]), a2->elements, len2 * sizeof(uint16));
- PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, len1 + len2));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, len1 + len2);
+ declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
return val;
}
@@ -549,7 +560,8 @@
memcpy(&(buf[len1]), a2->elements, len2 * sizeof(uint16));
memcpy(&(buf[len1 + len2]), a3->elements, len3 * sizeof(uint16));
- PNetString* val = (PNetString*)vm->arrayToString(vm->bufToArray(buf, len1 + len2 + len3));
+ declare_gcroot(ArrayChar*, array_res) = vm->bufToArray(buf, len1 + len2 + len3);
+ declare_gcroot(PNetString*, val) = (PNetString*)vm->arrayToString(array_res);
return val;
}
@@ -578,13 +590,13 @@
memcpy(&(buf[j]), &(array->elements[index + length]), (strLength - (index + length)) * sizeof(uint16));
}
- const ArrayChar* res = VMThread::get()->getVM()->bufToArray(buf, j);
+ declare_gcroot(const ArrayChar*, res) = VMThread::get()->getVM()->bufToArray(buf, j);
str->value = res;
str->length = j;
}
extern "C" void System_String__ctor_3(PNetString* str, uint16 ch, sint32 count) {
- ArrayChar* array = (ArrayChar*)MSCorlib::arrayChar->doNew(count);
+ declare_gcroot(ArrayChar*, array) = (ArrayChar*)MSCorlib::arrayChar->doNew(count);
for (sint32 i = 0; i < count; ++i) {
array->elements[i] = ch;
}
@@ -778,12 +790,12 @@
llvm::GenericValue gv;
try{
- gv = (*meth)(gvargs);
+ gv = meth->compileToNative()->invokeGeneric(gvargs);
}catch(...) {
assert(0);
}
- VMObject* res = 0;
+ declare_gcroot(VMObject*, res) = 0;
VMCommonClass* retType = meth->parameters[0];
#define CONSTRUCT_RES(name, type, gv_extractor) \
@@ -793,7 +805,7 @@
}
if (retType == MSCorlib::pVoid) {
- res = (*MSCorlib::pVoid)();
+ res = MSCorlib::pVoid->doNew();
} ON_PRIMITIVES(CONSTRUCT_RES, _F_NTE) else {
if (retType->super == MSCorlib::pValue || retType->super == MSCorlib::pEnum)
VMThread::get()->getVM()->error("implement me");
@@ -839,8 +851,8 @@
length = reader->readU4();
if (length > (sectionLen - 4)) return 0;
- VMObject* res = (*MSCorlib::resourceStreamType)();
- (*MSCorlib::ctorResourceStreamType)(res, ass, (uint64)start, (uint64)length);
+ declare_gcroot(VMObject*, res) = MSCorlib::resourceStreamType->doNew();
+ MSCorlib::ctorResourceStreamType->compileToNative()->invokeVoid(res, ass, (uint64)start, (uint64)length);
return res;
}
@@ -890,8 +902,9 @@
memcpy(buf, array->elements, length * sizeof(uint16));
ILUnicodeStringToLower((void*)buf, (void*)array->elements, length);
- const ArrayChar* res = vm->bufToArray(buf, length);
- return ((N3*)vm)->arrayToString(res);
+ declare_gcroot(const ArrayChar*, res) = vm->bufToArray(buf, length);
+ declare_gcroot(VMObject*, res_str) = vm->arrayToString(res);
+ return res_str;
}
extern "C" VMObject* System_String_Replace(PNetString* str, uint16 c1, uint16 c2) {
@@ -906,8 +919,9 @@
}
N3* vm = (N3*)VMThread::get()->getVM();
- const ArrayChar* res = vm->bufToArray(buf, length);
- return vm->arrayToString(res);
+ declare_gcroot(const ArrayChar*, res) = vm->bufToArray(buf, length);
+ declare_gcroot(VMObject*, res_str) = vm->arrayToString(res);
+ return res_str;
}
extern "C" uint32 System_Reflection_ClrResourceStream_ResourceRead(Assembly* assembly, uint64 position, ArrayUInt8* buffer, uint32 offset, uint32 count) {
@@ -966,7 +980,7 @@
}
N3* vm = VMThread::get()->getVM();
- const ArrayChar* val = vm->bufToArray(buf, length);
+ declare_gcroot(const ArrayChar*, val) = vm->bufToArray(buf, length);
str->value = val;
str->length = length;
}
Modified: vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetMSCorlib.cpp Sat Oct 17 08:54:19 2009
@@ -132,20 +132,26 @@
}
VMObject* Property::getPropertyDelegatee() {
+ declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
if (!delegatee) {
- delegatee = (*MSCorlib::propertyType)();
- (*MSCorlib::ctorPropertyType)(delegatee);
+ ooo_delegatee = delegatee = MSCorlib::propertyType->doNew();
+ MSCorlib::ctorPropertyType->compileToNative()->invokeVoid(delegatee);
MSCorlib::propertyPropertyType->setIntPtr(delegatee, (int*)this);
}
+
return delegatee;
}
VMObject* VMMethod::getMethodDelegatee() {
+ declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
+
if (!delegatee) {
- delegatee = (*MSCorlib::methodType)();
- (*MSCorlib::ctorMethodType)(delegatee);
+ ooo_delegatee = delegatee = MSCorlib::methodType->doNew();
+ MSCorlib::ctorMethodType->compileToNative()->invokeVoid(delegatee);
MSCorlib::methodMethodType->setIntPtr(delegatee, (int*)this);
}
+
return delegatee;
}
@@ -153,10 +159,11 @@
declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
if (!delegatee) {
- ooo_delegatee = delegatee = (*MSCorlib::clrType)();
- (*MSCorlib::ctorClrType)(delegatee);
+ ooo_delegatee = delegatee = MSCorlib::clrType->doNew();
+ MSCorlib::ctorClrType->compileToNative()->invokeVoid(delegatee);
MSCorlib::typeClrType->setIntPtr(delegatee, (int*)this);
}
+
return delegatee;
}
@@ -164,10 +171,11 @@
declare_gcroot(VMObject*, delegatee) = ooo_delegatee;
if (!delegatee) {
- ooo_delegatee = delegatee = (*MSCorlib::assemblyReflection)();
- (*MSCorlib::ctorAssemblyReflection)(delegatee);
+ ooo_delegatee = delegatee = MSCorlib::assemblyReflection->doNew();
+ MSCorlib::ctorAssemblyReflection->compileToNative()->invokeVoid(delegatee);
MSCorlib::assemblyAssemblyReflection->setIntPtr(delegatee, (int*)this);
}
+
return delegatee;
}
@@ -176,15 +184,16 @@
vm->asciizToUTF8("Thread"),
vm->asciizToUTF8("System.Threading"),
true, true, true, true);
- declare_gcroot(VMObject*, appThread) = (*cl)();
+ declare_gcroot(VMObject*, appThread) = cl->doNew();
+
std::vector<VMCommonClass*> args;
args.push_back(MSCorlib::pVoid);
args.push_back(cl);
args.push_back(MSCorlib::pIntPtr);
- VMMethod* meth = cl->lookupMethod(vm->asciizToUTF8(".ctor"), args,
+ VMMethod* ctor = cl->lookupMethod(vm->asciizToUTF8(".ctor"), args,
false, false);
VMThread* myth = VMThread::get();
- (*meth)(appThread, myth);
+ ctor->compileToNative()->invokeVoid(appThread, myth);
myth->ooo_appThread = appThread;
}
Modified: vmkit/trunk/lib/N3/PNetLib/PNetString.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetString.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetString.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetString.cpp Sat Oct 17 08:54:19 2009
@@ -25,7 +25,7 @@
CLIString* CLIString::stringDup(const ArrayChar*& array, N3* vm) {
- PNetString* obj = (PNetString*)(*MSCorlib::pString)();
+ declare_gcroot(PNetString*, obj) = (PNetString*)MSCorlib::pString->doNew();
obj->capacity = array->size;
obj->length = array->size;
if (array->size == 0) {
@@ -38,7 +38,8 @@
}
const ArrayChar* CLIString::strToArray(N3* vm) const {
- return ((PNetString*)this)->value;
+ declare_gcroot(const ArrayChar*, res) = ((PNetString*)this)->value;
+ return res;
}
GlobalVariable* CLIString::llvmVar() {
Modified: vmkit/trunk/lib/N3/VMCore/Assembly.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Assembly.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sat Oct 17 08:54:19 2009
@@ -705,7 +705,8 @@
const ArrayChar* Assembly::readUTF16(N3* vm, uint32 len,
Reader* reader) {
- return readUTF16(vm, len, reader->bytes, reader->cursor);
+ declare_gcroot(const ArrayChar*, res) = readUTF16(vm, len, reader->bytes, reader->cursor);
+ return res;
}
const ArrayChar* Assembly::readUTF16(N3* vm, uint32 len,
@@ -718,7 +719,8 @@
buf[i] = cur;
++i;
}
- return vm->bufToArray(buf, realLen);
+ declare_gcroot(ArrayChar*, res) = vm->bufToArray(buf, realLen);
+ return res;
}
const UTF8* Assembly::readUTF8(N3* vm, uint32 len, Reader* reader) {
@@ -1289,7 +1291,7 @@
if (cl == cons->classDef) {
uint32 blobOffset = CLIHeader->blobStream->realOffset;
std::vector<llvm::GenericValue> args;
- VMObject* obj = (*cons->classDef)();
+ declare_gcroot(VMObject*, obj) = cons->classDef->doNew();
args.push_back(llvm::GenericValue(obj));
readCustomAttributes(blobOffset + attrArray[CONSTANT_CUSTOM_ATTRIBUTE_VALUE], args, cons);
@@ -1298,7 +1300,7 @@
}
}
- ArrayObject* res = (ArrayObject*)MSCorlib::arrayObject->doNew(vec.size());
+ declare_gcroot(ArrayObject*, res) = (ArrayObject*)MSCorlib::arrayObject->doNew(vec.size());
for (uint32 i = 0; i < vec.size(); ++i)
res->elements[i] = vec[i];
@@ -1897,7 +1899,8 @@
}
}
- return readUTF16((N3*)(VMThread::get()->getVM()), size, bytes, offset);
+ declare_gcroot(const ArrayChar*, res) = readUTF16((N3*)(VMThread::get()->getVM()), size, bytes, offset);
+ return res;
}
uint32 Assembly::getRVAFromField(uint32 token) {
Modified: vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJitMeta.cpp Sat Oct 17 08:54:19 2009
@@ -27,12 +27,6 @@
using namespace n3;
using namespace llvm;
-VMObject* VMClass::operator()() {
- if (status < ready)
- resolveType(true, true, NULL);
- return doNew();
-}
-
// TODO: MUST CHECK the type!
// if (llvm::isa<check>(signature->naturalType)) {
// if (signature->naturalType == Type::getFloatTy(getGlobalContext())) {
@@ -66,13 +60,13 @@
#undef IMPLEMENTS_VMFIELD_ASSESSORS
GenericValue VMMethod::invokeGeneric(std::vector<llvm::GenericValue>& args) {
- assert(code);
+ // at this step, we must not launch the gc because objects arguments are somewhere in the stack a copying collector
+ // can not know where they are
+ assert(code); // compiling a method can trigger a gc
return mvm::MvmModule::executionEngine->runFunction(methPtr, args);
}
GenericValue VMMethod::invokeGeneric(va_list ap) {
- assert(code);
-
Function* func = methPtr;
std::vector<GenericValue> args;
for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
@@ -111,6 +105,13 @@
return invokeGeneric(args);
}
+GenericValue VMMethod::invokeGeneric(...) {
+ va_list ap;
+ va_start(ap, this);
+ GenericValue res = invokeGeneric(ap);
+ va_end(ap);
+ return res;
+}
#define DEFINE_INVOKE(name, type, extractor) \
type VMMethod::invoke##name(...) { \
@@ -138,124 +139,124 @@
#undef DEFINE_INVOKE_VOID
-// mettre en param un Function *
-// materializeFunction avant
-GenericValue VMMethod::operator()(va_list ap) {
+// // mettre en param un Function *
+// // materializeFunction avant
+// GenericValue VMMethod::operator()(va_list ap) {
- if (classDef->status < ready)
- classDef->resolveType(true, true, NULL);
+// if (classDef->status < ready)
+// classDef->resolveType(true, true, NULL);
- Function* func = compiledPtr(NULL);
+// Function* func = compiledPtr(NULL);
- std::vector<GenericValue> args;
- for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
- i != e; ++i) {
- const Type* type = i->getType();
- if (type == Type::getInt8Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(8, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt16Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(16, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt32Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(32, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt64Ty(getGlobalContext())) {
- GenericValue gv1;
- gv1.IntVal = APInt(64, va_arg(ap, uint64));
- args.push_back(gv1);
- } else if (type == Type::getDoubleTy(getGlobalContext())) {
- GenericValue gv1;
- gv1.DoubleVal = va_arg(ap, double);
- args.push_back(gv1);
- } else if (type == Type::getFloatTy(getGlobalContext())) {
- GenericValue gv;
- gv.FloatVal = (float)(va_arg(ap, double));
- args.push_back(gv);
- } else {
- GenericValue gv(va_arg(ap, VMObject*));
- args.push_back(gv);
- }
- }
+// std::vector<GenericValue> args;
+// for (Function::arg_iterator i = func->arg_begin(), e = func->arg_end();
+// i != e; ++i) {
+// const Type* type = i->getType();
+// if (type == Type::getInt8Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(8, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt16Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(16, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt32Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(32, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt64Ty(getGlobalContext())) {
+// GenericValue gv1;
+// gv1.IntVal = APInt(64, va_arg(ap, uint64));
+// args.push_back(gv1);
+// } else if (type == Type::getDoubleTy(getGlobalContext())) {
+// GenericValue gv1;
+// gv1.DoubleVal = va_arg(ap, double);
+// args.push_back(gv1);
+// } else if (type == Type::getFloatTy(getGlobalContext())) {
+// GenericValue gv;
+// gv.FloatVal = (float)(va_arg(ap, double));
+// args.push_back(gv);
+// } else {
+// GenericValue gv(va_arg(ap, VMObject*));
+// args.push_back(gv);
+// }
+// }
- return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+// return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
-GenericValue VMMethod::operator()(VMObject* obj, va_list ap) {
+// GenericValue VMMethod::operator()(VMObject* obj, va_list ap) {
- if (classDef->status < ready)
- classDef->resolveType(true, true, NULL);
+// if (classDef->status < ready)
+// classDef->resolveType(true, true, NULL);
- Function* func = compiledPtr(NULL);
+// Function* func = compiledPtr(NULL);
- std::vector<GenericValue> args;
- GenericValue object(obj);
- args.push_back(object);
-
- for (Function::arg_iterator i = ++(func->arg_begin()), e = func->arg_end();
- i != e; ++i) {
- const Type* type = i->getType();
- if (type == Type::getInt8Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(8, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt16Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(16, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt32Ty(getGlobalContext())) {
- GenericValue gv;
- gv.IntVal = APInt(32, va_arg(ap, int));
- args.push_back(gv);
- } else if (type == Type::getInt64Ty(getGlobalContext())) {
- GenericValue gv1;
- gv1.IntVal = APInt(64, va_arg(ap, uint64));
- args.push_back(gv1);
- } else if (type == Type::getDoubleTy(getGlobalContext())) {
- GenericValue gv1;
- gv1.DoubleVal = va_arg(ap, double);
- args.push_back(gv1);
- } else if (type == Type::getFloatTy(getGlobalContext())) {
- GenericValue gv;
- gv.FloatVal = (float)(va_arg(ap, double));
- args.push_back(gv);
- } else {
- GenericValue gv(va_arg(ap, VMObject*));
- args.push_back(gv);
- }
- }
+// std::vector<GenericValue> args;
+// GenericValue object(obj);
+// args.push_back(object);
+
+// for (Function::arg_iterator i = ++(func->arg_begin()), e = func->arg_end();
+// i != e; ++i) {
+// const Type* type = i->getType();
+// if (type == Type::getInt8Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(8, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt16Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(16, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt32Ty(getGlobalContext())) {
+// GenericValue gv;
+// gv.IntVal = APInt(32, va_arg(ap, int));
+// args.push_back(gv);
+// } else if (type == Type::getInt64Ty(getGlobalContext())) {
+// GenericValue gv1;
+// gv1.IntVal = APInt(64, va_arg(ap, uint64));
+// args.push_back(gv1);
+// } else if (type == Type::getDoubleTy(getGlobalContext())) {
+// GenericValue gv1;
+// gv1.DoubleVal = va_arg(ap, double);
+// args.push_back(gv1);
+// } else if (type == Type::getFloatTy(getGlobalContext())) {
+// GenericValue gv;
+// gv.FloatVal = (float)(va_arg(ap, double));
+// args.push_back(gv);
+// } else {
+// GenericValue gv(va_arg(ap, VMObject*));
+// args.push_back(gv);
+// }
+// }
- return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+// return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
-GenericValue VMMethod::operator()(...) {
- va_list ap;
- va_start(ap, this);
- GenericValue ret = (*this)(ap);
- va_end(ap);
- return ret;
-}
+// GenericValue VMMethod::operator()(...) {
+// va_list ap;
+// va_start(ap, this);
+// GenericValue ret = (*this)(ap);
+// va_end(ap);
+// return ret;
+// }
+
+// GenericValue VMMethod::run(...) {
+// va_list ap;
+// va_start(ap, this);
+// GenericValue ret = (*this)(ap);
+// va_end(ap);
+// return ret;
+// }
-GenericValue VMMethod::run(...) {
- va_list ap;
- va_start(ap, this);
- GenericValue ret = (*this)(ap);
- va_end(ap);
- return ret;
-}
-
-GenericValue VMMethod::operator()(std::vector<GenericValue>& args) {
+// GenericValue VMMethod::operator()(std::vector<GenericValue>& args) {
- if (classDef->status < ready)
- classDef->resolveType(true, true, NULL);
+// if (classDef->status < ready)
+// classDef->resolveType(true, true, NULL);
- Function* func = compiledPtr(NULL);
- return mvm::MvmModule::executionEngine->runFunction(func, args);
-}
+// Function* func = compiledPtr(NULL);
+// return mvm::MvmModule::executionEngine->runFunction(func, args);
+// }
GlobalVariable* VMCommonClass::llvmVar() {
if (!_llvmVar) {
Modified: vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIRuntimeJIT.cpp Sat Oct 17 08:54:19 2009
@@ -29,6 +29,8 @@
#include "VMThread.h"
#include "Assembly.h"
+#include "mvm/GC/GC.h"
+
#include <cstdarg>
using namespace n3;
@@ -56,7 +58,8 @@
extern "C" VMObject* newString(const ArrayChar* utf8) {
N3 *vm = (N3*)VMThread::get()->getVM();
- return vm->arrayToString(utf8);
+ declare_gcroot(VMObject*, res) = vm->arrayToString(utf8);
+ return res;
}
extern "C" bool n3InstanceOf(VMObject* obj, VMCommonClass* cl) {
@@ -89,7 +92,7 @@
sint32 n = buf[0];
if (n < 0) VMThread::get()->getVM()->negativeArraySizeException(n);
- VMArray* res = (VMArray*)cl->doNew(n);
+ declare_gcroot(VMArray*, res) = (VMArray*)cl->doNew(n);
if (dim > 1) {
VMCommonClass* base = cl->baseClass;
if (n > 0) {
@@ -182,9 +185,11 @@
}
extern "C" VMObject* newObject(VMClass* cl) {
- return cl->doNew();
+ declare_gcroot(VMObject*, res) = cl->doNew();
+ return res;
}
extern "C" VMObject* newArray(VMClassArray* cl, sint32 nb) {
- return cl->doNew(nb);
+ declare_gcroot(VMObject*, res) = cl->doNew(nb);
+ return res;
}
Modified: vmkit/trunk/lib/N3/VMCore/N3.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3.cpp Sat Oct 17 08:54:19 2009
@@ -291,7 +291,7 @@
uint32 typeToken = assembly->getTypeDefTokenFromMethod(entryPoint);
assembly->loadType(this, typeToken, true, true, true ,true, NULL, NULL);
VMMethod* mainMeth = assembly->lookupMethodFromToken(entryPoint);
- (*mainMeth)(args);
+ mainMeth->compileToNative()->invokeGeneric(args);
}
}
}
@@ -319,9 +319,11 @@
MSCorlib::loadBootstrap(vm);
ClArgumentsInfo& info = vm->argumentsInfo;
- ArrayObject* args = (ArrayObject*)MSCorlib::arrayString->doNew(info.argc-2);
+ declare_gcroot(ArrayObject*, args) = (ArrayObject*)MSCorlib::arrayString->doNew(info.argc-2);
for (int i = 2; i < info.argc; ++i) {
- args->elements[i - 2] = (VMObject*)vm->arrayToString(vm->asciizToArray(info.argv[i]));
+ declare_gcroot(ArrayChar*, arg_array) = vm->asciizToArray(info.argv[i]);
+ declare_gcroot(VMObject*, arg) = vm->arrayToString(arg_array);
+ args->elements[i - 2] = arg;
}
try{
@@ -342,20 +344,21 @@
ArrayChar* N3::asciizToArray(const char* asciiz) {
uint32 len = strlen(asciiz);
- ArrayChar *res = (ArrayChar*)MSCorlib::arrayChar->doNew(len);
+ declare_gcroot(ArrayChar*, res) = (ArrayChar*)MSCorlib::arrayChar->doNew(len);
for(uint32 i=0; i<len; i++)
res->elements[i] = asciiz[i];
return res;
}
ArrayChar* N3::bufToArray(const uint16* buf, uint32 size) {
- ArrayChar *res = (ArrayChar*)MSCorlib::arrayChar->doNew(size);
+ declare_gcroot(ArrayChar*, res) = (ArrayChar*)MSCorlib::arrayChar->doNew(size);
memcpy(res->elements, buf, size<<1);
return res;
}
ArrayChar* N3::UTF8ToArray(const UTF8 *utf8) {
- return bufToArray(utf8->elements, utf8->size);
+ declare_gcroot(ArrayChar*, res) = bufToArray(utf8->elements, utf8->size);
+ return res;
}
const UTF8* N3::asciizToUTF8(const char* asciiz) {
@@ -371,7 +374,8 @@
}
CLIString *N3::arrayToString(const ArrayChar *array) {
- return (CLIString*)CLIString::stringDup(array, this);
+ declare_gcroot(CLIString*, res) = (CLIString*)CLIString::stringDup(array, this);
+ return res;
}
#include "MSCorlib.inc"
Modified: vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Opcodes.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Opcodes.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Opcodes.cpp Sat Oct 17 08:54:19 2009
@@ -1573,7 +1573,8 @@
case LDSTR : {
uint32 value = readU4(bytecodes, i);
uint32 index = value & 0xfffffff;
- const ArrayChar* array = compilingClass->assembly->readUserString(index);
+ // must modify this opcode
+ declare_gcroot(const ArrayChar*, array) = compilingClass->assembly->readUserString(index);
Value* val = ConstantExpr::getIntToPtr(ConstantInt::get(Type::getInt64Ty(getGlobalContext()), (int64_t)array),
module->ptrType);
Value* res = CallInst::Create(newStringLLVM, val, "", currentBlock);
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Sat Oct 17 08:54:19 2009
@@ -642,8 +642,7 @@
VMObject* VMClass::doNew() {
if (status < inClinit) resolveType(true, true, NULL);
uint64 size = mvm::MvmModule::getTypeSize(virtualType->getContainedType(0));
- VMObject* res = (VMObject*)
- gc::operator new(size, VMObject::getN3VirtualTable(virtualInstance));
+ declare_gcroot(VMObject*, res) = (VMObject*)gc::operator new(size, VMObject::getN3VirtualTable(virtualInstance));
memcpy(res, virtualInstance, size);
return res;
}
@@ -651,8 +650,7 @@
VMObject* VMClassArray::doNew(uint32 nb) {
if (status < inClinit) resolveType(true, true, NULL);
uint64 size = mvm::MvmModule::getTypeSize(baseClass->naturalType);
- VMArray* res = (VMArray*)
- gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);
+ declare_gcroot(VMArray*, res) = (VMArray*)gc::operator new(size * nb + sizeof(VMObject) + sizeof(sint32), arrayVT);
memset(res->elements, 0, size * nb);
VMObject::initialise(res, this);
res->size = nb;
Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Sat Oct 17 08:54:19 2009
@@ -151,7 +151,6 @@
std::vector<VMMethod*> genericMethods;
uint32 vtSize; // in number of methods
- VMObject* operator()();
VMObject* doNew();
VMObject* initialiseObject(VMObject*);
@@ -211,7 +210,7 @@
uint32 implFlags;
uint32 token;
- VMObject* delegatee;
+ VMObject* ooo_delegatee;
VMObject* getMethodDelegatee();
std::vector<Param*, gc_allocator<Param*> > params;
std::vector<Enveloppe*, gc_allocator<Enveloppe*> > caches;
@@ -231,6 +230,7 @@
llvm::GenericValue invokeGeneric(std::vector<llvm::GenericValue>& args);
llvm::GenericValue invokeGeneric(va_list ap);
+ llvm::GenericValue invokeGeneric(...);
#define DEFINE_CALLER(name, type) \
type invoke##name(...);
@@ -307,7 +307,7 @@
const llvm::FunctionType* getSignature(VMGenericMethod* genMethod);
bool virt;
const UTF8* name;
- VMObject* delegatee;
+ VMObject* ooo_delegatee;
uint32 flags;
VMObject* getPropertyDelegatee();
};
Modified: vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp?rev=84332&r1=84331&r2=84332&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp Sat Oct 17 08:54:19 2009
@@ -92,7 +92,7 @@
}
void VMMethod::TRACER {
- delegatee->MARK_AND_TRACE;
+ ooo_delegatee->MARK_AND_TRACE;
}
void VMGenericMethod::TRACER {
@@ -100,7 +100,7 @@
}
void Property::TRACER {
- delegatee->MARK_AND_TRACE;
+ ooo_delegatee->MARK_AND_TRACE;
}
// useless (never called or used) but it simplifies the definition of LockedMap
More information about the vmkit-commits
mailing list