LLVM 22.0.0git
MCStreamer.cpp
Go to the documentation of this file.
1//===- lib/MC/MCStreamer.cpp - Streaming Machine Code 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
11#include "llvm/ADT/StringRef.h"
12#include "llvm/ADT/Twine.h"
17#include "llvm/MC/MCAsmInfo.h"
18#include "llvm/MC/MCCodeView.h"
19#include "llvm/MC/MCContext.h"
20#include "llvm/MC/MCDwarf.h"
21#include "llvm/MC/MCExpr.h"
22#include "llvm/MC/MCInst.h"
26#include "llvm/MC/MCRegister.h"
28#include "llvm/MC/MCSection.h"
30#include "llvm/MC/MCSymbol.h"
31#include "llvm/MC/MCWin64EH.h"
32#include "llvm/MC/MCWinEH.h"
35#include "llvm/Support/LEB128.h"
38#include <cassert>
39#include <cstdint>
40#include <cstdlib>
41#include <optional>
42#include <utility>
43
44using namespace llvm;
45
47 S.setTargetStreamer(this);
48}
49
50// Pin the vtables to this file.
52
54
56
58
60 uint32_t Subsection, raw_ostream &OS) {
61 auto &MAI = *Streamer.getContext().getAsmInfo();
62 MAI.printSwitchToSection(*Sec, Subsection,
64}
65
68}
69
73
75 Streamer.emitRawText(OS.str());
76}
77
79 const MCAsmInfo *MAI = Streamer.getContext().getAsmInfo();
80 const char *Directive = MAI->getData8bitsDirective();
81 for (const unsigned char C : Data.bytes()) {
84
85 OS << Directive << (unsigned)C;
86 Streamer.emitRawText(OS.str());
87 }
88}
89
91
93 : Context(Ctx), CurrentWinFrameInfo(nullptr),
94 CurrentProcWinFrameInfoStartIndex(0) {
95 SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
96}
97
98MCStreamer::~MCStreamer() = default;
99
101 DwarfFrameInfos.clear();
102 CurrentWinFrameInfo = nullptr;
103 WinFrameInfos.clear();
104 SectionStack.clear();
105 SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
106 CurFrag = nullptr;
107}
108
110 // By default, discard comments.
111 return nulls();
112}
113
114unsigned MCStreamer::getNumFrameInfos() { return DwarfFrameInfos.size(); }
116 return DwarfFrameInfos;
117}
118
119void MCStreamer::emitRawComment(const Twine &T, bool TabPrefix) {}
120
123
125 for (auto &FI : DwarfFrameInfos)
126 FI.CompactUnwindEncoding =
127 (MAB ? MAB->generateCompactUnwindEncoding(&FI, &Context) : 0);
128}
129
130/// EmitIntValue - Special case of EmitValue that avoids the client having to
131/// pass in a MCExpr for constant integers.
133 assert(1 <= Size && Size <= 8 && "Invalid size");
134 assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
135 "Invalid size");
136 const bool IsLittleEndian = Context.getAsmInfo()->isLittleEndian();
139 unsigned Index = IsLittleEndian ? 0 : 8 - Size;
140 emitBytes(StringRef(reinterpret_cast<char *>(&Swapped) + Index, Size));
141}
143 if (Value.getNumWords() == 1) {
144 emitIntValue(Value.getLimitedValue(), Value.getBitWidth() / 8);
145 return;
146 }
147
148 const bool IsLittleEndianTarget = Context.getAsmInfo()->isLittleEndian();
149 const bool ShouldSwap = sys::IsLittleEndianHost != IsLittleEndianTarget;
150 const APInt Swapped = ShouldSwap ? Value.byteSwap() : Value;
151 const unsigned Size = Value.getBitWidth() / 8;
152 SmallString<10> Tmp;
153 Tmp.resize(Size);
154 StoreIntToMemory(Swapped, reinterpret_cast<uint8_t *>(Tmp.data()), Size);
155 emitBytes(Tmp.str());
156}
157
158/// EmitULEB128IntValue - Special case of EmitULEB128Value that avoids the
159/// client having to pass in a MCExpr for constant integers.
162 raw_svector_ostream OSE(Tmp);
163 encodeULEB128(Value, OSE, PadTo);
164 emitBytes(OSE.str());
165 return Tmp.size();
166}
167
168/// EmitSLEB128IntValue - Special case of EmitSLEB128Value that avoids the
169/// client having to pass in a MCExpr for constant integers.
172 raw_svector_ostream OSE(Tmp);
173 encodeSLEB128(Value, OSE);
174 emitBytes(OSE.str());
175 return Tmp.size();
176}
177
178void MCStreamer::emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc) {
179 emitValueImpl(Value, Size, Loc);
180}
181
183 bool IsSectionRelative) {
184 assert((!IsSectionRelative || Size == 4) &&
185 "SectionRelative value requires 4-bytes");
186
187 if (!IsSectionRelative)
189 else
190 emitCOFFSecRel32(Sym, /*Offset=*/0);
191}
192
193/// Emit NumBytes bytes worth of the value specified by FillValue.
194/// This implements directives such as '.space'.
195void MCStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
196 if (NumBytes)
197 emitFill(*MCConstantExpr::create(NumBytes, getContext()), FillValue);
198}
199
200void llvm::MCStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLen,
201 llvm::SMLoc, const MCSubtargetInfo& STI) {}
202
203/// The implementation in this class just redirects to emitFill.
204void MCStreamer::emitZeros(uint64_t NumBytes) { emitFill(NumBytes, 0); }
205
207 unsigned FileNo, StringRef Directory, StringRef Filename,
208 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
209 unsigned CUID) {
210 return getContext().getDwarfFile(Directory, Filename, FileNo, Checksum,
211 Source, CUID);
212}
213
215 StringRef Filename,
216 std::optional<MD5::MD5Result> Checksum,
217 std::optional<StringRef> Source,
218 unsigned CUID) {
219 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
220 Source);
221}
222
224 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
225 if (!CurFrame)
226 return;
227 CurFrame->IsBKeyFrame = true;
228}
229
231 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
232 if (!CurFrame)
233 return;
234 CurFrame->IsMTETaggedFrame = true;
235}
236
237void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
238 unsigned Column, unsigned Flags,
239 unsigned Isa, unsigned Discriminator,
240 StringRef FileName, StringRef Comment) {
241 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
242 Discriminator);
243}
244
246 getContext()
247 .getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
249}
250
253 if (!Table.getLabel()) {
254 StringRef Prefix = Context.getAsmInfo()->getPrivateGlobalPrefix();
255 Table.setLabel(
256 Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
257 }
258 return Table.getLabel();
259}
260
262 return !FrameInfoStack.empty();
263}
264
265MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
268 "this directive must appear between "
269 ".cfi_startproc and .cfi_endproc directives");
270 return nullptr;
271 }
272 return &DwarfFrameInfos[FrameInfoStack.back().first];
273}
274
275bool MCStreamer::emitCVFileDirective(unsigned FileNo, StringRef Filename,
276 ArrayRef<uint8_t> Checksum,
277 unsigned ChecksumKind) {
278 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
279 ChecksumKind);
280}
281
284}
285
287 unsigned IAFunc, unsigned IAFile,
288 unsigned IALine, unsigned IACol,
289 SMLoc Loc) {
290 if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
291 getContext().reportError(Loc, "parent function id not introduced by "
292 ".cv_func_id or .cv_inline_site_id");
293 return true;
294 }
295
297 FunctionId, IAFunc, IAFile, IALine, IACol);
298}
299
300void MCStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
301 unsigned Line, unsigned Column,
302 bool PrologueEnd, bool IsStmt,
303 StringRef FileName, SMLoc Loc) {}
304
305bool MCStreamer::checkCVLocSection(unsigned FuncId, unsigned FileNo,
306 SMLoc Loc) {
309 if (!FI) {
311 Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
312 return false;
313 }
314
315 // Track the section
316 if (FI->Section == nullptr)
318 else if (FI->Section != getCurrentSectionOnly()) {
320 Loc,
321 "all .cv_loc directives for a function must be in the same section");
322 return false;
323 }
324 return true;
325}
326
328 const MCSymbol *Begin,
329 const MCSymbol *End) {}
330
331void MCStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
332 unsigned SourceFileId,
333 unsigned SourceLineNum,
334 const MCSymbol *FnStartSym,
335 const MCSymbol *FnEndSym) {}
336
337/// Only call this on endian-specific types like ulittle16_t and little32_t, or
338/// structs composed of them.
339template <typename T>
340static void copyBytesForDefRange(SmallString<20> &BytePrefix,
341 codeview::SymbolKind SymKind,
342 const T &DefRangeHeader) {
343 BytePrefix.resize(2 + sizeof(T));
344 codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
345 memcpy(&BytePrefix[0], &SymKindLE, 2);
346 memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
347}
348
350 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
351 StringRef FixedSizePortion) {}
352
354 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
356 SmallString<20> BytePrefix;
357 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
358 emitCVDefRangeDirective(Ranges, BytePrefix);
359}
360
362 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
364 SmallString<20> BytePrefix;
365 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
366 DRHdr);
367 emitCVDefRangeDirective(Ranges, BytePrefix);
368}
369
371 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
373 SmallString<20> BytePrefix;
374 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
375 emitCVDefRangeDirective(Ranges, BytePrefix);
376}
377
379 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
381 SmallString<20> BytePrefix;
382 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
383 DRHdr);
384 emitCVDefRangeDirective(Ranges, BytePrefix);
385}
386
388 MCSymbol *EHSymbol) {
389}
390
391void MCStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
392 switchSectionNoPrint(getContext().getObjectFileInfo()->getTextSection());
393}
394
396 Symbol->redefineIfPossible();
397
398 if (!Symbol->isUndefined() || Symbol->isVariable())
399 return getContext().reportError(Loc, "symbol '" + Twine(Symbol->getName()) +
400 "' is already defined");
401
402 assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
403 assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
404 assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
405 assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
406
407 Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
408
410 if (TS)
411 TS->emitLabel(Symbol);
412}
413
415 const MCExpr *Value) {}
416
417void MCStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {}
418
419void MCStreamer::emitCFIStartProc(bool IsSimple, SMLoc Loc) {
420 if (!FrameInfoStack.empty() &&
421 getCurrentSectionOnly() == FrameInfoStack.back().second)
422 return getContext().reportError(
423 Loc, "starting new .cfi frame before finishing the previous one");
424
425 MCDwarfFrameInfo Frame;
426 Frame.IsSimple = IsSimple;
428
429 const MCAsmInfo* MAI = Context.getAsmInfo();
430 if (MAI) {
431 for (const MCCFIInstruction& Inst : MAI->getInitialFrameState()) {
432 if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
433 Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister ||
434 Inst.getOperation() == MCCFIInstruction::OpLLVMDefAspaceCfa) {
435 Frame.CurrentCfaRegister = Inst.getRegister();
436 }
437 }
438 }
439
440 FrameInfoStack.emplace_back(DwarfFrameInfos.size(), getCurrentSectionOnly());
441 DwarfFrameInfos.push_back(std::move(Frame));
442}
443
445}
446
448 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
449 if (!CurFrame)
450 return;
451 emitCFIEndProcImpl(*CurFrame);
452 FrameInfoStack.pop_back();
453}
454
456 // Put a dummy non-null value in Frame.End to mark that this frame has been
457 // closed.
458 Frame.End = (MCSymbol *)1;
459}
460
462 // Create a label and insert it into the line table and return this label
463 const MCDwarfLoc &DwarfLoc = getContext().getCurrentDwarfLoc();
464
465 MCSymbol *LineStreamLabel = getContext().createTempSymbol();
466 MCDwarfLineEntry LabelLineEntry(nullptr, DwarfLoc, LineStreamLabel);
467 getContext()
468 .getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
470 .addLineEntry(LabelLineEntry, getCurrentSectionOnly() /*Section*/);
471
472 return LineStreamLabel;
473}
474
476 // Return a dummy non-null value so that label fields appear filled in when
477 // generating textual assembly.
478 return (MCSymbol *)1;
479}
480
481void MCStreamer::emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc) {
482 MCSymbol *Label = emitCFILabel();
485 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
486 if (!CurFrame)
487 return;
488 CurFrame->Instructions.push_back(std::move(Instruction));
489 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
490}
491
493 MCSymbol *Label = emitCFILabel();
496 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
497 if (!CurFrame)
498 return;
499 CurFrame->Instructions.push_back(std::move(Instruction));
500}
501
502void MCStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc) {
503 MCSymbol *Label = emitCFILabel();
505 MCCFIInstruction::createAdjustCfaOffset(Label, Adjustment, Loc);
506 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
507 if (!CurFrame)
508 return;
509 CurFrame->Instructions.push_back(std::move(Instruction));
510}
511
513 MCSymbol *Label = emitCFILabel();
516 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
517 if (!CurFrame)
518 return;
519 CurFrame->Instructions.push_back(std::move(Instruction));
520 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
521}
522
524 int64_t AddressSpace, SMLoc Loc) {
525 MCSymbol *Label = emitCFILabel();
527 Label, Register, Offset, AddressSpace, Loc);
528 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
529 if (!CurFrame)
530 return;
531 CurFrame->Instructions.push_back(std::move(Instruction));
532 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
533}
534
535void MCStreamer::emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc) {
536 MCSymbol *Label = emitCFILabel();
539 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
540 if (!CurFrame)
541 return;
542 CurFrame->Instructions.push_back(std::move(Instruction));
543}
544
546 MCSymbol *Label = emitCFILabel();
549 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
550 if (!CurFrame)
551 return;
552 CurFrame->Instructions.push_back(std::move(Instruction));
553}
554
556 unsigned Encoding) {
557 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
558 if (!CurFrame)
559 return;
560 CurFrame->Personality = Sym;
561 CurFrame->PersonalityEncoding = Encoding;
562}
563
564void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
565 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
566 if (!CurFrame)
567 return;
568 CurFrame->Lsda = Sym;
569 CurFrame->LsdaEncoding = Encoding;
570}
571
573 MCSymbol *Label = emitCFILabel();
576 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
577 if (!CurFrame)
578 return;
579 CurFrame->Instructions.push_back(std::move(Instruction));
580}
581
583 // FIXME: Error if there is no matching cfi_remember_state.
584 MCSymbol *Label = emitCFILabel();
587 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
588 if (!CurFrame)
589 return;
590 CurFrame->Instructions.push_back(std::move(Instruction));
591}
592
594 MCSymbol *Label = emitCFILabel();
597 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
598 if (!CurFrame)
599 return;
600 CurFrame->Instructions.push_back(std::move(Instruction));
601}
602
604 MCSymbol *Label = emitCFILabel();
607 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
608 if (!CurFrame)
609 return;
610 CurFrame->Instructions.push_back(std::move(Instruction));
611}
612
614 MCSymbol *Label = emitCFILabel();
616 MCCFIInstruction::createEscape(Label, Values, Loc, "");
617 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
618 if (!CurFrame)
619 return;
620 CurFrame->Instructions.push_back(std::move(Instruction));
621}
622
624 MCSymbol *Label = emitCFILabel();
627 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
628 if (!CurFrame)
629 return;
630 CurFrame->Instructions.push_back(std::move(Instruction));
631}
632
634 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
635 if (!CurFrame)
636 return;
637 CurFrame->IsSignalFrame = true;
638}
639
641 MCSymbol *Label = emitCFILabel();
644 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
645 if (!CurFrame)
646 return;
647 CurFrame->Instructions.push_back(std::move(Instruction));
648}
649
650void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
651 SMLoc Loc) {
652 MCSymbol *Label = emitCFILabel();
654 MCCFIInstruction::createRegister(Label, Register1, Register2, Loc);
655 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
656 if (!CurFrame)
657 return;
658 CurFrame->Instructions.push_back(std::move(Instruction));
659}
660
662 MCSymbol *Label = emitCFILabel();
664 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
665 if (!CurFrame)
666 return;
667 CurFrame->Instructions.push_back(std::move(Instruction));
668}
669
671 MCSymbol *Label = emitCFILabel();
674 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
675 if (!CurFrame)
676 return;
677 CurFrame->Instructions.push_back(std::move(Instruction));
678}
679
681 MCSymbol *Label = emitCFILabel();
684 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
685 if (!CurFrame)
686 return;
687 CurFrame->Instructions.push_back(std::move(Instruction));
688}
689
691 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
692 if (!CurFrame)
693 return;
694 CurFrame->RAReg = Register;
695}
696
698 MCSymbol *Label = emitCFILabel();
700 if (MCDwarfFrameInfo *F = getCurrentDwarfFrameInfo())
701 F->Instructions.push_back(MCCFIInstruction::createLabel(Label, Sym, Loc));
702}
703
705 MCSymbol *Label = emitCFILabel();
708 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
709 if (!CurFrame)
710 return;
711 CurFrame->Instructions.push_back(std::move(Instruction));
712}
713
715 const MCAsmInfo *MAI = Context.getAsmInfo();
716 if (!MAI->usesWindowsCFI()) {
718 Loc, ".seh_* directives are not supported on this target");
719 return nullptr;
720 }
721 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
723 Loc, ".seh_ directive must appear within an active frame");
724 return nullptr;
725 }
726 return CurrentWinFrameInfo;
727}
728
730 const MCAsmInfo *MAI = Context.getAsmInfo();
731 if (!MAI->usesWindowsCFI())
732 return getContext().reportError(
733 Loc, ".seh_* directives are not supported on this target");
734 if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
736 Loc, "Starting a function before ending the previous one!");
737
738 MCSymbol *StartProc = emitCFILabel();
739
740 CurrentProcWinFrameInfoStartIndex = WinFrameInfos.size();
741 WinFrameInfos.emplace_back(
742 std::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
743 CurrentWinFrameInfo = WinFrameInfos.back().get();
744 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
745 CurrentWinFrameInfo->FunctionLoc = Loc;
746}
747
750 if (!CurFrame)
751 return;
752 if (CurFrame->ChainedParent)
753 getContext().reportError(Loc, "Not all chained regions terminated!");
754
755 MCSymbol *Label = emitCFILabel();
756 CurFrame->End = Label;
757 if (!CurFrame->FuncletOrFuncEnd)
758 CurFrame->FuncletOrFuncEnd = CurFrame->End;
759
760 for (size_t I = CurrentProcWinFrameInfoStartIndex, E = WinFrameInfos.size();
761 I != E; ++I)
762 emitWindowsUnwindTables(WinFrameInfos[I].get());
763 switchSection(CurFrame->TextSection);
764}
765
768 if (!CurFrame)
769 return;
770 if (CurFrame->ChainedParent)
771 getContext().reportError(Loc, "Not all chained regions terminated!");
772
773 MCSymbol *Label = emitCFILabel();
774 CurFrame->FuncletOrFuncEnd = Label;
775}
776
779 if (!CurFrame)
780 return;
781
782 MCSymbol *StartProc = emitCFILabel();
783
784 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
785 CurFrame->Function, StartProc, CurFrame));
786 CurrentWinFrameInfo = WinFrameInfos.back().get();
787 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
789
792 if (!CurFrame)
793 return;
794 if (!CurFrame->ChainedParent)
795 return getContext().reportError(
796 Loc, "End of a chained region outside a chained region!");
797
798 MCSymbol *Label = emitCFILabel();
800 CurFrame->End = Label;
801 CurrentWinFrameInfo = const_cast<WinEH::FrameInfo *>(CurFrame->ChainedParent);
802}
803
804void MCStreamer::emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
805 SMLoc Loc) {
807 if (!CurFrame)
808 return;
809 if (CurFrame->ChainedParent)
810 return getContext().reportError(
811 Loc, "Chained unwind areas can't have handlers!");
812 CurFrame->ExceptionHandler = Sym;
813 if (!Except && !Unwind)
814 getContext().reportError(Loc, "Don't know what kind of handler this is!");
815 if (Unwind)
816 CurFrame->HandlesUnwind = true;
817 if (Except)
818 CurFrame->HandlesExceptions = true;
819}
820
823 if (!CurFrame)
824 return;
825 if (CurFrame->ChainedParent)
826 getContext().reportError(Loc, "Chained unwind areas can't have handlers!");
827}
828
830 const MCSymbolRefExpr *To, uint64_t Count) {
831}
832
833static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
834 MCSection *MainCFISec,
835 const MCSection *TextSec) {
836 // If this is the main .text section, use the main unwind info section.
837 if (TextSec == Context.getObjectFileInfo()->getTextSection())
838 return MainCFISec;
839
840 const auto *TextSecCOFF = static_cast<const MCSectionCOFF *>(TextSec);
841 auto *MainCFISecCOFF = static_cast<MCSectionCOFF *>(MainCFISec);
842 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
843
844 // If this section is COMDAT, this unwind section should be COMDAT associative
845 // with its group.
846 const MCSymbol *KeySym = nullptr;
847 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
848 KeySym = TextSecCOFF->getCOMDATSymbol();
849
850 // In a GNU environment, we can't use associative comdats. Instead, do what
851 // GCC does, which is to make plain comdat selectany section named like
852 // ".[px]data$_Z3foov".
853 if (!Context.getAsmInfo()->hasCOFFAssociativeComdats()) {
854 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
855 TextSecCOFF->getName().split('$').second)
856 .str();
857 return Context.getCOFFSection(SectionName,
858 MainCFISecCOFF->getCharacteristics() |
861 }
862 }
863
864 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
865}
866
868 return getWinCFISection(getContext(), &NextWinCFIID,
869 getContext().getObjectFileInfo()->getPDataSection(),
870 TextSec);
871}
872
874 return getWinCFISection(getContext(), &NextWinCFIID,
875 getContext().getObjectFileInfo()->getXDataSection(),
876 TextSec);
877}
878
880
881static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
882 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
883}
884
887 if (!CurFrame)
888 return;
889
890 MCSymbol *Label = emitCFILabel();
891
893 Label, encodeSEHRegNum(Context, Register));
894 CurFrame->Instructions.push_back(Inst);
895}
896
898 SMLoc Loc) {
900 if (!CurFrame)
901 return;
902 if (CurFrame->LastFrameInst >= 0)
903 return getContext().reportError(
904 Loc, "frame register and offset can be set at most once");
905 if (Offset & 0x0F)
906 return getContext().reportError(Loc, "offset is not a multiple of 16");
907 if (Offset > 240)
908 return getContext().reportError(
909 Loc, "frame offset must be less than or equal to 240");
910
911 MCSymbol *Label = emitCFILabel();
912
915 CurFrame->LastFrameInst = CurFrame->Instructions.size();
916 CurFrame->Instructions.push_back(Inst);
917}
918
921 if (!CurFrame)
922 return;
923 if (Size == 0)
924 return getContext().reportError(Loc,
925 "stack allocation size must be non-zero");
926 if (Size & 7)
927 return getContext().reportError(
928 Loc, "stack allocation size is not a multiple of 8");
929
930 MCSymbol *Label = emitCFILabel();
931
933 CurFrame->Instructions.push_back(Inst);
934}
935
937 SMLoc Loc) {
939 if (!CurFrame)
940 return;
941
942 if (Offset & 7)
943 return getContext().reportError(
944 Loc, "register save offset is not 8 byte aligned");
945
946 MCSymbol *Label = emitCFILabel();
947
949 Label, encodeSEHRegNum(Context, Register), Offset);
950 CurFrame->Instructions.push_back(Inst);
951}
952
954 SMLoc Loc) {
956 if (!CurFrame)
957 return;
958 if (Offset & 0x0F)
959 return getContext().reportError(Loc, "offset is not a multiple of 16");
960
961 MCSymbol *Label = emitCFILabel();
962
964 Label, encodeSEHRegNum(Context, Register), Offset);
965 CurFrame->Instructions.push_back(Inst);
966}
967
970 if (!CurFrame)
971 return;
972 if (!CurFrame->Instructions.empty())
973 return getContext().reportError(
974 Loc, "If present, PushMachFrame must be the first UOP");
975
976 MCSymbol *Label = emitCFILabel();
977
979 CurFrame->Instructions.push_back(Inst);
980}
981
984 if (!CurFrame)
985 return;
986
987 MCSymbol *Label = emitCFILabel();
988
989 CurFrame->PrologEnd = Label;
990}
991
994 if (!CurFrame)
995 return;
996
997 if (!CurFrame->PrologEnd)
998 return getContext().reportError(
999 Loc, "starting epilogue (.seh_startepilogue) before prologue has ended "
1000 "(.seh_endprologue) in " +
1001 CurFrame->Function->getName());
1002
1003 MCSymbol *Label = emitCFILabel();
1005 &CurFrame->EpilogMap.insert_or_assign(Label, WinEH::FrameInfo::Epilog())
1006 .first->second;
1007 CurrentWinEpilog->Start = Label;
1008 CurrentWinEpilog->Loc = Loc;
1009}
1010
1013 if (!CurFrame)
1014 return;
1015
1016 if (!CurrentWinEpilog)
1017 return getContext().reportError(Loc, "Stray .seh_endepilogue in " +
1018 CurFrame->Function->getName());
1019
1020 if ((CurFrame->Version >= 2) && !CurrentWinEpilog->UnwindV2Start)
1021 return getContext().reportError(Loc, "Missing .seh_unwindv2start in " +
1022 CurFrame->Function->getName());
1023
1025 CurrentWinEpilog = nullptr;
1026}
1027
1030 if (!CurFrame)
1031 return;
1032
1033 if (!CurrentWinEpilog)
1034 return getContext().reportError(Loc, "Stray .seh_unwindv2start in " +
1035 CurFrame->Function->getName());
1036
1038 return getContext().reportError(Loc, "Duplicate .seh_unwindv2start in " +
1039 CurFrame->Function->getName());
1040
1041 MCSymbol *Label = emitCFILabel();
1043}
1044
1047 if (!CurFrame)
1048 return;
1049
1051 return getContext().reportError(Loc, "Duplicate .seh_unwindversion in " +
1052 CurFrame->Function->getName());
1053
1054 if (Version != 2)
1055 return getContext().reportError(
1056 Loc, "Unsupported version specified in .seh_unwindversion in " +
1057 CurFrame->Function->getName());
1058
1059 CurFrame->Version = Version;
1060}
1061
1063
1065
1067
1069
1070void MCStreamer::emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
1071
1073
1075
1076/// EmitRawText - If this file is backed by an assembly streamer, this dumps
1077/// the specified string in the output .s file. This capability is
1078/// indicated by the hasRawTextSupport() predicate.
1080 // This is not llvm_unreachable for the sake of out of tree backend
1081 // developers who may not have assembly streamers and should serve as a
1082 // reminder to not accidentally call EmitRawText in the absence of such.
1083 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
1084 "it (target backend is likely missing an AsmStreamer "
1085 "implementation)");
1086}
1087
1089 SmallString<128> Str;
1090 emitRawTextImpl(T.toStringRef(Str));
1091}
1092
1094
1096
1098 if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) ||
1099 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
1100 getContext().reportError(EndLoc, "Unfinished frame!");
1101 return;
1102 }
1103
1105 if (TS)
1106 TS->finish();
1107
1108 finishImpl();
1109}
1110
1112 if (Context.getDwarfFormat() != dwarf::DWARF64)
1113 return;
1114 AddComment("DWARF64 Mark");
1116}
1117
1119 assert(Context.getDwarfFormat() == dwarf::DWARF64 ||
1122 AddComment(Comment);
1124}
1125
1127 const Twine &Comment) {
1129 AddComment(Comment);
1130 MCSymbol *Lo = Context.createTempSymbol(Prefix + "_start");
1131 MCSymbol *Hi = Context.createTempSymbol(Prefix + "_end");
1132
1135 // emit the begin symbol after we generate the length field.
1136 emitLabel(Lo);
1137 // Return the Hi symbol to the caller.
1138 return Hi;
1139}
1140
1142 // Set the value of the symbol, as we are at the start of the line table.
1143 emitLabel(StartSym);
1144}
1145
1148 Symbol->setVariableValue(Value);
1149
1151 if (TS)
1152 TS->emitAssignment(Symbol, Value);
1153}
1154
1156 uint64_t Address, const MCInst &Inst,
1157 const MCSubtargetInfo &STI,
1158 raw_ostream &OS) {
1159 InstPrinter.printInst(&Inst, Address, "", STI, OS);
1160}
1161
1163}
1164
1166 switch (Expr.getKind()) {
1167 case MCExpr::Target:
1168 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
1169 break;
1170
1171 case MCExpr::Constant:
1172 break;
1173
1174 case MCExpr::Binary: {
1175 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
1176 visitUsedExpr(*BE.getLHS());
1177 visitUsedExpr(*BE.getRHS());
1178 break;
1179 }
1180
1181 case MCExpr::SymbolRef:
1182 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
1183 break;
1184
1185 case MCExpr::Unary:
1186 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
1187 break;
1188
1189 case MCExpr::Specifier:
1190 visitUsedExpr(*cast<MCSpecifierExpr>(Expr).getSubExpr());
1191 break;
1192 }
1193}
1194
1196 // Scan for values.
1197 for (unsigned i = Inst.getNumOperands(); i--;)
1198 if (Inst.getOperand(i).isExpr())
1199 visitUsedExpr(*Inst.getOperand(i).getExpr());
1200}
1201
1203 uint64_t Attr, uint64_t Discriminator,
1204 const MCPseudoProbeInlineStack &InlineStack,
1205 MCSymbol *FnSym) {
1206 auto &Context = getContext();
1207
1208 // Create a symbol at in the current section for use in the probe.
1209 MCSymbol *ProbeSym = Context.createTempSymbol();
1210
1211 // Set the value of the symbol to use for the MCPseudoProbe.
1212 emitLabel(ProbeSym);
1213
1214 // Create a (local) probe entry with the symbol.
1215 MCPseudoProbe Probe(ProbeSym, Guid, Index, Type, Attr, Discriminator);
1216
1217 // Add the probe entry to this section's entries.
1219 FnSym, Probe, InlineStack);
1220}
1221
1223 unsigned Size) {
1224 // Get the Hi-Lo expression.
1225 const MCExpr *Diff =
1227 MCSymbolRefExpr::create(Lo, Context), Context);
1228
1229 const MCAsmInfo *MAI = Context.getAsmInfo();
1230 if (!MAI->doesSetDirectiveSuppressReloc()) {
1231 emitValue(Diff, Size);
1232 return;
1233 }
1234
1235 // Otherwise, emit with .set (aka assignment).
1236 MCSymbol *SetLabel = Context.createTempSymbol("set");
1237 emitAssignment(SetLabel, Diff);
1238 emitSymbolValue(SetLabel, Size);
1239}
1240
1242 const MCSymbol *Lo) {
1243 // Get the Hi-Lo expression.
1244 const MCExpr *Diff =
1246 MCSymbolRefExpr::create(Lo, Context), Context);
1247
1248 emitULEB128Value(Diff);
1249}
1250
1253 "emitSubsectionsViaSymbols only supported on Mach-O targets");
1254}
1255void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
1257 llvm_unreachable("this directive only supported on COFF targets");
1258}
1260 llvm_unreachable("this directive only supported on COFF targets");
1261}
1264 StringRef CompilerVersion,
1265 StringRef TimeStamp, StringRef Description) {
1266}
1268 llvm_unreachable("this directive only supported on COFF targets");
1269}
1271 llvm_unreachable("this directive only supported on COFF targets");
1272}
1274 MCSymbol *CsectSym,
1275 Align Alignment) {
1276 llvm_unreachable("this directive only supported on XCOFF targets");
1277}
1278
1280 MCSymbolAttr Linkage,
1281 MCSymbolAttr Visibility) {
1282 llvm_unreachable("emitXCOFFSymbolLinkageWithVisibility is only supported on "
1283 "XCOFF targets");
1284}
1285
1287 StringRef Rename) {}
1288
1290 llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");
1291}
1292
1294 const MCSymbol *Trap,
1295 unsigned Lang, unsigned Reason,
1296 unsigned FunctionSize,
1297 bool hasDebug) {
1298 report_fatal_error("emitXCOFFExceptDirective is only supported on "
1299 "XCOFF targets");
1300}
1301
1303 llvm_unreachable("emitXCOFFCInfoSym is only supported on"
1304 "XCOFF targets");
1305}
1306
1309 StringRef Name, bool KeepOriginalSym) {}
1311 Align ByteAlignment) {}
1313}
1315 uint64_t Size, Align ByteAlignment) {}
1316
1318 CurFrag = &Sec->getDummyFragment();
1319 auto *Sym = Sec->getBeginSymbol();
1320 if (!Sym || !Sym->isUndefined())
1321 return;
1322 // In Mach-O, DWARF sections use Begin as a temporary label, requiring a label
1323 // definition, unlike section symbols in other file formats.
1324 if (getContext().getObjectFileType() == MCContext::IsMachO)
1325 emitLabel(Sym);
1326 else
1327 Sym->setFragment(CurFrag);
1328}
1329
1333void MCStreamer::emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc) {
1335}
1338void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}
1339void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
1340 SMLoc Loc) {}
1343 unsigned MaxBytesToEmit) {}
1345 SMLoc Loc) {}
1347
1349 if (SectionStack.size() <= 1)
1350 return false;
1351 auto I = SectionStack.end();
1352 --I;
1353 MCSectionSubPair OldSec = I->first;
1354 --I;
1355 MCSectionSubPair NewSec = I->first;
1356
1357 if (NewSec.first && OldSec != NewSec)
1358 changeSection(NewSec.first, NewSec.second);
1359 SectionStack.pop_back();
1360 return true;
1361}
1362
1364 assert(Section && "Cannot switch to a null section!");
1365 MCSectionSubPair curSection = SectionStack.back().first;
1366 SectionStack.back().second = curSection;
1367 if (MCSectionSubPair(Section, Subsection) != curSection) {
1368 changeSection(Section, Subsection);
1369 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
1370 assert(!Section->hasEnded() && "Section already ended");
1371 }
1372}
1373
1374bool MCStreamer::switchSection(MCSection *Section, const MCExpr *SubsecExpr) {
1375 int64_t Subsec = 0;
1376 if (SubsecExpr) {
1377 if (!SubsecExpr->evaluateAsAbsolute(Subsec, getAssemblerPtr())) {
1378 getContext().reportError(SubsecExpr->getLoc(),
1379 "cannot evaluate subsection number");
1380 return true;
1381 }
1382 if (!isUInt<31>(Subsec)) {
1383 getContext().reportError(SubsecExpr->getLoc(),
1384 "subsection number " + Twine(Subsec) +
1385 " is not within [0,2147483647]");
1386 return true;
1387 }
1388 }
1389 switchSection(Section, Subsec);
1390 return false;
1391}
1392
1394 SectionStack.back().second = SectionStack.back().first;
1395 SectionStack.back().first = MCSectionSubPair(Section, 0);
1396 changeSection(Section, 0);
1397}
1398
1400 // TODO: keep track of the last subsection so that this symbol appears in the
1401 // correct place.
1402 MCSymbol *Sym = Section->getEndSymbol(Context);
1403 if (Sym->isInSection())
1404 return Sym;
1405
1406 switchSection(Section);
1407 emitLabel(Sym);
1408 return Sym;
1409}
1410
1412 auto *Sec = CurFrag->getParent();
1413 F->setParent(Sec);
1414 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
1415 CurFrag->Next = F;
1416 CurFrag = F;
1417 Sec->curFragList()->Tail = F;
1418}
1419
1420static VersionTuple
1422 VersionTuple TargetVersion) {
1423 VersionTuple Min = Target.getMinimumSupportedOSVersion();
1424 return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
1425}
1426
1427static MCVersionMinType
1429 assert(Target.isOSDarwin() && "expected a darwin OS");
1430 switch (Target.getOS()) {
1431 case Triple::MacOSX:
1432 case Triple::Darwin:
1433 return MCVM_OSXVersionMin;
1434 case Triple::IOS:
1435 assert(!Target.isMacCatalystEnvironment() &&
1436 "mac Catalyst should use LC_BUILD_VERSION");
1437 return MCVM_IOSVersionMin;
1438 case Triple::TvOS:
1439 return MCVM_TvOSVersionMin;
1440 case Triple::WatchOS:
1442 default:
1443 break;
1444 }
1445 llvm_unreachable("unexpected OS type");
1446}
1447
1449 assert(Target.isOSDarwin() && "expected a darwin OS");
1450 switch (Target.getOS()) {
1451 case Triple::MacOSX:
1452 case Triple::Darwin:
1453 return VersionTuple(10, 14);
1454 case Triple::IOS:
1455 // Mac Catalyst always uses the build version load command.
1456 if (Target.isMacCatalystEnvironment())
1457 return VersionTuple();
1458 [[fallthrough]];
1459 case Triple::TvOS:
1460 return VersionTuple(12);
1461 case Triple::WatchOS:
1462 return VersionTuple(5);
1463 case Triple::DriverKit:
1464 case Triple::BridgeOS:
1465 case Triple::XROS:
1466 // DriverKit/BridgeOS/XROS always use the build version load command.
1467 return VersionTuple();
1468 default:
1469 break;
1470 }
1471 llvm_unreachable("unexpected OS type");
1472}
1473
1476 assert(Target.isOSDarwin() && "expected a darwin OS");
1477 switch (Target.getOS()) {
1478 case Triple::MacOSX:
1479 case Triple::Darwin:
1480 return MachO::PLATFORM_MACOS;
1481 case Triple::IOS:
1482 if (Target.isMacCatalystEnvironment())
1483 return MachO::PLATFORM_MACCATALYST;
1484 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
1485 : MachO::PLATFORM_IOS;
1486 case Triple::TvOS:
1487 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
1488 : MachO::PLATFORM_TVOS;
1489 case Triple::WatchOS:
1490 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
1491 : MachO::PLATFORM_WATCHOS;
1492 case Triple::DriverKit:
1493 return MachO::PLATFORM_DRIVERKIT;
1494 case Triple::XROS:
1495 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
1496 : MachO::PLATFORM_XROS;
1497 case Triple::BridgeOS:
1498 return MachO::PLATFORM_BRIDGEOS;
1499 default:
1500 break;
1501 }
1502 llvm_unreachable("unexpected OS type");
1503}
1504
1506 const Triple &Target, const VersionTuple &SDKVersion,
1507 const Triple *DarwinTargetVariantTriple,
1508 const VersionTuple &DarwinTargetVariantSDKVersion) {
1509 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
1510 return;
1511 // Do we even know the version?
1512 if (Target.getOSMajorVersion() == 0)
1513 return;
1514
1516 switch (Target.getOS()) {
1517 case Triple::MacOSX:
1518 case Triple::Darwin:
1519 Target.getMacOSXVersion(Version);
1520 break;
1521 case Triple::IOS:
1522 case Triple::TvOS:
1523 Version = Target.getiOSVersion();
1524 break;
1525 case Triple::WatchOS:
1526 Version = Target.getWatchOSVersion();
1527 break;
1528 case Triple::DriverKit:
1529 Version = Target.getDriverKitVersion();
1530 break;
1531 case Triple::XROS:
1532 case Triple::BridgeOS:
1533 Version = Target.getOSVersion();
1534 break;
1535 default:
1536 llvm_unreachable("unexpected OS type");
1537 }
1538 assert(Version.getMajor() != 0 && "A non-zero major version is expected");
1539 auto LinkedTargetVersion =
1541 auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
1542 bool ShouldEmitBuildVersion = false;
1543 if (BuildVersionOSVersion.empty() ||
1544 LinkedTargetVersion >= BuildVersionOSVersion) {
1545 if (Target.isMacCatalystEnvironment() && DarwinTargetVariantTriple &&
1546 DarwinTargetVariantTriple->isMacOSX()) {
1547 emitVersionForTarget(*DarwinTargetVariantTriple,
1548 DarwinTargetVariantSDKVersion,
1549 /*DarwinTargetVariantTriple=*/nullptr,
1550 /*DarwinTargetVariantSDKVersion=*/VersionTuple());
1553 LinkedTargetVersion.getMajor(),
1554 LinkedTargetVersion.getMinor().value_or(0),
1555 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1556 return;
1557 }
1559 LinkedTargetVersion.getMajor(),
1560 LinkedTargetVersion.getMinor().value_or(0),
1561 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1562 ShouldEmitBuildVersion = true;
1563 }
1564
1565 if (const Triple *TVT = DarwinTargetVariantTriple) {
1566 if (Target.isMacOSX() && TVT->isMacCatalystEnvironment()) {
1567 auto TVLinkedTargetVersion =
1568 targetVersionOrMinimumSupportedOSVersion(*TVT, TVT->getiOSVersion());
1571 TVLinkedTargetVersion.getMajor(),
1572 TVLinkedTargetVersion.getMinor().value_or(0),
1573 TVLinkedTargetVersion.getSubminor().value_or(0),
1574 DarwinTargetVariantSDKVersion);
1575 }
1576 }
1577
1578 if (ShouldEmitBuildVersion)
1579 return;
1580
1582 LinkedTargetVersion.getMajor(),
1583 LinkedTargetVersion.getMinor().value_or(0),
1584 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1585}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
BlockVerifier::State From
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
Definition: Debug.cpp:147
std::string Name
uint64_t Size
bool End
Definition: ELF_riscv.cpp:480
Symbol * Sym
Definition: ELF_riscv.cpp:479
static VersionTuple getMachoBuildVersionSupportedOS(const Triple &Target)
static void copyBytesForDefRange(SmallString< 20 > &BytePrefix, codeview::SymbolKind SymKind, const T &DefRangeHeader)
Only call this on endian-specific types like ulittle16_t and little32_t, or structs composed of them.
Definition: MCStreamer.cpp:340
static MCVersionMinType getMachoVersionMinLoadCommandType(const Triple &Target)
static VersionTuple targetVersionOrMinimumSupportedOSVersion(const Triple &Target, VersionTuple TargetVersion)
static MCSection * getWinCFISection(MCContext &Context, unsigned *NextWinCFIID, MCSection *MainCFISec, const MCSection *TextSec)
Definition: MCStreamer.cpp:833
static MachO::PlatformType getMachoBuildVersionPlatformType(const Triple &Target)
static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg)
Definition: MCStreamer.cpp:881
#define F(x, y, z)
Definition: MD5.cpp:55
#define I(x, y, z)
Definition: MD5.cpp:58
Profile::FuncID FuncId
Definition: Profile.cpp:320
raw_pwrite_stream & OS
This file defines the SmallString class.
Class for arbitrary precision integers.
Definition: APInt.h:78
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
Holds state from .cv_file and .cv_loc directives for later emission.
Definition: MCCodeView.h:144
bool addFile(MCStreamer &OS, unsigned FileNumber, StringRef Filename, ArrayRef< uint8_t > ChecksumBytes, uint8_t ChecksumKind)
Definition: MCCodeView.cpp:44
MCCVFunctionInfo * getCVFunctionInfo(unsigned FuncId)
Retreive the function info if this is a valid function id, or nullptr.
Definition: MCCodeView.cpp:76
bool recordFunctionId(unsigned FuncId)
Records the function id of a normal function.
Definition: MCCodeView.cpp:84
bool recordInlinedCallSiteId(unsigned FuncId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol)
Records the function id of an inlined call site.
Definition: MCCodeView.cpp:97
Tagged union holding either a T or a Error.
Definition: Error.h:485
Generic interface to target specific assembler backends.
Definition: MCAsmBackend.h:55
virtual uint64_t generateCompactUnwindEncoding(const MCDwarfFrameInfo *FI, const MCContext *Ctxt) const
Generate the compact unwind encoding for the CFI instructions.
Definition: MCAsmBackend.h:205
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition: MCAsmInfo.h:64
StringRef getPrivateGlobalPrefix() const
Definition: MCAsmInfo.h:545
bool isLittleEndian() const
True if the target is little endian.
Definition: MCAsmInfo.h:452
const std::vector< MCCFIInstruction > & getInitialFrameState() const
Definition: MCAsmInfo.h:678
const char * getData8bitsDirective() const
Definition: MCAsmInfo.h:461
void printExpr(raw_ostream &, const MCExpr &) const
Definition: MCAsmInfo.cpp:153
virtual void printSwitchToSection(const MCSection &, uint32_t Subsection, const Triple &, raw_ostream &) const
Definition: MCAsmInfo.h:489
bool doesSetDirectiveSuppressReloc() const
Definition: MCAsmInfo.h:593
bool usesWindowsCFI() const
Definition: MCAsmInfo.h:652
Binary assembler expressions.
Definition: MCExpr.h:299
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
Definition: MCExpr.h:446
const MCExpr * getRHS() const
Get the right-hand side expression of the binary operator.
Definition: MCExpr.h:449
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition: MCExpr.h:428
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
Definition: MCDwarf.h:592
static MCCFIInstruction createUndefined(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_undefined From now on the previous value of Register can't be restored anymore.
Definition: MCDwarf.h:673
static MCCFIInstruction createGnuArgsSize(MCSymbol *L, int64_t Size, SMLoc Loc={})
A special wrapper for .cfi_escape that indicates GNU_ARGS_SIZE.
Definition: MCDwarf.h:703
static MCCFIInstruction createRestore(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_restore says that the rule for Register is now the same as it was at the beginning of the functi...
Definition: MCDwarf.h:666
static MCCFIInstruction createLLVMDefAspaceCfa(MCSymbol *L, unsigned Register, int64_t Offset, unsigned AddressSpace, SMLoc Loc)
.cfi_llvm_def_aspace_cfa defines the rule for computing the CFA to be the result of evaluating the DW...
Definition: MCDwarf.h:617
static MCCFIInstruction createRegister(MCSymbol *L, unsigned Register1, unsigned Register2, SMLoc Loc={})
.cfi_register Previous value of Register1 is saved in register Register2.
Definition: MCDwarf.h:642
static MCCFIInstruction cfiDefCfa(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa defines a rule for computing CFA as: take address from Register and add Offset to it.
Definition: MCDwarf.h:585
static MCCFIInstruction createOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_offset Previous value of Register is saved at offset Offset from CFA.
Definition: MCDwarf.h:627
static MCCFIInstruction createValOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_val_offset Previous value of Register is offset Offset from the current CFA register.
Definition: MCDwarf.h:715
static MCCFIInstruction createNegateRAStateWithPC(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state_with_pc AArch64 negate RA state with PC.
Definition: MCDwarf.h:658
static MCCFIInstruction createNegateRAState(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state AArch64 negate RA state.
Definition: MCDwarf.h:653
static MCCFIInstruction createRememberState(MCSymbol *L, SMLoc Loc={})
.cfi_remember_state Save all current rules for all registers.
Definition: MCDwarf.h:686
static MCCFIInstruction cfiDefCfaOffset(MCSymbol *L, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa_offset modifies a rule for computing CFA.
Definition: MCDwarf.h:600
static MCCFIInstruction createEscape(MCSymbol *L, StringRef Vals, SMLoc Loc={}, StringRef Comment="")
.cfi_escape Allows the user to add arbitrary bytes to the unwind info.
Definition: MCDwarf.h:697
static MCCFIInstruction createWindowSave(MCSymbol *L, SMLoc Loc={})
.cfi_window_save SPARC register window is saved.
Definition: MCDwarf.h:648
static MCCFIInstruction createAdjustCfaOffset(MCSymbol *L, int64_t Adjustment, SMLoc Loc={})
.cfi_adjust_cfa_offset Same as .cfi_def_cfa_offset, but Offset is a relative value that is added/subt...
Definition: MCDwarf.h:608
static MCCFIInstruction createRestoreState(MCSymbol *L, SMLoc Loc={})
.cfi_restore_state Restore the previously saved state.
Definition: MCDwarf.h:691
static MCCFIInstruction createSameValue(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_same_value Current value of Register is the same as in the previous frame.
Definition: MCDwarf.h:680
static MCCFIInstruction createRelOffset(MCSymbol *L, unsigned Register, int64_t Offset, SMLoc Loc={})
.cfi_rel_offset Previous value of Register is saved at offset Offset from the current CFA register.
Definition: MCDwarf.h:635
static MCCFIInstruction createLabel(MCSymbol *L, MCSymbol *CfiLabel, SMLoc Loc)
Definition: MCDwarf.h:708
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
MCPseudoProbeTable & getMCPseudoProbeTable()
Definition: MCContext.h:855
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
Definition: MCContext.cpp:386
LLVM_ABI Expected< unsigned > getDwarfFile(StringRef Directory, StringRef FileName, unsigned FileNumber, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, unsigned CUID)
Creates an entry in the dwarf file and directory tables.
Definition: MCContext.cpp:1032
MCDwarfLineTable & getMCDwarfLineTable(unsigned CUID)
Definition: MCContext.h:713
LLVM_ABI CodeViewContext & getCVContext()
Definition: MCContext.cpp:1060
const MCRegisterInfo * getRegisterInfo() const
Definition: MCContext.h:414
void setCurrentDwarfLoc(unsigned FileNum, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator)
Saves the information from the currently parsed dwarf .loc directive and sets DwarfLocSeen.
Definition: MCContext.h:754
const MCAsmInfo * getAsmInfo() const
Definition: MCContext.h:412
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
Definition: MCContext.cpp:1115
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
Definition: MCContext.cpp:203
const MCDwarfLoc & getCurrentDwarfLoc()
Definition: MCContext.h:769
dwarf::DwarfFormat getDwarfFormat() const
Definition: MCContext.h:810
void setMCLineTableRootFile(unsigned CUID, StringRef CompilationDir, StringRef Filename, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source)
Specifies the "root" file and directory of the compilation unit.
Definition: MCContext.h:737
const Triple & getTargetTriple() const
Definition: MCContext.h:400
Instances of this class represent the line information for the dwarf line table entries.
Definition: MCDwarf.h:189
void setLabel(MCSymbol *Label)
Definition: MCDwarf.h:430
LLVM_ABI void endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS, SMLoc DefLoc, StringRef Name)
Definition: MCDwarf.cpp:279
const MCLineSection & getMCLineSections() const
Definition: MCDwarf.h:450
MCSymbol * getLabel() const
Definition: MCDwarf.h:426
Instances of this class represent the information from a dwarf .loc directive.
Definition: MCDwarf.h:106
Base class for the full range of assembler expressions which are needed for parsing.
Definition: MCExpr.h:34
@ Unary
Unary expressions.
Definition: MCExpr.h:44
@ Constant
Constant expressions.
Definition: MCExpr.h:42
@ SymbolRef
References to labels and assigned expressions.
Definition: MCExpr.h:43
@ Target
Target specific expression.
Definition: MCExpr.h:46
@ Specifier
Expression with a relocation specifier.
Definition: MCExpr.h:45
@ Binary
Binary expressions.
Definition: MCExpr.h:41
ExprKind getKind() const
Definition: MCExpr.h:85
SMLoc getLoc() const
Definition: MCExpr.h:86
unsigned getLayoutOrder() const
Definition: MCSection.h:163
MCSection * getParent() const
Definition: MCSection.h:158
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Definition: MCInstPrinter.h:46
virtual void printInst(const MCInst *MI, uint64_t Address, StringRef Annot, const MCSubtargetInfo &STI, raw_ostream &OS)=0
Print the specified MCInst to the specified raw_ostream.
Instances of this class represent a single low-level machine instruction.
Definition: MCInst.h:188
unsigned getNumOperands() const
Definition: MCInst.h:212
const MCOperand & getOperand(unsigned i) const
Definition: MCInst.h:210
void addLineEntry(const MCDwarfLineEntry &LineEntry, MCSection *Sec)
Definition: MCDwarf.h:240
const MCExpr * getExpr() const
Definition: MCInst.h:118
bool isExpr() const
Definition: MCInst.h:69
void addPseudoProbe(MCSymbol *FuncSym, const MCPseudoProbe &Probe, const MCPseudoProbeInlineStack &InlineStack)
MCPseudoProbeSections & getProbeSections()
Instances of this class represent a pseudo probe instance for a pseudo probe table entry,...
int getSEHRegNum(MCRegister RegNum) const
Map a target register to an equivalent SEH register number.
Wrapper class representing physical registers. Should be passed by value.
Definition: MCRegister.h:33
This represents a section on Windows.
Definition: MCSectionCOFF.h:27
unsigned getOrAssignWinCFISectionID(unsigned *NextID) const
Definition: MCSectionCOFF.h:82
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition: MCSection.h:496
MCFragment & getDummyFragment()
Definition: MCSection.h:601
MCSymbol * getBeginSymbol()
Definition: MCSection.h:568
Streaming machine code generation interface.
Definition: MCStreamer.h:220
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
Definition: MCStreamer.cpp:623
virtual void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc, const MCSubtargetInfo &STI)
Definition: MCStreamer.cpp:200
MCSymbol * emitLineTableLabel()
Definition: MCStreamer.cpp:461
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
void switchSectionNoPrint(MCSection *Section)
Similar to switchSection, but does not print the section directive.
virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:481
virtual void emitWinCFIUnwindVersion(uint8_t Version, SMLoc Loc=SMLoc())
virtual void visitUsedSymbol(const MCSymbol &Sym)
void emitCFIStartProc(bool IsSimple, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:419
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
Definition: MCStreamer.cpp:282
virtual void finishImpl()
Streamer specific finalization.
virtual void emitCFIBKeyFrame()
Definition: MCStreamer.cpp:223
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
Definition: MCStreamer.cpp:124
virtual void beginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
virtual void emitSyntaxDirective()
Definition: MCStreamer.cpp:879
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:885
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual void initSections(bool NoExecStack, const MCSubtargetInfo &STI)
Create the default sections and set the initial one.
Definition: MCStreamer.cpp:391
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual MCSymbol * emitCFILabel()
When emitting an object file, create and emit a real label.
Definition: MCStreamer.cpp:475
virtual void emitWindowsUnwindTables()
virtual raw_ostream & getCommentOS()
Return a raw_ostream that comments can be written to.
Definition: MCStreamer.cpp:109
virtual void emitZerofill(MCSection *Section, MCSymbol *Symbol=nullptr, uint64_t Size=0, Align ByteAlignment=Align(1), SMLoc Loc=SMLoc())
Emit the zerofill section and an optional symbol.
virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:804
virtual void emitCFISections(bool EH, bool Debug, bool SFrame)
Definition: MCStreamer.cpp:417
MCSection * getAssociatedPDataSection(const MCSection *TextSec)
Get the .pdata section used for the given section.
Definition: MCStreamer.cpp:867
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
Definition: MCStreamer.cpp:245
bool hasUnfinishedDwarfFrameInfo()
Definition: MCStreamer.cpp:261
virtual ~MCStreamer()
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
Definition: MCStreamer.cpp:680
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:593
virtual bool emitCVFileDirective(unsigned FileNo, StringRef Filename, ArrayRef< uint8_t > Checksum, unsigned ChecksumKind)
Associate a filename with a specified logical file number, and also specify that file's checksum info...
Definition: MCStreamer.cpp:275
virtual void emitCFIReturnColumn(int64_t Register)
Definition: MCStreamer.cpp:690
virtual void emitCOFFSymbolType(int Type)
Emit the type of the symbol.
virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:555
virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment)
Emit a unit length field.
virtual void emitCFIWindowSave(SMLoc Loc={})
Definition: MCStreamer.cpp:661
virtual void emitCOFFSymbolIndex(MCSymbol const *Symbol)
Emits the symbol table index of a Symbol into the current section.
virtual void emitWinCFIUnwindV2Start(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndEpilogue(SMLoc Loc=SMLoc())
virtual void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset)
Emits a COFF image relative relocation.
virtual void endCOFFSymbolDef()
Marks the end of the symbol definition.
virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:968
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:821
virtual MCAssembler * getAssemblerPtr()
Definition: MCStreamer.h:319
virtual void emitAbsoluteSymbolDiffAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo)
Emit the absolute difference between two symbols encoded with ULEB128.
virtual void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol, MCSymbolAttr Linkage, MCSymbolAttr Visibility)
Emit a symbol's linkage and visibility with a linkage directive for XCOFF.
virtual void emitCFIUndefined(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:640
void setTargetStreamer(MCTargetStreamer *TS)
Definition: MCStreamer.h:301
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:953
virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
Definition: MCStreamer.cpp:444
virtual void emitCOFFSecNumber(MCSymbol const *Symbol)
Emits the physical number of the section containing the given symbol as assigned during object writin...
virtual void emitCFINegateRAState(SMLoc Loc={})
Definition: MCStreamer.cpp:670
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
Definition: MCStreamer.cpp:564
MCContext & getContext() const
Definition: MCStreamer.h:314
SMLoc getStartTokLoc() const
Definition: MCStreamer.h:306
virtual Expected< unsigned > tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum=std::nullopt, std::optional< StringRef > Source=std::nullopt, unsigned CUID=0)
Associate a filename with a specified logical file number.
Definition: MCStreamer.cpp:206
virtual void addExplicitComment(const Twine &T)
Add explicit comment T.
Definition: MCStreamer.cpp:121
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
Definition: MCStreamer.h:387
virtual void emitWinCFIBeginEpilogue(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:992
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
virtual void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, MCSymbol *CsectSym, Align Alignment)
Emits an lcomm directive with XCOFF csect information.
virtual void emitCFIMTETaggedFrame()
Definition: MCStreamer.cpp:230
virtual void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset)
Emits a COFF section relative relocation.
MCSection * getAssociatedXDataSection(const MCSection *TextSec)
Get the .xdata section used for the given section.
Definition: MCStreamer.cpp:873
virtual void emitRawComment(const Twine &T, bool TabPrefix=true)
Print T and prefix it with the comment string (normally #) and optionally a tab.
Definition: MCStreamer.cpp:119
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:729
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:178
void emitSymbolValue(const MCSymbol *Sym, unsigned Size, bool IsSectionRelative=false)
Special case of EmitValue that avoids the client having to pass in a MCExpr for MCSymbols.
Definition: MCStreamer.cpp:182
bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
Definition: MCStreamer.cpp:305
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
Definition: MCStreamer.cpp:613
virtual void emitAbsoluteSymbolDiff(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size)
Emit the absolute difference between two symbols.
virtual void emitXCOFFExceptDirective(const MCSymbol *Symbol, const MCSymbol *Trap, unsigned Lang, unsigned Reason, unsigned FunctionSize, bool hasDebug)
Emit an XCOFF .except directive which adds information about a trap instruction to the object file ex...
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
Definition: MCStreamer.cpp:395
virtual void emitCOFFSectionIndex(MCSymbol const *Symbol)
Emits a COFF section index.
virtual void emitCFIRememberState(SMLoc Loc)
Definition: MCStreamer.cpp:572
virtual void reset()
State management.
Definition: MCStreamer.cpp:100
virtual void emitValueToAlignment(Align Alignment, int64_t Fill=0, uint8_t FillLen=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
virtual void emitCFILabelDirective(SMLoc Loc, StringRef Name)
Definition: MCStreamer.cpp:697
virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName, StringRef Comment={})
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
Definition: MCStreamer.cpp:237
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
Definition: MCStreamer.cpp:327
virtual void emitCOFFSecOffset(MCSymbol const *Symbol)
Emits the offset of the symbol from the beginning of the section during object writing (i....
MCTargetStreamer * getTargetStreamer()
Definition: MCStreamer.h:324
MCStreamer(MCContext &Ctx)
Definition: MCStreamer.cpp:92
MCFragment * CurFrag
Definition: MCStreamer.h:267
virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Definition: MCStreamer.h:508
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:132
unsigned getNumFrameInfos()
Definition: MCStreamer.cpp:114
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:936
virtual void emitWinCFIEndChained(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:790
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:982
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:748
virtual void emitSubsectionsViaSymbols()
Emit a .subsection_via_symbols directive.
void emitVersionForTarget(const Triple &Target, const VersionTuple &SDKVersion, const Triple *DarwinTargetVariantTriple, const VersionTuple &DarwinTargetVariantSDKVersion)
virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0)
Emit nops until the byte alignment ByteAlignment is reached.
virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
Definition: MCStreamer.cpp:455
virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue)
Set the DescValue for the Symbol.
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:512
virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)
Emit a local common (.lcomm) symbol.
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
Definition: MCStreamer.cpp:251
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
Definition: MCStreamer.cpp:650
virtual void emitCOFFSafeSEH(MCSymbol const *Symbol)
virtual void emitWinCFIFuncletOrFuncEnd(SMLoc Loc=SMLoc())
This is used on platforms, such as Windows on ARM64, that require function or funclet sizes to be emi...
Definition: MCStreamer.cpp:766
virtual void emitXCOFFRenameDirective(const MCSymbol *Name, StringRef Rename)
Emit a XCOFF .rename directive which creates a synonym for an illegal or undesirable name.
virtual void emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type, uint64_t Attr, uint64_t Discriminator, const MCPseudoProbeInlineStack &InlineStack, MCSymbol *FnSym)
Emit the a pseudo probe into the current section.
virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count)
Definition: MCStreamer.cpp:829
virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
Definition: MCStreamer.cpp:502
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:160
virtual void emitULEB128Value(const MCExpr *Value)
ArrayRef< MCDwarfFrameInfo > getDwarfFrameInfos() const
Definition: MCStreamer.cpp:115
virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc)
Definition: MCStreamer.cpp:545
virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc)
Emit some number of copies of Value until the byte offset Offset is reached.
MCSymbol * endSection(MCSection *Section)
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitExplicitComments()
Emit added explicit comments.
Definition: MCStreamer.cpp:122
WinEH::FrameInfo * EnsureValidWinFrameInfo(SMLoc Loc)
Retrieve the current frame info if one is available and it is not yet closed.
Definition: MCStreamer.cpp:714
virtual void emitCFIRestoreState(SMLoc Loc)
Definition: MCStreamer.cpp:582
virtual void emitXCOFFRefDirective(const MCSymbol *Symbol)
Emit a XCOFF .ref directive which creates R_REF type entry in the relocation table for one or more sy...
virtual void emitEHSymAttributes(const MCSymbol *Symbol, MCSymbol *EHSymbol)
Definition: MCStreamer.cpp:387
virtual void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
This implements the CodeView '.cv_def_range' assembler directive.
Definition: MCStreamer.cpp:349
void emitInt32(uint64_t Value)
Definition: MCStreamer.h:750
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:535
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:897
void maybeEmitDwarf64Mark()
Emit a special value of 0xffffffff if producing 64-bit debugging info.
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:492
virtual void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc)
This implements the CodeView '.cv_loc' assembler directive.
Definition: MCStreamer.cpp:300
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:919
virtual void emitFileDirective(StringRef Filename)
Switch to a new logical file.
virtual void emitSLEB128Value(const MCExpr *Value)
virtual void emitCFIValOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
Definition: MCStreamer.cpp:704
virtual void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym)
Emit an ELF .symver directive.
virtual void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata)
Emit a C_INFO symbol with XCOFF embedded metadata to the .info section.
MCSection * getCurrentSectionOnly() const
Definition: MCStreamer.h:421
virtual void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Emit the expression Value into the output as a native integer of the given Size bytes.
void emitRawText(const Twine &String)
If this file is backed by a assembly streamer, this dumps the specified string in the output ....
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Definition: MCStreamer.cpp:204
void addFragment(MCFragment *F)
unsigned emitSLEB128IntValue(int64_t Value)
Special case of EmitSLEB128Value that avoids the client having to pass in a MCExpr for constant integ...
Definition: MCStreamer.cpp:170
virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol, SMLoc Loc)
Introduces an inline call site id for use with .cv_loc.
Definition: MCStreamer.cpp:286
virtual void emitCFISignalFrame()
Definition: MCStreamer.cpp:633
virtual void emitVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Specify the Mach-O minimum deployment target version.
Definition: MCStreamer.h:498
virtual void emitCOFFSymbolStorageClass(int StorageClass)
Emit the storage class of the symbol.
virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol, but only if Value is also emitted.
Definition: MCStreamer.cpp:414
virtual void emitWinCFIStartChained(SMLoc Loc=SMLoc())
Definition: MCStreamer.cpp:777
virtual void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, Align ByteAlignment=Align(1))
Emit a thread local bss (.tbss) symbol.
virtual void emitCFIRestore(int64_t Register, SMLoc Loc={})
Definition: MCStreamer.cpp:603
WinEH::FrameInfo::Epilog * CurrentWinEpilog
Definition: MCStreamer.h:265
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
Definition: MCStreamer.cpp:331
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
Definition: MCStreamer.cpp:195
virtual void emitRawTextImpl(StringRef String)
EmitRawText - If this file is backed by an assembly streamer, this dumps the specified string in the ...
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
void finish(SMLoc EndLoc=SMLoc())
Finish emission of machine code.
virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol)
Emit an weak reference from Alias to Symbol.
void visitUsedExpr(const MCExpr &Expr)
virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, unsigned CUID=0)
Specify the "root" file of the compilation, using the ".file 0" extension.
Definition: MCStreamer.cpp:214
virtual void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Emit/Specify Mach-O build version command.
Definition: MCStreamer.h:504
virtual void changeSection(MCSection *, uint32_t)
This is called by popSection and switchSection, if the current section changes.
virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset, int64_t AddressSpace, SMLoc Loc={})
Definition: MCStreamer.cpp:523
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
Definition: MCExpr.h:190
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
StringRef getName() const
getName - Get the symbol name.
Definition: MCSymbol.h:188
Target specific streamer interface.
Definition: MCStreamer.h:93
virtual void emitDwarfFileDirective(StringRef Directive)
Definition: MCStreamer.cpp:66
virtual void emitValue(const MCExpr *Value)
Definition: MCStreamer.cpp:70
virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, uint64_t Address, const MCInst &Inst, const MCSubtargetInfo &STI, raw_ostream &OS)
virtual void finish()
Definition: MCStreamer.cpp:55
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Definition: MCStreamer.cpp:90
virtual void emitRawBytes(StringRef Data)
Emit the bytes in Data into the output.
Definition: MCStreamer.cpp:78
MCStreamer & Streamer
Definition: MCStreamer.h:95
MCTargetStreamer(MCStreamer &S)
Definition: MCStreamer.cpp:46
virtual void changeSection(const MCSection *CurSection, MCSection *Section, uint32_t SubSection, raw_ostream &OS)
Update streamer for a new active section.
Definition: MCStreamer.cpp:59
virtual void emitLabel(MCSymbol *Symbol)
Definition: MCStreamer.cpp:53
virtual void emitConstantPools()
Definition: MCStreamer.cpp:57
Root of the metadata hierarchy.
Definition: Metadata.h:63
Wrapper class representing virtual and physical registers.
Definition: Register.h:19
Represents a location in source code.
Definition: SMLoc.h:23
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition: SmallString.h:26
StringRef str() const
Explicit conversion to StringRef.
Definition: SmallString.h:254
size_t size() const
Definition: SmallVector.h:79
void resize(size_type N)
Definition: SmallVector.h:639
void push_back(const T &Elt)
Definition: SmallVector.h:414
pointer data()
Return a pointer to the vector's buffer, even if empty().
Definition: SmallVector.h:287
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1197
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:55
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition: Triple.h:47
bool isMacOSX() const
Is this a Mac OS X triple.
Definition: Triple.h:563
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
Represents a version number in the form major[.minor[.subminor[.build]]].
Definition: VersionTuple.h:30
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
Definition: VersionTuple.h:67
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:53
A raw_ostream that writes to an SmallVector or SmallString.
Definition: raw_ostream.h:692
StringRef str() const
Return a StringRef for the vector contents.
Definition: raw_ostream.h:721
This class represents a function that is read from a sample profile.
Definition: FunctionId.h:36
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ IMAGE_SCN_LNK_COMDAT
Definition: COFF.h:309
@ IMAGE_COMDAT_SELECT_ANY
Definition: COFF.h:456
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
PlatformType
Definition: MachO.h:500
StorageClass
Definition: XCOFF.h:171
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
Definition: CodeView.h:49
@ DWARF64
Definition: Dwarf.h:92
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
Definition: Dwarf.h:1080
@ DW_LENGTH_lo_reserved
Special values for an initial length field.
Definition: Dwarf.h:55
@ DW_LENGTH_DWARF64
Indicator of 64-bit DWARF format.
Definition: Dwarf.h:56
value_type byte_swap(value_type value, endianness endian)
Definition: Endian.h:44
constexpr bool IsLittleEndianHost
Definition: SwapByteOrder.h:29
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:477
@ Length
Definition: DWP.cpp:477
LLVM_ABI void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
StoreIntToMemory - Fills the StoreBytes bytes of memory starting from Dst with the integer held in In...
Definition: APInt.cpp:3051
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:252
std::pair< MCSection *, uint32_t > MCSectionSubPair
Definition: MCStreamer.h:66
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
MCVersionMinType
Definition: MCDirectives.h:61
@ MCVM_WatchOSVersionMin
.watchos_version_min
Definition: MCDirectives.h:65
@ MCVM_OSXVersionMin
.macosx_version_min
Definition: MCDirectives.h:63
@ MCVM_TvOSVersionMin
.tvos_version_min
Definition: MCDirectives.h:64
@ MCVM_IOSVersionMin
.ios_version_min
Definition: MCDirectives.h:62
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition: Error.cpp:167
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
unsigned encodeSLEB128(int64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a SLEB128 value to an output stream.
Definition: LEB128.h:24
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition: MathExtras.h:257
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
Definition: LEB128.h:81
MCSymbolAttr
Definition: MCDirectives.h:18
This struct is a compact representation of a valid (non-zero power of two) alignment.
Definition: Alignment.h:39
Information describing a function or inlined call site introduced by .cv_func_id or ....
Definition: MCCodeView.h:98
MCSection * Section
The section of the first .cv_loc directive used for this function, or null if none has been seen yet.
Definition: MCCodeView.h:118
const MCSymbol * Personality
Definition: MCDwarf.h:774
unsigned PersonalityEncoding
Definition: MCDwarf.h:778
std::vector< MCCFIInstruction > Instructions
Definition: MCDwarf.h:776
unsigned LsdaEncoding
Definition: MCDwarf.h:779
const MCSymbol * Lsda
Definition: MCDwarf.h:775
unsigned CurrentCfaRegister
Definition: MCDwarf.h:777
static WinEH::Instruction SaveXMM(MCSymbol *L, unsigned Reg, unsigned Offset)
Definition: MCWin64EH.h:42
static WinEH::Instruction PushNonVol(MCSymbol *L, unsigned Reg)
Definition: MCWin64EH.h:26
static WinEH::Instruction PushMachFrame(MCSymbol *L, bool Code)
Definition: MCWin64EH.h:33
static WinEH::Instruction SaveNonVol(MCSymbol *L, unsigned Reg, unsigned Offset)
Definition: MCWin64EH.h:36
static WinEH::Instruction Alloc(MCSymbol *L, unsigned Size)
Definition: MCWin64EH.h:29
static WinEH::Instruction SetFPReg(MCSymbol *L, unsigned Reg, unsigned Off)
Definition: MCWin64EH.h:48
const MCSymbol * End
Definition: MCWinEH.h:68
const MCSymbol * Start
Definition: MCWinEH.h:67
const MCSymbol * UnwindV2Start
Definition: MCWinEH.h:69
std::vector< Instruction > Instructions
Definition: MCWinEH.h:63
const MCSymbol * Function
Definition: MCWinEH.h:46
MCSection * TextSection
Definition: MCWinEH.h:50
const MCSymbol * PrologEnd
Definition: MCWinEH.h:48
MapVector< MCSymbol *, Epilog > EpilogMap
Definition: MCWinEH.h:72
const MCSymbol * FuncletOrFuncEnd
Definition: MCWinEH.h:44
const MCSymbol * End
Definition: MCWinEH.h:43
const FrameInfo * ChainedParent
Definition: MCWinEH.h:62
static constexpr uint8_t DefaultVersion
Definition: MCWinEH.h:58
const MCSymbol * ExceptionHandler
Definition: MCWinEH.h:45