1 //===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- 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 // Mips Assembly printer class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H 14 #define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H 15 16 #include "Mips16HardFloatInfo.h" 17 #include "MipsMCInstLower.h" 18 #include "MipsSubtarget.h" 19 #include "llvm/CodeGen/AsmPrinter.h" 20 #include "llvm/MC/MCStreamer.h" 21 #include "llvm/Support/Compiler.h" 22 #include <algorithm> 23 #include <map> 24 #include <memory> 25 26 namespace llvm { 27 28 class MCOperand; 29 class MCSubtargetInfo; 30 class MCSymbol; 31 class MachineBasicBlock; 32 class MachineConstantPool; 33 class MachineFunction; 34 class MachineInstr; 35 class MachineOperand; 36 class MipsFunctionInfo; 37 class MipsTargetStreamer; 38 class Module; 39 class raw_ostream; 40 class TargetMachine; 41 42 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { 43 MipsTargetStreamer &getTargetStreamer() const; 44 45 void EmitInstrWithMacroNoAT(const MachineInstr *MI); 46 47 //===------------------------------------------------------------------===// 48 // XRay implementation 49 //===------------------------------------------------------------------===// 50 51 public: 52 // XRay-specific lowering for Mips. 53 void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI); 54 void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI); 55 void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI); 56 57 private: 58 /// MCP - Keep a pointer to constantpool entries of the current 59 /// MachineFunction. 60 const MachineConstantPool *MCP = nullptr; 61 62 /// InConstantPool - Maintain state when emitting a sequence of constant 63 /// pool entries so we can properly mark them as data regions. 64 bool InConstantPool = false; 65 66 std::map<const char *, const Mips16HardFloatInfo::FuncSignature *> 67 StubsNeeded; 68 69 void EmitSled(const MachineInstr &MI, SledKind Kind); 70 71 // tblgen'erated function. 72 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 73 const MachineInstr *MI); 74 75 // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch, 76 // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate 77 // for the target. 78 void emitPseudoIndirectBranch(MCStreamer &OutStreamer, 79 const MachineInstr *MI); 80 81 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. 82 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); 83 84 void emitInlineAsmStart() const override; 85 86 void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo, 87 const MCSubtargetInfo *EndInfo) const override; 88 89 void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol); 90 91 void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg); 92 93 void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode, 94 unsigned Reg1, unsigned Reg2); 95 96 void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode, 97 unsigned Reg1, unsigned Reg2, unsigned Reg3); 98 99 void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc, 100 unsigned Reg1, unsigned Reg2, unsigned FPReg1, 101 unsigned FPReg2, bool LE); 102 103 void EmitSwapFPIntParams(const MCSubtargetInfo &STI, 104 Mips16HardFloatInfo::FPParamVariant, bool LE, 105 bool ToFP); 106 107 void EmitSwapFPIntRetval(const MCSubtargetInfo &STI, 108 Mips16HardFloatInfo::FPReturnVariant, bool LE); 109 110 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *); 111 112 void NaClAlignIndirectJumpTargets(MachineFunction &MF); 113 114 bool isLongBranchPseudo(int Opcode) const; 115 116 public: 117 const MipsSubtarget *Subtarget; 118 const MipsFunctionInfo *MipsFI; 119 MipsMCInstLower MCInstLowering; 120 121 explicit MipsAsmPrinter(TargetMachine &TM, 122 std::unique_ptr<MCStreamer> Streamer) 123 : AsmPrinter(TM, std::move(Streamer)), MCInstLowering(*this) {} 124 125 StringRef getPassName() const override { return "Mips Assembly Printer"; } 126 127 bool runOnMachineFunction(MachineFunction &MF) override; 128 129 void emitConstantPool() override { 130 bool UsingConstantPools = 131 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands()); 132 if (!UsingConstantPools) 133 AsmPrinter::emitConstantPool(); 134 // we emit constant pools customly! 135 } 136 137 void emitInstruction(const MachineInstr *MI) override; 138 void printSavedRegsBitmask(); 139 void emitFrameDirective(); 140 const char *getCurrentABIString() const; 141 void emitFunctionEntryLabel() override; 142 void emitFunctionBodyStart() override; 143 void emitFunctionBodyEnd() override; 144 void emitBasicBlockEnd(const MachineBasicBlock &MBB) override; 145 bool isBlockOnlyReachableByFallthrough( 146 const MachineBasicBlock* MBB) const override; 147 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 148 const char *ExtraCode, raw_ostream &O) override; 149 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 150 const char *ExtraCode, raw_ostream &O) override; 151 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 152 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 153 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O); 154 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, 155 const char *Modifier = nullptr); 156 void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O); 157 void emitStartOfAsmFile(Module &M) override; 158 void emitEndOfAsmFile(Module &M) override; 159 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 160 void emitDebugValue(const MCExpr *Value, unsigned Size) const override; 161 }; 162 163 } // end namespace llvm 164 165 #endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H 166