LLVM  10.0.0svn
MCELFStreamer.h
Go to the documentation of this file.
1 //===- MCELFStreamer.h - MCStreamer ELF Object File Interface ---*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #ifndef LLVM_MC_MCELFSTREAMER_H
10 #define LLVM_MC_MCELFSTREAMER_H
11 
12 #include "llvm/ADT/SmallVector.h"
13 #include "llvm/MC/MCDirectives.h"
15 
16 namespace llvm {
17 
18 class MCAsmBackend;
19 class MCCodeEmitter;
20 class MCExpr;
21 class MCInst;
22 
24 public:
25  MCELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> TAB,
26  std::unique_ptr<MCObjectWriter> OW,
27  std::unique_ptr<MCCodeEmitter> Emitter);
28 
29  ~MCELFStreamer() override = default;
30 
31  /// state management
32  void reset() override {
33  SeenIdent = false;
34  BundleGroups.clear();
36  }
37 
38  /// \name MCStreamer Interface
39  /// @{
40 
41  void InitSections(bool NoExecStack) override;
42  void ChangeSection(MCSection *Section, const MCExpr *Subsection) override;
43  void EmitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
44  void EmitLabel(MCSymbol *Symbol, SMLoc Loc, MCFragment *F) override;
45  void EmitAssemblerFlag(MCAssemblerFlag Flag) override;
46  void EmitThumbFunc(MCSymbol *Func) override;
47  void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
48  bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override;
49  void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
50  void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size,
51  unsigned ByteAlignment) override;
52 
53  void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;
54  void emitELFSymverDirective(StringRef AliasName,
55  const MCSymbol *Aliasee) override;
56 
57  void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size,
58  unsigned ByteAlignment) override;
59 
60  void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
61  uint64_t Size = 0, unsigned ByteAlignment = 0,
62  SMLoc L = SMLoc()) override;
63  void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
64  unsigned ByteAlignment = 0) override;
65  void EmitValueImpl(const MCExpr *Value, unsigned Size,
66  SMLoc Loc = SMLoc()) override;
67 
68  void EmitIdent(StringRef IdentString) override;
69 
70  void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override;
71 
73  const MCSymbolRefExpr *To, uint64_t Count) override;
74 
75  void FinishImpl() override;
76 
77  void EmitBundleAlignMode(unsigned AlignPow2) override;
78  void EmitBundleLock(bool AlignToEnd) override;
79  void EmitBundleUnlock() override;
80 
81 private:
82  bool isBundleLocked() const;
83  void EmitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &) override;
84  void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo &) override;
85 
86  void fixSymbolsInTLSFixups(const MCExpr *expr);
87  void finalizeCGProfileEntry(const MCSymbolRefExpr *&S);
88  void finalizeCGProfile();
89 
90  /// Merge the content of the fragment \p EF into the fragment \p DF.
91  void mergeFragment(MCDataFragment *, MCDataFragment *);
92 
93  bool SeenIdent = false;
94 
95  /// BundleGroups - The stack of fragments holding the bundle-locked
96  /// instructions.
98 };
99 
101  std::unique_ptr<MCAsmBackend> TAB,
102  std::unique_ptr<MCObjectWriter> OW,
103  std::unique_ptr<MCCodeEmitter> Emitter,
104  bool RelaxAll, bool IsThumb);
105 
106 } // end namespace llvm
107 
108 #endif // LLVM_MC_MCELFSTREAMER_H
void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override
Emit a local common (.lcomm) symbol.
void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count) override
Instances of this class represent a uniqued identifier for a section in the current translation unit...
Definition: MCSection.h:38
~MCELFStreamer() override=default
void EmitBundleAlignMode(unsigned AlignPow2) override
Set the bundle alignment mode from now on in the section.
LLVMContext & Context
This class represents lattice values for constants.
Definition: AllocatorList.h:23
void reset() override
state management
Definition: MCELFStreamer.h:32
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
void EmitBundleUnlock() override
Ends a bundle-locked group.
void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override
Emit an ELF .size directive.
F(f)
void EmitZerofill(MCSection *Section, MCSymbol *Symbol=nullptr, uint64_t Size=0, unsigned ByteAlignment=0, SMLoc L=SMLoc()) override
Emit the zerofill section and an optional symbol.
void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override
Emit an weak reference from Alias to Symbol.
void EmitIdent(StringRef IdentString) override
Emit the "identifiers" directive.
void InitSections(bool NoExecStack) override
Create the default sections and set the initial one.
void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment=0) override
Emit a thread local bss (.tbss) symbol.
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:173
void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override
Set the DescValue for the Symbol.
void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
Context object for machine code objects.
Definition: MCContext.h:65
void EmitThumbFunc(MCSymbol *Func) override
Note in the output that the specified Func is a Thumb mode function (ARM target only).
Streaming object file generation interface.
void EmitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc()) override
Emit the expression Value into the output as a native integer of the given Size bytes.
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:158
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Definition: MCInstrDesc.h:131
void ChangeSection(MCSection *Section, const MCExpr *Subsection) override
Update streamer for a new active section.
void emitELFSymverDirective(StringRef AliasName, const MCSymbol *Aliasee) override
Emit an ELF .symver directive.
void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override
Emit a common symbol.
MCELFStreamer * createARMELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter, bool RelaxAll, bool IsThumb)
BlockVerifier::State From
This is a &#39;vector&#39; (really, a variable-sized array), optimized for the case when the array is small...
Definition: SmallVector.h:837
MCSymbolAttr
Definition: MCDirectives.h:18
MCELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
MCAssemblerFlag
Definition: MCDirectives.h:48
void reset() override
state management
Generic base class for all target subtargets.
uint32_t Size
Definition: Profile.cpp:46
void EmitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
Fragment for data and encoded instructions.
Definition: MCFragment.h:243
void EmitBundleLock(bool AlignToEnd) override
The following instructions are a bundle-locked group.
LLVM Value Representation.
Definition: Value.h:73
void EmitAssemblerFlag(MCAssemblerFlag Flag) override
Note in the output the specified Flag.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:48
Represents a location in source code.
Definition: SMLoc.h:23
void FinishImpl() override
Streamer specific finalization.