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 "MipsSubtarget.h"
20 #include "llvm/CodeGen/AsmPrinter.h"
21 #include "llvm/MC/MCStreamer.h"
22 #include "llvm/Support/Compiler.h"
30 class MCSubtargetInfo
;
32 class MachineBasicBlock
;
33 class MachineConstantPool
;
34 class MachineFunction
;
37 class MipsFunctionInfo
;
38 class MipsTargetStreamer
;
43 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter
: public AsmPrinter
{
44 MipsTargetStreamer
&getTargetStreamer() const;
46 void EmitInstrWithMacroNoAT(const MachineInstr
*MI
);
48 //===------------------------------------------------------------------===//
49 // XRay implementation
50 //===------------------------------------------------------------------===//
53 // XRay-specific lowering for Mips.
54 void LowerPATCHABLE_FUNCTION_ENTER(const MachineInstr
&MI
);
55 void LowerPATCHABLE_FUNCTION_EXIT(const MachineInstr
&MI
);
56 void LowerPATCHABLE_TAIL_CALL(const MachineInstr
&MI
);
59 /// MCP - Keep a pointer to constantpool entries of the current
61 const MachineConstantPool
*MCP
= nullptr;
63 /// InConstantPool - Maintain state when emitting a sequence of constant
64 /// pool entries so we can properly mark them as data regions.
65 bool InConstantPool
= false;
67 std::map
<const char *, const Mips16HardFloatInfo::FuncSignature
*>
70 void EmitSled(const MachineInstr
&MI
, SledKind Kind
);
72 // tblgen'erated function.
73 bool emitPseudoExpansionLowering(MCStreamer
&OutStreamer
,
74 const MachineInstr
*MI
);
76 // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
77 // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
79 void emitPseudoIndirectBranch(MCStreamer
&OutStreamer
,
80 const MachineInstr
*MI
);
82 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
83 bool lowerOperand(const MachineOperand
&MO
, MCOperand
&MCOp
);
85 void emitInlineAsmStart() const override
;
87 void emitInlineAsmEnd(const MCSubtargetInfo
&StartInfo
,
88 const MCSubtargetInfo
*EndInfo
) const override
;
90 void EmitJal(const MCSubtargetInfo
&STI
, MCSymbol
*Symbol
);
92 void EmitInstrReg(const MCSubtargetInfo
&STI
, unsigned Opcode
, unsigned Reg
);
94 void EmitInstrRegReg(const MCSubtargetInfo
&STI
, unsigned Opcode
,
95 unsigned Reg1
, unsigned Reg2
);
97 void EmitInstrRegRegReg(const MCSubtargetInfo
&STI
, unsigned Opcode
,
98 unsigned Reg1
, unsigned Reg2
, unsigned Reg3
);
100 void EmitMovFPIntPair(const MCSubtargetInfo
&STI
, unsigned MovOpc
,
101 unsigned Reg1
, unsigned Reg2
, unsigned FPReg1
,
102 unsigned FPReg2
, bool LE
);
104 void EmitSwapFPIntParams(const MCSubtargetInfo
&STI
,
105 Mips16HardFloatInfo::FPParamVariant
, bool LE
,
108 void EmitSwapFPIntRetval(const MCSubtargetInfo
&STI
,
109 Mips16HardFloatInfo::FPReturnVariant
, bool LE
);
111 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature
*);
113 void NaClAlignIndirectJumpTargets(MachineFunction
&MF
);
115 bool isLongBranchPseudo(int Opcode
) const;
118 const MipsSubtarget
*Subtarget
;
119 const MipsFunctionInfo
*MipsFI
;
120 MipsMCInstLower MCInstLowering
;
122 explicit MipsAsmPrinter(TargetMachine
&TM
,
123 std::unique_ptr
<MCStreamer
> Streamer
)
124 : AsmPrinter(TM
, std::move(Streamer
)), MCInstLowering(*this) {}
126 StringRef
getPassName() const override
{ return "Mips Assembly Printer"; }
128 bool runOnMachineFunction(MachineFunction
&MF
) override
;
130 void EmitConstantPool() override
{
131 bool UsingConstantPools
=
132 (Subtarget
->inMips16Mode() && Subtarget
->useConstantIslands());
133 if (!UsingConstantPools
)
134 AsmPrinter::EmitConstantPool();
135 // we emit constant pools customly!
138 void EmitInstruction(const MachineInstr
*MI
) override
;
139 void printSavedRegsBitmask();
140 void emitFrameDirective();
141 const char *getCurrentABIString() const;
142 void EmitFunctionEntryLabel() override
;
143 void EmitFunctionBodyStart() override
;
144 void EmitFunctionBodyEnd() override
;
145 void EmitBasicBlockEnd(const MachineBasicBlock
&MBB
) override
;
146 bool isBlockOnlyReachableByFallthrough(
147 const MachineBasicBlock
* MBB
) const override
;
148 bool PrintAsmOperand(const MachineInstr
*MI
, unsigned OpNo
,
149 unsigned AsmVariant
, const char *ExtraCode
,
150 raw_ostream
&O
) override
;
151 bool PrintAsmMemoryOperand(const MachineInstr
*MI
, unsigned OpNum
,
152 unsigned AsmVariant
, const char *ExtraCode
,
153 raw_ostream
&O
) override
;
154 void printOperand(const MachineInstr
*MI
, int opNum
, raw_ostream
&O
);
155 void printMemOperand(const MachineInstr
*MI
, int opNum
, raw_ostream
&O
);
156 void printMemOperandEA(const MachineInstr
*MI
, int opNum
, raw_ostream
&O
);
157 void printFCCOperand(const MachineInstr
*MI
, int opNum
, raw_ostream
&O
,
158 const char *Modifier
= nullptr);
159 void printRegisterList(const MachineInstr
*MI
, int opNum
, raw_ostream
&O
);
160 void EmitStartOfAsmFile(Module
&M
) override
;
161 void EmitEndOfAsmFile(Module
&M
) override
;
162 void PrintDebugValueComment(const MachineInstr
*MI
, raw_ostream
&OS
);
163 void EmitDebugThreadLocal(const MCExpr
*Value
, unsigned Size
) const override
;
166 } // end namespace llvm
168 #endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H