目录
1. 详细步骤
2. 工作原理
本文将展示使用Clang(C语言前端),把C语言源码转换成LLVM IR 。当然首先需要安装Clang并且把它添加到PATH环境中。
1. 详细步骤
(1)首先准备测试文件,在multiply.c文件编写一段C代码,如下:
$ cat multiply.c
int mult() {int a =5;int b = 3;int c = a * b;return c;}
(2)使用Clang工具将C语言转换成LLVM IR,命令如下:
$ clang -emit-llvm -S multiply.c -o multiply.ll
其中参数:
-emit-llvm:使用LLVM表示汇编和目标文件
-S: 使用.ll文件输出,不加-S,输出文件是.bc格式
(3)查看生成的LLVM IR
$ cat multiply.ll
; ModuleID = 'multiply.c'target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"target triple = "x86_64-unknown-linux-gnu"; Function Attrs: nounwind uwtabledefine i32 @mult() #0 {%a = alloca i32, align 4%b = alloca i32, align 4%c = alloca i32, align 4store i32 5, i32* %a, align 4store i32 3, i32* %b, align 4%1 = load i32* %a, align 4%2 = load i32* %b, align 4%3 = mul nsw i32 %1, %2store i32 %3, i32* %c, align 4%4 = load i32* %c, align 4ret i32 %4}
2. 工作原理
将C语言代码编译为LLVM IR的过程从词法分析开始——将C语言源码分解成token流,每个token可表示标识符、字面量、运算符等;token流会传递给语法分析器,语法分析器会在语言的CFG(Context Free Grammar,上下文无关文法)的指导下将token流组织成AST(抽象语法树);接下来会进行语义分析,检查语义正确性,然后生成IR。
后续会有文章详细描述词法分析、语法分析和代码生成的工作原理。