LLVM full LTO 学习笔记

本文详细探讨了LLVM的Link-Time Optimization (LTO)技术,包括Full LTO和Thin LTO的工作原理。通过一个示例展示了LTO如何将多个源文件编译成LLVM IR的Bitcode格式,并在链接阶段进行优化。LTO通过分析Bitcode文件,优化全局作用域内的函数和变量,减少代码体积并提升性能。此外,还介绍了lld链接器在处理LTO对象文件时的流程,包括死函数计算、IR模块链接、优化和代码生成等步骤。

垃圾笔记,勿看,请观看 Teresa Johnson 的视频

什么是LTO(略)

LLVM LTO Objects都包含了哪些?

使用 Example of link time optimization 中的例子,如下所示。

--- a.h ---
extern int foo1(void);
extern void foo2(void);
extern void foo4(void);

--- a.c ---
#include "a.h"

static signed int i = 0;

void foo2(void) {
   
   
  i = -1;
}

static int foo3() {
   
   
  foo4();
  return 10;
}

int foo1(void) {
   
   
  int data = 0;

  if (i < 0)
    data = foo3();

  data = data + 42;
  return data;
}

--- main.c ---
#include <stdio.h>
#include "a.h"

void foo4(void) {
   
   
  printf("Hi\n");
}

int main() {
   
   
  return foo1();
}

编译 LTO 的版本,我们可以看到 a_lto.oa.o 多了1.2 K的内容。

$ clang -flto -c a.c -o a_lto.o
$ clang -c a.c -o a.o
$ ls -alh
...
-rw-r--r-- 1 wangliushuai wangliushuai 1.6K Feb  2 14:41 a.o
-rw-r--r-- 1 wangliushuai wangliushuai 2.8K Feb  2 14:41 a_lto.o

我们使用 hexdump 来打印object file中的内容,我们知道 magic number 通常用来识别文件格式。a.o 肯定是普通的 ELF 文件,ELF 文件的magic number 是 7F 45(E) 4C(L) 46(F) 。所以我们把焦点专注在a_lto.o 的magic number 4342 dec0上。

$ hexdump a_lto.o | head
0000000 4342 dec0 1435 0000 0005 0000 0c62 2430
0000010 594d 66be fb8d 4fb4 c81b 4424 3201 0005
0000020 0c21 0000 0262 0000 020b 0021 0002 0000
0000030 0016 0000 8107 9123 c841 4904 1006 3932

$ hexdump a.o | head
0000000 457f 464c 0102 0001 0000 0000 0000 0000
0000010 0001 003e 0001 0000 0000 0000 0000 0000

通过 man ascii 我们知道,42 43 分别是 B C,llvm IR 有三种表示形式,text,in memory 以及 bitcode。所以猜测 BC 就是 bitcode的意思。

Oct   Dec   Hex   Char                        Oct   Dec   Hex   Char
------------------------------------------------------------------------
# ...
002   2     02    STX (start of text)         102   66    42    B
003   3     03    ETX (end of text)           103   67    43    C
# ...

由此我们按图索骥,找到 bitcode 的 magic number 如下。正好与 4342 dec0 进行对应,总共 4 个字节。

[ ‘ B ’ 8 , ‘ C ’ 8 , 0 x 0 4 , 0 x C 4 , 0 x E 4 , 0 x D 4 ] [‘B’_8, ‘C’_8, 0x0_4, 0xC_4, 0xE_4, 0xD_4] </

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值