blob: c1f1793385864d541ef3969e22c0f7dc8b802997 [file] [log] [blame]
Rafael Espindola320296a2013-10-08 13:08:17 +00001//===-- 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
Stephen Hines37ed9c12014-12-01 14:51:49 -080010#ifndef LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
11#define LLVM_LIB_TARGET_MIPS_MIPSTARGETSTREAMER_H
Rafael Espindola320296a2013-10-08 13:08:17 +000012
Jack Carter4c1625b2013-11-18 23:55:27 +000013#include "llvm/MC/MCELFStreamer.h"
Stephen Hines37ed9c12014-12-01 14:51:49 -080014#include "llvm/MC/MCRegisterInfo.h"
Rafael Espindola320296a2013-10-08 13:08:17 +000015#include "llvm/MC/MCStreamer.h"
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070016#include "MCTargetDesc/MipsABIFlagsSection.h"
Rafael Espindola320296a2013-10-08 13:08:17 +000017
18namespace llvm {
Eric Christophere40e68a2013-11-19 02:01:07 +000019
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070020struct MipsABIFlagsSection;
21
22class MipsTargetStreamer : public MCTargetStreamer {
Rafael Espindola320296a2013-10-08 13:08:17 +000023public:
Stephen Hines36b56882014-04-23 16:57:46 -070024 MipsTargetStreamer(MCStreamer &S);
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070025 virtual void emitDirectiveSetMicroMips();
26 virtual void emitDirectiveSetNoMicroMips();
27 virtual void emitDirectiveSetMips16();
28 virtual void emitDirectiveSetNoMips16();
Stephen Hines36b56882014-04-23 16:57:46 -070029
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070030 virtual void emitDirectiveSetReorder();
31 virtual void emitDirectiveSetNoReorder();
32 virtual void emitDirectiveSetMacro();
33 virtual void emitDirectiveSetNoMacro();
Stephen Hines37ed9c12014-12-01 14:51:49 -080034 virtual void emitDirectiveSetMsa();
35 virtual void emitDirectiveSetNoMsa();
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070036 virtual void emitDirectiveSetAt();
37 virtual void emitDirectiveSetNoAt();
38 virtual void emitDirectiveEnd(StringRef Name);
Stephen Hines36b56882014-04-23 16:57:46 -070039
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070040 virtual void emitDirectiveEnt(const MCSymbol &Symbol);
41 virtual void emitDirectiveAbiCalls();
42 virtual void emitDirectiveNaN2008();
43 virtual void emitDirectiveNaNLegacy();
44 virtual void emitDirectiveOptionPic0();
45 virtual void emitDirectiveOptionPic2();
Stephen Hines36b56882014-04-23 16:57:46 -070046 virtual void emitFrame(unsigned StackReg, unsigned StackSize,
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070047 unsigned ReturnReg);
48 virtual void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff);
49 virtual void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff);
Stephen Hines36b56882014-04-23 16:57:46 -070050
Stephen Hines37ed9c12014-12-01 14:51:49 -080051 virtual void emitDirectiveSetArch(StringRef Arch);
52 virtual void emitDirectiveSetMips0();
53 virtual void emitDirectiveSetMips1();
54 virtual void emitDirectiveSetMips2();
55 virtual void emitDirectiveSetMips3();
56 virtual void emitDirectiveSetMips4();
57 virtual void emitDirectiveSetMips5();
58 virtual void emitDirectiveSetMips32();
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070059 virtual void emitDirectiveSetMips32R2();
Stephen Hines37ed9c12014-12-01 14:51:49 -080060 virtual void emitDirectiveSetMips32R6();
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070061 virtual void emitDirectiveSetMips64();
62 virtual void emitDirectiveSetMips64R2();
Stephen Hines37ed9c12014-12-01 14:51:49 -080063 virtual void emitDirectiveSetMips64R6();
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070064 virtual void emitDirectiveSetDsp();
Stephen Hines37ed9c12014-12-01 14:51:49 -080065 virtual void emitDirectiveSetNoDsp();
66 virtual void emitDirectiveSetPop();
67 virtual void emitDirectiveSetPush();
Stephen Hinesdce4a402014-05-29 02:49:00 -070068
69 // PIC support
Stephen Hines37ed9c12014-12-01 14:51:49 -080070 virtual void emitDirectiveCpLoad(unsigned RegNo);
Stephen Hinesdce4a402014-05-29 02:49:00 -070071 virtual void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070072 const MCSymbol &Sym, bool IsReg);
73
74 /// Emit a '.module fp=value' directive using the given values.
75 /// Updates the .MIPS.abiflags section
76 virtual void emitDirectiveModuleFP(MipsABIFlagsSection::FpABIKind Value,
77 bool Is32BitABI) {
78 ABIFlagsSection.setFpABI(Value, Is32BitABI);
79 }
80
81 /// Emit a '.module fp=value' directive using the current values of the
82 /// .MIPS.abiflags section.
83 void emitDirectiveModuleFP() {
84 emitDirectiveModuleFP(ABIFlagsSection.getFpABI(),
85 ABIFlagsSection.Is32BitABI);
86 }
87
88 virtual void emitDirectiveModuleOddSPReg(bool Enabled, bool IsO32ABI);
89 virtual void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value){};
90 virtual void emitMipsAbiFlags(){};
Stephen Hines37ed9c12014-12-01 14:51:49 -080091 void forbidModuleDirective() { ModuleDirectiveAllowed = false; }
92 bool isModuleDirectiveAllowed() { return ModuleDirectiveAllowed; }
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -070093
94 // This method enables template classes to set internal abi flags
95 // structure values.
96 template <class PredicateLibrary>
97 void updateABIInfo(const PredicateLibrary &P) {
98 ABIFlagsSection.setAllFromPredicates(P);
99 }
100
101 MipsABIFlagsSection &getABIFlagsSection() { return ABIFlagsSection; }
102
103protected:
104 MipsABIFlagsSection ABIFlagsSection;
105
Stephen Hines37ed9c12014-12-01 14:51:49 -0800106 bool GPRInfoSet;
107 unsigned GPRBitMask;
108 int GPROffset;
109
110 bool FPRInfoSet;
111 unsigned FPRBitMask;
112 int FPROffset;
113
114 bool FrameInfoSet;
115 int FrameOffset;
116 unsigned FrameReg;
117 unsigned ReturnReg;
118
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -0700119private:
Stephen Hines37ed9c12014-12-01 14:51:49 -0800120 bool ModuleDirectiveAllowed;
Rafael Espindola320296a2013-10-08 13:08:17 +0000121};
Jack Carter4c1625b2013-11-18 23:55:27 +0000122
123// This part is for ascii assembly output
124class MipsTargetAsmStreamer : public MipsTargetStreamer {
Bill Wendlinga87a1472013-11-20 06:21:08 +0000125 formatted_raw_ostream &OS;
126
Jack Carter4c1625b2013-11-18 23:55:27 +0000127public:
Stephen Hines36b56882014-04-23 16:57:46 -0700128 MipsTargetAsmStreamer(MCStreamer &S, formatted_raw_ostream &OS);
Stephen Hinesdce4a402014-05-29 02:49:00 -0700129 void emitDirectiveSetMicroMips() override;
130 void emitDirectiveSetNoMicroMips() override;
131 void emitDirectiveSetMips16() override;
132 void emitDirectiveSetNoMips16() override;
Stephen Hines36b56882014-04-23 16:57:46 -0700133
Stephen Hinesdce4a402014-05-29 02:49:00 -0700134 void emitDirectiveSetReorder() override;
135 void emitDirectiveSetNoReorder() override;
136 void emitDirectiveSetMacro() override;
137 void emitDirectiveSetNoMacro() override;
Stephen Hines37ed9c12014-12-01 14:51:49 -0800138 void emitDirectiveSetMsa() override;
139 void emitDirectiveSetNoMsa() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700140 void emitDirectiveSetAt() override;
141 void emitDirectiveSetNoAt() override;
142 void emitDirectiveEnd(StringRef Name) override;
Stephen Hines36b56882014-04-23 16:57:46 -0700143
Stephen Hinesdce4a402014-05-29 02:49:00 -0700144 void emitDirectiveEnt(const MCSymbol &Symbol) override;
145 void emitDirectiveAbiCalls() override;
146 void emitDirectiveNaN2008() override;
147 void emitDirectiveNaNLegacy() override;
148 void emitDirectiveOptionPic0() override;
149 void emitDirectiveOptionPic2() override;
150 void emitFrame(unsigned StackReg, unsigned StackSize,
151 unsigned ReturnReg) override;
152 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
153 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
Stephen Hines36b56882014-04-23 16:57:46 -0700154
Stephen Hines37ed9c12014-12-01 14:51:49 -0800155 void emitDirectiveSetArch(StringRef Arch) override;
156 void emitDirectiveSetMips0() override;
157 void emitDirectiveSetMips1() override;
158 void emitDirectiveSetMips2() override;
159 void emitDirectiveSetMips3() override;
160 void emitDirectiveSetMips4() override;
161 void emitDirectiveSetMips5() override;
162 void emitDirectiveSetMips32() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700163 void emitDirectiveSetMips32R2() override;
Stephen Hines37ed9c12014-12-01 14:51:49 -0800164 void emitDirectiveSetMips32R6() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700165 void emitDirectiveSetMips64() override;
166 void emitDirectiveSetMips64R2() override;
Stephen Hines37ed9c12014-12-01 14:51:49 -0800167 void emitDirectiveSetMips64R6() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700168 void emitDirectiveSetDsp() override;
Stephen Hines37ed9c12014-12-01 14:51:49 -0800169 void emitDirectiveSetNoDsp() override;
170 void emitDirectiveSetPop() override;
171 void emitDirectiveSetPush() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700172
173 // PIC support
Stephen Hines37ed9c12014-12-01 14:51:49 -0800174 void emitDirectiveCpLoad(unsigned RegNo) override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700175 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
176 const MCSymbol &Sym, bool IsReg) override;
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -0700177
178 // ABI Flags
179 void emitDirectiveModuleFP(MipsABIFlagsSection::FpABIKind Value,
180 bool Is32BitABI) override;
181 void emitDirectiveModuleOddSPReg(bool Enabled, bool IsO32ABI) override;
182 void emitDirectiveSetFp(MipsABIFlagsSection::FpABIKind Value) override;
183 void emitMipsAbiFlags() override;
Jack Carter4c1625b2013-11-18 23:55:27 +0000184};
185
186// This part is for ELF object output
187class MipsTargetELFStreamer : public MipsTargetStreamer {
Stephen Hines36b56882014-04-23 16:57:46 -0700188 bool MicroMipsEnabled;
189 const MCSubtargetInfo &STI;
190 bool Pic;
191
Jack Carter4c1625b2013-11-18 23:55:27 +0000192public:
Stephen Hines36b56882014-04-23 16:57:46 -0700193 bool isMicroMipsEnabled() const { return MicroMipsEnabled; }
Jack Carter4c1625b2013-11-18 23:55:27 +0000194 MCELFStreamer &getStreamer();
Stephen Hines36b56882014-04-23 16:57:46 -0700195 MipsTargetELFStreamer(MCStreamer &S, const MCSubtargetInfo &STI);
196
Stephen Hinesdce4a402014-05-29 02:49:00 -0700197 void emitLabel(MCSymbol *Symbol) override;
198 void emitAssignment(MCSymbol *Symbol, const MCExpr *Value) override;
Stephen Hines36b56882014-04-23 16:57:46 -0700199 void finish() override;
200
Stephen Hinesdce4a402014-05-29 02:49:00 -0700201 void emitDirectiveSetMicroMips() override;
202 void emitDirectiveSetNoMicroMips() override;
203 void emitDirectiveSetMips16() override;
Stephen Hines36b56882014-04-23 16:57:46 -0700204
Stephen Hinesdce4a402014-05-29 02:49:00 -0700205 void emitDirectiveSetNoReorder() override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700206 void emitDirectiveEnd(StringRef Name) override;
Stephen Hines36b56882014-04-23 16:57:46 -0700207
Stephen Hinesdce4a402014-05-29 02:49:00 -0700208 void emitDirectiveEnt(const MCSymbol &Symbol) override;
209 void emitDirectiveAbiCalls() override;
210 void emitDirectiveNaN2008() override;
211 void emitDirectiveNaNLegacy() override;
212 void emitDirectiveOptionPic0() override;
213 void emitDirectiveOptionPic2() override;
214 void emitFrame(unsigned StackReg, unsigned StackSize,
215 unsigned ReturnReg) override;
216 void emitMask(unsigned CPUBitmask, int CPUTopSavedRegOff) override;
217 void emitFMask(unsigned FPUBitmask, int FPUTopSavedRegOff) override;
Stephen Hines36b56882014-04-23 16:57:46 -0700218
Stephen Hinesdce4a402014-05-29 02:49:00 -0700219 // PIC support
Stephen Hines37ed9c12014-12-01 14:51:49 -0800220 void emitDirectiveCpLoad(unsigned RegNo) override;
Stephen Hinesdce4a402014-05-29 02:49:00 -0700221 void emitDirectiveCpsetup(unsigned RegNo, int RegOrOffset,
222 const MCSymbol &Sym, bool IsReg) override;
223
Stephen Hinesc6a4f5e2014-07-21 00:45:20 -0700224 // ABI Flags
225 void emitDirectiveModuleOddSPReg(bool Enabled, bool IsO32ABI) override;
226 void emitMipsAbiFlags() override;
227
Stephen Hinesdce4a402014-05-29 02:49:00 -0700228protected:
229 bool isO32() const { return STI.getFeatureBits() & Mips::FeatureO32; }
230 bool isN32() const { return STI.getFeatureBits() & Mips::FeatureN32; }
231 bool isN64() const { return STI.getFeatureBits() & Mips::FeatureN64; }
Jack Carter4c1625b2013-11-18 23:55:27 +0000232};
Rafael Espindola320296a2013-10-08 13:08:17 +0000233}
Rafael Espindola320296a2013-10-08 13:08:17 +0000234#endif