X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fllvm-jit.cpp;h=e09d72e9192f97b23ef69eb35c1e97ee6d66b831;hb=HEAD;hp=7fef6b85cb9741b955d701ae1082822fea5cca66;hpb=1c385f99e1c5e5c76e03c49e838ac29739a2e9e2;p=mono.git diff --git a/mono/mini/llvm-jit.cpp b/mono/mini/llvm-jit.cpp index 7fef6b85cb9..e09d72e9192 100644 --- a/mono/mini/llvm-jit.cpp +++ b/mono/mini/llvm-jit.cpp @@ -27,12 +27,20 @@ #include #include #include +#include #include #include "llvm/ExecutionEngine/Orc/CompileUtils.h" #include "llvm/ExecutionEngine/Orc/IRCompileLayer.h" #include "llvm/ExecutionEngine/Orc/LambdaResolver.h" +#if LLVM_API_VERSION >= 500 +#include "llvm/ExecutionEngine/RTDyldMemoryManager.h" +#include "llvm/ExecutionEngine/Orc/RTDyldObjectLinkingLayer.h" +#include "llvm/ExecutionEngine/JITSymbol.h" +#else #include "llvm/ExecutionEngine/Orc/ObjectLinkingLayer.h" -#include "llvm/ExecutionEngine/Orc/OrcArchitectureSupport.h" +#endif + +#include extern "C" { #include @@ -64,24 +72,101 @@ void bzero (void *to, size_t count) { memset (to, 0, count); } #endif +static AllocCodeMemoryCb *alloc_code_mem_cb; + +class MonoJitMemoryManager : public RTDyldMemoryManager +{ +public: + ~MonoJitMemoryManager() override; + + uint8_t *allocateDataSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName, + bool IsReadOnly) override; + + uint8_t *allocateCodeSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName) override; + + bool finalizeMemory(std::string *ErrMsg = nullptr) override; +}; + +MonoJitMemoryManager::~MonoJitMemoryManager() +{ +} + +uint8_t * +MonoJitMemoryManager::allocateDataSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName, + bool IsReadOnly) { + uint8_t *res = (uint8_t*)malloc (Size); + assert (res); + memset (res, 0, Size); + return res; +} + +uint8_t * +MonoJitMemoryManager::allocateCodeSection(uintptr_t Size, + unsigned Alignment, + unsigned SectionID, + StringRef SectionName) +{ + return alloc_code_mem_cb (NULL, Size); +} + +bool +MonoJitMemoryManager::finalizeMemory(std::string *ErrMsg) +{ + return false; +} + class MonoLLVMJIT { public: /* We use our own trampoline infrastructure instead of the Orc one */ +#if LLVM_API_VERSION >= 500 + typedef RTDyldObjectLinkingLayer ObjLayerT; + typedef IRCompileLayer CompileLayerT; + typedef CompileLayerT::ModuleHandleT ModuleHandleT; +#else typedef ObjectLinkingLayer<> ObjLayerT; typedef IRCompileLayer CompileLayerT; typedef CompileLayerT::ModuleSetHandleT ModuleHandleT; +#endif - MonoLLVMJIT (TargetMachine *TM) + MonoLLVMJIT (TargetMachine *TM, MonoJitMemoryManager *mm) +#if LLVM_API_VERSION >= 500 + : TM(TM), ObjectLayer([=] { return std::shared_ptr (mm); }), +#else : TM(TM), - CompileLayer (ObjectLayer, SimpleCompiler (*TM)) { +#endif + CompileLayer (ObjectLayer, SimpleCompiler (*TM)), + modules() { } - ModuleHandleT addModule(Module *M) { +#if LLVM_API_VERSION >= 500 + ModuleHandleT addModule(Function *F, std::shared_ptr M) { +#else + ModuleHandleT addModule(Function *F, Module *M) { +#endif auto Resolver = createLambdaResolver( [&](const std::string &Name) { const char *name = Name.c_str (); - if (!strcmp (name, "___bzero")) - return RuntimeDyld::SymbolInfo((uint64_t)(gssize)(void*)bzero, (JITSymbolFlags)0); +#if LLVM_API_VERSION >= 500 + JITSymbolFlags flags = JITSymbolFlags (); +#else + JITSymbolFlags flags = (JITSymbolFlags)0; +#endif + if (!strcmp (name, "___bzero")) { +#if LLVM_API_VERSION >= 500 + return JITSymbol((uint64_t)(gssize)(void*)bzero, flags); +#else + return RuntimeDyld::SymbolInfo((uint64_t)(gssize)(void*)bzero, flags); +#endif + } MonoDl *current; char *err; @@ -96,7 +181,11 @@ public: if (!symbol) outs () << "R: " << Name << "\n"; assert (symbol); - return RuntimeDyld::SymbolInfo((uint64_t)(gssize)symbol, (JITSymbolFlags)0); +#if LLVM_API_VERSION >= 500 + return JITSymbol((uint64_t)(gssize)symbol, flags); +#else + return RuntimeDyld::SymbolInfo((uint64_t)(gssize)symbol, flags); +#endif }, [](const std::string &S) { outs () << "R2: " << S << "\n"; @@ -104,9 +193,15 @@ public: return nullptr; } ); +#if LLVM_API_VERSION >= 500 + ModuleHandleT m = CompileLayer.addModule(M, + std::move(Resolver)); + return m; +#else return CompileLayer.addModuleSet(singletonSet(M), - make_unique(), + make_unique(), std::move(Resolver)); +#endif } std::string mangle(const std::string &Name) { @@ -132,8 +227,14 @@ public: gpointer compile (Function *F, int nvars, LLVMValueRef *callee_vars, gpointer *callee_addrs, gpointer *eh_frame) { F->getParent ()->setDataLayout (TM->createDataLayout ()); - auto ModuleHandle = addModule (F->getParent ()); - +#if LLVM_API_VERSION >= 500 + // Orc uses a shared_ptr to refer to modules so we have to save them ourselves to keep a ref + std::shared_ptr m (F->getParent ()); + modules.push_back (m); + auto ModuleHandle = addModule (F, m); +#else + auto ModuleHandle = addModule (F, F->getParent ()); +#endif auto BodySym = CompileLayer.findSymbolIn(ModuleHandle, mangle (F), false); auto BodyAddr = BodySym.getAddress(); assert (BodyAddr); @@ -159,13 +260,17 @@ private: TargetMachine *TM; ObjLayerT ObjectLayer; CompileLayerT CompileLayer; + std::vector> modules; }; static MonoLLVMJIT *jit; +static MonoJitMemoryManager *mono_mm; MonoEERef mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, FunctionEmittedCb *emitted_cb, ExceptionTableCb *exception_cb, DlSymCb *dlsym_cb, LLVMExecutionEngineRef *ee) { + alloc_code_mem_cb = alloc_cb; + InitializeNativeTarget (); InitializeNativeTargetAsmPrinter(); @@ -183,7 +288,8 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func auto TM = EB.selectTarget (); assert (TM); - jit = new MonoLLVMJIT (TM); + mono_mm = new MonoJitMemoryManager (); + jit = new MonoLLVMJIT (TM, mono_mm); return NULL; } @@ -474,7 +580,11 @@ static void force_pass_linking (void) { // Make sure the rest is linked in, but never executed - if (g_getenv ("FOO") != (char*)-1) + char *foo = g_getenv ("FOO"); + gboolean ret = (foo != (char*)-1); + g_free (foo); + + if (ret) return; // This is a subset of the passes in LinkAllPasses.h @@ -760,6 +870,13 @@ mono_llvm_optimize_method (MonoEERef eeref, LLVMValueRef method) g_assert_not_reached (); } +gpointer +mono_llvm_compile_method (MonoEERef mono_ee, LLVMValueRef method, int nvars, LLVMValueRef *callee_vars, gpointer *callee_addrs, gpointer *eh_frame) +{ + g_assert_not_reached (); + return NULL; +} + void mono_llvm_dispose_ee (MonoEERef *eeref) {