LLVM Tutorialをやっている(2)~7章まで~
7. Kaleidoscope: Extending the Language: Mutable Variables — LLVM 8 documentation
tomo-wait-for-it-yuki.hatenablog.com
前回に引き続き、LLVMのTutorial Kaleidoscopeをやっています。 メモを残しながらやっていないので、あまりインフォーマティブな記事にならないですね。
5~7章 (Control Flow
, User-defined Operators
, Mutable Variables
)を完了し、おぼろげながらLLVM IRが読めるようになってきました。
1回、ケアレスミスでJIT Compilerがエラーを吐くようになってしまいました。原因は、Builder.CreateFAdd();
と浮動小数点の加算命令を生成しなければならない部分を、Builder.CreateAdd();
と整数の加算にtypoしていたことでした。
JIT Compilerがミスすると、あまり親切なエラーが出力されず、しょうもないミスで30分くらい悩んでいました。
こういうときは、どうやってデバッグするんだろう?
後は、自作関数をJIT Compilerからシンボル実行する機能を作成するのですが、リンカオプションが抜けており動かなくてハマりました。
# Compile clang++ -g toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core mcjit native` -O3 -o toy -rdynamic
On some platforms, you will need to specify -rdynamic or -Wl,–export-dynamic when linking.
フロントエンド部分は、Go言語でつくるインタプリタから新しいアップデートはないですが、今回は、LLVM固有のことが知りたいので、今のところ満足しています。 テストが欲しいなぁ、と思わなくもないですが。
次はとうとうオブジェクトコードを生成するようなので、続きをやるのが楽しみです。