blob: 44b8b068dfa2e17da9beae59c8a807250a6d3a95 [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
Reed Kotler91ae9822013-10-27 21:57:36 +000045 /// 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
Akira Hatanakaddd12652011-07-07 20:10:52 +000055public:
Akira Hatanaka049e9e42011-11-23 22:19:28 +000056
57 const MipsSubtarget *Subtarget;
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000058 const MipsFunctionInfo *MipsFI;
59 MipsMCInstLower MCInstLowering;
Akira Hatanaka049e9e42011-11-23 22:19:28 +000060
Akira Hatanakaddd12652011-07-07 20:10:52 +000061 explicit MipsAsmPrinter(TargetMachine &TM, MCStreamer &Streamer)
Reed Kotler91ae9822013-10-27 21:57:36 +000062 : AsmPrinter(TM, Streamer), MCP(0), InConstantPool(false),
63 MCInstLowering(*this) {
Akira Hatanakaddd12652011-07-07 20:10:52 +000064 Subtarget = &TM.getSubtarget<MipsSubtarget>();
Reed Kotler91ae9822013-10-27 21:57:36 +000065 UsingConstantPools =
66 (Subtarget->inMips16Mode() && Subtarget->useConstantIslands());
Akira Hatanakaddd12652011-07-07 20:10:52 +000067 }
68
69 virtual const char *getPassName() const {
70 return "Mips Assembly Printer";
71 }
72
Akira Hatanaka34ee3ff2012-03-28 00:22:50 +000073 virtual bool runOnMachineFunction(MachineFunction &MF);
74
Reed Kotler91ae9822013-10-27 21:57:36 +000075 virtual void EmitConstantPool() LLVM_OVERRIDE {
76 if (!UsingConstantPools)
77 AsmPrinter::EmitConstantPool();
78 // we emit constant pools customly!
79 }
80
Akira Hatanakaddd12652011-07-07 20:10:52 +000081 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);
Akira Hatanaka9f6f6f62011-07-07 20:54:20 +000099 void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
100 void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000101 void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
102 const char *Modifier = 0);
103 void EmitStartOfAsmFile(Module &M);
Jack Carterc1b17ed2013-01-18 21:20:38 +0000104 void EmitEndOfAsmFile(Module &M);
Akira Hatanakaddd12652011-07-07 20:10:52 +0000105 void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
106};
107}
108
109#endif
110