LLVMのバックエンドについて一通り勉強を進めてきたが、どうもまだしっくりこない部分がある。
もう少し各メソッドの構造についてサマライズし、いったいLLVMがどういう仕組みでバックエンドを出力しているのか、見ていきたい。
まずはここまでで、作成したクラスをまとめた。以下の図では、複数のクラスの関係図をまとめている。

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