brintos

brintos / llvm-project-archived public Read only

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