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固有のことが知りたいので、今のところ満足しています。 テストが欲しいなぁ、と思わなくもないですが。

次はとうとうオブジェクトコードを生成するようなので、続きをやるのが楽しみです。