blob: 5f6cac8f2112bdb2294232babd321cf0948646a0 [file] [log] [blame]
Jia Liudd6c1cd2012-02-17 01:23:50 +00001//===-- MipsAsmPrinter.h - Mips LLVM Assembly Printer ----------*- C++ -*--===//
Akira Hatanakaddd12652011-07-07 20:10:52 +00002//
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
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000017#include "MipsMCInstLower.h"
Chandler Carruth802d7552012-12-04 07:12:27 +000018#include "MipsMachineFunction.h"
Akira Hatanakaddd12652011-07-07 20:10:52 +000019#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;
Akira Hatanakaddd12652011-07-07 20:10:52 +000027class MachineBasicBlock;
Rafael Espindolaa17151a2013-10-08 13:08:17 +000028class MipsTargetStreamer;
Akira Hatanakaddd12652011-07-07 20:10:52 +000029class Module;
Craig Topperb25fda92012-03-17 18:46:09 +000030class raw_ostream;
Akira Hatanakaddd12652011-07-07 20:10:52 +000031
32class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
Rafael Espindolaa17151a2013-10-08 13:08:17 +000033 MipsTargetStreamer &getTargetStreamer();
Akira Hatanaka049e9e42011-11-23 22:19:28 +000034
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000035 void EmitInstrWithMacroNoAT(const MachineInstr *MI);
36
Akira Hatanaka42a35242012-09-27 01:59:07 +000037private:
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
Akira Hatanakaddd12652011-07-07 20:10:52 +000045public:
Akira Hatanaka049e9e42011-11-23 22:19:28 +000046
47 const MipsSubtarget *Subtarget;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000048 const MipsFunctionInfo *MipsFI;
49 MipsMCInstLower MCInstLowering;
Akira Hatanaka049e9e42011-11-23 22:19:28 +000050
Akira Hatanakaddd12652011-07-07 20:10:52 +000051 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000052 : AsmPrinter(TM, Streamer), MCInstLowering(*this) {
Akira Hatanakaddd12652011-07-07 20:10:52 +000053 Subtarget = &TM.getSubtarget<MipsSubtarget>();
54 }
55
56 virtual const char *getPassName() const {
57 return "Mips Assembly Printer";
58 }
59
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000060 virtual bool runOnMachineFunction(MachineFunction &MF);
61
Akira Hatanakaddd12652011-07-07 20:10:52 +000062 void EmitInstruction(const MachineInstr *MI);
63 void printSavedRegsBitmask(raw_ostream &O);
64 void printHex32(unsigned int Value, raw_ostream &O);
65 void emitFrameDirective();
66 const char *getCurrentABIString() const;
67 virtual void EmitFunctionEntryLabel();
68 virtual void EmitFunctionBodyStart();
69 virtual void EmitFunctionBodyEnd();
70 virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
71 MBB) const;
72 bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
73 unsigned AsmVariant, const char *ExtraCode,
74 raw_ostream &O);
75 bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
76 unsigned AsmVariant, const char *ExtraCode,
77 raw_ostream &O);
78 void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
79 void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanaka9f6f6f62011-07-07 20:54:20 +000080 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
81 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanakaddd12652011-07-07 20:10:52 +000082 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
83 const char *Modifier = 0);
84 void EmitStartOfAsmFile(Module &M);
Jack Carterc1b17ed2013-01-18 21:20:38 +000085 void EmitEndOfAsmFile(Module &M);
Akira Hatanakaddd12652011-07-07 20:10:52 +000086 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
87};
88}
89
90#endif
91