此文是Fred Chow在德拉华大学所讲open64课程讲义的翻译,转载请注明出处 http://www.lingcc.com
Fred Chow 原版讲义见最后一页
Open64课程–过程间分析优化
- IPA的角色
唯一在程序间的优化操作。分析:收集整个程序的信息; 优化:在程序过程之间进行优化。IPA的整个优化效果取决于它之后的优化;IPA也为之后的优化阶段提供了跨文件的信息。
- IPA的流图

- IPA的准备阶段
即:Pre-IPA(IPL)阶段。将前端扩展为一个编译单元。它在PREOPT阶段之后成为VHO(?),并将所有优化前的WHIRL信息汇总。之后生成含新的ELF段的伪.0文件。这个.0文件包含WHIRL段和汇总信息阶段。

- 关于汇总信息
使用汇总信息的目的是OPA不需要沿着WHIRL传播;每个PU中存储的信息包括:PU内容的统计、每个PU中的反馈信息、形参、全局变量赋值、PU中的调用点、实参、常数表及其值、IPA相关表以及它们的mod/ref(?)、相关符号的SSA图、指定的简单表达式和语句、控制依赖、常见块和规模(?)、结构体访问信息(详见ipa/local/ipl_summary.h文件)
- 主IPA阶段概览
它使用了pre-linker的机制:IPA阶段编译到ipa.so文件中,ipa.so使用成为ipa_link的GNU ld实现链接。操作的模式:首先,传递所有输入文件,进行符号表解析,读入汇总信息;然后进行过程间分析,仅工作在汇总信息上、再接着进行过程间优化,即读入WHIRL并修改WHIRL;最后得到输出。
- 关于符号解析
ipa_link和ld(无-ipa选项时)在link阶段看到的对象相同。他们的ipa_link和ld符号解析规则也一样。不同文件中的全局符号将会合并到一个单一的全局符号表中,并保存在symtab.i文件中,且之后的全局符号表只有一个。
- 符号表合并
只要没有特定到单个PU的符号表都将合并,顶层的驱动函数是IPC_merge_global_tab(common/ipc_symtab_merge.cxx),并且创建了一个新表用来将旧表中的旧索引映射到新索引。符号表合并的顺序依次是:字符串表、类型、TCONs、符号、INITOs和INITVs、符号属性(ST_ATTR)

[...] open64课程–过程间分析优化(IPA) (9) [...]
[...] open64课程–过程间分析优化(IPA) [...]
[...] open64课程–过程间分析优化(IPA) [...]
[...] I) part 1Open64课程–反馈指导优化(FDO) « 编译点滴 on open64课程–过程间分析优化(IPA)Open64课程–反馈指导优化(FDO) « 编译点滴 on [...]
[...] open64课程–过程间分析优化(IPA) [...]
ipa_link和ld(无-ipa选项时)在link阶段看到的对象相同。但是ipa_link和ld识别符号解析的规则不同.
不理解第一句。
另外原文是Identical symbol resolution rules between ipa_link and ld。为啥翻译成规则不同?
抱歉,这里是我在没有理解IPA的基础上翻译出的错。正确的译法是:ipa_link和ld(无-ipa选项时)在link阶段看到的对象相同。他们的ipa_link和ld符号解析规则也一样。
这主要是因为,ipa_link有类似于LD的行为—在全局范围内处理符号表和PU,open64中的ipa_link就是从ld的源码中修改而来,所以他们看到的对象和符号解析规则相同。ipa_link和ld的不同点是,ipa_link用这些全局信息作进一步的分析和优化,而ld则是利用这些信息来重新解析不好表,将多个.o文件生成最后的可执行文件。
因为自己的英语还不行,翻译过程中肯定有问题,尽管指出,呵呵。我一定修改:)
Thanks
@hg,
Ipalink用ld的代码,是因为symbol lookup的逻辑和行为要保持一致。llvm则是在link时直接作ipa
–by zsc
这个博客的技术性好强。
呵呵 主要是为了让自己能学到点东西:)
偶尔也会有一些生活的文章。欢迎来看看 呵呵