diff --git a/opencl/test/unit_test/source_level_debugger/source_level_debugger_tests.cpp b/opencl/test/unit_test/source_level_debugger/source_level_debugger_tests.cpp index fba7d48307..b996786f8a 100644 --- a/opencl/test/unit_test/source_level_debugger/source_level_debugger_tests.cpp +++ b/opencl/test/unit_test/source_level_debugger/source_level_debugger_tests.cpp @@ -7,6 +7,7 @@ #include "shared/source/command_container/cmdcontainer.h" #include "shared/source/device/device.h" +#include "shared/source/helpers/file_io.h" #include "shared/source/os_interface/os_interface.h" #include "shared/source/source_level_debugger/source_level_debugger.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" @@ -730,3 +731,79 @@ TEST(SourceLevelDebugger, givenMode2InEnableMockSourceLevelDebuggerWhenDebuggerC auto sld = std::unique_ptr(SourceLevelDebugger::create()); EXPECT_FALSE(sld->isOptimizationDisabled()); } + +TEST(SourceLevelDebugger, givenDebugVarDumpElfWhenNotifyKernelDebugDataIsCalledThenElfFileIsCreated) { + DebugManagerStateRestore stateRestore; + DebugManager.flags.DebuggerLogBitmask.set(NEO::DebugVariables::DEBUGGER_LOG_BITMASK::DUMP_ELF); + + DebuggerLibraryRestorer restorer; + + DebuggerLibraryInterceptor interceptor; + DebuggerLibrary::setLibraryAvailable(true); + DebuggerLibrary::setDebuggerActive(true); + DebuggerLibrary::injectDebuggerLibraryInterceptor(&interceptor); + + MockSourceLevelDebugger debugger; + char isa[8]; + char dbgIsa[10]; + char visa[12]; + + KernelInfo info; + info.debugData.genIsa = dbgIsa; + info.debugData.vIsa = visa; + info.debugData.genIsaSize = sizeof(dbgIsa); + info.debugData.vIsaSize = sizeof(visa); + + info.kernelDescriptor.kernelMetadata.kernelName = "debugKernel"; + + info.heapInfo.KernelHeapSize = sizeof(isa); + info.heapInfo.pKernelHeap = isa; + + std::string fileName = info.kernelDescriptor.kernelMetadata.kernelName + ".elf"; + EXPECT_FALSE(fileExists(fileName)); + + debugger.notifyKernelDebugData(&info.debugData, info.kernelDescriptor.kernelMetadata.kernelName, info.heapInfo.pKernelHeap, info.heapInfo.KernelHeapSize); + EXPECT_TRUE(fileExists(fileName)); + std::remove(fileName.c_str()); +} + +TEST(SourceLevelDebugger, givenDebugVarDumpElfWhenElfFileExistsWhileNotifyingDebugDataThenSuffixIsAppendedToFileName) { + DebugManagerStateRestore stateRestore; + DebugManager.flags.DebuggerLogBitmask.set(NEO::DebugVariables::DEBUGGER_LOG_BITMASK::DUMP_ELF); + + DebuggerLibraryRestorer restorer; + + DebuggerLibraryInterceptor interceptor; + DebuggerLibrary::setLibraryAvailable(true); + DebuggerLibrary::setDebuggerActive(true); + DebuggerLibrary::injectDebuggerLibraryInterceptor(&interceptor); + + MockSourceLevelDebugger debugger; + char isa[8]; + char dbgIsa[10]; + char visa[12]; + + KernelInfo info; + info.debugData.genIsa = dbgIsa; + info.debugData.vIsa = visa; + info.debugData.genIsaSize = sizeof(dbgIsa); + info.debugData.vIsaSize = sizeof(visa); + + info.kernelDescriptor.kernelMetadata.kernelName = "debugKernel"; + + info.heapInfo.KernelHeapSize = sizeof(isa); + info.heapInfo.pKernelHeap = isa; + + std::string fileName = info.kernelDescriptor.kernelMetadata.kernelName + ".elf"; + char data[4]; + writeDataToFile(fileName.c_str(), data, 4); + EXPECT_TRUE(fileExists(fileName)); + + std::string fileName2 = info.kernelDescriptor.kernelMetadata.kernelName + "_0.elf"; + debugger.notifyKernelDebugData(&info.debugData, info.kernelDescriptor.kernelMetadata.kernelName, info.heapInfo.pKernelHeap, info.heapInfo.KernelHeapSize); + + EXPECT_TRUE(fileExists(fileName2)); + + std::remove(fileName.c_str()); + std::remove(fileName2.c_str()); +} diff --git a/opencl/test/unit_test/test_files/igdrcl.config b/opencl/test/unit_test/test_files/igdrcl.config index bda078ed97..7fc37857d4 100644 --- a/opencl/test/unit_test/test_files/igdrcl.config +++ b/opencl/test/unit_test/test_files/igdrcl.config @@ -227,3 +227,4 @@ OverrideSlmAllocationSize = -1 OverrideSlmSize = -1 UseCyclesPerSecondTimer = 0 WaitLoopCount = -1 +DebuggerLogBitmask = 0 \ No newline at end of file diff --git a/shared/source/debug_settings/debug_settings_manager.h b/shared/source/debug_settings/debug_settings_manager.h index 7381046e66..0c32ee23c6 100644 --- a/shared/source/debug_settings/debug_settings_manager.h +++ b/shared/source/debug_settings/debug_settings_manager.h @@ -68,6 +68,12 @@ struct DebugVarBase { }; struct DebugVariables { + struct DEBUGGER_LOG_BITMASK { + constexpr static int32_t LOG_INFO{1}; + constexpr static int32_t LOG_ERROR{1 << 1}; + constexpr static int32_t DUMP_ELF{1 << 10}; + }; + #define DECLARE_DEBUG_VARIABLE(dataType, variableName, defaultValue, description) \ DebugVarBase variableName{defaultValue}; #include "debug_variables.inl" diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index 9f27dbea7d..42b9b3671e 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -93,6 +93,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, GpuScratchRegWriteAfterWalker, -1, "-1: disabled DECLARE_DEBUG_VARIABLE(int32_t, GpuScratchRegWriteRegisterOffset, 0, "register offset for GPU scratch register write after walker") DECLARE_DEBUG_VARIABLE(int32_t, GpuScratchRegWriteRegisterData, 0, "register data for GPU scratch register write after walker") DECLARE_DEBUG_VARIABLE(int32_t, OverrideSlmAllocationSize, -1, "-1: default, >=0: program value for shared local memory size") +DECLARE_DEBUG_VARIABLE(int32_t, DebuggerLogBitmask, 0, "0: logs disabled, != 0: see DebugVariables::DEBUGGER_LOG_BITMASK") /*LOGGING FLAGS*/ DECLARE_DEBUG_VARIABLE(int32_t, PrintDriverDiagnostics, -1, "prints driver diagnostics messages to standard output, value corresponds to hint level") diff --git a/shared/source/source_level_debugger/source_level_debugger.cpp b/shared/source/source_level_debugger/source_level_debugger.cpp index 18097575d1..48baf13a90 100644 --- a/shared/source/source_level_debugger/source_level_debugger.cpp +++ b/shared/source/source_level_debugger/source_level_debugger.cpp @@ -1,5 +1,5 @@ /* - * Copyright (C) 2018-2020 Intel Corporation + * Copyright (C) 2018-2021 Intel Corporation * * SPDX-License-Identifier: MIT * @@ -10,6 +10,7 @@ #include "shared/source/debug_settings/debug_settings_manager.h" #include "shared/source/debugger/debugger.h" #include "shared/source/helpers/debug_helpers.h" +#include "shared/source/helpers/file_io.h" #include "shared/source/kernel/debug_data.h" #include "shared/source/os_interface/os_interface.h" @@ -213,6 +214,18 @@ bool SourceLevelDebugger::notifyKernelDebugData(const DebugData *debugData, cons kernelDebugData.dbgVisaSize = debugData->vIsaSize; kernelDebugData.dbgGenIsaBuffer = debugData->genIsa; kernelDebugData.dbgGenIsaSize = debugData->genIsaSize; + + if (NEO::DebugManager.flags.DebuggerLogBitmask.get() & NEO::DebugVariables::DEBUGGER_LOG_BITMASK::DUMP_ELF) { + std::ofstream elfFile; + std::string fileName = name + ".elf"; + + int suffix = 0; + while (fileExists(fileName)) { + fileName = name + "_" + std::to_string(suffix) + ".elf"; + suffix++; + } + writeDataToFile(fileName.c_str(), kernelDebugData.dbgVisaBuffer, kernelDebugData.dbgVisaSize); + } } if (sourceLevelDebuggerInterface) {