[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