1.3 LLVM构建与调试
本书涉及的后端架构、Pass和算法都是以LLVM 15为基础的,具体代码可以从github.com/llvm-project处直接下载,笔者维护了镜像https://github.com/inside-compiler/llvm-project,读者也可以直接通过该镜像获得源码。
LLVM构建比较简单,读者可以参考官方项目中的构建说明进行操作,构建完成后就可以使用GDB或者LLDB进行调试,这里仅做一个简单的介绍。下面以笔者使用的macOS环境为例介绍构建和调试工作。
1)环境准备:在macOS上构建LLVM需要安装开发套件CMake、git等。
2)下载代码:通过git clone,从https://github.com/inside-compiler/llvm-project镜像下载代码。该项目分支会默认切换到LLVM 15,读者无须再次切换。
3)构建代码:按照构建说明进行构建。本书主要以BPF后端为例进行说明,为了加快构建速度,可以通过命令行参数LLVM_TARGETS_TO_BUILD仅构建BPF后端。构建LLVM工程使用的命令如代码清单1-1所示。
代码清单1-1 构建LLVM工程使用的命令
cd llvm-project //进入当前代码仓
mkdir build //创建build目录
cd build //进入build目录,构建过程中的中间文件和结果都放在该目录中
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Debug -DLLVM_TARGETS_TO_BUILD=BPF
-DLLVM_ENABLE_PROJECTS="clang" ../llvm //生成makefile文件
make -j 32 //使用32线程进行并行构建
4)验证:构建完成后,相应的可执行文件位于build/bin目录下。以llc命令为例,执行llc --version可以得到如代码清单1-2所示的结果。
代码清单1-2 验证结果
LLVM (http://llvm.org/):
LLVM version 15.0.1
DEBUG build with assertions.
Default target: arm64-apple-darwin22.5.0
Host CPU: cyclone
Registered Targets:
bpf - BPF (host endian)
bpfeb - BPF (big endian)
bpfel - BPF (little endian)
5)调试:开发者可以使用lldb调试llc,设置断点并运行测试。例如,为了验证尾代码合并的功能,通过b TailDuplicateBase::runOnMachineFunction命令为函数设置断点,同时设置lldb运行参数settings set -- target.run-args -debug -tail-dup-size=10 test.ll[4],然后执行run命令即可。关于lldb更多使用方法可以参考lldb使用文档。lldb调试命令示例如代码清单1-3所示:
代码清单1-3 LLDB调试命令示例
(lldb) target create "../llvm-project/build/bin/llc"
Current executable set to
'/Users/ryanpeng/Project/llvm-project/build/bin/llc' (arm64).
(lldb) b TailDuplicateBase::runOnMachineFunction
Breakpoint 1: where=llc`(anonymous namespace)::TailDuplicateBase::runOnMachin
eFunction(llvm::MachineFunction&) + 28 at TailDuplication.cpp:84:20, address=
0x00000001011c9114
(lldb) settings set -- target.run-args -debug -tail-dup-size=10 test.ll
(lldb) run