summ.c --(clang -emit-llvm -S)--> summ.ll --(llvm-as)----> summ.bc --(llc)---> summ.s
opt -S -O2 实施机器无关优化,跟后端目标代码生成无关,故llc是llvm的后端。
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)

关注 一下 summ.opt.O2.ll 的内容,机器对应的 ASM

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