LLVM基础

对于llvm这样的编译框架来说,IR很重要,连接着编译器的前端和后端.实际上我们在llvm中编写的各种pass都是作用在llvm IR上的,因此我们很有必要来了解下llvm IR的结构.

llvm IR主要分为以下4个层次:

IR结构

  • 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";
    }
}

相关内容

0%