単子葉類プログラマーのメモ

プログラミング関連の自分用メモだけど他の人の役に立つかもしれないので公開しておく感じのブログ

LLVM言語 学習メモ(5) - 外部ライブラリの呼び出し方

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の作り方は以下。

docs.microsoft.com

静的ライブラリ

静的ライブラリ(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:MSVCRTbar.libを作成の仕方次第で指定が必要になるオプション。

libを指定してlliで実行する手段は不明。 というか静的ライブラリというものの性質から考えて、おそらくそのような手段はない。

静的ライブラリの作り方は以下。

docs.microsoft.com