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