blob: 738fa2b204da521c5cf8ad717124559edcd33df8 [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
Jack Carter6ef6cc52013-11-19 20:53:28 +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
Jack Carter6ef6cc52013-11-19 20:53:28 +000030MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS)
31 : OS(OS) {}
32
33void MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) {
34 if (!PrintHackDirectives)
35 return;
36
37 OS << "\t.mips_hack_elf_flags 0x";
38 OS.write_hex(Flags);
39 OS << '\n';
40}
Jack Carter6ef6cc52013-11-19 20:53:28 +000041
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000042void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
43 OS << "\t.set\tmicromips\n";
Jack Carter6ef6cc52013-11-19 20:53:28 +000044}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000045
46void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
47 OS << "\t.set\tnomicromips\n";
48}
49
Rafael Espindola6633d572014-01-14 18:57:12 +000050void MipsTargetAsmStreamer::emitDirectiveSetMips16() {
51 OS << "\t.set\tmips16\n";
52}
53
54void MipsTargetAsmStreamer::emitDirectiveSetNoMips16() {
55 OS << "\t.set\tnomips16\n";
56}
57
58void MipsTargetAsmStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
59 OS << "\t.ent\t" << Symbol.getName() << '\n';
60}
61
Jack Carter0cd3c192014-01-06 23:27:31 +000062void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
63void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
64 OS << "\t.option\tpic0\n";
65}
66
67// This part is for ELF object output.
68MipsTargetELFStreamer::MipsTargetELFStreamer() {}
Jack Carter86ac5c12013-11-18 23:55:27 +000069
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000070void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
71 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
72 // The "other" values are stored in the last 6 bits of the second byte
73 // The traditional defines for STO values assume the full byte and thus
74 // the shift to pack it.
75 if (isMicroMipsEnabled())
76 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
77}
78
Jack Carter86ac5c12013-11-18 23:55:27 +000079MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
80 return static_cast<MCELFStreamer &>(*Streamer);
81}
82
83void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
84 MCAssembler &MCA = getStreamer().getAssembler();
85 MCA.setELFHeaderEFlags(Flags);
86}
87
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000088void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
89 MicroMipsEnabled = true;
Jack Carter86ac5c12013-11-18 23:55:27 +000090}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000091
92void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
93 MicroMipsEnabled = false;
94}
95
Rafael Espindola6633d572014-01-14 18:57:12 +000096void MipsTargetELFStreamer::emitDirectiveSetMips16() {
97 // FIXME: implement.
98}
99
100void MipsTargetELFStreamer::emitDirectiveSetNoMips16() {
101 // FIXME: implement.
102}
103
104void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
105 // FIXME: implement.
106}
107
Jack Carter0cd3c192014-01-06 23:27:31 +0000108void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
109 MCAssembler &MCA = getStreamer().getAssembler();
110 unsigned Flags = MCA.getELFHeaderEFlags();
111 Flags |= ELF::EF_MIPS_CPIC;
112 MCA.setELFHeaderEFlags(Flags);
113}
114void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
115 MCAssembler &MCA = getStreamer().getAssembler();
116 unsigned Flags = MCA.getELFHeaderEFlags();
117 Flags &= ~ELF::EF_MIPS_PIC;
118 MCA.setELFHeaderEFlags(Flags);
119}