[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