[Mesa-dev] [PATCH 5/5] clover: Add environment variables for dumping kernel code v2

Francisco Jerez currojerez at riseup.net
Thu Oct 9 11:17:01 PDT 2014


Tom Stellard <thomas.stellard at amd.com> writes:

> There are two debug variables:
>
> CLOVER_DEBUG which you can set to any combination of llvm,clc,asm
> (separated by commas) to dump llvm IR, OpenCL C, and native assembly.
>
> CLOVER_DEBUG_FILE which you can set to a file name for dumping output
> instead of stderr.  If you set this variable, the output will be split
> into three separate files with different suffixes: .cl for OpenCL C,
> .ll for LLVM IR, and .asm for native assembly.  Note that when data
> is written, it is always appended to the files.
>
> v2:
>   - Code cleanups
>   - Add CLOVER_DEBUG_FILE environment variable for dumping to a file.
> ---
>  .../state_trackers/clover/llvm/invocation.cpp      | 92 +++++++++++++++++++---
>  1 file changed, 82 insertions(+), 10 deletions(-)
>
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index 6349769..b7edcac 100644
> --- a/src/gallium/state_trackers/clover/llvm/invocation.cpp
> +++ b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> @@ -61,6 +61,8 @@
>  #include <llvm/Support/TargetRegistry.h>
>  #include <llvm/Transforms/IPO.h>
>  #include <llvm/Transforms/IPO/PassManagerBuilder.h>
> +#include "llvm/Transforms/Utils/Cloning.h"
> +
>  
>  #if HAVE_LLVM < 0x0302
>  #include <llvm/Target/TargetData.h>
> @@ -132,6 +134,17 @@ namespace {
>        return module::deserialize(cs);
>     }
>  #endif
> +   void debug_log(const std::string &msg, const std::string &suffix) {
> +      const char *dbg_file = debug_get_option("CLOVER_DEBUG_FILE", "stderr");
> +      if (!strcmp("stderr", dbg_file)) {
> +         std::cerr << msg;
> +       } else {
> +        std::ofstream file;
> +        file.open (dbg_file + suffix, std::ios::out | std::ios::app);

Extra whitespace between 'open' and '('.  You could also fold this into
the definition like 'std::ofstream file(dbg_file + suffix,
std::ios::app);' (std::ios::out is implicitly appended since it's an
ofstream).

> +        file << msg;
> +        file.close();

No need to call close(), ofstream is a RAII object so it's closed
automatically when it goes out of scope.

