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"
16#include "llvm/MC/MCAsmInfo.h"
17#include "llvm/MC/MCCodeView.h"
18#include "llvm/MC/MCContext.h"
19#include "llvm/MC/MCDwarf.h"
20#include "llvm/MC/MCExpr.h"
21#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
100void MCStreamer::setLFIRewriter(std::unique_ptr<MCLFIRewriter> Rewriter) {
101 LFIRewriter = std::move(Rewriter);
102}
103
105 DwarfFrameInfos.clear();
106 CurrentWinFrameInfo = nullptr;
107 WinFrameInfos.clear();
108 SectionStack.clear();
109 SectionStack.push_back(std::pair<MCSectionSubPair, MCSectionSubPair>());
110 CurFrag = nullptr;
111}
112
114 // By default, discard comments.
115 return nulls();
116}
117
122
123void MCStreamer::emitRawComment(const Twine &T, bool TabPrefix) {}
124
127
128/// EmitIntValue - Special case of EmitValue that avoids the client having to
129/// pass in a MCExpr for constant integers.
131 assert(1 <= Size && Size <= 8 && "Invalid size");
132 assert((isUIntN(8 * Size, Value) || isIntN(8 * Size, Value)) &&
133 "Invalid size");
134 const bool IsLittleEndian = Context.getAsmInfo()->isLittleEndian();
137 unsigned Index = IsLittleEndian ? 0 : 8 - Size;
138 emitBytes(StringRef(reinterpret_cast<char *>(&Swapped) + Index, Size));
139}
141 if (Value.getNumWords() == 1) {
142 emitIntValue(Value.getLimitedValue(), Value.getBitWidth() / 8);
143 return;
144 }
145
146 const bool IsLittleEndianTarget = Context.getAsmInfo()->isLittleEndian();
147 const bool ShouldSwap = sys::IsLittleEndianHost != IsLittleEndianTarget;
148 const APInt Swapped = ShouldSwap ? Value.byteSwap() : Value;
149 const unsigned Size = Value.getBitWidth() / 8;
150 SmallString<10> Tmp;
151 Tmp.resize(Size);
152 StoreIntToMemory(Swapped, reinterpret_cast<uint8_t *>(Tmp.data()), Size);
153 emitBytes(Tmp.str());
154}
155
156/// EmitULEB128IntValue - Special case of EmitULEB128Value that avoids the
157/// client having to pass in a MCExpr for constant integers.
160 raw_svector_ostream OSE(Tmp);
161 encodeULEB128(Value, OSE, PadTo);
162 emitBytes(OSE.str());
163 return Tmp.size();
164}
165
166/// EmitSLEB128IntValue - Special case of EmitSLEB128Value that avoids the
167/// client having to pass in a MCExpr for constant integers.
170 raw_svector_ostream OSE(Tmp);
171 encodeSLEB128(Value, OSE);
172 emitBytes(OSE.str());
173 return Tmp.size();
174}
175
178}
179
180void MCStreamer::emitSymbolValue(const MCSymbol *Sym, unsigned Size,
181 bool IsSectionRelative) {
182 assert((!IsSectionRelative || Size == 4) &&
183 "SectionRelative value requires 4-bytes");
184
185 if (!IsSectionRelative)
187 else
188 emitCOFFSecRel32(Sym, /*Offset=*/0);
189}
190
191/// Emit NumBytes bytes worth of the value specified by FillValue.
192/// This implements directives such as '.space'.
193void MCStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
194 if (NumBytes)
195 emitFill(*MCConstantExpr::create(NumBytes, getContext()), FillValue);
196}
197
198void llvm::MCStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLen,
199 llvm::SMLoc, const MCSubtargetInfo& STI) {}
200
201/// The implementation in this class just redirects to emitFill.
202void MCStreamer::emitZeros(uint64_t NumBytes) { emitFill(NumBytes, 0); }
203
205 unsigned FileNo, StringRef Directory, StringRef Filename,
206 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
207 unsigned CUID) {
208 return getContext().getDwarfFile(Directory, Filename, FileNo, Checksum,
209 Source, CUID);
210}
211
214 std::optional<MD5::MD5Result> Checksum,
215 std::optional<StringRef> Source,
216 unsigned CUID) {
217 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
218 Source);
219}
220
222 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
223 if (!CurFrame)
224 return;
225 CurFrame->IsBKeyFrame = true;
226}
227
229 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
230 if (!CurFrame)
231 return;
232 CurFrame->IsMTETaggedFrame = true;
233}
234
235void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
236 unsigned Column, unsigned Flags,
237 unsigned Isa, unsigned Discriminator,
238 StringRef FileName, StringRef Comment) {
239 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
240 Discriminator);
241}
242
248
251 if (!Table.getLabel()) {
252 StringRef Prefix = Context.getAsmInfo()->getPrivateGlobalPrefix();
253 Table.setLabel(
254 Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
255 }
256 return Table.getLabel();
257}
258
260 return !FrameInfoStack.empty();
261}
262
263MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
266 "this directive must appear between "
267 ".cfi_startproc and .cfi_endproc directives");
268 return nullptr;
269 }
270 return &DwarfFrameInfos[FrameInfoStack.back().first];
271}
272
274 ArrayRef<uint8_t> Checksum,
275 unsigned ChecksumKind) {
276 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
277 ChecksumKind);
278}
279
283
285 unsigned IAFunc, unsigned IAFile,
286 unsigned IALine, unsigned IACol,
287 SMLoc Loc) {
288 if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
289 getContext().reportError(Loc, "parent function id not introduced by "
290 ".cv_func_id or .cv_inline_site_id");
291 return true;
292 }
293
295 FunctionId, IAFunc, IAFile, IALine, IACol);
296}
297
298void MCStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
299 unsigned Line, unsigned Column,
300 bool PrologueEnd, bool IsStmt,
301 StringRef FileName, SMLoc Loc) {}
302
303bool MCStreamer::checkCVLocSection(unsigned FuncId, unsigned FileNo,
304 SMLoc Loc) {
306 MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
307 if (!FI) {
309 Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
310 return false;
311 }
312
313 // Track the section
314 if (FI->Section == nullptr)
316 else if (FI->Section != getCurrentSectionOnly()) {
318 Loc,
319 "all .cv_loc directives for a function must be in the same section");
320 return false;
321 }
322 return true;
323}
324
326 const MCSymbol *Begin,
327 const MCSymbol *End) {}
328
329void MCStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
330 unsigned SourceFileId,
331 unsigned SourceLineNum,
332 const MCSymbol *FnStartSym,
333 const MCSymbol *FnEndSym) {}
334
335/// Only call this on endian-specific types like ulittle16_t and little32_t, or
336/// structs composed of them.
337template <typename T>
338static void copyBytesForDefRange(SmallString<20> &BytePrefix,
339 codeview::SymbolKind SymKind,
340 const T &DefRangeHeader) {
341 BytePrefix.resize(2 + sizeof(T));
342 codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
343 memcpy(&BytePrefix[0], &SymKindLE, 2);
344 memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
345}
346
348 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
349 StringRef FixedSizePortion) {}
350
352 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
354 SmallString<20> BytePrefix;
355 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
356 emitCVDefRangeDirective(Ranges, BytePrefix);
357}
358
360 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
362 SmallString<20> BytePrefix;
363 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
364 DRHdr);
365 emitCVDefRangeDirective(Ranges, BytePrefix);
366}
367
369 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
371 SmallString<20> BytePrefix;
372 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
373 emitCVDefRangeDirective(Ranges, BytePrefix);
374}
375
377 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
379 SmallString<20> BytePrefix;
380 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
381 DRHdr);
382 emitCVDefRangeDirective(Ranges, BytePrefix);
383}
384
386 MCSymbol *EHSymbol) {
387}
388
389void MCStreamer::initSections(bool NoExecStack, const MCSubtargetInfo &STI) {
390 switchSectionNoPrint(getContext().getObjectFileInfo()->getTextSection());
391}
392
394 Symbol->redefineIfPossible();
395
396 if (!Symbol->isUndefined() || Symbol->isVariable())
397 return getContext().reportError(Loc, "symbol '" + Twine(Symbol->getName()) +
398 "' is already defined");
399
400 assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
401 assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
402 assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
403 assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
404
405 Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
406
407 if (LFIRewriter)
408 LFIRewriter->onLabel(Symbol);
409
411 if (TS)
412 TS->emitLabel(Symbol);
413}
414
417
418void MCStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {}
419
421 if (!FrameInfoStack.empty() &&
422 getCurrentSectionOnly() == FrameInfoStack.back().second)
423 return getContext().reportError(
424 Loc, "starting new .cfi frame before finishing the previous one");
425
426 MCDwarfFrameInfo Frame;
427 Frame.IsSimple = IsSimple;
429
430 const MCAsmInfo* MAI = Context.getAsmInfo();
431 if (MAI) {
432 for (const MCCFIInstruction& Inst : MAI->getInitialFrameState()) {
433 if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
434 Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister ||
435 Inst.getOperation() == MCCFIInstruction::OpLLVMDefAspaceCfa) {
436 Frame.CurrentCfaRegister = Inst.getRegister();
437 }
438 }
439 }
440
441 FrameInfoStack.emplace_back(DwarfFrameInfos.size(), getCurrentSectionOnly());
442 DwarfFrameInfos.push_back(std::move(Frame));
443}
444
447
449 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
450 if (!CurFrame)
451 return;
452 emitCFIEndProcImpl(*CurFrame);
453 FrameInfoStack.pop_back();
454}
455
457 // Put a dummy non-null value in Frame.End to mark that this frame has been
458 // closed.
459 Frame.End = (MCSymbol *)1;
460}
461
463 // Create a label and insert it into the line table and return this label
464 const MCDwarfLoc &DwarfLoc = getContext().getCurrentDwarfLoc();
465
466 MCSymbol *LineStreamLabel = getContext().createTempSymbol();
467 MCDwarfLineEntry LabelLineEntry(nullptr, DwarfLoc, LineStreamLabel);
468 getContext()
469 .getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
471 .addLineEntry(LabelLineEntry, getCurrentSectionOnly() /*Section*/);
472
473 return LineStreamLabel;
474}
475
477 // Return a dummy non-null value so that label fields appear filled in when
478 // generating textual assembly.
479 return (MCSymbol *)1;
480}
481
483 MCSymbol *Label = emitCFILabel();
486 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
487 if (!CurFrame)
488 return;
489 CurFrame->Instructions.push_back(std::move(Instruction));
490 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
491}
492
494 MCSymbol *Label = emitCFILabel();
497 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
498 if (!CurFrame)
499 return;
500 CurFrame->Instructions.push_back(std::move(Instruction));
501}
502
504 MCSymbol *Label = emitCFILabel();
507 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
508 if (!CurFrame)
509 return;
510 CurFrame->Instructions.push_back(std::move(Instruction));
511}
512
514 MCSymbol *Label = emitCFILabel();
517 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
518 if (!CurFrame)
519 return;
520 CurFrame->Instructions.push_back(std::move(Instruction));
521 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
522}
523
525 int64_t AddressSpace, SMLoc Loc) {
526 MCSymbol *Label = emitCFILabel();
528 Label, Register, Offset, AddressSpace, Loc);
529 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
530 if (!CurFrame)
531 return;
532 CurFrame->Instructions.push_back(std::move(Instruction));
533 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
534}
535
537 MCSymbol *Label = emitCFILabel();
540 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
541 if (!CurFrame)
542 return;
543 CurFrame->Instructions.push_back(std::move(Instruction));
544}
545
547 MCSymbol *Label = emitCFILabel();
550 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
551 if (!CurFrame)
552 return;
553 CurFrame->Instructions.push_back(std::move(Instruction));
554}
555
557 unsigned Encoding) {
558 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
559 if (!CurFrame)
560 return;
561 CurFrame->Personality = Sym;
562 CurFrame->PersonalityEncoding = Encoding;
563}
564
565void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
566 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
567 if (!CurFrame)
568 return;
569 CurFrame->Lsda = Sym;
570 CurFrame->LsdaEncoding = Encoding;
571}
572
574 MCSymbol *Label = emitCFILabel();
577 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
578 if (!CurFrame)
579 return;
580 CurFrame->Instructions.push_back(std::move(Instruction));
581}
582
584 // FIXME: Error if there is no matching cfi_remember_state.
585 MCSymbol *Label = emitCFILabel();
588 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
589 if (!CurFrame)
590 return;
591 CurFrame->Instructions.push_back(std::move(Instruction));
592}
593
595 MCSymbol *Label = emitCFILabel();
598 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
599 if (!CurFrame)
600 return;
601 CurFrame->Instructions.push_back(std::move(Instruction));
602}
603
605 MCSymbol *Label = emitCFILabel();
608 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
609 if (!CurFrame)
610 return;
611 CurFrame->Instructions.push_back(std::move(Instruction));
612}
613
615 MCSymbol *Label = emitCFILabel();
617 MCCFIInstruction::createEscape(Label, Values, Loc, "");
618 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
619 if (!CurFrame)
620 return;
621 CurFrame->Instructions.push_back(std::move(Instruction));
622}
623
625 MCSymbol *Label = emitCFILabel();
628 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
629 if (!CurFrame)
630 return;
631 CurFrame->Instructions.push_back(std::move(Instruction));
632}
633
635 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
636 if (!CurFrame)
637 return;
638 CurFrame->IsSignalFrame = true;
639}
640
642 MCSymbol *Label = emitCFILabel();
645 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
646 if (!CurFrame)
647 return;
648 CurFrame->Instructions.push_back(std::move(Instruction));
649}
650
651void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
652 SMLoc Loc) {
653 MCSymbol *Label = emitCFILabel();
655 MCCFIInstruction::createRegister(Label, Register1, Register2, Loc);
656 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
657 if (!CurFrame)
658 return;
659 CurFrame->Instructions.push_back(std::move(Instruction));
660}
661
663 MCSymbol *Label = emitCFILabel();
665 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
666 if (!CurFrame)
667 return;
668 CurFrame->Instructions.push_back(std::move(Instruction));
669}
670
672 MCSymbol *Label = emitCFILabel();
675 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
676 if (!CurFrame)
677 return;
678 CurFrame->Instructions.push_back(std::move(Instruction));
679}
680
682 MCSymbol *Label = emitCFILabel();
685 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
686 if (!CurFrame)
687 return;
688 CurFrame->Instructions.push_back(std::move(Instruction));
689}
690
692 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
693 if (!CurFrame)
694 return;
695 CurFrame->RAReg = Register;
696}
697
699 MCSymbol *Label = emitCFILabel();
701 if (MCDwarfFrameInfo *F = getCurrentDwarfFrameInfo())
702 F->Instructions.push_back(MCCFIInstruction::createLabel(Label, Sym, Loc));
703}
704
706 MCSymbol *Label = emitCFILabel();
709 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
710 if (!CurFrame)
711 return;
712 CurFrame->Instructions.push_back(std::move(Instruction));
713}
714
716 const MCAsmInfo *MAI = Context.getAsmInfo();
717 if (!MAI->usesWindowsCFI()) {
719 Loc, ".seh_* directives are not supported on this target");
720 return nullptr;
721 }
722 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
724 Loc, ".seh_ directive must appear within an active frame");
725 return nullptr;
726 }
727 return CurrentWinFrameInfo;
728}
729
731 const MCAsmInfo *MAI = Context.getAsmInfo();
732 if (!MAI->usesWindowsCFI())
733 return getContext().reportError(
734 Loc, ".seh_* directives are not supported on this target");
735 if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
737 Loc, "Starting a function before ending the previous one!");
738
739 MCSymbol *StartProc = emitCFILabel();
740
741 CurrentProcWinFrameInfoStartIndex = WinFrameInfos.size();
742 WinFrameInfos.emplace_back(
743 std::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
744 CurrentWinFrameInfo = WinFrameInfos.back().get();
745 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
746 CurrentWinFrameInfo->FunctionLoc = Loc;
747}
748
751 if (!CurFrame)
752 return;
753 CurrentWinFrameInfo = nullptr;
754
755 MCSymbol *Label = emitCFILabel();
756 CurFrame->End = Label;
757 const MCSymbol **FuncletOrFuncEndPtr =
758 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
759 : &CurFrame->FuncletOrFuncEnd;
760 if (!*FuncletOrFuncEndPtr)
761 *FuncletOrFuncEndPtr = CurFrame->End;
762
763 if (CurrentWinEpilog) {
764 // Set End to... something... to prevent crashes later.
766 CurrentWinEpilog = nullptr;
767 getContext().reportError(Loc, "Missing .seh_endepilogue in " +
768 CurFrame->Function->getName());
769 }
770
771 for (size_t I = CurrentProcWinFrameInfoStartIndex, E = WinFrameInfos.size();
772 I != E; ++I)
773 emitWindowsUnwindTables(WinFrameInfos[I].get());
774 switchSection(CurFrame->TextSection);
775}
776
779 if (!CurFrame)
780 return;
781
782 MCSymbol *Label = emitCFILabel();
783 const MCSymbol **FuncletOrFuncEndPtr =
784 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
785 : &CurFrame->FuncletOrFuncEnd;
786 *FuncletOrFuncEndPtr = Label;
787}
788
791 if (!CurFrame)
792 return;
793
794 if (!CurFrame->PrologEnd)
795 return getContext().reportError(
796 Loc, "can't split into a new chained region (.seh_splitchained) in the "
797 "middle of a prolog in " +
798 CurFrame->Function->getName());
799
800 MCSymbol *Label = emitCFILabel();
801
802 // Complete the current frame before starting a new, chained one.
803 CurFrame->End = Label;
804
805 // All chained frames point to the same parent.
806 WinEH::FrameInfo *ChainedParent =
807 CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
808
809 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
810 CurFrame->Function, Label, ChainedParent));
811 CurrentWinFrameInfo = WinFrameInfos.back().get();
812 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
813}
814
815void MCStreamer::emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
816 SMLoc Loc) {
818 if (!CurFrame)
819 return;
820
821 // Handlers are always associated with the parent frame.
822 CurFrame = CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
823
824 CurFrame->ExceptionHandler = Sym;
825 if (!Except && !Unwind)
826 getContext().reportError(Loc, "Don't know what kind of handler this is!");
827 if (Unwind)
828 CurFrame->HandlesUnwind = true;
829 if (Except)
830 CurFrame->HandlesExceptions = true;
831}
832
835 if (!CurFrame)
836 return;
837}
838
842
843static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
844 MCSection *MainCFISec,
845 const MCSection *TextSec) {
846 // If this is the main .text section, use the main unwind info section.
847 if (TextSec == Context.getObjectFileInfo()->getTextSection())
848 return MainCFISec;
849
850 const auto *TextSecCOFF = static_cast<const MCSectionCOFF *>(TextSec);
851 auto *MainCFISecCOFF = static_cast<MCSectionCOFF *>(MainCFISec);
852 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
853
854 // If this section is COMDAT, this unwind section should be COMDAT associative
855 // with its group.
856 const MCSymbol *KeySym = nullptr;
857 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
858 KeySym = TextSecCOFF->getCOMDATSymbol();
859
860 // In a GNU environment, we can't use associative comdats. Instead, do what
861 // GCC does, which is to make plain comdat selectany section named like
862 // ".[px]data$_Z3foov".
863 if (!Context.getAsmInfo()->hasCOFFAssociativeComdats()) {
864 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
865 TextSecCOFF->getName().split('$').second)
866 .str();
867 return Context.getCOFFSection(SectionName,
868 MainCFISecCOFF->getCharacteristics() |
871 }
872 }
873
874 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
875}
876
878 return getWinCFISection(getContext(), &NextWinCFIID,
879 getContext().getObjectFileInfo()->getPDataSection(),
880 TextSec);
881}
882
884 return getWinCFISection(getContext(), &NextWinCFIID,
885 getContext().getObjectFileInfo()->getXDataSection(),
886 TextSec);
887}
888
890
891static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
892 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
893}
894
897 if (!CurFrame)
898 return;
899
900 MCSymbol *Label = emitCFILabel();
901
903 Label, encodeSEHRegNum(Context, Register));
904 CurFrame->Instructions.push_back(Inst);
905}
906
908 SMLoc Loc) {
910 if (!CurFrame)
911 return;
912 if (CurFrame->LastFrameInst >= 0)
913 return getContext().reportError(
914 Loc, "frame register and offset can be set at most once");
915 if (Offset & 0x0F)
916 return getContext().reportError(Loc, "offset is not a multiple of 16");
917 if (Offset > 240)
918 return getContext().reportError(
919 Loc, "frame offset must be less than or equal to 240");
920
921 MCSymbol *Label = emitCFILabel();
922
925 CurFrame->LastFrameInst = CurFrame->Instructions.size();
926 CurFrame->Instructions.push_back(Inst);
927}
928
931 if (!CurFrame)
932 return;
933 if (Size == 0)
934 return getContext().reportError(Loc,
935 "stack allocation size must be non-zero");
936 if (Size & 7)
937 return getContext().reportError(
938 Loc, "stack allocation size is not a multiple of 8");
939
940 MCSymbol *Label = emitCFILabel();
941
943 CurFrame->Instructions.push_back(Inst);
944}
945
947 SMLoc Loc) {
949 if (!CurFrame)
950 return;
951
952 if (Offset & 7)
953 return getContext().reportError(
954 Loc, "register save offset is not 8 byte aligned");
955
956 MCSymbol *Label = emitCFILabel();
957
959 Label, encodeSEHRegNum(Context, Register), Offset);
960 CurFrame->Instructions.push_back(Inst);
961}
962
964 SMLoc Loc) {
966 if (!CurFrame)
967 return;
968 if (Offset & 0x0F)
969 return getContext().reportError(Loc, "offset is not a multiple of 16");
970
971 MCSymbol *Label = emitCFILabel();
972
974 Label, encodeSEHRegNum(Context, Register), Offset);
975 CurFrame->Instructions.push_back(Inst);
976}
977
980 if (!CurFrame)
981 return;
982 if (!CurFrame->Instructions.empty())
983 return getContext().reportError(
984 Loc, "If present, PushMachFrame must be the first UOP");
985
986 MCSymbol *Label = emitCFILabel();
987
989 CurFrame->Instructions.push_back(Inst);
990}
991
994 if (!CurFrame)
995 return;
996
997 MCSymbol *Label = emitCFILabel();
998
999 CurFrame->PrologEnd = Label;
1000}
1001
1004 if (!CurFrame)
1005 return;
1006
1007 MCSymbol *Label = emitCFILabel();
1008
1009 if (!CurFrame->PrologEnd) {
1010 CurFrame->PrologEnd = Label;
1012 Loc, "starting epilogue (.seh_startepilogue) before prologue has ended "
1013 "(.seh_endprologue) in " +
1014 CurFrame->Function->getName());
1015 }
1017 &CurFrame->EpilogMap.insert_or_assign(Label, WinEH::FrameInfo::Epilog())
1018 .first->second;
1019 CurrentWinEpilog->Start = Label;
1020 CurrentWinEpilog->Loc = Loc;
1021}
1022
1025 if (!CurFrame)
1026 return;
1027
1028 if (!CurrentWinEpilog)
1029 return getContext().reportError(Loc, "Stray .seh_endepilogue in " +
1030 CurFrame->Function->getName());
1031
1032 if ((CurFrame->Version >= 2) && !CurrentWinEpilog->UnwindV2Start) {
1033 // Set UnwindV2Start to... something... to prevent crashes later.
1034 CurrentWinEpilog->UnwindV2Start = CurrentWinEpilog->Start;
1035 getContext().reportError(Loc, "Missing .seh_unwindv2start in " +
1036 CurFrame->Function->getName());
1037 }
1038
1040 CurrentWinEpilog = nullptr;
1041}
1042
1045 if (!CurFrame)
1046 return;
1047
1048 if (!CurrentWinEpilog)
1049 return getContext().reportError(Loc, "Stray .seh_unwindv2start in " +
1050 CurFrame->Function->getName());
1051
1052 if (CurrentWinEpilog->UnwindV2Start)
1053 return getContext().reportError(Loc, "Duplicate .seh_unwindv2start in " +
1054 CurFrame->Function->getName());
1055
1056 MCSymbol *Label = emitCFILabel();
1057 CurrentWinEpilog->UnwindV2Start = Label;
1058}
1059
1062 if (!CurFrame)
1063 return;
1064
1066 return getContext().reportError(Loc, "Duplicate .seh_unwindversion in " +
1067 CurFrame->Function->getName());
1068
1069 if (Version != 2)
1070 return getContext().reportError(
1071 Loc, "Unsupported version specified in .seh_unwindversion in " +
1072 CurFrame->Function->getName());
1073
1074 CurFrame->Version = Version;
1075}
1076
1078
1080
1082
1084
1085void MCStreamer::emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
1086
1088
1090
1091/// EmitRawText - If this file is backed by an assembly streamer, this dumps
1092/// the specified string in the output .s file. This capability is
1093/// indicated by the hasRawTextSupport() predicate.
1095 // This is not llvm_unreachable for the sake of out of tree backend
1096 // developers who may not have assembly streamers and should serve as a
1097 // reminder to not accidentally call EmitRawText in the absence of such.
1098 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
1099 "it (target backend is likely missing an AsmStreamer "
1100 "implementation)");
1101}
1102
1104 SmallString<128> Str;
1105 emitRawTextImpl(T.toStringRef(Str));
1106}
1107
1109
1111
1113 if ((!DwarfFrameInfos.empty() && !DwarfFrameInfos.back().End) ||
1114 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
1115 getContext().reportError(EndLoc, "Unfinished frame!");
1116 return;
1117 }
1118
1120 if (TS)
1121 TS->finish();
1122
1123 finishImpl();
1124}
1125
1127 if (Context.getDwarfFormat() != dwarf::DWARF64)
1128 return;
1129 AddComment("DWARF64 Mark");
1131}
1132
1134 assert(Context.getDwarfFormat() == dwarf::DWARF64 ||
1137 AddComment(Comment);
1138 emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1139}
1140
1142 const Twine &Comment) {
1144 AddComment(Comment);
1145 MCSymbol *Lo = Context.createTempSymbol(Prefix + "_start");
1146 MCSymbol *Hi = Context.createTempSymbol(Prefix + "_end");
1147
1149 Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1150 // emit the begin symbol after we generate the length field.
1151 emitLabel(Lo);
1152 // Return the Hi symbol to the caller.
1153 return Hi;
1154}
1155
1157 // Set the value of the symbol, as we are at the start of the line table.
1158 emitLabel(StartSym);
1159}
1160
1163 Symbol->setVariableValue(Value);
1164
1166 if (TS)
1167 TS->emitAssignment(Symbol, Value);
1168}
1169
1171 uint64_t Address, const MCInst &Inst,
1172 const MCSubtargetInfo &STI,
1173 raw_ostream &OS) {
1174 InstPrinter.printInst(&Inst, Address, "", STI, OS);
1175}
1176
1178}
1179
1181 switch (Expr.getKind()) {
1182 case MCExpr::Target:
1183 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
1184 break;
1185
1186 case MCExpr::Constant:
1187 break;
1188
1189 case MCExpr::Binary: {
1190 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
1191 visitUsedExpr(*BE.getLHS());
1192 visitUsedExpr(*BE.getRHS());
1193 break;
1194 }
1195
1196 case MCExpr::SymbolRef:
1197 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
1198 break;
1199
1200 case MCExpr::Unary:
1201 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
1202 break;
1203
1204 case MCExpr::Specifier:
1205 visitUsedExpr(*cast<MCSpecifierExpr>(Expr).getSubExpr());
1206 break;
1207 }
1208}
1209
1211 // Scan for values.
1212 for (unsigned i = Inst.getNumOperands(); i--;)
1213 if (Inst.getOperand(i).isExpr())
1214 visitUsedExpr(*Inst.getOperand(i).getExpr());
1215}
1216
1218 uint64_t Attr, uint64_t Discriminator,
1219 const MCPseudoProbeInlineStack &InlineStack,
1220 MCSymbol *FnSym) {
1221 auto &Context = getContext();
1222
1223 // Create a symbol at in the current section for use in the probe.
1224 MCSymbol *ProbeSym = Context.createTempSymbol();
1225
1226 // Set the value of the symbol to use for the MCPseudoProbe.
1227 emitLabel(ProbeSym);
1228
1229 // Create a (local) probe entry with the symbol.
1230 MCPseudoProbe Probe(ProbeSym, Guid, Index, Type, Attr, Discriminator);
1231
1232 // Add the probe entry to this section's entries.
1233 Context.getMCPseudoProbeTable().getProbeSections().addPseudoProbe(
1234 FnSym, Probe, InlineStack);
1235}
1236
1238 unsigned Size) {
1239 // Get the Hi-Lo expression.
1240 const MCExpr *Diff =
1242 MCSymbolRefExpr::create(Lo, Context), Context);
1243
1244 const MCAsmInfo *MAI = Context.getAsmInfo();
1245 if (!MAI->doesSetDirectiveSuppressReloc()) {
1246 emitValue(Diff, Size);
1247 return;
1248 }
1249
1250 // Otherwise, emit with .set (aka assignment).
1251 MCSymbol *SetLabel = Context.createTempSymbol("set");
1252 emitAssignment(SetLabel, Diff);
1253 emitSymbolValue(SetLabel, Size);
1254}
1255
1257 const MCSymbol *Lo) {
1258 // Get the Hi-Lo expression.
1259 const MCExpr *Diff =
1261 MCSymbolRefExpr::create(Lo, Context), Context);
1262
1263 emitULEB128Value(Diff);
1264}
1265
1268 "emitSubsectionsViaSymbols only supported on Mach-O targets");
1269}
1270void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
1272 llvm_unreachable("this directive only supported on COFF targets");
1273}
1275 llvm_unreachable("this directive only supported on COFF targets");
1276}
1279 StringRef CompilerVersion,
1280 StringRef TimeStamp, StringRef Description) {
1281}
1283 llvm_unreachable("this directive only supported on COFF targets");
1284}
1286 llvm_unreachable("this directive only supported on COFF targets");
1287}
1289 MCSymbol *CsectSym,
1290 Align Alignment) {
1291 llvm_unreachable("this directive only supported on XCOFF targets");
1292}
1293
1295 MCSymbolAttr Linkage,
1296 MCSymbolAttr Visibility) {
1297 llvm_unreachable("emitXCOFFSymbolLinkageWithVisibility is only supported on "
1298 "XCOFF targets");
1299}
1300
1303
1305 llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");
1306}
1307
1309 const MCSymbol *Trap,
1310 unsigned Lang, unsigned Reason,
1311 unsigned FunctionSize,
1312 bool hasDebug) {
1313 report_fatal_error("emitXCOFFExceptDirective is only supported on "
1314 "XCOFF targets");
1315}
1316
1318 llvm_unreachable("emitXCOFFCInfoSym is only supported on"
1319 "XCOFF targets");
1320}
1321
1324 StringRef Name, bool KeepOriginalSym) {}
1326 Align ByteAlignment) {}
1330 uint64_t Size, Align ByteAlignment) {}
1331
1333 CurFrag = &Sec->getDummyFragment();
1334 auto *Sym = Sec->getBeginSymbol();
1335 if (!Sym || !Sym->isUndefined())
1336 return;
1337 // In Mach-O, DWARF sections use Begin as a temporary label, requiring a label
1338 // definition, unlike section symbols in other file formats.
1339 if (getContext().getObjectFileType() == MCContext::IsMachO)
1340 emitLabel(Sym);
1341 else
1342 Sym->setFragment(CurFrag);
1343}
1344
1350}
1354void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
1355 SMLoc Loc) {}
1359 unsigned MaxBytesToEmit) {}
1361 SMLoc Loc) {}
1363
1365 if (SectionStack.size() <= 1)
1366 return false;
1367 auto I = SectionStack.end();
1368 --I;
1369 MCSectionSubPair OldSec = I->first;
1370 --I;
1371 MCSectionSubPair NewSec = I->first;
1372
1373 if (NewSec.first && OldSec != NewSec)
1374 changeSection(NewSec.first, NewSec.second);
1375 SectionStack.pop_back();
1376 return true;
1377}
1378
1380 assert(Section && "Cannot switch to a null section!");
1381 MCSectionSubPair curSection = SectionStack.back().first;
1382 SectionStack.back().second = curSection;
1383 if (MCSectionSubPair(Section, Subsection) != curSection) {
1384 changeSection(Section, Subsection);
1385 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
1386 assert(!Section->hasEnded() && "Section already ended");
1387 }
1388}
1389
1390bool MCStreamer::switchSection(MCSection *Section, const MCExpr *SubsecExpr) {
1391 int64_t Subsec = 0;
1392 if (SubsecExpr) {
1393 if (!SubsecExpr->evaluateAsAbsolute(Subsec, getAssemblerPtr())) {
1394 getContext().reportError(SubsecExpr->getLoc(),
1395 "cannot evaluate subsection number");
1396 return true;
1397 }
1398 if (!isUInt<31>(Subsec)) {
1399 getContext().reportError(SubsecExpr->getLoc(),
1400 "subsection number " + Twine(Subsec) +
1401 " is not within [0,2147483647]");
1402 return true;
1403 }
1404 }
1405 switchSection(Section, Subsec);
1406 return false;
1407}
1408
1410 SectionStack.back().second = SectionStack.back().first;
1411 SectionStack.back().first = MCSectionSubPair(Section, 0);
1412 changeSection(Section, 0);
1413}
1414
1416 // TODO: keep track of the last subsection so that this symbol appears in the
1417 // correct place.
1418 MCSymbol *Sym = Section->getEndSymbol(Context);
1419 if (Sym->isInSection())
1420 return Sym;
1421
1422 switchSection(Section);
1423 emitLabel(Sym);
1424 return Sym;
1425}
1426
1428 auto *Sec = CurFrag->getParent();
1429 F->setParent(Sec);
1430 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
1431 CurFrag->Next = F;
1432 CurFrag = F;
1433 Sec->curFragList()->Tail = F;
1434}
1435
1436static VersionTuple
1438 VersionTuple TargetVersion) {
1439 VersionTuple Min = Target.getMinimumSupportedOSVersion();
1440 return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
1441}
1442
1443static MCVersionMinType
1445 assert(Target.isOSDarwin() && "expected a darwin OS");
1446 switch (Target.getOS()) {
1447 case Triple::MacOSX:
1448 case Triple::Darwin:
1449 return MCVM_OSXVersionMin;
1450 case Triple::IOS:
1451 assert(!Target.isMacCatalystEnvironment() &&
1452 "mac Catalyst should use LC_BUILD_VERSION");
1453 return MCVM_IOSVersionMin;
1454 case Triple::TvOS:
1455 return MCVM_TvOSVersionMin;
1456 case Triple::WatchOS:
1458 default:
1459 break;
1460 }
1461 llvm_unreachable("unexpected OS type");
1462}
1463
1465 assert(Target.isOSDarwin() && "expected a darwin OS");
1466 switch (Target.getOS()) {
1467 case Triple::MacOSX:
1468 case Triple::Darwin:
1469 return VersionTuple(10, 14);
1470 case Triple::IOS:
1471 // Mac Catalyst always uses the build version load command.
1472 if (Target.isMacCatalystEnvironment())
1473 return VersionTuple();
1474 [[fallthrough]];
1475 case Triple::TvOS:
1476 return VersionTuple(12);
1477 case Triple::WatchOS:
1478 return VersionTuple(5);
1479 case Triple::DriverKit:
1480 case Triple::BridgeOS:
1481 case Triple::XROS:
1482 // DriverKit/BridgeOS/XROS always use the build version load command.
1483 return VersionTuple();
1484 default:
1485 break;
1486 }
1487 llvm_unreachable("unexpected OS type");
1488}
1489
1492 assert(Target.isOSDarwin() && "expected a darwin OS");
1493 switch (Target.getOS()) {
1494 case Triple::MacOSX:
1495 case Triple::Darwin:
1496 return MachO::PLATFORM_MACOS;
1497 case Triple::IOS:
1498 if (Target.isMacCatalystEnvironment())
1499 return MachO::PLATFORM_MACCATALYST;
1500 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
1501 : MachO::PLATFORM_IOS;
1502 case Triple::TvOS:
1503 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
1504 : MachO::PLATFORM_TVOS;
1505 case Triple::WatchOS:
1506 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
1507 : MachO::PLATFORM_WATCHOS;
1508 case Triple::DriverKit:
1509 return MachO::PLATFORM_DRIVERKIT;
1510 case Triple::XROS:
1511 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
1512 : MachO::PLATFORM_XROS;
1513 case Triple::BridgeOS:
1514 return MachO::PLATFORM_BRIDGEOS;
1515 default:
1516 break;
1517 }
1518 llvm_unreachable("unexpected OS type");
1519}
1520
1522 const Triple &Target, const VersionTuple &SDKVersion,
1523 const Triple *DarwinTargetVariantTriple,
1524 const VersionTuple &DarwinTargetVariantSDKVersion) {
1525 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
1526 return;
1527 // Do we even know the version?
1528 if (Target.getOSMajorVersion() == 0)
1529 return;
1530
1532 switch (Target.getOS()) {
1533 case Triple::MacOSX:
1534 case Triple::Darwin:
1535 Target.getMacOSXVersion(Version);
1536 break;
1537 case Triple::IOS:
1538 case Triple::TvOS:
1539 Version = Target.getiOSVersion();
1540 break;
1541 case Triple::WatchOS:
1542 Version = Target.getWatchOSVersion();
1543 break;
1544 case Triple::DriverKit:
1545 Version = Target.getDriverKitVersion();
1546 break;
1547 case Triple::XROS:
1548 case Triple::BridgeOS:
1549 Version = Target.getOSVersion();
1550 break;
1551 default:
1552 llvm_unreachable("unexpected OS type");
1553 }
1554 assert(Version.getMajor() != 0 && "A non-zero major version is expected");
1555 auto LinkedTargetVersion =
1557 auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
1558 bool ShouldEmitBuildVersion = false;
1559 if (BuildVersionOSVersion.empty() ||
1560 LinkedTargetVersion >= BuildVersionOSVersion) {
1561 if (Target.isMacCatalystEnvironment() && DarwinTargetVariantTriple &&
1562 DarwinTargetVariantTriple->isMacOSX()) {
1563 emitVersionForTarget(*DarwinTargetVariantTriple,
1564 DarwinTargetVariantSDKVersion,
1565 /*DarwinTargetVariantTriple=*/nullptr,
1566 /*DarwinTargetVariantSDKVersion=*/VersionTuple());
1569 LinkedTargetVersion.getMajor(),
1570 LinkedTargetVersion.getMinor().value_or(0),
1571 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1572 return;
1573 }
1575 LinkedTargetVersion.getMajor(),
1576 LinkedTargetVersion.getMinor().value_or(0),
1577 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1578 ShouldEmitBuildVersion = true;
1579 }
1580
1581 if (const Triple *TVT = DarwinTargetVariantTriple) {
1582 if (Target.isMacOSX() && TVT->isMacCatalystEnvironment()) {
1583 auto TVLinkedTargetVersion =
1584 targetVersionOrMinimumSupportedOSVersion(*TVT, TVT->getiOSVersion());
1587 TVLinkedTargetVersion.getMajor(),
1588 TVLinkedTargetVersion.getMinor().value_or(0),
1589 TVLinkedTargetVersion.getSubminor().value_or(0),
1590 DarwinTargetVariantSDKVersion);
1591 }
1592 }
1593
1594 if (ShouldEmitBuildVersion)
1595 return;
1596
1598 LinkedTargetVersion.getMajor(),
1599 LinkedTargetVersion.getMinor().value_or(0),
1600 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1601}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static LVOptions Options
Definition LVOptions.cpp:25
This file declares the MCLFIRewriter class, an abstract class that encapsulates the rewriting logic f...
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
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:681
const char * getData8bitsDirective() const
Definition MCAsmInfo.h:463
bool doesSetDirectiveSuppressReloc() const
Definition MCAsmInfo.h:595
bool usesWindowsCFI() const
Definition MCAsmInfo.h:655
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:516
MCFragment & getDummyFragment()
Definition MCSection.h:635
MCSymbol * getBeginSymbol()
Definition MCSection.h:589
Streaming machine code generation interface.
Definition MCStreamer.h:221
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()
virtual void beginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
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.
std::unique_ptr< MCLFIRewriter > LFIRewriter
Definition MCStreamer.h:295
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 void emitSyntaxDirective(StringRef Syntax, StringRef Options)
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.
SmallVector< MCDwarfFrameInfo, 0 > DwarfFrameInfos
Definition MCStreamer.h:269
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:327
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:305
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:322
SMLoc getStartTokLoc() const
Definition MCStreamer.h:310
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:393
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:332
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:514
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 emitPrefAlign(Align A)
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.
void setLFIRewriter(std::unique_ptr< MCLFIRewriter > Rewriter)
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:756
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:427
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:504
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:510
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:94
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:96
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:589
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
@ Debug
Register 'use' is for debugging purpose.
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:67
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