11

私はllvmを学んでいて、私が持っているアイデアの概念実証をしたいと思っていました.

基本的に、コンパイラとランタイムを分割したいと考えています。コンパイラは .bc を提供し、ランタイムは ParseBitcodeFile を介してそれをロードし、ExecutionEngine を使用して実行します。この部分は機能しています。

ここで、システム コールを簡単に作成するために、すべてのシステム コール (ファイル io、stdout 印刷など) を実行する C/C++ 関数をランタイムに実装できるようにしたいと考えています。私の質問は、llvm によって別のステップでコンパイルされたおもちゃのコンパイラのコードからこれらの関数を呼び出し、実行時に使用できるようにする方法です。

4

2 に答える 2

12

朗報: JIT を使用する場合ExecutionEngine、これは問題なく機能します。JIT-er は、IR 自体には見つからない、IR によって使用される外部シンボルを見つけると、JIT-ing プロセス自体を調べます。そのため、ホスト プログラムから見える任意のシンボルを呼び出すことができます。

これは、LLVM チュートリアルのパート 4 で直接説明されています。

おっと、JIT はどのようにして sin と cos を知るのでしょうか? 答えは驚くほど単純です。この例では、JIT が関数の実行を開始し、関数呼び出しに到達しました。関数がまだ JIT コンパイルされていないことを認識し、関数を解決するためにルーチンの標準セットを呼び出しました。この場合、関数の本体が定義されていないため、JIT は最終的に Kaleidoscope プロセス自体で「dlsym("sin")」を呼び出すことになります。「sin」は JIT のアドレス空間内で定義されているため、モジュール内の呼び出しにパッチを当てて、sin の libm バージョンを直接呼び出すだけです。

詳細についてはlib/ExecutionEngine/JIT/JIT.cpp、特にDynamicLibrary.

于 2013-07-11T04:35:21.290 に答える