> +       }
> +   }
>  
>     llvm::Module *
>     compile_llvm(llvm::LLVMContext &llvm_ctx, const std::string &source,
> @@ -432,9 +445,32 @@ namespace {
>        return m;
>     }
>  
> +   void
> +   emit_code(LLVMTargetMachineRef tm, LLVMModuleRef mod,
> +             LLVMCodeGenFileType file_type,
> +             LLVMMemoryBufferRef *out_buffer,
> +             compat::string &r_log) {
> +      LLVMBool err;
> +      char *err_message = NULL;
> +
> +      err = LLVMTargetMachineEmitToMemoryBuffer(tm, mod, file_type,
> +                                                &err_message, out_buffer);
> +
> +      if (err) {
> +         r_log = std::string(err_message);
> +      }
> +
> +      LLVMDisposeMessage(err_message);
> +
> +      if (err) {
> +         throw build_error();
> +      }
> +   }
> +
>     std::vector<char>
>     compile_native(const llvm::Module *mod, const std::string &triple,
> -                  const std::string &processor, compat::string &r_log) {
> +                  const std::string &processor, unsigned dump_asm,
> +                  compat::string &r_log) {
>  
>        std::string log;
>        LLVMTargetRef target;
> @@ -442,7 +478,6 @@ namespace {
>        LLVMMemoryBufferRef out_buffer;
>        unsigned buffer_size;
>        const char *buffer_data;
> -      LLVMBool err;
>        LLVMModuleRef mod_ref = wrap(mod);
>  
>        if (LLVMGetTargetFromTriple(triple.c_str(), &target, &error_message)) {
> @@ -460,16 +495,27 @@ namespace {
>           throw build_error();
>        }
>  
> -      err = LLVMTargetMachineEmitToMemoryBuffer(tm, mod_ref, LLVMObjectFile,
> -                                                &error_message, &out_buffer);
> +      if (dump_asm) {
> +         LLVMSetTargetMachineAsmVerbosity(tm, true);
> +#if HAVE_LLVM >= 0x0306
> +         LLVMSetTargetMachineShowMCEncoding(tm, true);
> +#endif
> +         LLVMModuleRef debug_mod = wrap(llvm::CloneModule(mod));
> +         emit_code(tm, debug_mod, LLVMAssemblyFile, &out_buffer, r_log);
> +         buffer_size = LLVMGetBufferSize(out_buffer);
> +         buffer_data = LLVMGetBufferStart(out_buffer);
> +         debug_log(std::string(buffer_data, buffer_size), ".asm");
>  
> -      if (err) {
> -         LLVMDisposeTargetMachine(tm);
> -         r_log = std::string(error_message);
> -         LLVMDisposeMessage(error_message);
> -         throw build_error();
> +         LLVMSetTargetMachineAsmVerbosity(tm, false);
> +#if HAVE_LLVM >= 0x0306
> +         LLVMSetTargetMachineShowMCEncoding(tm, false);
> +#endif
> +         LLVMDisposeMemoryBuffer(out_buffer);
> +         LLVMDisposeModule(debug_mod);
>        }
>  
> +      emit_code(tm, mod_ref, LLVMObjectFile, &out_buffer, r_log);
> +
>        buffer_size = LLVMGetBufferSize(out_buffer);
>        buffer_data = LLVMGetBufferStart(out_buffer);
>  
> @@ -608,6 +654,18 @@ namespace {
>     }
>  } // End anonymous namespace
>  
> +#define DBG_CLC  (1 << 0)
> +#define DBG_LLVM (1 << 1)
> +#define DBG_ASM  (1 << 2)
> +
> +static const struct debug_named_value debug_options[] = {
> +   {"clc", DBG_CLC, "Dump the OpenCL C code for all kernels."},
> +   {"llvm", DBG_LLVM, "Dump the generated LLVM IR for all kernels."},
> +   {"asm", DBG_ASM, "Dump kernel assembly code for targets specifying "
> +                    "PIPE_SHADER_IR_NATIVE"},
> +	DEBUG_NAMED_VALUE_END // must be last
> +};
> +
>  module
>  clover::compile_program_llvm(const compat::string &source,
>                               enum pipe_shader_ir ir,
> @@ -616,6 +674,8 @@ clover::compile_program_llvm(const compat::string &source,
>                               compat::string &r_log) {
>  
>     init_targets();
> +   static unsigned debug_flags = debug_get_flags_option("CLOVER_DEBUG",
> +                                                         debug_options, 0);
>  
>     std::vector<llvm::Function *> kernels;
>     size_t processor_str_len = std::string(target.begin()).find_first_of("-");
> @@ -640,6 +700,17 @@ clover::compile_program_llvm(const compat::string &source,
>  
>     optimize(mod, optimization_level, kernels);
>  
> +   if (debug_flags & DBG_CLC)
> +      debug_log(std::string(source), ".cl");

No need to invoke the constructor of std::string explicitly here.  If
you fix these minor style nits and what Kai pointed out, this patch
is:
Reviewed-by: Francisco Jerez <currojerez at riseup.net>

> +
> +   if (debug_flags & DBG_LLVM) {
> +      std::string log;
> +      llvm::raw_string_ostream s_log(log);
> +      mod->print(s_log, NULL);
> +      s_log.flush();
> +      debug_log(log, ".ll");
> +    }
> +
>     module m;
>     // Build the clover::module
>     switch (ir) {
> @@ -652,7 +723,8 @@ clover::compile_program_llvm(const compat::string &source,
>           m = build_module_llvm(mod, kernels, address_spaces);
>           break;
>        case PIPE_SHADER_IR_NATIVE: {
> -         std::vector<char> code = compile_native(mod, triple, processor, r_log);
> +         std::vector<char> code = compile_native(mod, triple, processor,
> +	                                         debug_flags & DBG_ASM, r_log);
>           m = build_module_native(code, mod, kernels, address_spaces, r_log);
>           break;
>        }
> -- 
> 1.8.5.5
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 212 bytes
Desc: not available
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20141009/aec79a7a/attachment.sig>


More information about the mesa-dev mailing list