对于LLVM这样的编译框架,IR(Intermediate Representation,中间表示)是核心。它连接着编译器前端与后端,体现着LLVM的插件化、模块化设计哲学。LLVM的pass实际上都是基于IR进行的。同时,IR作为编译器组件接口,使得设计新语言只需实现生成LLVM IR的编译器前端即可,从而轻松利用LLVM优化、JIT、目标代码生成等功能。
LLVM IR主要以三种形式表示:
1. 内存中的IR模型,对应于LLVM实现的类结构。
2. 用于读取的汇编形式的IR。
3. 通过命令行工具(如`clang`)生成,如`clang add.cpp -emit-llvm -S -c -o add.ll`。
汇编形式的IR以简洁形式展示,例如,`add`函数的IR可读性较高,即使不了解具体指令定义,也能大致对应源码与汇编IR。
IR生成方面,LLVM提供了构建接口,前端可调用实现代码生成。生成过程相对复杂,本文简要介绍。以一段示例代码为例,目标是构建IR Module,包含`add1`和`foo`两个函数。理解过程仿佛是编译器前端,根据语义将代码翻译为LLVM IR。
最终代码输出IR的汇编形式并保存,与之前生成的IR一致,展示了IR生成过程。