blob: 48af1a71ca310319a23036a3a596d4a8141f92d1 [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
Jack Carter0cd3c192014-01-06 23:27:31 +000050void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
51void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
52 OS << "\t.option\tpic0\n";
53}
54
55// This part is for ELF object output.
56MipsTargetELFStreamer::MipsTargetELFStreamer() {}
Jack Carter86ac5c12013-11-18 23:55:27 +000057
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000058void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
59 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
60 // The "other" values are stored in the last 6 bits of the second byte
61 // The traditional defines for STO values assume the full byte and thus
62 // the shift to pack it.
63 if (isMicroMipsEnabled())
64 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
65}
66
Jack Carter86ac5c12013-11-18 23:55:27 +000067MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
68 return static_cast<MCELFStreamer &>(*Streamer);
69}
70
71void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
72 MCAssembler &MCA = getStreamer().getAssembler();
73 MCA.setELFHeaderEFlags(Flags);
74}
75
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000076void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
77 MicroMipsEnabled = true;
Jack Carter86ac5c12013-11-18 23:55:27 +000078}
Rafael Espindola6d5f7ce2014-01-14 04:25:13 +000079
80void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
81 MicroMipsEnabled = false;
82}
83
Jack Carter0cd3c192014-01-06 23:27:31 +000084void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
85 MCAssembler &MCA = getStreamer().getAssembler();
86 unsigned Flags = MCA.getELFHeaderEFlags();
87 Flags |= ELF::EF_MIPS_CPIC;
88 MCA.setELFHeaderEFlags(Flags);
89}
90void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
91 MCAssembler &MCA = getStreamer().getAssembler();
92 unsigned Flags = MCA.getELFHeaderEFlags();
93 Flags &= ~ELF::EF_MIPS_PIC;
94 MCA.setELFHeaderEFlags(Flags);
95}