summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <[email protected]>2016-05-17 16:02:42 +0200
committerFrancisco Jerez <[email protected]>2016-07-11 20:21:50 -0700
commitbdc27f13d53759ce9c1c7f58e62a259a18b2ca33 (patch)
treeef372d0e07d08dee2c8d91819332809286b20079
parent714b167f5705a5eec29b2b83dac0d61c5d5746f2 (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.cpp52
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;
}