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 <[email protected]> --- backend/src/backend/gen_program.cpp | 35 ++++++++++++++++++++++++++++++++--- backend/src/backend/program.cpp | 2 +- backend/src/backend/program.h | 3 ++- src/cl_program.c | 4 +--- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 04da692..0415154 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -379,9 +379,14 @@ 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); + /*if(program->asm_file_name) { + FILE *asmDumpStream = fopen(program->asm_file_name, "w"); + if (asmDumpStream) + fclose(asmDumpStream); + }*/ // Everything run fine return (gbe_program) program; } @@ -425,17 +430,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 *str = (char *)malloc(sizeof(char) * (strlen(options) + 1)); + memcpy(str, options, strlen(options) + 1); + std::string optionStr(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(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 0ee76fc..8298c31 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; diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index 346d855..b3f90dd 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -196,7 +196,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 82dd3e3..55c1ee8 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]) -- 1.9.1 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
