blob: 5478f0b3fdc2496e4d46b7400d5efc4460c95d70 [file] [log] [blame]
Jack Carter86ac5c12013-11-18 23:55:27 +00001//===-- MipsTargetStreamer.cpp - Mips Target Streamer Methods -------------===//
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// This file provides Mips specific target streamer methods.
11//
12//===----------------------------------------------------------------------===//
13
Rafael Espindola054234f2014-01-27 03:53:56 +000014#include "InstPrinter/MipsInstPrinter.h"
Jack Carter86ac5c12013-11-18 23:55:27 +000015#include "MipsTargetStreamer.h"
Rafael Espindolacb1953f2014-01-26 06:57:13 +000016#include "MipsMCTargetDesc.h"
Jack Carter86ac5c12013-11-18 23:55:27 +000017#include "llvm/MC/MCELF.h"
18#include "llvm/MC/MCSymbol.h"
Rafael Espindolacb1953f2014-01-26 06:57:13 +000019#include "llvm/MC/MCSubtargetInfo.h"
Jack Carter86ac5c12013-11-18 23:55:27 +000020#include "llvm/Support/CommandLine.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000021#include "llvm/Support/ELF.h"
Jack Carter86ac5c12013-11-18 23:55:27 +000022#include "llvm/Support/ErrorHandling.h"
23#include "llvm/Support/FormattedStream.h"
24
25using namespace llvm;
26
Jack Carter0cd3c192014-01-06 23:27:31 +000027// Pin vtable to this file.
Jack Carter86ac5c12013-11-18 23:55:27 +000028void MipsTargetStreamer::anchor() {}
29
Rafael Espindola24ea09e2014-01-26 06:06:37 +000030MipsTargetStreamer::MipsTargetStreamer(MCStreamer &S) : MCTargetStreamer(S) {}
31
32MipsTargetAsmStreamer::MipsTargetAsmStreamer(MCStreamer &S,
33 formatted_raw_ostream &OS)
34 : MipsTargetStreamer(S), OS(OS) {}
Jack Carter6ef6cc52013-11-19 20:53:28 +000035
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000036void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
37 OS << "\t.set\tmicromips\n";
Jack Carter6ef6cc52013-11-19 20:53:28 +000038}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000039
40void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
41 OS << "\t.set\tnomicromips\n";
42}
43
Rafael Espindola6633d572014-01-14 18:57:12 +000044void MipsTargetAsmStreamer::emitDirectiveSetMips16() {
45 OS << "\t.set\tmips16\n";
46}
47
48void MipsTargetAsmStreamer::emitDirectiveSetNoMips16() {
49 OS << "\t.set\tnomips16\n";
50}
51
Rafael Espindolaeb0a8af2014-01-26 05:06:48 +000052void MipsTargetAsmStreamer::emitDirectiveSetReorder() {
53 OS << "\t.set\treorder\n";
54}
55
56void MipsTargetAsmStreamer::emitDirectiveSetNoReorder() {
57 OS << "\t.set\tnoreorder\n";
58}
59
60void MipsTargetAsmStreamer::emitDirectiveSetMacro() {
61 OS << "\t.set\tmacro\n";
62}
63
64void MipsTargetAsmStreamer::emitDirectiveSetNoMacro() {
65 OS << "\t.set\tnomacro\n";
66}
67
68void MipsTargetAsmStreamer::emitDirectiveSetAt() {
69 OS << "\t.set\tat\n";
70}
71
72void MipsTargetAsmStreamer::emitDirectiveSetNoAt() {
73 OS << "\t.set\tnoat\n";
74}
75
76void MipsTargetAsmStreamer::emitDirectiveEnd(StringRef Name) {
77 OS << "\t.end\t" << Name << '\n';
78}
79
Rafael Espindola6633d572014-01-14 18:57:12 +000080void MipsTargetAsmStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
81 OS << "\t.ent\t" << Symbol.getName() << '\n';
82}
83
Jack Carter0cd3c192014-01-06 23:27:31 +000084void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
85void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
86 OS << "\t.option\tpic0\n";
87}
88
Rafael Espindola054234f2014-01-27 03:53:56 +000089void MipsTargetAsmStreamer::emitFrame(unsigned StackReg, unsigned StackSize,
90 unsigned ReturnReg) {
91 OS << "\t.frame\t$"
92 << StringRef(MipsInstPrinter::getRegisterName(StackReg)).lower() << ","
93 << StackSize << ",$"
94 << StringRef(MipsInstPrinter::getRegisterName(ReturnReg)).lower();
95}
96
Jack Carter0cd3c192014-01-06 23:27:31 +000097// This part is for ELF object output.
Rafael Espindolacb1953f2014-01-26 06:57:13 +000098MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S,
99 const MCSubtargetInfo &STI)
100 : MipsTargetStreamer(S), MicroMipsEnabled(false) {
101 MCAssembler &MCA = getStreamer().getAssembler();
102 uint64_t Features = STI.getFeatureBits();
103 Triple T(STI.getTargetTriple());
104
105 // Update e_header flags
106 unsigned EFlags = 0;
107
108 // Architecture
109 if (Features & Mips::FeatureMips64r2)
110 EFlags |= ELF::EF_MIPS_ARCH_64R2;
111 else if (Features & Mips::FeatureMips64)
112 EFlags |= ELF::EF_MIPS_ARCH_64;
113 else if (Features & Mips::FeatureMips32r2)
114 EFlags |= ELF::EF_MIPS_ARCH_32R2;
115 else if (Features & Mips::FeatureMips32)
116 EFlags |= ELF::EF_MIPS_ARCH_32;
117
118 if (T.isArch64Bit()) {
119 EFlags |= ELF::EF_MIPS_ABI2;
120 } else {
121 if (Features & Mips::FeatureMips64r2 || Features & Mips::FeatureMips64)
122 EFlags |= ELF::EF_MIPS_32BITMODE;
123
124 // ABI
125 EFlags |= ELF::EF_MIPS_ABI_O32;
126 }
127
128 MCA.setELFHeaderEFlags(EFlags);
129}
Jack Carter86ac5c12013-11-18 23:55:27 +0000130
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000131void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
Rafael Espindola26e917c2014-01-15 03:07:12 +0000132 if (!isMicroMipsEnabled())
133 return;
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000134 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
Rafael Espindola26e917c2014-01-15 03:07:12 +0000135 uint8_t Type = MCELF::GetType(Data);
136 if (Type != ELF::STT_FUNC)
137 return;
138
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000139 // The "other" values are stored in the last 6 bits of the second byte
140 // The traditional defines for STO values assume the full byte and thus
141 // the shift to pack it.
Rafael Espindola26e917c2014-01-15 03:07:12 +0000142 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000143}
144
Jack Carter86ac5c12013-11-18 23:55:27 +0000145MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
Rafael Espindola24ea09e2014-01-26 06:06:37 +0000146 return static_cast<MCELFStreamer &>(Streamer);
Jack Carter86ac5c12013-11-18 23:55:27 +0000147}
148
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000149void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
150 MicroMipsEnabled = true;
Rafael Espindolacb1953f2014-01-26 06:57:13 +0000151
152 MCAssembler &MCA = getStreamer().getAssembler();
153 unsigned Flags = MCA.getELFHeaderEFlags();
154 Flags |= ELF::EF_MIPS_MICROMIPS;
155 MCA.setELFHeaderEFlags(Flags);
Jack Carter86ac5c12013-11-18 23:55:27 +0000156}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000157
158void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
159 MicroMipsEnabled = false;
160}
161
Rafael Espindola6633d572014-01-14 18:57:12 +0000162void MipsTargetELFStreamer::emitDirectiveSetMips16() {
Rafael Espindolae7583752014-01-24 16:13:20 +0000163 MCAssembler &MCA = getStreamer().getAssembler();
164 unsigned Flags = MCA.getELFHeaderEFlags();
165 Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
166 MCA.setELFHeaderEFlags(Flags);
Rafael Espindola6633d572014-01-14 18:57:12 +0000167}
168
169void MipsTargetELFStreamer::emitDirectiveSetNoMips16() {
170 // FIXME: implement.
171}
172
Rafael Espindolaeb0a8af2014-01-26 05:06:48 +0000173void MipsTargetELFStreamer::emitDirectiveSetReorder() {
174 // FIXME: implement.
175}
176
177void MipsTargetELFStreamer::emitDirectiveSetNoReorder() {
Rafael Espindolacb1953f2014-01-26 06:57:13 +0000178 MCAssembler &MCA = getStreamer().getAssembler();
179 unsigned Flags = MCA.getELFHeaderEFlags();
180 Flags |= ELF::EF_MIPS_NOREORDER;
181 MCA.setELFHeaderEFlags(Flags);
Rafael Espindolaeb0a8af2014-01-26 05:06:48 +0000182}
183
184void MipsTargetELFStreamer::emitDirectiveSetMacro() {
185 // FIXME: implement.
186}
187
188void MipsTargetELFStreamer::emitDirectiveSetNoMacro() {
189 // FIXME: implement.
190}
191
192void MipsTargetELFStreamer::emitDirectiveSetAt() {
193 // FIXME: implement.
194}
195
196void MipsTargetELFStreamer::emitDirectiveSetNoAt() {
197 // FIXME: implement.
198}
199
200void MipsTargetELFStreamer::emitDirectiveEnd(StringRef Name) {
201 // FIXME: implement.
202}
203
Rafael Espindola6633d572014-01-14 18:57:12 +0000204void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
205 // FIXME: implement.
206}
207
Jack Carter0cd3c192014-01-06 23:27:31 +0000208void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
209 MCAssembler &MCA = getStreamer().getAssembler();
210 unsigned Flags = MCA.getELFHeaderEFlags();
Rafael Espindolacb1953f2014-01-26 06:57:13 +0000211 Flags |= ELF::EF_MIPS_CPIC | ELF::EF_MIPS_PIC;
Jack Carter0cd3c192014-01-06 23:27:31 +0000212 MCA.setELFHeaderEFlags(Flags);
213}
214void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
215 MCAssembler &MCA = getStreamer().getAssembler();
216 unsigned Flags = MCA.getELFHeaderEFlags();
217 Flags &= ~ELF::EF_MIPS_PIC;
218 MCA.setELFHeaderEFlags(Flags);
219}
Rafael Espindola054234f2014-01-27 03:53:56 +0000220
221void MipsTargetELFStreamer::emitFrame(unsigned StackReg, unsigned StackSize,
222 unsigned ReturnReg) {
223 // FIXME: implement.
224}