LLVM 22.0.0git
MCELFStreamer.cpp
Go to the documentation of this file.
1//===- lib/MC/MCELFStreamer.cpp - ELF Object Output -----------------------===//
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// This file assembles .s files and emits ELF .o object files.
10//
11//===----------------------------------------------------------------------===//
12
17#include "llvm/MC/MCAsmInfo.h"
18#include "llvm/MC/MCAssembler.h"
20#include "llvm/MC/MCContext.h"
23#include "llvm/MC/MCExpr.h"
24#include "llvm/MC/MCFixup.h"
27#include "llvm/MC/MCSection.h"
29#include "llvm/MC/MCStreamer.h"
30#include "llvm/MC/MCSymbol.h"
31#include "llvm/MC/MCSymbolELF.h"
34#include "llvm/Support/LEB128.h"
35#include <cassert>
36#include <cstdint>
37
38using namespace llvm;
39
41 std::unique_ptr<MCAsmBackend> TAB,
42 std::unique_ptr<MCObjectWriter> OW,
43 std::unique_ptr<MCCodeEmitter> Emitter)
44 : MCObjectStreamer(Context, std::move(TAB), std::move(OW),
45 std::move(Emitter)) {}
46
50
51void MCELFStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
52 MCContext &Ctx = getContext();
53 switchSection(Ctx.getObjectFileInfo()->getTextSection());
54 emitCodeAlignment(Align(Ctx.getObjectFileInfo()->getTextSectionAlignment()),
55 &STI);
56
57 if (NoExecStack)
58 switchSection(Ctx.getAsmInfo()->getStackSection(Ctx, /*Exec=*/false));
59}
60
62 auto *Symbol = static_cast<MCSymbolELF *>(S);
64
65 const MCSectionELF &Section =
66 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
67 if (Section.getFlags() & ELF::SHF_TLS)
68 Symbol->setType(ELF::STT_TLS);
69}
70
73 auto *Symbol = static_cast<MCSymbolELF *>(S);
75
76 const MCSectionELF &Section =
77 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
78 if (Section.getFlags() & ELF::SHF_TLS)
79 Symbol->setType(ELF::STT_TLS);
80}
81
84 auto *SectionELF = static_cast<const MCSectionELF *>(Section);
85 const MCSymbol *Grp = SectionELF->getGroup();
86 if (Grp)
87 Asm.registerSymbol(*Grp);
88 if (SectionELF->getFlags() & ELF::SHF_GNU_RETAIN)
90
91 MCObjectStreamer::changeSection(Section, Subsection);
92 auto *Sym = static_cast<MCSymbolELF *>(Section->getBeginSymbol());
94 Sym->setType(ELF::STT_SECTION);
95}
96
98 auto *A = static_cast<MCSymbolELF *>(Alias);
99 if (A->isDefined()) {
100 getContext().reportError(getStartTokLoc(), "symbol '" + A->getName() +
101 "' is already defined");
102 return;
103 }
104 A->setVariableValue(MCSymbolRefExpr::create(Target, getContext()));
105 A->setIsWeakref();
106 getWriter().Weakrefs.push_back(A);
107}
108
109// When GNU as encounters more than one .type declaration for an object it seems
110// to use a mechanism similar to the one below to decide which type is actually
111// used in the object file. The greater of T1 and T2 is selected based on the
112// following ordering:
113// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
114// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
115// provided type).
116static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
119 if (T1 == Type)
120 return T2;
121 if (T2 == Type)
122 return T1;
123 }
124
125 return T2;
126}
127
129 auto *Symbol = static_cast<MCSymbolELF *>(S);
130
131 // Adding a symbol attribute always introduces the symbol, note that an
132 // important side effect of calling registerSymbol here is to register
133 // the symbol with the assembler.
134 getAssembler().registerSymbol(*Symbol);
135
136 // The implementation of symbol attributes is designed to match 'as', but it
137 // leaves much to desired. It doesn't really make sense to arbitrarily add and
138 // remove flags, but 'as' allows this (in particular, see .desc).
139 //
140 // In the future it might be worth trying to make these operations more well
141 // defined.
142 switch (Attribute) {
143 case MCSA_Cold:
144 case MCSA_Extern:
146 case MCSA_Reference:
151 case MCSA_Invalid:
153 case MCSA_Exported:
154 case MCSA_WeakAntiDep:
155 case MCSA_OSLinkage:
156 case MCSA_XPLinkage:
157 return false;
158
159 case MCSA_NoDeadStrip:
160 // Ignore for now.
161 break;
162
164 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
165 Symbol->setBinding(ELF::STB_GNU_UNIQUE);
167 break;
168
169 case MCSA_Global:
170 // For `.weak x; .global x`, GNU as sets the binding to STB_WEAK while we
171 // traditionally set the binding to STB_GLOBAL. This is error-prone, so we
172 // error on such cases. Note, we also disallow changed binding from .local.
173 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL)
175 Symbol->getName() +
176 " changed binding to STB_GLOBAL");
177 Symbol->setBinding(ELF::STB_GLOBAL);
178 break;
179
181 case MCSA_Weak:
182 // For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK.
183 // We emit a warning for now but may switch to an error in the future.
184 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK)
186 getStartTokLoc(), Symbol->getName() + " changed binding to STB_WEAK");
187 Symbol->setBinding(ELF::STB_WEAK);
188 break;
189
190 case MCSA_Local:
191 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL)
193 Symbol->getName() +
194 " changed binding to STB_LOCAL");
195 Symbol->setBinding(ELF::STB_LOCAL);
196 break;
197
199 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC));
200 break;
201
203 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC));
205 break;
206
208 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
209 break;
210
211 case MCSA_ELF_TypeTLS:
212 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS));
213 break;
214
216 // TODO: Emit these as a common symbol.
217 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
218 break;
219
221 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE));
222 break;
223
224 case MCSA_Protected:
225 Symbol->setVisibility(ELF::STV_PROTECTED);
226 break;
227
228 case MCSA_Memtag:
229 Symbol->setMemtag(true);
230 break;
231
232 case MCSA_Hidden:
233 Symbol->setVisibility(ELF::STV_HIDDEN);
234 break;
235
236 case MCSA_Internal:
237 Symbol->setVisibility(ELF::STV_INTERNAL);
238 break;
239
240 case MCSA_AltEntry:
241 llvm_unreachable("ELF doesn't support the .alt_entry attribute");
242
243 case MCSA_LGlobal:
244 llvm_unreachable("ELF doesn't support the .lglobl attribute");
245 }
246
247 return true;
248}
249
251 Align ByteAlignment) {
252 auto *Symbol = static_cast<MCSymbolELF *>(S);
253 getAssembler().registerSymbol(*Symbol);
254
255 if (!Symbol->isBindingSet())
256 Symbol->setBinding(ELF::STB_GLOBAL);
257
258 Symbol->setType(ELF::STT_OBJECT);
259
260 if (Symbol->getBinding() == ELF::STB_LOCAL) {
264 switchSection(&Section);
265
266 emitValueToAlignment(ByteAlignment, 0, 1, 0);
267 emitLabel(Symbol);
269
270 switchSection(P.first, P.second);
271 } else {
272 if (Symbol->declareCommon(Size, ByteAlignment))
273 report_fatal_error(Twine("Symbol: ") + Symbol->getName() +
274 " redeclared as different type");
275 }
276
277 Symbol->setSize(MCConstantExpr::create(Size, getContext()));
278}
279
281 static_cast<MCSymbolELF *>(Symbol)->setSize(Value);
282}
283
285 StringRef Name,
286 bool KeepOriginalSym) {
288 getStartTokLoc(), OriginalSym, Name, KeepOriginalSym});
289}
290
292 Align ByteAlignment) {
293 auto *Symbol = static_cast<MCSymbolELF *>(S);
294 // FIXME: Should this be caught and done earlier?
295 getAssembler().registerSymbol(*Symbol);
296 Symbol->setBinding(ELF::STB_LOCAL);
297 emitCommonSymbol(Symbol, Size, ByteAlignment);
298}
299
301 const MCSymbolRefExpr *To,
302 uint64_t Count) {
303 getWriter().getCGProfile().push_back({From, To, Count});
304}
305
309 pushSection();
310 switchSection(Comment);
311 if (!SeenIdent) {
312 emitInt8(0);
313 SeenIdent = true;
314 }
315 emitBytes(IdentString);
316 emitInt8(0);
317 popSection();
318}
319
320void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *Sym,
322 const MCSymbolRefExpr *&SRE) {
323 const MCSymbol *S = &SRE->getSymbol();
324 if (S->isTemporary()) {
325 if (!S->isInSection()) {
327 SRE->getLoc(), Twine("Reference to undefined temporary symbol ") +
328 "`" + S->getName() + "`");
329 return;
330 }
331 S = S->getSection().getBeginSymbol();
332 S->setUsedInReloc();
333 SRE = MCSymbolRefExpr::create(S, getContext(), SRE->getLoc());
334 }
337 MCObjectStreamer::emitRelocDirective(*O, "BFD_RELOC_NONE", SRE);
338}
339
340void MCELFStreamer::finalizeCGProfile() {
341 ELFObjectWriter &W = getWriter();
342 if (W.getCGProfile().empty())
343 return;
344 MCSection *CGProfile = getAssembler().getContext().getELFSection(
345 ".llvm.call-graph-profile", ELF::SHT_LLVM_CALL_GRAPH_PROFILE,
346 ELF::SHF_EXCLUDE, /*sizeof(Elf_CGProfile_Impl<>)=*/8);
347 pushSection();
348 switchSection(CGProfile);
349 uint64_t Offset = 0;
350 auto *Sym =
352 for (auto &E : W.getCGProfile()) {
353 finalizeCGProfileEntry(Sym, Offset, E.From);
354 finalizeCGProfileEntry(Sym, Offset, E.To);
355 emitIntValue(E.Count, sizeof(uint64_t));
356 Offset += sizeof(uint64_t);
357 }
358 popSection();
359}
360
362 // Emit the .gnu attributes section if any attributes have been added.
363 if (!GNUAttributes.empty()) {
364 MCSection *DummyAttributeSection = nullptr;
365 createAttributesSection("gnu", ".gnu.attributes", ELF::SHT_GNU_ATTRIBUTES,
366 DummyAttributeSection, GNUAttributes);
367 }
368
369 finalizeCGProfile();
370 emitFrames();
371
373}
374
376 bool OverwriteExisting) {
377 // Look for existing attribute item
378 if (AttributeItem *Item = getAttributeItem(Attribute)) {
379 if (!OverwriteExisting)
380 return;
382 Item->IntValue = Value;
383 return;
384 }
385
386 // Create new attribute item
388 std::string(StringRef(""))};
389 Contents.push_back(Item);
390}
391
393 bool OverwriteExisting) {
394 // Look for existing attribute item
395 if (AttributeItem *Item = getAttributeItem(Attribute)) {
396 if (!OverwriteExisting)
397 return;
398 Item->Type = AttributeItem::TextAttribute;
399 Item->StringValue = std::string(Value);
400 return;
401 }
402
403 // Create new attribute item
405 std::string(Value)};
406 Contents.push_back(Item);
407}
408
409void MCELFStreamer::setAttributeItems(unsigned Attribute, unsigned IntValue,
410 StringRef StringValue,
411 bool OverwriteExisting) {
412 // Look for existing attribute item
413 if (AttributeItem *Item = getAttributeItem(Attribute)) {
414 if (!OverwriteExisting)
415 return;
417 Item->IntValue = IntValue;
418 Item->StringValue = std::string(StringValue);
419 return;
420 }
421
422 // Create new attribute item
424 IntValue, std::string(StringValue)};
425 Contents.push_back(Item);
426}
427
429MCELFStreamer::getAttributeItem(unsigned Attribute) {
430 for (AttributeItem &Item : Contents)
431 if (Item.Tag == Attribute)
432 return &Item;
433 return nullptr;
434}
435
436size_t MCELFStreamer::calculateContentSize(
437 SmallVector<AttributeItem, 64> &AttrsVec) const {
438 size_t Result = 0;
439 for (const AttributeItem &Item : AttrsVec) {
440 switch (Item.Type) {
442 break;
444 Result += getULEB128Size(Item.Tag);
445 Result += getULEB128Size(Item.IntValue);
446 break;
448 Result += getULEB128Size(Item.Tag);
449 Result += Item.StringValue.size() + 1; // string + '\0'
450 break;
452 Result += getULEB128Size(Item.Tag);
453 Result += getULEB128Size(Item.IntValue);
454 Result += Item.StringValue.size() + 1; // string + '\0';
455 break;
456 }
457 }
458 return Result;
459}
460
461void MCELFStreamer::createAttributesSection(
462 StringRef Vendor, const Twine &Section, unsigned Type,
463 MCSection *&AttributeSection, SmallVector<AttributeItem, 64> &AttrsVec) {
464 // <format-version>
465 // [ <section-length> "vendor-name"
466 // [ <file-tag> <size> <attribute>*
467 // | <section-tag> <size> <section-number>* 0 <attribute>*
468 // | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
469 // ]+
470 // ]*
471
472 // Switch section to AttributeSection or get/create the section.
473 if (AttributeSection) {
474 switchSection(AttributeSection);
475 } else {
476 AttributeSection = getContext().getELFSection(Section, Type, 0);
477 switchSection(AttributeSection);
478
479 // Format version
480 emitInt8(0x41);
481 }
482
483 // Vendor size + Vendor name + '\0'
484 const size_t VendorHeaderSize = 4 + Vendor.size() + 1;
485
486 // Tag + Tag Size
487 const size_t TagHeaderSize = 1 + 4;
488
489 const size_t ContentsSize = calculateContentSize(AttrsVec);
490
491 emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize);
492 emitBytes(Vendor);
493 emitInt8(0); // '\0'
494
496 emitInt32(TagHeaderSize + ContentsSize);
497
498 // Size should have been accounted for already, now
499 // emit each field as its type (ULEB or String)
500 for (const AttributeItem &Item : AttrsVec) {
501 emitULEB128IntValue(Item.Tag);
502 switch (Item.Type) {
503 default:
504 llvm_unreachable("Invalid attribute type");
506 emitULEB128IntValue(Item.IntValue);
507 break;
509 emitBytes(Item.StringValue);
510 emitInt8(0); // '\0'
511 break;
513 emitULEB128IntValue(Item.IntValue);
514 emitBytes(Item.StringValue);
515 emitInt8(0); // '\0'
516 break;
517 }
518 }
519
520 AttrsVec.clear();
521}
522
523void MCELFStreamer::createAttributesWithSubsection(
524 MCSection *&AttributeSection, const Twine &Section, unsigned Type,
526 // <format-version: 'A'>
527 // [ <uint32: subsection-length> NTBS: vendor-name
528 // <bytes: vendor-data>
529 // ]*
530 // vendor-data expends to:
531 // <uint8: optional> <uint8: parameter type> <attribute>*
532 if (0 == SubSectionVec.size()) {
533 return;
534 }
535
536 // Switch section to AttributeSection or get/create the section.
537 if (AttributeSection) {
538 switchSection(AttributeSection);
539 } else {
540 AttributeSection = getContext().getELFSection(Section, Type, 0);
541 switchSection(AttributeSection);
542
543 // Format version
544 emitInt8(0x41);
545 }
546
547 for (AttributeSubSection &SubSection : SubSectionVec) {
548 // subsection-length + vendor-name + '\0'
549 const size_t VendorHeaderSize = 4 + SubSection.VendorName.size() + 1;
550 // optional + parameter-type
551 const size_t VendorParameters = 1 + 1;
552 const size_t ContentsSize = calculateContentSize(SubSection.Content);
553
554 emitInt32(VendorHeaderSize + VendorParameters + ContentsSize);
555 emitBytes(SubSection.VendorName);
556 emitInt8(0); // '\0'
557 emitInt8(SubSection.IsOptional);
558 emitInt8(SubSection.ParameterType);
559
560 for (AttributeItem &Item : SubSection.Content) {
561 emitULEB128IntValue(Item.Tag);
562 switch (Item.Type) {
563 default:
564 assert(0 && "Invalid attribute type");
565 break;
567 emitULEB128IntValue(Item.IntValue);
568 break;
570 emitBytes(Item.StringValue);
571 emitInt8(0); // '\0'
572 break;
574 emitULEB128IntValue(Item.IntValue);
575 emitBytes(Item.StringValue);
576 emitInt8(0); // '\0'
577 break;
578 }
579 }
580 }
581 SubSectionVec.clear();
582}
583
585 std::unique_ptr<MCAsmBackend> &&MAB,
586 std::unique_ptr<MCObjectWriter> &&OW,
587 std::unique_ptr<MCCodeEmitter> &&CE) {
588 MCELFStreamer *S =
589 new MCELFStreamer(Context, std::move(MAB), std::move(OW), std::move(CE));
590 return S;
591}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
dxil DXContainer Global Emitter
static unsigned CombineSymbolTypes(unsigned T1, unsigned T2)
#define F(x, y, z)
Definition MD5.cpp:54
#define T1
#define P(N)
This file defines the SmallVector class.
Functions, function parameters, and return types can have attributes to indicate how they should be t...
Definition Attributes.h:69
SmallVector< const MCSymbolELF *, 0 > Weakrefs
SmallVector< Symver, 0 > Symvers
MCContext & getContext() const
MCObjectWriter & getWriter() const
LLVM_ABI bool registerSymbol(const MCSymbol &Symbol)
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:343
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition MCExpr.cpp:212
Context object for machine code objects.
Definition MCContext.h:83
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition MCContext.h:553
LLVM_ABI void reportWarning(SMLoc L, const Twine &Msg)
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
SmallVector< AttributeItem, 64 > Contents
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void emitIdent(StringRef IdentString) override
Emit the "identifiers" directive.
void setAttributeItems(unsigned Attribute, unsigned IntValue, StringRef StringValue, bool OverwriteExisting)
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) override
Emit a common symbol.
void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) override
Emit a local common (.lcomm) symbol.
void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override
Emit an ELF .size directive.
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Target) override
Emit an weak reference from Alias to Symbol.
void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym) override
Emit an ELF .symver directive.
void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count) override
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment &F, uint64_t Offset) override
ELFObjectWriter & getWriter()
void setAttributeItem(unsigned Attribute, unsigned Value, bool OverwriteExisting)
void finishImpl() final
Streamer specific finalization.
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
void initSections(bool NoExecStack, const MCSubtargetInfo &STI) override
Create the default sections and set the initial one.
MCELFStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
Base class for the full range of assembler expressions which are needed for parsing.
Definition MCExpr.h:34
SMLoc getLoc() const
Definition MCExpr.h:86
void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
MCAssembler & getAssembler()
void emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc={}) override
Record a relocation described by the .reloc directive.
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCFragment &F, uint64_t Offset)
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
MCObjectStreamer(MCContext &Context, std::unique_ptr< MCAsmBackend > TAB, std::unique_ptr< MCObjectWriter > OW, std::unique_ptr< MCCodeEmitter > Emitter)
void finishImpl() override
Streamer specific finalization.
void changeSection(MCSection *Section, uint32_t Subsection=0) override
This is called by popSection and switchSection, if the current section changes.
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
SmallVector< CGProfileEntry, 0 > & getCGProfile()
This represents a section on linux, lots of unix variants and some bare metal systems.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:517
MCSymbol * getBeginSymbol()
Definition MCSection.h:589
Streaming machine code generation interface.
Definition MCStreamer.h:220
virtual bool popSection()
Restore the current and previous section from the section stack.
MCContext & getContext() const
Definition MCStreamer.h:314
SMLoc getStartTokLoc() const
Definition MCStreamer.h:306
virtual void emitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers.
void pushSection()
Save the current and previous section on the section stack.
Definition MCStreamer.h:443
unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo=0)
Special case of EmitULEB128Value that avoids the client having to pass in a MCExpr for constant integ...
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
void emitInt32(uint64_t Value)
Definition MCStreamer.h:750
MCSectionSubPair getCurrentSection() const
Return the current section that the streamer is emitting code to.
Definition MCStreamer.h:416
MCSection * getCurrentSectionOnly() const
Definition MCStreamer.h:421
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
void emitInt8(uint64_t Value)
Definition MCStreamer.h:748
Generic base class for all target subtargets.
void setBinding(unsigned Binding) const
Represent a reference to a symbol from inside an expression.
Definition MCExpr.h:190
const MCSymbol & getSymbol() const
Definition MCExpr.h:227
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
Definition MCExpr.h:214
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition MCSymbol.h:42
bool isInSection() const
isInSection - Check if this symbol is defined in some section (i.e., it is defined but not absolute).
Definition MCSymbol.h:237
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
void setUsedInReloc() const
Definition MCSymbol.h:198
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
Definition MCSymbol.h:251
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
Definition MCSymbol.h:205
Represents a location in source code.
Definition SMLoc.h:22
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
constexpr size_t size() const
size - Get the string size.
Definition StringRef.h:146
Target - Wrapper for Target specific information.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
LLVM Value Representation.
Definition Value.h:75
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ SHF_MERGE
Definition ELF.h:1254
@ SHF_STRINGS
Definition ELF.h:1257
@ SHF_EXCLUDE
Definition ELF.h:1282
@ SHF_ALLOC
Definition ELF.h:1248
@ SHF_GNU_RETAIN
Definition ELF.h:1279
@ SHF_WRITE
Definition ELF.h:1245
@ SHF_TLS
Definition ELF.h:1273
@ SHT_PROGBITS
Definition ELF.h:1147
@ SHT_LLVM_CALL_GRAPH_PROFILE
Definition ELF.h:1184
@ SHT_NOBITS
Definition ELF.h:1154
@ SHT_GNU_ATTRIBUTES
Definition ELF.h:1195
@ STB_GLOBAL
Definition ELF.h:1405
@ STB_LOCAL
Definition ELF.h:1404
@ STB_GNU_UNIQUE
Definition ELF.h:1407
@ STB_WEAK
Definition ELF.h:1406
@ STT_FUNC
Definition ELF.h:1418
@ STT_NOTYPE
Definition ELF.h:1416
@ STT_SECTION
Definition ELF.h:1419
@ STT_GNU_IFUNC
Definition ELF.h:1423
@ STT_OBJECT
Definition ELF.h:1417
@ STT_TLS
Definition ELF.h:1422
@ STV_INTERNAL
Definition ELF.h:1435
@ STV_HIDDEN
Definition ELF.h:1436
@ STV_PROTECTED
Definition ELF.h:1437
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:532
LLVM_ABI MCStreamer * createELFStreamer(MCContext &Ctx, std::unique_ptr< MCAsmBackend > &&TAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE)
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:167
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
LLVM_ABI unsigned getULEB128Size(uint64_t Value)
Utility function to get the size of the ULEB128-encoded value.
Definition LEB128.cpp:19
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1915
std::pair< MCSection *, uint32_t > MCSectionSubPair
Definition MCStreamer.h:66
@ MCSA_Local
.local (ELF)
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_Memtag
.memtag (ELF)
@ MCSA_Protected
.protected (ELF)
@ MCSA_OSLinkage
symbol uses OS linkage (GOFF)
@ MCSA_Exported
.globl _foo, exported (XCOFF)
@ MCSA_PrivateExtern
.private_extern (MachO)
@ MCSA_Internal
.internal (ELF)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_LazyReference
.lazy_reference (MachO)
@ MCSA_ELF_TypeNoType
.type _foo, STT_NOTYPE # aka @notype
@ MCSA_Reference
.reference (MachO)
@ MCSA_SymbolResolver
.symbol_resolver (MachO)
@ MCSA_Weak
.weak
@ MCSA_ELF_TypeTLS
.type _foo, STT_TLS # aka @tls_object
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_ELF_TypeCommon
.type _foo, STT_COMMON # aka @common
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_WeakAntiDep
.weak_anti_dep (COFF)
@ MCSA_XPLinkage
symbol uses XP linkage (GOFF)
@ MCSA_Extern
.extern (XCOFF)
@ MCSA_Cold
.cold (MachO)
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_ELF_TypeGnuUniqueObject
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
@ MCSA_Hidden
.hidden (ELF)
@ MCSA_LGlobal
.lglobl (XCOFF)
@ MCSA_Invalid
Not a valid directive.
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:870
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition Alignment.h:39
ELF object attributes section emission support.
ELF object attributes subsection support.