[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