[vmkit-commits] [vmkit] r197333 - MCJIT works!

Gael Thomas gael.thomas at lip6.fr
Sun Dec 15 01:39:05 PST 2013


Author: gthomas
Date: Sun Dec 15 03:39:03 2013
New Revision: 197333

URL: http://llvm.org/viewvc/llvm-project?rev=197333&view=rev
Log:
MCJIT works!


Modified:
    vmkit/branches/mcjit/   (props changed)
    vmkit/branches/mcjit/include/j3/j3class.h
    vmkit/branches/mcjit/include/j3/j3classloader.h
    vmkit/branches/mcjit/include/j3/j3method.h
    vmkit/branches/mcjit/include/j3/j3symbol.h
    vmkit/branches/mcjit/include/vmkit/util.h
    vmkit/branches/mcjit/include/vmkit/vmkit.h
    vmkit/branches/mcjit/lib/j3/vm/j3class.cc
    vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
    vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
    vmkit/branches/mcjit/lib/j3/vm/j3method.cc
    vmkit/branches/mcjit/lib/j3/vm/j3options.cc
    vmkit/branches/mcjit/lib/j3/vm/j3symbol.cc
    vmkit/branches/mcjit/lib/vmkit/util.cc
    vmkit/branches/mcjit/lib/vmkit/vmkit.cc

Propchange: vmkit/branches/mcjit/
------------------------------------------------------------------------------
--- svn:ignore (original)
+++ svn:ignore Sun Dec 15 03:39:03 2013
@@ -2,3 +2,5 @@ Makefile.config
 Debug+Asserts
 config.log
 config.status
+.git
+.gitignore

