FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

オリジナルLLVMバックエンド実装をまとめる(1. クラス構造の関係図)

LLVMのバックエンドについて一通り勉強を進めてきたが、どうもまだしっくりこない部分がある。

もう少し各メソッドの構造についてサマライズし、いったいLLVMがどういう仕組みでバックエンドを出力しているのか、見ていきたい。

まずはここまでで、作成したクラスをまとめた。以下の図では、複数のクラスの関係図をまとめている。

f:id:msyksphinz:20190908225007p:plain
LLVMバックエンドクラスの関係図

上記では、以下のクラスについて関係をまとめた。

  • MYRISCVXTargetMachine
  • MYRISCVXSubtarget
  • MYRISCVXTargetLowering
  • MYRISCVXInstrInfo
  • MYRISCVXRegisterInfo
  • MYRISCVXFrameLowering
  • MYRISCVXABIInfo

バックエンドのマシン構造について、一番上位のクラスに当たるのはMYRISCVXTargetMachineである。 MYRISCVXTargetMachineの下にサブターゲットであるMYRISCVX32TargetMachine, MYRISCVX64TargetMachineが継承される。 MYRISCVXTargetMachineの内部でMYRISCVXSubTargetインスタンス化され、その下に各種必要なクラスがそろうという形だ。 また、サブターゲット自体もMYRISCVXGenSubtargetInfoという自動生成されたクラスをベースとしている。

  • 命令に関するクラス : MYRISCVXInstrInfo
  • フレームに関するクラス : MYRISCVXFrameLowering

そして、これらのクラスはインスタンスされた親のクラスのポインタを持っていることが分かる。 インスタンス化されたSubtargetを、ポインタとして保持している。

MYRISCVXTargetLoweringLLVM IRをLoweringするためのクラスで、実際にはここにルールを書いていくことになる。