[vmkit-commits] [vmkit] r84082 - in /vmkit/trunk/lib/N3/VMCore: CLIJit.cpp N3Initialise.cpp VMClass.cpp VMClass.h VMObject.cpp VMObject.h

Gael Thomas gael.thomas at lip6.fr
Wed Oct 14 02:46:12 PDT 2009


Author: gthomas
Date: Wed Oct 14 04:46:11 2009
New Revision: 84082

URL: http://llvm.org/viewvc/llvm-project?rev=84082&view=rev
Log:
Define a new N3VirtualTable. Compute the real size of vt to dispatch virtual call with vt.
It will not be used for the moment.


Modified:
    vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
    vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.cpp
    vmkit/trunk/lib/N3/VMCore/VMClass.h
    vmkit/trunk/lib/N3/VMCore/VMObject.cpp
    vmkit/trunk/lib/N3/VMCore/VMObject.h

Modified: vmkit/trunk/lib/N3/VMCore/CLIJit.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/CLIJit.cpp?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/CLIJit.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/CLIJit.cpp Wed Oct 14 04:46:11 2009
@@ -142,8 +142,9 @@
 
 
 N3VirtualTable* CLIJit::makeArrayVT(VMClassArray* cl) {
-  N3VirtualTable * res = (N3VirtualTable*)malloc(VT_SIZE);
-  memcpy(res, VMObject::VT, VT_SIZE);
+	VMClass *super = (VMClass*)cl->super;
+  N3VirtualTable * res = new(super->vtSize) N3VirtualTable(super->virtualInstance->getN3VirtualTable(), super->vtSize);
+
 #ifdef WITH_TRACER  
   Function* func = Function::Create(markAndTraceLLVMType,
                                 GlobalValue::ExternalLinkage,
@@ -250,8 +251,13 @@
 }
 
 N3VirtualTable* CLIJit::makeVT(VMClass* cl, bool stat) {
-  N3VirtualTable * res = (N3VirtualTable*)malloc(VT_SIZE);
-  memcpy(res, VMObject::VT, VT_SIZE);
+	int n                = N3VirtualTable::baseVtSize();
+  N3VirtualTable * res =
+		stat || !cl->super ?
+		new(n)          N3VirtualTable(VMObject::VT, n) :
+		new(cl->vtSize) N3VirtualTable(((VMClass *)cl->super)->virtualInstance->getN3VirtualTable(), n, cl->vtSize);
+		
+
 #ifdef WITH_TRACER  
   const Type* type = stat ? cl->staticType : cl->virtualType;
   std::vector<VMField*> &fields = stat ? cl->staticFields : cl->virtualFields;

Modified: vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Wed Oct 14 04:46:11 2009
@@ -263,6 +263,7 @@
   N3::testInfinity      = vm->asciizToUTF8("TestInfinity");
 
 	MSCorlib::pArray->resolveType(1, 0, 0);
+	MSCorlib::pArray->resolveVT();
 
   MSCorlib::initialise(vm);
 }

Modified: vmkit/trunk/lib/N3/VMCore/VMClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.cpp?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.cpp Wed Oct 14 04:46:11 2009
@@ -453,31 +453,40 @@
 
 void VMCommonClass::resolveVT() {
   VMCommonClass* cl = this;
-      if (cl->isArray) {
-        VMClassArray* arrayCl = (VMClassArray*)cl;
-        arrayCl->baseClass->resolveVT();
-        arrayCl->arrayVT = CLIJit::makeArrayVT(arrayCl);
-      } else if (cl->isPointer) {
-      } else {
-        VMClass* cl = (VMClass*)this;
-        if (super) super->resolveVT();
-        
-        // We check for virtual instance because the string class has a 
-        // bigger size than the class declares.
-        if (super != MSCorlib::pEnum && !cl->virtualInstance) {
-          N3VirtualTable* VT = CLIJit::makeVT(cl, false);
-  
-          uint64 size = mvm::MvmModule::getTypeSize(cl->virtualType->getContainedType(0));
-          cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
-          cl->virtualInstance->initialise(cl);
+	if (cl->isArray) {
+		VMClassArray* arrayCl = (VMClassArray*)cl;
+		arrayCl->baseClass->resolveVT();
+		//		printf("Making vt of %s\n", mvm::PrintBuffer(this).cString());
+		arrayCl->arrayVT = CLIJit::makeArrayVT(arrayCl);
+	} else if (cl->isPointer) {
+	} else {
+		VMClass* cl = (VMClass*)this;
+		if (super)
+			super->resolveVT();
+
+		// We check for virtual instance because the string class has a 
+		// bigger size than the class declares.
+		if (super != MSCorlib::pEnum && !cl->virtualInstance) {
+			cl->vtSize = super ? ((VMClass*)super)->vtSize : sizeof(N3VirtualTable) / sizeof(uintptr_t);
+      for (std::vector<VMMethod*>::iterator i = virtualMethods.begin(), 
+						 e = virtualMethods.end(); i!= e; ++i) {
+        (*i)->offsetInVt = cl->vtSize++;
+			}
 
-          for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
-               e = cl->virtualFields.end(); i!= e; ++i) {
-    
-            (*i)->initField(cl->virtualInstance);
-          }
-        }
-      }
+			//			printf("Making vt of %s with %d elements\n", mvm::PrintBuffer(this).cString(), cl->vtSize);
+			N3VirtualTable* VT = CLIJit::makeVT(cl, false);
+  
+			uint64 size = mvm::MvmModule::getTypeSize(cl->virtualType->getContainedType(0));
+			cl->virtualInstance = (VMObject*)gc::operator new(size, VT);
+			cl->virtualInstance->initialise(cl);
+			
+			for (std::vector<VMField*>::iterator i = cl->virtualFields.begin(),
+						 e = cl->virtualFields.end(); i!= e; ++i) {
+				
+				(*i)->initField(cl->virtualInstance);
+			}
+		}
+	}
 }
 
 void VMCommonClass::resolveType(bool stat, bool clinit, VMGenericMethod* genMethod) {

Modified: vmkit/trunk/lib/N3/VMCore/VMClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMClass.h?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMClass.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMClass.h Wed Oct 14 04:46:11 2009
@@ -147,6 +147,7 @@
   std::vector<VMClass*> innerClasses;
   VMClass* outerClass;
   std::vector<VMMethod*> genericMethods;
+	uint32 vtSize; // in number of methods
   
   VMObject* operator()();
   VMObject* doNew();
@@ -201,7 +202,8 @@
 public:
   virtual void print(mvm::PrintBuffer* buf) const;
   virtual void TRACER;
-  
+
+	uint32 offsetInVt;
   uint32 flags;
 	uint32 offsetInTextSection;
   uint32 implFlags;

Modified: vmkit/trunk/lib/N3/VMCore/VMObject.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.cpp?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.cpp Wed Oct 14 04:46:11 2009
@@ -18,6 +18,27 @@
 
 using namespace n3;
 
+void *N3VirtualTable::operator new(size_t size, size_t totalVtSize) {
+	//printf("Allocate N3VirtualTable with %d elements\n", totalVtSize);
+	return malloc(totalVtSize * sizeof(uintptr_t));
+}
+
+N3VirtualTable::N3VirtualTable() {
+}
+
+N3VirtualTable::N3VirtualTable(N3VirtualTable *baseVt, uint32 baseVtSize, uint32 totalSize) {
+	memcpy(this, baseVt, baseVtSize * sizeof(uintptr_t));
+}
+
+N3VirtualTable::N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h) : VirtualTable(d, o, t) {
+	print = p;
+	hashcode = h;
+}
+
+uint32 N3VirtualTable::baseVtSize() {
+	return sizeof(N3VirtualTable) / sizeof(uintptr_t);
+}
+
 void VMObject::initialise(VMCommonClass* cl) {
   this->classOf = cl;
   this->lockObj = 0;

Modified: vmkit/trunk/lib/N3/VMCore/VMObject.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/VMCore/VMObject.h?rev=84082&r1=84081&r2=84082&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/VMObject.h (original)
+++ vmkit/trunk/lib/N3/VMCore/VMObject.h Wed Oct 14 04:46:11 2009
@@ -34,10 +34,13 @@
 	uintptr_t  print;
 	uintptr_t  hashcode;
 
-  N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h) : VirtualTable(d, o, t) {
-		print = p;
-		hashcode = h;
-  }
+	void *operator new(size_t size, size_t totalVtSize);
+
+  N3VirtualTable();
+  N3VirtualTable(N3VirtualTable *vmobjVt, uint32 baseVtSize, uint32 totalVtSize=-1);
+  N3VirtualTable(uintptr_t d, uintptr_t o, uintptr_t t, uintptr_t p, uintptr_t h);
+
+	static uint32 baseVtSize();
 };
 
 class LockObj : public mvm::Object {
@@ -90,6 +93,8 @@
   bool instanceOf(VMCommonClass* cl);
 
 
+	N3VirtualTable *getN3VirtualTable() { return (N3VirtualTable*)getVirtualTable(); }
+
 #ifdef SIGSEGV_THROW_NULL
   #define verifyNull(obj) {}
 #else





More information about the vmkit-commits mailing list