LLVM 20.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
18#include "llvm/MC/MCAsmInfo.h"
19#include "llvm/MC/MCAssembler.h"
21#include "llvm/MC/MCContext.h"
22#include "llvm/MC/MCExpr.h"
23#include "llvm/MC/MCFixup.h"
24#include "llvm/MC/MCFragment.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"
35#include "llvm/Support/LEB128.h"
37#include <cassert>
38#include <cstdint>
39
40using namespace llvm;
41
43 std::unique_ptr<MCAsmBackend> TAB,
44 std::unique_ptr<MCObjectWriter> OW,
45 std::unique_ptr<MCCodeEmitter> Emitter)
46 : MCObjectStreamer(Context, std::move(TAB), std::move(OW),
47 std::move(Emitter)) {}
48
50 return static_cast<ELFObjectWriter &>(getAssembler().getWriter());
51}
52
53bool MCELFStreamer::isBundleLocked() const {
55}
56
57void MCELFStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
58 MCContext &Ctx = getContext();
61 &STI);
62
63 if (NoExecStack)
65}
66
68 auto *Symbol = cast<MCSymbolELF>(S);
69 MCObjectStreamer::emitLabel(Symbol, Loc);
70
71 const MCSectionELF &Section =
72 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
73 if (Section.getFlags() & ELF::SHF_TLS)
74 Symbol->setType(ELF::STT_TLS);
75}
76
79 auto *Symbol = cast<MCSymbolELF>(S);
81
82 const MCSectionELF &Section =
83 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
84 if (Section.getFlags() & ELF::SHF_TLS)
85 Symbol->setType(ELF::STT_TLS);
86}
87
89 // Let the target do whatever target specific stuff it needs to do.
91}
92
93// If bundle alignment is used and there are any instructions in the section, it
94// needs to be aligned to at least the bundle size.
95static void setSectionAlignmentForBundling(const MCAssembler &Assembler,
96 MCSection *Section) {
97 if (Assembler.isBundlingEnabled() && Section->hasInstructions())
98 Section->ensureMinAlignment(Align(Assembler.getBundleAlignSize()));
99}
100
102 MCAssembler &Asm = getAssembler();
103 if (auto *F = getCurrentFragment()) {
104 if (isBundleLocked())
105 report_fatal_error("Unterminated .bundle_lock when changing a section");
106
107 // Ensure the previous section gets aligned if necessary.
108 setSectionAlignmentForBundling(Asm, F->getParent());
109 }
110 auto *SectionELF = static_cast<const MCSectionELF *>(Section);
111 const MCSymbol *Grp = SectionELF->getGroup();
112 if (Grp)
113 Asm.registerSymbol(*Grp);
114 if (SectionELF->getFlags() & ELF::SHF_GNU_RETAIN)
116
117 changeSectionImpl(Section, Subsection);
118 Asm.registerSymbol(*Section->getBeginSymbol());
119}
120
122 getAssembler().registerSymbol(*Symbol);
125 Alias->setVariableValue(Value);
126}
127
128// When GNU as encounters more than one .type declaration for an object it seems
129// to use a mechanism similar to the one below to decide which type is actually
130// used in the object file. The greater of T1 and T2 is selected based on the
131// following ordering:
132// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
133// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
134// provided type).
135static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
138 if (T1 == Type)
139 return T2;
140 if (T2 == Type)
141 return T1;
142 }
143
144 return T2;
145}
146
148 auto *Symbol = cast<MCSymbolELF>(S);
149
150 // Adding a symbol attribute always introduces the symbol, note that an
151 // important side effect of calling registerSymbol here is to register
152 // the symbol with the assembler.
153 getAssembler().registerSymbol(*Symbol);
154
155 // The implementation of symbol attributes is designed to match 'as', but it
156 // leaves much to desired. It doesn't really make sense to arbitrarily add and
157 // remove flags, but 'as' allows this (in particular, see .desc).
158 //
159 // In the future it might be worth trying to make these operations more well
160 // defined.
161 switch (Attribute) {
162 case MCSA_Cold:
163 case MCSA_Extern:
165 case MCSA_Reference:
170 case MCSA_Invalid:
172 case MCSA_Exported:
173 case MCSA_WeakAntiDep:
174 return false;
175
176 case MCSA_NoDeadStrip:
177 // Ignore for now.
178 break;
179
181 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
182 Symbol->setBinding(ELF::STB_GNU_UNIQUE);
184 break;
185
186 case MCSA_Global:
187 // For `.weak x; .global x`, GNU as sets the binding to STB_WEAK while we
188 // traditionally set the binding to STB_GLOBAL. This is error-prone, so we
189 // error on such cases. Note, we also disallow changed binding from .local.
190 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL)
192 Symbol->getName() +
193 " changed binding to STB_GLOBAL");
194 Symbol->setBinding(ELF::STB_GLOBAL);
195 break;
196
198 case MCSA_Weak:
199 // For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK.
200 // We emit a warning for now but may switch to an error in the future.
201 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK)
203 getStartTokLoc(), Symbol->getName() + " changed binding to STB_WEAK");
204 Symbol->setBinding(ELF::STB_WEAK);
205 break;
206
207 case MCSA_Local:
208 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL)
210 Symbol->getName() +
211 " changed binding to STB_LOCAL");
212 Symbol->setBinding(ELF::STB_LOCAL);
213 break;
214
216 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC));
217 break;
218
220 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC));
222 break;
223
225 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
226 break;
227
228 case MCSA_ELF_TypeTLS:
229 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS));
230 break;
231
233 // TODO: Emit these as a common symbol.
234 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
235 break;
236
238 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE));
239 break;
240
241 case MCSA_Protected:
242 Symbol->setVisibility(ELF::STV_PROTECTED);
243 break;
244
245 case MCSA_Memtag:
246 Symbol->setMemtag(true);
247 break;
248
249 case MCSA_Hidden:
250 Symbol->setVisibility(ELF::STV_HIDDEN);
251 break;
252
253 case MCSA_Internal:
254 Symbol->setVisibility(ELF::STV_INTERNAL);
255 break;
256
257 case MCSA_AltEntry:
258 llvm_unreachable("ELF doesn't support the .alt_entry attribute");
259
260 case MCSA_LGlobal:
261 llvm_unreachable("ELF doesn't support the .lglobl attribute");
262 }
263
264 return true;
265}
266
268 Align ByteAlignment) {
269 auto *Symbol = cast<MCSymbolELF>(S);
270 getAssembler().registerSymbol(*Symbol);
271
272 if (!Symbol->isBindingSet())
273 Symbol->setBinding(ELF::STB_GLOBAL);
274
275 Symbol->setType(ELF::STT_OBJECT);
276
277 if (Symbol->getBinding() == ELF::STB_LOCAL) {
281 switchSection(&Section);
282
283 emitValueToAlignment(ByteAlignment, 0, 1, 0);
284 emitLabel(Symbol);
286
287 switchSection(P.first, P.second);
288 } else {
289 if (Symbol->declareCommon(Size, ByteAlignment))
290 report_fatal_error(Twine("Symbol: ") + Symbol->getName() +
291 " redeclared as different type");
292 }
293
294 cast<MCSymbolELF>(Symbol)
296}
297
299 cast<MCSymbolELF>(Symbol)->setSize(Value);
300}
301
304 bool KeepOriginalSym) {
306 getStartTokLoc(), OriginalSym, Name, KeepOriginalSym});
307}
308
310 Align ByteAlignment) {
311 auto *Symbol = cast<MCSymbolELF>(S);
312 // FIXME: Should this be caught and done earlier?
313 getAssembler().registerSymbol(*Symbol);
314 Symbol->setBinding(ELF::STB_LOCAL);
315 emitCommonSymbol(Symbol, Size, ByteAlignment);
316}
317
319 SMLoc Loc) {
320 if (isBundleLocked())
321 report_fatal_error("Emitting values inside a locked bundle is forbidden");
322 fixSymbolsInTLSFixups(Value);
324}
325
327 unsigned ValueSize,
328 unsigned MaxBytesToEmit) {
329 if (isBundleLocked())
330 report_fatal_error("Emitting values inside a locked bundle is forbidden");
331 MCObjectStreamer::emitValueToAlignment(Alignment, Value, ValueSize,
332 MaxBytesToEmit);
333}
334
336 const MCSymbolRefExpr *To,
337 uint64_t Count) {
338 getWriter().getCGProfile().push_back({From, To, Count});
339}
340
344 pushSection();
345 switchSection(Comment);
346 if (!SeenIdent) {
347 emitInt8(0);
348 SeenIdent = true;
349 }
350 emitBytes(IdentString);
351 emitInt8(0);
352 popSection();
353}
354
355void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
356 switch (expr->getKind()) {
357 case MCExpr::Target:
358 cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
359 break;
360 case MCExpr::Constant:
361 break;
362
363 case MCExpr::Binary: {
364 const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
365 fixSymbolsInTLSFixups(be->getLHS());
366 fixSymbolsInTLSFixups(be->getRHS());
367 break;
368 }
369
370 case MCExpr::SymbolRef: {
371 const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
372 switch (symRef.getKind()) {
373 default:
374 return;
429 break;
430 }
432 cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
433 break;
434 }
435
436 case MCExpr::Unary:
437 fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
438 break;
439 }
440}
441
442void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE,
444 const MCSymbol *S = &SRE->getSymbol();
445 if (S->isTemporary()) {
446 if (!S->isInSection()) {
448 SRE->getLoc(), Twine("Reference to undefined temporary symbol ") +
449 "`" + S->getName() + "`");
450 return;
451 }
452 S = S->getSection().getBeginSymbol();
453 S->setUsedInReloc();
455 SRE->getLoc());
456 }
458 if (std::optional<std::pair<bool, std::string>> Err =
460 *MCOffset, "BFD_RELOC_NONE", SRE, SRE->getLoc(),
461 *getContext().getSubtargetInfo()))
462 report_fatal_error("Relocation for CG Profile could not be created: " +
463 Twine(Err->second));
464}
465
466void MCELFStreamer::finalizeCGProfile() {
468 if (W.getCGProfile().empty())
469 return;
471 ".llvm.call-graph-profile", ELF::SHT_LLVM_CALL_GRAPH_PROFILE,
472 ELF::SHF_EXCLUDE, /*sizeof(Elf_CGProfile_Impl<>)=*/8);
473 pushSection();
474 switchSection(CGProfile);
475 uint64_t Offset = 0;
476 for (auto &E : W.getCGProfile()) {
477 finalizeCGProfileEntry(E.From, Offset);
478 finalizeCGProfileEntry(E.To, Offset);
479 emitIntValue(E.Count, sizeof(uint64_t));
480 Offset += sizeof(uint64_t);
481 }
482 popSection();
483}
484
485void MCELFStreamer::emitInstToFragment(const MCInst &Inst,
486 const MCSubtargetInfo &STI) {
488 MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
489
490 for (auto &Fixup : F.getFixups())
491 fixSymbolsInTLSFixups(Fixup.getValue());
492}
493
494// A fragment can only have one Subtarget, and when bundling is enabled we
495// sometimes need to use the same fragment. We give an error if there
496// are conflicting Subtargets.
497static void CheckBundleSubtargets(const MCSubtargetInfo *OldSTI,
498 const MCSubtargetInfo *NewSTI) {
499 if (OldSTI && NewSTI && OldSTI != NewSTI)
500 report_fatal_error("A Bundle can only have one Subtarget.");
501}
502
503void MCELFStreamer::emitInstToData(const MCInst &Inst,
504 const MCSubtargetInfo &STI) {
505 MCAssembler &Assembler = getAssembler();
506
507 // There are several possibilities here:
508 //
509 // If bundling is disabled, append the encoded instruction to the current data
510 // fragment (or create a new such fragment if the current fragment is not a
511 // data fragment, or the Subtarget has changed).
512 //
513 // If bundling is enabled:
514 // - If we're not in a bundle-locked group, emit the instruction into a
515 // fragment of its own.
516 // - If we're in a bundle-locked group, append the instruction to the current
517 // data fragment because we want all the instructions in a group to get into
518 // the same fragment. Be careful not to do that for the first instruction in
519 // the group, though.
521
522 if (Assembler.isBundlingEnabled()) {
524 if (isBundleLocked() && !Sec.isBundleGroupBeforeFirstInst()) {
525 // If we are bundle-locked, we re-use the current fragment.
526 // The bundle-locking directive ensures this is a new data fragment.
527 DF = cast<MCDataFragment>(getCurrentFragment());
528 CheckBundleSubtargets(DF->getSubtargetInfo(), &STI);
529 } else {
531 insert(DF);
532 }
534 // If this fragment is for a group marked "align_to_end", set a flag
535 // in the fragment. This can happen after the fragment has already been
536 // created if there are nested bundle_align groups and an inner one
537 // is the one marked align_to_end.
538 DF->setAlignToBundleEnd(true);
539 }
540
541 // We're now emitting an instruction in a bundle group, so this flag has
542 // to be turned off.
544 } else {
546 }
547
548 // Emit instruction directly into data fragment.
549 size_t FixupStartIndex = DF->getFixups().size();
550 size_t CodeOffset = DF->getContents().size();
551 Assembler.getEmitter().encodeInstruction(Inst, DF->getContents(),
552 DF->getFixups(), STI);
553
554 auto Fixups = MutableArrayRef(DF->getFixups()).slice(FixupStartIndex);
555 for (auto &Fixup : Fixups) {
556 Fixup.setOffset(Fixup.getOffset() + CodeOffset);
557 fixSymbolsInTLSFixups(Fixup.getValue());
558 }
559
560 DF->setHasInstructions(STI);
561 if (!Fixups.empty() && Fixups.back().getTargetKind() ==
562 getAssembler().getBackend().RelaxFixupKind)
563 DF->setLinkerRelaxable();
564}
565
567 assert(Log2(Alignment) <= 30 && "Invalid bundle alignment");
568 MCAssembler &Assembler = getAssembler();
569 if (Alignment > 1 && (Assembler.getBundleAlignSize() == 0 ||
570 Assembler.getBundleAlignSize() == Alignment.value()))
571 Assembler.setBundleAlignSize(Alignment.value());
572 else
573 report_fatal_error(".bundle_align_mode cannot be changed once set");
574}
575
576void MCELFStreamer::emitBundleLock(bool AlignToEnd) {
578
579 if (!getAssembler().isBundlingEnabled())
580 report_fatal_error(".bundle_lock forbidden when bundling is disabled");
581
582 if (!isBundleLocked())
584
587}
588
591
592 if (!getAssembler().isBundlingEnabled())
593 report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
594 else if (!isBundleLocked())
595 report_fatal_error(".bundle_unlock without matching lock");
596 else if (Sec.isBundleGroupBeforeFirstInst())
597 report_fatal_error("Empty bundle-locked group is forbidden");
598
600}
601
603 // Emit the .gnu attributes section if any attributes have been added.
604 if (!GNUAttributes.empty()) {
605 MCSection *DummyAttributeSection = nullptr;
606 createAttributesSection("gnu", ".gnu.attributes", ELF::SHT_GNU_ATTRIBUTES,
607 DummyAttributeSection, GNUAttributes);
608 }
609
610 // Ensure the last section gets aligned if necessary.
613
614 finalizeCGProfile();
615 emitFrames(nullptr);
616
618}
619
621 llvm_unreachable("Generic ELF doesn't support this directive");
622}
623
624void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
625 llvm_unreachable("ELF doesn't support this directive");
626}
627
629 uint64_t Size, Align ByteAlignment,
630 SMLoc Loc) {
631 llvm_unreachable("ELF doesn't support this directive");
632}
633
635 uint64_t Size, Align ByteAlignment) {
636 llvm_unreachable("ELF doesn't support this directive");
637}
638
640 bool OverwriteExisting) {
641 // Look for existing attribute item
642 if (AttributeItem *Item = getAttributeItem(Attribute)) {
643 if (!OverwriteExisting)
644 return;
646 Item->IntValue = Value;
647 return;
648 }
649
650 // Create new attribute item
652 std::string(StringRef(""))};
653 Contents.push_back(Item);
654}
655
657 bool OverwriteExisting) {
658 // Look for existing attribute item
659 if (AttributeItem *Item = getAttributeItem(Attribute)) {
660 if (!OverwriteExisting)
661 return;
662 Item->Type = AttributeItem::TextAttribute;
663 Item->StringValue = std::string(Value);
664 return;
665 }
666
667 // Create new attribute item
669 std::string(Value)};
670 Contents.push_back(Item);
671}
672
673void MCELFStreamer::setAttributeItems(unsigned Attribute, unsigned IntValue,
674 StringRef StringValue,
675 bool OverwriteExisting) {
676 // Look for existing attribute item
677 if (AttributeItem *Item = getAttributeItem(Attribute)) {
678 if (!OverwriteExisting)
679 return;
681 Item->IntValue = IntValue;
682 Item->StringValue = std::string(StringValue);
683 return;
684 }
685
686 // Create new attribute item
688 IntValue, std::string(StringValue)};
689 Contents.push_back(Item);
690}
691
693MCELFStreamer::getAttributeItem(unsigned Attribute) {
694 for (AttributeItem &Item : Contents)
695 if (Item.Tag == Attribute)
696 return &Item;
697 return nullptr;
698}
699
700size_t
701MCELFStreamer::calculateContentSize(SmallVector<AttributeItem, 64> &AttrsVec) {
702 size_t Result = 0;
703 for (const AttributeItem &Item : AttrsVec) {
704 switch (Item.Type) {
706 break;
708 Result += getULEB128Size(Item.Tag);
709 Result += getULEB128Size(Item.IntValue);
710 break;
712 Result += getULEB128Size(Item.Tag);
713 Result += Item.StringValue.size() + 1; // string + '\0'
714 break;
716 Result += getULEB128Size(Item.Tag);
717 Result += getULEB128Size(Item.IntValue);
718 Result += Item.StringValue.size() + 1; // string + '\0';
719 break;
720 }
721 }
722 return Result;
723}
724
725void MCELFStreamer::createAttributesSection(
726 StringRef Vendor, const Twine &Section, unsigned Type,
727 MCSection *&AttributeSection, SmallVector<AttributeItem, 64> &AttrsVec) {
728 // <format-version>
729 // [ <section-length> "vendor-name"
730 // [ <file-tag> <size> <attribute>*
731 // | <section-tag> <size> <section-number>* 0 <attribute>*
732 // | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
733 // ]+
734 // ]*
735
736 // Switch section to AttributeSection or get/create the section.
737 if (AttributeSection) {
738 switchSection(AttributeSection);
739 } else {
740 AttributeSection = getContext().getELFSection(Section, Type, 0);
741 switchSection(AttributeSection);
742
743 // Format version
744 emitInt8(0x41);
745 }
746
747 // Vendor size + Vendor name + '\0'
748 const size_t VendorHeaderSize = 4 + Vendor.size() + 1;
749
750 // Tag + Tag Size
751 const size_t TagHeaderSize = 1 + 4;
752
753 const size_t ContentsSize = calculateContentSize(AttrsVec);
754
755 emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize);
756 emitBytes(Vendor);
757 emitInt8(0); // '\0'
758
760 emitInt32(TagHeaderSize + ContentsSize);
761
762 // Size should have been accounted for already, now
763 // emit each field as its type (ULEB or String)
764 for (const AttributeItem &Item : AttrsVec) {
765 emitULEB128IntValue(Item.Tag);
766 switch (Item.Type) {
767 default:
768 llvm_unreachable("Invalid attribute type");
770 emitULEB128IntValue(Item.IntValue);
771 break;
773 emitBytes(Item.StringValue);
774 emitInt8(0); // '\0'
775 break;
777 emitULEB128IntValue(Item.IntValue);
778 emitBytes(Item.StringValue);
779 emitInt8(0); // '\0'
780 break;
781 }
782 }
783
784 AttrsVec.clear();
785}
786
788 std::unique_ptr<MCAsmBackend> &&MAB,
789 std::unique_ptr<MCObjectWriter> &&OW,
790 std::unique_ptr<MCCodeEmitter> &&CE) {
791 MCELFStreamer *S =
792 new MCELFStreamer(Context, std::move(MAB), std::move(OW), std::move(CE));
793 return S;
794}
BlockVerifier::State From
dxil DXContainer Global Emitter
static RegisterPass< DebugifyFunctionPass > DF("debugify-function", "Attach debug info to a function")
std::string Name
uint64_t Size
static unsigned CombineSymbolTypes(unsigned T1, unsigned T2)
static void CheckBundleSubtargets(const MCSubtargetInfo *OldSTI, const MCSubtargetInfo *NewSTI)
static void setSectionAlignmentForBundling(const MCAssembler &Assembler, MCSection *Section)
#define F(x, y, z)
Definition: MD5.cpp:55
#define T1
#define P(N)
PowerPC TLS Dynamic Call Fixup
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
This file defines the SmallVector class.
SmallVector< Symver, 0 > Symvers
virtual void handleAssemblerFlag(MCAssemblerFlag Flag)
Handle any target-specific assembler flags. By default, do nothing.
Definition: MCAsmBackend.h:225
virtual MCSection * getNonexecutableStackSection(MCContext &Ctx) const
Targets can implement this method to specify a section to switch to if the translation unit doesn't h...
Definition: MCAsmInfo.h:579
MCContext & getContext() const
Definition: MCAssembler.h:182
unsigned getBundleAlignSize() const
Definition: MCAssembler.h:210
bool isBundlingEnabled() const
Definition: MCAssembler.h:208
void setBundleAlignSize(unsigned Size)
Definition: MCAssembler.h:212
MCObjectWriter & getWriter() const
Definition: MCAssembler.h:192
MCCodeEmitter & getEmitter() const
Definition: MCAssembler.h:190
MCAsmBackend & getBackend() const
Definition: MCAssembler.h:188
bool registerSymbol(const MCSymbol &Symbol)
Binary assembler expressions.
Definition: MCExpr.h:488
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
Definition: MCExpr.h:635
const MCExpr * getRHS() const
Get the right-hand side expression of the binary operator.
Definition: MCExpr.h:638
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Definition: MCExpr.cpp:193
Context object for machine code objects.
Definition: MCContext.h:83
const MCObjectFileInfo * getObjectFileInfo() const
Definition: MCContext.h:416
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
Definition: MCContext.h:551
void reportWarning(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1074
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:412
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1067
F * allocFragment(Args &&...args)
Definition: MCContext.h:440
Fragment for data and encoded instructions.
Definition: MCFragment.h:231
void emitBundleLock(bool AlignToEnd) override
The following instructions are a bundle-locked group.
SmallVector< AttributeItem, 64 > Contents
void emitValueToAlignment(Align, int64_t, unsigned, unsigned) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
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 emitBundleUnlock() override
Ends a bundle-locked group.
void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) override
Emit a common symbol.
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.
void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment) override
Emit a local common (.lcomm) symbol.
void emitAssemblerFlag(MCAssemblerFlag Flag) override
Note in the output the specified Flag.
void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) override
Set the DescValue for the Symbol.
void emitELFSize(MCSymbol *Symbol, const MCExpr *Value) override
Emit an ELF .size directive.
void emitThumbFunc(MCSymbol *Func) override
Note in the output that the specified Func is a Thumb mode function (ARM target only).
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
ELFObjectWriter & getWriter()
void emitZerofill(MCSection *Section, MCSymbol *Symbol=nullptr, uint64_t Size=0, Align ByteAlignment=Align(1), SMLoc L=SMLoc()) override
Emit the zerofill section and an optional symbol.
void setAttributeItem(unsigned Attribute, unsigned Value, bool OverwriteExisting)
void finishImpl() final
Streamer specific finalization.
void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol) override
Emit an weak reference from Alias to Symbol.
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
void emitBundleAlignMode(Align Alignment) override
Set the bundle alignment mode from now on in the section.
bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute) override
Add the given Attribute to Symbol.
void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, Align ByteAlignment=Align(1)) override
Emit a thread local bss (.tbss) symbol.
void initSections(bool NoExecStack, const MCSubtargetInfo &STI) override
Create the default sections and set the initial one.
void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F, uint64_t Offset) override
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
@ Unary
Unary expressions.
Definition: MCExpr.h:40
@ Constant
Constant expressions.
Definition: MCExpr.h:38
@ SymbolRef
References to labels and assigned expressions.
Definition: MCExpr.h:39
@ Target
Target specific expression.
Definition: MCExpr.h:41
@ Binary
Binary expressions.
Definition: MCExpr.h:37
ExprKind getKind() const
Definition: MCExpr.h:78
SMLoc getLoc() const
Definition: MCExpr.h:79
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:184
virtual unsigned getTextSectionAlignment() const
MCSection * getTextSection() const
Streaming object file generation interface.
void emitValueToAlignment(Align Alignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0) override
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
MCDataFragment * getOrCreateDataFragment(const MCSubtargetInfo *STI=nullptr)
Get a data fragment to write into, creating a new one if the current fragment is not a data fragment.
MCAssembler & getAssembler()
void emitBytes(StringRef Data) override
Emit the bytes in Data into the output.
bool changeSectionImpl(MCSection *Section, uint32_t Subsection)
std::optional< std::pair< bool, std::string > > emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc, const MCSubtargetInfo &STI) override
Record a relocation described by the .reloc directive.
void insert(MCFragment *F)
virtual void emitInstToFragment(const MCInst &Inst, const MCSubtargetInfo &)
Emit an instruction to a special fragment, because this instruction can change its size during relaxa...
void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc()) override
Emit a label for Symbol into the current section.
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.
void finishImpl() override
Streamer specific finalization.
void emitCodeAlignment(Align ByteAlignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0) override
Emit nops until the byte alignment ByteAlignment is reached.
void emitFrames(MCAsmBackend *MAB)
virtual void emitLabelAtPos(MCSymbol *Symbol, SMLoc Loc, MCDataFragment &F, uint64_t Offset)
SmallVector< CGProfileEntry, 0 > & getCGProfile()
A relaxable fragment holds on to its MCInst, since it may need to be relaxed during the assembler lay...
Definition: MCFragment.h:261
This represents a section on linux, lots of unix variants and some bare metal systems.
Definition: MCSectionELF.h:27
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:36
void setBundleLockState(BundleLockStateType NewState)
Definition: MCSection.cpp:50
bool isBundleGroupBeforeFirstInst() const
Definition: MCSection.h:160
bool isBundleLocked() const
Definition: MCSection.h:158
@ BundleLockedAlignToEnd
Definition: MCSection.h:57
MCSymbol * getBeginSymbol()
Definition: MCSection.h:133
BundleLockStateType getBundleLockState() const
Definition: MCSection.h:156
void setBundleGroupBeforeFirstInst(bool IsFirst)
Definition: MCSection.h:163
Streaming machine code generation interface.
Definition: MCStreamer.h:213
bool popSection()
Restore the current and previous section from the section stack.
MCFragment * getCurrentFragment() const
Definition: MCStreamer.h:409
MCContext & getContext() const
Definition: MCStreamer.h:300
SMLoc getStartTokLoc() const
Definition: MCStreamer.h:292
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.
Definition: MCStreamer.cpp:133
void pushSection()
Save the current and previous section on the section stack.
Definition: MCStreamer.h:416
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...
Definition: MCStreamer.cpp:161
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:719
MCSectionSubPair getCurrentSection() const
Return the current section that the streamer is emitting code to.
Definition: MCStreamer.h:393
MCSection * getCurrentSectionOnly() const
Definition: MCStreamer.h:398
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Definition: MCStreamer.cpp:229
void emitInt8(uint64_t Value)
Definition: MCStreamer.h:717
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:188
const MCSymbol & getSymbol() const
Definition: MCExpr.h:406
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
Definition: MCExpr.h:393
VariantKind getKind() const
Definition: MCExpr.h:408
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
Definition: MCSymbol.h:41
bool isInSection() const
isInSection - Check if this symbol is defined in some section (i.e., it is defined but not absolute).
Definition: MCSymbol.h:254
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:205
void setVariableValue(const MCExpr *Value)
Definition: MCSymbol.cpp:47
void setUsedInReloc() const
Definition: MCSymbol.h:215
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
Definition: MCSymbol.h:269
bool isTemporary() const
isTemporary - Check if this is an assembler temporary symbol.
Definition: MCSymbol.h:222
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
Definition: ArrayRef.h:307
MutableArrayRef< T > slice(size_t N, size_t M) const
slice(n, m) - Chop off the first N elements of the array, and keep M elements in the array.
Definition: ArrayRef.h:376
Represents a location in source code.
Definition: SMLoc.h:23
bool empty() const
Definition: SmallVector.h:94
void push_back(const T &Elt)
Definition: SmallVector.h:426
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:50
constexpr size_t size() const
size - Get the string size.
Definition: StringRef.h:137
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
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:74
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ STT_FUNC
Definition: ELF.h:1332
@ STT_NOTYPE
Definition: ELF.h:1330
@ STT_GNU_IFUNC
Definition: ELF.h:1337
@ STT_OBJECT
Definition: ELF.h:1331
@ STT_TLS
Definition: ELF.h:1336
@ STV_INTERNAL
Definition: ELF.h:1349
@ STV_HIDDEN
Definition: ELF.h:1350
@ STV_PROTECTED
Definition: ELF.h:1351
@ SHT_PROGBITS
Definition: ELF.h:1068
@ SHT_LLVM_CALL_GRAPH_PROFILE
Definition: ELF.h:1107
@ SHT_NOBITS
Definition: ELF.h:1075
@ SHT_GNU_ATTRIBUTES
Definition: ELF.h:1114
@ STB_GLOBAL
Definition: ELF.h:1319
@ STB_LOCAL
Definition: ELF.h:1318
@ STB_GNU_UNIQUE
Definition: ELF.h:1321
@ STB_WEAK
Definition: ELF.h:1320
@ SHF_MERGE
Definition: ELF.h:1171
@ SHF_STRINGS
Definition: ELF.h:1174
@ SHF_EXCLUDE
Definition: ELF.h:1199
@ SHF_ALLOC
Definition: ELF.h:1165
@ SHF_GNU_RETAIN
Definition: ELF.h:1196
@ SHF_WRITE
Definition: ELF.h:1162
@ SHF_TLS
Definition: ELF.h:1190
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
MCStreamer * createELFStreamer(MCContext &Ctx, std::unique_ptr< MCAsmBackend > &&TAB, std::unique_ptr< MCObjectWriter > &&OW, std::unique_ptr< MCCodeEmitter > &&CE)
std::pair< MCSection *, uint32_t > MCSectionSubPair
Definition: MCStreamer.h:67
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
Definition: Error.cpp:167
unsigned getULEB128Size(uint64_t Value)
Utility function to get the size of the ULEB128-encoded value.
Definition: LEB128.cpp:19
MCAssemblerFlag
Definition: MCDirectives.h:53
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:1849
unsigned Log2(Align A)
Returns the log2 of the alignment.
Definition: Alignment.h:208
MCSymbolAttr
Definition: MCDirectives.h:18
@ MCSA_Local
.local (ELF)
Definition: MCDirectives.h:38
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
Definition: MCDirectives.h:48
@ MCSA_Memtag
.memtag (ELF)
Definition: MCDirectives.h:50
@ MCSA_Protected
.protected (ELF)
Definition: MCDirectives.h:43
@ MCSA_Exported
.globl _foo, exported (XCOFF)
Definition: MCDirectives.h:34
@ MCSA_PrivateExtern
.private_extern (MachO)
Definition: MCDirectives.h:42
@ MCSA_Internal
.internal (ELF)
Definition: MCDirectives.h:36
@ MCSA_WeakReference
.weak_reference (MachO)
Definition: MCDirectives.h:47
@ MCSA_AltEntry
.alt_entry (MachO)
Definition: MCDirectives.h:41
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
Definition: MCDirectives.h:24
@ MCSA_LazyReference
.lazy_reference (MachO)
Definition: MCDirectives.h:37
@ MCSA_ELF_TypeNoType
.type _foo, STT_NOTYPE # aka @notype
Definition: MCDirectives.h:28
@ MCSA_Reference
.reference (MachO)
Definition: MCDirectives.h:44
@ MCSA_SymbolResolver
.symbol_resolver (MachO)
Definition: MCDirectives.h:40
@ MCSA_Weak
.weak
Definition: MCDirectives.h:45
@ MCSA_ELF_TypeTLS
.type _foo, STT_TLS # aka @tls_object
Definition: MCDirectives.h:26
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
Definition: MCDirectives.h:35
@ MCSA_WeakDefinition
.weak_definition (MachO)
Definition: MCDirectives.h:46
@ MCSA_ELF_TypeCommon
.type _foo, STT_COMMON # aka @common
Definition: MCDirectives.h:27
@ MCSA_Global
.type _foo, @gnu_unique_object
Definition: MCDirectives.h:30
@ MCSA_WeakAntiDep
.weak_anti_dep (COFF)
Definition: MCDirectives.h:49
@ MCSA_Extern
.extern (XCOFF)
Definition: MCDirectives.h:32
@ MCSA_Cold
.cold (MachO)
Definition: MCDirectives.h:22
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
Definition: MCDirectives.h:25
@ MCSA_ELF_TypeGnuUniqueObject
Definition: MCDirectives.h:29
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
Definition: MCDirectives.h:23
@ MCSA_Hidden
.hidden (ELF)
Definition: MCDirectives.h:33
@ MCSA_LGlobal
.lglobl (XCOFF)
Definition: MCDirectives.h:31
@ MCSA_Invalid
Not a valid directive.
Definition: MCDirectives.h:19
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
Definition: MCDirectives.h:39
Implement std::hash so that hash_code can be used in STL containers.
Definition: BitVector.h:858
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
uint64_t value() const
This is a hole in the type system and should not be abused.
Definition: Alignment.h:85
ELF object attributes section emission support.
Definition: MCELFStreamer.h:95