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"
23#include "llvm/MC/MCExpr.h"
24#include "llvm/MC/MCFixup.h"
25#include "llvm/MC/MCFragment.h"
28#include "llvm/MC/MCSection.h"
30#include "llvm/MC/MCStreamer.h"
31#include "llvm/MC/MCSymbol.h"
32#include "llvm/MC/MCSymbolELF.h"
36#include "llvm/Support/LEB128.h"
38#include <cassert>
39#include <cstdint>
40
41using namespace llvm;
42
44 std::unique_ptr<MCAsmBackend> TAB,
45 std::unique_ptr<MCObjectWriter> OW,
46 std::unique_ptr<MCCodeEmitter> Emitter)
47 : MCObjectStreamer(Context, std::move(TAB), std::move(OW),
48 std::move(Emitter)) {}
49
51 return static_cast<ELFObjectWriter &>(getAssembler().getWriter());
52}
53
54bool MCELFStreamer::isBundleLocked() const {
56}
57
58void MCELFStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
59 MCContext &Ctx = getContext();
62 &STI);
63
64 if (NoExecStack)
66}
67
69 auto *Symbol = cast<MCSymbolELF>(S);
70 MCObjectStreamer::emitLabel(Symbol, Loc);
71
72 const MCSectionELF &Section =
73 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
74 if (Section.getFlags() & ELF::SHF_TLS)
75 Symbol->setType(ELF::STT_TLS);
76}
77
80 auto *Symbol = cast<MCSymbolELF>(S);
82
83 const MCSectionELF &Section =
84 static_cast<const MCSectionELF &>(*getCurrentSectionOnly());
85 if (Section.getFlags() & ELF::SHF_TLS)
86 Symbol->setType(ELF::STT_TLS);
87}
88
90 // Let the target do whatever target specific stuff it needs to do.
92}
93
94// If bundle alignment is used and there are any instructions in the section, it
95// needs to be aligned to at least the bundle size.
96static void setSectionAlignmentForBundling(const MCAssembler &Assembler,
97 MCSection *Section) {
98 if (Assembler.isBundlingEnabled() && Section->hasInstructions())
99 Section->ensureMinAlignment(Align(Assembler.getBundleAlignSize()));
100}
101
103 MCAssembler &Asm = getAssembler();
104 if (auto *F = getCurrentFragment()) {
105 if (isBundleLocked())
106 report_fatal_error("Unterminated .bundle_lock when changing a section");
107
108 // Ensure the previous section gets aligned if necessary.
109 setSectionAlignmentForBundling(Asm, F->getParent());
110 }
111 auto *SectionELF = static_cast<const MCSectionELF *>(Section);
112 const MCSymbol *Grp = SectionELF->getGroup();
113 if (Grp)
114 Asm.registerSymbol(*Grp);
115 if (SectionELF->getFlags() & ELF::SHF_GNU_RETAIN)
117
118 changeSectionImpl(Section, Subsection);
119 Asm.registerSymbol(*Section->getBeginSymbol());
120}
121
123 getAssembler().registerSymbol(*Symbol);
126 Alias->setVariableValue(Value);
127}
128
129// When GNU as encounters more than one .type declaration for an object it seems
130// to use a mechanism similar to the one below to decide which type is actually
131// used in the object file. The greater of T1 and T2 is selected based on the
132// following ordering:
133// STT_NOTYPE < STT_OBJECT < STT_FUNC < STT_GNU_IFUNC < STT_TLS < anything else
134// If neither T1 < T2 nor T2 < T1 according to this ordering, use T2 (the user
135// provided type).
136static unsigned CombineSymbolTypes(unsigned T1, unsigned T2) {
139 if (T1 == Type)
140 return T2;
141 if (T2 == Type)
142 return T1;
143 }
144
145 return T2;
146}
147
149 auto *Symbol = cast<MCSymbolELF>(S);
150
151 // Adding a symbol attribute always introduces the symbol, note that an
152 // important side effect of calling registerSymbol here is to register
153 // the symbol with the assembler.
154 getAssembler().registerSymbol(*Symbol);
155
156 // The implementation of symbol attributes is designed to match 'as', but it
157 // leaves much to desired. It doesn't really make sense to arbitrarily add and
158 // remove flags, but 'as' allows this (in particular, see .desc).
159 //
160 // In the future it might be worth trying to make these operations more well
161 // defined.
162 switch (Attribute) {
163 case MCSA_Cold:
164 case MCSA_Extern:
166 case MCSA_Reference:
171 case MCSA_Invalid:
173 case MCSA_Exported:
174 case MCSA_WeakAntiDep:
175 return false;
176
177 case MCSA_NoDeadStrip:
178 // Ignore for now.
179 break;
180
182 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
183 Symbol->setBinding(ELF::STB_GNU_UNIQUE);
185 break;
186
187 case MCSA_Global:
188 // For `.weak x; .global x`, GNU as sets the binding to STB_WEAK while we
189 // traditionally set the binding to STB_GLOBAL. This is error-prone, so we
190 // error on such cases. Note, we also disallow changed binding from .local.
191 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_GLOBAL)
193 Symbol->getName() +
194 " changed binding to STB_GLOBAL");
195 Symbol->setBinding(ELF::STB_GLOBAL);
196 break;
197
199 case MCSA_Weak:
200 // For `.global x; .weak x`, both MC and GNU as set the binding to STB_WEAK.
201 // We emit a warning for now but may switch to an error in the future.
202 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_WEAK)
204 getStartTokLoc(), Symbol->getName() + " changed binding to STB_WEAK");
205 Symbol->setBinding(ELF::STB_WEAK);
206 break;
207
208 case MCSA_Local:
209 if (Symbol->isBindingSet() && Symbol->getBinding() != ELF::STB_LOCAL)
211 Symbol->getName() +
212 " changed binding to STB_LOCAL");
213 Symbol->setBinding(ELF::STB_LOCAL);
214 break;
215
217 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_FUNC));
218 break;
219
221 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_GNU_IFUNC));
223 break;
224
226 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
227 break;
228
229 case MCSA_ELF_TypeTLS:
230 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_TLS));
231 break;
232
234 // TODO: Emit these as a common symbol.
235 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_OBJECT));
236 break;
237
239 Symbol->setType(CombineSymbolTypes(Symbol->getType(), ELF::STT_NOTYPE));
240 break;
241
242 case MCSA_Protected:
243 Symbol->setVisibility(ELF::STV_PROTECTED);
244 break;
245
246 case MCSA_Memtag:
247 Symbol->setMemtag(true);
248 break;
249
250 case MCSA_Hidden:
251 Symbol->setVisibility(ELF::STV_HIDDEN);
252 break;
253
254 case MCSA_Internal:
255 Symbol->setVisibility(ELF::STV_INTERNAL);
256 break;
257
258 case MCSA_AltEntry:
259 llvm_unreachable("ELF doesn't support the .alt_entry attribute");
260
261 case MCSA_LGlobal:
262 llvm_unreachable("ELF doesn't support the .lglobl attribute");
263 }
264
265 return true;
266}
267
269 Align ByteAlignment) {
270 auto *Symbol = cast<MCSymbolELF>(S);
271 getAssembler().registerSymbol(*Symbol);
272
273 if (!Symbol->isBindingSet())
274 Symbol->setBinding(ELF::STB_GLOBAL);
275
276 Symbol->setType(ELF::STT_OBJECT);
277
278 if (Symbol->getBinding() == ELF::STB_LOCAL) {
282 switchSection(&Section);
283
284 emitValueToAlignment(ByteAlignment, 0, 1, 0);
285 emitLabel(Symbol);
287
288 switchSection(P.first, P.second);
289 } else {
290 if (Symbol->declareCommon(Size, ByteAlignment))
291 report_fatal_error(Twine("Symbol: ") + Symbol->getName() +
292 " redeclared as different type");
293 }
294
295 cast<MCSymbolELF>(Symbol)
297}
298
300 cast<MCSymbolELF>(Symbol)->setSize(Value);
301}
302
305 bool KeepOriginalSym) {
307 getStartTokLoc(), OriginalSym, Name, KeepOriginalSym});
308}
309
311 Align ByteAlignment) {
312 auto *Symbol = cast<MCSymbolELF>(S);
313 // FIXME: Should this be caught and done earlier?
314 getAssembler().registerSymbol(*Symbol);
315 Symbol->setBinding(ELF::STB_LOCAL);
316 emitCommonSymbol(Symbol, Size, ByteAlignment);
317}
318
320 SMLoc Loc) {
321 if (isBundleLocked())
322 report_fatal_error("Emitting values inside a locked bundle is forbidden");
323 fixSymbolsInTLSFixups(Value);
325}
326
328 unsigned ValueSize,
329 unsigned MaxBytesToEmit) {
330 if (isBundleLocked())
331 report_fatal_error("Emitting values inside a locked bundle is forbidden");
332 MCObjectStreamer::emitValueToAlignment(Alignment, Value, ValueSize,
333 MaxBytesToEmit);
334}
335
337 const MCSymbolRefExpr *To,
338 uint64_t Count) {
339 getWriter().getCGProfile().push_back({From, To, Count});
340}
341
345 pushSection();
346 switchSection(Comment);
347 if (!SeenIdent) {
348 emitInt8(0);
349 SeenIdent = true;
350 }
351 emitBytes(IdentString);
352 emitInt8(0);
353 popSection();
354}
355
356void MCELFStreamer::fixSymbolsInTLSFixups(const MCExpr *expr) {
357 switch (expr->getKind()) {
358 case MCExpr::Target:
359 cast<MCTargetExpr>(expr)->fixELFSymbolsInTLSFixups(getAssembler());
360 break;
361 case MCExpr::Constant:
362 break;
363
364 case MCExpr::Binary: {
365 const MCBinaryExpr *be = cast<MCBinaryExpr>(expr);
366 fixSymbolsInTLSFixups(be->getLHS());
367 fixSymbolsInTLSFixups(be->getRHS());
368 break;
369 }
370
371 case MCExpr::SymbolRef: {
372 const MCSymbolRefExpr &symRef = *cast<MCSymbolRefExpr>(expr);
373 switch (symRef.getKind()) {
374 default:
375 return;
430 break;
431 }
433 cast<MCSymbolELF>(symRef.getSymbol()).setType(ELF::STT_TLS);
434 break;
435 }
436
437 case MCExpr::Unary:
438 fixSymbolsInTLSFixups(cast<MCUnaryExpr>(expr)->getSubExpr());
439 break;
440 }
441}
442
443void MCELFStreamer::finalizeCGProfileEntry(const MCSymbolRefExpr *&SRE,
445 const MCSymbol *S = &SRE->getSymbol();
446 if (S->isTemporary()) {
447 if (!S->isInSection()) {
449 SRE->getLoc(), Twine("Reference to undefined temporary symbol ") +
450 "`" + S->getName() + "`");
451 return;
452 }
453 S = S->getSection().getBeginSymbol();
454 S->setUsedInReloc();
456 SRE->getLoc());
457 }
459 if (std::optional<std::pair<bool, std::string>> Err =
461 *MCOffset, "BFD_RELOC_NONE", SRE, SRE->getLoc(),
462 *getContext().getSubtargetInfo()))
463 report_fatal_error("Relocation for CG Profile could not be created: " +
464 Twine(Err->second));
465}
466
467void MCELFStreamer::finalizeCGProfile() {
469 if (W.getCGProfile().empty())
470 return;
472 ".llvm.call-graph-profile", ELF::SHT_LLVM_CALL_GRAPH_PROFILE,
473 ELF::SHF_EXCLUDE, /*sizeof(Elf_CGProfile_Impl<>)=*/8);
474 pushSection();
475 switchSection(CGProfile);
476 uint64_t Offset = 0;
477 for (auto &E : W.getCGProfile()) {
478 finalizeCGProfileEntry(E.From, Offset);
479 finalizeCGProfileEntry(E.To, Offset);
480 emitIntValue(E.Count, sizeof(uint64_t));
481 Offset += sizeof(uint64_t);
482 }
483 popSection();
484}
485
486void MCELFStreamer::emitInstToFragment(const MCInst &Inst,
487 const MCSubtargetInfo &STI) {
489 MCRelaxableFragment &F = *cast<MCRelaxableFragment>(getCurrentFragment());
490
491 for (auto &Fixup : F.getFixups())
492 fixSymbolsInTLSFixups(Fixup.getValue());
493}
494
495// A fragment can only have one Subtarget, and when bundling is enabled we
496// sometimes need to use the same fragment. We give an error if there
497// are conflicting Subtargets.
498static void CheckBundleSubtargets(const MCSubtargetInfo *OldSTI,
499 const MCSubtargetInfo *NewSTI) {
500 if (OldSTI && NewSTI && OldSTI != NewSTI)
501 report_fatal_error("A Bundle can only have one Subtarget.");
502}
503
504void MCELFStreamer::emitInstToData(const MCInst &Inst,
505 const MCSubtargetInfo &STI) {
506 MCAssembler &Assembler = getAssembler();
507
508 // There are several possibilities here:
509 //
510 // If bundling is disabled, append the encoded instruction to the current data
511 // fragment (or create a new such fragment if the current fragment is not a
512 // data fragment, or the Subtarget has changed).
513 //
514 // If bundling is enabled:
515 // - If we're not in a bundle-locked group, emit the instruction into a
516 // fragment of its own.
517 // - If we're in a bundle-locked group, append the instruction to the current
518 // data fragment because we want all the instructions in a group to get into
519 // the same fragment. Be careful not to do that for the first instruction in
520 // the group, though.
522
523 if (Assembler.isBundlingEnabled()) {
525 if (isBundleLocked() && !Sec.isBundleGroupBeforeFirstInst()) {
526 // If we are bundle-locked, we re-use the current fragment.
527 // The bundle-locking directive ensures this is a new data fragment.
528 DF = cast<MCDataFragment>(getCurrentFragment());
529 CheckBundleSubtargets(DF->getSubtargetInfo(), &STI);
530 } else {
532 insert(DF);
533 }
535 // If this fragment is for a group marked "align_to_end", set a flag
536 // in the fragment. This can happen after the fragment has already been
537 // created if there are nested bundle_align groups and an inner one
538 // is the one marked align_to_end.
539 DF->setAlignToBundleEnd(true);
540 }
541
542 // We're now emitting an instruction in a bundle group, so this flag has
543 // to be turned off.
545 } else {
547 }
548
549 // Emit instruction directly into data fragment.
550 size_t FixupStartIndex = DF->getFixups().size();
551 size_t CodeOffset = DF->getContents().size();
552 Assembler.getEmitter().encodeInstruction(Inst, DF->getContents(),
553 DF->getFixups(), STI);
554
555 auto Fixups = MutableArrayRef(DF->getFixups()).slice(FixupStartIndex);
556 for (auto &Fixup : Fixups) {
557 Fixup.setOffset(Fixup.getOffset() + CodeOffset);
558 fixSymbolsInTLSFixups(Fixup.getValue());
559 }
560
561 DF->setHasInstructions(STI);
562 if (!Fixups.empty() && Fixups.back().getTargetKind() ==
563 getAssembler().getBackend().RelaxFixupKind)
564 DF->setLinkerRelaxable();
565}
566
568 assert(Log2(Alignment) <= 30 && "Invalid bundle alignment");
569 MCAssembler &Assembler = getAssembler();
570 if (Alignment > 1 && (Assembler.getBundleAlignSize() == 0 ||
571 Assembler.getBundleAlignSize() == Alignment.value()))
572 Assembler.setBundleAlignSize(Alignment.value());
573 else
574 report_fatal_error(".bundle_align_mode cannot be changed once set");
575}
576
577void MCELFStreamer::emitBundleLock(bool AlignToEnd) {
579
580 if (!getAssembler().isBundlingEnabled())
581 report_fatal_error(".bundle_lock forbidden when bundling is disabled");
582
583 if (!isBundleLocked())
585
588}
589
592
593 if (!getAssembler().isBundlingEnabled())
594 report_fatal_error(".bundle_unlock forbidden when bundling is disabled");
595 else if (!isBundleLocked())
596 report_fatal_error(".bundle_unlock without matching lock");
597 else if (Sec.isBundleGroupBeforeFirstInst())
598 report_fatal_error("Empty bundle-locked group is forbidden");
599
601}
602
604 // Emit the .gnu attributes section if any attributes have been added.
605 if (!GNUAttributes.empty()) {
606 MCSection *DummyAttributeSection = nullptr;
607 createAttributesSection("gnu", ".gnu.attributes", ELF::SHT_GNU_ATTRIBUTES,
608 DummyAttributeSection, GNUAttributes);
609 }
610
611 // Ensure the last section gets aligned if necessary.
614
615 finalizeCGProfile();
616 emitFrames(nullptr);
617
619}
620
622 llvm_unreachable("Generic ELF doesn't support this directive");
623}
624
625void MCELFStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {
626 llvm_unreachable("ELF doesn't support this directive");
627}
628
630 uint64_t Size, Align ByteAlignment,
631 SMLoc Loc) {
632 llvm_unreachable("ELF doesn't support this directive");
633}
634
636 uint64_t Size, Align ByteAlignment) {
637 llvm_unreachable("ELF doesn't support this directive");
638}
639
641 bool OverwriteExisting) {
642 // Look for existing attribute item
643 if (AttributeItem *Item = getAttributeItem(Attribute)) {
644 if (!OverwriteExisting)
645 return;
647 Item->IntValue = Value;
648 return;
649 }
650
651 // Create new attribute item
653 std::string(StringRef(""))};
654 Contents.push_back(Item);
655}
656
658 bool OverwriteExisting) {
659 // Look for existing attribute item
660 if (AttributeItem *Item = getAttributeItem(Attribute)) {
661 if (!OverwriteExisting)
662 return;
663 Item->Type = AttributeItem::TextAttribute;
664 Item->StringValue = std::string(Value);
665 return;
666 }
667
668 // Create new attribute item
670 std::string(Value)};
671 Contents.push_back(Item);
672}
673
674void MCELFStreamer::setAttributeItems(unsigned Attribute, unsigned IntValue,
675 StringRef StringValue,
676 bool OverwriteExisting) {
677 // Look for existing attribute item
678 if (AttributeItem *Item = getAttributeItem(Attribute)) {
679 if (!OverwriteExisting)
680 return;
682 Item->IntValue = IntValue;
683 Item->StringValue = std::string(StringValue);
684 return;
685 }
686
687 // Create new attribute item
689 IntValue, std::string(StringValue)};
690 Contents.push_back(Item);
691}
692
694MCELFStreamer::getAttributeItem(unsigned Attribute) {
695 for (AttributeItem &Item : Contents)
696 if (Item.Tag == Attribute)
697 return &Item;
698 return nullptr;
699}
700
701size_t
702MCELFStreamer::calculateContentSize(SmallVector<AttributeItem, 64> &AttrsVec) {
703 size_t Result = 0;
704 for (const AttributeItem &Item : AttrsVec) {
705 switch (Item.Type) {
707 break;
709 Result += getULEB128Size(Item.Tag);
710 Result += getULEB128Size(Item.IntValue);
711 break;
713 Result += getULEB128Size(Item.Tag);
714 Result += Item.StringValue.size() + 1; // string + '\0'
715 break;
717 Result += getULEB128Size(Item.Tag);
718 Result += getULEB128Size(Item.IntValue);
719 Result += Item.StringValue.size() + 1; // string + '\0';
720 break;
721 }
722 }
723 return Result;
724}
725
726void MCELFStreamer::createAttributesSection(
727 StringRef Vendor, const Twine &Section, unsigned Type,
728 MCSection *&AttributeSection, SmallVector<AttributeItem, 64> &AttrsVec) {
729 // <format-version>
730 // [ <section-length> "vendor-name"
731 // [ <file-tag> <size> <attribute>*
732 // | <section-tag> <size> <section-number>* 0 <attribute>*
733 // | <symbol-tag> <size> <symbol-number>* 0 <attribute>*
734 // ]+
735 // ]*
736
737 // Switch section to AttributeSection or get/create the section.
738 if (AttributeSection) {
739 switchSection(AttributeSection);
740 } else {
741 AttributeSection = getContext().getELFSection(Section, Type, 0);
742 switchSection(AttributeSection);
743
744 // Format version
745 emitInt8(0x41);
746 }
747
748 // Vendor size + Vendor name + '\0'
749 const size_t VendorHeaderSize = 4 + Vendor.size() + 1;
750
751 // Tag + Tag Size
752 const size_t TagHeaderSize = 1 + 4;
753
754 const size_t ContentsSize = calculateContentSize(AttrsVec);
755
756 emitInt32(VendorHeaderSize + TagHeaderSize + ContentsSize);
757 emitBytes(Vendor);
758 emitInt8(0); // '\0'
759
761 emitInt32(TagHeaderSize + ContentsSize);
762
763 // Size should have been accounted for already, now
764 // emit each field as its type (ULEB or String)
765 for (const AttributeItem &Item : AttrsVec) {
766 emitULEB128IntValue(Item.Tag);
767 switch (Item.Type) {
768 default:
769 llvm_unreachable("Invalid attribute type");
771 emitULEB128IntValue(Item.IntValue);
772 break;
774 emitBytes(Item.StringValue);
775 emitInt8(0); // '\0'
776 break;
778 emitULEB128IntValue(Item.IntValue);
779 emitBytes(Item.StringValue);
780 emitInt8(0); // '\0'
781 break;
782 }
783 }
784
785 AttrsVec.clear();
786}
787
789 std::unique_ptr<MCAsmBackend> &&MAB,
790 std::unique_ptr<MCObjectWriter> &&OW,
791 std::unique_ptr<MCCodeEmitter> &&CE) {
792 MCELFStreamer *S =
793 new MCELFStreamer(Context, std::move(MAB), std::move(OW), std::move(CE));
794 return S;
795}
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:226
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:551
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:1075
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:412
void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1068
F * allocFragment(Args &&...args)
Definition: MCContext.h:440
Fragment for data and encoded instructions.
Definition: MCFragment.h:219
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:234
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:162
bool isBundleLocked() const
Definition: MCSection.h:160
@ BundleLockedAlignToEnd
Definition: MCSection.h:57
MCSymbol * getBeginSymbol()
Definition: MCSection.h:135
BundleLockStateType getBundleLockState() const
Definition: MCSection.h:158
void setBundleGroupBeforeFirstInst(bool IsFirst)
Definition: MCSection.h:165
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.
@ STV_INTERNAL
Definition: ELF.h:1370
@ STV_HIDDEN
Definition: ELF.h:1371
@ STV_PROTECTED
Definition: ELF.h:1372
@ SHT_PROGBITS
Definition: ELF.h:1089
@ SHT_LLVM_CALL_GRAPH_PROFILE
Definition: ELF.h:1128
@ SHT_NOBITS
Definition: ELF.h:1096
@ SHT_GNU_ATTRIBUTES
Definition: ELF.h:1135
@ STB_GLOBAL
Definition: ELF.h:1340
@ STB_LOCAL
Definition: ELF.h:1339
@ STB_GNU_UNIQUE
Definition: ELF.h:1342
@ STB_WEAK
Definition: ELF.h:1341
@ SHF_MERGE
Definition: ELF.h:1192
@ SHF_STRINGS
Definition: ELF.h:1195
@ SHF_EXCLUDE
Definition: ELF.h:1220
@ SHF_ALLOC
Definition: ELF.h:1186
@ SHF_GNU_RETAIN
Definition: ELF.h:1217
@ SHF_WRITE
Definition: ELF.h:1183
@ SHF_TLS
Definition: ELF.h:1211
@ STT_FUNC
Definition: ELF.h:1353
@ STT_NOTYPE
Definition: ELF.h:1351
@ STT_GNU_IFUNC
Definition: ELF.h:1358
@ STT_OBJECT
Definition: ELF.h:1352
@ STT_TLS
Definition: ELF.h:1357
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:1856
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