MCELFStreamer.h revision 5cc319a42a914b24b164a94d9a563c728a7a4026
15f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===- MCELFStreamer.h - MCStreamer ELF Object File Interface ---*- C++ -*-===// 25f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 35f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// The LLVM Compiler Infrastructure 45f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 55f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// License. See LICENSE.TXT for details. 75f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)// 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===// 95f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#ifndef LLVM_MC_MCELFSTREAMER_H 115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#define LLVM_MC_MCELFSTREAMER_H 125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/ADT/SmallPtrSet.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/MC/MCDirectives.h" 155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/MC/MCObjectStreamer.h" 165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/MC/SectionKind.h" 175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "llvm/Support/DataTypes.h" 185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include <vector> 195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)namespace llvm { 215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCAsmBackend; 225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCAssembler; 235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCCodeEmitter; 245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCExpr; 255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCInst; 265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCSymbol; 275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCSymbolData; 285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class raw_ostream; 295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)class MCELFStreamer : public MCObjectStreamer { 315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)protected: 325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MCELFStreamer(StreamerKind Kind, MCContext &Context, MCAsmBackend &TAB, 335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) raw_ostream &OS, MCCodeEmitter *Emitter) 345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : MCObjectStreamer(Kind, Context, TAB, OS, Emitter) {} 355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)public: 375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, 385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MCCodeEmitter *Emitter) 395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter) {} 405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, raw_ostream &OS, 425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MCCodeEmitter *Emitter, MCAssembler *Assembler) 435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) : MCObjectStreamer(SK_ELFStreamer, Context, TAB, OS, Emitter, 445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Assembler) {} 455f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 465f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual ~MCELFStreamer(); 475f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// @name MCStreamer Interface 495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) /// @{ 505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void InitSections(); 525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void InitToTextSection(); 535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void ChangeSection(const MCSection *Section, 545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const MCExpr *Subsection); 555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitLabel(MCSymbol *Symbol); 565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitDebugLabel(MCSymbol *Symbol); 575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); 585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitThumbFunc(MCSymbol *Func); 595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); 605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); 615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); 625f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 635f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) unsigned ByteAlignment); 645f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol); 655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitCOFFSymbolStorageClass(int StorageClass); 665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitCOFFSymbolType(int Type); 675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EndCOFFSymbolDef(); 685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual MCSymbolData &getOrCreateSymbolData(MCSymbol *Symbol); 705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); 725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 74 unsigned ByteAlignment); 75 76 virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, 77 uint64_t Size = 0, unsigned ByteAlignment = 0); 78 virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 79 uint64_t Size, unsigned ByteAlignment = 0); 80 virtual void EmitValueImpl(const MCExpr *Value, unsigned Size); 81 82 virtual void EmitFileDirective(StringRef Filename); 83 84 virtual void EmitTCEntry(const MCSymbol &S); 85 86 virtual void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned); 87 88 virtual void Flush(); 89 90 virtual void FinishImpl(); 91 /// @} 92 93 static bool classof(const MCStreamer *S) { 94 return S->getKind() == SK_ELFStreamer || S->getKind() == SK_ARMELFStreamer; 95 } 96 97private: 98 virtual void EmitInstToFragment(const MCInst &Inst); 99 virtual void EmitInstToData(const MCInst &Inst); 100 101 virtual void EmitBundleAlignMode(unsigned AlignPow2); 102 virtual void EmitBundleLock(bool AlignToEnd); 103 virtual void EmitBundleUnlock(); 104 105 void fixSymbolsInTLSFixups(const MCExpr *expr); 106 107 struct LocalCommon { 108 MCSymbolData *SD; 109 uint64_t Size; 110 unsigned ByteAlignment; 111 }; 112 113 std::vector<LocalCommon> LocalCommons; 114 115 SmallPtrSet<MCSymbol *, 16> BindingExplicitlySet; 116 117 118 void SetSection(StringRef Section, unsigned Type, unsigned Flags, 119 SectionKind Kind); 120 void SetSectionData(); 121 void SetSectionText(); 122 void SetSectionBss(); 123}; 124 125} // end namespace llvm 126 127#endif 128