blob: d635bbf80f3cf5c0c8e78523be4511291fb578c6 [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
14#include "MipsTargetStreamer.h"
15#include "llvm/MC/MCELF.h"
16#include "llvm/MC/MCSymbol.h"
17#include "llvm/Support/CommandLine.h"
Chandler Carruth8a8cd2b2014-01-07 11:48:04 +000018#include "llvm/Support/ELF.h"
Jack Carter86ac5c12013-11-18 23:55:27 +000019#include "llvm/Support/ErrorHandling.h"
20#include "llvm/Support/FormattedStream.h"
21
22using namespace llvm;
23
Rafael Espindola14d02fe2014-01-25 15:06:56 +000024static cl::opt<bool> PrintHackDirectives("print-hack-directives",
25 cl::init(false), cl::Hidden);
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 Espindola14d02fe2014-01-25 15:06:56 +000036void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) {
37 if (!PrintHackDirectives)
38 return;
39
40 OS << "\t.mips_hack_elf_flags 0x";
41 OS.write_hex(Flags);
42 OS << '\n';
43}
Jack Carter6ef6cc52013-11-19 20:53:28 +000044
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000045void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
46 OS << "\t.set\tmicromips\n";
Jack Carter6ef6cc52013-11-19 20:53:28 +000047}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000048
49void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
50 OS << "\t.set\tnomicromips\n";
51}
52
Rafael Espindola6633d572014-01-14 18:57:12 +000053void MipsTargetAsmStreamer::emitDirectiveSetMips16() {
54 OS << "\t.set\tmips16\n";
55}
56
57void MipsTargetAsmStreamer::emitDirectiveSetNoMips16() {
58 OS << "\t.set\tnomips16\n";
59}
60
Rafael Espindolaeb0a8af2014-01-26 05:06:48 +000061void MipsTargetAsmStreamer::emitDirectiveSetReorder() {
62 OS << "\t.set\treorder\n";
63}
64
65void MipsTargetAsmStreamer::emitDirectiveSetNoReorder() {
66 OS << "\t.set\tnoreorder\n";
67}
68
69void MipsTargetAsmStreamer::emitDirectiveSetMacro() {
70 OS << "\t.set\tmacro\n";
71}
72
73void MipsTargetAsmStreamer::emitDirectiveSetNoMacro() {
74 OS << "\t.set\tnomacro\n";
75}
76
77void MipsTargetAsmStreamer::emitDirectiveSetAt() {
78 OS << "\t.set\tat\n";
79}
80
81void MipsTargetAsmStreamer::emitDirectiveSetNoAt() {
82 OS << "\t.set\tnoat\n";
83}
84
85void MipsTargetAsmStreamer::emitDirectiveEnd(StringRef Name) {
86 OS << "\t.end\t" << Name << '\n';
87}
88
Rafael Espindola6633d572014-01-14 18:57:12 +000089void MipsTargetAsmStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
90 OS << "\t.ent\t" << Symbol.getName() << '\n';
91}
92
Jack Carter0cd3c192014-01-06 23:27:31 +000093void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
94void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
95 OS << "\t.option\tpic0\n";
96}
97
98// This part is for ELF object output.
Rafael Espindola24ea09e2014-01-26 06:06:37 +000099MipsTargetELFStreamer::MipsTargetELFStreamer(MCStreamer &S)
100 : MipsTargetStreamer(S), MicroMipsEnabled(false) {}
Jack Carter86ac5c12013-11-18 23:55:27 +0000101
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000102void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
Rafael Espindola26e917c2014-01-15 03:07:12 +0000103 if (!isMicroMipsEnabled())
104 return;
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000105 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
Rafael Espindola26e917c2014-01-15 03:07:12 +0000106 uint8_t Type = MCELF::GetType(Data);
107 if (Type != ELF::STT_FUNC)
108 return;
109
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000110 // The "other" values are stored in the last 6 bits of the second byte
111 // The traditional defines for STO values assume the full byte and thus
112 // the shift to pack it.
Rafael Espindola26e917c2014-01-15 03:07:12 +0000113 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000114}
115
Jack Carter86ac5c12013-11-18 23:55:27 +0000116MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
Rafael Espindola24ea09e2014-01-26 06:06:37 +0000117 return static_cast<MCELFStreamer &>(Streamer);
Jack Carter86ac5c12013-11-18 23:55:27 +0000118}
119
Rafael Espindola14d02fe2014-01-25 15:06:56 +0000120void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
Jack Carter86ac5c12013-11-18 23:55:27 +0000121 MCAssembler &MCA = getStreamer().getAssembler();
122 MCA.setELFHeaderEFlags(Flags);
123}
124
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000125void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
126 MicroMipsEnabled = true;
Jack Carter86ac5c12013-11-18 23:55:27 +0000127}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +0000128
129void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
130 MicroMipsEnabled = false;
131}
132
Rafael Espindola6633d572014-01-14 18:57:12 +0000133void MipsTargetELFStreamer::emitDirectiveSetMips16() {
Rafael Espindolae7583752014-01-24 16:13:20 +0000134 MCAssembler &MCA = getStreamer().getAssembler();
135 unsigned Flags = MCA.getELFHeaderEFlags();
136 Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
137 MCA.setELFHeaderEFlags(Flags);
Rafael Espindola6633d572014-01-14 18:57:12 +0000138}
139
140void MipsTargetELFStreamer::emitDirectiveSetNoMips16() {
141 // FIXME: implement.
142}
143
Rafael Espindolaeb0a8af2014-01-26 05:06:48 +0000144void MipsTargetELFStreamer::emitDirectiveSetReorder() {
145 // FIXME: implement.
146}
147
148void MipsTargetELFStreamer::emitDirectiveSetNoReorder() {
149 // FIXME: implement.
150}
151
152void MipsTargetELFStreamer::emitDirectiveSetMacro() {
153 // FIXME: implement.
154}
155
156void MipsTargetELFStreamer::emitDirectiveSetNoMacro() {
157 // FIXME: implement.
158}
159
160void MipsTargetELFStreamer::emitDirectiveSetAt() {
161 // FIXME: implement.
162}
163
164void MipsTargetELFStreamer::emitDirectiveSetNoAt() {
165 // FIXME: implement.
166}
167
168void MipsTargetELFStreamer::emitDirectiveEnd(StringRef Name) {
169 // FIXME: implement.
170}
171
Rafael Espindola6633d572014-01-14 18:57:12 +0000172void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
173 // FIXME: implement.
174}
175
Jack Carter0cd3c192014-01-06 23:27:31 +0000176void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
177 MCAssembler &MCA = getStreamer().getAssembler();
178 unsigned Flags = MCA.getELFHeaderEFlags();
179 Flags |= ELF::EF_MIPS_CPIC;
180 MCA.setELFHeaderEFlags(Flags);
181}
182void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
183 MCAssembler &MCA = getStreamer().getAssembler();
184 unsigned Flags = MCA.getELFHeaderEFlags();
185 Flags &= ~ELF::EF_MIPS_PIC;
186 MCA.setELFHeaderEFlags(Flags);
187}