This patch turns on llvm dump for both clCompileProgram and clBuildProgram in a way that they both share the piece of code added in buildModuleFromSource(). This patch also takes into account the llvm 3.3 fix submitted by Yejun. Please review this patch and let me know the feedback.
Regards Manasi -----Original Message----- From: Navare, Manasi D Sent: Friday, August 14, 2015 12:16 AM To: Song, Ruiling; beignet@lists.freedesktop.org Cc: Navare, Manasi D Subject: [PATCH] backend/src/backend: Handle -dump-opt-llvm=[PATH] in clCompileProgram and clBuildProgram OpenCL API Allows the user to request a dump of the LLVM-generated IR to the file specified in [PATH] through clCompileProgram options Signed-off-by: Manasi Navare <manasi.d.nav...@intel.com> --- backend/src/backend/program.cpp | 54 +++++++++++++++++++++++------------------ 1 file changed, 30 insertions(+), 24 deletions(-) diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 6d539a9..4066a83 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -519,7 +519,7 @@ namespace gbe { BVAR(OCL_OUTPUT_BUILD_LOG, false); static bool buildModuleFromSource(const char* input, llvm::Module** out_module, llvm::LLVMContext* llvm_ctx, - std::vector<std::string>& options, size_t stringSize, char *err, + std::string dumpLLVMFileName, + std::vector<std::string>& options, size_t stringSize, char *err, size_t *errSize) { // Arguments to pass to the clang frontend vector<const char *> args; @@ -628,6 +628,33 @@ namespace gbe { #endif *out_module = module; + +// Dump the LLVM if requested. +#if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR < 6) + if (!dumpLLVMFileName.empty()) { + std::string err; + llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(), + err, + #if LLVM_VERSION_MINOR == 3 + 0, + #else + llvm::sys::fs::F_RW + #endif + + if (err.empty()) { + (*out_module)->print(ostream, 0); + } //Otherwise, you'll have to make do without the dump. + } +#else + if (!dumpLLVMFileName.empty()) { + std::error_code err; + llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(), + err, llvm::sys::fs::F_RW); + if (!err) { + (*out_module)->print(ostream, 0); + } //Otherwise, you'll have to make do without the dump. + } +#endif return true; } @@ -808,7 +835,7 @@ namespace gbe { if (!llvm::llvm_is_multithreaded()) llvm_mutex.lock(); - if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt, + if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, + dumpLLVMFileName, clOpt, stringSize, err, errSize)) { // Now build the program from llvm size_t clangErrSize = 0; @@ -819,27 +846,6 @@ namespace gbe { clangErrSize = *errSize; } - // Dump the LLVM if requested. - #if (LLVM_VERSION_MAJOR == 3) && (LLVM_VERSION_MINOR < 6) - if (!dumpLLVMFileName.empty()) { - std::string err; - llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(), - err, llvm::sys::fs::F_RW); - if (err.empty()) { - out_module->print(ostream, 0); - } //Otherwise, you'll have to make do without the dump. - } - #else - if (!dumpLLVMFileName.empty()) { - std::error_code err; - llvm::raw_fd_ostream ostream (dumpLLVMFileName.c_str(), - err, llvm::sys::fs::F_RW); - if (!err) { - out_module->print(ostream, 0); - } //Otherwise, you'll have to make do without the dump. - } - #endif - FILE *asmDumpStream = fopen(dumpASMFileName.c_str(), "w"); if (asmDumpStream) fclose(asmDumpStream); @@ -885,7 +891,7 @@ namespace gbe { //for some functions, so we use global context now, need switch to new context later. llvm::Module * out_module; llvm::LLVMContext* llvm_ctx = &llvm::getGlobalContext(); - if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, clOpt, + if (buildModuleFromSource(clName.c_str(), &out_module, llvm_ctx, + dumpLLVMFileName, clOpt, stringSize, err, errSize)) { // Now build the program from llvm if (err != NULL) { -- 1.9.1 _______________________________________________ Beignet mailing list Beignet@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/beignet