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