Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions modules/gmakelegacy/tests/cpp/test_clang.lua
Original file line number Diff line number Diff line change
Expand Up @@ -61,3 +61,20 @@ ifeq ($(config),debug)
]]
end

function suite.usesCorrectCompilersAndFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
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

16 changes: 16 additions & 0 deletions modules/vstudio/tests/linux/test_linux_files.lua
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,22 @@ local vc2010 = p.vstudio.vc2010
]]
end

--
-- Test fast link time optimization being equivalent to on.
--

function suite.linkTimeOptimization_Fast()
linktimeoptimization('fast')
prepareConfigProperties()
test.capture [[
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x86'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<PlatformToolset>v142</PlatformToolset>
<LinkTimeOptimization>true</LinkTimeOptimization>
</PropertyGroup>
]]
end

--
-- Test multiprocessor compilation.
--
Expand Down
12 changes: 12 additions & 0 deletions modules/vstudio/tests/vc200x/test_compiler_block.lua
Original file line number Diff line number Diff line change
Expand Up @@ -594,6 +594,18 @@

end

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

end


--
-- Check the optimization flags.
Expand Down
13 changes: 13 additions & 0 deletions modules/vstudio/tests/vc2010/test_config_props.lua
Original file line number Diff line number Diff line change
Expand Up @@ -328,6 +328,19 @@
]]
end

function suite.useOfLinkTimeOptimizationViaAPI_Fast()
linktimeoptimization "Fast"
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
25 changes: 25 additions & 0 deletions modules/vstudio/tests/vc2010/test_link.lua
Original file line number Diff line number Diff line change
Expand Up @@ -614,6 +614,31 @@
end


--
-- Test if LinkTimeOptimization API correctly specifies LinkTimeCodeGeneration
--

function suite.linkTimeOptimization_onEnableLinkTimeOptimization()
linktimeoptimization "On"
prepare()
test.capture [[
<Link>
<SubSystem>Windows</SubSystem>
<LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
]]
end

function suite.linkTimeOptimization_onFastLinkTimeOptimization()
linktimeoptimization "Fast"
prepare()
test.capture [[
<Link>
<SubSystem>Windows</SubSystem>
<LinkTimeCodeGeneration>UseFastLinkTimeCodeGeneration</LinkTimeCodeGeneration>
]]
end


--
-- Correctly handle module definition (.def) files.
--
Expand Down
2 changes: 1 addition & 1 deletion modules/vstudio/vs200x_vcproj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1614,7 +1614,7 @@


function m.wholeProgramOptimization(cfg)
if cfg.linktimeoptimization == "On" then
if cfg.linktimeoptimization == "On" or cfg.linktimeoptimization == "Fast" then
p.x('WholeProgramOptimization="true"')
elseif cfg.linktimeoptimization == "Off" then
p.x('WholeProgramOptimization="false"')
Expand Down
8 changes: 5 additions & 3 deletions modules/vstudio/vs2010_vcxproj.lua
Original file line number Diff line number Diff line change
Expand Up @@ -2298,7 +2298,7 @@


function m.wholeProgramOptimization(cfg)
if cfg.linktimeoptimization == "On" then
if cfg.linktimeoptimization == "On" or cfg.linktimeoptimization == "Fast" then
m.element("WholeProgramOptimization", nil, "true")
elseif cfg.linktimeoptimization == "Off" then
m.element("WholeProgramOptimization", nil, "false")
Expand Down Expand Up @@ -3085,6 +3085,8 @@
function m.linkTimeCodeGeneration(cfg)
if cfg.linktimeoptimization == "On" then
m.element("LinkTimeCodeGeneration", nil, "UseLinkTimeCodeGeneration")
elseif cfg.linktimeoptimization == "Fast" then
m.element("LinkTimeCodeGeneration", nil, "UseFastLinkTimeCodeGeneration")
end
end

Expand Down Expand Up @@ -4021,7 +4023,7 @@
end

