对于llvm这样的编译框架来说,IR很重要,连接着编译器的前端和后端.实际上我们在llvm中编写的各种pass都是作用在llvm IR上的,因此我们很有必要来了解下llvm IR的结构.
llvm IR主要分为以下4个层次:
-
Module:IR化的源文件
-
Function:编程语言中的函数
-
BasicBlock:一组顺序执行的指令集合,每个基本块的末尾是跳转或返回指令
-
Instruction:llvm IR中的最小可执行单位,每一条指令单占一行
对上述4大层次来讲,次级都是上级的基本组成元素,我们可以通过以下代码来遍历Module中的每条指令.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
void printfModule(Module &M){
for (Function &F : M){
errs() << "\n==================函数开始=========================\n";
errs() << F.getName() << ":\n";
for (BasicBlock &BB : F){
errs() << BB.getName() << ":\n";
for (Instruction &I : BB) {
errs() << I << "\n";
}
}
errs() << "\n==================函数结束=========================\n";
}
}
|