问题标签 [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.
gcc - GCC LTO 是否执行跨文件死代码消除?
说我有一个功能
我可以毫无问题地编译和运行它;如果我想要我可以通过的功能-D FEATURE_X
并且它可以工作。
但是,如果我想do_something
放入另一个文件怎么办(并且每次我决定更改选项时都不必重新编译该文件)。如果它在同一个文件中,我假设
将正确使用死代码消除,消除调用。如果我把它放在另一个文件中,没有 LTO,
它不会删除代码(它无法知道)。那么,启用链接时优化后,编译器是否可以检测FEATURE_X
链接时的值,确定代码是否被使用,并在适当时将其删除?
optimization - lto和fat-lto-objects之间的gcc有什么区别
我试图用下一个标志编译我的源代码:
1. -flto
2. -flto -ffat-lto-objects
3.-flto -fno-fat-lto-objects
第三个提供slim
了文档中编写的优化 LTO 代码,但我看不出第一个和第二个输出程序集文件有任何区别,为什么?
操作系统:linux
编译器:GCC 4.7
c++ - GCC Profile Guided Optimization (PGO) 收集哪些信息以及哪些优化使用它?
当我启用时 GCC 会收集哪些信息-fprofile-generate
,哪些优化实际上使用了收集的信息(设置-fprofile-use
标志时)?
我需要在这里引用。我已经搜索了一段时间,但没有找到任何记录。
有关链接时间优化 (LTO) 的信息将是一个加分项!=D
c++ - 具有类成员和 constexpr 链接时优化的 C++11 枚举
在我的项目中,我有很多枚举需要具有与枚举成员关联的附加属性以及与枚举类型关联的辅助静态方法。
据我所知,标准枚举类 MyItem {...} 是不可能的,因此对于我项目中的每个枚举类,我都有一个辅助类 MyItemEnum,它封装了这些辅助静态方法并实例化了本身,这样我就可以访问他们的方法以获得额外的属性。
下面举个例子(尽可能简化,但我相信要讨论的所有功能都保留在那里)。
我的项目.h
我认为含义很明显,我不需要在此处提供 .cpp 部分...当我需要访问扩展功能时,我使用 MyItem 作为要在接口和 MyItemEnum 中传递的参数。
我的第一个问题是,上面的方法可以吗,还是我应该考虑完全不同的东西?
我的第二个问题涉及我尝试使用 constexpr 对这个枚举进行优化:
它可以编译,但显然 constexpr 没有机会被使用,因为如果我访问:
所以编译器不知道 Item1 用什么值来实例化。 在链接时间优化期间,上面的表达式是否有可能被评估为 constexpr? 或者我可以使用
这将激活 constexpr 编译时优化,但我担心在某些情况下,当 constexpr 无法在编译时评估时,编译器将不得不创建 MyItemEnum 的本地实例(而不是使用对单个全局的引用静态实例)并且我担心这可能会导致性能损失(我的真实枚举具有比单个成员更多的属性,因此本地实例化可能需要一些时间?)。这是一个合理的担忧吗?
c - C:将预编译的代码编译为内联
由于一些相当复杂的原因,我有一组文件,我想单独编译然后链接,但是这样一个中的函数被内联放置在第二个中。这是因为我希望它们在 GCC 中使用不同的标志进行编译。我知道我可以通过研究如何解决这个问题来解决这个问题,但我想知道这是否可能。
编辑1:如果没有,是否可以将“外部”函数编译成我可以包含在另一个文件中的程序集形式。是的,疯狂但也很酷……
快速浏览一下,这很可能是一个选择。我想自动编译它是不可能的,所以有人可以给我一些关于汇编的信息吗?我只使用了基本的 ARM 程序集。我已经用-S
GCC 中的标志编译成玩具函数。如何将寄存器与变量链接?它们会始终保持相同的顺序吗?该功能将得到高度优化。我应该什么时候开始和结束提取?我应该.cfi_startproc
在开头和.cfi_def_cfa 7, 8
结尾都包含吗?#
编辑 2:
这篇文章详细介绍了 gcc 如何使用-flto
. 遗憾的是,这仅适用于 4.5 版,我没有也没有能力安装它,因为我没有需要在其上编译它的机器的 root 访问权限。另一种可能的解决方案是解释如何将不同版本的 GCC 安装到 unix 机器上的文件夹中。
c++ - 使用带有 -O4 (LTO) 的 FlasCC 编译的 C++ 程序挂起虚拟调用
我对 FlasCC 中的 LTO 优化有疑问。
当使用 -O1 编译时,生成的 swf 运行得很好。
但是使用 -O4 它首先运行正常,但随后突然挂起特定的虚拟函数调用超过 15 秒,然后 Flash 将其停止。
我添加了 printfs 以使用 Flash 日志跟踪确切的挂起点。
它挂在 printf("Program_Step : vis init") 永远不会进入真正的 Initialize() 实现。指针被声明为 IGameVisualizer *m_pVisualizer;
代码:
linker - Clang 链接时间优化在 Fedora 18 上无法正常工作
我是clang的新手,所以很可能我在做一些愚蠢的事情。但是我花了几个小时寻找解决方案,包括在这里搜索,在那里我没有找到解决 -flto 与发行版提供的软件包的问题。此描述的详细信息特定于 Fedora 18,但我在 Ubuntu 13.04 上遇到了类似的问题,因此问题并非特定于 Fedora。要么是我,要么是铿锵。
问题:我正在尝试编译一个简单的 hello-world 程序,clang++ -flto
以获取链接时间优化的好处。没有 -flto 它工作正常。使用 -flto 无法链接。调用clang -flto -o hello hello.o -v
以查看完整的链接器命令行,我得到:
似乎有两个问题:
clang++ 将链接器调用为
/usr/bin/ld
,这不是黄金链接器。Fedora18 将黄金安装为/usr/bin/ld.gold
. 我试过从/usr/local/bin/ld
to创建一个符号链接/usr/bin/ld.gold
,验证which ld
说/usr/local/bin/ld
,但 clang++ 不使用它。它似乎是硬连线到/usr/bin/ld。clang++ 使用
-plugin /usr/bin/../lib/LLVMgold.so
. 这是错误的,因为铿锵的 Fedora 发行版将它放在/usr/lib64/llvm/LLVMgold.so
.
我尝试通过以下调整手动调用上面的链接器行:
替换
-plugin /usr/bin/../lib/LLVMgold.so
为-plugin /usr/lib64/llvm/LLVMgold.so
。这会产生错误消息hello.o: file not recognized: File format not recognized
。因此,非黄金链接器似乎了解插件,但不会采用包含 LLVM 位码的 .o。替换
/usr/bin/ld
为/usr/bin/ld.gold
。这有效,生成按预期运行的可执行文件。以上两者都用
--plugin
而不是-plugin
。这种变化没有任何区别。
那么对于喜欢坚持使用系统提供的软件包来使用 clang -flto 的人来说,最好的方法是什么?我希望有一个配置文件,或未记录的选项或环境变量可以让我覆盖这些。或者更好的是,我缺少一个包,“yum install ...”将修复它。
我不希望直接调用链接器,因为这样我的 makefile 需要知道他们应该不知道的系统对象和库(例如 crt1.o、crtbegin.o、crtend.o)。我也可以自己构建 clang,但我在它的配置脚本中没有看到任何可以让我配置链接器和插件路径的东西。
我正在运行 Fedora 18。计算机上唯一的非发行版软件包是 google chrome 和 VMware Tools(它是 VMWare Fusion 中的访客)。相关 Fedora 软件包的版本(截至今天,2013 年 4 月 29 日,整台计算机已“yum 更新”):
android - arm-linux-androideabi-g++:-fuse-linker-plugin,但未找到 liblto_plugin.so
我在ubuntu 12.04下编译Chrome V8的时候遇到了一个问题就是
arm-linux-androideabi-g++:致命错误,-fuse-linker-plugin,但未找到 liblto_plugin.so
ndk 版本是 r8b。我怎么解决这个问题?
c++ - LTO和虚拟析构函数怪异c ++
在使用 GCC 4.8.1 启用 LTO 进行编译/链接时遇到问题。我得到对 DLL 中符号的未定义引用,即使它们似乎存在。奇怪的是,如果没有启用 LTO,它会成功编译和链接。当派生类中没有定义虚拟析构函数时,LTO 似乎很困难。
- 删除 DECLSPEC 使其在启用 LTO 的情况下编译和工作。
- Dependency walker 显示符号在那里。链接时间优化器似乎无法找到它们。
- 在派生类中声明任何类型的析构函数都
Test
可以使其工作。 - 删除 LTO 优化也使其成功运行,我想知道为什么这是一个问题。
测试是一个共享库,主要链接到共享库。
测试.h
测试.cpp
主文件
原谅我凌乱的makefile..
gcc - 什么是 GCC lto 包装器?
我正在使用 buildroot 为嵌入式系统准备图像。我想导出 buildroots 内部交叉编译器,以便其他人可以使用相同的版本,在命令检查 GCC 版本后:arm-linux-gcc -v
我看到配置COLLECT_LTO_WRAPPER
到我的硬盘上的静态位置
在另一个系统上它不会是正确的。
我只能发现 LTO 意味着链接时间优化。您能否解释一下 lto 包装器的用途以及何时需要?