lliの概要

lliは、LLVM BitCodeのインタプリタ兼JITコンパイラである

JITコンパイラモード

デフォルトでJITコンパイラで動作する
BitCodeをllcでCodeGenするのとほぼ等価なアセンブラを生成して実行する
オプションもllcと共用

なお、lli はJITコンパイラを動作させるだけのもの(いわば llvm::ExecutionEngine のサンプル)であり、
実行時最適化とか適応最適化とかを期待してはいけない。それらを実装するのは LLVM インフラストラクチャを利用するあなたです!
インタプリタ実行中に、突然JITコンパイルされたオブジェクトに置換して上げるには、
切り替える瞬間のレジスタの内容やスタックフレームの割り当て等を予め計算しておく必要があるそうです。
詳細は、「コンパイラとバーチャルマシン」第10章、動的コンパイラの章を参照。
※回し者ではありません。

↑EE::JIT はそれには対応してなかったとおもう。そもそも CodeGenerator の動作が基本 function 単位なので。
ただ、任意コンテキストでのバイナリ差し替えはとても需要があるのでぜひ…俺もほしいくらい。

Eager と Lazy


EE::JIT のデフォは Eager だったハズ。 lli のデフォは Lazy. -disable-lazy-compilation というオプションがある。

Eager とは @main() 実行前にすべての function などを生成するモード。

Lazy とは、各 function に stub (EE::JIT function 生成コールバックを呼ぶ短い命令) を埋め込み、新しい関数に制御が移るたび生成を行うモード。ちなみに C でいうところの function pointer の指す先は、このモードでは常に stub になります。


インタプリタモード

-force-interpreter
BitCodeをⅠ命令ずつvisitしながらインタプリタ実行する

-force-interpreter -debug-only=interpreterでログを出力できる

  • 最終更新:2011-02-09 20:10:55

このWIKIを編集するにはパスワード入力が必要です

認証パスワード