[vmkit-commits] [vmkit] r198134 - replicate the code to load the runtime bc file from vmkit to a compilation unit
Gael Thomas
gael.thomas at lip6.fr
Sat Dec 28 14:57:01 PST 2013
Author: gthomas
Date: Sat Dec 28 16:57:01 2013
New Revision: 198134
URL: http://llvm.org/viewvc/llvm-project?rev=198134&view=rev
Log:
replicate the code to load the runtime bc file from vmkit to a compilation unit
Modified:
vmkit/branches/mcjit/include/vmkit/compiler.h
vmkit/branches/mcjit/include/vmkit/vmkit.h
vmkit/branches/mcjit/lib/vmkit/compiler.cc
vmkit/branches/mcjit/lib/vmkit/vmkit.cc
vmkit/branches/mcjit/tools/vmkit-extract/main.cc
Modified: vmkit/branches/mcjit/include/vmkit/compiler.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/compiler.h?rev=198134&r1=198133&r2=198134&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/compiler.h (original)
+++ vmkit/branches/mcjit/include/vmkit/compiler.h Sat Dec 28 16:57:01 2013
@@ -9,6 +9,7 @@
namespace llvm {
class Module;
class ExecutionEngine;
+ class GlobalValue;
namespace legacy {
class PassManager;
@@ -34,16 +35,21 @@ namespace vmkit {
};
class CompilationUnit : public llvm::SectionMemoryManager {
+ typedef std::map<const char*, llvm::GlobalValue*, Util::char_less_t,
+ StdAllocator<std::pair<const char*, llvm::GlobalValue*> > > MangleMap;
typedef std::map<const char*, Symbol*, Util::char_less_t, StdAllocator<std::pair<const char*, Symbol*> > > SymbolMap;
VMKit* _vmkit;
BumpAllocator* _allocator;
+ MangleMap _mangleMap;
SymbolMap _symbolTable;
pthread_mutex_t _mutexSymbolTable;
llvm::ExecutionEngine* _ee;
llvm::ExecutionEngine* _oldee;
llvm::PassManager* pm;
+ void addSymbol(llvm::GlobalValue* gv);
+
protected:
void operator delete(void* self);
Modified: vmkit/branches/mcjit/include/vmkit/vmkit.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/vmkit/vmkit.h?rev=198134&r1=198133&r2=198134&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/vmkit/vmkit.h (original)
+++ vmkit/branches/mcjit/include/vmkit/vmkit.h Sat Dec 28 16:57:01 2013
@@ -25,6 +25,7 @@ namespace vmkit {
pthread_mutex_t safepointMapLock;
MangleMap mangleMap;
BumpAllocator* _allocator;
+ const char* _selfBitCodePath;
llvm::Module* _self;
llvm::DataLayout* _dataLayout;
void* ptrTypeInfo;
@@ -40,6 +41,8 @@ namespace vmkit {
VMKit(BumpAllocator* allocator);
+ const char* selfBitCodePath() { return _selfBitCodePath; }
+
void addSafepoint(Safepoint* sf);
Safepoint* getSafepoint(void* addr);
Modified: vmkit/branches/mcjit/lib/vmkit/compiler.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/compiler.cc?rev=198134&r1=198133&r2=198134&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/compiler.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/compiler.cc Sat Dec 28 16:57:01 2013
@@ -13,6 +13,8 @@
#include "llvm/ExecutionEngine/MCJIT.h"
#include "llvm/ExecutionEngine/JIT.h"
+#include "llvm/Bitcode/ReaderWriter.h"
+
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
@@ -31,17 +33,43 @@ void* CompilationUnit::operator new(size
void CompilationUnit::operator delete(void* self) {
}
+#include <sys/time.h>
+
CompilationUnit::CompilationUnit(BumpAllocator* allocator, VMKit* vmkit, const char* id) :
+ _mangleMap(Util::char_less, allocator),
_symbolTable(vmkit::Util::char_less, allocator) {
_allocator = allocator;
pthread_mutex_init(&_mutexSymbolTable, 0);
_vmkit = vmkit;
+ std::string err;
+
+ struct timeval start, end;
+ gettimeofday(&start, 0);
+
+ llvm::LLVMContext* context = new llvm::LLVMContext();
+ llvm::OwningPtr<llvm::MemoryBuffer> buf;
+ if (llvm::MemoryBuffer::getFile(vm()->selfBitCodePath(), buf))
+ VMKit::internalError(L"Error while opening bitcode file %s", vm()->selfBitCodePath());
+ llvm::Module* module = llvm::getLazyBitcodeModule(buf.take(), *context, &err);
+
+ if(!module)
+ VMKit::internalError(L"Error while reading bitcode file %s: %s", vm()->selfBitCodePath(), err.c_str());
+
+ for(llvm::Module::iterator cur=module->begin(); cur!=module->end(); cur++)
+ addSymbol(cur);
+
+ for(llvm::Module::global_iterator cur=module->global_begin(); cur!=module->global_end(); cur++)
+ addSymbol(cur);
+
+ gettimeofday(&end, 0);
+ double d = start.tv_sec*1. + start.tv_usec*1e-6 - end.tv_sec*1. -end.tv_usec*1e-6;
+ fprintf(stderr, " took: %lf\n", d);
+
llvm::TargetOptions opt;
opt.NoFramePointerElim = 1;
- std::string err;
_ee = llvm::EngineBuilder(new llvm::Module(id, Thread::get()->vm()->llvmContext()))
.setUseMCJIT(1)
.setMCJITMemoryManager(this)
@@ -112,6 +140,19 @@ CompilationUnit::~CompilationUnit() {
delete _oldee;
}
+void CompilationUnit::addSymbol(llvm::GlobalValue* gv) {
+ const char* id = gv->getName().data();
+ 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 CompilationUnit::destroy(CompilationUnit* unit) {
delete unit;
BumpAllocator::destroy(unit->allocator());
Modified: vmkit/branches/mcjit/lib/vmkit/vmkit.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/vmkit/vmkit.cc?rev=198134&r1=198133&r2=198134&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/vmkit/vmkit.cc (original)
+++ vmkit/branches/mcjit/lib/vmkit/vmkit.cc Sat Dec 28 16:57:01 2013
@@ -100,7 +100,9 @@ void VMKit::addSymbol(llvm::GlobalValue*
}
void VMKit::vmkitBootstrap(Thread* initialThread, const char* selfBitCodePath) {
+ _selfBitCodePath = selfBitCodePath;
std::string err;
+
llvm::OwningPtr<llvm::MemoryBuffer> buf;
if (llvm::MemoryBuffer::getFile(selfBitCodePath, buf))
VMKit::internalError(L"Error while opening bitcode file %s", selfBitCodePath);
Modified: vmkit/branches/mcjit/tools/vmkit-extract/main.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/tools/vmkit-extract/main.cc?rev=198134&r1=198133&r2=198134&view=diff
==============================================================================
--- vmkit/branches/mcjit/tools/vmkit-extract/main.cc (original)
+++ vmkit/branches/mcjit/tools/vmkit-extract/main.cc Sat Dec 28 16:57:01 2013
@@ -49,8 +49,8 @@ int main(int argc, char** argv) {
for(llvm::Module::iterator cur=module->begin(); cur!=module->end(); cur++)
add(mangler, cur);
- for(llvm::Module::global_iterator cur=module->global_begin(); cur!=module->global_end(); cur++)
- add(mangler, cur);
+ // for(llvm::Module::global_iterator cur=module->global_begin(); cur!=module->global_end(); cur++)
+ // add(mangler, cur);
FILE* fp = fopen(argv[2], "r");
size_t linecapp = 0;
More information about the vmkit-commits
mailing list