问题标签 [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 投票
0 回答
61 浏览

c++ - 链接时优化:什么是“类型合并”

页面上,GCC 5 在链接时优化改进下列出了以下内容:

已经实现了一种基于定义规则的 C++ 类型合并。类型合并可以实现更好的去虚拟化和别名分析。

什么是 C++ 类型合并,它与 ODR 有什么关系?

0 投票
0 回答
338 浏览

c++ - 打开整个程序优化后,内联是否会受到方法实施位置的影响?

打开整个程序(也称为链接时间)优化后,内联是否会受到方法实施位置的影响?

如果没有打开整体程序优化,在头文件中公开声明但在匹配的 cpp 中实现的方法显然不能在编译不同的翻译单元(包括上述头文件的不同 cpp)期间内联。因此,如果您希望该方法可内联,则必须在导出标头中实现它。

对于整个程序优化,内联方式是否在标头中实现该方法是否有任何区别?也就是说,编译器是否有可能/有可能​​错过内联在 cpp 中实现的方法的机会,如果该方法在标头中实现,它不会错过?

我对 Apple 的 Clang(-flto标志)和 Visual Studio(/GL标志)的答案特别感兴趣。

0 投票
1 回答
685 浏览

linker - 链接前删除死代码

在一个由几个静态链接的目标文件组成的项目中,我将其中一个替换为单独的实现。我什至想在我实现替换的目标文件提供的每个符号之前测试我的代码,所以我使用-Wl,--unresolved-symbols=ignore-all链接器不抱怨丢失的符号。

但是当我测试代码时,它在尝试使用未定义的符号之一时会崩溃。因此,我正在寻找一种方法来告诉链接器“请在链接之前删除所有未引用的代码,然后告诉我在从入口点可到达的代码中是否还有未引用的符号”。那可能吗?

0 投票
1 回答
308 浏览

c++ - 总是在不同的.so中内联函数

在Linux中,gcc如果我在动态库中声明一个函数,__attribute__((always_inline))然后动态加载该库,动态链接器会内联该函数吗?

我正在编译动态库,-O3并且没有传递任何链接时间优化标志-flto

真正的问题是:当大多数时候从另一个库调用它时,是否值得在动态库中将函数声明为始终内联?

0 投票
1 回答
295 浏览

c++ - 混合 C++/C 程序的链接时优化 (lto)

我想知道是否可以有效地使用链接时间优化 (lto) 来处理由带有 C++ 代码的 TU 组成的程序,该程序在带有 C 代码的 TU 中调用某些函数。那么,有没有办法将 C 函数内联到生成的程序中呢?

真正的用例是用 C++ 编写的微控制器固件。但是由于 C 语义,有些代码必须用 C 编写(例如,访问非活动联合成员)。

(这与手动标记功能为内联无关)

0 投票
1 回答
1717 浏览

c++ - 可以跨 C 和 C++ 方法优化 gcc 或 clang 的 LTO

如果链接时优化 (LTO) 与gccclang一起使用,是否可以跨 C 和 C++ 语言边界优化代码?

例如,可以将 C 函数内联到 C++ 调用程序中吗?

0 投票
0 回答
450 浏览

linux - 你能制作一个包含 gcc 和 clang 的 IR 代码的“.a”静态库吗?

gcc 和 clang 都通过允许目标文件.o(这些目标文件可以打包到静态档案中,并为静态链接做好准备。

这些具有 lto 功能的档案的标准是通过包含正常的机器代码(因此它们可以像正常的机器代码一样工作)和 IR 来使它们变得“胖”。但是是否有可能用多种类型的 IR 制作一个“非常胖”的存档并让编译器识别这些各自的 IR?以下是一些挑战:

  • 两个编译器似乎都建议修改版本ar以确保 IR 被包含和索引。gcc 有gcc-ar(插件),而 clang 有llvm-ar.
  • Clang 不会产生“胖”档案。事实上,标准 GNU 工具无法解释其位码目标文件。
0 投票
1 回答
1743 浏览

c - GCC -flto 和 inline 关键字

我的问题很简单,关键字 inline 对链接时间优化的观点有影响吗?链接时间优化是指支持 -flto(链接时间优化)的 GCC 版本。

例如:

主程序

bh

公元前

当链接器进行 LTO(链接时间优化)时, bc中的 inline 关键字会有所不同吗?

0 投票
1 回答
3393 浏览

c++ - 将 LTO 与 arm-none-eabi 和 newlib-nano 一起使用

我正在为 STM32F103 开发一个裸机嵌入式项目,并且我正在使用GNU ARM Embedded 版本 7-2017-q4-major工具链。我目前正在通过 GNU ARM Eclipse 进行编译。

我正处于需要开始优化项目以提高速度的地步,作为第一件事,我当然尝试打开所有优化器标志。其他一切都很好,但是当我尝试使用 启用链接时间优化时-flto,在最后一步出现链接器错误:

这显然是由于 newlib-nano 没有使用 LTO 编译?

那么我该如何让它工作呢?我想我可以尝试自己编译 newlib-nano并添加必要的标志(并更改工具以使用 -gcc-ar 等),但我想/希望有人已经这样做了?我的 google-fu 不足以找到任何有用的东西。

0 投票
2 回答
935 浏览

clang - Clang:如何检查是否执行了 LTO

对于 gcc,这个答案告诉我们如何验证是否执行了链接时间优化。对于 clang,我看不到任何类似于.gnu.lto.

更具体地说,我有一个二进制文件,我很确定 LTO 应该有很大的好处,但我什么也没看到。我想知道 cmake 是否真的做正确的事。

有没有办法通过查看二进制文件或 *.o 文件来判断 clang 是否执行了 LTO?