function m.linuxWholeProgramOptimization(cfg)
if cfg.linktimeoptimization == "On" then
if cfg.linktimeoptimization == "On" or cfg.linktimeoptimization == "Fast" then
m.element("LinkTimeOptimization", nil, "true")
elseif cfg.linktimeoptimization == "Off" then
m.element("LinkTimeOptimization", nil, "false")
Expand All @@ -4037,7 +4039,7 @@
end

function m.linuxLinkTimeCodeGeneration(cfg)
if cfg.linktimeoptimization == "On" then
if cfg.linktimeoptimization == "On" or cfg.linktimeoptimization == "Fast" then
m.element("LinkTimeOptimization", nil, "true")
end
end
Expand Down
1 change: 1 addition & 0 deletions src/_premake_init.lua
Original file line number Diff line number Diff line change
Expand Up @@ -1124,6 +1124,7 @@
allowed = {
"Default",
"On",
"Fast",
"Off"
}
}
Expand Down
3 changes: 2 additions & 1 deletion src/base/config.lua
Original file line number Diff line number Diff line change
Expand Up @@ -155,7 +155,8 @@
if cfg.kind == "StaticLib"
or config.isOptimizedBuild(cfg)
or cfg.flags.NoIncrementalLink
or cfg.linktimeoptimization == "On" then
or cfg.linktimeoptimization == "On"
or cfg.linktimeoptimization == "Fast" then
return false
end
return true
Expand Down
7 changes: 5 additions & 2 deletions src/tools/clang.lua
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,10 @@
structmemberalign = gcc.shared.structmemberalign,
visibility = gcc.shared.visibility,
inlinesvisibility = gcc.shared.inlinesvisibility,
linktimeoptimization = gcc.shared.linktimeoptimization,
linktimeoptimization = {
On = "-flto",
Fast = "-flto=thin",
},
profile = gcc.shared.profile,
}

Expand Down Expand Up @@ -368,7 +371,7 @@
clang.tools = {
cc = "clang",
cxx = "clang++",
ar = function(cfg) return iif(cfg.linktimeoptimization == "On", "llvm-ar", "ar") end,
ar = function(cfg) return iif(cfg.linktimeoptimization == "On" or cfg.linktimeoptimization == "Fast", "llvm-ar", "ar") end,
rc = "windres"
}

