问题标签 [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.

0 投票
1 回答
78 浏览

cuda - nvlink 可以从单独的编译单元中内联设备功能吗?

如果作为输入提供的单独编译单元nvlink包含 cuda 内核和调用标记为的设备函数的设备函数__forceinline__,这些函数是否会被内联?假设如果将所有源代码放入一个文件中,它们将被内联。

0 投票
0 回答
125 浏览

gcc - gfortran 是否可以执行链接时间优化,从而导致内联来自不同翻译单元的纯函数?

我们有一个 Fortran 代码库,它由大型(超过 5K 行)模块文件组成。由于担心编译器无法考虑内联跨模块函数调用,文件增长得如此之多。

gcc >= 5.0 是否仍然存在问题?


我们想知道将代码分成不同的模块是否会影响性能(就像在没有链接时优化的时代那样)。否则,我们将使用#includes,但我们更愿意避免使用它。

0 投票
1 回答
476 浏览

c++ - 仅当 Qt 是使用 ltcg 构建时,如何有条件地启用 ltcg?

qmake 项目有时是使用用 ltcg 编译的 Qt 构建的。由于 Qt 的 ltcg 构建设置不会自动传播到使用给定 Qt 安装的项目的设置,MSVC 链接器会浪费时间并发出以下警告:

找到 MSIL .netmodule 或使用 /GL 编译的模块;重新启动与 /LTCG 的链接;将 /LTCG 添加到链接命令行以提高链接器性能

如果构建的 Qt 也启用了 ltcg,有没有办法有条件地为项目启用 ltcg?

0 投票
3 回答
816 浏览

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) 中作为符号导出。因此,由于某种原因,链接器选择保留弱符号,即使存在同名的强符号。

0 投票
0 回答
621 浏览

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可以正常工作。

0 投票
2 回答
1679 浏览

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告诉我另一个故事,为什么不应用该属性。

我做错了什么?

0 投票
3 回答
541 浏览

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——在这种情况下,指针肯定不会被初始化。
0 投票
1 回答
200 浏览

llvm - 单片链接时优化是否适用于静态库?

本文讨论目标文件如何包含用于链接时优化的 LLVM IR。但是如果链接器正在编译一个包含静态库的项目,静态库是否也有这些信息?如果有,在什么情况下?

0 投票
0 回答
136 浏览

c - 对源文件和程序集文件使用链接时间优化的正确方法?

我目前正在为嵌入式系统使用 LTO(看看它是否可以减小尺寸)并且在直接使用 ld 正确链接所有内容时遇到了一些问题,并且想知道我做错了什么。在我在一个更大的项目中使用它之前,这主要是在玩一个玩具程序。

设置基本上是我有3个文件:

  • test.c - 数据转换函数
  • test_main.c - 调用 start.S 中定义的函数
  • start.S - 在 test.c 中调用一个函数并且还包含 _start

我使用以下方法编译文件:

如果我然后尝试将程序与 ld 我得到:

如果我使用 gcc,它可以工作:

我曾尝试直接指定链接器插件,但随后出现不同的错误:

我的 ld 调用中缺少哪些标志、参数等?

0 投票
0 回答
24 浏览

src - 如何在 Ubuntu 20.04 LTS 中纠正此错误

我想使用 American Fuzzy Loop(AFL) 检查代码,但我在测试时遇到了这个问题。帮我找出这个错误,另一件事是它不会显示与此代码有关的任何输出。错误: