LLVM IRを読みたい
コード例
https://gyazo.com/4c215d35922cd092cc13dfd8ae61b5ce
HaskellでLLVMを触るで出力したやつ
LLVM IRの関数定義 ref
code:ll
define i32 @main(i32 %argc, i8** %argv) {
...
}
%argc, %argvは型を持ったレジスタ
型 名前の感じなのねmrsekut.icon
@と%
@はglobalな変数のprefix
%はlocalな変数のprefix
ラベル
code:ll
entry_0:
jumpするときに使う
LLVM IRの型システム ref
種類
int
boolはi1で表現
ex. i1,i32などiNで表現
float, double
pointer
Cと同じ様に*で表現
配列
[サイズx型]で表現
ex. [4 x i64]
ベクタ
<サイズx型>で表現
構造体
{型, 型, ...}
void
関数型
ラベル型
token型
Metadata型
http://nondot.org/~sabre/LLVMNotes/TypeSystemChanges.txt
GEP
GetElementPtr
http://llvm.org/docs/GetElementPtr.html
https://qiita.com/Anko_9801/items/df4475fecbddd0d91ccc#getelementptrgep
わかりやすい
LLVM IRにgetelementptrという命令がある
code:ll
getelementptr <元の型>, <ベースのアドレス>, <配列や構造体などのインデックス>
最後の<配列や構造体などのインデックス>は複数個ある場合もある
元の型ってなにmrsekut.icon
変数のアドレスを計算する
code:ll
i8* getelementptr inbounds (4 x i8, 4 x i8* @putNumForm, i32 0, i32 0)
命令
alloca
ref
https://rhysd.hatenablog.com/entry/2017/03/13/230119
store
アドレスへ値を書き込む
load
メモリアドレスの読み込み
参考
こわくないLLVM入門! - Qiita
https://gist.github.com/TakesxiSximada/42c7bfffa024b7ecd7b1adbb02015c01
https://qiita.com/sakasin/items/097fa676ccfd117acaa2
https://itchyny.hatenablog.com/entry/2017/02/27/100000
https://yhara.jp/MakingLanguageWithLlvm
https://postd.cc/llvm-for-grad-students/
https://www.ibm.com/developerworks/jp/opensource/library/os-createcompilerllvm1/index.html
https://dev.classmethod.jp/server-side/about_llvm/
https://blog.ymyzk.com/2015/07/clang-llvm-ir-assembly/
https://codehex.hateblo.jp/entry/2018/01/18/083000
https://www.wolfram.com/language/12/code-compilation/create-llvm-code.html.ja?footer=lang
http://zehnpaard.hatenablog.com/entry/2018/04/17/103918
https://www.ncaq.net/2018/02/05/13/30/40/
https://takoeight0821.github.io/posts/2017-09-21-write-llvm-prog.html
https://www.slideshare.net/cuzic/llvm-23970786
LLVMやLLVM IRとリンクがかぶっているかもmrsekut.icon