From 2ab44f657e3c8800aa610d39a04e88d6bf3bad01 Mon Sep 17 00:00:00 2001 From: Matt Arsenault Date: Mon, 9 Jun 2014 22:21:52 -0700 Subject: [PATCH] clover: Fix not setting build log if the build succeeds v2 If there were only warnings, they would not be added to the log. v2: - Use compat::string. Reviewed-by: Francisco Jerez --- .../state_trackers/clover/core/compiler.hpp | 3 ++- src/gallium/state_trackers/clover/core/error.hpp | 4 ++-- .../state_trackers/clover/core/program.cpp | 11 +++++++---- .../state_trackers/clover/llvm/invocation.cpp | 16 ++++++++++------ .../state_trackers/clover/util/compat.hpp | 3 +++ 5 files changed, 24 insertions(+), 13 deletions(-) diff --git a/src/gallium/state_trackers/clover/core/compiler.hpp b/src/gallium/state_trackers/clover/core/compiler.hpp index 49cd0226f67..6ef84d1c0d8 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, + compat::string &r_log); 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 28459f3821e..cecbe9b110e 100644 --- a/src/gallium/state_trackers/clover/core/error.hpp +++ b/src/gallium/state_trackers/clover/core/error.hpp @@ -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) { } }; diff --git a/src/gallium/state_trackers/clover/core/program.cpp b/src/gallium/state_trackers/clover/core/program.cpp index 3aaa6520ae8..e09c3aaa2cf 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 &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; } } diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp index c3daa817938..5d2efc4461c 100644 --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp @@ -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 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); diff --git a/src/gallium/state_trackers/clover/util/compat.hpp b/src/gallium/state_trackers/clover/util/compat.hpp index 28601e878e8..50e1c7d47d5 100644 --- a/src/gallium/state_trackers/clover/util/compat.hpp +++ b/src/gallium/state_trackers/clover/util/compat.hpp @@ -265,6 +265,9 @@ namespace clover { class string : public vector { public: + string() : vector() { + } + string(const char *p) : vector(p, std::strlen(p)) { } -- 2.30.2