[vmkit-commits] [vmkit] r83718 - in /vmkit/trunk/lib/N3: PNetLib/PNetLib.cpp VMCore/Assembly.cpp VMCore/Assembly.h VMCore/N3.cpp VMCore/N3.h VMCore/N3Initialise.cpp

Gael Thomas gael.thomas at lip6.fr
Sat Oct 10 11:57:23 PDT 2009


Author: gthomas
Date: Sat Oct 10 13:57:23 2009
New Revision: 83718

URL: http://llvm.org/viewvc/llvm-project?rev=83718&view=rev
Log:
Simplify the loading phase of an assembly. Simplify the bootstrap.


Modified:
    vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
    vmkit/trunk/lib/N3/VMCore/Assembly.cpp
    vmkit/trunk/lib/N3/VMCore/Assembly.h
    vmkit/trunk/lib/N3/VMCore/N3.cpp
    vmkit/trunk/lib/N3/VMCore/N3.h
    vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp

Modified: vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp?rev=83718&r1=83717&r2=83718&view=diff

==============================================================================
--- vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp (original)
+++ vmkit/trunk/lib/N3/PNetLib/PNetLib.cpp Sat Oct 10 13:57:23 2009
@@ -522,8 +522,11 @@
 
 extern "C" VMObject* System_Reflection_Assembly_LoadFromName(PNetString* str, sint32 & error, VMObject* parent) {
   N3* vm = (N3*)(VMThread::get()->vm);
-  Assembly* ass = vm->loadAssembly(vm->arrayToUTF8(str->value), "dll");
-  if (!ass) vm->error("unfound assembly %s\n", mvm::PrintBuffer(str->value).cString());
+  Assembly* ass = vm->constructAssembly(vm->arrayToUTF8(str->value));
+
+	if(!ass->resolve(1, "dll"))
+		vm->error("unfound assembly %s\n", mvm::PrintBuffer(str->value).cString());
+
   error = 0;
   return ass->getAssemblyDelegatee();
 }

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.cpp Sat Oct 10 13:57:23 2009
@@ -463,7 +463,8 @@
   return meth;
 }
 
-Assembly::Assembly(mvm::BumpPtrAllocator &allocator, const UTF8 *name) : allocator(allocator) {
+Assembly::Assembly(mvm::BumpPtrAllocator &allocator, N3 *vm, const UTF8 *name) : allocator(allocator) {
+	this->lockVar = new mvm::LockRecursive();
   this->loadedNameClasses =  new(allocator, "ClassNameMap")   ClassNameMap();
   this->loadedTokenClasses = new(allocator, "ClassTokenMap")  ClassTokenMap();
   this->loadedTokenMethods = new(allocator, "MethodTokenMap") MethodTokenMap();
@@ -471,6 +472,7 @@
 
   this->assemblyRefs = 0;
   this->isRead = false;
+	this->vm = vm;
   this->name = name;
 }
 
@@ -823,45 +825,85 @@
 	return new(allocator, "Reader") Reader(array, start, end); 
 }
 
