[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