From c2e3d24a1d85a7ddf4a25c286a07226e95673595 Mon Sep 17 00:00:00 2001 From: Neil R Spruit Date: Thu, 9 Jun 2022 02:18:38 +0000 Subject: [PATCH] Enable Symbol Table Generation by Default for L0 modules - Added EnableProgramSymbolTableGeneration to enable or disable default behavior for IGC to generate the program symbol tables for L0 modules with exported functions. - Default value set to true to add -library-compilation to all module builds. Signed-off-by: Neil R Spruit --- level_zero/core/source/module/module_imp.cpp | 5 ++ level_zero/core/source/module/module_imp.h | 2 + .../unit_tests/sources/module/test_module.cpp | 56 +++++++++++++++++++ .../debug_settings/debug_variables_base.inl | 1 + shared/test/common/test_files/igdrcl.config | 1 + 5 files changed, 65 insertions(+) diff --git a/level_zero/core/source/module/module_imp.cpp b/level_zero/core/source/module/module_imp.cpp index e95f732c9d..28066d264b 100644 --- a/level_zero/core/source/module/module_imp.cpp +++ b/level_zero/core/source/module/module_imp.cpp @@ -49,6 +49,7 @@ NEO::ConstStringRef optLevel = "-ze-opt-level"; NEO::ConstStringRef greaterThan4GbRequired = "-ze-opt-greater-than-4GB-buffer-required"; NEO::ConstStringRef hasBufferOffsetArg = "-ze-intel-has-buffer-offset-arg"; NEO::ConstStringRef debugKernelEnable = "-ze-kernel-debug-enable"; +NEO::ConstStringRef enableLibraryCompile = "-library-compilation"; } // namespace BuildOptions ModuleTranslationUnit::ModuleTranslationUnit(L0::Device *device) @@ -665,12 +666,16 @@ void ModuleImp::createBuildOptions(const char *pBuildFlags, std::string &apiOpti moveBuildOption(apiOptions, apiOptions, NEO::CompilerOptions::optLevel, BuildOptions::optLevel); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::greaterThan4gbBuffersRequired, BuildOptions::greaterThan4GbRequired); moveBuildOption(internalBuildOptions, apiOptions, NEO::CompilerOptions::allowZebin, NEO::CompilerOptions::allowZebin); + this->libraryExportEnabled = moveBuildOption(apiOptions, apiOptions, BuildOptions::enableLibraryCompile, BuildOptions::enableLibraryCompile); createBuildExtraOptions(apiOptions, internalBuildOptions); } if (NEO::ApiSpecificConfig::getBindlessConfiguration()) { NEO::CompilerOptions::concatenateAppend(internalBuildOptions, NEO::CompilerOptions::bindlessMode.str()); } + if (!this->libraryExportEnabled && NEO::DebugManager.flags.EnableProgramSymbolTableGeneration.get()) { + NEO::CompilerOptions::concatenateAppend(apiOptions, BuildOptions::enableLibraryCompile.str()); + } } void ModuleImp::updateBuildLog(NEO::Device *neoDevice) { diff --git a/level_zero/core/source/module/module_imp.h b/level_zero/core/source/module/module_imp.h index 1719593808..312a480fc4 100644 --- a/level_zero/core/source/module/module_imp.h +++ b/level_zero/core/source/module/module_imp.h @@ -30,6 +30,7 @@ extern NEO::ConstStringRef optLevel; extern NEO::ConstStringRef greaterThan4GbRequired; extern NEO::ConstStringRef hasBufferOffsetArg; extern NEO::ConstStringRef debugKernelEnable; +extern NEO::ConstStringRef enableLibraryCompile; } // namespace BuildOptions struct ModuleTranslationUnit { @@ -158,6 +159,7 @@ struct ModuleImp : public Module { bool debugEnabled = false; bool isFullyLinked = false; bool allocatePrivateMemoryPerDispatch = true; + bool libraryExportEnabled = false; ModuleType type; NEO::Linker::UnresolvedExternals unresolvedExternalsInfo{}; std::set importedSymbolAllocations{}; 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 d4c79d06b7..6b8a13891d 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 @@ -2311,6 +2311,62 @@ TEST(BuildOptions, givenSrcOptLevelWithoutLevelIntegerInSrcNamesWhenMovingBuildO EXPECT_FALSE(result); } +TEST_F(ModuleTest, givenBuildOptionsWhenEnableProgramSymbolTableGenerationIsEnabledThenEnableLibraryCompileIsSet) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableProgramSymbolTableGeneration.set(1); + auto module = std::make_unique(device, nullptr, ModuleType::User); + ASSERT_NE(nullptr, module); + + std::string buildOptions; + std::string internalBuildOptions; + + module->createBuildOptions("", buildOptions, internalBuildOptions); + + EXPECT_TRUE(NEO::CompilerOptions::contains(buildOptions, BuildOptions::enableLibraryCompile)); +} + +TEST_F(ModuleTest, givenBuildOptionsWhenEnableProgramSymbolTableGenerationIsDisabledThenEnableLibraryCompileIsNotSet) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableProgramSymbolTableGeneration.set(0); + auto module = std::make_unique(device, nullptr, ModuleType::User); + ASSERT_NE(nullptr, module); + + std::string buildOptions; + std::string internalBuildOptions; + + module->createBuildOptions("", buildOptions, internalBuildOptions); + + EXPECT_FALSE(NEO::CompilerOptions::contains(buildOptions, BuildOptions::enableLibraryCompile)); +} + +TEST_F(ModuleTest, givenBuildOptionsWithEnableLibraryCompileWhenEnableProgramSymbolTableGenerationIsDisabledThenEnableLibraryCompileIsSet) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableProgramSymbolTableGeneration.set(0); + auto module = std::make_unique(device, nullptr, ModuleType::User); + ASSERT_NE(nullptr, module); + + std::string buildOptions; + std::string internalBuildOptions; + + module->createBuildOptions(BuildOptions::enableLibraryCompile.str().c_str(), buildOptions, internalBuildOptions); + + EXPECT_TRUE(NEO::CompilerOptions::contains(buildOptions, BuildOptions::enableLibraryCompile)); +} + +TEST_F(ModuleTest, givenBuildOptionsWithEnableLibraryCompileWhenEnableProgramSymbolTableGenerationIsEnabledThenEnableLibraryCompileIsSet) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableProgramSymbolTableGeneration.set(1); + auto module = std::make_unique(device, nullptr, ModuleType::User); + ASSERT_NE(nullptr, module); + + std::string buildOptions; + std::string internalBuildOptions; + + module->createBuildOptions(BuildOptions::enableLibraryCompile.str().c_str(), buildOptions, internalBuildOptions); + + EXPECT_TRUE(NEO::CompilerOptions::contains(buildOptions, BuildOptions::enableLibraryCompile)); +} + TEST_F(ModuleTest, givenInternalOptionsWhenBindlessEnabledThenBindlesOptionsPassed) { DebugManagerStateRestore restorer; DebugManager.flags.UseBindlessMode.set(1); diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index eb2c45e13d..f63dca9bec 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -334,6 +334,7 @@ DECLARE_DEBUG_VARIABLE(bool, ForceSamplerLowFilteringPrecision, false, "Force Lo DECLARE_DEBUG_VARIABLE(bool, EngineInstancedSubDevices, false, "Create subdevices assigned to specific engine") DECLARE_DEBUG_VARIABLE(bool, AllowSingleTileEngineInstancedSubDevices, false, "Create subdevices assigned to specific engine on single tile config") DECLARE_DEBUG_VARIABLE(bool, EnablePrivateBO, false, "Enable PRELIM_I915_GEM_CREATE_EXT_VM_PRIVATE extension creating VM_PRIVATE BOs") +DECLARE_DEBUG_VARIABLE(bool, EnableProgramSymbolTableGeneration, true, "Enforce IGC to always generate the Program Symbol Table for Exported Functions for all Modules used by Level Zero.") DECLARE_DEBUG_VARIABLE(int32_t, ReturnSubDevicesAsApiDevices, -1, "Expose each subdevice as a separate device during clGetDeviceIDs or zeDeviceGet API call") DECLARE_DEBUG_VARIABLE(int32_t, ForceRunAloneContext, -1, "Control creation of run-alone HW context, -1:default, 0:disable, 1:enable") DECLARE_DEBUG_VARIABLE(int32_t, AddClGlSharing, -1, "Add cl-gl extension") diff --git a/shared/test/common/test_files/igdrcl.config b/shared/test/common/test_files/igdrcl.config index 6de36d9b60..d8ede563a1 100644 --- a/shared/test/common/test_files/igdrcl.config +++ b/shared/test/common/test_files/igdrcl.config @@ -349,6 +349,7 @@ AllowPatchingVfeStateInCommandLists = 0 PrintMemoryRegionSizes = 0 OverrideDrmRegion = -1 AllowSingleTileEngineInstancedSubDevices = 0 +EnableProgramSymbolTableGeneration = 1 BinaryCacheTrace = false OverrideL1CacheControlInSurfaceState = -1 OverrideL1CacheControlInSurfaceStateForScratchSpace = -1