diff --git a/opencl/source/program/build.cpp b/opencl/source/program/build.cpp index 44c3f4d547..6580a2a68c 100644 --- a/opencl/source/program/build.cpp +++ b/opencl/source/program/build.cpp @@ -186,26 +186,7 @@ cl_int Program::build( if (BuildPhase::DebugDataNotification == phaseReached[rootDeviceIndex]) { continue; } - auto refBin = ArrayRef(reinterpret_cast(this->buildInfos[clDevice->getRootDeviceIndex()].unpackedDeviceBinary.get()), this->buildInfos[clDevice->getRootDeviceIndex()].unpackedDeviceBinarySize); - if (NEO::isDeviceBinaryFormat(refBin)) { - createDebugZebin(clDevice->getRootDeviceIndex()); - if (clDevice->getSourceLevelDebugger()) { - NEO::DebugData debugData; - debugData.vIsa = reinterpret_cast(this->buildInfos[clDevice->getRootDeviceIndex()].debugData.get()); - debugData.vIsaSize = static_cast(this->buildInfos[clDevice->getRootDeviceIndex()].debugDataSize); - clDevice->getSourceLevelDebugger()->notifyKernelDebugData(&debugData, "debug_zebin", nullptr, 0); - } - } else { - processDebugData(clDevice->getRootDeviceIndex()); - if (clDevice->getSourceLevelDebugger()) { - for (auto kernelInfo : buildInfos[rootDeviceIndex].kernelInfoArray) { - clDevice->getSourceLevelDebugger()->notifyKernelDebugData(&kernelInfo->debugData, - kernelInfo->kernelDescriptor.kernelMetadata.kernelName, - kernelInfo->heapInfo.pKernelHeap, - kernelInfo->heapInfo.KernelHeapSize); - } - } - } + notifyDebuggerWithDebugData(clDevice); phaseReached[rootDeviceIndex] = BuildPhase::DebugDataNotification; } } diff --git a/opencl/source/program/link.cpp b/opencl/source/program/link.cpp index 6ab6152d6e..4cb8a3def5 100644 --- a/opencl/source/program/link.cpp +++ b/opencl/source/program/link.cpp @@ -13,7 +13,6 @@ #include "shared/source/device_binary_format/elf/ocl_elf.h" #include "shared/source/execution_environment/execution_environment.h" #include "shared/source/program/kernel_info.h" -#include "shared/source/source_level_debugger/source_level_debugger.h" #include "shared/source/utilities/stackvec.h" #include "opencl/source/cl_device/cl_device.h" @@ -171,13 +170,7 @@ cl_int Program::link( if (kernelDebugDataNotified[rootDeviceIndex]) { continue; } - createDebugData(rootDeviceIndex); - for (auto kernelInfo : buildInfos[rootDeviceIndex].kernelInfoArray) { - device->getSourceLevelDebugger()->notifyKernelDebugData(&kernelInfo->debugData, - kernelInfo->kernelDescriptor.kernelMetadata.kernelName, - kernelInfo->heapInfo.pKernelHeap, - kernelInfo->heapInfo.KernelHeapSize); - } + notifyDebuggerWithDebugData(device); kernelDebugDataNotified[device->getRootDeviceIndex()] = true; } } diff --git a/opencl/source/program/process_device_binary.cpp b/opencl/source/program/process_device_binary.cpp index 7c0c89b03a..dbeb7f040a 100644 --- a/opencl/source/program/process_device_binary.cpp +++ b/opencl/source/program/process_device_binary.cpp @@ -15,6 +15,7 @@ #include "shared/source/program/kernel_info.h" #include "shared/source/program/program_info.h" #include "shared/source/program/program_initialization.h" +#include "shared/source/source_level_debugger/source_level_debugger.h" #include "opencl/source/cl_device/cl_device.h" #include "opencl/source/context/context.h" @@ -297,12 +298,28 @@ void Program::createDebugZebin(uint32_t rootDeviceIndex) { debugZebin.data(), debugZebin.size()); } -void Program::createDebugData(uint32_t rootDeviceIndex) { - auto refBin = ArrayRef(reinterpret_cast(buildInfos[rootDeviceIndex].unpackedDeviceBinary.get()), buildInfos[rootDeviceIndex].unpackedDeviceBinarySize); - if (isDeviceBinaryFormat(refBin)) { +void Program::notifyDebuggerWithDebugData(ClDevice *clDevice) { + auto rootDeviceIndex = clDevice->getRootDeviceIndex(); + auto &buildInfo = this->buildInfos[rootDeviceIndex]; + auto refBin = ArrayRef(reinterpret_cast(buildInfo.unpackedDeviceBinary.get()), buildInfo.unpackedDeviceBinarySize); + if (NEO::isDeviceBinaryFormat(refBin)) { createDebugZebin(rootDeviceIndex); + if (clDevice->getSourceLevelDebugger()) { + NEO::DebugData debugData; + debugData.vIsa = reinterpret_cast(buildInfo.debugData.get()); + debugData.vIsaSize = static_cast(buildInfo.debugDataSize); + clDevice->getSourceLevelDebugger()->notifyKernelDebugData(&debugData, "debug_zebin", nullptr, 0); + } } else { processDebugData(rootDeviceIndex); + if (clDevice->getSourceLevelDebugger()) { + for (auto &kernelInfo : buildInfo.kernelInfoArray) { + clDevice->getSourceLevelDebugger()->notifyKernelDebugData(&kernelInfo->debugData, + kernelInfo->kernelDescriptor.kernelMetadata.kernelName, + kernelInfo->heapInfo.pKernelHeap, + kernelInfo->heapInfo.KernelHeapSize); + } + } } } } // namespace NEO diff --git a/opencl/source/program/program.h b/opencl/source/program/program.h index abb4ba499f..03a0e0d7c4 100644 --- a/opencl/source/program/program.h +++ b/opencl/source/program/program.h @@ -276,7 +276,7 @@ class Program : public BaseObject<_cl_program> { this->context = pContext; } - void createDebugData(uint32_t rootDeviceIndex); + void notifyDebuggerWithDebugData(ClDevice *clDevice); MOCKABLE_VIRTUAL void createDebugZebin(uint32_t rootDeviceIndex); Debug::Segments getZebinSegments(uint32_t rootDeviceIndex); diff --git a/opencl/test/unit_test/program/program_with_zebin_tests.cpp b/opencl/test/unit_test/program/program_with_zebin_tests.cpp index a842bd1688..2f44473dae 100644 --- a/opencl/test/unit_test/program/program_with_zebin_tests.cpp +++ b/opencl/test/unit_test/program/program_with_zebin_tests.cpp @@ -65,22 +65,6 @@ TEST_F(ProgramWithZebinFixture, givenEmptyDebugDataThenDebugZebinIsCreatedAndSto EXPECT_NE(nullptr, program->buildInfos[rootDeviceIndex].debugData.get()); } -TEST_F(ProgramWithZebinFixture, givenZebinaryFormatInCreateDebugDataThenCreateDebugZebinIsCalled) { - addEmptyZebin(program.get()); - program->createDebugData(rootDeviceIndex); - EXPECT_TRUE(program->wasCreateDebugZebinCalled); - EXPECT_FALSE(program->wasProcessDebugDataCalled); -} - -TEST_F(ProgramWithZebinFixture, givenNonZebinaryFormatInCreateDebugDataThenProcessDebugDataIsCalled) { - size_t fakeBinarySize = 8u; - program->buildInfos[rootDeviceIndex].unpackedDeviceBinarySize = fakeBinarySize; - program->buildInfos[rootDeviceIndex].unpackedDeviceBinary.reset(new char[fakeBinarySize]); - program->createDebugData(rootDeviceIndex); - EXPECT_FALSE(program->wasCreateDebugZebinCalled); - EXPECT_TRUE(program->wasProcessDebugDataCalled); -} - TEST_F(ProgramWithZebinFixture, givenEmptyDebugDataAndZebinBinaryFormatThenCreateDebugZebinAndReturnOnGetInfo) { addEmptyZebin(program.get()); populateProgramWithSegments(program.get()); @@ -131,41 +115,40 @@ TEST_F(ProgramWithZebinFixture, givenEmptyDebugDataAndZebinBinaryFormatThenCreat EXPECT_EQ(numDevices * sizeof(debugData), retData); } -TEST_F(ProgramWithZebinFixture, givenZebinBinaryFormatWhenProgramIsBuiltWithKernelDebugEnabledAndDebuggerAvailableThenDebugZebinCreationIsCalledAndDebuggerNotified) { - addEmptyZebin(program.get()); +TEST_F(ProgramWithZebinFixture, givenZebinFormatAndDebuggerNotAvailableWhenNotifyingDebuggerThenCreateDebugZebinIsCalled) { + pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->debugger.reset(nullptr); + addEmptyZebin(program.get()); + populateProgramWithSegments(program.get()); + auto &buildInfo = program->buildInfos[rootDeviceIndex]; + buildInfo.debugDataSize = 0u; + buildInfo.debugData.reset(nullptr); + for (auto &device : program->getDevices()) { + program->notifyDebuggerWithDebugData(device); + } + EXPECT_TRUE(program->wasCreateDebugZebinCalled); + EXPECT_FALSE(program->wasProcessDebugDataCalled); + EXPECT_NE(nullptr, program->buildInfos[rootDeviceIndex].debugData); + EXPECT_GT(program->buildInfos[rootDeviceIndex].debugDataSize, 0u); +} + +TEST_F(ProgramWithZebinFixture, givenZebinFormatAndDebuggerAvailableWhenNotifyingDebuggerThenCreateDebugZebinIsCalledAndDebuggerNotified) { MockSourceLevelDebugger *sourceLevelDebugger = new MockSourceLevelDebugger; sourceLevelDebugger->setActive(true); pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->debugger.reset(sourceLevelDebugger); - program->createdFrom = Program::CreatedFrom::BINARY; - program->isCreatedFromBinary = true; - program->enableKernelDebug(); - auto retVal = program->build( - program->getDevices(), - nullptr, - false); - - EXPECT_EQ(CL_SUCCESS, retVal); - EXPECT_TRUE(program->wasCreateDebugZebinCalled); - EXPECT_FALSE(program->wasProcessDebugDataCalled); - EXPECT_EQ(1u, sourceLevelDebugger->notifyKernelDebugDataCalled); -} - -TEST_F(ProgramWithZebinFixture, givenZebinBinaryFormatWhenProgramIsBuiltWithKernelDebugEnabledAndNoDebuggerThenDebugZebinCreationIsCalled) { addEmptyZebin(program.get()); - - pClDevice->getExecutionEnvironment()->rootDeviceEnvironments[pDevice->getRootDeviceIndex()]->debugger.reset(nullptr); - - program->createdFrom = Program::CreatedFrom::BINARY; - program->isCreatedFromBinary = true; - program->enableKernelDebug(); - auto retVal = program->build( - program->getDevices(), - nullptr, - false); - - EXPECT_EQ(CL_SUCCESS, retVal); + populateProgramWithSegments(program.get()); + auto &buildInfo = program->buildInfos[rootDeviceIndex]; + buildInfo.debugDataSize = 0u; + buildInfo.debugData.reset(nullptr); + for (auto &device : program->getDevices()) { + program->notifyDebuggerWithDebugData(device); + } EXPECT_TRUE(program->wasCreateDebugZebinCalled); EXPECT_FALSE(program->wasProcessDebugDataCalled); + EXPECT_NE(nullptr, program->buildInfos[rootDeviceIndex].debugData); + EXPECT_GT(program->buildInfos[rootDeviceIndex].debugDataSize, 0u); + + EXPECT_EQ(1u, sourceLevelDebugger->notifyKernelDebugDataCalled); } \ No newline at end of file