Expand Down
1 change: 1 addition & 0 deletions src/tools/gcc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@
},
linktimeoptimization = {
On = "-flto",
Fast = "-flto",
},
strictaliasing = {
Off = "-fno-strict-aliasing",
Expand Down
4 changes: 3 additions & 1 deletion src/tools/msc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -91,6 +91,7 @@
},
linktimeoptimization = {
On = "/GL",
Fast = "/GL",
},
multiprocessorcompile = {
On = "/MP",
Expand Down Expand Up @@ -353,7 +354,8 @@
WindowedApp = "/SUBSYSTEM:WINDOWS"
},
linktimeoptimization = {
On = "/LTCG"
On = "/LTCG",
Fast = "/LTCG:incremental",
},
symbols = {
On = "/DEBUG"
Expand Down
66 changes: 66 additions & 0 deletions tests/tools/test_clang.lua
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,24 @@
test.isequal("windres", clang.gettoolname(cfg, "rc"))
end

function suite.tools_onLinkTimeOptimizationViaAPI()
linktimeoptimization "On"
prepare()
test.isequal("clang", clang.gettoolname(cfg, "cc"))
test.isequal("clang++", clang.gettoolname(cfg, "cxx"))
test.isequal("llvm-ar", clang.gettoolname(cfg, "ar"))
test.isequal("windres", clang.gettoolname(cfg, "rc"))
end

function suite.tools_onFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
prepare()
test.isequal("clang", clang.gettoolname(cfg, "cc"))
test.isequal("clang++", clang.gettoolname(cfg, "cxx"))
test.isequal("llvm-ar", clang.gettoolname(cfg, "ar"))
test.isequal("windres", clang.gettoolname(cfg, "rc"))
end

function suite.tools_forVersion()
toolset "clang-16"
prepare()
Expand All @@ -48,6 +66,26 @@
test.isequal("windres-16", clang.gettoolname(cfg, "rc"))
end

function suite.tools_forVersion_onLinkTimeOptimizationViaAPI()
toolset "clang-16"
linktimeoptimization "On"
prepare()
test.isequal("clang-16", clang.gettoolname(cfg, "cc"))
test.isequal("clang++-16", clang.gettoolname(cfg, "cxx"))
test.isequal("llvm-ar-16", clang.gettoolname(cfg, "ar"))
test.isequal("windres-16", clang.gettoolname(cfg, "rc"))
end

function suite.tools_forVersion_onFastLinkTimeOptimizationViaAPI()
toolset "clang-16"
linktimeoptimization "Fast"
prepare()
test.isequal("clang-16", clang.gettoolname(cfg, "cc"))
test.isequal("clang++-16", clang.gettoolname(cfg, "cxx"))
test.isequal("llvm-ar-16", clang.gettoolname(cfg, "ar"))
test.isequal("windres-16", clang.gettoolname(cfg, "rc"))
end

--
-- Check Mac OS X deployment target flags
--
Expand Down Expand Up @@ -134,6 +172,34 @@ end
test.contains("-fuse-ld=lld", clang.getldflags(cfg))
end

--
-- Check handling of link time optimization flag.
--

function suite.cflags_onLinkTimeOptimizationViaAPI()
linktimeoptimization "On"
prepare()
test.contains("-flto", clang.getcflags(cfg))
end

function suite.cflags_onFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("-flto=thin", clang.getcflags(cfg))
end

function suite.ldflags_onLinkTimeOptimizationViaAPI()
linktimeoptimization "On"
prepare()
test.contains("-flto", clang.getldflags(cfg))
end

function suite.ldflags_onFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("-flto=thin", clang.getldflags(cfg))
end

--
-- Check the translation of CXXFLAGS.
--
Expand Down
12 changes: 12 additions & 0 deletions tests/tools/test_gcc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -957,12 +957,24 @@ end
test.contains("-flto", gcc.getcflags(cfg))
end

function suite.cflags_onFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("-flto", gcc.getcflags(cfg))
end

function suite.ldflags_onLinkTimeOptimizationViaAPI()
linktimeoptimization "On"
prepare()
test.contains("-flto", gcc.getldflags(cfg))
end

function suite.ldflags_onFastLinkTimeOptimizationViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("-flto", gcc.getldflags(cfg))
end


--
-- Check the handling of map file generation.
Expand Down
12 changes: 12 additions & 0 deletions tests/tools/test_msc.lua
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,24 @@
test.contains("/GL", msc.getcflags(cfg))
end

function suite.cflags_onFastLinkTimeOptimizationsViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("/GL", msc.getcflags(cfg))
end

function suite.ldflags_onLinkTimeOptimizationsViaAPI()
linktimeoptimization "On"
prepare()
test.contains("/LTCG", msc.getldflags(cfg))
end

function suite.ldflags_onFastLinkTimeOptimizationsViaAPI()
linktimeoptimization "Fast"
prepare()
test.contains("/LTCG:incremental", msc.getldflags(cfg))
end

function suite.cflags_onStringPoolingOn()
stringpooling "On"
prepare()
Expand Down
9 changes: 5 additions & 4 deletions website/docs/linktimeoptimization.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,11 +8,12 @@ linktimeoptimization "value"

*value* specifies whether or not to use link time optimization, if the toolset and exporter support it.

| Value | Description |
|---------|--------------------------------------------------------|
| Value | Description | Notes |
|---------|--------------------------------------------------------| ---------------- |
| Off | No LTO to be performed. |
| On | LTO optimization enabled. |
| Default | Default LTO optimizations for the toolset or exporter. |
| On | LTO enabled. |
| Fast | Incremental/Fast LTO enabled. | Visual Studio & Clang only, available from Premake 5.0-beta8 or later |
| Default | Default LTO setting for the toolset or exporter. |

### Applies To ###

Expand Down
Loading