[vmkit-commits] [vmkit] r83969 - in /vmkit/trunk/lib/N3: LLVMRuntime/runtime.ll VMCore/CLIJit.cpp VMCore/N3Initialise.cpp VMCore/Opcodes.cpp VMCore/VMArray.cpp VMCore/VMArray.h VMCore/VirtualTables.cpp
Gael Thomas
gael.thomas at lip6.fr
Tue Oct 13 07:39:26 PDT 2009
Author: gthomas
Date: Tue Oct 13 09:39:26 2009
New Revision: 83969
URL: http://llvm.org/viewvc/llvm-project?rev=83969&view=rev
Log:
Unify array definition with a new macro applied on all arrays (ON_ARRAY_CLASSES).
Remove Array*::tracer. Use directly the generated tracer of CLIJit::makeArrayVT.
Array*::print is now a static method (called do_print to avoid confusion). The printer
is put in the virtual table of an array directly in CLIJit::makeArrayVT
Modified:
vmkit/trunk/lib/N3/LLVMRuntime/runtime.ll
vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
vmkit/trunk/lib/N3/VMCore/VMArray.cpp
vmkit/trunk/lib/N3/VMCore/VMArray.h
vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp
Modified: vmkit/trunk/lib/N3/LLVMRuntime/runtime.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/LLVMRuntime/runtime.ll?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/LLVMRuntime/runtime.ll (original)
+++ vmkit/trunk/lib/N3/LLVMRuntime/runtime.ll Tue Oct 13 09:39:26 2009
@@ -2,16 +2,18 @@
;;; Types for CLI arrays. A size of 0 means an undefined size.
%CLIArray = type { %CLIObject, i32 }
-%ArrayDouble = type { %CLIObject, i32, [0 x double] }
-%ArrayFloat = type { %CLIObject, i32, [0 x float] }
-%ArrayLong = type { %CLIObject, i32, [0 x i64] }
-%ArrayObject = type { %CLIObject, i32, [0 x %CLIObject*] }
+%ArraySInt8 = type { %CLIObject, i32, [0 x i8] }
+%ArrayUInt8 = type { %CLIObject, i32, [0 x i8] }
+%ArrayChar = type { %CLIObject, i32, [0 x i16] }
%ArraySInt16 = type { %CLIObject, i32, [0 x i16] }
-%ArraySInt32 = type { %CLIObject, i32, [0 x i32] }
-%ArraySInt8 = type { %CLIObject, i32, [0 x i8] }
%ArrayUInt16 = type { %CLIObject, i32, [0 x i16] }
+%ArraySInt32 = type { %CLIObject, i32, [0 x i32] }
%ArrayUInt32 = type { %CLIObject, i32, [0 x i32] }
-%ArrayUInt8 = type { %CLIObject, i32, [0 x i8] }
+%ArraySInt64 = type { %CLIObject, i32, [0 x i64] }
+%ArrayUInt64 = type { %CLIObject, i32, [0 x i64] }
+%ArrayFloat = type { %CLIObject, i32, [0 x float] }
+%ArrayDouble = type { %CLIObject, i32, [0 x double] }
+%ArrayObject = type { %CLIObject, i32, [0 x %CLIObject*] }
%CacheNode = type {i8*, i8*, i8*, i8*, i8*, i1}
Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Tue Oct 13 09:39:26 2009
@@ -237,27 +237,14 @@
cl->virtualTracer = func;
#endif
+#define CASE_ARRAY(name, elmt, nbb, printer, pre, sep, post) \
+ else if(cl->baseClass == MSCorlib::p##name) { \
+ ((void**)res)[VT_PRINT_OFFSET] = ((void **)(unsigned int)Array##name::do_print); \
+ }
+
+ if(0) {} ON_ARRAY_CLASSES(CASE_ARRAY)
- if (cl->baseClass == MSCorlib::pChar) {
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayChar::VT)[VT_PRINT_OFFSET];
- } else if(cl->baseClass == MSCorlib::pSInt8)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArraySInt8::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pUInt8)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayUInt8::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pSInt16)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArraySInt16::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pUInt16)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayUInt16::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pSInt32)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArraySInt32::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pUInt32)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayUInt32::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pSInt64)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayLong::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pFloat)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayFloat::VT)[VT_PRINT_OFFSET];
- else if(cl->baseClass == MSCorlib::pDouble)
- ((void**)res)[VT_PRINT_OFFSET] = ((void **)ArrayDouble::VT)[VT_PRINT_OFFSET];
+#undef CASE_ARRAY
return res;
}
@@ -1552,31 +1539,17 @@
PointerType::getUnqual(module->getTypeByName("CLIObject"));
VMArray::llvmType =
PointerType::getUnqual(module->getTypeByName("CLIArray"));
- ArrayUInt8::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayUInt8"));
- ArraySInt8::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArraySInt8"));
- ArrayChar::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayUInt16")); // should be ArrayChar... but it does not work?
- ArrayUInt16::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayUInt16"));
- ArraySInt16::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArraySInt16"));
- ArraySInt32::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArraySInt32"));
- ArrayLong::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayLong"));
- ArrayDouble::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayDouble"));
- ArrayFloat::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayFloat"));
- ArrayObject::llvmType =
- PointerType::getUnqual(module->getTypeByName("ArrayObject"));
CacheNode::llvmType =
PointerType::getUnqual(module->getTypeByName("CacheNode"));
Enveloppe::llvmType =
PointerType::getUnqual(module->getTypeByName("Enveloppe"));
+#define GET_LLVM_ARRAY_TYPE(name, elmt, nbb, printer, pre, sep, post) \
+ Array##name::llvmType = \
+ PointerType::getUnqual(module->getTypeByName("Array"#name));
+ ON_ARRAY_CLASSES(GET_LLVM_ARRAY_TYPE)
+#undef GET_LLVM_ARRAY_TYPE
+
#ifdef WITH_TRACER
markAndTraceLLVM = module->getFunction("MarkAndTrace");
markAndTraceLLVMType = markAndTraceLLVM->getFunctionType();
Modified: vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Tue Oct 13 09:39:26 2009
@@ -146,18 +146,12 @@
llvm::Function* CLIJit::getCppExceptionLLVM;
llvm::Function* CLIJit::newStringLLVM;
+#define DEFINE_ARRAY_LLVM_TYPE(name, elmt, size, printer, pre, sep, post) \
+ const llvm::Type* Array##name::llvmType = 0;
-const llvm::Type* ArrayUInt8::llvmType = 0;
-const llvm::Type* ArraySInt8::llvmType = 0;
-const llvm::Type* ArrayChar::llvmType = 0;
-const llvm::Type* ArrayUInt16::llvmType = 0;
-const llvm::Type* ArraySInt16::llvmType = 0;
-const llvm::Type* ArrayUInt32::llvmType = 0;
-const llvm::Type* ArraySInt32::llvmType = 0;
-const llvm::Type* ArrayFloat::llvmType = 0;
-const llvm::Type* ArrayDouble::llvmType = 0;
-const llvm::Type* ArrayLong::llvmType = 0;
-const llvm::Type* ArrayObject::llvmType = 0;
+ON_ARRAY_CLASSES(DEFINE_ARRAY_LLVM_TYPE)
+
+#undef DEFINE_ARRAY_LLVM_TYPE
static void initialiseVT() {
@@ -176,20 +170,12 @@
INIT(LockObj);
INIT(VMObject);
- INIT(VMArray);
- INIT(ArrayUInt8);
- INIT(ArraySInt8);
- INIT(ArrayChar);
- INIT(ArrayUInt16);
- INIT(ArraySInt16);
- INIT(ArrayUInt32);
- INIT(ArraySInt32);
- INIT(ArrayLong);
- INIT(ArrayFloat);
- INIT(ArrayDouble);
- INIT(ArrayObject);
INIT(CLIString);
+#define INIT_ARRAY(name, elmt, nbb, printer, pre, sep, post) INIT(Array##name)
+ ON_ARRAY_CLASSES(INIT_ARRAY);
+#undef INIT_ARRAY
+
#undef INIT
}
Modified: vmkit/trunk/lib/N3/VMCore/Opcodes.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/Opcodes.cpp?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Opcodes.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Opcodes.cpp Tue Oct 13 09:39:26 2009
@@ -1448,7 +1448,7 @@
case LDELEM_I8 : {
Value* index = pop();
Value* obj = pop();
- Value* ptr = verifyAndComputePtr(obj, index, ArrayLong::llvmType);
+ Value* ptr = verifyAndComputePtr(obj, index, ArrayUInt64::llvmType);
push(new LoadInst(ptr, "", currentBlock));
break;
}
@@ -1705,7 +1705,7 @@
Value* val = pop();
Value* index = pop();
Value* obj = pop();
- Value* ptr = verifyAndComputePtr(obj, index, ArrayLong::llvmType);
+ Value* ptr = verifyAndComputePtr(obj, index, ArrayUInt64::llvmType);
convertValue(val, Type::getInt64Ty(getGlobalContext()), currentBlock);
new StoreInst(val, ptr, false, currentBlock);
break;
Modified: vmkit/trunk/lib/N3/VMCore/VMArray.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.cpp?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMArray.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMArray.cpp Tue Oct 13 09:39:26 2009
@@ -20,9 +20,9 @@
const sint32 VMArray::MaxArraySize = 268435455;
-#define PRINT(name, printer, pre, sep, post) \
- void name::print(mvm::PrintBuffer *buf) const { \
- declare_gcroot(const name *, self) = this; \
+#define DEFINE_ARRAY_PRINT(name, elmt, nbb, printer, pre, sep, post) \
+ void Array##name::do_print(const Array##name *self, mvm::PrintBuffer *buf) { \
+ llvm_gcroot(self, 0); \
buf->write(pre); \
for(int i=0; i<self->size; i++) { \
if(i) \
@@ -32,27 +32,6 @@
buf->write(post); \
}
-#define ARRAYCLASS(name, elmt, size, printer, pre, sep, post) \
- PRINT(name, printer, pre, sep, post)
+ON_ARRAY_CLASSES(DEFINE_ARRAY_PRINT)
-ARRAYCLASS(ArrayUInt8, uint8, 1, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArraySInt8, sint8, 1, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArrayChar, uint16, 2, writeChar, "", "", "")
-ARRAYCLASS(ArrayUInt16, uint16, 2, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArraySInt16, sint16, 2, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArrayUInt32, uint32, 4, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArraySInt32, sint32, 4, writeS4, "Array<", " ", ">")
-ARRAYCLASS(ArrayLong, sint64, 8, writeS8, "Array<", " ", ">")
-ARRAYCLASS(ArrayFloat, float, 4, writeFP, "Array<", " ", ">")
-ARRAYCLASS(ArrayDouble, double, 8, writeFP, "Array<", " ", ">")
-ARRAYCLASS(ArrayObject, VMObject*, 4, writeObj, "Array<", " ", ">")
-
-void VMArray::print(mvm::PrintBuffer *buf) const {
- assert(0 && "should not be here");
-}
-
-#undef PRINT
-#undef AT
-#undef INITIALISE
-#undef ACONS
-#undef ARRAYCLASS
+#undef DEFINE_ARRAY_PRINT
Modified: vmkit/trunk/lib/N3/VMCore/VMArray.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMArray.h?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMArray.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMArray.h Tue Oct 13 09:39:26 2009
@@ -27,47 +27,53 @@
class VMCommonClass;
class VMObject;
+ // never allocate a VMArray, it is just a C++ type to access N3 object
class VMArray : public VMObject {
+ void *operator new(size_t n) { return VMObject::operator new(n, 0); }
+
public:
- static VirtualTable* VT;
sint32 size;
void* elements[1];
+
static const sint32 MaxArraySize;
static const llvm::Type* llvmType;
-
static llvm::Constant* sizeOffset();
static llvm::Constant* elementsOffset();
- virtual void print(mvm::PrintBuffer* buf) const;
- virtual void TRACER;
-
};
-typedef VMArray* (*arrayCtor_t)(uint32 len, VMCommonClass* cl);
+#define ON_ARRAY_PRIMITIVE_CLASSES(_) \
+ _(UInt8, uint8, 1, writeS4, "Array<", " ", ">") \
+ _(SInt8, sint8, 1, writeS4, "Array<", " ", ">") \
+ _(Char, uint16, 2, writeChar, "", "", "") \
+ _(UInt16, uint16, 2, writeS4, "Array<", " ", ">") \
+ _(SInt16, sint16, 2, writeS4, "Array<", " ", ">") \
+ _(UInt32, uint32, 4, writeS4, "Array<", " ", ">") \
+ _(SInt32, sint32, 4, writeS4, "Array<", " ", ">") \
+ _(UInt64, uint64, 8, writeS8, "Array<", " ", ">") \
+ _(SInt64, sint64, 8, writeS8, "Array<", " ", ">") \
+ _(Float, float, 4, writeFP, "Array<", " ", ">") \
+ _(Double, double, 8, writeFP, "Array<", " ", ">")
+
+#define ON_ARRAY_CLASSES(_) \
+ ON_ARRAY_PRIMITIVE_CLASSES(_) \
+ _(Object, VMObject*, 4, writeObj, "Array<", " ", ">")
+
+
+ // never allocate a VMArray, it is just a C++ type to access N3 object
+#define DEFINE_ARRAY_CLASS(name, elmt, nbb, printer, pre, sep, post) \
+ class Array##name : public VMObject { \
+ void *operator new(size_t n) { return VMObject::operator new(n, 0); } \
+ public: \
+ static VirtualTable* VT; \
+ static const llvm::Type* llvmType; \
+ sint32 size; \
+ elmt elements[1]; \
+ static void do_print(const Array##name *self, mvm::PrintBuffer* buf); \
+ };
-#define ARRAYCLASS(name, elmt) \
-class name : public VMObject { \
-public: \
- static VirtualTable* VT; \
- static const llvm::Type* llvmType; \
- sint32 size; \
- elmt elements[1]; \
- virtual void print(mvm::PrintBuffer* buf) const; \
- virtual void TRACER; \
-}
-
-ARRAYCLASS(ArrayUInt8, uint8);
-ARRAYCLASS(ArraySInt8, sint8);
-ARRAYCLASS(ArrayChar, uint16);
-ARRAYCLASS(ArrayUInt16, uint16);
-ARRAYCLASS(ArraySInt16, sint16);
-ARRAYCLASS(ArrayUInt32, uint32);
-ARRAYCLASS(ArraySInt32, sint32);
-ARRAYCLASS(ArrayLong, sint64);
-ARRAYCLASS(ArrayFloat, float);
-ARRAYCLASS(ArrayDouble, double);
-ARRAYCLASS(ArrayObject, VMObject*);
+ON_ARRAY_CLASSES(DEFINE_ARRAY_CLASS)
-#undef ARRAYCLASS
+#undef DEFINE_ARRAY_CLASS
} // end namespace n3
Modified: vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp?rev=83969&r1=83968&r2=83969&view=diff
==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VirtualTables.cpp Tue Oct 13 09:39:26 2009
@@ -25,21 +25,13 @@
#define INIT(X) VirtualTable* X::VT = 0
- INIT(VMArray);
- INIT(ArrayUInt8);
- INIT(ArraySInt8);
- INIT(ArrayChar);
- INIT(ArrayUInt16);
- INIT(ArraySInt16);
- INIT(ArrayUInt32);
- INIT(ArraySInt32);
- INIT(ArrayLong);
- INIT(ArrayFloat);
- INIT(ArrayDouble);
- INIT(ArrayObject);
- INIT(LockObj);
- INIT(VMObject);
- INIT(CLIString);
+INIT(LockObj);
+INIT(VMObject);
+INIT(CLIString);
+
+#define INIT_ARRAY(name, elmt, size, printer, pre, sep, post) INIT(Array##name);
+ON_ARRAY_CLASSES(INIT_ARRAY)
+#undef INIT_ARRAY
#undef INIT
@@ -63,36 +55,6 @@
VMObject::CALL_TRACER;
}
-void VMArray::TRACER {
- VMObject::CALL_TRACER;
-}
-
-void ArrayObject::TRACER {
- VMObject::CALL_TRACER;
- for (sint32 i = 0; i < size; i++) {
- elements[i]->MARK_AND_TRACE;
- }
-}
-
-#define ARRAYTRACER(name) \
- void name::TRACER { \
- VMObject::CALL_TRACER; \
- }
-
-
-ARRAYTRACER(ArrayUInt8)
-ARRAYTRACER(ArraySInt8)
-ARRAYTRACER(ArrayChar)
-ARRAYTRACER(ArrayUInt16)
-ARRAYTRACER(ArraySInt16)
-ARRAYTRACER(ArrayUInt32)
-ARRAYTRACER(ArraySInt32)
-ARRAYTRACER(ArrayLong)
-ARRAYTRACER(ArrayFloat)
-ARRAYTRACER(ArrayDouble)
-
-#undef ARRAYTRACER
-
#define TRACE_VECTOR(type, name, alloc) { \
for (std::vector<type, alloc<type> >::iterator i = name.begin(), e = name.end(); \
i!= e; ++i) { \
@@ -165,6 +127,6 @@
delegatee->MARK_AND_TRACE;
}
-// never called but it simplifies the definition of LockedMap
+// useless (never called or used) but it simplifies the definition of LockedMap
void VMField::TRACER {
}
More information about the vmkit-commits
mailing list