0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
1 //===-- MipsTargetStreamer.h - Mips Target Streamer ------------*- C++ -*--===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
2 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
3 // The LLVM Compiler Infrastructure
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
4 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
5 // This file is distributed under the University of Illinois Open Source
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
6 // License. See LICENSE.TXT for details.
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
7 //
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
8 //===----------------------------------------------------------------------===//
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
9
|
77
|
10 #ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
|
|
11 #define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
12
|
83
|
13 #include "MCTargetDesc/MipsABIFlagsSection.h"
|
|
14 #include "MCTargetDesc/MipsABIInfo.h"
|
95
|
15 #include "llvm/ADT/Optional.h"
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
16 #include "llvm/MC/MCELFStreamer.h"
|
77
|
17 #include "llvm/MC/MCRegisterInfo.h"
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
18 #include "llvm/MC/MCStreamer.h"
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
19
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
20 namespace llvm {
|
77
|
21
|
|
22 struct MipsABIFlagsSection;
|
|
23
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
24 class MipsTargetStreamer : public MCTargetStreamer {
|
77
|
25 public:
|
|
26 MipsTargetStreamer(MCStreamer &S);
|
|
27 virtual void emitDirectiveSetMicroMips();
|
|
28 virtual void emitDirectiveSetNoMicroMips();
|
|
29 virtual void emitDirectiveSetMips16();
|
|
30 virtual void emitDirectiveSetNoMips16();
|
|
31
|
|
32 virtual void emitDirectiveSetReorder();
|
|
33 virtual void emitDirectiveSetNoReorder();
|
|
34 virtual void emitDirectiveSetMacro();
|
|
35 virtual void emitDirectiveSetNoMacro();
|
|
36 virtual void emitDirectiveSetMsa();
|
|
37 virtual void emitDirectiveSetNoMsa();
|
|
38 virtual void emitDirectiveSetAt();
|
83
|
39 virtual void emitDirectiveSetAtWithArg(unsigned RegNo);
|
77
|
40 virtual void emitDirectiveSetNoAt();
|
|
41 virtual void emitDirectiveEnd(StringRef Name);
|
|
42
|
|
43 virtual void emitDirectiveEnt(const MCSymbol &Symbol);
|
|
44 virtual void emitDirectiveAbiCalls();
|
|
45 virtual void emitDirectiveNaN2008();
|
|
46 virtual void emitDirectiveNaNLegacy();
|
|
47 virtual void emitDirectiveOptionPic0();
|
|
48 virtual void emitDirectiveOptionPic2();
|
95
|
49 virtual void emitDirectiveInsn();
|
77
|
50 virtual void emitFrame(unsigned StackReg, unsigned StackSize,
|
|
51 unsigned ReturnReg);
|
|
52 virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
|
|
53 virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
|
|
54
|
|
55 virtual void emitDirectiveSetArch(StringRef Arch);
|
83
|
56 virtual void emitDirectiveSetMips0();
|
77
|
57 virtual void emitDirectiveSetMips1();
|
|
58 virtual void emitDirectiveSetMips2();
|
|
59 virtual void emitDirectiveSetMips3();
|
|
60 virtual void emitDirectiveSetMips4();
|
|
61 virtual void emitDirectiveSetMips5();
|
|
62 virtual void emitDirectiveSetMips32();
|
|
63 virtual void emitDirectiveSetMips32R2();
|
95
|
64 virtual void emitDirectiveSetMips32R3();
|
|
65 virtual void emitDirectiveSetMips32R5();
|
77
|
66 virtual void emitDirectiveSetMips32R6();
|
|
67 virtual void emitDirectiveSetMips64();
|
|
68 virtual void emitDirectiveSetMips64R2();
|
95
|
69 virtual void emitDirectiveSetMips64R3();
|
|
70 virtual void emitDirectiveSetMips64R5();
|
77
|
71 virtual void emitDirectiveSetMips64R6();
|
|
72 virtual void emitDirectiveSetDsp();
|
83
|
73 virtual void emitDirectiveSetNoDsp();
|
|
74 virtual void emitDirectiveSetPop();
|
|
75 virtual void emitDirectiveSetPush();
|
95
|
76 virtual void emitDirectiveSetSoftFloat();
|
|
77 virtual void emitDirectiveSetHardFloat();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
78
|
77
|
79 // PIC support
|
83
|
80 virtual void emitDirectiveCpLoad(unsigned RegNo);
|
95
|
81 virtual void emitDirectiveCpRestore(SmallVector<MCInst, 3> &StoreInsts,
|
|
82 int Offset);
|
77
|
83 virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
|
|
84 const MCSymbol &Sym, bool IsReg);
|
95
|
85 virtual void emitDirectiveCpreturn(unsigned SaveLocation,
|
|
86 bool SaveLocationIsRegister);
|
77
|
87
|
95
|
88 // FP abiflags directives
|
|
89 virtual void emitDirectiveModuleFP();
|
|
90 virtual void emitDirectiveModuleOddSPReg();
|
|
91 virtual void emitDirectiveModuleSoftFloat();
|
|
92 virtual void emitDirectiveModuleHardFloat();
|
|
93 virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value);
|
|
94 virtual void emitDirectiveSetOddSPReg();
|
|
95 virtual void emitDirectiveSetNoOddSPReg();
|
77
|
96
|
|
97 void forbidModuleDirective() { ModuleDirectiveAllowed = false; }
|
95
|
98 void reallowModuleDirective() { ModuleDirectiveAllowed = true; }
|
77
|
99 bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }
|
|
100
|
|
101 // This method enables template classes to set internal abi flags
|
|
102 // structure values.
|
|
103 template <class PredicateLibrary>
|
|
104 void updateABIInfo(const PredicateLibrary &P) {
|
95
|
105 ABI = P.getABI();
|
77
|
106 ABIFlagsSection.setAllFromPredicates(P);
|
|
107 }
|
|
108
|
|
109 MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }
|
83
|
110 const MipsABIInfo &getABI() const {
|
95
|
111 assert(ABI.hasValue() && "ABI hasn't been set!");
|
83
|
112 return *ABI;
|
|
113 }
|
77
|
114
|
|
115 protected:
|
95
|
116 llvm::Optional<MipsABIInfo> ABI;
|
77
|
117 MipsABIFlagsSection ABIFlagsSection;
|
|
118
|
|
119 bool GPRInfoSet;
|
|
120 unsigned GPRBitMask;
|
|
121 int GPROffset;
|
|
122
|
|
123 bool FPRInfoSet;
|
|
124 unsigned FPRBitMask;
|
|
125 int FPROffset;
|
|
126
|
|
127 bool FrameInfoSet;
|
|
128 int FrameOffset;
|
|
129 unsigned FrameReg;
|
|
130 unsigned ReturnReg;
|
|
131
|
|
132 private:
|
|
133 bool ModuleDirectiveAllowed;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
134 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
135
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
136 // This part is for ascii assembly output
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
137 class MipsTargetAsmStreamer : public MipsTargetStreamer {
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
138 formatted_raw_ostream &OS;
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
139
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
140 public:
|
77
|
141 MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
|
|
142 void emitDirectiveSetMicroMips() override;
|
|
143 void emitDirectiveSetNoMicroMips() override;
|
|
144 void emitDirectiveSetMips16() override;
|
|
145 void emitDirectiveSetNoMips16() override;
|
|
146
|
|
147 void emitDirectiveSetReorder() override;
|
|
148 void emitDirectiveSetNoReorder() override;
|
|
149 void emitDirectiveSetMacro() override;
|
|
150 void emitDirectiveSetNoMacro() override;
|
|
151 void emitDirectiveSetMsa() override;
|
|
152 void emitDirectiveSetNoMsa() override;
|
|
153 void emitDirectiveSetAt() override;
|
83
|
154 void emitDirectiveSetAtWithArg(unsigned RegNo) override;
|
77
|
155 void emitDirectiveSetNoAt() override;
|
|
156 void emitDirectiveEnd(StringRef Name) override;
|
|
157
|
|
158 void emitDirectiveEnt(const MCSymbol &Symbol) override;
|
|
159 void emitDirectiveAbiCalls() override;
|
|
160 void emitDirectiveNaN2008() override;
|
|
161 void emitDirectiveNaNLegacy() override;
|
|
162 void emitDirectiveOptionPic0() override;
|
|
163 void emitDirectiveOptionPic2() override;
|
95
|
164 void emitDirectiveInsn() override;
|
77
|
165 void emitFrame(unsigned StackReg, unsigned StackSize,
|
|
166 unsigned ReturnReg) override;
|
|
167 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
|
|
168 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
|
|
169
|
|
170 void emitDirectiveSetArch(StringRef Arch) override;
|
83
|
171 void emitDirectiveSetMips0() override;
|
77
|
172 void emitDirectiveSetMips1() override;
|
|
173 void emitDirectiveSetMips2() override;
|
|
174 void emitDirectiveSetMips3() override;
|
|
175 void emitDirectiveSetMips4() override;
|
|
176 void emitDirectiveSetMips5() override;
|
|
177 void emitDirectiveSetMips32() override;
|
|
178 void emitDirectiveSetMips32R2() override;
|
95
|
179 void emitDirectiveSetMips32R3() override;
|
|
180 void emitDirectiveSetMips32R5() override;
|
77
|
181 void emitDirectiveSetMips32R6() override;
|
|
182 void emitDirectiveSetMips64() override;
|
|
183 void emitDirectiveSetMips64R2() override;
|
95
|
184 void emitDirectiveSetMips64R3() override;
|
|
185 void emitDirectiveSetMips64R5() override;
|
77
|
186 void emitDirectiveSetMips64R6() override;
|
|
187 void emitDirectiveSetDsp() override;
|
83
|
188 void emitDirectiveSetNoDsp() override;
|
|
189 void emitDirectiveSetPop() override;
|
|
190 void emitDirectiveSetPush() override;
|
95
|
191 void emitDirectiveSetSoftFloat() override;
|
|
192 void emitDirectiveSetHardFloat() override;
|
77
|
193
|
|
194 // PIC support
|
83
|
195 void emitDirectiveCpLoad(unsigned RegNo) override;
|
95
|
196 void emitDirectiveCpRestore(SmallVector<MCInst, 3> &StoreInsts,
|
|
197 int Offset) override;
|
77
|
198 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
|
|
199 const MCSymbol &Sym, bool IsReg) override;
|
95
|
200 void emitDirectiveCpreturn(unsigned SaveLocation,
|
|
201 bool SaveLocationIsRegister) override;
|
77
|
202
|
95
|
203 // FP abiflags directives
|
|
204 void emitDirectiveModuleFP() override;
|
|
205 void emitDirectiveModuleOddSPReg() override;
|
|
206 void emitDirectiveModuleSoftFloat() override;
|
|
207 void emitDirectiveModuleHardFloat() override;
|
77
|
208 void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
|
95
|
209 void emitDirectiveSetOddSPReg() override;
|
|
210 void emitDirectiveSetNoOddSPReg() override;
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
211 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
212
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
213 // This part is for ELF object output
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
214 class MipsTargetELFStreamer : public MipsTargetStreamer {
|
77
|
215 bool MicroMipsEnabled;
|
|
216 const MCSubtargetInfo &STI;
|
|
217 bool Pic;
|
|
218
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
219 public:
|
77
|
220 bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
221 MCELFStreamer &getStreamer();
|
77
|
222 MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
|
|
223
|
|
224 void emitLabel(MCSymbol *Symbol) override;
|
|
225 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
|
|
226 void finish() override;
|
|
227
|
|
228 void emitDirectiveSetMicroMips() override;
|
|
229 void emitDirectiveSetNoMicroMips() override;
|
|
230 void emitDirectiveSetMips16() override;
|
|
231
|
|
232 void emitDirectiveSetNoReorder() override;
|
|
233 void emitDirectiveEnd(StringRef Name) override;
|
|
234
|
|
235 void emitDirectiveEnt(const MCSymbol &Symbol) override;
|
|
236 void emitDirectiveAbiCalls() override;
|
|
237 void emitDirectiveNaN2008() override;
|
|
238 void emitDirectiveNaNLegacy() override;
|
|
239 void emitDirectiveOptionPic0() override;
|
|
240 void emitDirectiveOptionPic2() override;
|
95
|
241 void emitDirectiveInsn() override;
|
77
|
242 void emitFrame(unsigned StackReg, unsigned StackSize,
|
|
243 unsigned ReturnReg) override;
|
|
244 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
|
|
245 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
|
|
246
|
|
247 // PIC support
|
83
|
248 void emitDirectiveCpLoad(unsigned RegNo) override;
|
95
|
249 void emitDirectiveCpRestore(SmallVector<MCInst, 3> &StoreInsts,
|
|
250 int Offset) override;
|
77
|
251 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
|
|
252 const MCSymbol &Sym, bool IsReg) override;
|
95
|
253 void emitDirectiveCpreturn(unsigned SaveLocation,
|
|
254 bool SaveLocationIsRegister) override;
|
77
|
255
|
95
|
256 void emitMipsAbiFlags();
|
0
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
257 };
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
258 }
|
Kaito Tokumori <e105711@ie.u-ryukyu.ac.jp>
parents:
diff
changeset
|
259 #endif
|