MCMachOStreamer.cpp revision 8906ff1b9dfde28f1ff00706643ca10843b26e01
1fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===- lib/MC/MCMachOStreamer.cpp - Mach-O Object Output ------------===// 2fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 3fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// The LLVM Compiler Infrastructure 4fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 5fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// This file is distributed under the University of Illinois Open Source 6fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// License. See LICENSE.TXT for details. 7fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar// 8fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar//===----------------------------------------------------------------------===// 9fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 10fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCStreamer.h" 11fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 12fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/ADT/DenseMap.h" 13fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCAssembler.h" 14fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCContext.h" 15fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSection.h" 16fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCSymbol.h" 17fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/MC/MCValue.h" 18fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar#include "llvm/Support/ErrorHandling.h" 19fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarusing namespace llvm; 20fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 21fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarnamespace { 22fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 23fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarclass MCMachOStreamer : public MCStreamer { 24fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCAssembler Assembler; 25fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 26fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData *CurSectionData; 27fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 28fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar DenseMap<const MCSection*, MCSectionData*> SectionMap; 29fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 30fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarpublic: 31fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCMachOStreamer(MCContext &Context, raw_ostream &_OS) 32fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar : MCStreamer(Context), Assembler(_OS), CurSectionData(0) {} 33fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar ~MCMachOStreamer() {} 34fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 35fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @name MCStreamer Interface 36fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @{ 37fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 38fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void SwitchSection(const MCSection *Section); 39fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 40fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitLabel(MCSymbol *Symbol); 41fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 42fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitAssemblerFlag(AssemblerFlag Flag); 43fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 44fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitAssignment(MCSymbol *Symbol, const MCValue &Value, 45fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar bool MakeAbsolute = false); 46fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 47fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitSymbolAttribute(MCSymbol *Symbol, SymbolAttr Attribute); 48fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 49fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); 50fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 51fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitLocalSymbol(MCSymbol *Symbol, const MCValue &Value); 52fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 53fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, 54fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Pow2Alignment, bool IsLocal); 55fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 56fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitZerofill(MCSection *Section, MCSymbol *Symbol = NULL, 57fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Size = 0, unsigned Pow2Alignment = 0); 58fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 59fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitBytes(const StringRef &Data); 60fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 61fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitValue(const MCValue &Value, unsigned Size); 62fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 63fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitValueToAlignment(unsigned ByteAlignment, int64_t Value = 0, 64fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned ValueSize = 1, 65fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned MaxBytesToEmit = 0); 66fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 67fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitValueToOffset(const MCValue &Offset, 68fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned char Value = 0); 69fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 70fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void EmitInstruction(const MCInst &Inst); 71fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 72fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar virtual void Finish(); 73fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 74fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar /// @} 75fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar}; 76fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 77fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} // end anonymous namespace. 78fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 79fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::SwitchSection(const MCSection *Section) { 80fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar assert(Section && "Cannot switch to a null section!"); 81fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 82fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar if (Section != CurSection) { 83fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar CurSection = Section; 84fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar MCSectionData *&Entry = SectionMap[Section]; 85fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 86fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar if (!Entry) 87fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar Entry = new MCSectionData(*Section, &Assembler); 88fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 89fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar CurSectionData = Entry; 90fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar } 91fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 92fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 93fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitLabel(MCSymbol *Symbol) { 948906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar assert(Symbol->isUndefined() && "Cannot define a symbol twice!"); 95fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar assert(CurSection && "Cannot emit before setting section!"); 96fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 97fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 98fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 998906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar Symbol->setSection(*CurSection); 100fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 101fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 102fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitAssemblerFlag(AssemblerFlag Flag) { 103fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 104fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 105fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 106fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitAssignment(MCSymbol *Symbol, 107fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar const MCValue &Value, 108fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar bool MakeAbsolute) { 1098906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar // Only absolute symbols can be redefined. 1108906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar assert((Symbol->isUndefined() || Symbol->isAbsolute()) && 1118906ff1b9dfde28f1ff00706643ca10843b26e01Daniel Dunbar "Cannot define a symbol twice!"); 112fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 113fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 114fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 115fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 116fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolAttribute(MCSymbol *Symbol, 117fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar SymbolAttr Attribute) { 118fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 119fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 120fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 121fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) { 122fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 123fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 124fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 125fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitLocalSymbol(MCSymbol *Symbol, const MCValue &Value) { 126fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 127fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 128fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 129fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitCommonSymbol(MCSymbol *Symbol, unsigned Size, 130fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Pow2Alignment, 131fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar bool IsLocal) { 132fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 133fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 134fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 135fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitZerofill(MCSection *Section, MCSymbol *Symbol, 136fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned Size, unsigned Pow2Alignment) { 137fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 138fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 139fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 140fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitBytes(const StringRef &Data) { 1410705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar MCDataFragment *DF = new MCDataFragment(CurSectionData); 1420705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar DF->getContents().append(Data.begin(), Data.end()); 143fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 144fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 145fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValue(const MCValue &Value, unsigned Size) { 1460705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar new MCFillFragment(Value, Size, 1, CurSectionData); 147fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 148fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 149fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValueToAlignment(unsigned ByteAlignment, 150fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar int64_t Value, unsigned ValueSize, 151fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned MaxBytesToEmit) { 152d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar if (MaxBytesToEmit == 0) 153d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar MaxBytesToEmit = ByteAlignment; 1540705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar new MCAlignFragment(ByteAlignment, Value, ValueSize, MaxBytesToEmit, 1550705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar CurSectionData); 1560705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar 1570705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar // Update the maximum alignment on the current section if necessary 1580705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar if (ByteAlignment > CurSectionData->getAlignment()) 1590705fbf52fcaade0c6b9d5d33bec163ee4c2daf4Daniel Dunbar CurSectionData->setAlignment(ByteAlignment); 160fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 161fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 162fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitValueToOffset(const MCValue &Offset, 163fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar unsigned char Value) { 164d6f761e0eb610936a6b8495360b62696dcd85164Daniel Dunbar new MCOrgFragment(Offset, Value, CurSectionData); 165fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 166fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 167fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::EmitInstruction(const MCInst &Inst) { 168fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar llvm_unreachable("FIXME: Not yet implemented!"); 169fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 170fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 171fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbarvoid MCMachOStreamer::Finish() { 172fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar Assembler.Finish(); 173fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 174fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar 175fb4a6b397665df011348ade24a8e38d2219f095aDaniel DunbarMCStreamer *llvm::createMachOStreamer(MCContext &Context, raw_ostream &OS) { 176fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar return new MCMachOStreamer(Context, OS); 177fb4a6b397665df011348ade24a8e38d2219f095aDaniel Dunbar} 178