1 //===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- C++ -*--===//
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
7 //===----------------------------------------------------------------------===//
9 // Mips Assembly printer class.
11 //===----------------------------------------------------------------------===//
13 #ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
14 #define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
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"
29 class MCSubtargetInfo
;
31 class MachineBasicBlock
;
32 class MachineConstantPool
;
33 class MachineFunction
;
36 class MipsFunctionInfo
;
37 class MipsTargetStreamer
;
42 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter
: public AsmPrinter
{
43 MipsTargetStreamer
&getTargetStreamer() const;
45 void EmitInstrWithMacroNoAT(const MachineInstr
*MI
);
47 //===------------------------------------------------------------------===//
48 // XRay implementation
49 //===------------------------------------------------------------------===//
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
);
58 /// MCP - Keep a pointer to constantpool entries of the current
60 const MachineConstantPool
*MCP
= nullptr;
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;
66 std::map
<const char *, const Mips16HardFloatInfo::FuncSignature
*>
69 void EmitSled(const MachineInstr
&MI
, SledKind Kind
);
71 // tblgen'erated function.
72 bool emitPseudoExpansionLowering(MCStreamer
&OutStreamer
,
73 const MachineInstr
*MI
);
75 // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
76 // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
78 void emitPseudoIndirectBranch(MCStreamer
&OutStreamer
,
79 const MachineInstr
*MI
);
81 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
82 bool lowerOperand(const MachineOperand
&MO
, MCOperand
&MCOp
);
84 void emitInlineAsmStart() const override
;
86 void emitInlineAsmEnd(const MCSubtargetInfo
&StartInfo
,
87 const MCSubtargetInfo
*EndInfo
) const override
;
89 void EmitJal(const MCSubtargetInfo
&STI
, MCSymbol
*Symbol
);
91 void EmitInstrReg(const MCSubtargetInfo
&STI
, unsigned Opcode
, unsigned Reg
);
93 void EmitInstrRegReg(const MCSubtargetInfo
&STI
, unsigned Opcode
,
94 unsigned Reg1
, unsigned Reg2
);
96 void EmitInstrRegRegReg(const MCSubtargetInfo
&STI
, unsigned Opcode
,
97 unsigned Reg1
, unsigned Reg2
, unsigned Reg3
);
99 void EmitMovFPIntPair(const MCSubtargetInfo
&STI
, unsigned MovOpc
,
100 unsigned Reg1
, unsigned Reg2
, unsigned FPReg1
,
101 unsigned FPReg2
, bool LE
);
103 void EmitSwapFPIntParams(const MCSubtargetInfo
&STI
,
104 Mips16HardFloatInfo::FPParamVariant
, bool LE
,
107 void EmitSwapFPIntRetval(const MCSubtargetInfo
&STI
,
108 Mips16HardFloatInfo::FPReturnVariant
, bool LE
);
110 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature
*);
112 void NaClAlignIndirectJumpTargets(MachineFunction
&MF
);
114 bool isLongBranchPseudo(int Opcode
) const;
117 const MipsSubtarget
*Subtarget
;
118 const MipsFunctionInfo
*MipsFI
;
119 MipsMCInstLower MCInstLowering
;
121 explicit MipsAsmPrinter(TargetMachine
&TM
,
122 std::unique_ptr
<MCStreamer
> Streamer
)
123 : AsmPrinter(TM
, std::move(Streamer
)), MCInstLowering(*this) {}
125 StringRef
getPassName() const override
{ return "Mips Assembly Printer"; }
127 bool runOnMachineFunction(MachineFunction
&MF
) override
;
129 void EmitConstantPool() override
{
130 bool UsingConstantPools
=
131 (Subtarget
->inMips16Mode() && Subtarget
->useConstantIslands());
132 if (!UsingConstantPools
)
133 AsmPrinter::EmitConstantPool();
134 // we emit constant pools customly!
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
;
163 } // end namespace llvm
165 #endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H