MCELFStreamer.h revision 030f63a397edc20f8f661bac62f7b90cb5cf57bc
1c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//===- MCELFStreamer.h - MCStreamer ELF Object File Interface ---*- C++ -*-===// 2c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// 3c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// The LLVM Compiler Infrastructure 4c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// 5c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// This file is distributed under the University of Illinois Open Source 65c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu// License. See LICENSE.TXT for details. 7c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch// 8c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch//===----------------------------------------------------------------------===// 9c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 10c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#ifndef LLVM_MC_MCELFSTREAMER_H 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#define LLVM_MC_MCELFSTREAMER_H 12c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 13c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "llvm/ADT/SmallPtrSet.h" 14c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "llvm/MC/MCDirectives.h" 15c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "llvm/MC/MCObjectStreamer.h" 16c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "llvm/MC/SectionKind.h" 17c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "llvm/Support/DataTypes.h" 18c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include <vector> 19c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 20c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochnamespace llvm { 21c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCAsmBackend; 22c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCAssembler; 23c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCCodeEmitter; 24c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCExpr; 25c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCInst; 265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liuclass MCSymbol; 27c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCSymbolData; 28c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass raw_ostream; 29c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochclass MCELFStreamer : public MCObjectStreamer { 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochpublic: 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, 33c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch raw_ostream &OS, MCCodeEmitter *Emitter) 34c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : MCObjectStreamer(Context, TAB, OS, Emitter) {} 35c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MCELFStreamer(MCContext &Context, MCAsmBackend &TAB, 37c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch raw_ostream &OS, MCCodeEmitter *Emitter, 38c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MCAssembler *Assembler) 39c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch : MCObjectStreamer(Context, TAB, OS, Emitter, Assembler) {} 40c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual ~MCELFStreamer(); 42c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 43c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// @name MCStreamer Interface 44c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch /// @{ 45c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 46c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void InitSections(); 47c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void InitToTextSection(); 48c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void ChangeSection(const MCSection *Section); 49c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitLabel(MCSymbol *Symbol); 50c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitDebugLabel(MCSymbol *Symbol); 51c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitAssemblerFlag(MCAssemblerFlag Flag); 52c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitThumbFunc(MCSymbol *Func); 53c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol); 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute); 55c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue); 56c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 57c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned ByteAlignment); 58c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void BeginCOFFSymbolDef(const MCSymbol *Symbol); 59c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitCOFFSymbolStorageClass(int StorageClass); 60c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitCOFFSymbolType(int Type); 61c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EndCOFFSymbolDef(); 62c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 63c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitELFSize(MCSymbol *Symbol, const MCExpr *Value); 64c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 65c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 66c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned ByteAlignment); 67c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) virtual void EmitZerofill(const MCSection *Section, MCSymbol *Symbol = 0, 69c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint64_t Size = 0, unsigned ByteAlignment = 0); 70c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitTBSSSymbol(const MCSection *Section, MCSymbol *Symbol, 71c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint64_t Size, unsigned ByteAlignment = 0); 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitValueImpl(const MCExpr *Value, unsigned Size, 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned AddrSpace); 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 75c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitFileDirective(StringRef Filename); 76cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 771320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void EmitTCEntry(const MCSymbol &S); 781320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 79cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) virtual void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned); 80cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles) virtual void FinishImpl(); 820de6073388f4e2780db8536178b129cd8f6ab386Torne (Richard Coles) /// @} 831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 84c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochprivate: 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitInstToFragment(const MCInst &Inst); 86c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitInstToData(const MCInst &Inst); 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitBundleAlignMode(unsigned AlignPow2); 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitBundleLock(bool AlignToEnd); 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual void EmitBundleUnlock(); 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 92c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void fixSymbolsInTLSFixups(const MCExpr *expr); 93c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 94c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch struct LocalCommon { 95c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch MCSymbolData *SD; 96c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch uint64_t Size; 97c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch unsigned ByteAlignment; 98c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch }; 99c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::vector<LocalCommon> LocalCommons; 101c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 102c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SmallPtrSet<MCSymbol *, 16> BindingExplicitlySet; 103c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 104c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 105c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetSection(StringRef Section, unsigned Type, unsigned Flags, 106c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch SectionKind Kind); 107c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetSectionData(); 108c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch void SetSectionText(); 1091320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci void SetSectionBss(); 110c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}; 111c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 112c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch} // end namespace llvm 113c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 114116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#endif 115116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch