LLVM 23.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
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,
63 Streamer.getContext().getTargetTriple(), OS);
64}
65
69
72 raw_svector_ostream OS(Str);
73
74 Streamer.getContext().getAsmInfo()->printExpr(OS, *Value);
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()) {
83 raw_svector_ostream OS(Str);
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
180}
181
182void MCStreamer::emitSymbolValue(const MCSymbol *Sym, unsigned Size,
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
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
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
276 ArrayRef<uint8_t> Checksum,
277 unsigned ChecksumKind) {
278 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
279 ChecksumKind);
280}
281
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) {
308 MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
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
416
417void MCStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {}
418
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
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
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
503 MCSymbol *Label = emitCFILabel();
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
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 CurrentWinFrameInfo = nullptr;
753
754 MCSymbol *Label = emitCFILabel();
755 CurFrame->End = Label;
756 const MCSymbol **FuncletOrFuncEndPtr =
757 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
758 : &CurFrame->FuncletOrFuncEnd;
759 if (!*FuncletOrFuncEndPtr)
760 *FuncletOrFuncEndPtr = CurFrame->End;
761
762 if (CurrentWinEpilog) {
763 // Set End to... something... to prevent crashes later.
765 CurrentWinEpilog = nullptr;
766 getContext().reportError(Loc, "Missing .seh_endepilogue in " +
767 CurFrame->Function->getName());
768 }
769
770 for (size_t I = CurrentProcWinFrameInfoStartIndex, E = WinFrameInfos.size();
771 I != E; ++I)
772 emitWindowsUnwindTables(WinFrameInfos[I].get());
773 switchSection(CurFrame->TextSection);
774}
775
778 if (!CurFrame)
779 return;
780
781 MCSymbol *Label = emitCFILabel();
782 const MCSymbol **FuncletOrFuncEndPtr =
783 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
784 : &CurFrame->FuncletOrFuncEnd;
785 *FuncletOrFuncEndPtr = Label;
786}
787
790 if (!CurFrame)
791 return;
792
793 if (!CurFrame->PrologEnd)
794 return getContext().reportError(
795 Loc, "can't split into a new chained region (.seh_splitchained) in the "
796 "middle of a prolog in " +
797 CurFrame->Function->getName());
798
799 MCSymbol *Label = emitCFILabel();
800
801 // Complete the current frame before starting a new, chained one.
802 CurFrame->End = Label;
803
804 // All chained frames point to the same parent.
805 WinEH::FrameInfo *ChainedParent =
806 CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
807
808 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
809 CurFrame->Function, Label, ChainedParent));
810 CurrentWinFrameInfo = WinFrameInfos.back().get();
811 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
812}
813
814void MCStreamer::emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
815 SMLoc Loc) {
817 if (!CurFrame)
818 return;
819
820 // Handlers are always associated with the parent frame.
821 CurFrame = CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
822
823 CurFrame->ExceptionHandler = Sym;
824 if (!Except && !Unwind)
825 getContext().reportError(Loc, "Don't know what kind of handler this is!");
826 if (Unwind)
827 CurFrame->HandlesUnwind = true;
828 if (Except)
829 CurFrame->HandlesExceptions = true;
830}
831
834 if (!CurFrame)
835 return;
836}
837
841
842static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
843 MCSection *MainCFISec,
844 const MCSection *TextSec) {
845 // If this is the main .text section, use the main unwind info section.
846 if (TextSec == Context.getObjectFileInfo()->getTextSection())
847 return MainCFISec;
848
849 const auto *TextSecCOFF = static_cast<const MCSectionCOFF *>(TextSec);
850 auto *MainCFISecCOFF = static_cast<MCSectionCOFF *>(MainCFISec);
851 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
852
853 // If this section is COMDAT, this unwind section should be COMDAT associative
854 // with its group.
855 const MCSymbol *KeySym = nullptr;
856 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
857 KeySym = TextSecCOFF->getCOMDATSymbol();
858
859 // In a GNU environment, we can't use associative comdats. Instead, do what
860 // GCC does, which is to make plain comdat selectany section named like
861 // ".[px]data$_Z3foov".
862 if (!Context.getAsmInfo()->hasCOFFAssociativeComdats()) {
863 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
864 TextSecCOFF->getName().split('$').second)
865 .str();
866 return Context.getCOFFSection(SectionName,
867 MainCFISecCOFF->getCharacteristics() |
870 }
871 }
872
873 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
874}
875
877 return getWinCFISection(getContext(), &NextWinCFIID,
878 getContext().getObjectFileInfo()->getPDataSection(),
879 TextSec);
880}
881
883 return getWinCFISection(getContext(), &NextWinCFIID,
884 getContext().getObjectFileInfo()->getXDataSection(),
885 TextSec);
886}
887
889
890static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
891 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
892}
893
896 if (!CurFrame)
897 return;
898
899 MCSymbol *Label = emitCFILabel();
900
902 Label, encodeSEHRegNum(Context, Register));
903 CurFrame->Instructions.push_back(Inst);
904}
905
907 SMLoc Loc) {
909 if (!CurFrame)
910 return;
911 if (CurFrame->LastFrameInst >= 0)
912 return getContext().reportError(
913 Loc, "frame register and offset can be set at most once");
914 if (Offset & 0x0F)
915 return getContext().reportError(Loc, "offset is not a multiple of 16");
916 if (Offset > 240)
917 return getContext().reportError(
918 Loc, "frame offset must be less than or equal to 240");
919
920 MCSymbol *Label = emitCFILabel();
921
924 CurFrame->LastFrameInst = CurFrame->Instructions.size();
925 CurFrame->Instructions.push_back(Inst);
926}
927
930 if (!CurFrame)
931 return;
932 if (Size == 0)
933 return getContext().reportError(Loc,
934 "stack allocation size must be non-zero");
935 if (Size & 7)
936 return getContext().reportError(
937 Loc, "stack allocation size is not a multiple of 8");
938
939 MCSymbol *Label = emitCFILabel();
940
942 CurFrame->Instructions.push_back(Inst);
943}
944
946 SMLoc Loc) {
948 if (!CurFrame)
949 return;
950
951 if (Offset & 7)
952 return getContext().reportError(
953 Loc, "register save offset is not 8 byte aligned");
954
955 MCSymbol *Label = emitCFILabel();
956
958 Label, encodeSEHRegNum(Context, Register), Offset);
959 CurFrame->Instructions.push_back(Inst);
960}
961
963 SMLoc Loc) {
965 if (!CurFrame)
966 return;
967 if (Offset & 0x0F)
968 return getContext().reportError(Loc, "offset is not a multiple of 16");
969
970 MCSymbol *Label = emitCFILabel();
971
973 Label, encodeSEHRegNum(Context, Register), Offset);
974 CurFrame->Instructions.push_back(Inst);
975}
976
979 if (!CurFrame)
980 return;
981 if (!CurFrame->Instructions.empty())
982 return getContext().reportError(
983 Loc, "If present, PushMachFrame must be the first UOP");
984
985 MCSymbol *Label = emitCFILabel();
986
988 CurFrame->Instructions.push_back(Inst);
989}
990
993 if (!CurFrame)
994 return;
995
996 MCSymbol *Label = emitCFILabel();
997
998 CurFrame->PrologEnd = Label;
999}
1000
1003 if (!CurFrame)
1004 return;
1005
1006 MCSymbol *Label = emitCFILabel();
1007
1008 if (!CurFrame->PrologEnd) {
1009 CurFrame->PrologEnd = Label;
1011 Loc, "starting epilogue (.seh_startepilogue) before prologue has ended "
1012 "(.seh_endprologue) in " +
1013 CurFrame->Function->getName());
1014 }
1016 &CurFrame->EpilogMap.insert_or_assign(Label, WinEH::FrameInfo::Epilog())
1017 .first->second;
1018 CurrentWinEpilog->Start = Label;
1019 CurrentWinEpilog->Loc = Loc;
1020}
1021
1024 if (!CurFrame)
1025 return;
1026
1027 if (!CurrentWinEpilog)
1028 return getContext().reportError(Loc, "Stray .seh_endepilogue in " +
1029 CurFrame->Function->getName());
1030
1031 if ((CurFrame->Version >= 2) && !CurrentWinEpilog->UnwindV2Start) {
1032 // Set UnwindV2Start to... something... to prevent crashes later.
1033 CurrentWinEpilog->UnwindV2Start = CurrentWinEpilog->Start;
1034 getContext().reportError(Loc, "Missing .seh_unwindv2start in " +
1035 CurFrame->Function->getName());
1036 }
1037
1039 CurrentWinEpilog = nullptr;
1040}
1041
1044 if (!CurFrame)
1045 return;
1046
1047 if (!CurrentWinEpilog)
1048 return getContext().reportError(Loc, "Stray .seh_unwindv2start in " +
1049 CurFrame->Function->getName());
1050
1051 if (CurrentWinEpilog->UnwindV2Start)
1052 return getContext().reportError(Loc, "Duplicate .seh_unwindv2start in " +
1053 CurFrame->Function->getName());
1054
1055 MCSymbol *Label = emitCFILabel();
1056 CurrentWinEpilog->UnwindV2Start = Label;
1057}
1058
1061 if (!CurFrame)
1062 return;
1063
1065 return getContext().reportError(Loc, "Duplicate .seh_unwindversion in " +
1066 CurFrame->Function->getName());
1067
1068 if (Version != 2)
1069 return getContext().reportError(
1070 Loc, "Unsupported version specified in .seh_unwindversion in " +
1071 CurFrame->Function->getName());
1072
1073 CurFrame->Version = Version;
1074}
1075
1077
1079
1081
1083
1084void MCStreamer::emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
1085
1087
1089
1090/// EmitRawText - If this file is backed by an assembly streamer, this dumps
1091/// the specified string in the output .s file. This capability is
1092/// indicated by the hasRawTextSupport() predicate.
1094 // This is not llvm_unreachable for the sake of out of tree backend
1095 // developers who may not have assembly streamers and should serve as a
1096 // reminder to not accidentally call EmitRawText in the absence of such.
1097 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
1098 "it (target backend is likely missing an AsmStreamer "
1099 "implementation)");
1100}
1101
1103 SmallString<128> Str;
1104 emitRawTextImpl(T.toStringRef(Str));
1105}
1106
1108
1110
1112 if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) ||
1113 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
1114 getContext().reportError(EndLoc, "Unfinished frame!");
1115 return;
1116 }
1117
1119 if (TS)
1120 TS->finish();
1121
1122 finishImpl();
1123}
1124
1126 if (Context.getDwarfFormat() != dwarf::DWARF64)
1127 return;
1128 AddComment("DWARF64 Mark");
1130}
1131
1133 assert(Context.getDwarfFormat() == dwarf::DWARF64 ||
1136 AddComment(Comment);
1137 emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1138}
1139
1141 const Twine &Comment) {
1143 AddComment(Comment);
1144 MCSymbol *Lo = Context.createTempSymbol(Prefix + "_start");
1145 MCSymbol *Hi = Context.createTempSymbol(Prefix + "_end");
1146
1148 Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1149 // emit the begin symbol after we generate the length field.
1150 emitLabel(Lo);
1151 // Return the Hi symbol to the caller.
1152 return Hi;
1153}
1154
1156 // Set the value of the symbol, as we are at the start of the line table.
1157 emitLabel(StartSym);
1158}
1159
1162 Symbol->setVariableValue(Value);
1163
1165 if (TS)
1166 TS->emitAssignment(Symbol, Value);
1167}
1168
1170 uint64_t Address, const MCInst &Inst,
1171 const MCSubtargetInfo &STI,
1172 raw_ostream &OS) {
1173 InstPrinter.printInst(&Inst, Address, "", STI, OS);
1174}
1175
1177}
1178
1180 switch (Expr.getKind()) {
1181 case MCExpr::Target:
1182 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
1183 break;
1184
1185 case MCExpr::Constant:
1186 break;
1187
1188 case MCExpr::Binary: {
1189 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
1190 visitUsedExpr(*BE.getLHS());
1191 visitUsedExpr(*BE.getRHS());
1192 break;
1193 }
1194
1195 case MCExpr::SymbolRef:
1196 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
1197 break;
1198
1199 case MCExpr::Unary:
1200 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
1201 break;
1202
1203 case MCExpr::Specifier:
1204 visitUsedExpr(*cast<MCSpecifierExpr>(Expr).getSubExpr());
1205 break;
1206 }
1207}
1208
1210 // Scan for values.
1211 for (unsigned i = Inst.getNumOperands(); i--;)
1212 if (Inst.getOperand(i).isExpr())
1213 visitUsedExpr(*Inst.getOperand(i).getExpr());
1214}
1215
1217 uint64_t Attr, uint64_t Discriminator,
1218 const MCPseudoProbeInlineStack &InlineStack,
1219 MCSymbol *FnSym) {
1220 auto &Context = getContext();
1221
1222 // Create a symbol at in the current section for use in the probe.
1223 MCSymbol *ProbeSym = Context.createTempSymbol();
1224
1225 // Set the value of the symbol to use for the MCPseudoProbe.
1226 emitLabel(ProbeSym);
1227
1228 // Create a (local) probe entry with the symbol.
1229 MCPseudoProbe Probe(ProbeSym, Guid, Index, Type, Attr, Discriminator);
1230
1231 // Add the probe entry to this section's entries.
1232 Context.getMCPseudoProbeTable().getProbeSections().addPseudoProbe(
1233 FnSym, Probe, InlineStack);
1234}
1235
1237 unsigned Size) {
1238 // Get the Hi-Lo expression.
1239 const MCExpr *Diff =
1241 MCSymbolRefExpr::create(Lo, Context), Context);
1242
1243 const MCAsmInfo *MAI = Context.getAsmInfo();
1244 if (!MAI->doesSetDirectiveSuppressReloc()) {
1245 emitValue(Diff, Size);
1246 return;
1247 }
1248
1249 // Otherwise, emit with .set (aka assignment).
1250 MCSymbol *SetLabel = Context.createTempSymbol("set");
1251 emitAssignment(SetLabel, Diff);
1252 emitSymbolValue(SetLabel, Size);
1253}
1254
1256 const MCSymbol *Lo) {
1257 // Get the Hi-Lo expression.
1258 const MCExpr *Diff =
1260 MCSymbolRefExpr::create(Lo, Context), Context);
1261
1262 emitULEB128Value(Diff);
1263}
1264
1267 "emitSubsectionsViaSymbols only supported on Mach-O targets");
1268}
1269void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
1271 llvm_unreachable("this directive only supported on COFF targets");
1272}
1274 llvm_unreachable("this directive only supported on COFF targets");
1275}
1278 StringRef CompilerVersion,
1279 StringRef TimeStamp, StringRef Description) {
1280}
1282 llvm_unreachable("this directive only supported on COFF targets");
1283}
1285 llvm_unreachable("this directive only supported on COFF targets");
1286}
1288 MCSymbol *CsectSym,
1289 Align Alignment) {
1290 llvm_unreachable("this directive only supported on XCOFF targets");
1291}
1292
1294 MCSymbolAttr Linkage,
1295 MCSymbolAttr Visibility) {
1296 llvm_unreachable("emitXCOFFSymbolLinkageWithVisibility is only supported on "
1297 "XCOFF targets");
1298}
1299
1302
1304 llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");
1305}
1306
1308 const MCSymbol *Trap,
1309 unsigned Lang, unsigned Reason,
1310 unsigned FunctionSize,
1311 bool hasDebug) {
1312 report_fatal_error("emitXCOFFExceptDirective is only supported on "
1313 "XCOFF targets");
1314}
1315
1317 llvm_unreachable("emitXCOFFCInfoSym is only supported on"
1318 "XCOFF targets");
1319}
1320
1323 StringRef Name, bool KeepOriginalSym) {}
1325 Align ByteAlignment) {}
1329 uint64_t Size, Align ByteAlignment) {}
1330
1332 CurFrag = &Sec->getDummyFragment();
1333 auto *Sym = Sec->getBeginSymbol();
1334 if (!Sym || !Sym->isUndefined())
1335 return;
1336 // In Mach-O, DWARF sections use Begin as a temporary label, requiring a label
1337 // definition, unlike section symbols in other file formats.
1338 if (getContext().getObjectFileType() == MCContext::IsMachO)
1339 emitLabel(Sym);
1340 else
1341 Sym->setFragment(CurFrag);
1342}
1343
1349}
1353void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
1354 SMLoc Loc) {}
1357 unsigned MaxBytesToEmit) {}
1359 SMLoc Loc) {}
1361
1363 if (SectionStack.size() <= 1)
1364 return false;
1365 auto I = SectionStack.end();
1366 --I;
1367 MCSectionSubPair OldSec = I->first;
1368 --I;
1369 MCSectionSubPair NewSec = I->first;
1370
1371 if (NewSec.first && OldSec != NewSec)
1372 changeSection(NewSec.first, NewSec.second);
1373 SectionStack.pop_back();
1374 return true;
1375}
1376
1378 assert(Section && "Cannot switch to a null section!");
1379 MCSectionSubPair curSection = SectionStack.back().first;
1380 SectionStack.back().second = curSection;
1381 if (MCSectionSubPair(Section, Subsection) != curSection) {
1382 changeSection(Section, Subsection);
1383 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
1384 assert(!Section->hasEnded() && "Section already ended");
1385 }
1386}
1387
1388bool MCStreamer::switchSection(MCSection *Section, const MCExpr *SubsecExpr) {
1389 int64_t Subsec = 0;
1390 if (SubsecExpr) {
1391 if (!SubsecExpr->evaluateAsAbsolute(Subsec, getAssemblerPtr())) {
1392 getContext().reportError(SubsecExpr->getLoc(),
1393 "cannot evaluate subsection number");
1394 return true;
1395 }
1396 if (!isUInt<31>(Subsec)) {
1397 getContext().reportError(SubsecExpr->getLoc(),
1398 "subsection number " + Twine(Subsec) +
1399 " is not within [0,2147483647]");
1400 return true;
1401 }
1402 }
1403 switchSection(Section, Subsec);
1404 return false;
1405}
1406
1408 SectionStack.back().second = SectionStack.back().first;
1409 SectionStack.back().first = MCSectionSubPair(Section, 0);
1410 changeSection(Section, 0);
1411}
1412
1414 // TODO: keep track of the last subsection so that this symbol appears in the
1415 // correct place.
1416 MCSymbol *Sym = Section->getEndSymbol(Context);
1417 if (Sym->isInSection())
1418 return Sym;
1419
1420 switchSection(Section);
1421 emitLabel(Sym);
1422 return Sym;
1423}
1424
1426 auto *Sec = CurFrag->getParent();
1427 F->setParent(Sec);
1428 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
1429 CurFrag->Next = F;
1430 CurFrag = F;
1431 Sec->curFragList()->Tail = F;
1432}
1433
1434static VersionTuple
1436 VersionTuple TargetVersion) {
1437 VersionTuple Min = Target.getMinimumSupportedOSVersion();
1438 return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
1439}
1440
1441static MCVersionMinType
1443 assert(Target.isOSDarwin() && "expected a darwin OS");
1444 switch (Target.getOS()) {
1445 case Triple::MacOSX:
1446 case Triple::Darwin:
1447 return MCVM_OSXVersionMin;
1448 case Triple::IOS:
1449 assert(!Target.isMacCatalystEnvironment() &&
1450 "mac Catalyst should use LC_BUILD_VERSION");
1451 return MCVM_IOSVersionMin;
1452 case Triple::TvOS:
1453 return MCVM_TvOSVersionMin;
1454 case Triple::WatchOS:
1456 default:
1457 break;
1458 }
1459 llvm_unreachable("unexpected OS type");
1460}
1461
1463 assert(Target.isOSDarwin() && "expected a darwin OS");
1464 switch (Target.getOS()) {
1465 case Triple::MacOSX:
1466 case Triple::Darwin:
1467 return VersionTuple(10, 14);
1468 case Triple::IOS:
1469 // Mac Catalyst always uses the build version load command.
1470 if (Target.isMacCatalystEnvironment())
1471 return VersionTuple();
1472 [[fallthrough]];
1473 case Triple::TvOS:
1474 return VersionTuple(12);
1475 case Triple::WatchOS:
1476 return VersionTuple(5);
1477 case Triple::DriverKit:
1478 case Triple::BridgeOS:
1479 case Triple::XROS:
1480 // DriverKit/BridgeOS/XROS always use the build version load command.
1481 return VersionTuple();
1482 default:
1483 break;
1484 }
1485 llvm_unreachable("unexpected OS type");
1486}
1487
1490 assert(Target.isOSDarwin() && "expected a darwin OS");
1491 switch (Target.getOS()) {
1492 case Triple::MacOSX:
1493 case Triple::Darwin:
1494 return MachO::PLATFORM_MACOS;
1495 case Triple::IOS:
1496 if (Target.isMacCatalystEnvironment())
1497 return MachO::PLATFORM_MACCATALYST;
1498 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
1499 : MachO::PLATFORM_IOS;
1500 case Triple::TvOS:
1501 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
1502 : MachO::PLATFORM_TVOS;
1503 case Triple::WatchOS:
1504 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
1505 : MachO::PLATFORM_WATCHOS;
1506 case Triple::DriverKit:
1507 return MachO::PLATFORM_DRIVERKIT;
1508 case Triple::XROS:
1509 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
1510 : MachO::PLATFORM_XROS;
1511 case Triple::BridgeOS:
1512 return MachO::PLATFORM_BRIDGEOS;
1513 default:
1514 break;
1515 }
1516 llvm_unreachable("unexpected OS type");
1517}
1518
1520 const Triple &Target, const VersionTuple &SDKVersion,
1521 const Triple *DarwinTargetVariantTriple,
1522 const VersionTuple &DarwinTargetVariantSDKVersion) {
1523 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
1524 return;
1525 // Do we even know the version?
1526 if (Target.getOSMajorVersion() == 0)
1527 return;
1528
1530 switch (Target.getOS()) {
1531 case Triple::MacOSX:
1532 case Triple::Darwin:
1533 Target.getMacOSXVersion(Version);
1534 break;
1535 case Triple::IOS:
1536 case Triple::TvOS:
1537 Version = Target.getiOSVersion();
1538 break;
1539 case Triple::WatchOS:
1540 Version = Target.getWatchOSVersion();
1541 break;
1542 case Triple::DriverKit:
1543 Version = Target.getDriverKitVersion();
1544 break;
1545 case Triple::XROS:
1546 case Triple::BridgeOS:
1547 Version = Target.getOSVersion();
1548 break;
1549 default:
1550 llvm_unreachable("unexpected OS type");
1551 }
1552 assert(Version.getMajor() != 0 && "A non-zero major version is expected");
1553 auto LinkedTargetVersion =
1555 auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
1556 bool ShouldEmitBuildVersion = false;
1557 if (BuildVersionOSVersion.empty() ||
1558 LinkedTargetVersion >= BuildVersionOSVersion) {
1559 if (Target.isMacCatalystEnvironment() && DarwinTargetVariantTriple &&
1560 DarwinTargetVariantTriple->isMacOSX()) {
1561 emitVersionForTarget(*DarwinTargetVariantTriple,
1562 DarwinTargetVariantSDKVersion,
1563 /*DarwinTargetVariantTriple=*/nullptr,
1564 /*DarwinTargetVariantSDKVersion=*/VersionTuple());
1567 LinkedTargetVersion.getMajor(),
1568 LinkedTargetVersion.getMinor().value_or(0),
1569 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1570 return;
1571 }
1573 LinkedTargetVersion.getMajor(),
1574 LinkedTargetVersion.getMinor().value_or(0),
1575 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1576 ShouldEmitBuildVersion = true;
1577 }
1578
1579 if (const Triple *TVT = DarwinTargetVariantTriple) {
1580 if (Target.isMacOSX() && TVT->isMacCatalystEnvironment()) {
1581 auto TVLinkedTargetVersion =
1582 targetVersionOrMinimumSupportedOSVersion(*TVT, TVT->getiOSVersion());
1585 TVLinkedTargetVersion.getMajor(),
1586 TVLinkedTargetVersion.getMinor().value_or(0),
1587 TVLinkedTargetVersion.getSubminor().value_or(0),
1588 DarwinTargetVariantSDKVersion);
1589 }
1590 }
1591
1592 if (ShouldEmitBuildVersion)
1593 return;
1594
1596 LinkedTargetVersion.getMajor(),
1597 LinkedTargetVersion.getMinor().value_or(0),
1598 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1599}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
Definition Debug.cpp:147
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.
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)
static MachO::PlatformType getMachoBuildVersionPlatformType(const Triple &Target)
static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
Register Reg
#define T
static constexpr StringLiteral Filename
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:40
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)
MCCVFunctionInfo * getCVFunctionInfo(unsigned FuncId)
Retreive the function info if this is a valid function id, or nullptr.
bool recordFunctionId(unsigned FuncId)
Records the function id of a normal function.
bool recordInlinedCallSiteId(unsigned FuncId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol)
Records the function id of an inlined call site.
Tagged union holding either a T or a Error.
Definition Error.h:485
Generic interface to target specific assembler backends.
virtual uint64_t generateCompactUnwindEncoding(const MCDwarfFrameInfo *FI, const MCContext *Ctxt) const
Generate the compact unwind encoding for the CFI instructions.
This class is intended to be used as a base class for asm properties and features specific to the tar...
Definition MCAsmInfo.h:64
const std::vector< MCCFIInstruction > & getInitialFrameState() const
Definition MCAsmInfo.h:678
const char * getData8bitsDirective() const
Definition MCAsmInfo.h:461
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:583
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:664
static MCCFIInstruction createGnuArgsSize(MCSymbol *L, int64_t Size, SMLoc Loc={})
A special wrapper for .cfi_escape that indicates GNU_ARGS_SIZE.
Definition MCDwarf.h:697
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:657
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:608
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:633
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:576
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:618
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:709
static MCCFIInstruction createNegateRAStateWithPC(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state_with_pc AArch64 negate RA state with PC.
Definition MCDwarf.h:649
static MCCFIInstruction createNegateRAState(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state AArch64 negate RA state.
Definition MCDwarf.h:644
static MCCFIInstruction createRememberState(MCSymbol *L, SMLoc Loc={})
.cfi_remember_state Save all current rules for all registers.
Definition MCDwarf.h:677
static MCCFIInstruction cfiDefCfaOffset(MCSymbol *L, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa_offset modifies a rule for computing CFA.
Definition MCDwarf.h:591
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:688
static MCCFIInstruction createWindowSave(MCSymbol *L, SMLoc Loc={})
.cfi_window_save SPARC register window is saved.
Definition MCDwarf.h:639
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:599
static MCCFIInstruction createRestoreState(MCSymbol *L, SMLoc Loc={})
.cfi_restore_state Restore the previously saved state.
Definition MCDwarf.h:682
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:671
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:626
static MCCFIInstruction createLabel(MCSymbol *L, MCSymbol *CfiLabel, SMLoc Loc)
Definition MCDwarf.h:702
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
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
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.
MCDwarfLineTable & getMCDwarfLineTable(unsigned CUID)
Definition MCContext.h:717
LLVM_ABI CodeViewContext & getCVContext()
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:758
LLVM_ABI void reportError(SMLoc L, const Twine &Msg)
LLVM_ABI MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
const MCDwarfLoc & getCurrentDwarfLoc()
Definition MCContext.h:773
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:741
Instances of this class represent the line information for the dwarf line table entries.
Definition MCDwarf.h:190
void setLabel(MCSymbol *Label)
Definition MCDwarf.h:431
LLVM_ABI void endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS, SMLoc DefLoc, StringRef Name)
Definition MCDwarf.cpp:289
const MCLineSection & getMCLineSections() const
Definition MCDwarf.h:451
MCSymbol * getLabel() const
Definition MCDwarf.h:427
Instances of this class represent the information from a dwarf .loc directive.
Definition MCDwarf.h:107
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
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
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:241
const MCExpr * getExpr() const
Definition MCInst.h:118
bool isExpr() const
Definition MCInst.h:69
Instances of this class represent a pseudo probe instance for a pseudo probe table entry,...
Wrapper class representing physical registers. Should be passed by value.
Definition MCRegister.h:41
This represents a section on Windows.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
Definition MCSection.h:517
MCFragment & getDummyFragment()
Definition MCSection.h:622
MCSymbol * getBeginSymbol()
Definition MCSection.h:589
Streaming machine code generation interface.
Definition MCStreamer.h:220
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
virtual void emitNops(int64_t NumBytes, int64_t ControlledNopLength, SMLoc Loc, const MCSubtargetInfo &STI)
MCSymbol * emitLineTableLabel()
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={})
virtual void emitWinCFIUnwindVersion(uint8_t Version, SMLoc Loc=SMLoc())
virtual void visitUsedSymbol(const MCSymbol &Sym)
void emitCFIStartProc(bool IsSimple, SMLoc Loc=SMLoc())
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
virtual void finishImpl()
Streamer specific finalization.
virtual void emitCFIBKeyFrame()
void generateCompactUnwindEncodings(MCAsmBackend *MAB)
virtual void beginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
virtual void emitSyntaxDirective()
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
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.
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.
virtual void emitWindowsUnwindTables()
virtual raw_ostream & getCommentOS()
Return a raw_ostream that comments can be written to.
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())
virtual void emitCFISections(bool EH, bool Debug, bool SFrame)
MCSection * getAssociatedPDataSection(const MCSection *TextSec)
Get the .pdata section used for the given section.
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
bool hasUnfinishedDwarfFrameInfo()
virtual ~MCStreamer()
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
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...
virtual void emitCFIReturnColumn(int64_t Register)
virtual void emitCOFFSymbolType(int Type)
Emit the type of the symbol.
virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment)
Emit a unit length field.
virtual void emitCFIWindowSave(SMLoc Loc={})
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())
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
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={})
void setTargetStreamer(MCTargetStreamer *TS)
Definition MCStreamer.h:301
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
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={})
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
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.
virtual void addExplicitComment(const Twine &T)
Add explicit comment T.
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
Definition MCStreamer.h:387
virtual void emitWinCFIBeginEpilogue(SMLoc Loc=SMLoc())
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()
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.
virtual void emitRawComment(const Twine &T, bool TabPrefix=true)
Print T and prefix it with the comment string (normally #) and optionally a tab.
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
void emitValue(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
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.
bool checkCVLocSection(unsigned FuncId, unsigned FileNo, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
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.
virtual void emitCOFFSectionIndex(MCSymbol const *Symbol)
Emits a COFF section index.
virtual void emitCFIRememberState(SMLoc Loc)
virtual void reset()
State management.
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)
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.
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
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)
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.
unsigned getNumFrameInfos()
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
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)
virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue)
Set the DescValue for the Symbol.
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)
Emit a local common (.lcomm) symbol.
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
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...
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)
virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
unsigned emitULEB128IntValue(uint64_t Value, unsigned PadTo=0)
Special case of EmitULEB128Value that avoids the client having to pass in a MCExpr for constant integ...
virtual void emitULEB128Value(const MCExpr *Value)
ArrayRef< MCDwarfFrameInfo > getDwarfFrameInfos() const
virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc)
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.
WinEH::FrameInfo * EnsureValidWinFrameInfo(SMLoc Loc)
Retrieve the current frame info if one is available and it is not yet closed.
virtual void emitCFIRestoreState(SMLoc Loc)
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)
virtual void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
This implements the CodeView '.cv_def_range' assembler directive.
void emitInt32(uint64_t Value)
Definition MCStreamer.h:750
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
void maybeEmitDwarf64Mark()
Emit a special value of 0xffffffff if producing 64-bit debugging info.
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISplitChained(SMLoc Loc=SMLoc())
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.
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
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={})
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.
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...
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.
virtual void emitCFISignalFrame()
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.
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={})
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.
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
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.
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={})
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
bool isInSection() const
isInSection - Check if this symbol is defined in some section (i.e., it is defined but not absolute).
Definition MCSymbol.h:237
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
Target specific streamer interface.
Definition MCStreamer.h:93
virtual void emitDwarfFileDirective(StringRef Directive)
virtual void emitValue(const MCExpr *Value)
virtual void prettyPrintAsm(MCInstPrinter &InstPrinter, uint64_t Address, const MCInst &Inst, const MCSubtargetInfo &STI, raw_ostream &OS)
virtual void finish()
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
virtual void emitRawBytes(StringRef Data)
Emit the bytes in Data into the output.
MCStreamer & Streamer
Definition MCStreamer.h:95
MCTargetStreamer(MCStreamer &S)
virtual void changeSection(const MCSection *CurSection, MCSection *Section, uint32_t SubSection, raw_ostream &OS)
Update streamer for a new active section.
virtual void emitLabel(MCSymbol *Symbol)
virtual void emitConstantPools()
Root of the metadata hierarchy.
Definition Metadata.h:64
Wrapper class representing virtual and physical registers.
Definition Register.h:20
Represents a location in source code.
Definition SMLoc.h:22
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.
void resize(size_type N)
pointer data()
Return a pointer to the vector's buffer, even if empty().
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:587
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]]].
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
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.
StringRef str() const
Return a StringRef for the vector contents.
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
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
Definition Endian.h:287
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
Definition CodeView.h:48
@ DWARF64
Definition Dwarf.h:93
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
Definition Dwarf.h:1097
@ DW_LENGTH_lo_reserved
Special values for an initial length field.
Definition Dwarf.h:56
@ DW_LENGTH_DWARF64
Indicator of 64-bit DWARF format.
Definition Dwarf.h:57
value_type byte_swap(value_type value, endianness endian)
Definition Endian.h:44
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
Definition Endian.h:287
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
Definition Types.h:26
@ Offset
Definition DWP.cpp:532
@ Length
Definition DWP.cpp:532
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:3062
constexpr bool isUIntN(unsigned N, uint64_t x)
Checks if an unsigned integer fits into the given (dynamic) bit width.
Definition MathExtras.h:243
FunctionAddr VTableAddr uintptr_t uintptr_t Version
Definition InstrProf.h:302
decltype(auto) get(const PointerIntPair< PointerTy, IntBits, IntType, PtrTraits, Info > &Pair)
SmallVector< InlineSite, 8 > MCPseudoProbeInlineStack
MCVersionMinType
@ MCVM_WatchOSVersionMin
.watchos_version_min
@ MCVM_OSXVersionMin
.macosx_version_min
@ MCVM_TvOSVersionMin
.tvos_version_min
@ MCVM_IOSVersionMin
.ios_version_min
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
FunctionAddr VTableAddr Count
Definition InstrProf.h:139
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:189
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
FunctionAddr VTableAddr uintptr_t uintptr_t Data
Definition InstrProf.h:189
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
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
constexpr bool isIntN(unsigned N, int64_t x)
Checks if an signed integer fits into the given (dynamic) bit width.
Definition MathExtras.h:248
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:79
std::pair< MCSection *, uint32_t > MCSectionSubPair
Definition MCStreamer.h:66
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:767
unsigned PersonalityEncoding
Definition MCDwarf.h:771
std::vector< MCCFIInstruction > Instructions
Definition MCDwarf.h:769
const MCSymbol * Lsda
Definition MCDwarf.h:768
unsigned CurrentCfaRegister
Definition MCDwarf.h:770
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
std::vector< Instruction > Instructions
Definition MCWinEH.h:63
const MCSymbol * Function
Definition MCWinEH.h:46
MCSection * TextSection
Definition MCWinEH.h:50
FrameInfo * ChainedParent
Definition MCWinEH.h:62
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
static constexpr uint8_t DefaultVersion
Definition MCWinEH.h:58
const MCSymbol * ExceptionHandler
Definition MCWinEH.h:45