LLVM工具链的使用
LLVM编译工具链中较常用到的有前端和编译驱动工具clang、后端工具llc、链接器lld、中端优化器opt、汇编器llvm-mc、ELF解读工具llvm-readelf、反汇编工具llvm-objdump。本节以在x86 Ubuntu Linux环境中从C源文件编译出ELF格式文件为例,对这些工具的使用作介绍。后续在相关章节,还会有对TableGen代码编译器llvm-tblegen、IR链接器llvm-link等更多工具的介绍,以及用这些工具来进行各中间形态的可视化等用途的介绍。
1.1.1. 编译驱动和前端clang
作为编译驱动使用,clang兼容gcc的大部分命令行,可以直接编译C源文件生成可执行文件EXE或动态链接库DSO:
$ clang fmain.c func1.c -o fmain
也可以用-c选项生成目标文件.o,以及用–target选项指定目标架构(缺省架构为x86)。下面的命令行指定生成SparcV9架构的目标文件:
$ clang --target=sparcv9 -O2 func1.c -c -o func1.o
-c选项生成的.o是ELF目标文件,它可以输入给链接环节进行多个目标文件的链接,从而生成可执行文件。
IR代码(.ll后缀)是LLVM调试开发中的最重要中间形态,也是调试中经常需要查看分析的代码形态。使用clang工具时,用-emit-llvm加上-S选项就可以生成IR文本代码:
$ clang --target=sparcv9 -emit-llvm -S -O2 func1.c -c -o func1.ll
.ll文件可以交给opt工具进行IR代码的优化,或是交给llc工具进行后端编译。
1.1.2. 后端工具llc
llc是LLVM的独立后端编译工具,负责由IR代码(.ll文本或.bc二进制)生成asm汇编文件,也可以生成目标文件.o。例如,由IR的.ll文本代码生成asm汇编文本文件:
$ clang --target=sparcv9 -emit-llvm -S -O2 func1.c -c -o func1.ll
$ llc –mtriple=sparcv9 func1.ll -o func1.s
要使用llc生成二进制目标文件.o,可以使用–filetype=obj选项:
$ llc –mtriple=sparcv9 func1.ll --filetype=obj -o func1.o
llc后端工具的输入也可以是IR的二进制文件.bc,效果和输入.ll等价。
1.1.3. 链接器lld
lld是LLVM工具链中的链接器,它以目标文件.o为输入,链接生成可执行文件EXE或动态链接库文件DSO。可执行文件的链接:
$ ld.lld func1.o fmain.o -o fmain -e main
使用–shared选项来生成DSO:
$ ld.lld --shared func1.o -o libfunc1.so
1.1.4. 中端优化opt
opt是LLVM的独立优化工具,针对LLVM IR代码文件进行优化。例如,对func1.ll进行-O2级别的优化:
$ opt -O2 -S func1.ll -o func1.ll
opt还允许指定使用某个Pass进行优化。下面的命令指定运行–loweratomic这个Pass(用于将程序从抢占运行环境向非抢占环境的变换):
$ opt --loweratomic -S func1.ll -o func1.ll
1.1.5. 汇编器llvm-mc
llvm-mc是LLVM工具链中的汇编器,角色功能等同于GCC工具链中的as,用于将ASM Text文件汇编生成ELF可重定位文件:
$ llvm-mc func1.s -triple=sparcv9 -filetype=obj -o func1.o
1.1.6. ELF信息打印llvm-readelf
llvm-readelf用于读出展示ELF文件的Header、Section、Program和符号等信息,角色功能等同于GCC工具链中的readelf。例如,用-h选项读出一个DSO的ELF Header:
$ llvm-readelf -h libfunc1.so
1.1.7. 二进制汇编打印llvm-objdump
llvm-objdump用于读出展示ELF文件中代码Section或是数据Section的内容,角色功能等同于GCC工具链中的llvm-objdump:
$ llvm-objdump -S libfunc1.so
新书上架《LLVM编译器开发指南》
淘宝、京东 在售

1635

被折叠的 条评论
为什么被折叠?



