てけもぐ Tech 忘備録

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 は型変換。