LLVM-Kaleidoscope实操踩坑记录
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:
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(内部报告,非公开演讲,仅限爱好者交流))