//===-- MipsELFStreamer.cpp - MipsELFStreamer ---------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===-------------------------------------------------------------------===// #include "MCTargetDesc/MipsELFStreamer.h" #include "MipsSubtarget.h" #include "llvm/MC/MCAssembler.h" #include "llvm/MC/MCELF.h" #include "llvm/MC/MCELFSymbolFlags.h" #include "llvm/MC/MCSymbol.h" #include "llvm/Support/ELF.h" #include "llvm/Support/ErrorHandling.h" namespace llvm { MCELFStreamer* createMipsELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, MCCodeEmitter *Emitter, bool RelaxAll, bool NoExecStack) { MipsELFStreamer *S = new MipsELFStreamer(Context, TAB, OS, Emitter, RelaxAll, NoExecStack); return S; } // For llc. Set a group of ELF header flags void MipsELFStreamer::emitELFHeaderFlagsCG(const MipsSubtarget &Subtarget) { if (hasRawTextSupport()) return; // Update e_header flags MCAssembler& MCA = getAssembler(); unsigned EFlags = MCA.getELFHeaderEFlags(); if (Subtarget.inMips16Mode()) EFlags |= ELF::EF_MIPS_ARCH_ASE_M16; else EFlags |= ELF::EF_MIPS_NOREORDER; // Architecture if (Subtarget.hasMips64r2()) EFlags |= ELF::EF_MIPS_ARCH_64R2; else if (Subtarget.hasMips64()) EFlags |= ELF::EF_MIPS_ARCH_64; else if (Subtarget.hasMips32r2()) EFlags |= ELF::EF_MIPS_ARCH_32R2; else EFlags |= ELF::EF_MIPS_ARCH_32; if (Subtarget.inMicroMipsMode()) EFlags |= ELF::EF_MIPS_MICROMIPS; // ABI if (Subtarget.isABI_O32()) EFlags |= ELF::EF_MIPS_ABI_O32; // Relocation Model Reloc::Model RM = Subtarget.getRelocationModel(); if (RM == Reloc::PIC_ || RM == Reloc::Default) EFlags |= ELF::EF_MIPS_PIC; else if (RM == Reloc::Static) ; // Do nothing for Reloc::Static else llvm_unreachable("Unsupported relocation model for e_flags"); MCA.setELFHeaderEFlags(EFlags); } // For llc. Set a symbol's STO flags void MipsELFStreamer::emitMipsSTOCG(const MipsSubtarget &Subtarget, MCSymbol *Sym, unsigned Val) { if (hasRawTextSupport()) return; MCSymbolData &Data = getOrCreateSymbolData(Sym); // The "other" values are stored in the last 6 bits of the second byte // The traditional defines for STO values assume the full byte and thus // the shift to pack it. MCELF::setOther(Data, Val >> 2); } } // namespace llvm