• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- C++ -*--===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // Mips Assembly printer class.
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
15 #define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
16 
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"
23 #include <algorithm>
24 #include <map>
25 #include <memory>
26 
27 namespace llvm {
28 
29 class MCOperand;
30 class MCSubtargetInfo;
31 class MCSymbol;
32 class MachineBasicBlock;
33 class MachineConstantPool;
34 class MachineFunction;
35 class MachineInstr;
36 class MachineOperand;
37 class MipsFunctionInfo;
38 class MipsTargetStreamer;
39 class Module;
40 class raw_ostream;
41 class TargetMachine;
42 
43 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
44   MipsTargetStreamer &getTargetStreamer() const;
45 
46   void EmitInstrWithMacroNoAT(const MachineInstr *MI);
47 
48   //===------------------------------------------------------------------===//
49   // XRay implementation
50   //===------------------------------------------------------------------===//
51 
52 public:
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);
57 
58 private:
59   /// MCP - Keep a pointer to constantpool entries of the current
60   /// MachineFunction.
61   const MachineConstantPool *MCP = nullptr;
62 
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;
66 
67   std::map<const char *, const Mips16HardFloatInfo::FuncSignature *>
68       StubsNeeded;
69 
70   void EmitSled(const MachineInstr &MI, SledKind Kind);
71 
72   // tblgen'erated function.
73   bool emitPseudoExpansionLowering(MCStreamer &OutStreamer,
74                                    const MachineInstr *MI);
75 
76   // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,
77   // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate
78   // for the target.
79   void emitPseudoIndirectBranch(MCStreamer &OutStreamer,
80                                 const MachineInstr *MI);
81 
82   // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.
83   bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);
84 
85   void emitInlineAsmStart() const override;
86 
87   void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,
88                         const MCSubtargetInfo *EndInfo) const override;
89 
90   void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);
91 
92   void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);
93 
94   void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
95                        unsigned Reg1, unsigned Reg2);
96 
97   void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,
98                           unsigned Reg1, unsigned Reg2, unsigned Reg3);
99 
100   void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,
101                         unsigned Reg1, unsigned Reg2, unsigned FPReg1,
102                         unsigned FPReg2, bool LE);
103 
104   void EmitSwapFPIntParams(const MCSubtargetInfo &STI,
105                            Mips16HardFloatInfo::FPParamVariant, bool LE,
106                            bool ToFP);
107 
108   void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,
109                            Mips16HardFloatInfo::FPReturnVariant, bool LE);
110 
111   void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);
112 
113   void NaClAlignIndirectJumpTargets(MachineFunction &MF);
114 
115   bool isLongBranchPseudo(int Opcode) const;
116 
117 public:
118   const MipsSubtarget *Subtarget;
119   const MipsFunctionInfo *MipsFI;
120   MipsMCInstLower MCInstLowering;
121 
MipsAsmPrinter(TargetMachine & TM,std::unique_ptr<MCStreamer> Streamer)122   explicit MipsAsmPrinter(TargetMachine &TM,
123                           std::unique_ptr<MCStreamer> Streamer)
124       : AsmPrinter(TM, std::move(Streamer)), MCInstLowering(*this) {}
125 
getPassName()126   StringRef getPassName() const override { return "Mips Assembly Printer"; }
127 
128   bool runOnMachineFunction(MachineFunction &MF) override;
129 
EmitConstantPool()130   void EmitConstantPool() override {
131     bool UsingConstantPools =
132       (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
133     if (!UsingConstantPools)
134       AsmPrinter::EmitConstantPool();
135     // we emit constant pools customly!
136   }
137 
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;
164 };
165 
166 } // end namespace llvm
167 
168 #endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H
169