From: Junyan He <[email protected]> We need to pass down the source code string in order to output profiling in source code.
Signed-off-by: Junyan He <[email protected]> --- backend/src/backend/gen_program.cpp | 7 ++++--- backend/src/backend/program.cpp | 10 +++++----- backend/src/backend/program.h | 3 ++- backend/src/backend/program.hpp | 2 +- backend/src/llvm/llvm_gen_backend.hpp | 2 +- backend/src/llvm/llvm_profiling.cpp | 14 +++++++++----- backend/src/llvm/llvm_to_gen.cpp | 4 ++-- backend/src/llvm/llvm_to_gen.hpp | 2 +- src/cl_program.c | 3 ++- 9 files changed, 27 insertions(+), 20 deletions(-) diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 48159e5..dd6fe0f 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -406,7 +406,8 @@ namespace gbe { char *err, size_t *errSize, int optLevel, - const char* options) + const char* options, + const char* source) { using namespace gbe; uint32_t fast_relaxed_math = 0; @@ -418,7 +419,7 @@ namespace gbe { #ifdef GBE_COMPILER_AVAILABLE std::string error; // Try to compile the program - if (program->buildFromLLVMFile(fileName, module, error, optLevel) == false) { + if (program->buildFromLLVMFile(fileName, module, error, optLevel, source) == false) { if (err != NULL && errSize != NULL && stringSize > 0u) { const size_t msgSize = std::min(error.size(), stringSize-1u); std::memcpy(err, error.c_str(), msgSize); @@ -528,7 +529,7 @@ namespace gbe { acquireLLVMContextLock(); llvm::Module* module = (llvm::Module*)p->module; - if (p->buildFromLLVMFile(NULL, module, error, optLevel) == false) { + if (p->buildFromLLVMFile(NULL, module, error, optLevel, NULL) == false) { if (err != NULL && errSize != NULL && stringSize > 0u) { const size_t msgSize = std::min(error.size(), stringSize-1u); std::memcpy(err, error.c_str(), msgSize); diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index b65124a..06d5f6b 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -119,7 +119,7 @@ namespace gbe { IVAR(OCL_PROFILING_LOG, 0, 0, 1); // Int for different profiling types. BVAR(OCL_OUTPUT_BUILD_LOG, false); - bool Program::buildFromLLVMFile(const char *fileName, const void* module, std::string &error, int optLevel) { + bool Program::buildFromLLVMFile(const char *fileName, const void* module, std::string &error, int optLevel, const char* source) { ir::Unit *unit = new ir::Unit(); llvm::Module * cloned_module = NULL; bool ret = true; @@ -129,7 +129,7 @@ namespace gbe { bool strictMath = true; if (fast_relaxed_math || !OCL_STRICT_CONFORMANCE) strictMath = false; - if (llvmToGen(*unit, fileName, module, optLevel, strictMath, OCL_PROFILING_LOG) == false) { + if (llvmToGen(*unit, fileName, module, optLevel, strictMath, OCL_PROFILING_LOG, source) == false) { if (fileName) error = std::string(fileName) + " not found"; delete unit; @@ -142,10 +142,10 @@ namespace gbe { unit = new ir::Unit(); if(cloned_module){ //suppose file exists and llvmToGen will not return false. - llvmToGen(*unit, fileName, cloned_module, 0, strictMath, OCL_PROFILING_LOG); + llvmToGen(*unit, fileName, cloned_module, 0, strictMath, OCL_PROFILING_LOG, source); }else{ //suppose file exists and llvmToGen will not return false. - llvmToGen(*unit, fileName, module, 0, strictMath, OCL_PROFILING_LOG); + llvmToGen(*unit, fileName, module, 0, strictMath, OCL_PROFILING_LOG, source); } } assert(unit->getValid()); @@ -893,7 +893,7 @@ BVAR(OCL_DEBUGINFO, false); p = gbe_program_new_from_llvm(deviceID, NULL, out_module, llvm_ctx, dumpASMFileName.empty() ? NULL : dumpASMFileName.c_str(), - stringSize, err, errSize, optLevel, options); + stringSize, err, errSize, optLevel, options, source); if (err != NULL) *errSize += clangErrSize; if (OCL_OUTPUT_BUILD_LOG && options) diff --git a/backend/src/backend/program.h b/backend/src/backend/program.h index 45805f9..8a6ee9f 100644 --- a/backend/src/backend/program.h +++ b/backend/src/backend/program.h @@ -241,7 +241,8 @@ typedef gbe_program (gbe_program_new_from_llvm_cb)(uint32_t deviceID, char *err, size_t *err_size, int optLevel, - const char* options); + const char* options, + const char *source); extern gbe_program_new_from_llvm_cb *gbe_program_new_from_llvm; /*! link the programs from llvm level. */ diff --git a/backend/src/backend/program.hpp b/backend/src/backend/program.hpp index 8cbb012..3e23395 100644 --- a/backend/src/backend/program.hpp +++ b/backend/src/backend/program.hpp @@ -294,7 +294,7 @@ namespace gbe { /*! Build a program from a ir::Unit */ bool buildFromUnit(const ir::Unit &unit, std::string &error); /*! Buils a program from a LLVM source code */ - bool buildFromLLVMFile(const char *fileName, const void* module, std::string &error, int optLevel); + bool buildFromLLVMFile(const char *fileName, const void* module, std::string &error, int optLevel, const char* source); /*! Buils a program from a OCL string */ bool buildFromSource(const char *source, std::string &error); /*! Get size of the global constant arrays */ diff --git a/backend/src/llvm/llvm_gen_backend.hpp b/backend/src/llvm/llvm_gen_backend.hpp index 18e6827..33c1d63 100644 --- a/backend/src/llvm/llvm_gen_backend.hpp +++ b/backend/src/llvm/llvm_gen_backend.hpp @@ -146,7 +146,7 @@ namespace gbe llvm::FunctionPass* createPrintfParserPass(ir::Unit &unit); /*! Insert the time stamp for profiling. */ - llvm::FunctionPass* createProfilingInserterPass(int profilingType, ir::Unit &unit); + llvm::FunctionPass* createProfilingInserterPass(ir::Unit &unit, const char* source); #if LLVM_VERSION_MAJOR == 3 && LLVM_VERSION_MINOR >= 5 /* customized loop unrolling pass. */ diff --git a/backend/src/llvm/llvm_profiling.cpp b/backend/src/llvm/llvm_profiling.cpp index 53aa468..7c672e8 100644 --- a/backend/src/llvm/llvm_profiling.cpp +++ b/backend/src/llvm/llvm_profiling.cpp @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> +#include <string.h> #include "llvm/Config/llvm-config.h" #if LLVM_VERSION_MINOR <= 2 @@ -83,10 +84,13 @@ namespace gbe IRBuilder<>* builder; Type* intTy; Type *ptrTy; - int profilingType; + uint32_t profilingType; + std::vector<std::pair<uint32_t, bool>> profLines; + std::string profKernel; + ir::Unit &unit; + const char* source; - ProfilingInserter(int profiling) : FunctionPass(ID), profilingType(profiling) - { + ProfilingInserter(ir::Unit &u, const char* s) : FunctionPass(ID), unit(u), source(s) { module = NULL; builder = NULL; intTy = NULL; @@ -204,9 +208,9 @@ namespace gbe return changed; } - FunctionPass* createProfilingInserterPass(int profilingType, ir::Unit &unit) + FunctionPass* createProfilingInserterPass(ir::Unit &unit, const char* source) { - return new ProfilingInserter(profilingType); + return new ProfilingInserter(unit, source); } char ProfilingInserter::ID = 0; diff --git a/backend/src/llvm/llvm_to_gen.cpp b/backend/src/llvm/llvm_to_gen.cpp index b8ab1dd..75b2361 100644 --- a/backend/src/llvm/llvm_to_gen.cpp +++ b/backend/src/llvm/llvm_to_gen.cpp @@ -207,7 +207,7 @@ namespace gbe BVAR(OCL_OUTPUT_LLVM_AFTER_GEN, false); bool llvmToGen(ir::Unit &unit, const char *fileName,const void* module, - int optLevel, bool strictMath, int profiling) + int optLevel, bool strictMath, int profiling, const char* source) { std::string errInfo; std::unique_ptr<llvm::raw_fd_ostream> o = NULL; @@ -288,7 +288,7 @@ namespace gbe passes.add(createCFGSimplificationPass()); // Merge & remove BBs passes.add(createLowerSwitchPass()); // simplify cfg will generate switch-case instruction if (profiling) { - passes.add(createProfilingInserterPass(profiling, unit)); // insert the time stamp for profiling. + passes.add(createProfilingInserterPass(unit, source)); // insert the time stamp for profiling. } passes.add(createScalarizePass()); // Expand all vector ops diff --git a/backend/src/llvm/llvm_to_gen.hpp b/backend/src/llvm/llvm_to_gen.hpp index 5667197..d5ebc6b 100644 --- a/backend/src/llvm/llvm_to_gen.hpp +++ b/backend/src/llvm/llvm_to_gen.hpp @@ -33,7 +33,7 @@ namespace gbe { /*! Convert the LLVM IR code to a GEN IR code, optLevel 0 equal to clang -O1 and 1 equal to clang -O2*/ bool llvmToGen(ir::Unit &unit, const char *fileName, const void* module, - int optLevel, bool strictMath, int profiling); + int optLevel, bool strictMath, int profiling, const char* source); } /* namespace gbe */ diff --git a/src/cl_program.c b/src/cl_program.c index fb8eea5..78a3ba9 100644 --- a/src/cl_program.c +++ b/src/cl_program.c @@ -408,7 +408,8 @@ cl_program_create_from_llvm(cl_context ctx, goto error; } - program->opaque = compiler_program_new_from_llvm(ctx->device->device_id, file_name, NULL, NULL, NULL, program->build_log_max_sz, program->build_log, &program->build_log_sz, 1, NULL); + program->opaque = compiler_program_new_from_llvm(ctx->device->device_id, file_name, NULL, NULL, NULL, program->build_log_max_sz, + program->build_log, &program->build_log_sz, 1, NULL, NULL); if (UNLIKELY(program->opaque == NULL)) { err = CL_INVALID_PROGRAM; goto error; -- 1.9.1 _______________________________________________ Beignet mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/beignet