Modified: vmkit/branches/mcjit/include/j3/j3class.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3class.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3class.h (original)
+++ vmkit/branches/mcjit/include/j3/j3class.h Sun Dec 15 03:39:03 2013
@@ -52,6 +52,8 @@ namespace j3 {
 	public:
 		J3Type(J3ClassLoader* loader, const vmkit::Name* name);
 
+		uint8_t*                    getSymbolAddress();
+
 		virtual llvm::GlobalValue*  llvmDescriptor(llvm::Module* module) { return 0; }
 
 		int                         isTypeDescriptor() { return 1; }

Modified: vmkit/branches/mcjit/include/j3/j3classloader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3classloader.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3classloader.h (original)
+++ vmkit/branches/mcjit/include/j3/j3classloader.h Sun Dec 15 03:39:03 2013
@@ -11,6 +11,10 @@
 
 #include "j3/j3object.h"
 
+namespace llvm {
+	class ExecutionEngine;
+}
+
 namespace j3 {
 	class J3ZipArchive;
 	class J3ClassBytes;
@@ -47,6 +51,9 @@ namespace j3 {
 		vmkit::NameMap<J3MethodType*>::map   methodTypes;  /* shortcut to find method types - REMOVE */
 		MethodRefMap                         methods;      /* all te known method */
 
+		llvm::ExecutionEngine*               _ee;
+		llvm::ExecutionEngine*               _oldee;
+
 		void                          wrongType(J3Class* from, const vmkit::Name* type);
 		J3Type*                       getTypeInternal(J3Class* from, const vmkit::Name* type, uint32_t start, uint32_t* end);
 
@@ -60,6 +67,9 @@ namespace j3 {
 		void* operator new(size_t n, vmkit::BumpAllocator* allocator);
 		J3ClassLoader(J3* vm, J3ObjectHandle* javaClassLoader, vmkit::BumpAllocator* allocator);
 
+		llvm::ExecutionEngine*        ee() { return _ee; }
+		llvm::ExecutionEngine*        oldee() { return _oldee; }
+
 		void                          addSymbol(const char* id, J3Symbol* symbol);
 
 		static void                   destroy(J3ClassLoader* loader);

Modified: vmkit/branches/mcjit/include/j3/j3method.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3method.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3method.h (original)
+++ vmkit/branches/mcjit/include/j3/j3method.h Sun Dec 15 03:39:03 2013
@@ -52,7 +52,7 @@ namespace j3 {
 
 		J3MethodCode(J3Method* _self) { self = _self; }
 
-		int isMethodPointer() { return 1; } 
+		uint8_t* getSymbolAddress();
 	};
 
 	class J3Method : public J3Symbol {
@@ -67,8 +67,7 @@ namespace j3 {
 		uint32_t                     _index;
 		llvm::Function*              _llvmFunction;
 		uint8_t*                     _fnPtr;
-		char* volatile               _llvmAllNames; /* md_ + llvm Name */
-		size_t                       _llvmAllNamesLength;
+		char* volatile               _llvmAllNames; /* stub + _ + native_name */
 		void*                        _nativeFnPtr;
 
 		uint8_t                      _trampoline[1];
@@ -84,7 +83,7 @@ namespace j3 {
 	public:
 		J3Method(uint16_t access, J3Class* cl, const vmkit::Name* name, const vmkit::Name* sign);
 
-		int                 isMethodDescriptor() { return 1; } 
+		uint8_t*            getSymbolAddress();
 
 		static J3Method*    newMethod(vmkit::BumpAllocator* allocator, 
 																	uint16_t access, 
@@ -92,9 +91,9 @@ namespace j3 {
 																	const vmkit::Name* name, 
 																	const vmkit::Name* sign);
 
-		size_t              llvmFunctionNameLength(J3Class* from=0);
 		char*               llvmFunctionName(J3Class* from=0);
 		char*               llvmDescriptorName(J3Class* from=0);
+		char*               llvmStubName(J3Class* from=0);
 		llvm::FunctionType* llvmType(J3Class* from=0);
 
 		void                postInitialise(uint32_t access, J3Attributes* attributes);
@@ -129,8 +128,8 @@ namespace j3 {
 		J3Value             invokeVirtual(J3ObjectHandle* obj, J3Value* args);
 		J3Value             invokeVirtual(J3ObjectHandle* obj, va_list va);
 
-		void*               fnPtr();
-		void*               functionPointerOrTrampoline();
+		uint8_t*            fnPtr();
+		uint8_t*            functionPointerOrTrampoline();
 
 		void                dump();
 	};

Modified: vmkit/branches/mcjit/include/j3/j3symbol.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3symbol.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3symbol.h (original)
+++ vmkit/branches/mcjit/include/j3/j3symbol.h Sun Dec 15 03:39:03 2013
@@ -6,7 +6,15 @@
 namespace j3 {
 	class J3Symbol : public vmkit::PermanentObject {
 	public:
-		uint64_t getSymbolAddress();
+		virtual uint8_t* getSymbolAddress();
+	};
+
+	class J3NativeSymbol : public J3Symbol {
+		uint8_t* addr;
+	public:
+		J3NativeSymbol(uint8_t* _addr) { addr = _addr; }
+
+		uint8_t* getSymbolAddress() { return addr; }
 	};
 };
 

Modified: vmkit/branches/mcjit/include/vmkit/util.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/util.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/util.h (original)
+++ vmkit/branches/mcjit/include/vmkit/util.h Sun Dec 15 03:39:03 2013
@@ -8,12 +8,17 @@ namespace vmkit {
 			bool operator()(const char* s1, const char* s2) const;
 		};
 
+		struct char_less_t_dbg {
+			bool operator()(const char* s1, const char* s2) const;
+		};
+
 		struct wchar_t_less_t {
 			bool operator()(const wchar_t* lhs, const wchar_t* rhs) const;
 		};
 
-		static struct char_less_t  char_less;
-		static struct wchar_t_less_t wchar_t_less;
+		static struct char_less_t     char_less;
+		static struct char_less_t_dbg char_less_dbg;
+		static struct wchar_t_less_t  wchar_t_less;
 	};
 };
 

Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Sun Dec 15 03:39:03 2013
@@ -9,7 +9,6 @@
 namespace llvm {
 	class LLVMContext;
 	class Module;
-	class ExecutionEngine;
 	class DataLayout;
 	class GlobalValue;
 	class Function;
@@ -55,13 +54,12 @@ namespace vmkit {
 		MangleMap                       mangleMap;
 		BumpAllocator*                  _allocator;
 		llvm::Module*                   _self;
-		llvm::ExecutionEngine*          _ee;
 		llvm::DataLayout*               _dataLayout;
 		void*                           ptrTypeInfo;
 
-		uintptr_t                  addSymbol(llvm::GlobalValue* gv);
+		void                       addSymbol(llvm::GlobalValue* gv);
 
-		static void defaultInternalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
+		static void                defaultInternalError(const wchar_t* msg, va_list va) __attribute__((noreturn));
 	protected:
 		void* operator new(size_t n, BumpAllocator* allocator);
 
@@ -77,7 +75,6 @@ namespace vmkit {
 		llvm::DataLayout*          dataLayout() { return _dataLayout; }
 		llvm::LLVMContext&         llvmContext();
 		llvm::Module*              self() { return _self; }
-		llvm::ExecutionEngine*     ee() { return _ee; }
 		llvm::FunctionPassManager* preparePM(llvm::Module* mod);
 		llvm::Function*            getGCRoot(llvm::Module* mod);
 		llvm::Function*            introspectFunction(llvm::Module* dest, const char* name);

Modified: vmkit/branches/mcjit/lib/j3/vm/j3class.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3class.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3class.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3class.cc Sun Dec 15 03:39:03 2013
@@ -30,6 +30,10 @@ J3Type::J3Type(J3ClassLoader* loader, co
 	_name = name; 
 }
 
+uint8_t* J3Type::getSymbolAddress() {
+	return (uint8_t*)this;
+}
+
 J3VirtualTable* J3Type::vt() { 
 	return _vt; 
 }
@@ -196,9 +200,7 @@ size_t J3Class::size() {
 }
 
 llvm::GlobalValue* J3Class::llvmDescriptor(llvm::Module* module) {
-	llvm::GlobalValue* res = llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3Class));
-	loader()->vm()->ee()->updateGlobalMapping(res, this);
-	return res;
+	return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3Class));
 }
 
 
@@ -734,10 +736,10 @@ void J3Class::createLLVMTypes() {
 	mangler.mangle("_2");
 		
 	_nativeNameLength = mangler.length() - 6;
-	_nativeName = (char*)loader()->allocator()->allocate(mangler.length() + 1);
+	_nativeName = (char*)loader()->allocator()->allocate(_nativeNameLength + 1);
 
 	_nativeName[0] = 'L';
-	memcpy(_nativeName + 1, mangler.cStr()+7, mangler.length());
+	memcpy(_nativeName + 1, mangler.cStr()+7, _nativeNameLength); /* copy the 0 */
 
 	loader()->addSymbol(_nativeName, this);
 }
@@ -832,9 +834,7 @@ void J3ArrayClass::doInitialise() {
 }
 
 llvm::GlobalValue* J3ArrayClass::llvmDescriptor(llvm::Module* module) {
-	llvm::GlobalValue* res = llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3ArrayClass));
-	loader()->vm()->ee()->updateGlobalMapping(res, this);
-	return res;
+	return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(nativeName(), loader()->vm()->typeJ3ArrayClass));
 }
 
 llvm::Type* J3ArrayClass::llvmType() {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3classloader.cc Sun Dec 15 03:39:03 2013
@@ -1,6 +1,9 @@
 #include <map>
 #include <dlfcn.h>
 
+#include "llvm/IR/Module.h"
+#include "llvm/ExecutionEngine/ExecutionEngine.h"
+
 #include "vmkit/allocator.h"
 
 #include "j3/j3classloader.h"
@@ -44,6 +47,27 @@ J3ClassLoader::J3ClassLoader(J3* v, J3Ob
 	pthread_mutex_init(&_mutexSymbolTable, 0);
 
 	_vm = v;
+
+	std::string err;
+	_ee = llvm::EngineBuilder(new llvm::Module("class-loader", vm()->llvmContext()))
+		.setUseMCJIT(1)
+		.setMCJITMemoryManager(this)
+		.setErrorStr(&err)
+		.create();
+
+	if (!ee())
+		vm()->internalError(L"Error while creating execution engine: %s\n", err.c_str());
+
+  ee()->RegisterJITEventListener(vm());
+
+	_oldee = llvm::EngineBuilder(new llvm::Module("old ee", vm()->llvmContext()))
+		.setErrorStr(&err)
+		.create();
+
+	if (!oldee())
+		vm()->internalError(L"Error while creating execution engine: %s\n", err.c_str());
+
+	oldee()->DisableLazyCompilation(0);
 }
 
 void J3ClassLoader::addSymbol(const char* id, J3Symbol* symbol) {
@@ -54,9 +78,25 @@ void J3ClassLoader::addSymbol(const char
 
 uint64_t J3ClassLoader::getSymbolAddress(const std::string &Name) {
 	pthread_mutex_lock(&_mutexSymbolTable);
-	J3Symbol* res = _symbolTable[Name.c_str()];
+	const char* id = Name.c_str() + 1;
+
+	std::map<const char*, J3Symbol*>::iterator it = _symbolTable.find(id);
+	J3Symbol* res;
+
+	if(it == _symbolTable.end()) {
+		uint8_t* addr = (uint8_t*)dlsym(RTLD_SELF, id);
+		if(!addr)
+			vm()->internalError(L"unable to resolve native symbol: %s", id);
+		res = new(allocator()) J3NativeSymbol(addr);
+		size_t len = strlen(id);
+		char* buf = (char*)allocator()->allocate(len+1);
+		memcpy(buf, id, len+1);
+		_symbolTable[buf] = res;
+	} else
+		res = it->second;
+
 	pthread_mutex_unlock(&_mutexSymbolTable);
-	return res->getSymbolAddress();
+	return (uint64_t)(uintptr_t)res->getSymbolAddress();
 }
 
 void* J3ClassLoader::lookupNativeFunctionPointer(J3Method* method, const char* symbol) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sun Dec 15 03:39:03 2013
@@ -612,7 +612,7 @@ void J3CodeGen::echoDebugEnter(uint32_t
 		fprintf(stderr, "%*s", prof, "");
 		if(isLeave)
 			prof -= J3Thread::get()->vm()->options()->debugEnterIndent;
-
+		
 		fprintf(stderr, "%s ", enter);
 		vfprintf(stderr, msg, va);
 		va_end(va);
@@ -631,6 +631,7 @@ void J3CodeGen::echoDebugExecute(uint32_
 void J3CodeGen::translate() {
 	if(vm->options()->debugTranslate) {
 		fprintf(stderr, "  translating bytecode of: %ls::%ls%ls\n", method->cl()->name()->cStr(), method->name()->cStr(), method->sign()->cStr());
+
 		if(vm->options()->debugTranslate > 1) {
 			fprintf(stderr, "    exception table:\n");
 			for(uint32_t i=0; i<nbExceptionNodes; i++) {

Modified: vmkit/branches/mcjit/lib/j3/vm/j3method.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3method.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3method.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3method.cc Sun Dec 15 03:39:03 2013
@@ -44,9 +44,7 @@ uint32_t J3Method::index()  {
 	return _index; 
 }
 
-void* J3Method::fnPtr() {
-	void* res;
-	
+uint8_t* J3Method::fnPtr() {
 	if(!_fnPtr) {
 		//fprintf(stderr, "materializing: %ls::%ls%ls\n", cl()->name()->cStr(), name()->cStr(), sign()->cStr());
 		if(!isResolved()) {
@@ -64,18 +62,27 @@ void* J3Method::fnPtr() {
 		J3CodeGen::translate(this, _llvmFunction);
 
 		cl()->loader()->vm()->preparePM(module)->run(*_llvmFunction); /* TODO, check memory */
-		llvm::ExecutionEngine* ee = cl()->loader()->vm()->ee();
+
+		llvm::ExecutionEngine* ee = cl()->loader()->ee();
 		ee->addModule(module);
-		_fnPtr = (uint8_t*)ee->recompileAndRelinkFunction(_llvmFunction);
+		_fnPtr = (uint8_t*)ee->getFunctionAddress(_llvmFunction->getName().data());
 	}
 
 	return _fnPtr;
 }
 
-void* J3Method::functionPointerOrTrampoline() {
+uint8_t* J3Method::functionPointerOrTrampoline() {
 	return _fnPtr ? _fnPtr : _trampoline;
 }
 
+uint8_t* J3MethodCode::getSymbolAddress() {
+	return self->functionPointerOrTrampoline();
+}
+
+uint8_t* J3Method::getSymbolAddress() {
+	return (uint8_t*)this;
+}
+
 void J3Method::setResolved(uint32_t index) { 
 	if(isResolved())
 		J3::internalError(L"trying to re-resolve a resolved method, should not happen");
@@ -183,7 +190,8 @@ J3Value J3Method::internalInvoke(bool st
 	}
 
 	target->fnPtr(); /* ensure that the function is compiled */
-	llvm::GenericValue res = cl()->loader()->vm()->ee()->runFunction(target->_llvmFunction, args);
+	cl()->loader()->oldee()->updateGlobalMapping(target->_llvmFunction, target->fnPtr());
+	llvm::GenericValue res = cl()->loader()->oldee()->runFunction(target->_llvmFunction, args);
 
 	J3Value holder;
 	cur = methodType()->out();
@@ -312,54 +320,42 @@ void J3Method::buildLLVMNames(J3Class* f
 
 	mangler.mangle(mangler.j3Id)->mangle(this)->mangleType(this);
 
-	_llvmAllNamesLength = mangler.length() + 18;
-	_llvmAllNames = (char*)cl()->loader()->allocator()->allocate(_llvmAllNamesLength + 1);
-	memcpy(_llvmAllNames, "method_descriptor_", 18);
-	memcpy(_llvmAllNames+18, mangler.cStr(), mangler.length());
-	_llvmAllNames[_llvmAllNamesLength] = 0;
-
-	cl()->loader()->addSymbol(_llvmAllNames, this);
-	cl()->loader()->addSymbol(_llvmAllNames+18, &_selfCode);
-}
-
-size_t J3Method::llvmFunctionNameLength(J3Class* from) {
-	llvmFunctionName(from);
-	return _llvmAllNamesLength - 18;
+	uint32_t length = mangler.length() + 5;
+	_llvmAllNames = (char*)cl()->loader()->allocator()->allocate(length + 1);
+	memcpy(_llvmAllNames, "stub_", 5);
+	memcpy(_llvmAllNames+5, mangler.cStr(), mangler.length());
+	_llvmAllNames[length] = 0;
+
+	cl()->loader()->addSymbol(_llvmAllNames,   &_selfCode);
+	cl()->loader()->addSymbol(_llvmAllNames+4, this);
+	cl()->loader()->addSymbol(_llvmAllNames+5, &_selfCode);
 }
 
 char* J3Method::llvmFunctionName(J3Class* from) {
 	if(!_llvmAllNames)
 		buildLLVMNames(from ? from : cl());
-	return _llvmAllNames + 18;
+	return _llvmAllNames + 5;
 }
 
 char* J3Method::llvmDescriptorName(J3Class* from) {
 	if(!_llvmAllNames)
 		buildLLVMNames(from ? from : cl());
+	return _llvmAllNames + 4;
+}
+
+char* J3Method::llvmStubName(J3Class* from) {
+	if(!_llvmAllNames)
+		buildLLVMNames(from ? from : cl());
 	return _llvmAllNames;
 }
 
 llvm::GlobalValue* J3Method::llvmDescriptor(llvm::Module* module) {
-	J3ClassLoader* loader = cl()->loader();
-	llvm::GlobalValue* res = llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(llvmDescriptorName(), loader->vm()->typeJ3Method));
-	loader->vm()->ee()->updateGlobalMapping(res, this);
-	return res;
+	return llvm::cast<llvm::GlobalValue>(module->getOrInsertGlobal(llvmDescriptorName(), cl()->loader()->vm()->typeJ3Method));
 }
 
 llvm::Function* J3Method::llvmFunction(bool isStub, llvm::Module* module, J3Class* from) {
-	llvm::Function* res;
-
-	if(isStub) {
-		char id[llvmFunctionNameLength() + 16];
-		memcpy(id, llvmFunctionName(), llvmFunctionNameLength());
-		memcpy(id + llvmFunctionNameLength(), "_stub", 6);
-		res = (llvm::Function*)module->getOrInsertFunction(id, methodType(from ? from : cl())->llvmType());
-	} else
-		res = (llvm::Function*)module->getOrInsertFunction(llvmFunctionName(from), methodType(from ? from : cl())->llvmType());
-
-	cl()->loader()->vm()->ee()->updateGlobalMapping(res, functionPointerOrTrampoline());
-
-	return res;
+	const char* id = (isStub && !_fnPtr) ? llvmStubName(from) : llvmFunctionName(from);
+	return (llvm::Function*)module->getOrInsertFunction(id, methodType(from ? from : cl())->llvmType());
 }
 
 void J3Method::dump() {
@@ -416,13 +412,16 @@ llvm::Function* J3Method::nativeLLVMFunc
 
 	nativeOut = doNativeType(type->out());
 
+	char* buf = (char*)cl()->loader()->allocator()->allocate(mangler.length()+1);
+	memcpy(buf, mangler.cStr(), mangler.length()+1);
+
 	llvm::FunctionType* fType = llvm::FunctionType::get(nativeOut, nativeIns, 0);
 	llvm::Function* res = llvm::Function::Create(fType,
 																							 llvm::GlobalValue::ExternalLinkage,
-																							 mangler.cStr(),
+																							 buf,
 																							 module);
 
-	loader->vm()->ee()->addGlobalMapping(res, fnPtr);
+	cl()->loader()->addSymbol(buf, new(cl()->loader()->allocator()) J3NativeSymbol((uint8_t*)fnPtr));
 
 	return res;
 }

Modified: vmkit/branches/mcjit/lib/j3/vm/j3options.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3options.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3options.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3options.cc Sun Dec 15 03:39:03 2013
@@ -18,8 +18,8 @@ J3Options::J3Options() {
 	debugLoad = 0;
 	debugResolve = 0;
 	debugIniting = 0;
-	debugTranslate = 1;
-	debugLinking = 1;
+	debugTranslate = 0;
+	debugLinking = 0;
 }
 
 #define nyi(cmd) ({ fprintf(stderr, "option '%s' not yet implemented\n", cmd); })

Modified: vmkit/branches/mcjit/lib/j3/vm/j3symbol.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3symbol.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3symbol.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3symbol.cc Sun Dec 15 03:39:03 2013
@@ -4,6 +4,6 @@
 
 using namespace j3;
 
-uint64_t J3Symbol::getSymbolAddress() {
+uint8_t* J3Symbol::getSymbolAddress() {
 	J3Thread::get()->vm()->internalError(L"implement me: getSymbolAddress");
 }

Modified: vmkit/branches/mcjit/lib/vmkit/util.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/util.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/util.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/util.cc Sun Dec 15 03:39:03 2013
@@ -5,11 +5,18 @@
 
 using namespace vmkit;
 
-struct Util::char_less_t    Util::char_less;
-struct Util::wchar_t_less_t Util::wchar_t_less;
+struct Util::char_less_t     Util::char_less;
+struct Util::char_less_t_dbg Util::char_less_dbg;
+struct Util::wchar_t_less_t  Util::wchar_t_less;
 
-bool Util::char_less_t::operator()(const char* s1, const char* s2) const {
-	return strcmp(s1, s2) < 0; 
+bool Util::char_less_t::operator()(const char* lhs, const char* rhs) const {
+	//printf("Compare: %s - %s - %d\n", lhs, rhs, strcmp(lhs, rhs));
+	return strcmp(lhs, rhs) < 0; 
+}
+
+bool Util::char_less_t_dbg::operator()(const char* lhs, const char* rhs) const {
+	printf("Compare: %s - %s - %d\n", lhs, rhs, strcmp(lhs, rhs));
+	return strcmp(lhs, rhs) < 0; 
 }
 
 bool Util::wchar_t_less_t::operator()(const wchar_t* lhs, const wchar_t* rhs) const {

Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=197333&r1=197332&r2=197333&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sun Dec 15 03:39:03 2013
@@ -32,6 +32,9 @@ using namespace vmkit;
 VMKit::VMKit(vmkit::BumpAllocator* allocator) :
 	mangleMap(Util::char_less, allocator) {
 	llvm::InitializeNativeTarget();
+	llvm::InitializeNativeTargetAsmPrinter();
+	llvm::InitializeNativeTargetAsmParser();
+	llvm::InitializeNativeTargetDisassembler();
 	llvm::llvm_start_multithreaded();
 	_allocator = allocator;
 }
@@ -60,35 +63,27 @@ llvm::Function* VMKit::introspectFunctio
 	if(!orig)
 		internalError(L"unable to find internal function: %s", name);
 
-	return orig;
-	//	return (llvm::Function*)dest->getOrInsertFunction(orig->getName(), orig->getFunctionType());
+	return (llvm::Function*)dest->getOrInsertFunction(orig->getName(), orig->getFunctionType());
 }
 
 llvm::GlobalValue* VMKit::introspectGlobalValue(llvm::Module* dest, const char* name) {
-	llvm::GlobalValue* res = mangleMap[name];
-	if(!res)
+	llvm::GlobalValue* orig = mangleMap[name];
+	if(!orig)
 		internalError(L"unable to find internal global value: %s", name);
-	return res;
+	return (llvm::GlobalValue*)dest->getOrInsertGlobal(orig->getName(), orig->getType());
 }
 
-uintptr_t VMKit::addSymbol(llvm::GlobalValue* gv) {
+void VMKit::addSymbol(llvm::GlobalValue* gv) {
 	const char* id = gv->getName().data();
-	void* ptr = dlsym(RTLD_SELF, id);
-
-	if(ptr) {
-		ee()->updateGlobalMapping(gv, ptr);
-		int   status;
-		char* realname;
-		realname = abi::__cxa_demangle(id, 0, 0, &status);
-		const char* tmp = realname ? realname : id;
-		uint32_t length = strlen(tmp);
-		char* mangled = (char*)allocator()->allocate(length+1);
-		strcpy(mangled, tmp);
-		mangleMap[mangled] = gv;
-		free(realname);
-		return (uintptr_t)ptr;
-	} else
-		return 0;
+	int   status;
+	char* realname;
+	realname = abi::__cxa_demangle(id, 0, 0, &status);
+	const char* tmp = realname ? realname : id;
+	uint32_t length = strlen(tmp);
+	char* mangled = (char*)allocator()->allocate(length+1);
+	strcpy(mangled, tmp);
+	mangleMap[mangled] = gv;
+	free(realname);
 }
 
 void VMKit::vmkitBootstrap(Thread* initialThread, const char* selfBitCodePath) {
@@ -103,13 +98,6 @@ void VMKit::vmkitBootstrap(Thread* initi
 	if(!self())
 		VMKit::internalError(L"Error while reading bitcode file %s: %s\n", selfBitCodePath, err.c_str());
 
-	_ee = llvm::EngineBuilder(self()).setErrorStr(&err).create();
-	if (!ee())
-		VMKit::internalError(L"Error while creating execution engine: %s\n", err.c_str());
-
-	ee()->DisableLazyCompilation(0);
-  ee()->RegisterJITEventListener(this);
-
 	for(llvm::Module::iterator cur=self()->begin(); cur!=self()->end(); cur++)
 		addSymbol(cur);
 
@@ -118,19 +106,11 @@ void VMKit::vmkitBootstrap(Thread* initi
 
 	_dataLayout = new llvm::DataLayout(self());
 
-	ptrTypeInfo = ee()->getPointerToGlobal(introspectGlobalValue(self(), "typeinfo for void*"));
+	llvm::GlobalValue* typeInfoGV = mangleMap["typeinfo for void*"];
+	ptrTypeInfo = typeInfoGV ? dlsym(RTLD_SELF, typeInfoGV->getName().data()) : 0;
 
 	if(!ptrTypeInfo)
 		internalError(L"unable to find typeinfo for void*"); 
-
-#if 0
-	llvm::Linker* linker = new llvm::Linker(new llvm::Module("linker", vm()->self()->getContext()));
-	std::string err;
-	if(linker->linkInModule(vm()->self(), llvm::Linker::PreserveSource, &err))
-		J3::internalError(L"unable to add self to linker: %s", err.c_str());
-	if(linker->linkInModule(module(), llvm::Linker::PreserveSource, &err))
-		J3::internalError(L"unable to add module to linker: %s", err.c_str());
-#endif
 }
 
 





More information about the vmkit-commits mailing list