diff options
author | Francisco Jerez <[email protected]> | 2016-05-17 16:02:42 +0200 |
---|---|---|
committer | Francisco Jerez <[email protected]> | 2016-07-11 20:21:50 -0700 |
commit | bdc27f13d53759ce9c1c7f58e62a259a18b2ca33 (patch) | |
tree | ef372d0e07d08dee2c8d91819332809286b20079 | |
parent | 714b167f5705a5eec29b2b83dac0d61c5d5746f2 (diff) |
clover/llvm: Clean up compilation into LLVM IR.
Some assorted and mostly trivial clean-ups for the source to bitcode
compilation path.
Reviewed-by: Serge Martin <[email protected]>
Tested-by: Jan Vesely <[email protected]>
-rw-r--r-- | src/gallium/state_trackers/clover/llvm/invocation.cpp | 52 |
1 files changed, 22 insertions, 30 deletions
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index 9c102d2428f..e9b3db695f8 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -195,13 +195,11 @@ namespace { return c; } - llvm::Module * - compile_llvm(LLVMContext &ctx, clang::CompilerInstance &c, - const std::string &source, const header_map &headers, - const std::string &name, const std::string &target, - const std::string &opts, std::string &r_log) { - clang::EmitLLVMOnlyAction act(&ctx); - + std::unique_ptr<Module> + compile(LLVMContext &ctx, clang::CompilerInstance &c, + const std::string &name, const std::string &source, + const header_map &headers, const std::string &target, + const std::string &opts, std::string &r_log) { c.getFrontendOpts().ProgramAction = clang::frontend::EmitLLVMOnly; c.getHeaderSearchOpts().UseBuiltinIncludes = true; c.getHeaderSearchOpts().UseStandardSystemIncludes = true; @@ -210,32 +208,27 @@ namespace { // Add libclc generic search path c.getHeaderSearchOpts().AddPath(LIBCLC_INCLUDEDIR, clang::frontend::Angled, - false, false - ); + false, false); // Add libclc include c.getPreprocessorOpts().Includes.push_back("clc/clc.h"); // clc.h requires that this macro be defined: c.getPreprocessorOpts().addMacroDef("cl_clang_storage_class_specifiers"); - - c.getPreprocessorOpts().addRemappedFile(name, - llvm::MemoryBuffer::getMemBuffer(source).release()); + c.getPreprocessorOpts().addRemappedFile( + name, ::llvm::MemoryBuffer::getMemBuffer(source).release()); if (headers.size()) { const std::string tmp_header_path = "/tmp/clover/"; c.getHeaderSearchOpts().AddPath(tmp_header_path, clang::frontend::Angled, - false, false - ); - - for (header_map::const_iterator it = headers.begin(); - it != headers.end(); ++it) { - const std::string path = tmp_header_path + std::string(it->first); - c.getPreprocessorOpts().addRemappedFile(path, - llvm::MemoryBuffer::getMemBuffer(it->second.c_str()).release()); - } + false, false); + + for (const auto &header : headers) + c.getPreprocessorOpts().addRemappedFile( + tmp_header_path + header.first, + ::llvm::MemoryBuffer::getMemBuffer(header.second).release()); } // Tell clang to link this file before performing any @@ -249,10 +242,11 @@ namespace { LIBCLC_LIBEXECDIR + target + ".bc"); // Compile the code + clang::EmitLLVMOnlyAction act(&ctx); if (!c.ExecuteAction(act)) throw compile_error(); - return act.takeModule().release(); + return act.takeModule(); } std::vector<llvm::Function *> @@ -794,10 +788,9 @@ clover::compile_program_llvm(const std::string &source, // CompilerInvocation class to recognize it as an OpenCL source file. const auto c = create_compiler_instance(target, tokenize(opts + " input.cl"), r_log); - Module *mod = compile_llvm(*ctx, *c, source, headers, "input.cl", - target, opts, r_log); + auto mod = compile(*ctx, *c, "input.cl", source, headers, target, opts, r_log); - optimize(mod, c->getCodeGenOpts().OptimizationLevel); + optimize(&*mod, c->getCodeGenOpts().OptimizationLevel); if (get_debug_flags() & DBG_LLVM) { std::string log; @@ -817,17 +810,16 @@ clover::compile_program_llvm(const std::string &source, m = module(); break; case PIPE_SHADER_IR_LLVM: - m = build_module_llvm(mod, *c); + m = build_module_llvm(&*mod, *c); break; case PIPE_SHADER_IR_NATIVE: { - std::vector<char> code = compile_native(mod, target, + std::vector<char> code = compile_native(&*mod, target, get_debug_flags() & DBG_ASM, r_log); - m = build_module_native(code, mod, *c, r_log); + m = build_module_native(code, &*mod, *c, r_log); break; } } - // The user takes ownership of the module. - delete mod; + return m; } |