-void Assembly::read() {
-  Reader* reader = newReader(bytes);
-  PRINT_DEBUG(DEBUG_LOAD, 1, LIGHT_GREEN, "Reading %s::%s", mvm::PrintBuffer(vm).cString(),
-              mvm::PrintBuffer(this).cString());
-
-  textSection =  new(allocator, "Section") Section();
-  rsrcSection =  new(allocator, "Section") Section();
-  relocSection = new(allocator, "Section") Section();
-
-  reader->seek(TEXT_SECTION_HEADER, Reader::SeekSet);
-  textSection->read(reader, vm);
-  rsrcSection->read(reader, vm);
-  relocSection->read(reader, vm);
-
-  reader->seek(CLI_HEADER, Reader::SeekSet);
-  CLIHeaderLocation = reader->readU4();
-  reader->seek(textSection->rawAddress + 
-                  (CLIHeaderLocation - textSection->virtualAddress),
-               Reader::SeekSet);
-
-  cb          = reader->readU4();
-  major       = reader->readU2();
-  minor       = reader->readU2();
-  mdRva       = reader->readU4();
-  mdSize      = reader->readU4();
-  flags       = reader->readU4();
-  entryPoint  = reader->readU4();
-  resRva      = reader->readU4();
-  resSize     = reader->readU4();
-  
-  reader->seek(textSection->rawAddress + (mdRva - textSection->virtualAddress),
-               Reader::SeekSet);
+int Assembly::resolve(int doResolve, const char *ext) {
+	if(!bytes)
+		open(ext);
+
+	if(bytes && doResolve && !isRead) {
+		lockVar->lock();
+		if(!isRead) {
+			Reader* reader = newReader(bytes);
+			PRINT_DEBUG(DEBUG_LOAD, 1, LIGHT_GREEN, "Reading %s::%s", mvm::PrintBuffer(vm).cString(),
+									mvm::PrintBuffer(this).cString());
+
+			textSection =  new(allocator, "Section") Section();
+			rsrcSection =  new(allocator, "Section") Section();
+			relocSection = new(allocator, "Section") Section();
+
+			reader->seek(TEXT_SECTION_HEADER, Reader::SeekSet);
+			textSection->read(reader, vm);
+			rsrcSection->read(reader, vm);
+			relocSection->read(reader, vm);
+
+			reader->seek(CLI_HEADER, Reader::SeekSet);
+			CLIHeaderLocation = reader->readU4();
+			reader->seek(textSection->rawAddress + 
+									 (CLIHeaderLocation - textSection->virtualAddress),
+									 Reader::SeekSet);
+
+			cb          = reader->readU4();
+			major       = reader->readU2();
+			minor       = reader->readU2();
+			mdRva       = reader->readU4();
+			mdSize      = reader->readU4();
+			flags       = reader->readU4();
+			entryPoint  = reader->readU4();
+			resRva      = reader->readU4();
+			resSize     = reader->readU4();
+  
+			reader->seek(textSection->rawAddress + (mdRva - textSection->virtualAddress),
+									 Reader::SeekSet);
+
+			CLIHeader = new (allocator, "Header") Header();
+			CLIHeader->read(allocator, reader, vm);
+
+			reader->seek(CLIHeader->tildStream->realOffset, Reader::SeekSet);
+
+			readTables(reader);
+
+			isRead = 1;
+		}
+		lockVar->unlock();
+	}
+
+	return bytes ? (doResolve ? isRead : 1) : 0;
+}
+
+int Assembly::open(const char *ext) {
+	lockVar->lock();
+	mvm::PrintBuffer _asciiz = mvm::PrintBuffer(name);
+	const char* asciiz = _asciiz.cString();
+	uint32 alen = strlen(asciiz);
+
+	uint32 idx = 0;
+
+	while ((bytes == 0) && (idx < vm->assemblyPath.size())) {
+		const char* cur = vm->assemblyPath[idx];
+		uint32 strLen = strlen(cur);
+		char* buf = (char*)alloca(strLen + alen + 16);
+
+		if (ext != 0) {
+			sprintf(buf, "%s%s.%s", cur, asciiz, ext);
+		} else {
+			sprintf(buf, "%s%s", cur, asciiz);
+		}
+			
+		bytes = Reader::openFile(buf);
+		++idx;
+	}
+	lockVar->unlock();
 
-  CLIHeader = new (allocator, "Header") Header();
-  CLIHeader->read(allocator, reader, vm);
-
-  reader->seek(CLIHeader->tildStream->realOffset, Reader::SeekSet);
-
-  readTables(reader);
+	return bytes ? 1 : 0;
 }
 
 uint32 Assembly::getTypeDefTokenFromMethod(uint32 token) {
@@ -963,8 +1005,11 @@
     const UTF8* name = 
       readString(vm, stringOffset + assArray[CONSTANT_ASSEMBLY_REF_NAME]);
     
-    ref = vm->loadAssembly(name, "dll");
-    if (ref == 0) VMThread::get()->vm->error("implement me");
+    ref = vm->constructAssembly(name);
+
+    if(!ref->resolve(1, "dll"))
+			 VMThread::get()->vm->error("implement me");
+
     assemblyRefs[index - 1] = ref;
   }
   return ref;

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/Assembly.h (original)
+++ vmkit/trunk/lib/N3/VMCore/Assembly.h Sat Oct 10 13:57:23 2009
@@ -136,6 +136,17 @@
 typedef VMCommonClass* (*signatureVector_t)(uint32 op, Assembly* ass,
                                             uint32& offset, VMGenericClass* genClass, VMGenericMethod* genMethod);
 
+// class ByteCode : mvm::PermanentObject {
+// public:
+// 	ByteCode(mvm::BumpPtrAllocator &allocator, int size) {
+// 		this->size = size;
+// 		this->elements = mvm::BumpPtrAllocator::operator new(0, "ByteCode", size * sizeof(uint8));
+// 	}
+
+// 	uint32 size;
+// 	uint8  *elements;
+// };
+
 class Assembly : public mvm::PermanentObject {
 public:
   virtual void print(mvm::PrintBuffer* buf) const;
@@ -160,26 +171,27 @@
   VMMethod* lookupMethodFromToken(uint32 token);
   VMField* lookupFieldFromToken(uint32 token);
   
+  VMObject*     getAssemblyDelegatee();
+
   ClassNameMap* loadedNameClasses;
   ClassTokenMap* loadedTokenClasses;
   MethodTokenMap* loadedTokenMethods;
   FieldTokenMap* loadedTokenFields;
   
-  mvm::Lock* lockVar;
-  mvm::Cond* condVar;
-  const UTF8* name;
-  ArrayUInt8* bytes;
-  Section* textSection;
-  Section* rsrcSection;
-  Section* relocSection;
-  Header* CLIHeader;
-  N3* vm;
-  VMObject* delegatee;
-  Assembly** assemblyRefs;
-  VMObject* getAssemblyDelegatee();
+  N3*           vm;
+  mvm::Lock*    lockVar;
+  mvm::Cond*    condVar;
+  const UTF8*   name;
+  ArrayUInt8*   bytes;
+  Section*      textSection;
+  Section*      rsrcSection;
+  Section*      relocSection;
+  Header*       CLIHeader;
+  VMObject*     delegatee;
+  Assembly**    assemblyRefs;
 
   uint32 CLIHeaderLocation;
-  bool isRead;
+  volatile bool isRead;
   uint32 cb;
   uint32 major;
   uint32 minor;
@@ -192,7 +204,10 @@
 
 	mvm::BumpPtrAllocator &allocator;
 
-	Assembly(mvm::BumpPtrAllocator &Alloc, const UTF8* name);
+	Assembly(mvm::BumpPtrAllocator &Alloc, N3 *vm, const UTF8* name);
+
+	int open(const char *ext);
+  int resolve(int doResolve, const char *ext);
 
   static const UTF8* readUTF8(N3* vm, uint32 len, Reader* reader);
   static const UTF8* readUTF8(N3* vm, uint32 len, ArrayUInt8* bytes,
@@ -201,7 +216,6 @@
   static const ArrayUInt16* readUTF16(N3* vm, uint32 len, 
 																			ArrayUInt8* bytes, uint32& offset);
   const UTF8*        readString(N3* vm, uint32 offset);
-  void read();
   void readTables(Reader* reader);
 
   static maskVector_t maskVector[64];

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3.cpp Sat Oct 10 13:57:23 2009
@@ -190,7 +190,7 @@
 
 static Assembly* assemblyDup(const UTF8*& name, N3* vm) {
 	mvm::BumpPtrAllocator *a = new mvm::BumpPtrAllocator();
-  return new(*a, "Assembly") Assembly(*a, name);
+  return new(*a, "Assembly") Assembly(*a, vm, name);
 }
 
 Assembly* N3::constructAssembly(const UTF8* name) {
@@ -235,32 +235,6 @@
   return vm; 
 }
 
-ArrayUInt8* N3::openAssembly(const UTF8* name, const char* ext) {
-	mvm::PrintBuffer _asciiz = mvm::PrintBuffer(name);
-  const char* asciiz = _asciiz.cString();
-  uint32 alen = strlen(asciiz);
-
-  ArrayUInt8* res = 0;
-  uint32 idx = 0;
-
-  while ((res == 0) && (idx < assemblyPath.size())) {
-    const char* cur = assemblyPath[idx];
-    uint32 strLen = strlen(cur);
-    char* buf = (char*)alloca(strLen + alen + 16);
-
-    if (ext != 0) {
-      sprintf(buf, "%s%s.%s", cur, asciiz, ext);
-    } else {
-      sprintf(buf, "%s%s", cur, asciiz);
-    }
-    
-    res = Reader::openFile(buf);
-    ++idx;
-  }
-
-  return res;
-}
-
 void ClArgumentsInfo::nyi() {
   fprintf(stdout, "Not yet implemented\n");
 }
@@ -305,28 +279,14 @@
   return;
 }
 
-Assembly* N3::loadAssembly(const UTF8* name, const char* ext) {
-  Assembly* ass = lookupAssembly(name);
-  if (ass == 0 || !ass->isRead) {
-    ArrayUInt8* bytes = openAssembly(name, ext);
-    if (bytes != 0) {
-      if (ass == 0) ass = constructAssembly(name);
-      ass->bytes = bytes;
-      ass->vm = this;
-      ass->read();
-      ass->isRead = true;
-    }
-  }
-  return ass;
-}
-
 void N3::executeAssembly(const char* _name, ArrayObject* args) {
   const UTF8* name = asciizToUTF8(_name);
-  Assembly* assembly = loadAssembly(name, 0);
-  if (assembly == 0) {
+  Assembly* assembly = constructAssembly(name);
+
+	if(!assembly->resolve(1, 0))
     error("Can not find assembly %s", _name);
-  } else {
-    uint32 entryPoint = assembly->entryPoint;
+	else {
+		uint32 entryPoint = assembly->entryPoint;
     uint32 table = entryPoint >> 24;
     if (table != CONSTANT_MethodDef) {
       error("Entry point does not point to a method");

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3.h (original)
+++ vmkit/trunk/lib/N3/VMCore/N3.h Sat Oct 10 13:57:23 2009
@@ -116,27 +116,24 @@
   virtual void waitForExit();
 
 	// non virtual methods
-  ArrayUInt8*   openAssembly(const UTF8* name, const char* extension);
-  Assembly*     loadAssembly(const UTF8* name, const char* extension);
   void          executeAssembly(const char* name, ArrayObject* args);
   void          runMain(int argc, char** argv);
 
   VMMethod*     lookupFunction(llvm::Function* F);
 
   llvm::Module* getLLVMModule() { return LLVMModule; }  
-  
 
-  Assembly*     constructAssembly(const UTF8* name);
-  Assembly*     lookupAssembly(const UTF8* name);
+  Assembly*        constructAssembly(const UTF8* name);
+  Assembly*        lookupAssembly(const UTF8* name);
 
 	// usefull string, uint16 and utf8 functions
 
-	ArrayUInt16*     asciizToArray(const char *asciiz);          // done
-	ArrayUInt16*     bufToArray(const uint16 *buf, uint32 len);  // done
-	ArrayUInt16*     UTF8ToArray(const UTF8 *utf8);              // done
-	const UTF8*      asciizToUTF8(const char *asciiz);           // done
-	const UTF8*      bufToUTF8(const uint16 *buf, uint32 len);   // done
-	const UTF8*      arrayToUTF8(const ArrayUInt16 *array);      // done
+	ArrayUInt16*     asciizToArray(const char *asciiz);
+	ArrayUInt16*     bufToArray(const uint16 *buf, uint32 len);
+	ArrayUInt16*     UTF8ToArray(const UTF8 *utf8);
+	const UTF8*      asciizToUTF8(const char *asciiz);
+	const UTF8*      bufToUTF8(const uint16 *buf, uint32 len);
+	const UTF8*      arrayToUTF8(const ArrayUInt16 *array);
 	CLIString*       arrayToString(const ArrayUInt16 *array);
 
   /*

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

==============================================================================
--- vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp (original)
+++ vmkit/trunk/lib/N3/VMCore/N3Initialise.cpp Sat Oct 10 13:57:23 2009
@@ -211,19 +211,13 @@
   vm->assemblyPath.push_back("");
   vm->assemblyPath.push_back(MSCorlib::libsPath);
   
-  const UTF8* mscorlib = vm->asciizToUTF8("mscorlib");
-  Assembly* ass = vm->loadAssembly(mscorlib, "dll");
-  if (ass == 0)
+  Assembly* ass = vm->constructAssembly(vm->asciizToUTF8("mscorlib"));
+
+  if(!ass->resolve(1, "dll"))
     VMThread::get()->vm->error("can not load mscorlib.dll. Abort");
 
   vm->coreAssembly = ass;
 
-  // Array initialization
-  const UTF8* System = vm->asciizToUTF8("System");
-  const UTF8* utf8OfChar = vm->asciizToUTF8("Char");
-  
-  MSCorlib::arrayChar = ass->constructArray(utf8OfChar, System, 1);
-
 #define INIT(var, nameSpace, name, type, prim) {\
   var = (VMClass*)vm->coreAssembly->loadTypeFromName( \
                                            vm->asciizToUTF8(name),     \
@@ -258,46 +252,37 @@
   INIT(MSCorlib::pDelegate, "System", "Delegate", 0, false);
 
 #undef INIT
-  
 
-  MSCorlib::arrayChar->baseClass = MSCorlib::pChar;
-  VMClassArray::SuperArray = MSCorlib::pArray;
-  MSCorlib::arrayChar->super = MSCorlib::pArray;
+  VMClassArray::SuperArray       = MSCorlib::pArray;
 
   MSCorlib::loadStringClass(vm);
 
-  MSCorlib::arrayString = ass->constructArray(vm->asciizToUTF8("String"), System, 1);
-  MSCorlib::arrayString->baseClass = MSCorlib::pString;
-  
-  MSCorlib::arrayByte = ass->constructArray(vm->asciizToUTF8("Byte"), System, 1);
-  MSCorlib::arrayByte->baseClass = MSCorlib::pUInt8;
-  
-  MSCorlib::arrayObject = ass->constructArray(vm->asciizToUTF8("Object"), System, 1);
-  MSCorlib::arrayObject->baseClass = MSCorlib::pObject;
-
-  N3::clinitName = vm->asciizToUTF8(".cctor");
-  N3::ctorName = vm->asciizToUTF8(".ctor");
-  N3::invokeName = vm->asciizToUTF8("Invoke");
-  N3::math = vm->asciizToUTF8("Math");
-  N3::system = vm->asciizToUTF8("System");
-  N3::sqrt = vm->asciizToUTF8("Sqrt");
-  N3::sin = vm->asciizToUTF8("Sin");
-  N3::cos = vm->asciizToUTF8("Cos");
-  N3::exp = vm->asciizToUTF8("Exp");
-  N3::log = vm->asciizToUTF8("Log");
-  N3::floor = vm->asciizToUTF8("Floor");
-  N3::log10 = vm->asciizToUTF8("Log10");
-  N3::isNan = vm->asciizToUTF8("IsNaN");
-  N3::pow = vm->asciizToUTF8("Pow");
-  N3::floatName = vm->asciizToUTF8("Float");
-  N3::doubleName = vm->asciizToUTF8("Double");
-  N3::testInfinity = vm->asciizToUTF8("TestInfinity");
-  
+  MSCorlib::arrayChar   = ass->constructArray(MSCorlib::pChar,   1);
+  MSCorlib::arrayString = ass->constructArray(MSCorlib::pString, 1);
+  MSCorlib::arrayByte   = ass->constructArray(MSCorlib::pUInt8,  1);
+  MSCorlib::arrayObject = ass->constructArray(MSCorlib::pObject, 1);
+
+  N3::clinitName        = vm->asciizToUTF8(".cctor");
+  N3::ctorName          = vm->asciizToUTF8(".ctor");
+  N3::invokeName        = vm->asciizToUTF8("Invoke");
+  N3::math              = vm->asciizToUTF8("Math");
+  N3::system            = vm->asciizToUTF8("System");
+  N3::sqrt              = vm->asciizToUTF8("Sqrt");
+  N3::sin               = vm->asciizToUTF8("Sin");
+  N3::cos               = vm->asciizToUTF8("Cos");
+  N3::exp               = vm->asciizToUTF8("Exp");
+  N3::log               = vm->asciizToUTF8("Log");
+  N3::floor             = vm->asciizToUTF8("Floor");
+  N3::log10             = vm->asciizToUTF8("Log10");
+  N3::isNan             = vm->asciizToUTF8("IsNaN");
+  N3::pow               = vm->asciizToUTF8("Pow");
+  N3::floatName         = vm->asciizToUTF8("Float");
+  N3::doubleName        = vm->asciizToUTF8("Double");
+  N3::testInfinity      = vm->asciizToUTF8("TestInfinity");
 
 	MSCorlib::pArray->resolveType(1, 0, 0);
 
   MSCorlib::initialise(vm);
-   
 }
 
 





More information about the vmkit-commits mailing list