LLVM工具链的使用

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编译器开发指南》

淘宝、京东 在售
在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值