mac使用clang进行llvm IR学习

一、程序编译的四个阶段
二、clang中对应的操作



一、程序编译的四个阶段

1、预处理:

对程序中的编译预处理指令(非c语言指令,以#开头,不以;结尾)进行处理

2、编译:

       将源代码(高级语言)翻译为汇编代码(低级语言)

编译程序的组成

这里的目标程序就是汇编代码

3、汇编:

       将汇编语言翻译为机器语言,汇编语言将二进制码(例如11000010)表示为人容易理解的形式(例如LOAD),因此汇编过程也相对简单

4、链接:

       将c语言经过汇编之后生成的二进制文件,和系统组件(比如标准库、动态链接库等)结合起来,组合成一个可执行文件。
       如果将编写的程序分散到多个源文件中,编译器每次只能编译一个源文件,生成一个目标文件,这个时候,链接器除了将目标文件和系统组件组合起来,还需要将编译器生成的多个目标文件组合起来。
       综合来说就是将当前文件#include的.h头文件所对应的.c源文件组合起来。

二、clang中对应的操作

1、基本操作

clang hello.c #生成目标文件.out
clang -E hello.c #生成预处理文件hello.i
clang -S hello.c #生成汇编文件hello.s
clang -c hello.c #生成二进制文件hello.o
clang -Oi hello.c #编译优化等级i,级别为1~3
clang hello.c -o hello #指定输出文件的文件名为hello

2、llvm IR学习

clang -fmodules -fsyntax-only -Xclang -dump-tokens hello.c #词法分析
clang -fmodules -fsyntax-only -Xclang -ast-dump 00_main.c #语义分析
clang -S -emit-llvm hello.c #生成IR字节码文件hello.ll
llc hello.ll #编译IR中间代码hello.ll生成汇编文件hello.s

3、交叉编译到树莓派

使用安装过程安装的clang进行交叉编译

# hello.c->hello可执行文件
`brew --prefix llvm`/bin/clang \
    --target=arm-linux-gnueabihf \
    --sysroot=$HOME/sysroot \
    -isysroot=$HOME/sysroot \
    -isystem=$HOME/sysroot/usr/include \
    -isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
    -L$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    -B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    --gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
    -o hello \
    hello.c
    
# hello.c->hello.s
`brew --prefix llvm`/bin/clang \
    -S \
    --target=arm-linux-gnueabihf \
    --sysroot=$HOME/sysroot \
    -isysroot=$HOME/sysroot \
    -isystem=$HOME/sysroot/usr/include \
    -isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
    -B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    --gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
    -o hello.s \
    hello.c

# hello.c->hello.ll
`brew --prefix llvm`/bin/clang \
    -S  -emit-llvm \
    --target=arm-linux-gnueabihf \
    --sysroot=$HOME/sysroot \
    -isysroot=$HOME/sysroot \
    -isystem=$HOME/sysroot/usr/include \
    -isystem=$HOME/sysroot/usr/include/arm-linux-gnueabihf \
    -B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    --gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
    hello.c

# hello.ll->hello.s
`brew --prefix llvm`/bin/llc \
    -march=arm \
    hello.ll
    
# hello.s->hello
`brew --prefix llvm`/bin/clang \
    --target=arm-linux-gnueabihf \
    --sysroot=$HOME/sysroot \
    -L$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    -B$HOME/sysroot/usr/lib/gcc/arm-linux-gnueabihf/10 \
    --gcc-toolchain=`brew --prefix arm-linux-gnueabihf-binutils` \
    -o hello \
    hello.s
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值