16203a0dcb80c4ae13ecc1e5293eb2e1254d9a3e
[oota-llvm.git] / lib / Target / Mips / MCTargetDesc / MipsTargetStreamer.cpp
1 //===-- 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"
18 #include "llvm/Support/ELF.h"
19 #include "llvm/Support/ErrorHandling.h"
20 #include "llvm/Support/FormattedStream.h"
21
22 using namespace llvm;
23
24 static cl::opt<bool> PrintHackDirectives("print-hack-directives",
25                                          cl::init(false), cl::Hidden);
26
27 // Pin vtable to this file.
28 void MipsTargetStreamer::anchor() {}
29
30 MipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS)
31     : OS(OS) {}
32
33 void 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 }
41 void MipsTargetAsmStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
42   if (!PrintHackDirectives)
43     return;
44
45   OS << "\t.mips_hack_stocg ";
46   OS << Sym->getName();
47   OS << ", ";
48   OS << Val;
49   OS << '\n';
50 }
51 void MipsTargetAsmStreamer::emitDirectiveAbiCalls() { OS << "\t.abicalls\n"; }
52 void MipsTargetAsmStreamer::emitDirectiveOptionPic0() {
53   OS << "\t.option\tpic0\n";
54 }
55
56 // This part is for ELF object output.
57 MipsTargetELFStreamer::MipsTargetELFStreamer() {}
58
59 MCELFStreamer &MipsTargetELFStreamer::getStreamer() {
60   return static_cast<MCELFStreamer &>(*Streamer);
61 }
62
63 void MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) {
64   MCAssembler &MCA = getStreamer().getAssembler();
65   MCA.setELFHeaderEFlags(Flags);
66 }
67
68 // Set a symbol's STO flags.
69 void MipsTargetELFStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) {
70   MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Sym);
71   // The "other" values are stored in the last 6 bits of the second byte
72   // The traditional defines for STO values assume the full byte and thus
73   // the shift to pack it.
74   MCELF::setOther(Data, Val >> 2);
75 }
76 void MipsTargetELFStreamer::emitDirectiveAbiCalls() {
77   MCAssembler &MCA = getStreamer().getAssembler();
78   unsigned Flags = MCA.getELFHeaderEFlags();
79   Flags |= ELF::EF_MIPS_CPIC;
80   MCA.setELFHeaderEFlags(Flags);
81 }
82 void MipsTargetELFStreamer::emitDirectiveOptionPic0() {
83   MCAssembler &MCA = getStreamer().getAssembler();
84   unsigned Flags = MCA.getELFHeaderEFlags();
85   Flags &= ~ELF::EF_MIPS_PIC;
86   MCA.setELFHeaderEFlags(Flags);
87 }