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

Francisco Jerez currojerez at riseup.net
Wed Oct 8 02:15:04 PDT 2014


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

> ---
>  .../state_trackers/clover/llvm/invocation.cpp      | 74 ++++++++++++++++++----
>  1 file changed, 63 insertions(+), 11 deletions(-)
>
> diff --git a/src/gallium/state_trackers/clover/llvm/invocation.cpp b/src/gallium/state_trackers/clover/llvm/invocation.cpp
> index a1a54e0..3e6a186 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>
> @@ -433,19 +435,39 @@ namespace {
>        return m;
>     }
>  
> +   static 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();
> +      }
> +   }
> +
>     module
>     build_module_native(llvm::Module *mod,
>                       const std::vector<llvm::Function *> &kernels,
>                       clang::LangAS::Map& address_spaces,
>                       std::string triple, std::string processor,
> -                     compat::string &r_log) {
> +                     bool dump_asm, compat::string &r_log) {
>        std::string log;
>        LLVMTargetRef target;
>        char *error_message;
>        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)) {
> @@ -463,16 +485,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);
> +         fprintf(stderr, "%.*s\n", buffer_size, buffer_data);
>  

We should try to avoid mixing iostream and stdio library calls.  How about
using 'std::cerr << ...' here?

> -      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);
>  
> @@ -569,6 +602,18 @@ static void diagnostic_handler(const llvm::DiagnosticInfo &di, void *err_string)
>  
>  #endif
>  
> +#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,
> @@ -576,8 +621,9 @@ clover::compile_program_llvm(const compat::string &source,
>                               const compat::string &opts,
>                               compat::string &r_log) {
>  
> +   static unsigned debug_flags = debug_get_flags_option("CLOVER_DEBUG",
> +                                                         debug_options, 0);
>     static bool target_init = false;
> -
>     if (!target_init) {
>  
>        LLVMInitializeAllTargets();
> @@ -610,6 +656,12 @@ clover::compile_program_llvm(const compat::string &source,
>  
>     optimize(mod, optimization_level, kernels);
>  
> +   if (debug_flags & DBG_CLC)
> +      std::cerr << std::string(source);
> +
> +   if (debug_flags & DBG_LLVM)
> +      mod->dump();
> +
>     module m;
>     // Build the clover::module
>     switch (ir) {
> @@ -623,7 +675,7 @@ clover::compile_program_llvm(const compat::string &source,
>           break;
>        case PIPE_SHADER_IR_NATIVE:
>           m = build_module_native(mod, kernels, address_spaces, triple,
> -                                 processor, r_log);
> +                                 processor, debug_flags & DBG_ASM, r_log);
>           break;
>     }
>  #if HAVE_LLVM >= 0x0306
> -- 
> 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/20141008/94daa1cb/attachment.sig>


More information about the mesa-dev mailing list