1 //===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // Mips Assembly printer class.
12 //===----------------------------------------------------------------------===//
14 #ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
15 #define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
17 #include "Mips16HardFloatInfo.h"
18 #include "MipsMCInstLower.h"
19 #include "MipsMachineFunction.h"
20 #include "MipsSubtarget.h"
21 #include "llvm/CodeGen/AsmPrinter.h"
22 #include "llvm/Support/Compiler.h"
23 #include "llvm/Target/TargetMachine.h"
28 class MachineBasicBlock;
29 class MipsTargetStreamer;
33 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
34 MipsTargetStreamer &getTargetStreamer() const;
36 void EmitInstrWithMacroNoAT(const MachineInstr *MI);
38 //===------------------------------------------------------------------===//
39 // XRay implementation
40 //===------------------------------------------------------------------===//
42 // XRay-specific lowering for Mips.
43 void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr &MI);
44 void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr &MI);
45 void LowerPATCHABLE_TAIL_CALL(const MachineInstr &MI);
46 // Helper function that emits the XRay sleds we've collected for a particular
51 void EmitSled(const MachineInstr &MI, SledKind Kind);
53 // tblgen'erated function.
54 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
55 const MachineInstr *MI);
57 // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
58 // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
60 void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
61 const MachineInstr *MI);
63 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
64 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
66 /// MCP - Keep a pointer to constantpool entries of the current
68 const MachineConstantPool *MCP;
70 /// InConstantPool - Maintain state when emitting a sequence of constant
71 /// pool entries so we can properly mark them as data regions.
74 std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *>
77 void emitInlineAsmStart() const override;
79 void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
80 const MCSubtargetInfo *EndInfo) const override;
82 void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
84 void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
86 void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
87 unsigned Reg1, unsigned Reg2);
89 void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
90 unsigned Reg1, unsigned Reg2, unsigned Reg3);
92 void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
93 unsigned Reg1, unsigned Reg2, unsigned FPReg1,
94 unsigned FPReg2, bool LE);
96 void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
97 Mips16HardFloatInfo::FPParamVariant, bool LE,
100 void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
101 Mips16HardFloatInfo::FPReturnVariant, bool LE);
103 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
105 void NaClAlignIndirectJumpTargets(MachineFunction &MF);
107 bool isLongBranchPseudo(int Opcode) const;
111 const MipsSubtarget *Subtarget;
112 const MipsFunctionInfo *MipsFI;
113 MipsMCInstLower MCInstLowering;
115 explicit MipsAsmPrinter(TargetMachine &TM,
116 std::unique_ptr<MCStreamer> Streamer)
117 : AsmPrinter(TM, std::move(Streamer)), MCP(nullptr),
118 InConstantPool(false), MCInstLowering(*this) {}
120 StringRef getPassName() const override { return "Mips Assembly Printer"; }
122 bool runOnMachineFunction(MachineFunction &MF) override;
124 void EmitConstantPool() override {
125 bool UsingConstantPools =
126 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
127 if (!UsingConstantPools)
128 AsmPrinter::EmitConstantPool();
129 // we emit constant pools customly!
132 void EmitInstruction(const MachineInstr *MI) override;
133 void printSavedRegsBitmask();
134 void emitFrameDirective();
135 const char *getCurrentABIString() const;
136 void EmitFunctionEntryLabel() override;
137 void EmitFunctionBodyStart() override;
138 void EmitFunctionBodyEnd() override;
139 void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
140 bool isBlockOnlyReachableByFallthrough(
141 const MachineBasicBlock* MBB) const override;
142 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
143 unsigned AsmVariant, const char *ExtraCode,
144 raw_ostream &O) override;
145 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
146 unsigned AsmVariant, const char *ExtraCode,
147 raw_ostream &O) override;
148 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
149 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
150 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
151 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
152 const char *Modifier = nullptr);
153 void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O);
154 void EmitStartOfAsmFile(Module &M) override;
155 void EmitEndOfAsmFile(Module &M) override;
156 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
157 void EmitDebugThreadLocal(const MCExpr *Value, unsigned Size) const override;