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 | |
parent | ad733c0efea62f92ab5f00cd09d03d36a524f87e (diff) | |
download | beignet-430384ccae4cba983e533e507557dd5a50303601.tar.gz |
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>
-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 | ||||
-rw-r--r-- | src/cl_program.c | 4 |
4 files changed, 35 insertions, 8 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 */ diff --git a/src/cl_program.c b/src/cl_program.c index 82dd3e34..55c1ee86 100644 --- a/src/cl_program.c +++ b/src/cl_program.c @@ -620,13 +620,11 @@ cl_program_link(cl_context context, int copyed = 0; cl_bool ret = 0; int avialable_program = 0; - //Although we don't use options, but still need check options if(!compiler_program_check_opt(options)) { err = CL_INVALID_LINKER_OPTIONS; goto error; } - for(i = 0; i < num_input_programs; i++) { //num_input_programs >0 and input_programs MUST not NULL, so compare with input_programs[0] directly. if(input_programs[i]->binary_type == CL_PROGRAM_BINARY_TYPE_LIBRARY || @@ -657,7 +655,7 @@ cl_program_link(cl_context context, goto error; } - p->opaque = compiler_program_new_gen_program(context->device->device_id, NULL, NULL); + p->opaque = compiler_program_new_gen_program(context->device->device_id, NULL, NULL, NULL); for(i = 0; i < num_input_programs; i++) { // if program create with llvm binary, need deserilize first to get module. if(input_programs[i]) |