1 //===-- MipsTargetStreamer.cpp - Mips Target Streamer Methods -------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file provides Mips specific target streamer methods.
12 //===----------------------------------------------------------------------===//
14 #include "MipsTargetStreamer.h"
15 #include "llvm/MC/MCELF.h"
16 #include "llvm/MC/MCSymbol.h"
17 #include "llvm/Support/CommandLine.h"
18 #include "llvm/Support/ELF.h"
19 #include "llvm/Support/ErrorHandling.h"
20 #include "llvm/Support/FormattedStream.h"
24 // Pin vtable to this file.
25 void MipsTargetStreamer::anchor() {}
27 MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS)
30 void MipsTargetAsmStreamer::emitMipsELFFlags(unsigned Flags) { return; }
32 void MipsTargetAsmStreamer::emitDirectiveSetMicroMips() {
33 OS << "\t.set\tmicromips\n";
36 void MipsTargetAsmStreamer::emitDirectiveSetNoMicroMips() {
37 OS << "\t.set\tnomicromips\n";
40 void MipsTargetAsmStreamer::emitDirectiveSetMips16() {
41 OS << "\t.set\tmips16\n";
44 void MipsTargetAsmStreamer::emitDirectiveSetNoMips16() {
45 OS << "\t.set\tnomips16\n";
48 void MipsTargetAsmStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
49 OS << "\t.ent\t" << Symbol.getName() << '\n';
52 void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
53 void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
54 OS << "\t.option\tpic0\n";
57 // This part is for ELF object output.
58 MipsTargetELFStreamer::MipsTargetELFStreamer() : MicroMipsEnabled(false) {}
60 void MipsTargetELFStreamer::emitLabel(MCSymbol *Symbol) {
61 if (!isMicroMipsEnabled())
63 MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Symbol);
64 uint8_t Type = MCELF::GetType(Data);
65 if (Type != ELF::STT_FUNC)
68 // 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.
71 MCELF::setOther(Data, ELF::STO_MIPS_MICROMIPS >> 2);
74 MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
75 return static_cast<MCELFStreamer &>(*Streamer);
78 void MipsTargetELFStreamer::emitMipsELFFlags(unsigned Flags) {
79 MCAssembler &MCA = getStreamer().getAssembler();
80 MCA.setELFHeaderEFlags(Flags);
83 void MipsTargetELFStreamer::emitDirectiveSetMicroMips() {
84 MicroMipsEnabled = true;
87 void MipsTargetELFStreamer::emitDirectiveSetNoMicroMips() {
88 MicroMipsEnabled = false;
91 void MipsTargetELFStreamer::emitDirectiveSetMips16() {
92 MCAssembler &MCA = getStreamer().getAssembler();
93 unsigned Flags = MCA.getELFHeaderEFlags();
94 Flags |= ELF::EF_MIPS_ARCH_ASE_M16;
95 MCA.setELFHeaderEFlags(Flags);
98 void MipsTargetELFStreamer::emitDirectiveSetNoMips16() {
102 void MipsTargetELFStreamer::emitDirectiveEnt(const MCSymbol &Symbol) {
106 void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
107 MCAssembler &MCA = getStreamer().getAssembler();
108 unsigned Flags = MCA.getELFHeaderEFlags();
109 Flags |= ELF::EF_MIPS_CPIC;
110 MCA.setELFHeaderEFlags(Flags);
112 void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
113 MCAssembler &MCA = getStreamer().getAssembler();
114 unsigned Flags = MCA.getELFHeaderEFlags();
115 Flags &= ~ELF::EF_MIPS_PIC;
116 MCA.setELFHeaderEFlags(Flags);