MipsAsmPrinter.h revision cb2280e4c7c5a07104306cc73265ff64fa8dd973
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 "MipsMCInstLower.h" 18#include "MipsMachineFunction.h" 19#include "MipsSubtarget.h" 20#include "llvm/CodeGen/AsmPrinter.h" 21#include "llvm/Support/Compiler.h" 22#include "llvm/Target/TargetMachine.h" 23 24namespace llvm { 25class MCStreamer; 26class MachineInstr; 27class MachineBasicBlock; 28class MipsTargetStreamer; 29class Module; 30class raw_ostream; 31 32class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { 33 MipsTargetStreamer &getTargetStreamer(); 34 35 void EmitInstrWithMacroNoAT(const MachineInstr *MI); 36 37private: 38 // tblgen'erated function. 39 bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 40 const MachineInstr *MI); 41 42 // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. 43 bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); 44 45 /// MCP - Keep a pointer to constantpool entries of the current 46 /// MachineFunction. 47 const MachineConstantPool *MCP; 48 49 /// InConstantPool - Maintain state when emitting a sequence of constant 50 /// pool entries so we can properly mark them as data regions. 51 bool InConstantPool; 52 53 bool UsingConstantPools; 54 55public: 56 57 const MipsSubtarget *Subtarget; 58 const MipsFunctionInfo *MipsFI; 59 MipsMCInstLower MCInstLowering; 60 61 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 62 : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false), 63 MCInstLowering(*this) { 64 Subtarget = &TM.getSubtarget<MipsSubtarget>(); 65 UsingConstantPools = 66 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands()); 67 } 68 69 virtual const char *getPassName() const { 70 return "Mips Assembly Printer"; 71 } 72 73 virtual bool runOnMachineFunction(MachineFunction &MF); 74 75 virtual void EmitConstantPool() LLVM_OVERRIDE { 76 if (!UsingConstantPools) 77 AsmPrinter::EmitConstantPool(); 78 // we emit constant pools customly! 79 } 80 81 void EmitInstruction(const MachineInstr *MI); 82 void printSavedRegsBitmask(raw_ostream &O); 83 void printHex32(unsigned int Value, raw_ostream &O); 84 void emitFrameDirective(); 85 const char *getCurrentABIString() const; 86 virtual void EmitFunctionEntryLabel(); 87 virtual void EmitFunctionBodyStart(); 88 virtual void EmitFunctionBodyEnd(); 89 virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock* 90 MBB) const; 91 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 92 unsigned AsmVariant, const char *ExtraCode, 93 raw_ostream &O); 94 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 95 unsigned AsmVariant, const char *ExtraCode, 96 raw_ostream &O); 97 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 98 void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O); 99 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 100 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O); 101 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, 102 const char *Modifier = 0); 103 void EmitStartOfAsmFile(Module &M); 104 void EmitEndOfAsmFile(Module &M); 105 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 106}; 107} 108 109#endif 110 111