オリジナル言語のLLVMフロントエンドをKonohaScriptで実装する その2

 前回の補足です。KonohaScriptのインストールはKonohaScript インストール手順(1)ソースからのビルド - Konoha日誌 で確認する事が出来ます。LLVMパッケージの利用には、LLVM(http://llvm.org/)のインストールも必要です。
 KonohaScriptのLLVMパッケージではC++で記述されているLLVMをバインドしています。コード自体はLLVMのチュートリアル(http://llvm.org/docs/tutorial/)にあるオリジナルのKaleidoscopeのサンプルコードが基本になります。このため実装の大部分については終了しているといえます。今回はコードを簡潔に記述するために省略していますが、KonohaScriptからJITコンパイルされた関数を呼び出す際、引数や返り値はKonohaScriptのスタックにロード/ストアする必要があります。

JITコンパイルされたプログラムの実行

JITコンパイルされた関数addを、KonohaScriptから呼び出してみます。

int x = 10, y = 20;
print add(x, y)

関数addへの引数は、KonohaScriptのスタック上にストアされています。このため、addが引数x、yを利用するためには、KonohaScriptのスタック上から値をロードする必要があります。同様に返り値もKonohaScriptのスタックにストアしなければいけません。このためにはLLVMのモジュールにKonohaScriptのスタックや、KonohaScript内部で利用されている構造体の型情報を登録する必要があります。KonohaScript内部で利用されている構造体の中には、メンバが非常に多い構造体がいくつか存在します。冗長なコードなので、今回はKonohaScriptとの引数と返り値のやりとりは省略します。JITコンパイルされた関数の結果の表示は、関数内で直接printfを呼ぶなどしようかと思います。