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

c - 如何自动合并 C 源文件?

我有一个可执行文件,其中包含多个目录中的许多 .c 源文件。目前我需要对整个源代码进行静态分析,而不是单独对每个文件进行分析。

我刚刚发现 gcc ʟᴛᴏ(链接时间优化)通过压缩镜像预处理源的 gimple 起作用。
此外,当编译器在 ʟᴛᴏ 链接阶段崩溃时,它会要求发送预处理源以获取错误报告。

通过合并源文件,我的意思是将用于创建可执行文件的所有文件合并到一个文件中。编译和链接该单个文件将创建库,从而手动执行 ʟᴛᴏ 所做的事情。(但这不是这里的目的。静态分析器不支持 ɪᴘᴏ/ʟᴛᴏ 之类的东西)
手动执行此操作肯定需要数小时......</p>

那么,有没有办法自动合并C源文件?或者至少得到 ʟᴛᴏ 预处理源?save-temps在与 ʟᴛᴏ 链接期间,该选项似乎没有什么有趣的作用)

0 投票
2 回答
164 浏览

c - 尺寸优化选项

我正在尝试整理一个嵌入式项目,其中开发人员选择将所有 h 和 c 文件包含到 ac 文件中,然后他们可以使用 -whole-program 选项仅编译一个文件以获得良好的大小优化。

我讨厌这一点,并决心把它变成一个传统的程序,只使用 LTO 来实现同样的效果。

开发工具包中包含的版本是;aps-gcc (GCC) 4.7.3 20130524 (Cortus) GNU ld (GNU Binutils) 2.22

一个 .o 文件 .text 是 0x1c7ac,分成 67 个 .o 文件 .text 出来为 0x2f73c,我添加了 LTO 内容并将其减少到 0x20a44,很好但还远远不够。

我已经尝试过 --gc-sections 并使用链接器插件选项,但他们没有进一步改进。

任何建议,我是否从 LTO 看到了正确的改进?

0 投票
2 回答
159 浏览

c - 将代码拆分为文件和 O 标志

当使用可以在 C 中并行执行的代码编写程序时,我们肯定会使用O 标志来优化代码。

在大型项目中,我们通常将代码拆分成几个文件。我没有找到答案的问题是:

由于我们将代码拆分为文件并且O标志没有足够的信息来进一步优化,程序的性能是否会下降?有这种可能吗?

0 投票
0 回答
282 浏览

cmake - cmake链接时间优化与clang

我正在尝试在clang中使用LTO(使用cmake):-emit-llvm在编译时设置标志,使用-c标志生成输出,因此结果是LLVM位码。问题是,cmake 给我带有“.o”后缀的结果,但我需要“.bc”。我找到了使用 this: 的其他代码set(CMAKE_C_OUTPUT_EXTENSION .bc),但它不起作用。

0 投票
2 回答
1147 浏览

c - clang, lto, 防止函数删除

我正在使用链接时间优化 ( lto ) 和O2优化级别使用修改版本的clang编译项目。O0 和 O1 做得很好,但遗憾的是 O2删除了一些对函数的调用。有没有办法告诉优化省略特定功能?我已经尝试过使用变量以及没有成功。volatile__attribute__ ((optimize("0")))

也欢迎仅在 llvm IR 级别上直接提供的解决方案。

编辑:也许我应该更详细地解释一下情况。修改后的 clang 添加了对与 clang 一起构建的自定义运行时库的调用。其中一些插入的调用会被优化掉。

0 投票
0 回答
2534 浏览

gcc - 使用链接时间优化时强制 GCC 保留部分

我有一个struct由 GCC 编译成特殊部分的 C,并通过链接描述文件放置在输出二进制文件的开头。它包含文件元数据,包括开头的魔法值。

这是一个仅使用字符串作为结构的简化示例。

GCC 将此值放入其自己的部分,如我们所见readelf -S

(注意第 4 节。)

现在,如果我指定-fltoGCC 调用,则不再发出此部分!

我的链接器脚本找不到该.the_header部分,导致二进制文件损坏。

我尝试指定__attribute__((used))标头变量,但没有效果。

这是链接描述文件的相关部分:

使用链接时间优化和上述链接器脚本片段时,如何告诉 GCC 发出.the_header最终二进制文件?

0 投票
0 回答
2215 浏览

c - GCC 如何使用 PGO + LTO 优化

我最近一直在研究 PGO 和 LTO 如何显着优化程序速度(有人说大约 20%)。我目前只是在 C 中编程并在 Windows 中使用 GTK+ 构建 GUI(通过 GCC 编译所有内容)并且只使用 -O2 进行优化。

我一直在阅读以使用标志进行编译

一个 .gcno 和一个 .gcda 文件被创建,然后你运行编译的 .exe 多次,然后再次重新编译相同的 .c 文件,但将“-fprofile-generate”与“-fprofile-use”交换?(同时确保所有这些文件都保留在同一个文件夹/目录中,并为第二次编译的 .exe 使用不同的名称)

还是您以某种方式使用 .gcno/.gcda 文件?另请阅读有关使用“基准”的内容。

问题:

在 GCC 中使用它的步骤是什么?(分步指南会有所帮助:)

0 投票
3 回答
14687 浏览

c++ - LTO 与 LLVM 和 CMake

我正在尝试在创建共享库的 CMake 项目上使用 LLVM 应用链接时间优化。我的问题和这个问题差不多:

使用 CMake 在 GCC 和 Clang/LLVM 之间切换

但是,答案似乎不再适用,因为llvm-ld新版本中不存在。在命令行上,我运行以下命令来获取 LTO(假设只有 2 个.cpp文件):

编译成字节码:

链接字节码:

优化字节码:

将字节码转换为共享对象:

有人可以告诉我如何让 CMake 运行其他步骤吗?

0 投票
4 回答
2826 浏览

c - 防止 GCC LTO 删除函数

我使用 GCC-ARM-Embedded 和 FreeRTOS。FreeRTOS 具有vTaskSwitchContext()仅在某些内联汇编代码中使用的功能。

问题是:当我使用 LTO 时,GCC 不考虑内联汇编代码并认为该函数未使用,因此将其删除。然后链接器失败,因为内联汇编代码中的函数调用无法解析。

我会申请__attribute__((used)),但我不想接触 FreeRTOS 代码(它由 STM32CubeMX 生成)。

我试着把它放在我的代码中,但实际上 GCC 足够聪明,不允许它工作:

有没有办法在不同的源文件中或通过参数告诉 GCC,这个函数不应该被删除?

例子

0 投票
0 回答
200 浏览

firefox - Firefox 构建 LTO 失败

我试图用 lto 构建 firefox,但由于链接器错误,构建失败。这是我得到的错误: