LTO链接时优化过程(具体gcc流程流程图待补充)
1)CC1生成带gimple信息的elf文件
2)LTO1读取多个elf文件的gimple信息建立全局调用图优化。
(查看elf文件可以发现,里面有很多段用于将cc1的信息传递给LTO1)在 LTO 常用的优化算法有
- 不可到达代码消除
- 过程间常数传播
- 过程间生存期分析
- 间接调用转换为直接调用
- 访存优化
- 函数内联(inline) 等
- 完成传统编译器无法实现的过程间优化;eg:常量传播、生存期分析等
- 可以针对库函数在特定上下文环境做进一步优化eg:caller地方发现inline库函数更合适,就不在调用库函数了
- LIR层级的优化:针对芯片指令集的优化,比如:cache相关(指令对齐d等)
- 根据linke确定的地址信息做优化eg:内存L2->L1
通常很多软件不用LTO的原因(待补充)
- 大型软件分布式编译导致周期太长
- 钩子函数优化可能有风险
- 调试问题