Tom Stellard <thomas.stell...@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
pgpr8r1UmU_Kb.pgp
Description: PGP signature
_______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev