FPGA開発日記

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

LLVMのオリジナルバックエンド実装をRelease 9.0のブランチに移植してみる

https://cdn-ak.f.st-hatena.com/images/fotolife/m/msyksphinz/20190425/20190425001356.png

LLVM Release 9.0のリリースが目前だ。release_90のブランチでは日進月歩でコミットが進んでいるようだ。

github.com

これまではrelease_80ブランチの上で作業していたのだが、そろそろrelease_90の上に移ってちゃんと移植できるか確かめた方が良い気がしてきた。 Release_90とRelease_80でどのような違いがあるのか、見ておきたい。

このためには、git rebase --ontoでこれまでのコミットのベースとなるブランチをrelease_80からrelease_90に移動する。

git rebase --onto release_90 release_80 myriscvx/impl80
              G - H - I (myriscvx/impl80ブランチ)
             /
            D - E - F (release_90ブランチ)
           /
- A - B - C (release_80ブランチ)
                       G - H - I (myriscvx/impl90ブランチ)
                      /
             D - E - F (release_90ブランチ)
           /
- A - B - C (release_80ブランチ)

一応これでブランチの移動ができた。これでビルドを行ってエラーとなった点を見つけだしていく。

  • レジスタRegisterが導入された。getFrameRegisterなどの戻り値を変えた。
diff --git a/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.cpp b/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.cpp
index 6e63a194e1e..d62c757e745 100644
--- a/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.cpp
+++ b/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.cpp
@@ -175,8 +175,8 @@ void MYRISCVXAsmPrinter::printHex32(unsigned Value, raw_ostream &O) {
 void MYRISCVXAsmPrinter::emitFrameDirective() {
   const TargetRegisterInfo &RI = *MF->getSubtarget().getRegisterInfo();

-  unsigned stackReg  = RI.getFrameRegister(*MF);
-  unsigned returnReg = RI.getRARegister();
+  Register stackReg  = RI.getFrameRegister(*MF);
+  Register returnReg = RI.getRARegister();
   unsigned stackSize = MF->getFrameInfo().getStackSize();

   if (OutStreamer->hasRawTextSupport())
diff --git a/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.cpp b/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.cpp
index 7d462ba03cd..21fd93bb2e7 100644
--- a/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.cpp
+++ b/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.cpp
@@ -162,7 +162,7 @@ MYRISCVXRegisterInfo::trackLivenessAfterRegAlloc(const MachineFunction &MF) cons
 }

 // pure virtual method
-unsigned MYRISCVXRegisterInfo::
+Register MYRISCVXRegisterInfo::
 getFrameRegister(const MachineFunction &MF) const {
   return MYRISCVX::FP;
 }
diff --git a/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.h b/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.h
index 8604ff26cf6..95743e9161f 100644
--- a/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.h
+++ b/lib/Target/MYRISCVX/MYRISCVXRegisterInfo.h
@@ -53,7 +53,7 @@ namespace llvm {
                              RegScavenger *RS = nullptr) const override;

     /// Debug information queries.
-    unsigned getFrameRegister(const MachineFunction &MF) const override;
+    Register getFrameRegister(const MachineFunction &MF) const override;

     /// \brief Return GPR register class.
     virtual const TargetRegisterClass *intRegClass(unsigned Size) const = 0;
  • AsmPrinter()APIの一部引数が変更されている。
@@ -285,8 +285,7 @@ void MYRISCVXAsmPrinter::PrintDebugValueComment(const MachineInstr *MI,

 // Print out an operand for an inline asm expression.
 bool MYRISCVXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
-                                         unsigned AsmVariant,const char *ExtraCode,
-                                         raw_ostream &O) {
+                                         const char *ExtraCode, raw_ostream &O) {
   // Does this asm operand have a single letter operand modifier?
   if (ExtraCode && ExtraCode[0]) {
     if (ExtraCode[1] != 0) return true; // Unknown modifier.
@@ -295,7 +294,7 @@ bool MYRISCVXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
     switch (ExtraCode[0]) {
       default:
         // See if this is a generic print operand
-        return AsmPrinter::PrintAsmOperand(MI,OpNum,AsmVariant,ExtraCode,O);
+        return AsmPrinter::PrintAsmOperand(MI, OpNum, ExtraCode, O);
       case 'X': // hex const int
         if ((MO.getType()) != MachineOperand::MO_Immediate)
           return true;
@@ -335,10 +334,8 @@ bool MYRISCVXAsmPrinter::PrintAsmOperand(const MachineInstr *MI, unsigned OpNum,
 }


-bool MYRISCVXAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI,
-                                               unsigned OpNum, unsigned AsmVariant,
-                                               const char *ExtraCode,
-                                               raw_ostream &O) {
+bool MYRISCVXAsmPrinter::PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
+                                               const char *ExtraCode, raw_ostream &O) {
   int Offset = 0;
   // Currently we are expecting either no ExtraCode or 'D'
   if (ExtraCode) {
diff --git a/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.h b/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.h
index c8e0d31cc9d..9541e802ce6 100644
--- a/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.h
+++ b/lib/Target/MYRISCVX/MYRISCVXAsmPrinter.h
@@ -74,11 +74,9 @@ namespace llvm {
                                      const MachineInstr *MI);

     bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
-                         unsigned AsmVariant, const char *ExtraCode,
-                         raw_ostream &O) override;
+                         const char *ExtraCode, raw_ostream &O) override;
     bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
-                               unsigned AsmVariant, const char *ExtraCode,
-                               raw_ostream &O) override;
+                               const char *ExtraCode, raw_ostream &O) override;
     void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
   };
 }

これだけの変更でビルドが完了した。テストも正しく動作したようだ。