MCELFStreamer.h revision 360784
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 16namespace llvm { 17 18class MCAsmBackend; 19class MCCodeEmitter; 20class MCExpr; 21class MCInst; 22 23class MCELFStreamer : public MCObjectStreamer { 24public: 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(); 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 82private: 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 101MCELFStreamer *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