Kaleidoscope optmizer

学习内容

完成对 https://llvm.org/docs/tutorial/MyFirstLanguageFrontend/LangImpl04.html 的学习。

练习

看懂原网页后,实现同样的功能(但将原示例的JIT方式改为传统编译流程)。

扩展

1 在dump出LLVMIR后,能否使用编译好的llvm组件实现编译运行等功能?应该如何做?
2 编写一个driver封装(可以使用shell),把main函数作为入口编译成可执行程序

进展

完成了原示例中的优化部分,删掉了原示例中的JIT部分。

实现

实现了如下的主要变更:
1 删掉了JIT功能,原实例中的扩展库函数没有实际意义也删掉了(有extern语法就肯定能扩展,与JIT功能无关)
2 新增了模块级别的优化功能,可以对单个源代码文件进行整体优化(如inline等)
3 将Passmanager的实现从示例的legacy切换到了新的实现上
4 实现了输入文件的编译

扩展问题

1 玩具前端codegen到出LLVM-IR后,可以使用LLVM提供的独立opt工具进行优化,优化后的输出可以是LLVM-IR的文本形式(-S参数)也是可以bitcode。然后再使用clang编译成二进制文件,就可以进行通常的链接了。也就是说,如果不介意多一次IR导出和IR导入的性能损耗,其实优化是完全可以不必在toy_compiler中实现的。

2 编写了一个compiler.sh,可以把入参文件编译为可执行文件(需要提供main函数)。添加了一个kout函数专门用于打印函数返回值。