mac使用clang进行llvm IR学习

mac使用clang进行llvm IR学习,第1张

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



一、程序编译的四个阶段 1、预处理:

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

  • #define 宏定义
  • #include 文件包含,这里一般包含.h头文件 头文件和源文件的区别是什么?
  • #if() 条件编译
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 -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

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1324470.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存