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

0 投票
1 回答
1656 浏览

gcc - 如何检测使用 LTO 编译的代码?

是否存在任何方法来检测代码是否使用 -flto 编译?

示例是使用 GCC (4.9.1) 编译的 Linux 下的经典库或可执行文件,无需调试。

0 投票
2 回答
759 浏览

linux - Bash - 仅提取 tarball 中的第一个文件

我有一个带有一系列 tarball 的 LTO 磁带,每个包含约 300 个 tiff 文件。我事先不知道压缩包的内容。

我需要从每个 tarball 中提取第一个文件,并将它的校验和与我计算机上存在的相同文件进行比较。

目前,在每个 tarball 上停车后,我运行......

...列出内容,然后获取第一个文件名。但我在浪费时间等待 -tvf 完成。

有没有办法只获取第一个文件的名称?

0 投票
1 回答
164 浏览

gcc - cmake,保留内部库的链接标志

在 src/foo 我创建与 -lwhatever 链接的 lib foo

在 src/bar 我使用 foo

可能要感谢 LTO,但我需要将 -lwhatever 添加到 bar 的 target_link_libraries 中,否则我在编译时会丢失符号。

不能公开透明吗?

0 投票
1 回答
3116 浏览

c++ - GCC下使用LTO的未定义引用交叉编译静态库

我正在尝试使用 GCC 4.9.2 从 Linux (x86_64-pc-linux-gnu) 为 Windows (x86_64-w64-mingw32) 交叉编译应用程序。

在构建链接到静态库的目标并使用链接时优化时,对于目标从库中使用的所有符号,我从链接器中得到未定义的引用错误。

例如,从 bar.cpp 构建 bar.a

并与 foo.cpp 链接

使用命令行

导致错误

从上面:

  • 我正在为 ar/ranlib 使用 gcc 包装器
  • 没有外部依赖
  • 所有文件都使用相同的选项编译

我尝试使用 -fuse-linker-plugin、gcc-ar 与 ar、符号可见性选项、优化等的各种组合,但如果不关闭 LTO,我无法正确链接。

所有目标都在本机编译器 (x86_64 Linux) 下正确构建。

我在这里有什么明显的遗漏吗?

0 投票
1 回答
1286 浏览

c++ - 使用 MinGW-W64 的 LTO 链接 DLL 失败

我未能使用 MinGW-W64 和-flto. 这是我得到的(编译是在 Linux 机器上完成的):

对于有和没有 LTO 的 Linux 以及没有 LTO 的 Windows 都可以正常编译。

这些符号指的是:

也就是说,每次我使用std::vector.

0 投票
2 回答
145 浏览

c - 所有编译时优化都可以通过链接时优化来完成吗?

或者是否有一些只能在编译时完成的优化(因此只能在编译单元内工作)?我问是因为在 C 中,编译单元是一个源文件,我试图了解在某些情况下是否有任何理由不将源代码拆分为单独的文件(例如,如果所有源代码都可以进行优化在一个文件中没有完成)。

0 投票
1 回答
2241 浏览

gcc - 如何让 gcc LTO 与图书馆档案一起工作?

gcc 专家,

我正在尝试将 gcc lto 与库档案一起使用,因为我的系统(RedHat Enterprise Linux 5.7)附带的 gcc 不适用于 -flto(对于我的 Ubuntu 14.10 也不适用),所以我从头开始构建 binutils && gcc。

这是我所做的:
1. 使用 2 构建 binutils-2.22 。使用--enable-plugins
3 构建 gcc-4.7.2 --with-plugin-ld=/path/to/ld/built/in/step1 --enable-lto
。然后进行以下简单测试:

以下内容可以foo()内联:

虽然以下不能:

由于我正在开发的产品的构建系统必须使用档案,那么我可以做些什么来让 lto 与图书馆档案一起工作?

您的帮助将不胜感激。

非常感谢。

0 投票
2 回答
127 浏览

c - 编译器(具有链接时优化)如何处理快速返回的函数(早期输出路径)?

在 C 中,如果我有一个看起来像的函数调用

然后编译器将在 main.o 中生成很多东西来保存状态、传递参数(希望在这种情况下在寄存器中)和恢复状态。

但是,在链接时可以观察到 arg1 和 arg2 没有用于快速返回路径,因此可以将清理和状态恢复短路。链接器是否倾向于自动执行此类操作,或者是否需要打开链接时优化 (LTO) 才能使此类操作正常工作?

(是的,我可以检查反汇编代码,但我对编译器和链接器的一般行为以及多种架构感兴趣,因此希望从其他人的经验中学习。)

假设分析表明这个函数调用值得优化,我们是否应该期望下面的代码明显更快(例如,不需要使用 LTO)?

0 投票
3 回答
2753 浏览

llvm - 如何在 LLVM 中编写自定义模块间传递?

通过扩展FunctionPass类,我在 LLVM 中编写了标准分析传递。一切似乎都说得通。

现在我想做的是编写几个模块间通道,即允许我一次分析多个模块的通道。一个这样的传递的目的是构建整个应用程序的调用图。另一个这样的传递的目的是我对涉及函数调用及其参数的优化有一个想法。

我通过扩展ModulePass类了解 LLVM 中的过程间传递,但这仅允许在单个模块内进行分析。

我知道LLVM 中的链接时间优化 (LTO),但是 (a) 我不太清楚这是否是我想要的,并且 (b) 我没有找到关于如何实际编写LTO 通行证的示例或文档。

如何在 LLVM 中编写模块间传递,即可以访问应用程序中所有模块的传递?

0 投票
0 回答
801 浏览

c++ - MSVC 链接时间代码生成的预期性能

我正在使用 MSVC 9 (15.0.30729.1)编译KiCad EDA 套件。

这是一个相当复杂的软件,因此/O2在 i3 上发布版本的总编译时间为 3.5 小时是完全可以接受的。为了进一步优化代码,我启用/GL/LTCG使用了链接时间代码生成功能。

查看最大的组件:在 x86 上,这在一定程度上减慢了链接过程(如预期的那样),但没有减少代码大小(7.3 MB);在 x64 上,单个链接器调用现在需要 1.5 小时,并且丝毫不会减少代码大小 (10.1 MB)。

作为比较,x64 上的 gcc 生成 11 MB -flto,没有生成 9.5 MB -flto(链接器步骤需要 10 分钟)——虽然我知道这个 MSVC 版本明显较旧,但我当然不习惯 gcc 生成更小的代码在比 MSVC 更短的时间内。

由于我对 MSVC 工具链的经验充其量只是肤浅的:链接时代码生成是否通常不会减少代码大小?有没有我可能错过的编译器选项?