From 30426d35c8cb87e528addef19ccfc8d529e76ff2 Mon Sep 17 00:00:00 2001 From: Mateusz Hoppe Date: Fri, 28 Jul 2023 18:21:31 +0000 Subject: [PATCH] feature(zebin): dump zebin when building module from SPIRV - Debug key DumpZEBin should dump zebin elf for modules created from SPIRV format Related-To: NEO-7895 Signed-off-by: Mateusz Hoppe --- level_zero/core/source/module/module_imp.cpp | 4 ++ .../unit_tests/sources/module/test_module.cpp | 48 +++++++++++++++++++ 2 files changed, 52 insertions(+) diff --git a/level_zero/core/source/module/module_imp.cpp b/level_zero/core/source/module/module_imp.cpp index fb280e0923..ab7c6c3665 100644 --- a/level_zero/core/source/module/module_imp.cpp +++ b/level_zero/core/source/module/module_imp.cpp @@ -370,6 +370,10 @@ ze_result_t ModuleTranslationUnit::processUnpackedBinary() { return ZE_RESULT_ERROR_MODULE_BUILD_FAILURE; } + if (singleDeviceBinaryFormat == NEO::DeviceBinaryFormat::Zebin && NEO::DebugManager.flags.DumpZEBin.get() == 1) { + dumpFileIncrement(reinterpret_cast(blob.begin()), blob.size(), "dumped_zebin_module", ".elf"); + } + processDebugData(); size_t slmNeeded = NEO::getMaxInlineSlmNeeded(programInfo); diff --git a/level_zero/core/test/unit_tests/sources/module/test_module.cpp b/level_zero/core/test/unit_tests/sources/module/test_module.cpp index 6e3645b410..74fa1143c8 100644 --- a/level_zero/core/test/unit_tests/sources/module/test_module.cpp +++ b/level_zero/core/test/unit_tests/sources/module/test_module.cpp @@ -16,6 +16,7 @@ #include "shared/source/helpers/addressing_mode_helper.h" #include "shared/source/helpers/blit_helper.h" #include "shared/source/helpers/compiler_product_helper.h" +#include "shared/source/helpers/file_io.h" #include "shared/source/helpers/gfx_core_helper.h" #include "shared/source/kernel/implicit_args.h" #include "shared/source/os_interface/os_inc_base.h" @@ -2981,6 +2982,53 @@ HWTEST2_F(ModuleTranslationUnitTest, givenDebugFlagSetToWbWhenGetInternalOptions EXPECT_NE(pMockCompilerInterface->inputInternalOptions.find("-cl-store-cache-default=7 -cl-load-cache-default=4"), std::string::npos); } +HWTEST_F(ModuleTranslationUnitTest, givenDumpZebinWhenBuildingFromSpirvThenZebinElfDumped) { + DebugManagerStateRestore restorer; + DebugManager.flags.DumpZEBin.set(1); + + auto mockCompilerInterface = new NEO::MockCompilerInterfaceCaptureBuildOptions; + auto &rootDeviceEnvironment = this->neoDevice->executionEnvironment->rootDeviceEnvironments[this->neoDevice->getRootDeviceIndex()]; + rootDeviceEnvironment->compilerInterface.reset(mockCompilerInterface); + + char binary[10]; + auto zebin = ZebinTestData::ValidEmptyProgram<>(); + + mockCompilerInterface->output.intermediateRepresentation.size = zebin.storage.size(); + mockCompilerInterface->output.intermediateRepresentation.mem.reset(new char[zebin.storage.size()]); + + memcpy_s(mockCompilerInterface->output.intermediateRepresentation.mem.get(), mockCompilerInterface->output.intermediateRepresentation.size, + zebin.storage.data(), zebin.storage.size()); + + MockModuleTranslationUnit moduleTu(this->device); + moduleTu.processUnpackedBinaryCallBase = true; + ze_result_t result = ZE_RESULT_ERROR_MODULE_BUILD_FAILURE; + + std::string fileName = "dumped_zebin_module.elf"; + EXPECT_FALSE(fileExists(fileName)); + + result = moduleTu.buildFromSpirV(binary, sizeof(binary), nullptr, "", nullptr); + EXPECT_EQ(result, ZE_RESULT_SUCCESS); + + EXPECT_TRUE(fileExistsHasSize(fileName)); + std::remove(fileName.c_str()); + + PatchTokensTestData::ValidEmptyProgram programTokens; + mockCompilerInterface->output.intermediateRepresentation.size = programTokens.storage.size(); + mockCompilerInterface->output.intermediateRepresentation.mem.reset(new char[programTokens.storage.size()]); + + memcpy_s(mockCompilerInterface->output.intermediateRepresentation.mem.get(), mockCompilerInterface->output.intermediateRepresentation.size, + programTokens.storage.data(), programTokens.storage.size()); + + MockModuleTranslationUnit moduleTu2(this->device); + moduleTu2.processUnpackedBinaryCallBase = true; + + result = moduleTu2.buildFromSpirV(binary, sizeof(binary), nullptr, "", nullptr); + + EXPECT_FALSE(fileExists(fileName)); + EXPECT_FALSE(fileExistsHasSize(fileName)); + std::remove(fileName.c_str()); +} + HWTEST2_F(ModuleTranslationUnitTest, givenDebugFlagSetForceAllResourcesUncachedWhenGetInternalOptionsThenCorrectBuildOptionIsSet, IsAtLeastXeHpgCore) { DebugManagerStateRestore restorer; DebugManager.flags.OverrideL1CachePolicyInSurfaceStateAndStateless.set(2);