clover: Fix not setting build log if the build succeeds v2
authorMatt Arsenault <arsenm2@gmail.com>
Tue, 10 Jun 2014 05:21:52 +0000 (22:21 -0700)
committerTom Stellard <thomas.stellard@amd.com>
Wed, 2 Jul 2014 19:15:13 +0000 (15:15 -0400)
If there were only warnings, they would not be added to the log.

v2:
  - Use compat::string.

Reviewed-by: Francisco Jerez <currojerez@riseup.net>
src/gallium/state_trackers/clover/core/compiler.hpp
src/gallium/state_trackers/clover/core/error.hpp
src/gallium/state_trackers/clover/core/program.cpp
src/gallium/state_trackers/clover/llvm/invocation.cpp
src/gallium/state_trackers/clover/util/compat.hpp

index 49cd0226f67934da349f84ad976f754714772d7f..6ef84d1c0d84403af332b374c559088b6fd316aa 100644 (file)
@@ -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,
+                               compat::string &r_log);
 
    module compile_program_tgsi(const compat::string &source);
 }
index 28459f3821e9dae7d51817f8f7063332b242bbc8..cecbe9b110e45de05ca1a0acedc25b924aacf8b4 100644 (file)
@@ -66,8 +66,8 @@ namespace clover {
 
    class build_error : public error {
    public:
-      build_error(const compat::string &log) :
-         error(CL_BUILD_PROGRAM_FAILURE, log) {
+      build_error(const compat::string &what = "") :
+         error(CL_BUILD_PROGRAM_FAILURE, what) {
       }
    };
 
index 3aaa6520ae8ffcee612b1f74f7456d2f60183cf5..e09c3aaa2cfc9dea5337135cc4908fcbc51d77cf 100644 (file)
@@ -52,15 +52,18 @@ program::build(const ref_vector<device> &devs, const char *opts) {
 
          _opts.insert({ &dev, opts });
 
+         compat::string 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),
+                                                log));
             _binaries.insert({ &dev, module });
-
-         } catch (build_error &e) {
-            _logs.insert({ &dev, e.what() });
+            _logs.insert({ &dev, std::string(log.c_str()) });
+         } catch (const build_error &) {
+            _logs.insert({ &dev, std::string(log.c_str()) });
             throw;
          }
       }
index c3daa81793862758a952e383b42aa8df2e797521..5d2efc4461c29f99dfcc170aa8b6c75763344882 100644 (file)
@@ -120,7 +120,7 @@ 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, compat::string &r_log) {
 
       clang::CompilerInstance c;
       clang::EmitLLVMOnlyAction act(&llvm_ctx);
@@ -224,11 +224,14 @@ namespace {
       c.getCodeGenOpts().LinkBitcodeFile = libclc_path;
 
       // Compile the code
-      if (!c.ExecuteAction(act))
-         throw build_error(log);
+      bool ExecSuccess = c.ExecuteAction(act);
+      r_log = log;
+
+      if (!ExecSuccess)
+         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();
@@ -391,7 +394,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,
+                             compat::string &r_log) {
 
    std::vector<llvm::Function *> kernels;
    size_t processor_str_len = std::string(target.begin()).find_first_of("-");
@@ -405,7 +409,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, r_log);
 
    find_kernels(mod, kernels);
 
index 28601e878e86e5305c1e4cf72919b9d859de208a..50e1c7d47d5788a9e9ad314a8d71a0e692c634bc 100644 (file)
@@ -265,6 +265,9 @@ namespace clover {
 
       class string : public vector<char> {
       public:
+         string() : vector() {
+         }
+
          string(const char *p) : vector(p, std::strlen(p)) {
          }