LLVMのバックエンドについて一通り勉強を進めてきたが、どうもまだしっくりこない部分がある。
もう少し各メソッドの構造についてサマライズし、いったいLLVMがどういう仕組みでバックエンドを出力しているのか、見ていきたい。
まずはここまでで、作成したクラスをまとめた。以下の図では、複数のクラスの関係図をまとめている。
上記では、以下のクラスについて関係をまとめた。
MYRISCVXTargetMachine
MYRISCVXSubtarget
MYRISCVXTargetLowering
MYRISCVXInstrInfo
MYRISCVXRegisterInfo
MYRISCVXFrameLowering
MYRISCVXABIInfo
バックエンドのマシン構造について、一番上位のクラスに当たるのはMYRISCVXTargetMachine
である。
MYRISCVXTargetMachine
の下にサブターゲットであるMYRISCVX32TargetMachine
, MYRISCVX64TargetMachine
が継承される。
MYRISCVXTargetMachine
の内部でMYRISCVXSubTarget
がインスタンス化され、その下に各種必要なクラスがそろうという形だ。
また、サブターゲット自体もMYRISCVXGenSubtargetInfo
という自動生成されたクラスをベースとしている。
- 命令に関するクラス :
MYRISCVXInstrInfo
- レジスタに関するクラス :
MYRISCVXRegisterInfo
- レジスタに関するクラス :
- フレームに関するクラス :
MYRISCVXFrameLowering
そして、これらのクラスはインスタンスされた親のクラスのポインタを持っていることが分かる。
インスタンス化されたSubtarget
を、ポインタとして保持している。
MYRISCVXTargetLowering
はLLVM IRをLoweringするためのクラスで、実際にはここにルールを書いていくことになる。