MipsAsmPrinter.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
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 MIPSASMPRINTER_H 15#define MIPSASMPRINTER_H 16 17#include "Mips16HardFloatInfo.h" 18#include "MipsMCInstLower.h" 19#include "MipsMachineFunction.h" 20#include "MipsSubtarget.h" 21#include "llvm/CodeGen/AsmPrinter.h" 22#include "llvm/Support/Compiler.h" 23#include "llvm/Target/TargetMachine.h" 24 25namespace llvm { 26class MCStreamer; 27class MachineInstr; 28class MachineBasicBlock; 29class MipsTargetStreamer; 30class Module; 31class raw_ostream; 32 33class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { 34 MipsTargetStreamer &getTargetStreamer(); 35 36 void EmitInstrWithMacroNoAT(const MachineInstr *MI); 37 38private: 39 // tblgen'erated function. 40 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 41 const MachineInstr *MI); 42 43 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. 44 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); 45 46 /// MCP - Keep a pointer to constantpool entries of the current 47 /// MachineFunction. 48 const MachineConstantPool *MCP; 49 50 /// InConstantPool - Maintain state when emitting a sequence of constant 51 /// pool entries so we can properly mark them as data regions. 52 bool InConstantPool; 53 54 std::map<const char *, const llvm::Mips16HardFloatInfo::FuncSignature *> 55 StubsNeeded; 56 57 void EmitJal(MCSymbol *Symbol); 58 59 void EmitInstrReg(unsigned Opcode, unsigned Reg); 60 61 void EmitInstrRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2); 62 63 void EmitInstrRegRegReg(unsigned Opcode, unsigned Reg1, unsigned Reg2, 64 unsigned Reg3); 65 66 void EmitMovFPIntPair(unsigned MovOpc, unsigned Reg1, unsigned Reg2, 67 unsigned FPReg1, unsigned FPReg2, bool LE); 68 69 void EmitSwapFPIntParams(Mips16HardFloatInfo::FPParamVariant, bool LE, 70 bool ToFP); 71 72 void EmitSwapFPIntRetval(Mips16HardFloatInfo::FPReturnVariant, bool LE); 73 74 void EmitFPCallStub(const char *, const Mips16HardFloatInfo::FuncSignature *); 75 76 void NaClAlignIndirectJumpTargets(MachineFunction &MF); 77 78 bool isLongBranchPseudo(int Opcode) const; 79 80public: 81 82 const MipsSubtarget *Subtarget; 83 const MipsFunctionInfo *MipsFI; 84 MipsMCInstLower MCInstLowering; 85 86 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 87 : AsmPrinter(TM, Streamer), MCP(nullptr), InConstantPool(false), 88 MCInstLowering(*this) { 89 Subtarget = &TM.getSubtarget<MipsSubtarget>(); 90 } 91 92 const char *getPassName() const override { 93 return "Mips Assembly Printer"; 94 } 95 96 bool runOnMachineFunction(MachineFunction &MF) override; 97 98 void EmitConstantPool() override { 99 bool UsingConstantPools = 100 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands()); 101 if (!UsingConstantPools) 102 AsmPrinter::EmitConstantPool(); 103 // we emit constant pools customly! 104 } 105 106 void EmitInstruction(const MachineInstr *MI) override; 107 void printSavedRegsBitmask(); 108 void emitFrameDirective(); 109 const char *getCurrentABIString() const; 110 void EmitFunctionEntryLabel() override; 111 void EmitFunctionBodyStart() override; 112 void EmitFunctionBodyEnd() override; 113 bool isBlockOnlyReachableByFallthrough( 114 const MachineBasicBlock* MBB) const override; 115 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 116 unsigned AsmVariant, const char *ExtraCode, 117 raw_ostream &O) override; 118 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 119 unsigned AsmVariant, const char *ExtraCode, 120 raw_ostream &O) override; 121 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 122 void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O); 123 void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O); 124 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 125 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O); 126 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, 127 const char *Modifier = nullptr); 128 void EmitStartOfAsmFile(Module &M) override; 129 void EmitEndOfAsmFile(Module &M) override; 130 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 131}; 132} 133 134#endif 135 136