X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmini%2Fmini-llvm-cpp.cpp;h=f894a7721648c58e1f40e1f0556a192aec0923c6;hb=42456cda16079486cbeaa7af7c4f370745bc5321;hp=f11db19bc9620eabc37089ab0ddecd5f7fb1f77d;hpb=6733010353a6024a2b437a6cd5c5c30ae6e99218;p=mono.git diff --git a/mono/mini/mini-llvm-cpp.cpp b/mono/mini/mini-llvm-cpp.cpp index f11db19bc96..f894a772164 100644 --- a/mono/mini/mini-llvm-cpp.cpp +++ b/mono/mini/mini-llvm-cpp.cpp @@ -32,19 +32,11 @@ #include #include #include -#if LLVM_API_VERSION >= 1 #include -#else -#include -#endif #include #include #include -#if LLVM_API_VERSION >= 1 #include "llvm/IR/LegacyPassNameParser.h" -#else -#include "llvm/Support/PassNameParser.h" -#endif #include "llvm/Support/PrettyStackTrace.h" #include #include @@ -77,6 +69,7 @@ public: /* Callbacks installed by mono */ AllocCodeMemoryCb *alloc_cb; DlSymCb *dlsym_cb; + ExceptionTableCb *exception_cb; MonoJITMemoryManager (); ~MonoJITMemoryManager (); @@ -240,6 +233,7 @@ MonoJITMemoryManager::endExceptionTable(const Function *F, unsigned char *TableS unsigned char *TableEnd, unsigned char* FrameRegister) { + exception_cb (FrameRegister); } #else @@ -261,20 +255,6 @@ public: virtual void NotifyFunctionEmitted(const Function &F, void *Code, size_t Size, const EmittedFunctionDetails &Details) { - /* - * X86TargetMachine::setCodeModelForJIT() sets the code model to Large on amd64, - * which means the JIT will generate calls of the form - * mov reg, - * call *reg - * Our trampoline code can't patch this. Passing CodeModel::Small to createJIT - * doesn't seem to work, we need Default. A discussion is here: - * http://lists.cs.uiuc.edu/pipermail/llvmdev/2009-December/027999.html - * There seems to no way to get the TargeMachine used by an EE either, so we - * install a profiler hook and reset the code model here. - * This should be inside an ifdef, but we can't include our config.h either, - * since its definitions conflict with LLVM's config.h. - * The LLVM mono branch contains a workaround. - */ emitted_cb (wrap (&F), Code, (char*)Code + Size); } }; @@ -391,11 +371,7 @@ mono_llvm_build_cmpxchg (LLVMBuilderRef builder, LLVMValueRef ptr, LLVMValueRef { AtomicCmpXchgInst *ins; -#if LLVM_API_VERSION >= 1 ins = unwrap(builder)->CreateAtomicCmpXchg (unwrap(ptr), unwrap (cmp), unwrap (val), SequentiallyConsistent, SequentiallyConsistent); -#else - ins = unwrap(builder)->CreateAtomicCmpXchg (unwrap(ptr), unwrap (cmp), unwrap (val), SequentiallyConsistent); -#endif return wrap (ins); } @@ -448,6 +424,14 @@ mono_llvm_build_fence (LLVMBuilderRef builder, BarrierKind kind) return wrap (ins); } +void +mono_llvm_set_must_tail (LLVMValueRef call_ins) +{ + CallInst *ins = (CallInst*)unwrap (call_ins); + + ins->setTailCallKind (CallInst::TailCallKind::TCK_MustTail); +} + void mono_llvm_replace_uses_of (LLVMValueRef var, LLVMValueRef v) { @@ -455,6 +439,18 @@ mono_llvm_replace_uses_of (LLVMValueRef var, LLVMValueRef v) unwrap (var)->replaceAllUsesWith (V); } +LLVMValueRef +mono_llvm_create_constant_data_array (const uint8_t *data, int len) +{ + return wrap(ConstantDataArray::get (*unwrap(LLVMGetGlobalContext ()), makeArrayRef(data, len))); +} + +void +mono_llvm_set_is_constant (LLVMValueRef global_var) +{ + unwrap(global_var)->setConstant (true); +} + static cl::list PassList(cl::desc("Optimizations available:")); @@ -635,6 +631,7 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func MonoJITMemoryManager *mono_mm = new MonoJITMemoryManager (); mono_mm->alloc_cb = alloc_cb; mono_mm->dlsym_cb = dlsym_cb; + mono_mm->exception_cb = exception_cb; mono_ee->mm = mono_mm; /* @@ -646,38 +643,16 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func TargetOptions opts; opts.JITExceptionHandling = 1; -#if LLVM_API_VERSION >= 2 StringRef cpu_name = sys::getHostCPUName (); // EngineBuilder no longer has a copy assignment operator (?) std::unique_ptr Owner(unwrap(MP)); EngineBuilder b (std::move(Owner)); -#ifdef TARGET_AMD64 - ExecutionEngine *EE = b.setJITMemoryManager (mono_mm).setTargetOptions (opts).setAllocateGVsWithCode (true).setMCPU (cpu_name).setCodeModel (CodeModel::Large).create (); -#else ExecutionEngine *EE = b.setJITMemoryManager (mono_mm).setTargetOptions (opts).setAllocateGVsWithCode (true).setMCPU (cpu_name).create (); -#endif - -#else - - EngineBuilder b (unwrap (MP)); - EngineBuilder &eb = b; - eb = eb.setJITMemoryManager (mono_mm).setTargetOptions (opts).setAllocateGVsWithCode (true); -#if LLVM_API_VERSION >= 1 - StringRef cpu_name = sys::getHostCPUName (); - eb = eb.setMCPU (cpu_name); -#endif -#ifdef TARGET_AMD64 - eb = eb.setCodeModel (CodeModel::Large); -#endif - - ExecutionEngine *EE = eb.create (); -#endif g_assert (EE); mono_ee->EE = EE; - EE->InstallExceptionTableRegister (exception_cb); MonoJITEventListener *listener = new MonoJITEventListener (emitted_cb); EE->RegisterJITEventListener (listener); mono_ee->listener = listener; @@ -685,11 +660,7 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func FunctionPassManager *fpm = new FunctionPassManager (unwrap (MP)); mono_ee->fpm = fpm; -#if LLVM_API_VERSION >= 1 fpm->add(new DataLayoutPass(*EE->getDataLayout())); -#else - fpm->add(new DataLayout(*EE->getDataLayout())); -#endif if (PassList.size() > 0) { /* Use the passes specified by the env variable */