1259698Sdim//===-- MipsTargetStreamer.cpp - Mips Target Streamer Methods -------------===// 2259698Sdim// 3259698Sdim// The LLVM Compiler Infrastructure 4259698Sdim// 5259698Sdim// This file is distributed under the University of Illinois Open Source 6259698Sdim// License. See LICENSE.TXT for details. 7259698Sdim// 8259698Sdim//===----------------------------------------------------------------------===// 9259698Sdim// 10259698Sdim// This file provides Mips specific target streamer methods. 11259698Sdim// 12259698Sdim//===----------------------------------------------------------------------===// 13259698Sdim 14259698Sdim#include "MipsTargetStreamer.h" 15259698Sdim#include "llvm/MC/MCELF.h" 16259698Sdim#include "llvm/MC/MCSymbol.h" 17259698Sdim#include "llvm/Support/CommandLine.h" 18259698Sdim#include "llvm/Support/ErrorHandling.h" 19259698Sdim#include "llvm/Support/FormattedStream.h" 20259698Sdim 21259698Sdimusing namespace llvm; 22259698Sdim 23259698Sdimstatic cl::opt<bool> PrintHackDirectives("print-hack-directives", 24259698Sdim cl::init(false), cl::Hidden); 25259698Sdim 26259698Sdim// pin vtable to this file 27259698Sdimvoid MipsTargetStreamer::anchor() {} 28259698Sdim 29259698SdimMipsTargetAsmStreamer::MipsTargetAsmStreamer(formatted_raw_ostream &OS) 30259698Sdim : OS(OS) {} 31259698Sdim 32259698Sdimvoid MipsTargetAsmStreamer::emitMipsHackELFFlags(unsigned Flags) { 33259698Sdim if (!PrintHackDirectives) 34259698Sdim return; 35259698Sdim 36259698Sdim OS << "\t.mips_hack_elf_flags 0x"; 37259698Sdim OS.write_hex(Flags); 38259698Sdim OS << '\n'; 39259698Sdim} 40259698Sdimvoid MipsTargetAsmStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) { 41259698Sdim if (!PrintHackDirectives) 42259698Sdim return; 43259698Sdim 44259698Sdim OS << "\t.mips_hack_stocg "; 45259698Sdim OS << Sym->getName(); 46259698Sdim OS << ", "; 47259698Sdim OS << Val; 48259698Sdim OS << '\n'; 49259698Sdim} 50259698Sdim 51259698SdimMCELFStreamer &MipsTargetELFStreamer::getStreamer() { 52259698Sdim return static_cast<MCELFStreamer &>(*Streamer); 53259698Sdim} 54259698Sdim 55259698Sdimvoid MipsTargetELFStreamer::emitMipsHackELFFlags(unsigned Flags) { 56259698Sdim MCAssembler &MCA = getStreamer().getAssembler(); 57259698Sdim MCA.setELFHeaderEFlags(Flags); 58259698Sdim} 59259698Sdim 60259698Sdim// Set a symbol's STO flags 61259698Sdimvoid MipsTargetELFStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) { 62259698Sdim MCSymbolData &Data = getStreamer().getOrCreateSymbolData(Sym); 63259698Sdim // The "other" values are stored in the last 6 bits of the second byte 64259698Sdim // The traditional defines for STO values assume the full byte and thus 65259698Sdim // the shift to pack it. 66259698Sdim MCELF::setOther(Data, Val >> 2); 67259698Sdim} 68