MipsELFStreamer.cpp revision 5e195a4c8d8cd4498ab7e0aa16a3b6f273daf457
1//===-- MipsELFStreamer.cpp - MipsELFStreamer ---------------------------===// 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#include "MipsSubtarget.h" 10#include "llvm/MC/MCAssembler.h" 11#include "llvm/MC/MCELF.h" 12#include "llvm/MC/MCELFStreamer.h" 13#include "llvm/MC/MCELFSymbolFlags.h" 14#include "llvm/MC/MCSymbol.h" 15#include "llvm/Support/ELF.h" 16#include "llvm/Support/ErrorHandling.h" 17using namespace llvm; 18 19namespace { 20class MipsELFStreamer : public MCELFStreamer { 21public: 22 MipsELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, 23 MCCodeEmitter *Emitter, bool RelaxAll, bool NoExecStack) 24 : MCELFStreamer(Context, TAB, OS, Emitter) {} 25 26 ~MipsELFStreamer() {} 27 void emitMipsHackELFFlags(unsigned Flags); 28 void emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val); 29}; 30} 31 32namespace llvm { 33MCELFStreamer *createMipsELFStreamer(MCContext &Context, MCAsmBackend &TAB, 34 raw_ostream &OS, MCCodeEmitter *Emitter, 35 bool RelaxAll, bool NoExecStack) { 36 MipsELFStreamer *S = 37 new MipsELFStreamer(Context, TAB, OS, Emitter, RelaxAll, NoExecStack); 38 return S; 39} 40} // namespace llvm 41 42void MipsELFStreamer::emitMipsHackELFFlags(unsigned Flags) { 43 MCAssembler &MCA = getAssembler(); 44 45 MCA.setELFHeaderEFlags(Flags); 46} 47 48// Set a symbol's STO flags 49void MipsELFStreamer::emitMipsHackSTOCG(MCSymbol *Sym, unsigned Val) { 50 MCSymbolData &Data = getOrCreateSymbolData(Sym); 51 // The "other" values are stored in the last 6 bits of the second byte 52 // The traditional defines for STO values assume the full byte and thus 53 // the shift to pack it. 54 MCELF::setOther(Data, Val >> 2); 55} 56