LLVM IR コマンドライン引数へのアクセス
対象読者
LLVM IR 初学者
解決すること
内容
LLVM IR で getelementptr など、ちょっと躓きやすいところを簡単に実験出来るように、コマンドライン引数へのアクセスを簡単にまとめておきます。getelementptr の説明は、本家が別枠でページを持っていたり、参考になるブログがあります。getelementptr
は、アドレス計算だけしてポインタの deref はしません。deref は load でやります。以下、コマンドライン引数の最初の文字列の最初の文字のアスキーコードを返す IR。
define dso_local i32 @main(i32 %ac, i8** %av) #0 {
%av_1_addr = getelementptr inbounds i8*, i8** %av, i8 1
%av_1_deref = load i8*, i8** %av_1_addr, align 8
%av_1_1_addr = getelementptr inbounds i8, i8* %av_1_deref, i8 0
%av_1_1_deref = load i8, i8* %av_1_1_addr, align 1
%ret = sext i8 %av_1_1_deref to i32
ret i32 %ret
}
実行は、上を sample.ll に保存したとして、
$ lli sample.ll a
$ echo $?
97
0 番目の引数(つまり IR のファイル名そのもの)の0番目の文字を表示するのであれば、アドレス計算はいらなくなります。
define dso_local i32 @main(i32 noundef %ac, i8** noundef %av) #0 {
%av_0_deref = load i8*, i8** %av, align 8
%av_0_0_deref = load i8, i8* %av_0_deref, align 1
%ret = sext i8 %av_0_0_deref to i32
ret i32 %ret
}
ちなみに、最後から2番めにある sext は型変換。