summ.c --(clang -emit-llvm -S)--> summ.ll --(llvm-as)----> summ.bc --(llc)---> summ.s
opt -S -O2 实施机器无关优化,跟后端目标代码生成无关,故llc是llvm的后端。
1,示例代码
summ.c
int adddd(int aaa, int bbb, int ccc)
{
aaa = aaa + bbb;
aaa = aaa + ccc;
return aaa;
}
Makefile
BIN_DIR := ../../local_x86_3_5/bin
CLANG := $(BIN_DIR)/clang
OPT := $(BIN_DIR)/opt
LLVM-AS := $(BIN_DIR)/llvm-as
LLC := $(BIN_DIR)/llc
OUT := summ.s summ.bc summ.ll summ.clang.O3.s summ.opt.O2.ll summ.opt.O2.bc summ.opt.O2.s
all: $(OUT)
summ.ll: summ.c
$(CLANG) -emit-llvm -S summ.c -o summ.ll
summ.bc: summ.ll
$(LLVM-AS) summ.ll -o summ.bc
summ.s: summ.bc
$(LLC) summ.bc -o summ.s
summ.clang.O3.s: summ.c
$(CLANG) -O3 -S summ.c -o summ.clang.O3.s
summ.opt.O2.ll: summ.ll
$(OPT) -O2 -S summ.ll -o summ.opt.O2.ll
summ.opt.O2.bc: summ.opt.O2.ll
$(LLVM-AS) summ.opt.O2.ll -o summ.opt.O2.bc
summ.opt.O2.s: summ.opt.O2.bc
$(LLC) summ.opt.O2.bc -o summ.opt.O2.s
.PHONY: clean
clean:
-rm $(OUT)
2,机器无关优化前后区别
关注 一下 summ.opt.O2.ll 的内容,机器对应的 ASM
3,X86后端分析
llc 是如何将 summ.opt.O2.ll 生成为 summ.opt.O2.s 的呢?
从命令行的角度如下:
$ llvm-as summ.opt.O2.ll -o summ.opt.O2.bc
$ llc summ.opt.O2.bc -o summ.opt.O2.s
关键是这里的 llc 的功能。
接下来分析 llc 的源码大体过程。。。
llc 代码路径:
/home/hipper/ex_llvmorg-3.5.0/llvm-project/llvm/tools/llc/llc.cpp
主要是这个函数:
static int compileModule(char **argv, LLVMContext &Context)
其中,X86 后端机器信息的路径为:
/home/hipper/ex_llvmorg-3.5.0/llvm-project/llvm/lib/Target/X86