Skip to content

Commit 80ed37f

Browse files
Return debug ZeBin on getDebugInfo in Level Zero
Signed-off-by: Kacper Nowak <[email protected]>
1 parent 59bf2e0 commit 80ed37f

File tree

4 files changed

+57
-14
lines changed

4 files changed

+57
-14
lines changed

level_zero/core/source/module/module_imp.cpp

Lines changed: 24 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -555,21 +555,25 @@ bool ModuleImp::initialize(const ze_module_desc_t *desc, NEO::Device *neoDevice)
555555
return success;
556556
}
557557

558-
void ModuleImp::passDebugData() {
558+
void ModuleImp::createDebugZebin() {
559559
auto refBin = ArrayRef<const uint8_t>(reinterpret_cast<const uint8_t *>(translationUnit->unpackedDeviceBinary.get()), translationUnit->unpackedDeviceBinarySize);
560-
if (NEO::isDeviceBinaryFormat<NEO::DeviceBinaryFormat::Zebin>(refBin)) {
561-
auto segments = getZebinSegments();
562-
auto debugZebin = NEO::Debug::createDebugZebin(refBin, segments);
560+
auto segments = getZebinSegments();
561+
auto debugZebin = NEO::Debug::createDebugZebin(refBin, segments);
563562

564-
translationUnit->debugDataSize = debugZebin.size();
565-
translationUnit->debugData.reset(new char[translationUnit->debugDataSize]);
566-
memcpy_s(translationUnit->debugData.get(), translationUnit->debugDataSize,
567-
debugZebin.data(), debugZebin.size());
563+
translationUnit->debugDataSize = debugZebin.size();
564+
translationUnit->debugData.reset(new char[translationUnit->debugDataSize]);
565+
memcpy_s(translationUnit->debugData.get(), translationUnit->debugDataSize,
566+
debugZebin.data(), debugZebin.size());
567+
}
568568

569+
void ModuleImp::passDebugData() {
570+
auto refBin = ArrayRef<const uint8_t>(reinterpret_cast<const uint8_t *>(translationUnit->unpackedDeviceBinary.get()), translationUnit->unpackedDeviceBinarySize);
571+
if (NEO::isDeviceBinaryFormat<NEO::DeviceBinaryFormat::Zebin>(refBin)) {
572+
createDebugZebin();
569573
if (device->getSourceLevelDebugger()) {
570574
NEO::DebugData debugData; // pass debug zebin in vIsa field
571-
debugData.vIsa = reinterpret_cast<const char *>(debugZebin.data());
572-
debugData.vIsaSize = static_cast<uint32_t>(debugZebin.size());
575+
debugData.vIsa = reinterpret_cast<const char *>(translationUnit->debugData.get());
576+
debugData.vIsaSize = static_cast<uint32_t>(translationUnit->debugDataSize);
573577
device->getSourceLevelDebugger()->notifyKernelDebugData(&debugData, "debug_zebin", nullptr, 0);
574578
}
575579
} else {
@@ -656,11 +660,17 @@ ze_result_t ModuleImp::getDebugInfo(size_t *pDebugDataSize, uint8_t *pDebugData)
656660
if (translationUnit == nullptr) {
657661
return ZE_RESULT_ERROR_UNINITIALIZED;
658662
}
659-
if (pDebugData == nullptr) {
660-
*pDebugDataSize = translationUnit->debugDataSize;
661-
return ZE_RESULT_SUCCESS;
663+
auto refBin = ArrayRef<const uint8_t>(reinterpret_cast<const uint8_t *>(translationUnit->unpackedDeviceBinary.get()), translationUnit->unpackedDeviceBinarySize);
664+
if (nullptr == translationUnit->debugData.get() && NEO::isDeviceBinaryFormat<NEO::DeviceBinaryFormat::Zebin>(refBin)) {
665+
createDebugZebin();
666+
}
667+
if (pDebugData != nullptr) {
668+
if (*pDebugDataSize < translationUnit->debugDataSize) {
669+
return ZE_RESULT_ERROR_INVALID_ARGUMENT;
670+
}
671+
memcpy_s(pDebugData, *pDebugDataSize, translationUnit->debugData.get(), translationUnit->debugDataSize);
662672
}
663-
memcpy_s(pDebugData, *pDebugDataSize, translationUnit->debugData.get(), translationUnit->debugDataSize);
673+
*pDebugDataSize = translationUnit->debugDataSize;
664674
return ZE_RESULT_SUCCESS;
665675
}
666676

level_zero/core/source/module/module_imp.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ struct ModuleImp : public Module {
139139
void checkIfPrivateMemoryPerDispatchIsNeeded() override;
140140
NEO::Debug::Segments getZebinSegments();
141141
void passDebugData();
142+
void createDebugZebin();
142143

143144
Device *device = nullptr;
144145
PRODUCT_FAMILY productFamily{};

level_zero/core/test/unit_tests/fixtures/module_fixture.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,7 @@ struct ModuleWithZebinFixture : public DeviceFixture {
315315
};
316316

317317
struct MockModuleWithZebin : public L0::ModuleImp {
318+
using ModuleImp::getDebugInfo;
318319
using ModuleImp::getZebinSegments;
319320
using ModuleImp::kernelImmDatas;
320321
using ModuleImp::passDebugData;

level_zero/core/test/unit_tests/sources/module/test_module.cpp

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2088,5 +2088,36 @@ TEST_F(ModuleWithZebinTest, givenZebinSegmentsThenSegmentsArePopulated) {
20882088
EXPECT_EQ(module->translationUnit->programInfo.globalStrings.size, segments.stringData.data.size());
20892089
}
20902090

2091+
TEST_F(ModuleWithZebinTest, givenValidZebinWhenGettingDebugInfoThenDebugZebinIsCreatedAndReturned) {
2092+
module->addEmptyZebin();
2093+
size_t debugDataSize;
2094+
module->getDebugInfo(&debugDataSize, nullptr);
2095+
auto debugData = std::make_unique<uint8_t[]>(debugDataSize);
2096+
ze_result_t retCode = module->getDebugInfo(&debugDataSize, debugData.get());
2097+
ASSERT_NE(nullptr, module->translationUnit->debugData.get());
2098+
EXPECT_EQ(0, memcmp(module->translationUnit->debugData.get(), debugData.get(), debugDataSize));
2099+
EXPECT_EQ(retCode, ZE_RESULT_SUCCESS);
2100+
}
2101+
2102+
TEST_F(ModuleWithZebinTest, givenValidZebinAndPassedDataSmallerThanDebugDataThenErrorIsReturned) {
2103+
module->addEmptyZebin();
2104+
size_t debugDataSize;
2105+
module->getDebugInfo(&debugDataSize, nullptr);
2106+
auto debugData = std::make_unique<uint8_t[]>(debugDataSize);
2107+
debugDataSize = 0;
2108+
ze_result_t errorCode = module->getDebugInfo(&debugDataSize, debugData.get());
2109+
EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, errorCode);
2110+
}
2111+
2112+
TEST_F(ModuleWithZebinTest, givenNonZebinaryFormatWhenGettingDebugInfoThenDebugZebinIsNotCreated) {
2113+
size_t mockProgramSize = sizeof(Elf::ElfFileHeader<Elf::EI_CLASS_64>);
2114+
module->translationUnit->unpackedDeviceBinary = std::make_unique<char[]>(mockProgramSize);
2115+
module->translationUnit->unpackedDeviceBinarySize = mockProgramSize;
2116+
size_t debugDataSize;
2117+
ze_result_t retCode = module->getDebugInfo(&debugDataSize, nullptr);
2118+
EXPECT_EQ(debugDataSize, 0u);
2119+
EXPECT_EQ(retCode, ZE_RESULT_SUCCESS);
2120+
}
2121+
20912122
} // namespace ult
20922123
} // namespace L0

0 commit comments

Comments
 (0)