1234353Sdim//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===// 2224133Sdim// 3224133Sdim// The LLVM Compiler Infrastructure 4224133Sdim// 5224133Sdim// This file is distributed under the University of Illinois Open Source 6224133Sdim// License. See LICENSE.TXT for details. 7224133Sdim// 8224133Sdim//===----------------------------------------------------------------------===// 9224133Sdim// 10224133Sdim// Mips Assembly printer class. 11224133Sdim// 12224133Sdim//===----------------------------------------------------------------------===// 13224133Sdim 14224133Sdim#ifndef MIPSASMPRINTER_H 15224133Sdim#define MIPSASMPRINTER_H 16224133Sdim 17249423Sdim#include "MipsMCInstLower.h" 18234353Sdim#include "MipsMachineFunction.h" 19224133Sdim#include "MipsSubtarget.h" 20224133Sdim#include "llvm/CodeGen/AsmPrinter.h" 21224133Sdim#include "llvm/Support/Compiler.h" 22224133Sdim#include "llvm/Target/TargetMachine.h" 23224133Sdim 24224133Sdimnamespace llvm { 25224133Sdimclass MCStreamer; 26224133Sdimclass MachineInstr; 27224133Sdimclass MachineBasicBlock; 28263508Sdimclass MipsTargetStreamer; 29224133Sdimclass Module; 30234353Sdimclass raw_ostream; 31224133Sdim 32224133Sdimclass LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { 33263508Sdim MipsTargetStreamer &getTargetStreamer(); 34234353Sdim 35234353Sdim void EmitInstrWithMacroNoAT(const MachineInstr *MI); 36234353Sdim 37243830Sdimprivate: 38243830Sdim // tblgen'erated function. 39243830Sdim bool emitPseudoExpansionLowering(MCStreamer &OutStreamer, 40243830Sdim const MachineInstr *MI); 41243830Sdim 42243830Sdim // lowerOperand - Convert a MachineOperand into the equivalent MCOperand. 43243830Sdim bool lowerOperand(const MachineOperand &MO, MCOperand &MCOp); 44243830Sdim 45263508Sdim /// MCP - Keep a pointer to constantpool entries of the current 46263508Sdim /// MachineFunction. 47263508Sdim const MachineConstantPool *MCP; 48263508Sdim 49263508Sdim /// InConstantPool - Maintain state when emitting a sequence of constant 50263508Sdim /// pool entries so we can properly mark them as data regions. 51263508Sdim bool InConstantPool; 52263508Sdim 53263508Sdim bool UsingConstantPools; 54263508Sdim 55234353Sdimpublic: 56234353Sdim 57224133Sdim const MipsSubtarget *Subtarget; 58234353Sdim const MipsFunctionInfo *MipsFI; 59234353Sdim MipsMCInstLower MCInstLowering; 60234353Sdim 61224133Sdim explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 62263508Sdim : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false), 63263508Sdim MCInstLowering(*this) { 64224133Sdim Subtarget = &TM.getSubtarget<MipsSubtarget>(); 65263508Sdim UsingConstantPools = 66263508Sdim (Subtarget->inMips16Mode() && Subtarget->useConstantIslands()); 67224133Sdim } 68224133Sdim 69224133Sdim virtual const char *getPassName() const { 70224133Sdim return "Mips Assembly Printer"; 71224133Sdim } 72224133Sdim 73234353Sdim virtual bool runOnMachineFunction(MachineFunction &MF); 74234353Sdim 75263508Sdim virtual void EmitConstantPool() LLVM_OVERRIDE { 76263508Sdim if (!UsingConstantPools) 77263508Sdim AsmPrinter::EmitConstantPool(); 78263508Sdim // we emit constant pools customly! 79263508Sdim } 80263508Sdim 81224133Sdim void EmitInstruction(const MachineInstr *MI); 82224133Sdim void printSavedRegsBitmask(raw_ostream &O); 83224133Sdim void printHex32(unsigned int Value, raw_ostream &O); 84224133Sdim void emitFrameDirective(); 85224133Sdim const char *getCurrentABIString() const; 86224133Sdim virtual void EmitFunctionEntryLabel(); 87224133Sdim virtual void EmitFunctionBodyStart(); 88224133Sdim virtual void EmitFunctionBodyEnd(); 89224133Sdim virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock* 90224133Sdim MBB) const; 91224133Sdim bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 92224133Sdim unsigned AsmVariant, const char *ExtraCode, 93224133Sdim raw_ostream &O); 94224133Sdim bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 95224133Sdim unsigned AsmVariant, const char *ExtraCode, 96224133Sdim raw_ostream &O); 97224133Sdim void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 98224133Sdim void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O); 99263508Sdim void printUnsignedImm8(const MachineInstr *MI, int opNum, raw_ostream &O); 100224133Sdim void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 101224133Sdim void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O); 102224133Sdim void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, 103224133Sdim const char *Modifier = 0); 104224133Sdim void EmitStartOfAsmFile(Module &M); 105249423Sdim void EmitEndOfAsmFile(Module &M); 106224133Sdim void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 107224133Sdim}; 108224133Sdim} 109224133Sdim 110224133Sdim#endif 111224133Sdim 112