DeepRoute Lab | LLVM IR Tutorial观后感

本文记录了作者重温LLVM Developer Conference教程后的观后感,适合无LLVM基础的读者入门。内容涵盖LLVM IR的基本概念、中间表示形式、LLVM工具、IR基本块、PHI语句、类型系统和GEP操作。同时提到了LLVM IR在编译过程中的作用和SSA形式的重要性。
摘要由CSDN通过智能技术生成

By-元戎感知组

 最近又重温了一把LLVM Developer Conference一个tutorial,记录一下之前的一些观后感。整个tutorial还是非常适合没有LLVM基础的人入门跟手操一段LLVM代码的。


Prerequisite


IR->intermediate representation也就是所谓的中间表示形式。一般来说编译器会使用的IR包含了DAG,三地址码(靠近目标机器),CFG(控制流图),SSA(比较常见的,single static assignment),CPS(更加一般的SSA)。其中SSA由于每个变量仅被赋值一次更加容易做整个IR的分析以及其他的优化包含(constant propagation)。其他的IR形式这边就不多少了,需要的话再一一开坑。
文件格式:
1.    bc bitcode 2. ll 中间表示文件
有用的工具:
1.    llvm-dis 反汇编工具将bc文件转为ll文件
2.    llvm-as 汇编工具将ll文件转为bc文件
3.    clang/clang++这两者分别都是LLVM的前端parser也就是编译器工具
4.    opt用来check或者优化或者转化IR文件, e.g. opt --verify x.ll

Example


先准备一个小例子

// filename main.cpp
int main() {
  return 0;
}
//clang -S -emit-llvm main.cpp
//可以看到了产生了ir文件main.ll

打开main.ll文件

; ModuleID = 'main.cpp'
source_filename = "main.cpp"
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
target triple = "arm64-apple-macosx11.0.0"
 
; Function Attrs: noinline norecurse nounwind optnone ssp uwtable
define i32 @main() #0 {
  %1 = alloca i32, align 4
  store i32 0, i32* %1, align 4
  ret i32 0
}
 
attributes #0 = { noinline norecurse nounwind optnone ssp uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "frame-pointer"="non-leaf" "less-precise-fpmad"="false" "min-legal-vector-width"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值