On Wed, Oct 08, 2014 at 09:15:39AM -0700, Matt Arsenault wrote:
> 
> On Oct 6, 2014, at 12:44 PM, Tom Stellard <thomas.stell...@amd.com> wrote:
> 
> > ---
> > .../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);
> 
> It would be much better to emit each of these to a separate file with a 
> consistent naming scheme than to just dump everything to stderr. It’s easier 
> to just have a separate file for the source, IR and ISA to look at and 
> compare rather than having to split it out of the rest of the debug output, 
> which also gets harder as programs get bigger and add multiple kernels. 
> There’s also the problem with stderr not being flushed if the machine hangs, 
> so you only get partial output. 
> 
> What we have is an environment variable that specifies the prefix to use for 
> the file name, (defaulting to _temp_), so the output is like
> _temp_0_Tahiti_foo.isa, _temp_0_Tahiti_foo.bc, _temp_1_Tahiti_bar.cl. The 
> number is the compile index for the program, which is important for programs 
> with multiple compiles, especially for ones which compile kernels with the 
> same name multiple times (which seems to be strangely not uncommon). The 
> specified prefix is useful for saving sets of slightly different output with 
> a change or different compile options or something like that
> 
> 

I've added an option in version 2 of this patch to dump to a file.
It's more simple than what you described, there is no
compile index and it appends to files instead of overwriting them.

-Tom

> 
> > 
> > -      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
> > 
> > _______________________________________________
> > mesa-dev mailing list
> > mesa-dev@lists.freedesktop.org
> > http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to