From 6b04f377ac288795dc3a56f8f0e0074f056f6722 Mon Sep 17 00:00:00 2001 From: Nicholaus Clark Date: Tue, 26 Nov 2024 12:39:48 -0500 Subject: [PATCH] Replace LTO flag with dedicated API --- modules/gmake/tests/cpp/test_clang.lua | 19 ++++++++++++++- .../tests/vc200x/test_compiler_block.lua | 14 ++++++++++- .../tests/vc2010/test_config_props.lua | 15 +++++++++++- modules/vstudio/vs200x_vcproj.lua | 4 +++- modules/vstudio/vs2010_vcxproj.lua | 10 +++++--- src/_premake_init.lua | 22 +++++++++++++++++- src/base/config.lua | 2 +- src/tools/clang.lua | 9 ++++---- src/tools/gcc.lua | 8 +++---- src/tools/msc.lua | 8 +++++-- tests/tools/test_gcc.lua | 16 +++++++++++-- tests/tools/test_msc.lua | 16 +++++++++++-- website/docs/flags.md | 4 ++-- website/docs/linktimeoptimization.md | 23 +++++++++++++++++++ website/sidebars.js | 1 + 15 files changed, 145 insertions(+), 26 deletions(-) create mode 100644 website/docs/linktimeoptimization.md diff --git a/modules/gmake/tests/cpp/test_clang.lua b/modules/gmake/tests/cpp/test_clang.lua index abeba42ed1..c3cc90ace2 100644 --- a/modules/gmake/tests/cpp/test_clang.lua +++ b/modules/gmake/tests/cpp/test_clang.lua @@ -44,7 +44,7 @@ ifeq ($(config),debug) ]] end - function suite.usesCorrectCompilersAndLinkTimeOptimization() + function suite.usesCorrectCompilersAndLinkTimeOptimizationViaFlag() flags { "LinkTimeOptimization" } make.cppConfigs(prj) test.capture [[ @@ -61,3 +61,20 @@ ifeq ($(config),debug) ]] end + function suite.usesCorrectCompilersAndLinkTimeOptimizationViaAPI() + linktimeoptimization "On" + make.cppConfigs(prj) + test.capture [[ +ifeq ($(config),debug) + ifeq ($(origin CC), default) + CC = clang + endif + ifeq ($(origin CXX), default) + CXX = clang++ + endif + ifeq ($(origin AR), default) + AR = llvm-ar + endif + ]] + end + diff --git a/modules/vstudio/tests/vc200x/test_compiler_block.lua b/modules/vstudio/tests/vc200x/test_compiler_block.lua index b75648a25f..8ab67e60a5 100644 --- a/modules/vstudio/tests/vc200x/test_compiler_block.lua +++ b/modules/vstudio/tests/vc200x/test_compiler_block.lua @@ -570,7 +570,7 @@ -- Check the LinkTimeOptimization flag. -- - function suite.flags_onLinkTimeOptimization() + function suite.flags_onLinkTimeOptimizationViaFlag() flags { "LinkTimeOptimization" } prepare() test.capture [[ @@ -582,6 +582,18 @@ end + function suite.flags_onLinkTimeOptimization() + linktimeoptimization "On" + prepare() + test.capture [[ + + Application + false + Unicode + v100 + true + ]] + end + -- -- Check the WindowsSDKDesktopARMSupport element diff --git a/modules/vstudio/vs200x_vcproj.lua b/modules/vstudio/vs200x_vcproj.lua index 9ddcadd6f7..cea2fcac2b 100644 --- a/modules/vstudio/vs200x_vcproj.lua +++ b/modules/vstudio/vs200x_vcproj.lua @@ -1614,8 +1614,10 @@ function m.wholeProgramOptimization(cfg) - if cfg.flags.LinkTimeOptimization then + if cfg.linktimeoptimization == "On" then p.x('WholeProgramOptimization="true"') + elseif cfg.linktimeoptimization == "Off" then + p.x('WholeProgramOptimization="false"') end end diff --git a/modules/vstudio/vs2010_vcxproj.lua b/modules/vstudio/vs2010_vcxproj.lua index 24b594e0b5..0ea65df521 100644 --- a/modules/vstudio/vs2010_vcxproj.lua +++ b/modules/vstudio/vs2010_vcxproj.lua @@ -1964,8 +1964,10 @@ function m.wholeProgramOptimization(cfg) - if cfg.flags.LinkTimeOptimization then + if cfg.linktimeoptimization == "On" then m.element("WholeProgramOptimization", nil, "true") + elseif cfg.linktimeoptimization == "Off" then + m.element("WholeProgramOptimization", nil, "false") end end @@ -2730,7 +2732,7 @@ end function m.LinkTimeCodeGeneration(cfg) - if cfg.flags.LinkTimeOptimization then + if cfg.linktimeoptimization == "On" then m.element("LinkTimeCodeGeneration", nil, "UseLinkTimeCodeGeneration") end end @@ -3655,8 +3657,10 @@ end function m.linuxWholeProgramOptimization(cfg) - if cfg.flags.LinkTimeOptimization then + if cfg.linktimeoptimization == "On" then m.element("LinkTimeOptimization", nil, "true") + elseif cfg.linktimeoptimization == "Off" then + m.element("LinkTimeOptimization", nil, "false") end end diff --git a/src/_premake_init.lua b/src/_premake_init.lua index 6127a16d23..974f5e8b56 100644 --- a/src/_premake_init.lua +++ b/src/_premake_init.lua @@ -337,7 +337,7 @@ "ExcludeFromBuild", "FatalCompileWarnings", "FatalLinkWarnings", - "LinkTimeOptimization", + "LinkTimeOptimization", -- DEPRECATED "Maps", "MFC", "MultiProcessorCompile", @@ -1094,6 +1094,26 @@ externalincludedirs(value) end) + api.register { + name = "linktimeoptimization", + scope = "config", + kind = "string", + allowed = { + "Default", + "On", + "Off" + } + } + + api.deprecateValue("flags", "LinkTimeOptimization", "Use `linktimeoptimization` instead.", + function(value) + linktimeoptimization("On") + end, + function(value) + linktimeoptimization("Default") + end) + + ----------------------------------------------------------------------------- -- -- Field name aliases for backward compatibility diff --git a/src/base/config.lua b/src/base/config.lua index 1c00274ba6..3454ff83dc 100755 --- a/src/base/config.lua +++ b/src/base/config.lua @@ -153,7 +153,7 @@ if cfg.kind == "StaticLib" or config.isOptimizedBuild(cfg) or cfg.flags.NoIncrementalLink - or cfg.flags.LinkTimeOptimization then + or cfg.linktimeoptimization == "On" then return false end return true diff --git a/src/tools/clang.lua b/src/tools/clang.lua index 4736130e18..13eebfad5d 100644 --- a/src/tools/clang.lua +++ b/src/tools/clang.lua @@ -63,7 +63,8 @@ Fuzzer = "-fsanitize=fuzzer", }), visibility = gcc.shared.visibility, - inlinesvisibility = gcc.shared.inlinesvisibility + inlinesvisibility = gcc.shared.inlinesvisibility, + linktimeoptimization = gcc.shared.linktimeoptimization } clang.cflags = table.merge(gcc.cflags, { @@ -226,9 +227,7 @@ x86 = "-m32", x86_64 = "-m64", }, - flags = { - LinkTimeOptimization = "-flto", - }, + linktimeoptimization = clang.shared.linktimeoptimization, kind = { SharedLib = function(cfg) local r = { clang.getsharedlibarg(cfg) } @@ -336,7 +335,7 @@ clang.tools = { cc = "clang", cxx = "clang++", - ar = function(cfg) return iif(cfg.flags.LinkTimeOptimization, "llvm-ar", "ar") end, + ar = function(cfg) return iif(cfg.linktimeoptimization == "On", "llvm-ar", "ar") end, rc = "windres" } diff --git a/src/tools/gcc.lua b/src/tools/gcc.lua index faa5184742..06d7978c38 100644 --- a/src/tools/gcc.lua +++ b/src/tools/gcc.lua @@ -59,7 +59,6 @@ }, flags = { FatalCompileWarnings = "-Werror", - LinkTimeOptimization = "-flto", ShadowedVariables = "-Wshadow", UndefinedIdentifiers = "-Wundef", }, @@ -67,6 +66,9 @@ Fast = "-ffast-math", Strict = "-ffloat-store", }, + linktimeoptimization = { + On = "-flto", + }, strictaliasing = { Off = "-fno-strict-aliasing", Level1 = { "-fstrict-aliasing", "-Wstrict-aliasing=1" }, @@ -471,9 +473,7 @@ x86 = "-m32", x86_64 = "-m64", }, - flags = { - LinkTimeOptimization = "-flto", - }, + linktimeoptimization = gcc.shared.linktimeoptimization, kind = { SharedLib = function(cfg) local r = { gcc.getsharedlibarg(cfg) } diff --git a/src/tools/msc.lua b/src/tools/msc.lua index 51933b9dec..4565625c98 100644 --- a/src/tools/msc.lua +++ b/src/tools/msc.lua @@ -63,7 +63,6 @@ }, flags = { FatalCompileWarnings = "/WX", - LinkTimeOptimization = "/GL", MultiProcessorCompile = "/MP", NoMinimalRebuild = "/Gm-", OmitDefaultLibrary = "/Zl" @@ -89,6 +88,9 @@ intrinsics = { On = "/Oi", }, + linktimeoptimization = { + On = "/GL", + }, optimize = { Off = "/Od", On = "/Ot", @@ -332,7 +334,6 @@ msc.linkerFlags = { flags = { FatalLinkWarnings = "/WX", - LinkTimeOptimization = "/LTCG", NoIncrementalLink = "/INCREMENTAL:NO", NoManifest = "/MANIFEST:NO", OmitDefaultLibrary = "/NODEFAULTLIB", @@ -341,6 +342,9 @@ SharedLib = "/DLL", WindowedApp = "/SUBSYSTEM:WINDOWS" }, + linktimeoptimization = { + On = "/LTCG" + }, symbols = { On = "/DEBUG" } diff --git a/tests/tools/test_gcc.lua b/tests/tools/test_gcc.lua index 7bd7a2cbfc..1f5ac6e427 100644 --- a/tests/tools/test_gcc.lua +++ b/tests/tools/test_gcc.lua @@ -843,18 +843,30 @@ end -- Check handling of link time optimization flag. -- - function suite.cflags_onLinkTimeOptimization() + function suite.cflags_onLinkTimeOptimizationViaFlag() flags "LinkTimeOptimization" prepare() test.contains("-flto", gcc.getcflags(cfg)) end - function suite.ldflags_onLinkTimeOptimization() + function suite.cflags_onLinkTimeOptimizationViaAPI() + linktimeoptimization "On" + prepare() + test.contains("-flto", gcc.getcflags(cfg)) + end + + function suite.ldflags_onLinkTimeOptimizationViaFlag() flags "LinkTimeOptimization" prepare() test.contains("-flto", gcc.getldflags(cfg)) end + function suite.ldflags_onLinkTimeOptimizationViaAPI() + linktimeoptimization "On" + prepare() + test.contains("-flto", gcc.getldflags(cfg)) + end + -- -- Check link mode preference for system libraries. diff --git a/tests/tools/test_msc.lua b/tests/tools/test_msc.lua index 159a0ee6be..30e2cbb649 100644 --- a/tests/tools/test_msc.lua +++ b/tests/tools/test_msc.lua @@ -78,18 +78,30 @@ test.excludes("/Oy", msc.getcflags(cfg)) end - function suite.cflags_onLinkTimeOptimizations() + function suite.cflags_onLinkTimeOptimizationsViaFlag() flags "LinkTimeOptimization" prepare() test.contains("/GL", msc.getcflags(cfg)) end - function suite.ldflags_onLinkTimeOptimizations() + function suite.cflags_onLinkTimeOptimizationsViaAPI() + linktimeoptimization "On" + prepare() + test.contains("/GL", msc.getcflags(cfg)) + end + + function suite.ldflags_onLinkTimeOptimizationsViaFlag() flags "LinkTimeOptimization" prepare() test.contains("/LTCG", msc.getldflags(cfg)) end + function suite.ldflags_onLinkTimeOptimizationsViaAPI() + linktimeoptimization "On" + prepare() + test.contains("/LTCG", msc.getldflags(cfg)) + end + function suite.cflags_onStringPoolingOn() stringpooling "On" prepare() diff --git a/website/docs/flags.md b/website/docs/flags.md index 59a2c4dec6..8a56a7bc1a 100644 --- a/website/docs/flags.md +++ b/website/docs/flags.md @@ -14,9 +14,9 @@ flags { "flag_list" } | FatalCompileWarnings | Treat compiler warnings as errors. | | FatalLinkWarnings | Treat linker warnings as errors. | | FatalWarnings | Treat all warnings as errors; equivalent to FatalCompileWarnings, FatalLinkWarnings | -| LinkTimeOptimization | Enable link-time (i.e. whole program) optimizations. | +| LinkTimeOptimization | Enable link-time (i.e. whole program) optimizations. Deprecated in Premake 5.0.0-beta4. Use `linktimeoptimization` API instead. | | Maps | Enable Generate Map File for Visual Studio | -| MFC | Enable support for Microsoft Foundation Classes. Deprecated in Premake 5.0.0-beta4. | +| MFC | Enable support for Microsoft Foundation Classes. Deprecated in Premake 5.0.0-beta4. Use `mfc` API instead. | | MultiProcessorCompile | Enable Visual Studio to use multiple compiler processes when building. | | No64BitChecks | Disable 64-bit portability warnings. | | NoBufferSecurityCheck | Turn off stack protection checks. | diff --git a/website/docs/linktimeoptimization.md b/website/docs/linktimeoptimization.md new file mode 100644 index 0000000000..f7fcb6127f --- /dev/null +++ b/website/docs/linktimeoptimization.md @@ -0,0 +1,23 @@ +The **linktimeoptimization** function specifies whether or not the toolset should perform link time optimization. + +```lua +linktimeoptimization "value" +``` + +### Parameters ### + +*value* specifies whether or not to use link time optimization, if the toolset and exporter support it. + +| Value | Description | +|---------|--------------------------------------------------------| +| Off | No LTO to be performed. | +| On | LTO optimization enabled. | +| Default | Default LTO optimizations for the toolset or exporter. | + +### Applies To ### + +Project configurations + +### Availability ### + +Premake 5.0-beta4 and later \ No newline at end of file diff --git a/website/sidebars.js b/website/sidebars.js index f24dd0cc6c..1f17c16959 100644 --- a/website/sidebars.js +++ b/website/sidebars.js @@ -185,6 +185,7 @@ module.exports = { 'linkgroups', 'linkoptions', 'links', + 'linktimeoptimization', 'locale', 'location', 'llvmdir',