LLVM  16.0.0git
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 MCContext;
19 class MCDataFragment;
20 class MCFragment;
21 class MCObjectWriter;
22 class MCSection;
23 class MCSubtargetInfo;
24 class MCSymbol;
25 class MCSymbolRefExpr;
26 class MCAsmBackend;
27 class MCCodeEmitter;
28 class MCExpr;
29 class MCInst;
30 
32 public:
33  MCELFStreamer(MCContext &Context, std::unique_ptr<MCAsmBackend> TAB,
34  std::unique_ptr<MCObjectWriter> OW,
35  std::unique_ptr<MCCodeEmitter> Emitter);
36 
37  ~MCELFStreamer() override = default;
38 
39  /// state management
40  void reset() override {
41  SeenIdent = false;
42  BundleGroups.clear();
44  }
45 
46  /// \name MCStreamer Interface
47  /// @{
48 
49  void initSections(bool NoExecStack, const MCSubtargetInfo &STI) override;
50  void changeSection(MCSection *Section, const MCExpr *Subsection) override;
51  void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc()) override;
53  uint64_t Offset) override;
54  void emitAssemblerFlag(MCAssemblerFlag Flag) override;
55  void emitThumbFunc(MCSymbol *Func) override;
56  void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override;
58  void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override;
60  unsigned ByteAlignment) override;
61 
62  void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override;
63  void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name,
64  bool KeepOriginalSym) override;
65 
67  unsigned ByteAlignment) override;
68 
69  void emitZerofill(MCSection *Section, MCSymbol *Symbol = nullptr,
70  uint64_t Size = 0, unsigned ByteAlignment = 0,
71  SMLoc L = SMLoc()) override;
72  void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size,
73  unsigned ByteAlignment = 0) override;
74  void emitValueImpl(const MCExpr *Value, unsigned Size,
75  SMLoc Loc = SMLoc()) override;
76 
77  void emitIdent(StringRef IdentString) override;
78 
79  void emitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override;
80 
82  const MCSymbolRefExpr *To, uint64_t Count) override;
83 
84  void finishImpl() override;
85 
86  void emitBundleAlignMode(unsigned AlignPow2) override;
87  void emitBundleLock(bool AlignToEnd) override;
88  void emitBundleUnlock() override;
89 
90  /// ELF object attributes section emission support
91  struct AttributeItem {
92  // This structure holds all attributes, accounting for their string /
93  // numeric value, so we can later emit them in declaration order, keeping
94  // all in the same vector.
95  enum {
100  } Type;
101  unsigned Tag;
102  unsigned IntValue;
103  std::string StringValue;
104  };
105 
106  // Attributes that are added and managed entirely by target.
108  void setAttributeItem(unsigned Attribute, unsigned Value,
109  bool OverwriteExisting);
110  void setAttributeItem(unsigned Attribute, StringRef Value,
111  bool OverwriteExisting);
112  void setAttributeItems(unsigned Attribute, unsigned IntValue,
113  StringRef StringValue, bool OverwriteExisting);
114  void emitAttributesSection(StringRef Vendor, const Twine &Section,
115  unsigned Type, MCSection *&AttributeSection) {
116  createAttributesSection(Vendor, Section, Type, AttributeSection, Contents);
117  }
118 
119 private:
120  AttributeItem *getAttributeItem(unsigned Attribute);
121  size_t calculateContentSize(SmallVector<AttributeItem, 64> &AttrsVec);
122  void createAttributesSection(StringRef Vendor, const Twine &Section,
123  unsigned Type, MCSection *&AttributeSection,
125 
126  // GNU attributes that will get emitted at the end of the asm file.
127  SmallVector<AttributeItem, 64> GNUAttributes;
128 
129 public:
130  void emitGNUAttribute(unsigned Tag, unsigned Value) override {
132  std::string(StringRef(""))};
133  GNUAttributes.push_back(Item);
134  }
135 
136 private:
137  bool isBundleLocked() const;
138  void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &) override;
139  void emitInstToData(const MCInst &Inst, const MCSubtargetInfo &) override;
140 
141  void fixSymbolsInTLSFixups(const MCExpr *expr);
142  void finalizeCGProfileEntry(const MCSymbolRefExpr *&S, uint64_t Offset);
143  void finalizeCGProfile();
144 
145  /// Merge the content of the fragment \p EF into the fragment \p DF.
146  void mergeFragment(MCDataFragment *, MCDataFragment *);
147 
148  bool SeenIdent = false;
149 
150  /// BundleGroups - The stack of fragments holding the bundle-locked
151  /// instructions.
153 };
154 
155 MCELFStreamer *createARMELFStreamer(MCContext &Context,
156  std::unique_ptr<MCAsmBackend> TAB,
157  std::unique_ptr<MCObjectWriter> OW,
158  std::unique_ptr<MCCodeEmitter> Emitter,
159  bool RelaxAll, bool IsThumb, bool IsAndroid);
160 
161 } // end namespace llvm
162 
163 #endif // LLVM_MC_MCELFSTREAMER_H
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
llvm::MCSymbol
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
llvm::MCELFStreamer::emitLabel
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
Definition: MCELFStreamer.cpp:100
llvm::MCContext
Context object for machine code objects.
Definition: MCContext.h:76
llvm::Attribute
Definition: Attributes.h:65
MCDirectives.h
llvm::MCELFStreamer::emitZerofill
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.
Definition: MCELFStreamer.cpp:726
llvm::SmallVector< AttributeItem, 64 >
llvm::MCELFStreamer::AttributeItem::TextAttribute
@ TextAttribute
Definition: MCELFStreamer.h:98
llvm::MCELFStreamer::changeSection
void changeSection(MCSection *Section, const MCExpr *Subsection) override
Update streamer for a new active section.
Definition: MCELFStreamer.cpp:147
llvm::MCELFStreamer::MCELFStreamer
MCELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
Definition: MCELFStreamer.cpp:42
llvm::Type
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
llvm::MCELFStreamer::emitTBSSSymbol
void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment=0) override
Emit a thread local bss (.tbss) symbol.
Definition: MCELFStreamer.cpp:732
llvm::MCInst
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
llvm::MCAssemblerFlag
MCAssemblerFlag
Definition: MCDirectives.h:51
llvm::dwarf::Tag
Tag
Definition: Dwarf.h:105
llvm::MCELFStreamer::reset
void reset() override
state management
Definition: MCELFStreamer.h:40
llvm::MCObjectStreamer::reset
void reset() override
state management
Definition: MCObjectStreamer.cpp:179
F
#define F(x, y, z)
Definition: MD5.cpp:55
llvm::MCSymbolAttr
MCSymbolAttr
Definition: MCDirectives.h:18
Context
LLVMContext & Context
Definition: NVVMIntrRange.cpp:66
MCObjectStreamer.h
llvm::MCFragment
Definition: MCFragment.h:30
llvm::MCELFStreamer::AttributeItem::HiddenAttribute
@ HiddenAttribute
Definition: MCELFStreamer.h:96
llvm::MCELFStreamer
Definition: MCELFStreamer.h:31
llvm::SMLoc
Represents a location in source code.
Definition: SMLoc.h:23
llvm::MCELFStreamer::~MCELFStreamer
~MCELFStreamer() override=default
llvm::MCELFStreamer::emitCGProfileEntry
void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count) override
Definition: MCELFStreamer.cpp:377
llvm::MCELFStreamer::AttributeItem::NumericAttribute
@ NumericAttribute
Definition: MCELFStreamer.h:97
llvm::MCObjectStreamer
Streaming object file generation interface.
Definition: MCObjectStreamer.h:42
llvm::MCELFStreamer::emitBundleLock
void emitBundleLock(bool AlignToEnd) override
The following instructions are a bundle-locked group.
Definition: MCELFStreamer.cpp:648
llvm::MCID::Flag
Flag
These should be considered private to the implementation of the MCInstrDesc class.
Definition: MCInstrDesc.h:147
llvm::MCELFStreamer::emitWeakReference
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override
Emit an weak reference from Alias to Symbol.
Definition: MCELFStreamer.cpp:167
llvm::MCELFStreamer::emitCommonSymbol
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override
Emit a common symbol.
Definition: MCELFStreamer.cpp:308
llvm::MCELFStreamer::AttributeItem::NumericAndTextAttributes
@ NumericAndTextAttributes
Definition: MCELFStreamer.h:99
llvm::MCELFStreamer::Contents
SmallVector< AttributeItem, 64 > Contents
Definition: MCELFStreamer.h:107
llvm::MCELFStreamer::emitLabelAtPos
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment *F, uint64_t Offset) override
Definition: MCELFStreamer.cpp:110
llvm::MCELFStreamer::emitValueToAlignment
void emitValueToAlignment(unsigned, int64_t, unsigned, unsigned) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
Definition: MCELFStreamer.cpp:367
llvm::MCELFStreamer::emitThumbFunc
void emitThumbFunc(MCSymbol *Func) override
Note in the output that the specified Func is a Thumb mode function (ARM target only).
Definition: MCELFStreamer.cpp:718
llvm::MCELFStreamer::finishImpl
void finishImpl() override
Streamer specific finalization.
Definition: MCELFStreamer.cpp:700
llvm::MCELFStreamer::emitELFSymverDirective
void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym) override
Emit an ELF .symver directive.
Definition: MCELFStreamer.cpp:343
llvm::MCELFStreamer::emitLocalCommonSymbol
void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, unsigned ByteAlignment) override
Emit a local common (.lcomm) symbol.
Definition: MCELFStreamer.cpp:350
uint64_t
llvm::MCELFStreamer::emitIdent
void emitIdent(StringRef IdentString) override
Emit the "identifiers" directive.
Definition: MCELFStreamer.cpp:383
llvm::MCELFStreamer::emitSymbolDesc
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override
Set the DescValue for the Symbol.
Definition: MCELFStreamer.cpp:722
llvm::MCELFStreamer::AttributeItem::IntValue
unsigned IntValue
Definition: MCELFStreamer.h:102
llvm::MCSymbolRefExpr
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:192
llvm::createARMELFStreamer
MCELFStreamer * createARMELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter, bool RelaxAll, bool IsThumb, bool IsAndroid)
Definition: ARMELFStreamer.cpp:1483
llvm::MCELFStreamer::setAttributeItem
void setAttributeItem(unsigned Attribute, unsigned Value, bool OverwriteExisting)
Definition: MCELFStreamer.cpp:737
llvm::MCELFStreamer::emitValueImpl
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.
Definition: MCELFStreamer.cpp:359
llvm::StringRef
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
llvm::MCELFStreamer::setAttributeItems
void setAttributeItems(unsigned Attribute, unsigned IntValue, StringRef StringValue, bool OverwriteExisting)
Definition: MCELFStreamer.cpp:771
llvm::MCELFStreamer::emitGNUAttribute
void emitGNUAttribute(unsigned Tag, unsigned Value) override
Emit a .gnu_attribute directive.
Definition: MCELFStreamer.h:130
llvm::MCSection
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:39
S
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
Definition: README.txt:210
llvm::MCELFStreamer::AttributeItem
ELF object attributes section emission support.
Definition: MCELFStreamer.h:91
llvm::Twine
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
llvm::MCELFStreamer::emitBundleAlignMode
void emitBundleAlignMode(unsigned AlignPow2) override
Set the bundle alignment mode from now on in the section.
Definition: MCELFStreamer.cpp:638
llvm::GraphProgram::Name
Name
Definition: GraphWriter.h:50
llvm::MCELFStreamer::AttributeItem::Type
enum llvm::MCELFStreamer::AttributeItem::@313 Type
llvm::MCELFStreamer::emitSymbolAttribute
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
Definition: MCELFStreamer.cpp:193
llvm::TargetStackID::Value
Value
Definition: TargetFrameLowering.h:27
llvm::MCELFStreamer::emitAssemblerFlag
void emitAssemblerFlag(MCAssemblerFlag Flag) override
Note in the output the specified Flag.
Definition: MCELFStreamer.cpp:121
llvm::LCOMM::ByteAlignment
@ ByteAlignment
Definition: MCAsmInfo.h:50
llvm::ARMBuildAttrs::Symbol
@ Symbol
Definition: ARMBuildAttributes.h:83
SmallVector.h
llvm::MCELFStreamer::emitELFSize
void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override
Emit an ELF .size directive.
Definition: MCELFStreamer.cpp:339
llvm::MCELFStreamer::emitBundleUnlock
void emitBundleUnlock() override
Ends a bundle-locked group.
Definition: MCELFStreamer.cpp:667
llvm::MCELFStreamer::AttributeItem::Tag
unsigned Tag
Definition: MCELFStreamer.h:101
llvm::MCELFStreamer::initSections
void initSections(bool NoExecStack, const MCSubtargetInfo &STI) override
Create the default sections and set the initial one.
Definition: MCELFStreamer.cpp:91
From
BlockVerifier::State From
Definition: BlockVerifier.cpp:55
llvm::MCDataFragment
Fragment for data and encoded instructions.
Definition: MCFragment.h:241
llvm::MCELFStreamer::AttributeItem::StringValue
std::string StringValue
Definition: MCELFStreamer.h:103
llvm::MCSubtargetInfo
Generic base class for all target subtargets.
Definition: MCSubtargetInfo.h:76
llvm::Value
LLVM Value Representation.
Definition: Value.h:74
llvm::MCExpr
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:35
llvm::MCELFStreamer::emitAttributesSection
void emitAttributesSection(StringRef Vendor, const Twine &Section, unsigned Type, MCSection *&AttributeSection)
Definition: MCELFStreamer.h:114
llvm::ISD::MCSymbol
@ MCSymbol
Definition: ISDOpcodes.h:172