深入理解LLVM:代码生成
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

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