问题标签 [lto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
build - Thinlto 的并发性在并行构建系统中有用吗?
-flto
我有一个构建系统,它通过标志在 clang 中使用长期存在的 LTO 支持。
添加到 LLVM ( https://clang.llvm.org/docs/ThinLTO.html )的 ThinLTO 支持看起来很有趣,但我对在std::thread::hardware_concurrency
已经构建系统的上下文中启动并行处理线程的决定感到有些困惑运行并发作业。
如果您的构建系统已经为每个内核启动一个线程并运行编译和链接作业的混合,那么链接器假设它应该使用所有内核甚至多个内核是否仍然有意义?
或者使用https://clang.llvm.org/docs/ThinLTO.html#controlling-backend-parallelism中记录的标志将 ThinLTO 后台并发减少到 1 是否有意义?删除并行性后,ThinLTO 与普通的普通旧 LTO 相比有什么优势吗?
c++ - 使用嵌套结构启用 lto 的 C++ ODR 警告
在我的一个项目中启用 lto 后,编译器开始向我抛出 lto 违规警告。经过一番测试,它归结为这个结构。
一旦我将其更改为
或者
警告消失了,但我真的不明白为什么。我的猜测是它将匿名结构视为不同文件中的不同类型,但我不希望出现警告,因为它是一个常见的用例。请注意,如果我更改内部 typedef 但将外部保持在原位,这并没有什么不同。test_t 是否包含成员也无关紧要。
- 这个警告的原因是什么?
- 这种行为是预期的吗?
- 这可能是一个 STL 错误,因为它在没有矢量的情况下也能正常工作?
rust - 为什么使用 LTO 会增加我的 Rust 二进制文件的大小?
介绍
我完成了一个小型 Rust 项目(大约 300 行代码),它具有以下依赖项:
问题
在cargo build --release
没有进一步配置的情况下使用时,会生成一个 2.942.744 字节 (= 2,8 MiB) 的二进制文件。我试图通过在我的以下启用链接时间优化 (LTO) 来优化它Cargo.toml
:
令我惊讶的是,二进制文件增长了,新大小为 3.848.288 字节(= 3,7 MiB)。
这怎么解释?我在配置 Cargo 时犯了什么错误吗?
c - 替换 __aeabi_dsub 以节省空间(-flto 问题)
我试图将大量代码塞进一个相当小的 ARM 微控制器中。我已经在尺寸优化方面做了大量工作,而且我已经到了需要双重算术的地步,但是__aeabi_ddiv
,是整个设备上的一些最大功能__aeabi_dadd
。__aeabi_dsub
尽管做基本相同的工作(双打的最高位是符号位),但两者__aeabi_dadd
都约为 1700 字节。__aeabi_dsub
两个函数都没有引用另一个。
实际上,我需要做的就是替换__aeabi_dsub
为:
我会节省约 1700 个字节 - 所以翻转第二个参数的符号,然后使用__aeabi_dadd
.
我知道这可能不是 100% 与 IEEE 规范兼容,但在这个平台上我可以接受,以便节省 1% 以上的可用闪存。
我的问题是,当我添加该函数时,链接器会抱怨undefined reference to __aeabi_dsub
- 这似乎很奇怪,因为定义它的行为会导致错误。
-flto
这似乎与链接时间优化有关(
__aeabi_dsub
那么,当链接时间优化处于活动状态时,我需要做什么才能替换内置功能?
谢谢!
c++ - GCC LTO - fno-fat-lto-objects 仅支持链接器插件
我正在尝试在我的代码库中使用 LTO。我-flto
在编译和链接时都使用了标志。它创建了胖对象,但链接后生成的二进制文件与不使用 LTO 时相同(大小或性能没有区别)。
然后我决定使用fno-fat-lto-objects
标志,以便只生成与 LTO 兼容的目标文件。但是在编译过程中它抛出了错误:
我认为我无法在链接时使用 LTO,因此二进制文件没有区别。
任何人都可以帮助克服上述错误吗?
gcc - gcc 程序可以检测何时启用链接时间优化 (-flto)?
我有一些代码必须启用链接时间优化才能正常工作。我需要对以下内容进行常量表达式评估:
(PROGMEM 是一个 avr-gcc 构造,它将常量放在一个单独的内存部分中,该部分随后被加载到闪存而不是 ram 中,并且在执行时需要特别注意访问。但不是在编译时......)
有什么方法可以在编译时(或链接时)检测到 -flto 尚未指定,以便我可以发出错误消息?
我已经使用“-dM -E”技巧比较了有和没有 -flto 的预定义符号,似乎没有任何区别。其他技巧有什么想法吗?
(应该在链接时“评估”-flto 的 __builtin_constant_p() 吗?它不是从 gcc 5.4.0 开始的(最新的“供应商支持”avr 编译器。))
c - LTO 模式下用于 ARM 的 GCC 8 正在删除中断处理程序和弱功能 - 如何防止它?
我的目标设备是基于 EFM32 Cortex-M3 的设备。我的工具链是官方的 ARM GNU 工具链 gcc-arm-none-eabi-8-2018-q4-major。
没有 LTO 一切正常,但要使 LTO 工作,我必须用 . 标记所有中断处理程序代码-fno-lto
。我想摆脱这种解决方法。
问题是,每个中断处理程序都从最终的二进制文件中删除。(我正在检查arm-none-eabi-nm --print-size --size-sort --radix=d -C -n file.out
)这会导致二进制崩溃。
深入挖掘并在谷歌搜索类似问题后:
- 我尝试将诸如
__attribute__((used))
,之类的功能标记为__attribute((interrupt))
无济于事 - 尽管有这些属性,中断处理程序仍被删除。(相关防止 GCC LTO 删除功能) - 发现可能相关的讨论https://bugs.launchpad.net/gcc-arm-embedded/+bug/1747966 - 没有发布解决方案
来自定义默认中断处理程序的示例代码startup_efm32gg.c
如下:
常规中断处理程序定义也会发生同样的问题(例如,没有别名且不弱)
这可能是相关的,但似乎弱符号在 LTO 模式下以同样的方式行为不端。
提前感谢您的任何想法!
编辑:查看我对标记答案的回复以获得完整的解决方案!
c++ - 链接 pcre 时无法启用 LTO
我正在为一个名为 AMX Mod X 的开源项目做出贡献。它使用非常简单的定制构建系统(称为 AMBuild)。项目是在 Linux 上使用 Clang 构建的。
我试图通过传递编译时和链接时参数来为其启用 LTO。
作为我添加的链接时间参数
并作为编译时参数。
经过仔细的谷歌搜索,我选择了这个配置。看来我非常接近实现完整的 LTO。只有一个模块无法构建,它与 pcre 链接。
生成的(由构建系统)链接命令是这样的。
链接错误很多,但它们非常相似。这是其中之一。
我读到LLD 和 bfd 有不同的默认值并且-Wl,-z,notext
应该可以工作,但它没有任何效果。
libpcre.a只是与存储库捆绑在一起的二进制文件。AMBuild 不是从源头构建 pcre。这是我的PR,你可以找到失败的 travis 构建并更仔细地阅读日志。不要害怕自定义构建系统,所有执行的命令都会以最详细的形式打印到终端。应该没问题。
链接 pcre 时如何启用 LTO?我并不真正关心其他编译器(gcc、icc 等)或其他操作系统。
UPD : LTO代表L墨水时间优化_ _
linux - 带有 TileGX 工具链和 LTO 的 LLVM 3.3 无法正常工作
我有一个简单的 HelloWorld.c 程序(所以,我把它放在这里),我正在尝试使用启用 LTO 的 clang 版本 3.3 构建它会引发奇怪的错误。我正在cmake
使用-DCMAKE_TOOLCHAIN_FILE
. 我可以在没有 的情况下成功构建和链接该程序-flto
,但我需要能够使用此限定符。该工具链适用于 TileGX(因此需要保持在 clang 版本 3.3)。所以这是我的环境:
这是我的CMakeLists.txt
文件:
我添加了-v
标志,所以看看铿锵声中发生了什么。
尝试链接的 clang 的输出是(重新格式化以便于阅读):
起初我认为这是使用LLVMgold.so
基于 Ubuntu 16.04 的可共享对象 () 和基于 14.04 的链接器的问题。链接器将调用可共享对象,然后该对象将回调链接器。但是,现在我有一个基于 16.04 的链接器,我仍然收到错误消息。
自从我构建以来,LLVMgold.so
我放置了一些代码来跟踪链接器调用可共享对象时发生的事情,但那里的一切看起来都很好。我可以看到ld
找不到一个奇怪命名的文件,但我不确定它可能在提供的一组文件中是哪个文件。
我已经尝试了我能想象到的一切,以便我可以-flto
在这个环境中使用。有没有人见过这个?有解决办法吗?还有其他我可以或应该做的事情吗?
c - 传递给 gcc 的多个源文件是否被视为单个翻译单元?
我想我已经读过,根据Single Compilation Unitgcc
,同时编译多个文件将实现与将所有源添加到单个源文件中相同的效果,但我再也找不到任何源了。真的吗?
我们目前正在尝试将二进制文件缩小到可能的最小尺寸,并正在应用多种技术来实现这一目标。我们讨论到了关于单个编译单元、链接时间优化和更改构建以在单个编译器调用中编译所有源代码之间的差异的讨论,例如gcc -o binary $CFLAGS $INCLUDES $CDEFS a.c b.c c.c d.c e.c
.