[Mesa-dev] [PATCH 2/5] clover: Fix not setting build log if the build succeeds.
Tom Stellard
thomas.stellard at amd.com
Tue Jun 17 09:44:43 PDT 2014
From: Matt Arsenault <arsenm2 at gmail.com>
If there were only warnings, they would not be added to the log.
Also fixes valgrind use after free errors.
---
src/gallium/state_trackers/clover/core/compiler.hpp | 3 ++-
src/gallium/state_trackers/clover/core/error.hpp | 2 +-
src/gallium/state_trackers/clover/core/program.cpp | 11 +++++++----
src/gallium/state_trackers/clover/llvm/invocation.cpp | 14 +++++++-------
4 files changed, 17 insertions(+), 13 deletions(-)
diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp
index 49cd022..3ce132f 100644
--- a/src/gallium/state_trackers/clover/core/compiler.hpp
+++ b/src/gallium/state_trackers/clover/core/compiler.hpp
@@ -32,7 +32,8 @@ namespace clover {
module compile_program_llvm(const compat::string &source,
pipe_shader_ir ir,
const compat::string &target,
- const compat::string &opts);
+ const compat::string &opts,
+ std::string &log_out);
module compile_program_tgsi(const compat::string &source);
}
diff --git a/src/gallium/state_trackers/clover/core/error.hpp b/src/gallium/state_trackers/clover/core/error.hpp
index 28459f3..9802195 100644
--- a/src/gallium/state_trackers/clover/core/error.hpp
+++ b/src/gallium/state_trackers/clover/core/error.hpp
@@ -66,7 +66,7 @@ namespace clover {
class build_error : public error {
public:
- build_error(const compat::string &log) :
+ build_error(const compat::string &log = "") :
error(CL_BUILD_PROGRAM_FAILURE, log) {
}
};
diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp
index 3aaa652..91ee553 100644
--- a/src/gallium/state_trackers/clover/core/program.cpp
+++ b/src/gallium/state_trackers/clover/core/program.cpp
@@ -52,15 +52,18 @@ program::build(const ref_vector<device> &devs, const char *opts) {
_opts.insert({ &dev, opts });
+ std::string build_log;
+
try {
auto module = (dev.ir_format() == PIPE_SHADER_IR_TGSI ?
compile_program_tgsi(_source) :
compile_program_llvm(_source, dev.ir_format(),
- dev.ir_target(), build_opts(dev)));
+ dev.ir_target(), build_opts(dev),
+ build_log));
_binaries.insert({ &dev, module });
-
- } catch (build_error &e) {
- _logs.insert({ &dev, e.what() });
+ _logs.insert({ &dev, build_log });
+ } catch (const build_error &) {
+ _logs.insert({ &dev, build_log });
throw;
}
}
diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
index 48810bd..0dc1f50 100644
--- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
+++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
@@ -120,12 +120,11 @@ namespace {
compile(llvm::LLVMContext &llvm_ctx, const std::string &source,
const std::string &name, const std::string &triple,
const std::string &processor, const std::string &opts,
- clang::LangAS::Map& address_spaces) {
+ clang::LangAS::Map& address_spaces, std::string &log_out) {
clang::CompilerInstance c;
clang::EmitLLVMOnlyAction act(&llvm_ctx);
- std::string log;
- llvm::raw_string_ostream s_log(log);
+ llvm::raw_string_ostream s_log(log_out);
std::string libclc_path = LIBCLC_LIBEXECDIR + processor + "-"
+ triple + ".bc";
@@ -220,10 +219,10 @@ namespace {
// Compile the code
if (!c.ExecuteAction(act))
- throw build_error(log);
+ throw build_error();
// Get address spaces map to be able to find kernel argument address space
- memcpy(address_spaces, c.getTarget().getAddressSpaceMap(),
+ memcpy(address_spaces, c.getTarget().getAddressSpaceMap(),
sizeof(address_spaces));
return act.takeModule();
@@ -386,7 +385,8 @@ module
clover::compile_program_llvm(const compat::string &source,
enum pipe_shader_ir ir,
const compat::string &target,
- const compat::string &opts) {
+ const compat::string &opts,
+ std::string &log_out) {
std::vector<llvm::Function *> kernels;
size_t processor_str_len = std::string(target.begin()).find_first_of("-");
@@ -400,7 +400,7 @@ clover::compile_program_llvm(const compat::string &source,
// The input file name must have the .cl extension in order for the
// CompilerInvocation class to recognize it as an OpenCL source file.
llvm::Module *mod = compile(llvm_ctx, source, "input.cl", triple, processor,
- opts, address_spaces);
+ opts, address_spaces, log_out);
find_kernels(mod, kernels);
--
1.8.1.4
More information about the mesa-dev
mailing list