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