diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 099116c..9526227 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -61,6 +61,8 @@ #include #endif +#include + #include #include #include @@ -305,7 +307,11 @@ namespace gbe { //the first byte stands for binary_type. binary_content.assign(binary+1, size-1); llvm::StringRef llvm_bin_str(binary_content); +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9 + llvm::LLVMContext c; +#else llvm::LLVMContext& c = llvm::getGlobalContext(); +#endif llvm::SMDiagnostic Err; #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6 std::unique_ptr memory_buffer = llvm::MemoryBuffer::getMemBuffer(llvm_bin_str, "llvm_bin_str"); @@ -460,7 +466,9 @@ namespace gbe { llvm::Module* src = (llvm::Module*)((GenProgram*)src_program)->module; llvm::Module* dst = (llvm::Module*)((GenProgram*)dst_program)->module; -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9 + if (llvm::Linker::linkModules(*dst, std::unique_ptr(src), 0)) { +#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 7 if (LLVMLinkModules(wrap(dst), wrap(src), LLVMLinkerPreserveSource_Removed, &errMsg)) { #else if (LLVMLinkModules(wrap(dst), wrap(src), LLVMLinkerPreserveSource, &errMsg)) { diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 60a7dcf..0ba5e72 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -982,7 +982,12 @@ namespace gbe { //FIXME: if use new allocated context to link two modules there would be context mismatch //for some functions, so we use global context now, need switch to new context later. llvm::Module * out_module; +#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR > 8) + llvm::LLVMContext llvm_context; + llvm::LLVMContext* llvm_ctx = &llvm_context; +#else llvm::LLVMContext* llvm_ctx = &llvm::getGlobalContext(); +#endif if (buildModuleFromSource(source, &out_module, llvm_ctx, dumpLLVMFileName, dumpSPIRBinaryName, clOpt, stringSize, err, errSize)) { diff --git a/backend/src/llvm/llvm_bitcode_link.cpp b/backend/src/llvm/llvm_bitcode_link.cpp index 5f087f8..13ff8b2 100644 --- a/backend/src/llvm/llvm_bitcode_link.cpp +++ b/backend/src/llvm/llvm_bitcode_link.cpp @@ -27,6 +27,9 @@ #include "llvm_includes.hpp" #include "llvm/llvm_gen_backend.hpp" +#include +#include + using namespace llvm; SVAR(OCL_BITCODE_LIB_PATH, OCL_BITCODE_BIN); @@ -262,12 +265,17 @@ namespace gbe if(clonedLib->getDataLayout() != mod->getDataLayout()) mod->setDataLayout(clonedLib->getDataLayout()); +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9 + if(Linker::linkModules(*clonedLib, std::unique_ptr(mod), 0)) { +#else /* We use beignet's bitcode as dst because it will have a lot of lazy functions which will not be loaded. */ char* errorMsg; if(LLVMLinkModules(wrap(clonedLib), wrap(mod), LLVMLinkerDestroySource, &errorMsg)) { - delete clonedLib; printf("Fatal Error: link the bitcode error:\n%s\n", errorMsg); +#endif + + delete clonedLib; return NULL; } #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >=7 @@ -276,7 +284,11 @@ namespace gbe llvm::PassManager passes; #endif +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9 + passes.add(createInternalizePass([](const GlobalValue &){ return true; })); +#else passes.add(createInternalizePass(kernels)); +#endif passes.add(createGlobalDCEPass()); passes.run(*clonedLib); diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp index 653fc09..25884ae 100644 --- a/backend/src/llvm/llvm_to_gen.cpp +++ b/backend/src/llvm/llvm_to_gen.cpp @@ -37,6 +37,9 @@ #include #include +#include +#include + namespace gbe { BVAR(OCL_OUTPUT_CFG, false); @@ -140,7 +143,9 @@ namespace gbe MPM.add(createBarrierNodupPass(false)); // remove noduplicate fnAttr before inlining. MPM.add(createFunctionInliningPass(20000)); MPM.add(createBarrierNodupPass(true)); // restore noduplicate fnAttr after inlining. -#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8 +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 9 + MPM.add(createPostOrderFunctionAttrsLegacyPass()); // Set readonly/readnone attrs +#elif LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 8 MPM.add(createPostOrderFunctionAttrsPass()); // Set readonly/readnone attrs #else MPM.add(createFunctionAttrsPass()); // Set readonly/readnone attrs @@ -262,7 +267,13 @@ namespace gbe if (module) { cl_mod = reinterpret_cast(const_cast(module)); } else if (fileName){ + +#if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >=9 + llvm::LLVMContext c; +#else llvm::LLVMContext& c = llvm::getGlobalContext(); +#endif + #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 6 cl_mod = parseIRFile(fileName, Err, c).release(); #else