Fix undefined behavior in the Mips backend.
[oota-llvm.git] / lib / Target / Mips / MipsAsmPrinter.h
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 "MipsSubtarget.h"
18 #include "llvm/CodeGen/AsmPrinter.h"
19 #include "llvm/Support/Compiler.h"
20 #include "llvm/Target/TargetMachine.h"
21
22 namespace llvm {
23 class MCStreamer;
24 class MachineInstr;
25 class raw_ostream;
26 class MachineBasicBlock;
27 class Module;
28
29 class LLVM_LIBRARY_VISIBILITY MipsAsmPrinter : public AsmPrinter {
30
31 public:
32
33   const MipsSubtarget *Subtarget;
34
35   explicit MipsAsmPrinter(TargetMachine &TM,  MCStreamer &Streamer)
36     : AsmPrinter(TM, Streamer) {
37     Subtarget = &TM.getSubtarget<MipsSubtarget>();
38   }
39
40   virtual const char *getPassName() const {
41     return "Mips Assembly Printer";
42   }
43
44   void EmitInstruction(const MachineInstr *MI);
45   void printSavedRegsBitmask(raw_ostream &O);
46   void printHex32(unsigned int Value, raw_ostream &O);
47   void emitFrameDirective();
48   const char *getCurrentABIString() const;
49   virtual void EmitFunctionEntryLabel();
50   virtual void EmitFunctionBodyStart();
51   virtual void EmitFunctionBodyEnd();
52   virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock*
53                                                  MBB) const;
54   bool PrintAsmOperand(const MachineInstr *MI, unsigned OpNo,
55                        unsigned AsmVariant, const char *ExtraCode,
56                        raw_ostream &O);
57   bool PrintAsmMemoryOperand(const MachineInstr *MI, unsigned OpNum,
58                              unsigned AsmVariant, const char *ExtraCode,
59                              raw_ostream &O);
60   void printOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
61   void printUnsignedImm(const MachineInstr *MI, int opNum, raw_ostream &O);
62   void printMemOperand(const MachineInstr *MI, int opNum, raw_ostream &O);
63   void printMemOperandEA(const MachineInstr *MI, int opNum, raw_ostream &O);
64   void printFCCOperand(const MachineInstr *MI, int opNum, raw_ostream &O,
65                        const char *Modifier = 0);
66   void EmitStartOfAsmFile(Module &M);
67   virtual MachineLocation getDebugValueLocation(const MachineInstr *MI) const;
68   void PrintDebugValueComment(const MachineInstr *MI, raw_ostream &OS);
69 };
70 }
71
72 #endif
73