iwiwi 備忘録

学んだことを殴り書きます。自分向けのメモです。

LLVM Tutorial をやったメモ

LLVM Tutorial: Table of Contents — LLVM 5 documentation

まだ途中までしかやってないです。Kaleidoscopeという言語の処理系を作っていきます。非常にシンプルな言語です。対話環境で入力されたコードをJITして実行します。

  • LLVM のバージョンで結構コードが動かないので、バージョンに合わせたチュートリアルを見ると良い。
  • 本文のコードは結構間違っている上に、全部の編集箇所を紹介するわけではないので、最終コードと適宜比較しながらやる。
  • 2章末尾で最初にコンパイルするタイミングで 「clang++ -g -O3 toy.cppコンパイルしよう!」とか言ってくるけど LLVM のファイルを include してるのでもっとオプションが必要。clang++ toy.cpp `llvm-config --cxxflags --ldflags --system-libs --libs core`
  • JITに入る前、IR生成して表示する時点で既に定数が畳み込まれるのが観測できる。
  • KaleidoscopeJIT.h は GitHub とかでゲットすると良い。release_39 ブランチが LLVM 3.9 に相当。自分のバージョンに合わせて落とす。 llvm/KaleidoscopeJIT.h at release_39 · llvm-mirror/llvm · GitHub
  • putchard, printd が呼べない時はコンパイル引数に -rdynamic をつけてみる。
  • SSA, φ関数は日本語Wikipediaで普通にすぐ理解できる。 静的単一代入 - Wikipedia
  • チュートリアルに従って作ったJIT処理系が(コンパイルするから当然とはいえ)再帰で書いたfib(40)を0.5秒とかで計算できるのは結構感動した。 time ./a.out <<< "def fib(x) if x < 3 then 1 else fib(x - 1) + fib(x - 2) ; fib(40)"