C++
LLVM
コンパイラ

なぜあなたのKaleidoscopeはコンパイルできないのか?

A. あなた使っているLLVMに適合したKaleidoscopeJIT.hでありません。利用しているLLVMのバージョンのリリースブランチからKaleidoscopeJIT.hを得ましょう。

この記事は「LLVM 6.0 で作るフロントエンドの道しるべ」の兄弟記事です。
以降は詳細という名の蛇足です。

Kaleidoscope

LLVMを用いてプログラミング言語を実装する公式チュートリアルに、Kaleidoscopeがあります。LLVMに入門した多くの人が参照したのではないでしょうか。そして、写経とはいかないも、サンプルコードをコンパイルするくらいは試したことと思います。

筆者の場合、4章のJITでサンプルコードがコンパイルできず、早速つまづきました。この原因は、適切な KaleidoscopeJIT.h を使っていないことにあります。

KaleidoscopeJIT.h のありか

3章まではサンプルコードそのままでコンパイルできても、4章からは KaleidoscopeJIT.h を用意しろと言われます。よくチュートリアルを読むと llvm-src/examples/Kaleidoscope/include/KaleidoscopeJIT.h にあるらしいです。

KaleidoscopeJIT.h で検索すると、だいたい https://github.com/llvm-mirror/llvm/blob/master/examples/Kaleidoscope/include/KaleidoscopeJIT.h に行き当たります。 LLVMのミラーリポジトリだし、パスあってるし、これじゃんと思って使うと、コンパイルエラーになります。コンパイルエラーになるのは、 master ブランチ向けに修正されているためです。

使うべき KaleidoscopeJIT.h は、使っているLLVMのバージョンのブランチに、あるいはきちんとリリースされたソースに同梱されている KaleidoscopeJIT.h です。正しいブランチからヘッダを参照しましょう。 LLVM 6.0を使っている場合には、以下から参照できるものが正しい KaleidoscopeJIT.h です。

おわび

煽りタイトルで、さらに内容薄になってしまったことは反省しています。

参考文献