Home | History | Annotate | Line # | Download | only in Mips
      1 //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//
      2 //
      3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
      4 // See https://llvm.org/LICENSE.txt for license information.
      5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
      6 //
      7 //===----------------------------------------------------------------------===//
      8 
      9 #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
     10 #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
     11 
     12 #include "MCTargetDesc/MipsABIFlagsSection.h"
     13 #include "MCTargetDesc/MipsABIInfo.h"
     14 #include "llvm/ADT/Optional.h"
     15 #include "llvm/ADT/STLExtras.h"
     16 #include "llvm/MC/MCELFStreamer.h"
     17 #include "llvm/MC/MCRegisterInfo.h"
     18 #include "llvm/MC/MCStreamer.h"
     19 
     20 namespace llvm {
     21 
     22 class formatted_raw_ostream;
     23 
     24 class MipsTargetStreamer : public MCTargetStreamer {
     25 public:
     26   MipsTargetStreamer(MCStreamer &S);
     27 
     28   virtual void setPic(bool Value) {}
     29 
     30   virtual void emitDirectiveSetMicroMips();
     31   virtual void emitDirectiveSetNoMicroMips();
     32   virtual void setUsesMicroMips();
     33   virtual void emitDirectiveSetMips16();
     34   virtual void emitDirectiveSetNoMips16();
     35 
     36   virtual void emitDirectiveSetReorder();
     37   virtual void emitDirectiveSetNoReorder();
     38   virtual void emitDirectiveSetMacro();
     39   virtual void emitDirectiveSetNoMacro();
     40   virtual void emitDirectiveSetMsa();
     41   virtual void emitDirectiveSetNoMsa();
     42   virtual void emitDirectiveSetMt();
     43   virtual void emitDirectiveSetNoMt();
     44   virtual void emitDirectiveSetCRC();
     45   virtual void emitDirectiveSetNoCRC();
     46   virtual void emitDirectiveSetVirt();
     47   virtual void emitDirectiveSetNoVirt();
     48   virtual void emitDirectiveSetGINV();
     49   virtual void emitDirectiveSetNoGINV();
     50   virtual void emitDirectiveSetAt();
     51   virtual void emitDirectiveSetAtWithArg(unsigned RegNo);
     52   virtual void emitDirectiveSetNoAt();
     53   virtual void emitDirectiveEnd(StringRef Name);
     54 
     55   virtual void emitDirectiveEnt(const MCSymbol &Symbol);
     56   virtual void emitDirectiveAbiCalls();
     57   virtual void emitDirectiveNaN2008();
     58   virtual void emitDirectiveNaNLegacy();
     59   virtual void emitDirectiveOptionPic0();
     60   virtual void emitDirectiveOptionPic2();
     61   virtual void emitDirectiveInsn();
     62   virtual void emitFrame(unsigned StackReg, unsigned StackSize,
     63                          unsigned ReturnReg);
     64   virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
     65   virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
     66 
     67   virtual void emitDirectiveSetArch(StringRef Arch);
     68   virtual void emitDirectiveSetMips0();
     69   virtual void emitDirectiveSetMips1();
     70   virtual void emitDirectiveSetMips2();
     71   virtual void emitDirectiveSetMips3();
     72   virtual void emitDirectiveSetMips4();
     73   virtual void emitDirectiveSetMips5();
     74   virtual void emitDirectiveSetMips32();
     75   virtual void emitDirectiveSetMips32R2();
     76   virtual void emitDirectiveSetMips32R3();
     77   virtual void emitDirectiveSetMips32R5();
     78   virtual void emitDirectiveSetMips32R6();
     79   virtual void emitDirectiveSetMips64();
     80   virtual void emitDirectiveSetMips64R2();
     81   virtual void emitDirectiveSetMips64R3();
     82   virtual void emitDirectiveSetMips64R5();
     83   virtual void emitDirectiveSetMips64R6();
     84   virtual void emitDirectiveSetDsp();
     85   virtual void emitDirectiveSetDspr2();
     86   virtual void emitDirectiveSetNoDsp();
     87   virtual void emitDirectiveSetMips3D();
     88   virtual void emitDirectiveSetNoMips3D();
     89   virtual void emitDirectiveSetPop();
     90   virtual void emitDirectiveSetPush();
     91   virtual void emitDirectiveSetSoftFloat();
     92   virtual void emitDirectiveSetHardFloat();
     93 
     94   // PIC support
     95   virtual void emitDirectiveCpAdd(unsigned RegNo);
     96   virtual void emitDirectiveCpLoad(unsigned RegNo);
     97   virtual void emitDirectiveCpLocal(unsigned RegNo);
     98   virtual bool emitDirectiveCpRestore(int Offset,
     99                                       function_ref<unsigned()> GetATReg,
    100                                       SMLoc IDLoc, const MCSubtargetInfo *STI);
    101   virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
    102                                     const MCSymbol &Sym, bool IsReg);
    103   virtual void emitDirectiveCpreturn(unsigned SaveLocation,
    104                                      bool SaveLocationIsRegister);
    105 
    106   // FP abiflags directives
    107   virtual void emitDirectiveModuleFP();
    108   virtual void emitDirectiveModuleOddSPReg();
    109   virtual void emitDirectiveModuleSoftFloat();
    110   virtual void emitDirectiveModuleHardFloat();
    111   virtual void emitDirectiveModuleMT();
    112   virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);
    113   virtual void emitDirectiveSetOddSPReg();
    114   virtual void emitDirectiveSetNoOddSPReg();
    115   virtual void emitDirectiveModuleCRC();
    116   virtual void emitDirectiveModuleNoCRC();
    117   virtual void emitDirectiveModuleVirt();
    118   virtual void emitDirectiveModuleNoVirt();
    119   virtual void emitDirectiveModuleGINV();
    120   virtual void emitDirectiveModuleNoGINV();
    121 
    122   void emitR(unsigned Opcode, unsigned Reg0, SMLoc IDLoc,
    123              const MCSubtargetInfo *STI);
    124   void emitII(unsigned Opcode, int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
    125               const MCSubtargetInfo *STI);
    126   void emitRX(unsigned Opcode, unsigned Reg0, MCOperand Op1, SMLoc IDLoc,
    127               const MCSubtargetInfo *STI);
    128   void emitRI(unsigned Opcode, unsigned Reg0, int32_t Imm, SMLoc IDLoc,
    129               const MCSubtargetInfo *STI);
    130   void emitRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, SMLoc IDLoc,
    131               const MCSubtargetInfo *STI);
    132   void emitRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, MCOperand Op2,
    133                SMLoc IDLoc, const MCSubtargetInfo *STI);
    134   void emitRRR(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
    135                SMLoc IDLoc, const MCSubtargetInfo *STI);
    136   void emitRRRX(unsigned Opcode, unsigned Reg0, unsigned Reg1, unsigned Reg2,
    137                 MCOperand Op3, SMLoc IDLoc, const MCSubtargetInfo *STI);
    138   void emitRRI(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm,
    139                SMLoc IDLoc, const MCSubtargetInfo *STI);
    140   void emitRRIII(unsigned Opcode, unsigned Reg0, unsigned Reg1, int16_t Imm0,
    141                  int16_t Imm1, int16_t Imm2, SMLoc IDLoc,
    142                  const MCSubtargetInfo *STI);
    143   void emitAddu(unsigned DstReg, unsigned SrcReg, unsigned TrgReg, bool Is64Bit,
    144                 const MCSubtargetInfo *STI);
    145   void emitDSLL(unsigned DstReg, unsigned SrcReg, int16_t ShiftAmount,
    146                 SMLoc IDLoc, const MCSubtargetInfo *STI);
    147   void emitEmptyDelaySlot(bool hasShortDelaySlot, SMLoc IDLoc,
    148                           const MCSubtargetInfo *STI);
    149   void emitNop(SMLoc IDLoc, const MCSubtargetInfo *STI);
    150 
    151   /// Emit a store instruction with an offset. If the offset is out of range
    152   /// then it will be synthesized using the assembler temporary.
    153   ///
    154   /// GetATReg() is a callback that can be used to obtain the current assembler
    155   /// temporary and is only called when the assembler temporary is required. It
    156   /// must handle the case where no assembler temporary is available (typically
    157   /// by reporting an error).
    158   void emitStoreWithImmOffset(unsigned Opcode, unsigned SrcReg,
    159                               unsigned BaseReg, int64_t Offset,
    160                               function_ref<unsigned()> GetATReg, SMLoc IDLoc,
    161                               const MCSubtargetInfo *STI);
    162   void emitLoadWithImmOffset(unsigned Opcode, unsigned DstReg, unsigned BaseReg,
    163                              int64_t Offset, unsigned TmpReg, SMLoc IDLoc,
    164                              const MCSubtargetInfo *STI);
    165   void emitGPRestore(int Offset, SMLoc IDLoc, const MCSubtargetInfo *STI);
    166 
    167   void forbidModuleDirective() { ModuleDirectiveAllowed = false; }
    168   void reallowModuleDirective() { ModuleDirectiveAllowed = true; }
    169   bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }
    170 
    171   // This method enables template classes to set internal abi flags
    172   // structure values.
    173   template <class PredicateLibrary>
    174   void updateABIInfo(const PredicateLibrary &P) {
    175     ABI = P.getABI();
    176     ABIFlagsSection.setAllFromPredicates(P);
    177   }
    178 
    179   MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }
    180   const MipsABIInfo &getABI() const {
    181     assert(ABI.hasValue() && "ABI hasn't been set!");
    182     return *ABI;
    183   }
    184 
    185 protected:
    186   llvm::Optional<MipsABIInfo> ABI;
    187   MipsABIFlagsSection ABIFlagsSection;
    188 
    189   bool GPRInfoSet;
    190   unsigned GPRBitMask;
    191   int GPROffset;
    192 
    193   bool FPRInfoSet;
    194   unsigned FPRBitMask;
    195   int FPROffset;
    196 
    197   bool FrameInfoSet;
    198   int FrameOffset;
    199   unsigned FrameReg;
    200   unsigned GPReg;
    201   unsigned ReturnReg;
    202 
    203 private:
    204   bool ModuleDirectiveAllowed;
    205 };
    206 
    207 // This part is for ascii assembly output
    208 class MipsTargetAsmStreamer : public MipsTargetStreamer {
    209   formatted_raw_ostream &OS;
    210 
    211 public:
    212   MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
    213   void emitDirectiveSetMicroMips() override;
    214   void emitDirectiveSetNoMicroMips() override;
    215   void emitDirectiveSetMips16() override;
    216   void emitDirectiveSetNoMips16() override;
    217 
    218   void emitDirectiveSetReorder() override;
    219   void emitDirectiveSetNoReorder() override;
    220   void emitDirectiveSetMacro() override;
    221   void emitDirectiveSetNoMacro() override;
    222   void emitDirectiveSetMsa() override;
    223   void emitDirectiveSetNoMsa() override;
    224   void emitDirectiveSetMt() override;
    225   void emitDirectiveSetNoMt() override;
    226   void emitDirectiveSetCRC() override;
    227   void emitDirectiveSetNoCRC() override;
    228   void emitDirectiveSetVirt() override;
    229   void emitDirectiveSetNoVirt() override;
    230   void emitDirectiveSetGINV() override;
    231   void emitDirectiveSetNoGINV() override;
    232   void emitDirectiveSetAt() override;
    233   void emitDirectiveSetAtWithArg(unsigned RegNo) override;
    234   void emitDirectiveSetNoAt() override;
    235   void emitDirectiveEnd(StringRef Name) override;
    236 
    237   void emitDirectiveEnt(const MCSymbol &Symbol) override;
    238   void emitDirectiveAbiCalls() override;
    239   void emitDirectiveNaN2008() override;
    240   void emitDirectiveNaNLegacy() override;
    241   void emitDirectiveOptionPic0() override;
    242   void emitDirectiveOptionPic2() override;
    243   void emitDirectiveInsn() override;
    244   void emitFrame(unsigned StackReg, unsigned StackSize,
    245                  unsigned ReturnReg) override;
    246   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
    247   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
    248 
    249   void emitDirectiveSetArch(StringRef Arch) override;
    250   void emitDirectiveSetMips0() override;
    251   void emitDirectiveSetMips1() override;
    252   void emitDirectiveSetMips2() override;
    253   void emitDirectiveSetMips3() override;
    254   void emitDirectiveSetMips4() override;
    255   void emitDirectiveSetMips5() override;
    256   void emitDirectiveSetMips32() override;
    257   void emitDirectiveSetMips32R2() override;
    258   void emitDirectiveSetMips32R3() override;
    259   void emitDirectiveSetMips32R5() override;
    260   void emitDirectiveSetMips32R6() override;
    261   void emitDirectiveSetMips64() override;
    262   void emitDirectiveSetMips64R2() override;
    263   void emitDirectiveSetMips64R3() override;
    264   void emitDirectiveSetMips64R5() override;
    265   void emitDirectiveSetMips64R6() override;
    266   void emitDirectiveSetDsp() override;
    267   void emitDirectiveSetDspr2() override;
    268   void emitDirectiveSetNoDsp() override;
    269   void emitDirectiveSetMips3D() override;
    270   void emitDirectiveSetNoMips3D() override;
    271   void emitDirectiveSetPop() override;
    272   void emitDirectiveSetPush() override;
    273   void emitDirectiveSetSoftFloat() override;
    274   void emitDirectiveSetHardFloat() override;
    275 
    276   // PIC support
    277   void emitDirectiveCpAdd(unsigned RegNo) override;
    278   void emitDirectiveCpLoad(unsigned RegNo) override;
    279   void emitDirectiveCpLocal(unsigned RegNo) override;
    280 
    281   /// Emit a .cprestore directive.  If the offset is out of range then it will
    282   /// be synthesized using the assembler temporary.
    283   ///
    284   /// GetATReg() is a callback that can be used to obtain the current assembler
    285   /// temporary and is only called when the assembler temporary is required. It
    286   /// must handle the case where no assembler temporary is available (typically
    287   /// by reporting an error).
    288   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
    289                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
    290   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
    291                             const MCSymbol &Sym, bool IsReg) override;
    292   void emitDirectiveCpreturn(unsigned SaveLocation,
    293                              bool SaveLocationIsRegister) override;
    294 
    295   // FP abiflags directives
    296   void emitDirectiveModuleFP() override;
    297   void emitDirectiveModuleOddSPReg() override;
    298   void emitDirectiveModuleSoftFloat() override;
    299   void emitDirectiveModuleHardFloat() override;
    300   void emitDirectiveModuleMT() override;
    301   void emitDirectiveModuleCRC() override;
    302   void emitDirectiveModuleNoCRC() override;
    303   void emitDirectiveModuleVirt() override;
    304   void emitDirectiveModuleNoVirt() override;
    305   void emitDirectiveModuleGINV() override;
    306   void emitDirectiveModuleNoGINV() override;
    307   void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
    308   void emitDirectiveSetOddSPReg() override;
    309   void emitDirectiveSetNoOddSPReg() override;
    310 };
    311 
    312 // This part is for ELF object output
    313 class MipsTargetELFStreamer : public MipsTargetStreamer {
    314   bool MicroMipsEnabled;
    315   const MCSubtargetInfo &STI;
    316   bool Pic;
    317 
    318 public:
    319   bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
    320   MCELFStreamer &getStreamer();
    321   MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
    322 
    323   void setPic(bool Value) override { Pic = Value; }
    324 
    325   void emitLabel(MCSymbol *Symbol) override;
    326   void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
    327   void finish() override;
    328 
    329   void emitDirectiveSetMicroMips() override;
    330   void emitDirectiveSetNoMicroMips() override;
    331   void setUsesMicroMips() override;
    332   void emitDirectiveSetMips16() override;
    333 
    334   void emitDirectiveSetNoReorder() override;
    335   void emitDirectiveEnd(StringRef Name) override;
    336 
    337   void emitDirectiveEnt(const MCSymbol &Symbol) override;
    338   void emitDirectiveAbiCalls() override;
    339   void emitDirectiveNaN2008() override;
    340   void emitDirectiveNaNLegacy() override;
    341   void emitDirectiveOptionPic0() override;
    342   void emitDirectiveOptionPic2() override;
    343   void emitDirectiveInsn() override;
    344   void emitFrame(unsigned StackReg, unsigned StackSize,
    345                  unsigned ReturnReg) override;
    346   void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
    347   void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
    348 
    349   // PIC support
    350   void emitDirectiveCpAdd(unsigned RegNo) override;
    351   void emitDirectiveCpLoad(unsigned RegNo) override;
    352   void emitDirectiveCpLocal(unsigned RegNo) override;
    353   bool emitDirectiveCpRestore(int Offset, function_ref<unsigned()> GetATReg,
    354                               SMLoc IDLoc, const MCSubtargetInfo *STI) override;
    355   void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
    356                             const MCSymbol &Sym, bool IsReg) override;
    357   void emitDirectiveCpreturn(unsigned SaveLocation,
    358                              bool SaveLocationIsRegister) override;
    359 
    360   void emitMipsAbiFlags();
    361 };
    362 }
    363 #endif
    364