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"
22#include "llvm/MC/MCExpr.h"
23#include "llvm/MC/MCFixup.h"
26#include "llvm/MC/MCSection.h"
28#include "llvm/MC/MCStreamer.h"
29#include "llvm/MC/MCSymbol.h"
30#include "llvm/MC/MCSymbolELF.h"
33#include "llvm/Support/LEB128.h"
34#include <cassert>
35#include <cstdint>
36
37using namespace llvm;
38
40 std::unique_ptr<MCAsmBackend> TAB,
41 std::unique_ptr<MCObjectWriter> OW,
42 std::unique_ptr<MCCodeEmitter> Emitter)
43 : MCObjectStreamer(Context, std::move(TAB), std::move(OW),
44 std::move(Emitter)) {}
45
49
50void MCELFStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
51 MCContext &Ctx = getContext();
52 switchSection(Ctx.getObjectFileInfo()->getTextSection());
53 emitCodeAlignment(Align(Ctx.getObjectFileInfo()->getTextSectionAlignment()),
54 &STI);
55
56 if (NoExecStack)
57 switchSection(Ctx.getAsmInfo()->getStackSection(Ctx, /*Exec=*/false));
58}
59
61 auto *Symbol = static_cast<MCSymbolELF *>(S);
63
64 const MCSectionELF &Section =
65 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
66 if (Section.getFlags() & ELF::SHF_TLS)
67 Symbol->setType(ELF::STT_TLS);
68}
69
72 auto *Symbol = static_cast<MCSymbolELF *>(S);
74
75 const MCSectionELF &Section =
76 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
77 if (Section.getFlags() & ELF::SHF_TLS)
78 Symbol->setType(ELF::STT_TLS);
79}
80
83 auto *SectionELF = static_cast<const MCSectionELF *>(Section);
84 const MCSymbol *Grp = SectionELF->getGroup();
85 if (Grp)
86 Asm.registerSymbol(*Grp);
87 if (SectionELF->getFlags() & ELF::SHF_GNU_RETAIN)
89
90 MCObjectStreamer::changeSection(Section, Subsection);
91 auto *Sym = static_cast<MCSymbolELF *>(Section->getBeginSymbol());
93 Sym->setType(ELF::STT_SECTION);
94}
95
97 auto *A = static_cast<MCSymbolELF *>(Alias);
98 if (A->isDefined()) {
99 getContext().reportError(getStartTokLoc(), "symbol '" + A->getName() +
100 "' is already defined");
101 return;
102 }
103 A->setVariableValue(MCSymbolRefExpr::create(Target, getContext()));
104 A->setIsWeakref();
105 getWriter().Weakrefs.push_back(A);
106}
107
108// When GNU as encounters more than one .type declaration for an object it seems
109// to use a mechanism similar to the one below to decide which type is actually
110// used in the object file. The greater of T1 and T2 is selected based on the
111// following ordering:
112// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
113// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
114// provided type).
115static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
118 if (T1 == Type)
119 return T2;
120 if (T2 == Type)
121 return T1;
122 }
123
124 return T2;
125}
126
128 auto *Symbol = static_cast<MCSymbolELF *>(S);
129
130 // Adding a symbol attribute always introduces the symbol, note that an
131 // important side effect of calling registerSymbol here is to register
132 // the symbol with the assembler.
133 getAssembler().registerSymbol(*Symbol);
134
135 // The implementation of symbol attributes is designed to match 'as', but it
136 // leaves much to desired. It doesn't really make sense to arbitrarily add and
137 // remove flags, but 'as' allows this (in particular, see .desc).
138 //
139 // In the future it might be worth trying to make these operations more well
140 // defined.
141 switch (Attribute) {
142 case MCSA_Cold:
143 case MCSA_Extern:
145 case MCSA_Reference:
150 case MCSA_Invalid:
152 case MCSA_Exported:
153 case MCSA_WeakAntiDep:
154 return false;
155
156 case MCSA_NoDeadStrip:
157 // Ignore for now.
158 break;
159
161 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
162 Symbol->setBinding(ELF::STB_GNU_UNIQUE);
164 break;
165
166 case MCSA_Global:
167 // For `.weak x; .global x`, GNU as sets the binding to STB_WEAK while we
168 // traditionally set the binding to STB_GLOBAL. This is error-prone, so we
169 // error on such cases. Note, we also disallow changed binding from .local.
170 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL)
172 Symbol->getName() +
173 " changed binding to STB_GLOBAL");
174 Symbol->setBinding(ELF::STB_GLOBAL);
175 break;
176
178 case MCSA_Weak:
179 // For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK.
180 // We emit a warning for now but may switch to an error in the future.
181 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK)
183 getStartTokLoc(), Symbol->getName() + " changed binding to STB_WEAK");
184 Symbol->setBinding(ELF::STB_WEAK);
185 break;
186
187 case MCSA_Local:
188 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL)
190 Symbol->getName() +
191 " changed binding to STB_LOCAL");
192 Symbol->setBinding(ELF::STB_LOCAL);
193 break;
194
196 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC));
197 break;
198
200 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC));
202 break;
203
205 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
206 break;
207
208 case MCSA_ELF_TypeTLS:
209 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS));
210 break;
211
213 // TODO: Emit these as a common symbol.
214 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
215 break;
216
218 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE));
219 break;
220
221 case MCSA_Protected:
222 Symbol->setVisibility(ELF::STV_PROTECTED);
223 break;
224
225 case MCSA_Memtag:
226 Symbol->setMemtag(true);
227 break;
228
229 case MCSA_Hidden:
230 Symbol->setVisibility(ELF::STV_HIDDEN);
231 break;
232
233 case MCSA_Internal:
234 Symbol->setVisibility(ELF::STV_INTERNAL);
235 break;
236
237 case MCSA_AltEntry:
238 llvm_unreachable("ELF doesn't support the .alt_entry attribute");
239
240 case MCSA_LGlobal:
241 llvm_unreachable("ELF doesn't support the .lglobl attribute");
242 }
243
244 return true;
245}
246
248 Align ByteAlignment) {
249 auto *Symbol = static_cast<MCSymbolELF *>(S);
250 getAssembler().registerSymbol(*Symbol);
251
252 if (!Symbol->isBindingSet())
253 Symbol->setBinding(ELF::STB_GLOBAL);
254
255 Symbol->setType(ELF::STT_OBJECT);
256
257 if (Symbol->getBinding() == ELF::STB_LOCAL) {
261 switchSection(&Section);
262
263 emitValueToAlignment(ByteAlignment, 0, 1, 0);
264 emitLabel(Symbol);
266
267 switchSection(P.first, P.second);
268 } else {
269 if (Symbol->declareCommon(Size, ByteAlignment))
270 report_fatal_error(Twine("Symbol: ") + Symbol->getName() +
271 " redeclared as different type");
272 }
273
274 Symbol->setSize(MCConstantExpr::create(Size, getContext()));
275}
276
278 static_cast<MCSymbolELF *>(Symbol)->setSize(Value);
279}
280
282 StringRef Name,
283 bool KeepOriginalSym) {
285 getStartTokLoc(), OriginalSym, Name, KeepOriginalSym});
286}
287
289 Align ByteAlignment) {
290 auto *Symbol = static_cast<MCSymbolELF *>(S);
291 // FIXME: Should this be caught and done earlier?
292 getAssembler().registerSymbol(*Symbol);
293 Symbol->setBinding(ELF::STB_LOCAL);
294 emitCommonSymbol(Symbol, Size, ByteAlignment);
295}
296
298 const MCSymbolRefExpr *To,
299 uint64_t Count) {
300 getWriter().getCGProfile().push_back({From, To, Count});
301}
302
306 pushSection();
307 switchSection(Comment);
308 if (!SeenIdent) {
309 emitInt8(0);
310 SeenIdent = true;
311 }
312 emitBytes(IdentString);
313 emitInt8(0);
314 popSection();
315}
316
317void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *Sym,
319 const MCSymbolRefExpr *&SRE) {
320 const MCSymbol *S = &SRE->getSymbol();
321 if (S->isTemporary()) {
322 if (!S->isInSection()) {
324 SRE->getLoc(), Twine("Reference to undefined temporary symbol ") +
325 "`" + S->getName() + "`");
326 return;
327 }
328 S = S->getSection().getBeginSymbol();
329 S->setUsedInReloc();
330 SRE = MCSymbolRefExpr::create(S, getContext(), SRE->getLoc());
331 }
334 MCObjectStreamer::emitRelocDirective(*O, "BFD_RELOC_NONE", SRE);
335}
336
337void MCELFStreamer::finalizeCGProfile() {
338 ELFObjectWriter &W = getWriter();
339 if (W.getCGProfile().empty())
340 return;
341 MCSection *CGProfile = getAssembler().getContext().getELFSection(
342 ".llvm.call-graph-profile", ELF::SHT_LLVM_CALL_GRAPH_PROFILE,
343 ELF::SHF_EXCLUDE, /*sizeof(Elf_CGProfile_Impl<>)=*/8);
344 pushSection();
345 switchSection(CGProfile);
346 uint64_t Offset = 0;
347 auto *Sym =
349 for (auto &E : W.getCGProfile()) {
350 finalizeCGProfileEntry(Sym, Offset, E.From);
351 finalizeCGProfileEntry(Sym, Offset, E.To);
352 emitIntValue(E.Count, sizeof(uint64_t));
353 Offset += sizeof(uint64_t);
354 }
355 popSection();
356}
357
359 // Emit the .gnu attributes section if any attributes have been added.
360 if (!GNUAttributes.empty()) {
361 MCSection *DummyAttributeSection = nullptr;
362 createAttributesSection("gnu", ".gnu.attributes", ELF::SHT_GNU_ATTRIBUTES,
363 DummyAttributeSection, GNUAttributes);
364 }
365
366 finalizeCGProfile();
367 emitFrames();
368
370}
371
373 bool OverwriteExisting) {
374 // Look for existing attribute item
375 if (AttributeItem *Item = getAttributeItem(Attribute)) {
376 if (!OverwriteExisting)
377 return;
379 Item->IntValue = Value;
380 return;
381 }
382
383 // Create new attribute item
385 std::string(StringRef(""))};
386 Contents.push_back(Item);
387}
388
390 bool OverwriteExisting) {
391 // Look for existing attribute item
392 if (AttributeItem *Item = getAttributeItem(Attribute)) {
393 if (!OverwriteExisting)
394 return;
395 Item->Type = AttributeItem::TextAttribute;
396 Item->StringValue = std::string(Value);
397 return;
398 }
399
400 // Create new attribute item
402 std::string(Value)};
403 Contents.push_back(Item);
404}
405
406void MCELFStreamer::setAttributeItems(unsigned Attribute, unsigned IntValue,
407 StringRef StringValue,
408 bool OverwriteExisting) {
409 // Look for existing attribute item
410 if (AttributeItem *Item = getAttributeItem(Attribute)) {
411 if (!OverwriteExisting)
412 return;
414 Item->IntValue = IntValue;
415 Item->StringValue = std::string(StringValue);
416 return;
417 }
418
419 // Create new attribute item
421 IntValue, std::string(StringValue)};
422 Contents.push_back(Item);
423}
424
426MCELFStreamer::getAttributeItem(unsigned Attribute) {
427 for (AttributeItem &Item : Contents)
428 if (Item.Tag == Attribute)
429 return &Item;
430 return nullptr;
431}
432
433size_t MCELFStreamer::calculateContentSize(
434 SmallVector<AttributeItem, 64> &AttrsVec) const {
435 size_t Result = 0;
436 for (const AttributeItem &Item : AttrsVec) {
437 switch (Item.Type) {
439 break;
441 Result += getULEB128Size(Item.Tag);
442 Result += getULEB128Size(Item.IntValue);
443 break;
445 Result += getULEB128Size(Item.Tag);
446 Result += Item.StringValue.size() + 1; // string + '\0'
447 break;
449 Result += getULEB128Size(Item.Tag);
450 Result += getULEB128Size(Item.IntValue);
451 Result += Item.StringValue.size() + 1; // string + '\0';
452 break;
453 }
454 }
455 return Result;
456}
457
458void MCELFStreamer::createAttributesSection(
459 StringRef Vendor, const Twine &Section, unsigned Type,
460 MCSection *&AttributeSection, SmallVector<AttributeItem, 64> &AttrsVec) {
461 // <format-version>
462 // [ <section-length> "vendor-name"
463 // [ <file-tag> <size> <attribute>*
464 // | <section-tag> <size> <section-number>* 0 <attribute>*
465 // | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
466 // ]+
467 // ]*
468
469 // Switch section to AttributeSection or get/create the section.
470 if (AttributeSection) {
471 switchSection(AttributeSection);
472 } else {
473 AttributeSection = getContext().getELFSection(Section, Type, 0);
474 switchSection(AttributeSection);
475
476 // Format version
477 emitInt8(0x41);
478 }
479
480 // Vendor size + Vendor name + '\0'
481 const size_t VendorHeaderSize = 4 + Vendor.size() + 1;
482
483 // Tag + Tag Size
484 const size_t TagHeaderSize = 1 + 4;
485
486 const size_t ContentsSize = calculateContentSize(AttrsVec);
487
488 emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize);
489 emitBytes(Vendor);
490 emitInt8(0); // '\0'
491
493 emitInt32(TagHeaderSize + ContentsSize);
494
495 // Size should have been accounted for already, now
496 // emit each field as its type (ULEB or String)
497 for (const AttributeItem &Item : AttrsVec) {
498 emitULEB128IntValue(Item.Tag);
499 switch (Item.Type) {
500 default:
501 llvm_unreachable("Invalid attribute type");
503 emitULEB128IntValue(Item.IntValue);
504 break;
506 emitBytes(Item.StringValue);
507 emitInt8(0); // '\0'
508 break;
510 emitULEB128IntValue(Item.IntValue);
511 emitBytes(Item.StringValue);
512 emitInt8(0); // '\0'
513 break;
514 }
515 }
516
517 AttrsVec.clear();
518}
519
520void MCELFStreamer::createAttributesWithSubsection(
521 MCSection *&AttributeSection, const Twine &Section, unsigned Type,
523 // <format-version: 'A'>
524 // [ <uint32: subsection-length> NTBS: vendor-name
525 // <bytes: vendor-data>
526 // ]*
527 // vendor-data expends to:
528 // <uint8: optional> <uint8: parameter type> <attribute>*
529 if (0 == SubSectionVec.size()) {
530 return;
531 }
532
533 // Switch section to AttributeSection or get/create the section.
534 if (AttributeSection) {
535 switchSection(AttributeSection);
536 } else {
537 AttributeSection = getContext().getELFSection(Section, Type, 0);
538 switchSection(AttributeSection);
539
540 // Format version
541 emitInt8(0x41);
542 }
543
544 for (AttributeSubSection &SubSection : SubSectionVec) {
545 // subsection-length + vendor-name + '\0'
546 const size_t VendorHeaderSize = 4 + SubSection.VendorName.size() + 1;
547 // optional + parameter-type
548 const size_t VendorParameters = 1 + 1;
549 const size_t ContentsSize = calculateContentSize(SubSection.Content);
550
551 emitInt32(VendorHeaderSize + VendorParameters + ContentsSize);
552 emitBytes(SubSection.VendorName);
553 emitInt8(0); // '\0'
554 emitInt8(SubSection.IsOptional);
555 emitInt8(SubSection.ParameterType);
556
557 for (AttributeItem &Item : SubSection.Content) {
558 emitULEB128IntValue(Item.Tag);
559 switch (Item.Type) {
560 default:
561 assert(0 && "Invalid attribute type");
562 break;
564 emitULEB128IntValue(Item.IntValue);
565 break;
567 emitBytes(Item.StringValue);
568 emitInt8(0); // '\0'
569 break;
571 emitULEB128IntValue(Item.IntValue);
572 emitBytes(Item.StringValue);
573 emitInt8(0); // '\0'
574 break;
575 }
576 }
577 }
578 SubSectionVec.clear();
579}
580
582 std::unique_ptr<MCAsmBackend> &&MAB,
583 std::unique_ptr<MCObjectWriter> &&OW,
584 std::unique_ptr<MCCodeEmitter> &&CE) {
585 MCELFStreamer *S =
586 new MCELFStreamer(Context, std::move(MAB), std::move(OW), std::move(CE));
587 return S;
588}
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:1867
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_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_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:867
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.