The "-debug" option is used to enable the breakpoint bit on the first instruction of every kernel.
Signed-off-by: Mircea Gherzan <[email protected]> --- backend/src/backend/context.cpp | 4 ++-- backend/src/backend/context.hpp | 4 ++-- backend/src/backend/gen_context.cpp | 12 +++++++++++- backend/src/backend/gen_context.hpp | 2 +- backend/src/backend/gen_program.cpp | 7 +++++-- backend/src/backend/gen_program.hpp | 8 ++++++-- backend/src/backend/program.cpp | 5 ++++- 7 files changed, 31 insertions(+), 11 deletions(-) diff --git a/backend/src/backend/context.cpp b/backend/src/backend/context.cpp index 675dc78..7e18483 100644 --- a/backend/src/backend/context.cpp +++ b/backend/src/backend/context.cpp @@ -374,7 +374,7 @@ namespace gbe this->JIPs.clear(); } - Kernel *Context::compileKernel(void) { + Kernel *Context::compileKernel(bool kernelDebug) { this->kernel = this->allocateKernel(); this->kernel->simdWidth = this->simdWidth; this->buildArgList(); @@ -386,7 +386,7 @@ namespace gbe this->buildJIPs(); this->buildStack(); this->handleSLM(); - if (this->emitCode() == false) { + if (this->emitCode(kernelDebug) == false) { GBE_DELETE(this->kernel); this->kernel = NULL; } diff --git a/backend/src/backend/context.hpp b/backend/src/backend/context.hpp index 1567bd6..97f3c8e 100644 --- a/backend/src/backend/context.hpp +++ b/backend/src/backend/context.hpp @@ -60,7 +60,7 @@ namespace gbe /*! start new code generation with specific simd width. */ void startNewCG(uint32_t simdWidth); /*! Compile the code */ - Kernel *compileKernel(void); + Kernel *compileKernel(bool kernelDebug); /*! Tells if the labels is used */ INLINE bool isLabelUsed(ir::LabelIndex index) const { return usedLabels.contains(index); @@ -122,7 +122,7 @@ namespace gbe } protected: /*! Build the instruction stream. Return false if failed */ - virtual bool emitCode(void) = 0; + virtual bool emitCode(bool kernelDebug) = 0; /*! Align the scratch size to the device's scratch unit size */ virtual uint32_t alignScratchSize(uint32_t) = 0; /*! Get the device's max srcatch size */ diff --git a/backend/src/backend/gen_context.cpp b/backend/src/backend/gen_context.cpp index 8802efc..4ca115b 100644 --- a/backend/src/backend/gen_context.cpp +++ b/backend/src/backend/gen_context.cpp @@ -3841,7 +3841,7 @@ namespace gbe BVAR(OCL_OUTPUT_SEL_IR, false); BVAR(OCL_OPTIMIZE_SEL_IR, true); - bool GenContext::emitCode(void) { + bool GenContext::emitCode(bool kernelDebug) { GenKernel *genKernel = static_cast<GenKernel*>(this->kernel); sel->select(); if (OCL_OPTIMIZE_SEL_IR) @@ -3863,6 +3863,16 @@ namespace gbe this->emitInstructionStream(); if (this->patchBranches() == false) return false; + + // Set the breakpint bit if kernel debugging is enabled + if (kernelDebug) { + // Check if the first instruction is a compact one + if (((GenCompactInstruction *)&p->store[0])->bits1.cmpt_control) + ((GenCompactInstruction *)&p->store[0])->bits1.debug_control = 1; + else + ((GenNativeInstruction *)&p->store[0])->header.debug_control = 1; + } + genKernel->insnNum = p->store.size(); genKernel->insns = GBE_NEW_ARRAY_NO_ARG(GenInstruction, genKernel->insnNum); std::memcpy(genKernel->insns, &p->store[0], genKernel->insnNum * sizeof(GenInstruction)); diff --git a/backend/src/backend/gen_context.hpp b/backend/src/backend/gen_context.hpp index fb3d4fe..baaf298 100644 --- a/backend/src/backend/gen_context.hpp +++ b/backend/src/backend/gen_context.hpp @@ -75,7 +75,7 @@ namespace gbe /*! Target device ID*/ uint32_t deviceID; /*! Implements base class */ - virtual bool emitCode(void); + virtual bool emitCode(bool kernelDebug); /*! Align the scratch size to the device's scratch unit size */ virtual uint32_t alignScratchSize(uint32_t size); /*! Get the device's max srcatch size */ diff --git a/backend/src/backend/gen_program.cpp b/backend/src/backend/gen_program.cpp index 88010c2..d03e553 100644 --- a/backend/src/backend/gen_program.cpp +++ b/backend/src/backend/gen_program.cpp @@ -201,7 +201,7 @@ namespace gbe { GBE_ASSERT(0); simdFn->setSimdWidth(simdWidth); ctx->startNewCG(simdWidth, reservedSpillRegs, limitRegisterPressure); - kernel = ctx->compileKernel(); + kernel = ctx->compileKernel(this->kernel_debug); if (kernel != NULL) { GBE_ASSERT(ctx->getErrCode() == NO_ERROR); break; @@ -426,11 +426,14 @@ namespace gbe { { using namespace gbe; uint32_t fast_relaxed_math = 0; + const bool debug = options && strstr(options, "-debug"); + if (options != NULL) if (strstr(options, "-cl-fast-relaxed-math") != NULL) fast_relaxed_math = 1; - GenProgram *program = GBE_NEW(GenProgram, deviceID, module, llvm_ctx, asm_file_name, fast_relaxed_math); + GenProgram *program = GBE_NEW(GenProgram, deviceID, module, llvm_ctx, + asm_file_name, fast_relaxed_math, debug); #ifdef GBE_COMPILER_AVAILABLE std::string error; // Try to compile the program diff --git a/backend/src/backend/gen_program.hpp b/backend/src/backend/gen_program.hpp index 076f617..fae7cb6 100644 --- a/backend/src/backend/gen_program.hpp +++ b/backend/src/backend/gen_program.hpp @@ -60,8 +60,10 @@ namespace gbe { public: /*! Create an empty program */ - GenProgram(uint32_t deviceID, const void* mod = NULL, const void* ctx = NULL, const char* asm_fname = NULL, uint32_t fast_relaxed_math = 0) : - Program(fast_relaxed_math), deviceID(deviceID),module((void*)mod), llvm_ctx((void*)ctx), asm_file_name(asm_fname) {} + GenProgram(uint32_t deviceID, const void* mod = NULL, const void* ctx = NULL, + const char* asm_fname = NULL, uint32_t fast_relaxed_math = 0, bool k_debug = false) : + Program(fast_relaxed_math), deviceID(deviceID), module((void*)mod), + llvm_ctx((void*)ctx), asm_file_name(asm_fname), kernel_debug(k_debug) {} /*! Current device ID*/ uint32_t deviceID; /*! Destroy the program */ @@ -79,6 +81,8 @@ namespace gbe const char* asm_file_name; /*! Use custom allocators */ GBE_CLASS(GenProgram); + private: + const bool kernel_debug __attribute__((unused)); }; /*! decompact GEN ASM if it is in compacted format */ extern void decompactInstruction(union GenCompactInstruction *p, void *insn); diff --git a/backend/src/backend/program.cpp b/backend/src/backend/program.cpp index d13cba5..89286d8 100644 --- a/backend/src/backend/program.cpp +++ b/backend/src/backend/program.cpp @@ -610,9 +610,12 @@ namespace gbe { // Arguments to pass to the clang frontend vector<const char *> args; bool bFastMath = false; + // List of options that are should not be forwarded to Clang + static const char privateOptions[] = "-debug"; for (auto &s : options) { - args.push_back(s.c_str()); + if (strstr(privateOptions, s.c_str()) == NULL) + args.push_back(s.c_str()); } args.push_back("-cl-kernel-arg-info"); -- 1.8.3.1 _______________________________________________ Beignet mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/beignet
