LLVM言語でダイナミックリンクライブラリや静的ライブラリで定義されている関数を呼び出す方法についてのメモ。
Linux環境でも流用できるかもしれないが、ここではWindows環境のみを対象としている。
※LLVMのバージョンは10.0.0
目次
ダイナミックリンクライブラリ
ダイナミックリンクライブラリ(dllファイル)に以下の関数を定義している。
extern "C" __declspec(dllexport) int foo(int n) { return 2 * n; }
それを呼び出すLLVMプログラムは以下。
declare dllimport i32 @foo(i32) define i32 @main() { %1 = call i32 @foo(i32 111) ret i32 %1 }
lli
コマンドでの実行方法は以下。
lli -load=(拡張子を除くDLLファイル名) (LLVMプログラム).ll
DLLの作り方は以下。
静的ライブラリ
静的ライブラリ(libファイル)に以下の関数を定義している。
extern "C" int bar() { return 12345; }
それを呼び出すLLVMプログラムは以下。
declare i32 @bar() define i32 @main() { %x = call i32 @bar(); ret i32 %x }
以下のコマンドでビルドして実行する。
llc -filetype=obj (LLVMプログラム).ll
link (LLVMプログラム).obj (拡張子を含むlibファイル名) /DEFAULTLIB:libcmt /LTCG /NODEFAULTLIB:MSVCRT
/LTCG /NODEFAULTLIB:MSVCRT
はbar.lib
を作成の仕方次第で指定が必要になるオプション。
libを指定してlli
で実行する手段は不明。
というか静的ライブラリというものの性質から考えて、おそらくそのような手段はない。
静的ライブラリの作り方は以下。