Skip to content

Commit

Permalink
Replace LTO flag with dedicated API
Browse files Browse the repository at this point in the history
  • Loading branch information
nickclark2016 committed Nov 27, 2024
1 parent b4893c9 commit 6b04f37
Show file tree
Hide file tree
Showing 15 changed files with 145 additions and 26 deletions.
19 changes: 18 additions & 1 deletion modules/gmake/tests/cpp/test_clang.lua
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ ifeq ($(config),debug)
]]
end

function suite.usesCorrectCompilersAndLinkTimeOptimization()
function suite.usesCorrectCompilersAndLinkTimeOptimizationViaFlag()
flags { "LinkTimeOptimization" }
make.cppConfigs(prj)
test.capture [[
Expand All @@ -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

14 changes: 13 additions & 1 deletion modules/vstudio/tests/vc200x/test_compiler_block.lua
Original file line number Diff line number Diff line change
Expand Up @@ -570,7 +570,7 @@
-- Check the LinkTimeOptimization flag.
--

function suite.flags_onLinkTimeOptimization()
function suite.flags_onLinkTimeOptimizationViaFlag()
flags { "LinkTimeOptimization" }
prepare()
test.capture [[
Expand All @@ -582,6 +582,18 @@

end

function suite.flags_onLinkTimeOptimization()
linktimeoptimization "On"
prepare()
test.capture [[
<Tool
Name="VCCLCompilerTool"
Optimization="0"
WholeProgramOptimization="true"
]]

end


--
-- Check the optimization flags.
Expand Down
15 changes: 14 additions & 1 deletion modules/vstudio/tests/vc2010/test_config_props.lua
Original file line number Diff line number Diff line change
Expand Up @@ -338,7 +338,7 @@
-- Check the LinkTimeOptimization flag
--

function suite.useOfLinkTimeOptimization()
function suite.useOfLinkTimeOptimizationViaFlag()
flags { "LinkTimeOptimization" }
prepare()
test.capture [[
Expand All @@ -351,6 +351,19 @@
]]
end

function suite.useOfLinkTimeOptimizationViaAPI()
linktimeoptimization "On"
prepare()
test.capture [[
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseDebugLibraries>false</UseDebugLibraries>
<CharacterSet>Unicode</CharacterSet>
<PlatformToolset>v100</PlatformToolset>
<WholeProgramOptimization>true</WholeProgramOptimization>
]]
end


--
-- Check the WindowsSDKDesktopARMSupport element
Expand Down
4 changes: 3 additions & 1 deletion modules/vstudio/vs200x_vcproj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
10 changes: 7 additions & 3 deletions modules/vstudio/vs2010_vcxproj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down Expand Up @@ -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
Expand Down Expand Up @@ -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

Expand Down
22 changes: 21 additions & 1 deletion src/_premake_init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@
"ExcludeFromBuild",
"FatalCompileWarnings",
"FatalLinkWarnings",
"LinkTimeOptimization",
"LinkTimeOptimization", -- DEPRECATED
"Maps",
"MFC",
"MultiProcessorCompile",
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/base/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
9 changes: 4 additions & 5 deletions src/tools/clang.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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, {
Expand Down Expand Up @@ -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) }
Expand Down Expand Up @@ -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"
}

Expand Down
8 changes: 4 additions & 4 deletions src/tools/gcc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -59,14 +59,16 @@
},
flags = {
FatalCompileWarnings = "-Werror",
LinkTimeOptimization = "-flto",
ShadowedVariables = "-Wshadow",
UndefinedIdentifiers = "-Wundef",
},
floatingpoint = {
Fast = "-ffast-math",
Strict = "-ffloat-store",
},
linktimeoptimization = {
On = "-flto",
},
strictaliasing = {
Off = "-fno-strict-aliasing",
Level1 = { "-fstrict-aliasing", "-Wstrict-aliasing=1" },
Expand Down Expand Up @@ -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) }
Expand Down
8 changes: 6 additions & 2 deletions src/tools/msc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@
},
flags = {
FatalCompileWarnings = "/WX",
LinkTimeOptimization = "/GL",
MultiProcessorCompile = "/MP",
NoMinimalRebuild = "/Gm-",
OmitDefaultLibrary = "/Zl"
Expand All @@ -89,6 +88,9 @@
intrinsics = {
On = "/Oi",
},
linktimeoptimization = {
On = "/GL",
},
optimize = {
Off = "/Od",
On = "/Ot",
Expand Down Expand Up @@ -332,7 +334,6 @@
msc.linkerFlags = {
flags = {
FatalLinkWarnings = "/WX",
LinkTimeOptimization = "/LTCG",
NoIncrementalLink = "/INCREMENTAL:NO",
NoManifest = "/MANIFEST:NO",
OmitDefaultLibrary = "/NODEFAULTLIB",
Expand All @@ -341,6 +342,9 @@
SharedLib = "/DLL",
WindowedApp = "/SUBSYSTEM:WINDOWS"
},
linktimeoptimization = {
On = "/LTCG"
},
symbols = {
On = "/DEBUG"
}
Expand Down
16 changes: 14 additions & 2 deletions tests/tools/test_gcc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
16 changes: 14 additions & 2 deletions tests/tools/test_msc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
4 changes: 2 additions & 2 deletions website/docs/flags.md
Original file line number Diff line number Diff line change
Expand Up @@ -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. |
Expand Down
23 changes: 23 additions & 0 deletions website/docs/linktimeoptimization.md
Original file line number Diff line number Diff line change
@@ -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
1 change: 1 addition & 0 deletions website/sidebars.js
Original file line number Diff line number Diff line change
Expand Up @@ -185,6 +185,7 @@ module.exports = {
'linkgroups',
'linkoptions',
'links',
'linktimeoptimization',
'locale',
'location',
'llvmdir',
Expand Down

0 comments on commit 6b04f37

Please sign in to comment.