[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