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" 14 #include "llvm/MC/MCObjectStreamer.h" 15 16 namespace llvm { 17 18 class MCAsmBackend; 19 class MCCodeEmitter; 20 class MCExpr; 21 class MCInst; 22 23 class MCELFStreamer : public MCObjectStreamer { 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 reset()32 void reset() override { 33 SeenIdent = false; 34 BundleGroups.clear(); 35 MCObjectStreamer::reset(); 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 EmitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment *F, 45 uint64_t Offset) override; 46 void EmitAssemblerFlag(MCAssemblerFlag Flag) override; 47 void EmitThumbFunc(MCSymbol *Func) override; 48 void EmitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override; 49 bool EmitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override; 50 void EmitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override; 51 void EmitCommonSymbol(MCSymbol *Symbol, uint64_t Size, 52 unsigned ByteAlignment) override; 53 54 void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override; 55 void emitELFSymverDirective(StringRef AliasName, 56 const MCSymbol *Aliasee) override; 57 58 void EmitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, 59 unsigned ByteAlignment) override; 60 61 void EmitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr, 62 uint64_t Size = 0, unsigned ByteAlignment = 0, 63 SMLoc L = SMLoc()) override; 64 void EmitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, 65 unsigned ByteAlignment = 0) override; 66 void EmitValueImpl(const MCExpr *Value, unsigned Size, 67 SMLoc Loc = SMLoc()) override; 68 69 void EmitIdent(StringRef IdentString) override; 70 71 void EmitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override; 72 73 void emitCGProfileEntry(const MCSymbolRefExpr *From, 74 const MCSymbolRefExpr *To, uint64_t Count) override; 75 76 void FinishImpl() override; 77 78 void EmitBundleAlignMode(unsigned AlignPow2) override; 79 void EmitBundleLock(bool AlignToEnd) override; 80 void EmitBundleUnlock() override; 81 82 private: 83 bool isBundleLocked() const; 84 void EmitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &) override; 85 void EmitInstToData(const MCInst &Inst, const MCSubtargetInfo &) override; 86 87 void fixSymbolsInTLSFixups(const MCExpr *expr); 88 void finalizeCGProfileEntry(const MCSymbolRefExpr *&S); 89 void finalizeCGProfile(); 90 91 /// Merge the content of the fragment \p EF into the fragment \p DF. 92 void mergeFragment(MCDataFragment *, MCDataFragment *); 93 94 bool SeenIdent = false; 95 96 /// BundleGroups - The stack of fragments holding the bundle-locked 97 /// instructions. 98 SmallVector<MCDataFragment *, 4> BundleGroups; 99 }; 100 101 MCELFStreamer *createARMELFStreamer(MCContext &Context, 102 std::unique_ptr<MCAsmBackend> TAB, 103 std::unique_ptr<MCObjectWriter> OW, 104 std::unique_ptr<MCCodeEmitter> Emitter, 105 bool RelaxAll, bool IsThumb, bool IsAndroid); 106 107 } // end namespace llvm 108 109 #endif // LLVM_MC_MCELFSTREAMER_H 110