LLVM Kaleidoscope是LLVM Tutorial里提供的Toy语言,走完这个Tutorial可以对LLVM的机制有个大体上的了解

但Tutorial的一些说明并不清楚,为此踩了些坑,在这里记录下

环境配置

这次我用Code-Server完成的练习,操作系统为Debian,配置了Sid源

apt install llvm-18 lldb-18 clang-18 cmake ninja-build

借此机会重新回顾了下CMake,项目结构已上传Github,可供参考:

CMake_LLVM_Kaleidoscope

还需要另外安装CMake:

apt install cmake ninja-build

实操避坑

Chpater4 后JIT遇到头文件缺失

实测Debian的LLVM14和LLVM16缺失头文件ExecutorSymbolDef.h

解决方案:升级到LLVM18

建议如果要运行Kaleidoscope的话,使用当时最新的LLVM版本,从而避免大改动对Tutorial运行的影响

LLVM>14后使用CMake遇到的情况

参考[CMake] find_package(LLVM CONFIG) may fail when the project does not use C遇到的情况

项目配置必须加上:

project(Kaleidoscope VERSION 0.1.0 LANGUAGES CXX C)

如果不想看警告,还需要加上对应库(根据警告情况自行搜索,基本都能搜得到):

apt install libcurl4-openssl-dev libzstd-dev 

谨慎安装:

apt install libedit-dev

Chapter5,6 的printd,putchard无法使用

从StackOverflow上看来的,Clang++加上相对应的编译参数:

-Xlinker --export-dynamic

对应CMake的效果:

target_link_options(Kaleidoscope PRIVATE -Xlinker --export-dynamic)

Kaleidoscope-Ch9 < fib.ks | & clang -x ir -为什么没反应?

这语句本身运行就有问题(bash: syntax error near unexpected token `&’)

试着用重定向解决问题,但学艺不精没成功,只能手动Ctrl CV到output.txt上,然后再用clang编译

clang -x ir output.txt

使用LLVDB调试输出程序,会显示源代码

(lldb) list 1
   1    def fib(x)
   2      if x < 3 then
   3        1
   4      else
   5        fib(x-1)+fib(x-2);
   6   
   7    fib(10)

(Note:插个题外话,Chapter9介绍了有关Dwarf的部分,感兴趣的可以看这个作为补充资料:阎明铸 - DWARF入门及实现 mini objdump -WL - 20240717(内部报告,非公开演讲,仅限爱好者交流))