1 //===- MCELFStreamer.h - MCStreamer ELF Object File Interface ---*- C++ -*-===//
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
7 //===----------------------------------------------------------------------===//
9 #ifndef LLVM_MC_MCELFSTREAMER_H
10 #define LLVM_MC_MCELFSTREAMER_H
12 #include "llvm/ADT/SmallVector.h"
13 #include "llvm/MC/MCDirectives.h"
14 #include "llvm/MC/MCObjectStreamer.h"
23 class MCELFStreamer
: public MCObjectStreamer
{
25 MCELFStreamer(MCContext
&Context
, std::unique_ptr
<MCAsmBackend
> TAB
,
26 std::unique_ptr
<MCObjectWriter
> OW
,
27 std::unique_ptr
<MCCodeEmitter
> Emitter
);
29 ~MCELFStreamer() override
= default;
32 void reset() override
{
35 MCObjectStreamer::reset();
38 /// \name MCStreamer Interface
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
;
53 void emitELFSize(MCSymbol
*Symbol
, const MCExpr
*Value
) override
;
54 void emitELFSymverDirective(StringRef AliasName
,
55 const MCSymbol
*Aliasee
) override
;
57 void EmitLocalCommonSymbol(MCSymbol
*Symbol
, uint64_t Size
,
58 unsigned ByteAlignment
) override
;
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
;
68 void EmitIdent(StringRef IdentString
) override
;
70 void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override
;
72 void emitCGProfileEntry(const MCSymbolRefExpr
*From
,
73 const MCSymbolRefExpr
*To
, uint64_t Count
) override
;
75 void FinishImpl() override
;
77 void EmitBundleAlignMode(unsigned AlignPow2
) override
;
78 void EmitBundleLock(bool AlignToEnd
) override
;
79 void EmitBundleUnlock() override
;
82 bool isBundleLocked() const;
83 void EmitInstToFragment(const MCInst
&Inst
, const MCSubtargetInfo
&) override
;
84 void EmitInstToData(const MCInst
&Inst
, const MCSubtargetInfo
&) override
;
86 void fixSymbolsInTLSFixups(const MCExpr
*expr
);
87 void finalizeCGProfileEntry(const MCSymbolRefExpr
*&S
);
88 void finalizeCGProfile();
90 /// Merge the content of the fragment \p EF into the fragment \p DF.
91 void mergeFragment(MCDataFragment
*, MCDataFragment
*);
93 bool SeenIdent
= false;
95 /// BundleGroups - The stack of fragments holding the bundle-locked
97 SmallVector
<MCDataFragment
*, 4> BundleGroups
;
100 MCELFStreamer
*createARMELFStreamer(MCContext
&Context
,
101 std::unique_ptr
<MCAsmBackend
> TAB
,
102 std::unique_ptr
<MCObjectWriter
> OW
,
103 std::unique_ptr
<MCCodeEmitter
> Emitter
,
104 bool RelaxAll
, bool IsThumb
);
106 } // end namespace llvm
108 #endif // LLVM_MC_MCELFSTREAMER_H