166 lines · c
1//===- MipsAsmPrinter.h - Mips LLVM Assembly Printer -----------*- C++ -*--===//2//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-exception6//7//===----------------------------------------------------------------------===//8//9// Mips Assembly printer class.10//11//===----------------------------------------------------------------------===//12 13#ifndef LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H14#define LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H15 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"22#include <algorithm>23#include <map>24#include <memory>25 26namespace llvm {27 28class MCOperand;29class MCSubtargetInfo;30class MCSymbol;31class MachineBasicBlock;32class MachineConstantPool;33class MachineFunction;34class MachineInstr;35class MachineOperand;36class MipsFunctionInfo;37class MipsTargetStreamer;38class Module;39class raw_ostream;40class TargetMachine;41 42class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {43 MipsTargetStreamer &getTargetStreamer() const;44 45 void EmitInstrWithMacroNoAT(const MachineInstr *MI);46 47 //===------------------------------------------------------------------===//48 // XRay implementation49 //===------------------------------------------------------------------===//50 51public: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);56 57private:58 /// MCP - Keep a pointer to constantpool entries of the current59 /// MachineFunction.60 const MachineConstantPool *MCP = nullptr;61 62 /// InConstantPool - Maintain state when emitting a sequence of constant63 /// 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 69 void EmitSled(const MachineInstr &MI, SledKind Kind);70 71 // tblgen'erated function.72 bool lowerPseudoInstExpansion(const MachineInstr *MI, MCInst &Inst);73 74 // Emit PseudoReturn, PseudoReturn64, PseudoIndirectBranch,75 // and PseudoIndirectBranch64 as a JR, JR_MM, JALR, or JALR64 as appropriate76 // for the target.77 void emitPseudoIndirectBranch(MCStreamer &OutStreamer,78 const MachineInstr *MI);79 80 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand.81 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp);82 83 void emitInlineAsmStart() const override;84 85 void emitInlineAsmEnd(const MCSubtargetInfo &StartInfo,86 const MCSubtargetInfo *EndInfo) const override;87 88 void emitJumpTableEntry(const MachineJumpTableInfo &MJTI,89 const MachineBasicBlock *MBB,90 unsigned uid) const override;91 92 void EmitJal(const MCSubtargetInfo &STI, MCSymbol *Symbol);93 94 void EmitInstrReg(const MCSubtargetInfo &STI, unsigned Opcode, unsigned Reg);95 96 void EmitInstrRegReg(const MCSubtargetInfo &STI, unsigned Opcode,97 unsigned Reg1, unsigned Reg2);98 99 void EmitInstrRegRegReg(const MCSubtargetInfo &STI, unsigned Opcode,100 unsigned Reg1, unsigned Reg2, unsigned Reg3);101 102 void EmitMovFPIntPair(const MCSubtargetInfo &STI, unsigned MovOpc,103 unsigned Reg1, unsigned Reg2, unsigned FPReg1,104 unsigned FPReg2, bool LE);105 106 void EmitSwapFPIntParams(const MCSubtargetInfo &STI,107 Mips16HardFloatInfo::FPParamVariant, bool LE,108 bool ToFP);109 110 void EmitSwapFPIntRetval(const MCSubtargetInfo &STI,111 Mips16HardFloatInfo::FPReturnVariant, bool LE);112 113 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *);114 115 bool isLongBranchPseudo(int Opcode) const;116 117public:118 static char ID;119 120 const MipsSubtarget *Subtarget;121 const MipsFunctionInfo *MipsFI;122 MipsMCInstLower MCInstLowering;123 124 explicit MipsAsmPrinter(TargetMachine &TM,125 std::unique_ptr<MCStreamer> Streamer)126 : AsmPrinter(TM, std::move(Streamer), ID), MCInstLowering(*this) {}127 128 StringRef getPassName() const override { return "Mips Assembly Printer"; }129 130 bool runOnMachineFunction(MachineFunction &MF) override;131 132 void emitConstantPool() override {133 bool UsingConstantPools =134 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());135 if (!UsingConstantPools)136 AsmPrinter::emitConstantPool();137 // we emit constant pools customly!138 }139 140 void emitInstruction(const MachineInstr *MI) override;141 void printSavedRegsBitmask();142 void emitFrameDirective();143 const char *getCurrentABIString() const;144 void emitFunctionEntryLabel() override;145 void emitFunctionBodyStart() override;146 void emitFunctionBodyEnd() override;147 void emitBasicBlockEnd(const MachineBasicBlock &MBB) override;148 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,149 const char *ExtraCode, raw_ostream &O) override;150 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,151 const char *ExtraCode, raw_ostream &O) override;152 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);153 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);154 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);155 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O);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;161};162 163} // end namespace llvm164 165#endif // LLVM_LIB_TARGET_MIPS_MIPSASMPRINTER_H166