MipsTargetStreamer.h revision dce4a407a24b04eebc6a376f8e62b41aaa7b071f
1//===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- 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#ifndef MIPSTARGETSTREAMER_H
11#define MIPSTARGETSTREAMER_H
12
13#include "llvm/MC/MCELFStreamer.h"
14#include "llvm/MC/MCStreamer.h"
15
16namespace llvm {
17class MipsTargetStreamer : public MCTargetStreamer {
18  virtual void anchor();
19
20public:
21  MipsTargetStreamer(MCStreamer &S);
22  virtual void emitDirectiveSetMicroMips() = 0;
23  virtual void emitDirectiveSetNoMicroMips() = 0;
24  virtual void emitDirectiveSetMips16() = 0;
25  virtual void emitDirectiveSetNoMips16() = 0;
26
27  virtual void emitDirectiveSetReorder() = 0;
28  virtual void emitDirectiveSetNoReorder() = 0;
29  virtual void emitDirectiveSetMacro() = 0;
30  virtual void emitDirectiveSetNoMacro() = 0;
31  virtual void emitDirectiveSetAt() = 0;
32  virtual void emitDirectiveSetNoAt() = 0;
33  virtual void emitDirectiveEnd(StringRef Name) = 0;
34
35  virtual void emitDirectiveEnt(const MCSymbol &Symbol) = 0;
36  virtual void emitDirectiveAbiCalls() = 0;
37  virtual void emitDirectiveNaN2008() = 0;
38  virtual void emitDirectiveNaNLegacy() = 0;
39  virtual void emitDirectiveOptionPic0() = 0;
40  virtual void emitDirectiveOptionPic2() = 0;
41  virtual void emitFrame(unsigned StackReg, unsigned StackSize,
42                         unsigned ReturnReg) = 0;
43  virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) = 0;
44  virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) = 0;
45
46  virtual void emitDirectiveSetMips32R2() = 0;
47  virtual void emitDirectiveSetMips64() = 0;
48  virtual void emitDirectiveSetMips64R2() = 0;
49  virtual void emitDirectiveSetDsp() = 0;
50
51  // PIC support
52  virtual void emitDirectiveCpload(unsigned RegNo) = 0;
53  virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
54                                    const MCSymbol &Sym, bool IsReg) = 0;
55};
56
57// This part is for ascii assembly output
58class MipsTargetAsmStreamer : public MipsTargetStreamer {
59  formatted_raw_ostream &OS;
60
61public:
62  MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
63  void emitDirectiveSetMicroMips() override;
64  void emitDirectiveSetNoMicroMips() override;
65  void emitDirectiveSetMips16() override;
66  void emitDirectiveSetNoMips16() override;
67
68  void emitDirectiveSetReorder() override;
69  void emitDirectiveSetNoReorder() override;
70  void emitDirectiveSetMacro() override;
71  void emitDirectiveSetNoMacro() override;
72  void emitDirectiveSetAt() override;
73  void emitDirectiveSetNoAt() override;
74  void emitDirectiveEnd(StringRef Name) override;
75
76  void emitDirectiveEnt(const MCSymbol &Symbol) override;
77  void emitDirectiveAbiCalls() override;
78  void emitDirectiveNaN2008() override;
79  void emitDirectiveNaNLegacy() override;
80  void emitDirectiveOptionPic0() override;
81  void emitDirectiveOptionPic2() override;
82  void emitFrame(unsigned StackReg, unsigned StackSize,
83                 unsigned ReturnReg) override;
84  void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
85  void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
86
87  void emitDirectiveSetMips32R2() override;
88  void emitDirectiveSetMips64() override;
89  void emitDirectiveSetMips64R2() override;
90  void emitDirectiveSetDsp() override;
91
92  // PIC support
93  virtual void emitDirectiveCpload(unsigned RegNo);
94  void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
95                            const MCSymbol &Sym, bool IsReg) override;
96};
97
98// This part is for ELF object output
99class MipsTargetELFStreamer : public MipsTargetStreamer {
100  bool MicroMipsEnabled;
101  const MCSubtargetInfo &STI;
102  bool Pic;
103
104public:
105  bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
106  MCELFStreamer &getStreamer();
107  MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
108
109  void emitLabel(MCSymbol *Symbol) override;
110  void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
111  void finish() override;
112
113  void emitDirectiveSetMicroMips() override;
114  void emitDirectiveSetNoMicroMips() override;
115  void emitDirectiveSetMips16() override;
116  void emitDirectiveSetNoMips16() override;
117
118  void emitDirectiveSetReorder() override;
119  void emitDirectiveSetNoReorder() override;
120  void emitDirectiveSetMacro() override;
121  void emitDirectiveSetNoMacro() override;
122  void emitDirectiveSetAt() override;
123  void emitDirectiveSetNoAt() override;
124  void emitDirectiveEnd(StringRef Name) override;
125
126  void emitDirectiveEnt(const MCSymbol &Symbol) override;
127  void emitDirectiveAbiCalls() override;
128  void emitDirectiveNaN2008() override;
129  void emitDirectiveNaNLegacy() override;
130  void emitDirectiveOptionPic0() override;
131  void emitDirectiveOptionPic2() override;
132  void emitFrame(unsigned StackReg, unsigned StackSize,
133                 unsigned ReturnReg) override;
134  void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
135  void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
136
137  void emitDirectiveSetMips32R2() override;
138  void emitDirectiveSetMips64() override;
139  void emitDirectiveSetMips64R2() override;
140  void emitDirectiveSetDsp() override;
141
142  // PIC support
143  virtual void emitDirectiveCpload(unsigned RegNo);
144  void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
145                            const MCSymbol &Sym, bool IsReg) override;
146
147protected:
148  bool isO32() const { return STI.getFeatureBits() & Mips::FeatureO32; }
149  bool isN32() const { return STI.getFeatureBits() & Mips::FeatureN32; }
150  bool isN64() const { return STI.getFeatureBits() & Mips::FeatureN64; }
151};
152}
153#endif
154