问题标签 [link-time-optimization]
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.
cuda - nvlink 可以从单独的编译单元中内联设备功能吗?
如果作为输入提供的单独编译单元nvlink
包含 cuda 内核和调用标记为的设备函数的设备函数__forceinline__
,这些函数是否会被内联?假设如果将所有源代码放入一个文件中,它们将被内联。
gcc - gfortran 是否可以执行链接时间优化,从而导致内联来自不同翻译单元的纯函数?
我们有一个 Fortran 代码库,它由大型(超过 5K 行)模块文件组成。由于担心编译器无法考虑内联跨模块函数调用,文件增长得如此之多。
gcc >= 5.0 是否仍然存在问题?
我们想知道将代码分成不同的模块是否会影响性能(就像在没有链接时优化的时代那样)。否则,我们将使用#include
s,但我们更愿意避免使用它。
c++ - 仅当 Qt 是使用 ltcg 构建时,如何有条件地启用 ltcg?
qmake 项目有时是使用用 ltcg 编译的 Qt 构建的。由于 Qt 的 ltcg 构建设置不会自动传播到使用给定 Qt 安装的项目的设置,MSVC 链接器会浪费时间并发出以下警告:
找到 MSIL .netmodule 或使用 /GL 编译的模块;重新启动与 /LTCG 的链接;将 /LTCG 添加到链接命令行以提高链接器性能
如果构建的 Qt 也启用了 ltcg,有没有办法有条件地为项目启用 ltcg?
c++ - arm-none-eabi-g++ 无法使用 -flto 正确处理弱别名
我正在使用 SystemWorkbench 4 stm32 对 STM32F413 微控制器进行编程。中断向量在程序集启动文件中定义为弱别名,如下所示:
并在如下对象中引用:
所以这g_pfnVectors
是一个 IRQ Handler 函数的地址列表。它们被声明为弱别名,因此如果用户未定义它们,则使用默认处理程序。
我已经定义了这样的处理程序:
这适用于正常的编译器优化标志,但是我想尝试一下,如果我得到更小和可能更快的代码-flto
(主要是为了尝试它,并不真正需要它)。但是当使用 编译时-flto
,g++ 会忽略我对处理程序的实现,只使用默认处理程序,我的处理程序根本不在代码中。
所以我试图通过添加__attribute__((used))
到函数定义中来强制g++包含该函数,但它仍然没有编译。但是,如果我给它另一个名字,那么它就会包含在二进制文件中。此外,如果我删除了弱别名并且只在启动文件中引用了处理程序,它也可以工作。
所以不知何故,弱别名不适用于 g++ 链接时间优化。也许有人可以告诉我错误是什么以及我在这里做错了什么。
编辑:
我查看了在生成的 .elf 文件中使用 nm 创建了哪些符号,并将其TIM1_UP_TIM10_IRQHandler
导出为具有 DefaultHandler 地址的弱符号。但是,当仅查看包含该TIM1_UP_TIM10_IRQHandler
函数的编译单元中的 .o 文件时,它会在文本部分 (T) 中作为符号导出。因此,由于某种原因,链接器选择保留弱符号,即使存在同名的强符号。
c++ - 带有链接时间优化和 --as-needed ld 标志的未定义引用
我在编译一个使用链接时间优化的大型 C++ 项目时遇到了一些麻烦。经过一番挖掘,我设法产生了一个(几乎)最小的工作示例,它展示了同样的问题。
假设我有以下foo.cpp文件:
bar.h和bar.cpp看起来像这样:
和
代码编译如下:
但是尝试链接目标文件会导致未定义的引用错误:
有人可以解释一下这里发生了什么吗?
一些注意事项:
- 添加 -pthread 标志没有任何区别。
- 我明确传递了选项 -Wl,-as-needed,因为在我的系统上,这不是默认设置。但是,这是其他一些 GNU/Linux 发行版中的默认行为。
- 如果我取消注释 foo.cpp 中对 bar() 的调用,则链接成功。
- 如果选项 -Wl,--as-needed 被删除(或 -Wl,--no-as-needed 添加),则链接成功。
- 我正在使用 g++ 8.3.0 (Debian 8.3.0-6),但同样的问题出现在 g++ 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04) 中。
编辑:带有lld的clang可以正常工作。
visual-studio - 即使 check_ipo_supported() 在 CMake 中工作,也未设置 INTERPROCEDURAL_OPTIMIZATION
我在 CMake 3.14.0 中有以下项目,它为 Visual Studio 2017 64 位生成器构建了一个项目(最低版本为 3.10.0,因为其他开发人员可以拥有以前版本的 CMake,但大于 3.9.0):
我添加了一些命令,用于在 Visual Studio 中添加对 LTO 的支持。我已经看到我必须检查对 IPO 的支持,如果可以,我必须设置INTERPROCEDURAL_OPTIMIZATION
属性,这就是我所做的
当我运行项目时,我收到以下消息(我也在使用 vcpkg,这就是第一行的原因):
据我所见,该项目未启用链接时间优化。我还在 Visual Studio 中打开了项目,并检查了项目的命令行,这就是构建的结果:
并用于链接
我没有看到 LTO 的任何标志。
我已经为策略运行了命令,结果如下:
看来我以正确的方式使用它。
我不明白的是,如果命令check_ipo_supported
告诉我另一个故事,为什么不应用该属性。
我做错了什么?
c++ - 如果不同翻译单元中的代码依赖于其构造的副作用,是否允许 LTO 删除未使用的全局对象?
首先,只是为了避免XY问题:这个问题来自https://github.com/cnjinhao/nana/issues/445#issuecomment-502080177。库代码可能不应该做这样的事情(依赖于未使用的全局对象的构造),但问题更多的是它是否是有效的 LTO 行为而不是代码质量问题。
展示相同问题的最少代码(未经测试,只是为了使示例更小):
font
对象的构造main.cpp
依赖于指针的初始化。唯一初始化指针的是全局对象object
,但它没有被起诉 - 在链接问题的情况下,该对象已被 LTO 删除。允许这样的优化吗?(见C++ 草案 6.6.5.1.2)
一些注意事项:
- 该库是作为静态库构建的,并使用
-flto -fno-fat-lto-objects
动态 C++ 标准库与主文件链接。 - 这个例子可以在完全不编译的情况下构建
lib/platform_abstraction.cpp
——在这种情况下,指针肯定不会被初始化。
llvm - 单片链接时优化是否适用于静态库?
本文讨论目标文件如何包含用于链接时优化的 LLVM IR。但是如果链接器正在编译一个包含静态库的项目,静态库是否也有这些信息?如果有,在什么情况下?
c - 对源文件和程序集文件使用链接时间优化的正确方法?
我目前正在为嵌入式系统使用 LTO(看看它是否可以减小尺寸)并且在直接使用 ld 正确链接所有内容时遇到了一些问题,并且想知道我做错了什么。在我在一个更大的项目中使用它之前,这主要是在玩一个玩具程序。
设置基本上是我有3个文件:
- test.c - 数据转换函数
- test_main.c - 调用 start.S 中定义的函数
- start.S - 在 test.c 中调用一个函数并且还包含 _start
我使用以下方法编译文件:
如果我然后尝试将程序与 ld 我得到:
如果我使用 gcc,它可以工作:
我曾尝试直接指定链接器插件,但随后出现不同的错误:
我的 ld 调用中缺少哪些标志、参数等?
src - 如何在 Ubuntu 20.04 LTS 中纠正此错误
我想使用 American Fuzzy Loop(AFL) 检查代码,但我在测试时遇到了这个问题。帮我找出这个错误,另一件事是它不会显示与此代码有关的任何输出。错误: