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