blob: d026471d0fdb4191af3163253be3f796d893643d [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 Carter0cd3c192014-01-06 23:27:31 +000024// Pin vtable to this file.
Jack Carter86ac5c12013-11-18 23:55:27 +000025void MipsTargetStreamer::anchor() {}
26
Jack Carter6ef6cc52013-11-19 20:53:28 +000027MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS)
28 : OS(OS) {}
29
Jack Carterca2ae492014-01-25 00:24:07 +000030void MipsTargetAsmStreamer::emitMipsELFFlags(unsigned Flags) { return; }
Jack Carter6ef6cc52013-11-19 20:53:28 +000031
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000032void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
33 OS << "\t.set\tmicromips\n";
Jack Carter6ef6cc52013-11-19 20:53:28 +000034}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000035
36void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
37 OS << "\t.set\tnomicromips\n";
38}
39
Rafael Espindola6633d572014-01-14 18:57:12 +000040void MipsTargetAsmStreamer::emitDirectiveSetMips16() {
41 OS << "\t.set\tmips16\n";
42}
43
44void MipsTargetAsmStreamer::emitDirectiveSetNoMips16() {
45 OS << "\t.set\tnomips16\n";
46}
47
48void MipsTargetAsmStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
49 OS << "\t.ent\t" << Symbol.getName() << '\n';
50}
51
Jack Carter0cd3c192014-01-06 23:27:31 +000052void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
53void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
54 OS << "\t.option\tpic0\n";
55}
56
57// This part is for ELF object output.
Rafael Espindola9d795ca2014-01-15 03:27:26 +000058MipsTargetELFStreamer::MipsTargetELFStreamer() : MicroMipsEnabled(false) {}
Jack Carter86ac5c12013-11-18 23:55:27 +000059
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000060void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
Rafael Espindola26e917c2014-01-15 03:07:12 +000061 if (!isMicroMipsEnabled())
62 return;
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000063 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
Rafael Espindola26e917c2014-01-15 03:07:12 +000064 uint8_t Type = MCELF::GetType(Data);
65 if (Type != ELF::STT_FUNC)
66 return;
67
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000068 // The "other" values are stored in the last 6 bits of the second byte
69 // The traditional defines for STO values assume the full byte and thus
70 // the shift to pack it.
Rafael Espindola26e917c2014-01-15 03:07:12 +000071 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000072}
73
Jack Carter86ac5c12013-11-18 23:55:27 +000074MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
75 return static_cast<MCELFStreamer &>(*Streamer);
76}
77
Jack Carterca2ae492014-01-25 00:24:07 +000078void MipsTargetELFStreamer::emitMipsELFFlags(unsigned Flags) {
Jack Carter86ac5c12013-11-18 23:55:27 +000079 MCAssembler &MCA = getStreamer().getAssembler();
80 MCA.setELFHeaderEFlags(Flags);
81}
82
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000083void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
84 MicroMipsEnabled = true;
Jack Carter86ac5c12013-11-18 23:55:27 +000085}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000086
87void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
88 MicroMipsEnabled = false;
89}
90
Rafael Espindola6633d572014-01-14 18:57:12 +000091void MipsTargetELFStreamer::emitDirectiveSetMips16() {
Rafael Espindolae7583752014-01-24 16:13:20 +000092 MCAssembler &MCA = getStreamer().getAssembler();
93 unsigned Flags = MCA.getELFHeaderEFlags();
94 Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
95 MCA.setELFHeaderEFlags(Flags);
Rafael Espindola6633d572014-01-14 18:57:12 +000096}
97
98void MipsTargetELFStreamer::emitDirectiveSetNoMips16() {
99 // FIXME: implement.
100}
101
102void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
103 // FIXME: implement.
104}
105
Jack Carter0cd3c192014-01-06 23:27:31 +0000106void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
107 MCAssembler &MCA = getStreamer().getAssembler();
108 unsigned Flags = MCA.getELFHeaderEFlags();
109 Flags |= ELF::EF_MIPS_CPIC;
110 MCA.setELFHeaderEFlags(Flags);
111}
112void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
113 MCAssembler &MCA = getStreamer().getAssembler();
114 unsigned Flags = MCA.getELFHeaderEFlags();
115 Flags &= ~ELF::EF_MIPS_PIC;
116 MCA.setELFHeaderEFlags(Flags);
117}