diff options
author | Manasi Navare <manasi.d.navare@intel.com> | 2015-10-12 04:35:57 -0400 |
---|---|---|
committer | Yang Rong <rong.r.yang@intel.com> | 2015-10-13 14:52:50 +0800 |
commit | 430384ccae4cba983e533e507557dd5a50303601 (patch) | |
tree | 421696e95b707da1874abd985688318774a604bc /backend | |
parent | ad733c0efea62f92ab5f00cd09d03d36a524f87e (diff) |
Add -dump-opt-asm support to the clLinkProgram() API
This will dump the Gen ASM output to the file specified in the
-dump-opt-asm Link option during the Link program step.
Signed-off-by: Manasi Navare <manasi.d.navare@intel.com>
Reviewed-by: Ruiling Song <ruiling.song@intel.com>
Diffstat (limited to 'backend')
-rw-r--r-- | backend/src/backend/gen_program.cpp | 30 | ||||
-rw-r--r-- | backend/src/backend/program.cpp | 6 | ||||
-rw-r--r-- | backend/src/backend/program.h | 3 |
3 files changed, 34 insertions, 5 deletions
diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 04da692b..625a0977 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -379,9 +379,9 @@ namespace gbe { } static gbe_program genProgramNewGenProgram(uint32_t deviceID, const void* module, - const void* llvm_ctx) { + const void* llvm_ctx,const char* asm_file_name) { using namespace gbe; - GenProgram *program = GBE_NEW(GenProgram, deviceID, module, llvm_ctx); + GenProgram *program = GBE_NEW(GenProgram, deviceID, module, llvm_ctx, asm_file_name); // Everything run fine return (gbe_program) program; } @@ -425,17 +425,41 @@ namespace gbe { #ifdef GBE_COMPILER_AVAILABLE using namespace gbe; std::string error; - int optLevel = 1; + std::string dumpASMFileName; + size_t start = 0, end = 0; if(options) { char *p; p = strstr(const_cast<char *>(options), "-cl-opt-disable"); if (p) optLevel = 0; + + char *options_str = (char *)malloc(sizeof(char) * (strlen(options) + 1)); + memcpy(options_str, options, strlen(options) + 1); + std::string optionStr(options_str); + while (end != std::string::npos) { + end = optionStr.find(' ', start); + std::string str = optionStr.substr(start, end - start); + start = end + 1; + if(str.size() == 0) + continue; + + if(str.find("-dump-opt-asm=") != std::string::npos) { + dumpASMFileName = str.substr(str.find("=") + 1); + continue; // Don't push this str back; ignore it. + } + } + free(options_str); } GenProgram* p = (GenProgram*) program; + if (!dumpASMFileName.empty()) { + p->asm_file_name = dumpASMFileName.c_str(); + FILE *asmDumpStream = fopen(dumpASMFileName.c_str(), "w"); + if (asmDumpStream) + fclose(asmDumpStream); + } // Try to compile the program acquireLLVMContextLock(); llvm::Module* module = (llvm::Module*)p->module; diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index 0ee76fcc..472734ba 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -890,7 +890,7 @@ namespace gbe { err += *errSize; } - p = gbe_program_new_gen_program(deviceID, out_module, NULL); + p = gbe_program_new_gen_program(deviceID, out_module, NULL, NULL); if (OCL_OUTPUT_BUILD_LOG && options) llvm::errs() << options; @@ -936,6 +936,10 @@ namespace gbe { if(pos != std::string::npos) { s.erase(pos, strlen("-enable-link-options")); } + pos = s.find("-dump-opt-asm"); + if(pos != std::string::npos) { + s.erase(pos, strlen("-dump-opt-asm")); + } args.push_back(s.c_str()); // The compiler invocation needs a DiagnosticsEngine so it can report problems diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index de892b57..86b31776 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -192,7 +192,8 @@ extern gbe_program_check_opt_cb *gbe_program_check_opt; /*! create s new genprogram for link. */ typedef gbe_program (gbe_program_new_gen_program_cb)(uint32_t deviceID, const void *module, - const void *act); + const void *act, + const char *asm_file_name); extern gbe_program_new_gen_program_cb *gbe_program_new_gen_program; /*! Create a new program from the given blob */ |