[sgen] Move the independent parts of SGen to a separate library.
[mono.git] / mono / mini / mini-llvm-cpp.cpp
index f11db19bc9620eabc37089ab0ddecd5f7fb1f77d..ad20bbd37f664c94e8b51f3790245cc4dd564e43 100644 (file)
 #include <llvm/ExecutionEngine/JITEventListener.h>
 #include <llvm/Target/TargetOptions.h>
 #include <llvm/Target/TargetRegisterInfo.h>
-#if LLVM_API_VERSION >= 1
 #include <llvm/IR/Verifier.h>
-#else
-#include <llvm/Analysis/Verifier.h>
-#endif
 #include <llvm/Analysis/Passes.h>
 #include <llvm/Transforms/Scalar.h>
 #include <llvm/Support/CommandLine.h>
-#if LLVM_API_VERSION >= 1
 #include "llvm/IR/LegacyPassNameParser.h"
-#else
-#include "llvm/Support/PassNameParser.h"
-#endif
 #include "llvm/Support/PrettyStackTrace.h"
 #include <llvm/CodeGen/Passes.h>
 #include <llvm/CodeGen/MachineFunctionPass.h>
@@ -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, <imm>
-                * 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);
 }
 
@@ -635,6 +611,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,7 +623,6 @@ 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 (?)
@@ -658,26 +634,9 @@ mono_llvm_create_ee (LLVMModuleProviderRef MP, AllocCodeMemoryCb *alloc_cb, Func
   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 +644,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 */