18f5e8c1cd69fa77bea20140a7132ee2dea166c6dJia Liu//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===// 2aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// 3aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// The LLVM Compiler Infrastructure 4aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// 5aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// This file is distributed under the University of Illinois Open Source 6aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// License. See LICENSE.TXT for details. 7aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// 8aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//===----------------------------------------------------------------------===// 9aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// 10aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// Mips Assembly printer class. 11aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka// 12aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka//===----------------------------------------------------------------------===// 13aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 14aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#ifndef MIPSASMPRINTER_H 15aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#define MIPSASMPRINTER_H 16aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 17f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka#include "MipsMachineFunction.h" 18f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka#include "MipsMCInstLower.h" 19aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "MipsSubtarget.h" 20aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/CodeGen/AsmPrinter.h" 21aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Support/Compiler.h" 22aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#include "llvm/Target/TargetMachine.h" 23aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 24aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakanamespace llvm { 25aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MCStreamer; 26aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineInstr; 27aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass MachineBasicBlock; 28aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass Module; 2979aa3417eb6f58d668aadfedf075240a41d35a26Craig Topperclass raw_ostream; 30aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 31aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakaclass LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter { 32421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka 33f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka void EmitInstrWithMacroNoAT(const MachineInstr *MI); 34f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka 35aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanakapublic: 36421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka 37421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka const MipsSubtarget *Subtarget; 38f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka const MipsFunctionInfo *MipsFI; 39f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka MipsMCInstLower MCInstLowering; 40421455f1ea081e2e1767e782ac0d57ca55976e9bAkira Hatanaka 41aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer) 42f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka : AsmPrinter(TM, Streamer), MCInstLowering(*this) { 43aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka Subtarget = &TM.getSubtarget<MipsSubtarget>(); 44aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka } 45aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 46aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual const char *getPassName() const { 47aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka return "Mips Assembly Printer"; 48aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka } 49aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 50f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka virtual bool runOnMachineFunction(MachineFunction &MF); 51f93b86306683f8e860c8824efb717995cb072a70Akira Hatanaka 52aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void EmitInstruction(const MachineInstr *MI); 53aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void printSavedRegsBitmask(raw_ostream &O); 54aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void printHex32(unsigned int Value, raw_ostream &O); 55aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void emitFrameDirective(); 56aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka const char *getCurrentABIString() const; 57aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual void EmitFunctionEntryLabel(); 58aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual void EmitFunctionBodyStart(); 59aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual void EmitFunctionBodyEnd(); 60aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock* 61aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka MBB) const; 62aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo, 63aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka unsigned AsmVariant, const char *ExtraCode, 64aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka raw_ostream &O); 65aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum, 66aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka unsigned AsmVariant, const char *ExtraCode, 67aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka raw_ostream &O); 68aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 69aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O); 7003236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O); 7103236be44af1d98eb8daa57e8eb8b7bdd7884523Akira Hatanaka void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O); 72aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O, 73aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka const char *Modifier = 0); 74aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void EmitStartOfAsmFile(Module &M); 75aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const; 76aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS); 77aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka}; 78aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka} 79aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 80aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka#endif 81aa08ea0530a2baa7d1d74c492b1bd5af3518ad60Akira Hatanaka 82