brintos

brintos / llvm-project-archived public Read only

0
0
Text · 5.9 KiB · 8b2fb32 Raw
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