blob: 89d123920a02220896093e905e67318e1b286aa2 [file] [log] [blame]
Eugene Zelenko79220eae2017-08-03 22:12:30 +00001//===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- C++ -*--===//
Akira Hatanakaddd12652011-07-07 20:10:52 +00002//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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
Akira Hatanakaddd12652011-07-07 20:10:52 +00006//
7//===----------------------------------------------------------------------===//
8//
9// Mips Assembly printer class.
10//
11//===----------------------------------------------------------------------===//
12
Benjamin Kramera7c40ef2014-08-13 16:26:38 +000013#ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
14#define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
Akira Hatanakaddd12652011-07-07 20:10:52 +000015
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000016#include "Mips16HardFloatInfo.h"
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000017#include "MipsMCInstLower.h"
Akira Hatanakaddd12652011-07-07 20:10:52 +000018#include "MipsSubtarget.h"
19#include "llvm/CodeGen/AsmPrinter.h"
Eugene Zelenko79220eae2017-08-03 22:12:30 +000020#include "llvm/MC/MCStreamer.h"
Akira Hatanakaddd12652011-07-07 20:10:52 +000021#include "llvm/Support/Compiler.h"
Eugene Zelenko79220eae2017-08-03 22:12:30 +000022#include <algorithm>
23#include <map>
24#include <memory>
Akira Hatanakaddd12652011-07-07 20:10:52 +000025
26namespace llvm {
Eugene Zelenko79220eae2017-08-03 22:12:30 +000027
28class MCOperand;
29class MCSubtargetInfo;
30class MCSymbol;
Akira Hatanakaddd12652011-07-07 20:10:52 +000031class MachineBasicBlock;
Eugene Zelenko79220eae2017-08-03 22:12:30 +000032class MachineConstantPool;
33class MachineFunction;
34class MachineInstr;
35class MachineOperand;
36class MipsFunctionInfo;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000037class MipsTargetStreamer;
Akira Hatanakaddd12652011-07-07 20:10:52 +000038class Module;
Craig Topperb25fda92012-03-17 18:46:09 +000039class raw_ostream;
Eugene Zelenko79220eae2017-08-03 22:12:30 +000040class TargetMachine;
Akira Hatanakaddd12652011-07-07 20:10:52 +000041
42class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
Toma Tabacua23f13c2014-12-17 10:56:16 +000043 MipsTargetStreamer &getTargetStreamer() const;
Akira Hatanaka049e9e42011-11-23 22:19:28 +000044
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000045 void EmitInstrWithMacroNoAT(const MachineInstr *MI);
46
Sagar Thakurec657922017-02-15 10:48:11 +000047 //===------------------------------------------------------------------===//
48 // XRay implementation
49 //===------------------------------------------------------------------===//
Eugene Zelenko79220eae2017-08-03 22:12:30 +000050
Sagar Thakurec657922017-02-15 10:48:11 +000051public:
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);
Sagar Thakurec657922017-02-15 10:48:11 +000056
Akira Hatanaka42a35242012-09-27 01:59:07 +000057private:
Eugene Zelenko79220eae2017-08-03 22:12:30 +000058 /// 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
Sagar Thakurec657922017-02-15 10:48:11 +000069 void EmitSled(const MachineInstr &MI, SledKind Kind);
70
Akira Hatanaka42a35242012-09-27 01:59:07 +000071 // tblgen'erated function.
72 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
73 const MachineInstr *MI);
74
Daniel Sandersf5a5fbd2014-07-09 10:21:59 +000075 // 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);
Daniel Sanders338513b2014-07-09 10:16:07 +000080
Akira Hatanaka42a35242012-09-27 01:59:07 +000081 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
82 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
83
Eric Christopher64d35be2015-02-19 19:52:25 +000084 void emitInlineAsmStart() const override;
Toma Tabacua23f13c2014-12-17 10:56:16 +000085
86 void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
87 const MCSubtargetInfo *EndInfo) const override;
88
Eric Christopher327fc972015-02-21 08:48:22 +000089 void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000090
Eric Christopher327fc972015-02-21 08:48:22 +000091 void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000092
Eric Christopher327fc972015-02-21 08:48:22 +000093 void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
94 unsigned Reg1, unsigned Reg2);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000095
Eric Christopher327fc972015-02-21 08:48:22 +000096 void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
97 unsigned Reg1, unsigned Reg2, unsigned Reg3);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +000098
Eric Christopher327fc972015-02-21 08:48:22 +000099 void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
100 unsigned Reg1, unsigned Reg2, unsigned FPReg1,
101 unsigned FPReg2, bool LE);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +0000102
Eric Christopher327fc972015-02-21 08:48:22 +0000103 void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
104 Mips16HardFloatInfo::FPParamVariant, bool LE,
Reed Kotler4cdaa7d2014-02-14 19:16:39 +0000105 bool ToFP);
106
Eric Christopher327fc972015-02-21 08:48:22 +0000107 void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
108 Mips16HardFloatInfo::FPReturnVariant, bool LE);
Reed Kotler4cdaa7d2014-02-14 19:16:39 +0000109
110 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
Reed Kotler91ae9822013-10-27 21:57:36 +0000111
Sasa Stankovic8c5736b2014-02-28 10:00:38 +0000112 void NaClAlignIndirectJumpTargets(MachineFunction &MF);
113
Sasa Stankovic7b061a42014-04-30 15:06:25 +0000114 bool isLongBranchPseudo(int Opcode) const;
115
Akira Hatanakaddd12652011-07-07 20:10:52 +0000116public:
Akira Hatanaka049e9e42011-11-23 22:19:28 +0000117 const MipsSubtarget *Subtarget;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +0000118 const MipsFunctionInfo *MipsFI;
119 MipsMCInstLower MCInstLowering;
Akira Hatanaka049e9e42011-11-23 22:19:28 +0000120
David Blaikie94598322015-01-18 20:29:04 +0000121 explicit MipsAsmPrinter(TargetMachine &TM,
122 std::unique_ptr<MCStreamer> Streamer)
Eugene Zelenko79220eae2017-08-03 22:12:30 +0000123 : AsmPrinter(TM, std::move(Streamer)), MCInstLowering(*this) {}
Akira Hatanakaddd12652011-07-07 20:10:52 +0000124
Mehdi Amini117296c2016-10-01 02:56:57 +0000125 StringRef getPassName() const override { return "Mips Assembly Printer"; }
Akira Hatanakaddd12652011-07-07 20:10:52 +0000126
Craig Topper56c590a2014-04-29 07:58:02 +0000127 bool runOnMachineFunction(MachineFunction &MF) override;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +0000128
Craig Topper56c590a2014-04-29 07:58:02 +0000129 void EmitConstantPool() override {
Reed Kotler3aeb1d02013-11-26 20:38:40 +0000130 bool UsingConstantPools =
131 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
Reed Kotler91ae9822013-10-27 21:57:36 +0000132 if (!UsingConstantPools)
133 AsmPrinter::EmitConstantPool();
134 // we emit constant pools customly!
135 }
136
Craig Topper56c590a2014-04-29 07:58:02 +0000137 void EmitInstruction(const MachineInstr *MI) override;
Rafael Espindola25fa2912014-01-27 04:33:11 +0000138 void printSavedRegsBitmask();
Akira Hatanakaddd12652011-07-07 20:10:52 +0000139 void emitFrameDirective();
140 const char *getCurrentABIString() const;
Craig Topper56c590a2014-04-29 07:58:02 +0000141 void EmitFunctionEntryLabel() override;
142 void EmitFunctionBodyStart() override;
143 void EmitFunctionBodyEnd() override;
Vasileios Kalintiris42544d62015-05-08 09:10:15 +0000144 void EmitBasicBlockEnd(const MachineBasicBlock &MBB) override;
Craig Topper56c590a2014-04-29 07:58:02 +0000145 bool isBlockOnlyReachableByFallthrough(
146 const MachineBasicBlock* MBB) const override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000147 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
148 unsigned AsmVariant, const char *ExtraCode,
Craig Topper56c590a2014-04-29 07:58:02 +0000149 raw_ostream &O) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000150 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
151 unsigned AsmVariant, const char *ExtraCode,
Craig Topper56c590a2014-04-29 07:58:02 +0000152 raw_ostream &O) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000153 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanaka9f6f6f62011-07-07 20:54:20 +0000154 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
155 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
Simon Dardisba92b032016-09-09 11:06:01 +0000156 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
157 const char *Modifier = nullptr);
Zoran Jovanovica4c4b5f2014-11-19 16:44:02 +0000158 void printRegisterList(const MachineInstr *MI, int opNum, raw_ostream &O);
Craig Topper56c590a2014-04-29 07:58:02 +0000159 void EmitStartOfAsmFile(Module &M) override;
160 void EmitEndOfAsmFile(Module &M) override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000161 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
Simon Atanasyanaf860d42018-11-28 11:48:07 +0000162 void EmitDebugValue(const MCExpr *Value, unsigned Size) const override;
Akira Hatanakaddd12652011-07-07 20:10:52 +0000163};
Akira Hatanakaddd12652011-07-07 20:10:52 +0000164
Eugene Zelenko79220eae2017-08-03 22:12:30 +0000165} // end namespace llvm
Akira Hatanakaddd12652011-07-07 20:10:52 +0000166
Eugene Zelenko79220eae2017-08-03 22:12:30 +0000167#endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H