新しいステップの後端の七は、テキスト「フロントLLVMバックエンド文書の分析がで導入されていました」。「私たちはしているの違いは、ドキュメントとコードの最初のステップの新しいLLVMバックエンドを作成」と「対象登録修正は」「最初のステップに記載されている文書を既存されているTargetMachineなどのクラスのサブクラスを作成特性を記述するターゲット・マシン「と実際のコードの違い。私は使用されるコードは、バックエンド・コードをRISCVれる分析するときもちろん、既存の文書は、バックエンドのSparcの例として使用されます。両方の少しぎこちない対照的に、それは、コントラストに影響を与えません。シリーズのバックエンド文書の分析と比較が終わった後、私は中国語版は「の例としてRISCVに書き込むことができ、計画LLVMバックエンドの書き込みバックエンドの読み取りに精通学生を容易にする必要があり、文書を」。彼女はRISCVを選びましたが、ためにも、最近のベンチャーMasamoriの、およびその開発について、私は個人的には楽観的。同時に、また違いを形成する原稿の一例をSPARCすることができます。
新しいドキュメントの後端の第二段階では、主な内容は、基本的には何の問題公式文書を導入していないが、文書の内容の一部が更新されたコードを保持していない対象のレジスタセットを説明して:.あります。この簡単な要約を行うには:
1、LLVM / LIB /対象/ Sparcの中SparcRegisterInfo.td、SparcRegisterInfo.hとSparcRegisterInfo.cppの主確立/ターゲットプラットフォーム用。
2、でSparcRegisterInfo.td確立されるサブクラスの登録<n>は:
class SparcReg<bits<16> Enc, string n> : Register<n> {
後、各Sparcのレジスタのため、このクラスのオブジェクトを作成します。同時に、だけでなく、RegisterClassクラスのSparcRegisterInfo.tdにおける一連のオブジェクトを確立します。(で指定のRegisterClassクラス Target.td)ANを定義するために使用するには、レジスタのデフォルトも割り当て順序を定義し、グループAと関連レジスタザ・のことで表します。したがって、このクラスのオブジェクトは、レジスタのセットの発現に関連すると割り当てを登録されたオブジェクトでありますデフォルトの順序。
実際には、登録するとRegisterClassこれら2つのクラスがであるLLVM /含める/ LLVM /ターゲット/ Target.td で定義されました。
3、SparcRegisterInfo.hとSparcRegisterInfo.cppの実装。これら二つの文書SparcRegisterInfo.td RISCVGenRegisterInfo生成されたファイルのサブクラスであるいくつかの手動RISCVRegisterInfoクラスコードを、達成するために主に次のとおりです。
struct RISCVRegisterInfo : public RISCVGenRegisterInfo {
だから、一部のメンバーSparcRegisterInfo.hダイレクト機能に加えて、値を返すことができ、またSparcRegisterInfo.cppで一部の機能が過負荷に、文書は、関数があるリロードする必要性を説明します。
- getCalleeSavedRegs - オフセット目的の呼び出し先保存スタックフレームの順に呼び出し先保存レジスタのリストを返します。
- getReservedRegs - 特定のレジスタが利用できないかどうかを示す、物理レジスタ番号によって索引付けビット集合を返します。
- hasFP - 機能は、専用のフレーム・ポインタ・レジスタを持っているかどうかを示すブール値を返します。
- eliminateCallFramePseudoInstrは - 呼び出しフレームの設定または破壊する疑似命令が使用されている場合は、これは、それらを排除するために呼び出すことができます。
- eliminateFrameIndexは - それらを使用することが指示から抽象フレームインデックスを排除します。
- emitPrologue - 関数にプロローグコードを挿入します。
- emitEpilogue - 関数に挿入エピローグコード。
このセッションで、ドキュメントやコードではいくつかの違いがありますが、文書は、コードの内容がで見つけることができます更新するために、実際のコードに追いついていません:SparcRegisterInfo.cpp 。
RISCV後端に、前面2及び文書が、特定の特徴RISCVが交換の内容にも一致します。しかしRISCV最新あまりにもこのステップのコード、およびドキュメントは、次のように実装され、実際にオーバーロードされたメンバ関数はかなり異なっています。
const uint32_t *getCallPreservedMask(const MachineFunction &MF,
CallingConv::ID) const override;
const MCPhysReg *getCalleeSavedRegs(const MachineFunction *MF) const override;
BitVector getReservedRegs(const MachineFunction &MF) const override;
bool isConstantPhysReg(unsigned PhysReg) const override;
const uint32_t *getNoPreservedMask() const override;
void eliminateFrameIndex(MachineBasicBlock::iterator MI, int SPAdj,
unsigned FIOperandNum,
RegScavenger *RS = nullptr) const override;
unsigned getFrameRegister(const MachineFunction &MF) const override;
特定のコードRISCVを参照してください:RISCVRegisterInfo.h 、 RISCVRegisterInfo.cpp と RISCVRegisterInfo.tdを 。
全体として、この部分の文書とコードとの間の差は、主に過負荷メンバ関数の部分3が異なっていない、この差は、ドキュメントとコードの理解に影響を及ぼしません。前よりも良いの違いを超えて受け入れました。
参考文献:LLVMバックエンドを書きます
参照コード:LLVM / LLVM-プロジェクト の最新コミット9ed325e
関連コンテンツ:
小さな天使父親:三〇から七LLVMバックエンドのプロフィールのLLVM毎日話(杭州シェアPPT)
小さな天使父親:四〇から七LLVMバックエンド文書の解析のLLVM毎日話
小さな天使父親:1を解析し、毎日四〇から八LLVMバックエンド文書についてLLVMの話
小さな天使父親:2を解析する毎日四〇から九LLVMバックエンド文書についてLLVMの話
小さな天使父親:3を解析50 LLVMバックエンド文書のLLVM毎日話 - ゴール記述クラス
小さな天使父親:五十から一TargetMachineなどのLLVM毎日話
父親小さな天使:LLVMは、ドキュメントとコードの最初のステップの新しいLLVMバックエンドを作成し、毎日五十から二の違いについて話をします
小さな天使父親:毎日五十から三ターゲットレジスト補正についてLLVMの話
2019年6月3日に編集されました