分类选择: 产品分类一 产品分类二 产品分类三 产品分类四 产品分类五
编译优化之 - 链接时优化(LTO)入门
作者:佚名    所属栏目:【产品分类三】    时间:2024-08-26
1. 关于 LTO 、-flto 、ThinLTO

ThinLTO overview

2. LLVM或AOCC中flto

LLVM中lto work在IR(Intermediate representation)上,我们常用的选项其实代表,指将分散的目标文件的所有LLVM IR组合到一个大的LLVM模块中,然后对其进行整体分析优化并生成,该选项仅并行执行前端的语义分析,优化和生成在单线程完成。则是把模块分开,根据需要才从其他模块导入功能,并且除全局分析外均采用并行的方式进行优化和的生成。因此使用比编译链接的速度大大加快,而且对于部分性能更好。

2.1 Linkers

ThinLTO当前在LLVM编译器中实现,其思想是主要是指导inline优化。它支持以下三种链接器:

  1. :使用前需要先安装插件,然后就可以使用。安装请见(The LLVM gold plugin)。
  2. :从Xcode 8开始。
  3. :来自于llvm项目,运行速度更快,特别是在众核处理器上。默认支持LTO,lld读取进行编译优化并输出文件。详细请见(The LLVM Linker — lld)。LLVM中关于lld的详细说明介绍请见知乎大佬的:LLVM中的lld程序流程分析 这篇文章。

基本用法:

 
 
3. GCC和ICC中flto
3.1 GCC中用法

GCC-4.6.0中开始支持LTO框架,主要分为:Partitioned LTO和Non-Partitioned LTO
分区的LTO(Partitioned LTO)整体步骤为:

  1. LGEN:生成摘要信息;生成转换单元信息
  2. WPA(Whole Program Analysis):读取除函数体外的call graph信息;每个函数的摘要信息
  3. LTRANS:局部转换

处理顺序为:

不分区的LTO(Non-Partitioned LTO)整体步骤为:

  1. LGEN:生成转换单元信息
  2. IPA(InterProcedural Analysis) :读取call graph和函数体内容;进行分析和转换

处理顺序为:

以上内容摘自于:https://www.cse.iitb.ac.in/grc/slides/pldi14tut-gcc/5-gcc-pldi14-lto-mechanism.pdf,是以GCC-4.7.2版本源码进行的分析说明。

GCC中使用编译代码时,它将生成,并将其写到目标文件的(部分的数据结构和枚举代码在 lto-streamer.h中),将目标文件链接在一起时,将从这些ELF中读取所有功能体,并将其实例化(链接期间,所有对象模块放在一起并调用lto1)。当前,大多数基于ELF的系统以及,和系统都启用了LTO支持。
从源码时使用编译,所有的在中管理,它包含两个:

GCC中基本用法:

 

GCC中如果你想知道你的代码从前端开始的编译过程中做了哪些pass,可使用、或者打印出来,如下:

 

phase
由上图可看出,源码经过前端处理之后在中端需要经过很多处理,你可以结合gdb看到每一个处理过程的转换信息。
对于最简单的 printf(“hello world”),在GCC中没有选项的情况下得到的汇编码如下:
assemble
使用之后的大致输出信息如下:
flto
由此看出:输出不包含目标代码,而仅包含信息。
关于优化的具体信息可通过打印出来:
verbose info
在以上标注的6个步骤中,真正开始起作用是从第4步开始,位置。

3.2 ICC中用法

ICC中提供了使用选项的链接时优化,以实现GCC兼容性。ICC中的链接时优化是在IPO中选取启用的。
ICC中基本用法:

 
4. 注意点

References:
网站首页 关于我们 耀世动态 耀世注册 耀世登录 联系我们

电话:400-123-4567      手机:13800000000
E-mail:admin@youweb.com      联系人:张生
地址:广东省广州市天河区88号

Copyright © 2012-2018 耀世娱乐-耀世注册登录官方入口 版权所有      琼ICP备xxxxxxxx号

扫一扫  关注微信

平台注册入口