--- .../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); - 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