LLVM 24.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.
130void MCStreamer::emitIntValue(uint64_t Value, unsigned Size) {
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();
135 uint64_t Swapped = support::endian::byte_swap(
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.
158unsigned MCStreamer::emitULEB128IntValue(uint64_t Value, unsigned PadTo) {
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
236 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
237 if (!CurFrame)
238 return;
239 CurFrame->IsNonHintPAuthFrame = true;
240}
241
242void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
243 unsigned Column, unsigned Flags,
244 unsigned Isa, unsigned Discriminator,
245 StringRef FileName, StringRef Comment) {
246 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
247 Discriminator);
248}
249
255
258 if (!Table.getLabel()) {
259 StringRef Prefix = Context.getAsmInfo().getInternalSymbolPrefix();
260 Table.setLabel(
261 Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
262 }
263 return Table.getLabel();
264}
265
267 return !FrameInfoStack.empty();
268}
269
270MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
273 "this directive must appear between "
274 ".cfi_startproc and .cfi_endproc directives");
275 return nullptr;
276 }
277 return &DwarfFrameInfos[FrameInfoStack.back().first];
278}
279
281 ArrayRef<uint8_t> Checksum,
282 unsigned ChecksumKind) {
283 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
284 ChecksumKind);
285}
286
290
292 unsigned IAFunc, unsigned IAFile,
293 unsigned IALine, unsigned IACol,
294 SMLoc Loc) {
295 if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
296 getContext().reportError(Loc, "parent function id not introduced by "
297 ".cv_func_id or .cv_inline_site_id");
298 return true;
299 }
300
302 FunctionId, IAFunc, IAFile, IALine, IACol);
303}
304
305void MCStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
306 unsigned Line, unsigned Column,
307 bool PrologueEnd, bool IsStmt,
308 StringRef FileName, SMLoc Loc) {}
309
312 MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
313 if (!FI) {
315 Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
316 return false;
317 }
318
319 // Track the section
320 if (FI->Section == nullptr)
322 else if (FI->Section != getCurrentSectionOnly()) {
324 Loc,
325 "all .cv_loc directives for a function must be in the same section");
326 return false;
327 }
328 return true;
329}
330
332 const MCSymbol *Begin,
333 const MCSymbol *End) {}
334
335void MCStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
336 unsigned SourceFileId,
337 unsigned SourceLineNum,
338 const MCSymbol *FnStartSym,
339 const MCSymbol *FnEndSym) {}
340
341/// Only call this on endian-specific types like ulittle16_t and little32_t, or
342/// structs composed of them.
343template <typename T>
344static void copyBytesForDefRange(SmallString<20> &BytePrefix,
345 codeview::SymbolKind SymKind,
346 const T &DefRangeHeader) {
347 BytePrefix.resize(2 + sizeof(T));
348 codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
349 memcpy(&BytePrefix[0], &SymKindLE, 2);
350 memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
351}
352
354 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
355 StringRef FixedSizePortion) {}
356
358 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
360 SmallString<20> BytePrefix;
361 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
362 emitCVDefRangeDirective(Ranges, BytePrefix);
363}
364
366 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
368 SmallString<20> BytePrefix;
369 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
370 DRHdr);
371 emitCVDefRangeDirective(Ranges, BytePrefix);
372}
373
375 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
377 SmallString<20> BytePrefix;
378 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
379 emitCVDefRangeDirective(Ranges, BytePrefix);
380}
381
383 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
385 SmallString<20> BytePrefix;
386 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
387 DRHdr);
388 emitCVDefRangeDirective(Ranges, BytePrefix);
389}
390
392 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
394 SmallString<20> BytePrefix;
395 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL_INDIR,
396 DRHdr);
397 emitCVDefRangeDirective(Ranges, BytePrefix);
398}
399
401 MCSymbol *EHSymbol) {
402}
403
405 switchSectionNoPrint(getContext().getObjectFileInfo()->getTextSection());
406}
407
409 Symbol->redefineIfPossible();
410
411 if (!Symbol->isUndefined() || Symbol->isVariable())
412 return getContext().reportError(Loc, "symbol '" + Twine(Symbol->getName()) +
413 "' is already defined");
414
415 assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
416 assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
417 assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
418 assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
419
420 Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
421
422 if (LFIRewriter)
423 LFIRewriter->onLabel(Symbol, *this);
424
426 if (TS)
427 TS->emitLabel(Symbol);
428}
429
432
433void MCStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {}
434
436 if (!FrameInfoStack.empty() &&
437 getCurrentSectionOnly() == FrameInfoStack.back().second)
438 return getContext().reportError(
439 Loc, "starting new .cfi frame before finishing the previous one");
440
441 MCDwarfFrameInfo Frame;
442 Frame.IsSimple = IsSimple;
444
445 const MCAsmInfo &MAI = Context.getAsmInfo();
446 for (const MCCFIInstruction &Inst : MAI.getInitialFrameState()) {
447 if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
448 Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister ||
449 Inst.getOperation() == MCCFIInstruction::OpLLVMDefAspaceCfa) {
450 Frame.CurrentCfaRegister = Inst.getRegister();
451 }
452 }
453
454 FrameInfoStack.emplace_back(DwarfFrameInfos.size(), getCurrentSectionOnly());
455 DwarfFrameInfos.push_back(std::move(Frame));
456}
457
460
462 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
463 if (!CurFrame)
464 return;
465 emitCFIEndProcImpl(*CurFrame);
466 FrameInfoStack.pop_back();
467}
468
470 // Put a dummy non-null value in Frame.End to mark that this frame has been
471 // closed.
472 Frame.End = (MCSymbol *)1;
473}
474
476 // Create a label and insert it into the line table and return this label
477 const MCDwarfLoc &DwarfLoc = getContext().getCurrentDwarfLoc();
478
479 MCSymbol *LineStreamLabel = getContext().createTempSymbol();
480 MCDwarfLineEntry LabelLineEntry(nullptr, DwarfLoc, LineStreamLabel);
481 getContext()
482 .getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
484 .addLineEntry(LabelLineEntry, getCurrentSectionOnly() /*Section*/);
485
486 return LineStreamLabel;
487}
488
490 // Return a dummy non-null value so that label fields appear filled in when
491 // generating textual assembly.
492 return (MCSymbol *)1;
493}
494
496 MCSymbol *Label = emitCFILabel();
499 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
500 if (!CurFrame)
501 return;
502 CurFrame->Instructions.push_back(std::move(Instruction));
503 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
504}
505
507 MCSymbol *Label = emitCFILabel();
510 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
511 if (!CurFrame)
512 return;
513 CurFrame->Instructions.push_back(std::move(Instruction));
514}
515
517 MCSymbol *Label = emitCFILabel();
520 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
521 if (!CurFrame)
522 return;
523 CurFrame->Instructions.push_back(std::move(Instruction));
524}
525
527 MCSymbol *Label = emitCFILabel();
530 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
531 if (!CurFrame)
532 return;
533 CurFrame->Instructions.push_back(std::move(Instruction));
534 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
535}
536
538 int64_t AddressSpace, SMLoc Loc) {
539 MCSymbol *Label = emitCFILabel();
541 Label, Register, Offset, AddressSpace, Loc);
542 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
543 if (!CurFrame)
544 return;
545 CurFrame->Instructions.push_back(std::move(Instruction));
546 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
547}
548
550 MCSymbol *Label = emitCFILabel();
553 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
554 if (!CurFrame)
555 return;
556 CurFrame->Instructions.push_back(std::move(Instruction));
557}
558
560 MCSymbol *Label = emitCFILabel();
563 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
564 if (!CurFrame)
565 return;
566 CurFrame->Instructions.push_back(std::move(Instruction));
567}
568
570 unsigned Encoding) {
571 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
572 if (!CurFrame)
573 return;
574 CurFrame->Personality = Sym;
575 CurFrame->PersonalityEncoding = Encoding;
576}
577
578void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
579 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
580 if (!CurFrame)
581 return;
582 CurFrame->Lsda = Sym;
583 CurFrame->LsdaEncoding = Encoding;
584}
585
587 MCSymbol *Label = emitCFILabel();
590 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
591 if (!CurFrame)
592 return;
593 ++CurFrame->RememberStateDepth;
594 CurFrame->Instructions.push_back(std::move(Instruction));
595}
596
598 MCSymbol *Label = emitCFILabel();
601 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
602 if (!CurFrame)
603 return;
604 if (!CurFrame->RememberStateDepth) {
605 getContext().reportError(Loc, "no matching .cfi_remember_state");
606 return;
607 }
608 --CurFrame->RememberStateDepth;
609 CurFrame->Instructions.push_back(std::move(Instruction));
610}
611
613 MCSymbol *Label = emitCFILabel();
616 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
617 if (!CurFrame)
618 return;
619 CurFrame->Instructions.push_back(std::move(Instruction));
620}
621
623 MCSymbol *Label = emitCFILabel();
626 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
627 if (!CurFrame)
628 return;
629 CurFrame->Instructions.push_back(std::move(Instruction));
630}
631
633 MCSymbol *Label = emitCFILabel();
636 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
637 if (!CurFrame)
638 return;
639 CurFrame->Instructions.push_back(std::move(Instruction));
640}
641
643 MCSymbol *Label = emitCFILabel();
646 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
647 if (!CurFrame)
648 return;
649 CurFrame->Instructions.push_back(std::move(Instruction));
650}
651
653 int64_t R1Size, int64_t R2,
654 int64_t R2Size, SMLoc Loc) {
655 MCSymbol *Label = emitCFILabel();
657 Label, Register, R1, R1Size, R2, R2Size, Loc);
658 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
659 if (!CurFrame)
660 return;
661 CurFrame->Instructions.push_back(std::move(Instruction));
662}
663
666 SMLoc Loc) {
667 MCSymbol *Label = emitCFILabel();
670 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
671 if (!CurFrame)
672 return;
673 CurFrame->Instructions.push_back(std::move(Instruction));
674}
675
677 int64_t RegisterSizeInBits,
678 int64_t MaskRegister,
679 int64_t MaskRegisterSizeInBits,
680 int64_t Offset, SMLoc Loc) {
681 MCSymbol *Label = emitCFILabel();
683 Label, Register, RegisterSizeInBits, MaskRegister, MaskRegisterSizeInBits,
684 Offset, Loc);
685 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
686 if (!CurFrame)
687 return;
688 CurFrame->Instructions.push_back(std::move(Instruction));
689}
690
692 int64_t Register, int64_t SpillRegister,
693 int64_t SpillRegisterLaneSizeInBits, int64_t MaskRegister,
694 int64_t MaskRegisterSizeInBits, SMLoc Loc) {
695
696 MCSymbol *Label = emitCFILabel();
698 Label, Register, SpillRegister, SpillRegisterLaneSizeInBits, MaskRegister,
699 MaskRegisterSizeInBits, Loc);
700 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
701 if (!CurFrame)
702 return;
703 CurFrame->Instructions.push_back(std::move(Instruction));
704}
705
707 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
708 if (!CurFrame)
709 return;
710 CurFrame->IsSignalFrame = true;
711}
712
714 MCSymbol *Label = emitCFILabel();
717 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
718 if (!CurFrame)
719 return;
720 CurFrame->Instructions.push_back(std::move(Instruction));
721}
722
723void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
724 SMLoc Loc) {
725 MCSymbol *Label = emitCFILabel();
727 MCCFIInstruction::createRegister(Label, Register1, Register2, Loc);
728 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
729 if (!CurFrame)
730 return;
731 CurFrame->Instructions.push_back(std::move(Instruction));
732}
733
735 MCSymbol *Label = emitCFILabel();
737 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
738 if (!CurFrame)
739 return;
740 CurFrame->Instructions.push_back(std::move(Instruction));
741}
742
744 MCSymbol *Label = emitCFILabel();
747 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
748 if (!CurFrame)
749 return;
750 CurFrame->Instructions.push_back(std::move(Instruction));
751}
752
754 MCSymbol *Label = emitCFILabel();
757 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
758 if (!CurFrame)
759 return;
760 CurFrame->Instructions.push_back(std::move(Instruction));
761}
762
763void MCStreamer::emitCFILLVMSetRAState(unsigned State, MCSymbol *PACSym,
764 SMLoc Loc) {
765 MCSymbol *Label = emitCFILabel();
767 MCCFIInstruction::createSetRAState(Label, State, PACSym, Loc);
768 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
769 if (!CurFrame)
770 return;
771 CurFrame->Instructions.push_back(std::move(Instruction));
772}
773
774void MCStreamer::emitCFILLVMSetRAState(unsigned State, int64_t Offset,
775 SMLoc Loc) {
776 MCSymbol *Label = emitCFILabel();
779 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
780 if (!CurFrame)
781 return;
782 CurFrame->Instructions.push_back(std::move(Instruction));
783}
784
786 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
787 if (!CurFrame)
788 return;
789 CurFrame->RAReg = Register;
790}
791
793 MCSymbol *Label = emitCFILabel();
795 if (MCDwarfFrameInfo *F = getCurrentDwarfFrameInfo())
796 F->Instructions.push_back(MCCFIInstruction::createLabel(Label, Sym, Loc));
797}
800 MCSymbol *Label = emitCFILabel();
803 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
804 if (!CurFrame)
805 return;
806 CurFrame->Instructions.push_back(std::move(Instruction));
807}
808
810 const MCAsmInfo &MAI = Context.getAsmInfo();
811 if (!MAI.usesWindowsCFI()) {
813 Loc, ".seh_* directives are not supported on this target");
814 return nullptr;
815 }
816 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
818 Loc, ".seh_ directive must appear within an active frame");
819 return nullptr;
820 }
821 return CurrentWinFrameInfo;
822}
823
825 const MCAsmInfo &MAI = Context.getAsmInfo();
826 if (!MAI.usesWindowsCFI())
827 return getContext().reportError(
828 Loc, ".seh_* directives are not supported on this target");
829 if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
831 Loc, "Starting a function before ending the previous one!");
832
833 MCSymbol *StartProc = emitCFILabel();
834
835 CurrentProcWinFrameInfoStartIndex = WinFrameInfos.size();
836 WinFrameInfos.emplace_back(
837 std::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
838 CurrentWinFrameInfo = WinFrameInfos.back().get();
839 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
840 CurrentWinFrameInfo->FunctionLoc = Loc;
841 // Inherit the module-wide default unwind version.
842 CurrentWinFrameInfo->Version = DefaultWinCFIUnwindVersion;
843}
844
847 if (!CurFrame)
848 return;
849 CurrentWinFrameInfo = nullptr;
850
851 MCSymbol *Label = emitCFILabel();
852 CurFrame->End = Label;
853 const MCSymbol **FuncletOrFuncEndPtr =
854 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
855 : &CurFrame->FuncletOrFuncEnd;
856 if (!*FuncletOrFuncEndPtr)
857 *FuncletOrFuncEndPtr = CurFrame->End;
858
859 if (CurrentWinEpilog) {
860 // Set End to... something... to prevent crashes later.
862 CurrentWinEpilog = nullptr;
863 getContext().reportError(Loc, "Missing .seh_endepilogue in " +
864 CurFrame->Function->getName());
865 }
866
867 for (size_t I = CurrentProcWinFrameInfoStartIndex, E = WinFrameInfos.size();
868 I != E; ++I)
869 emitWindowsUnwindTables(WinFrameInfos[I].get());
870 switchSection(CurFrame->TextSection);
871}
872
875 if (!CurFrame)
876 return;
877
878 MCSymbol *Label = emitCFILabel();
879 const MCSymbol **FuncletOrFuncEndPtr =
880 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
881 : &CurFrame->FuncletOrFuncEnd;
882 *FuncletOrFuncEndPtr = Label;
883}
884
887 if (!CurFrame)
888 return;
889
890 if (!CurFrame->PrologEnd)
891 return getContext().reportError(
892 Loc, "can't split into a new chained region (.seh_splitchained) in the "
893 "middle of a prolog in " +
894 CurFrame->Function->getName());
895
896 MCSymbol *Label = emitCFILabel();
897
898 // Complete the current frame before starting a new, chained one.
899 CurFrame->End = Label;
900
901 // All chained frames point to the same parent.
902 WinEH::FrameInfo *ChainedParent =
903 CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
904
905 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
906 CurFrame->Function, Label, ChainedParent));
907 CurrentWinFrameInfo = WinFrameInfos.back().get();
908 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
909}
910
911void MCStreamer::emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
912 SMLoc Loc) {
914 if (!CurFrame)
915 return;
916
917 // Handlers are always associated with the parent frame.
918 CurFrame = CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
919
920 CurFrame->ExceptionHandler = Sym;
921 if (!Except && !Unwind)
922 getContext().reportError(Loc, "Don't know what kind of handler this is!");
923 if (Unwind)
924 CurFrame->HandlesUnwind = true;
925 if (Except)
926 CurFrame->HandlesExceptions = true;
927}
928
931 if (!CurFrame)
932 return;
933}
934
936 const MCSymbolRefExpr *To, uint64_t Count) {
937}
938
939static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
940 MCSection *MainCFISec,
941 const MCSection *TextSec) {
942 // If this is the main .text section, use the main unwind info section.
943 if (TextSec == Context.getObjectFileInfo()->getTextSection())
944 return MainCFISec;
945
946 const auto *TextSecCOFF = static_cast<const MCSectionCOFF *>(TextSec);
947 auto *MainCFISecCOFF = static_cast<MCSectionCOFF *>(MainCFISec);
948 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
949
950 // If this section is COMDAT, this unwind section should be COMDAT associative
951 // with its group.
952 const MCSymbol *KeySym = nullptr;
953 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
954 KeySym = TextSecCOFF->getCOMDATSymbol();
955
956 // In a GNU environment, we can't use associative comdats. Instead, do what
957 // GCC does, which is to make plain comdat selectany section named like
958 // ".[px]data$_Z3foov".
959 if (!Context.getAsmInfo().hasCOFFAssociativeComdats()) {
960 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
961 TextSecCOFF->getName().split('$').second)
962 .str();
963 return Context.getCOFFSection(SectionName,
964 MainCFISecCOFF->getCharacteristics() |
967 }
968 }
969
970 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
971}
972
974 return getWinCFISection(getContext(), &NextWinCFIID,
975 getContext().getObjectFileInfo()->getPDataSection(),
976 TextSec);
977}
978
980 return getWinCFISection(getContext(), &NextWinCFIID,
981 getContext().getObjectFileInfo()->getXDataSection(),
982 TextSec);
983}
984
986
987static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
988 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
989}
990
991// Unwind formats before v3 store the register operand of an unwind code in a
992// 4-bit field, so extended registers (r16-r31 / xmm16-xmm31, i.e. SEH register
993// numbers greater than 15) cannot be represented. Report an error rather than
994// silently truncating the register number to a different register. Returns true
995// if an error was reported.
997 const WinEH::Instruction &Inst,
998 uint8_t Version, SMLoc Loc,
1001 Ctx.reportError(Loc, Directive +
1002 " with an extended register requires unwind v3");
1003 return true;
1004 }
1005 return false;
1006}
1007
1010 if (!CurFrame)
1011 return;
1012
1013 MCSymbol *Label = emitCFILabel();
1014
1016 Label, encodeSEHRegNum(Context, Register));
1017 if (CurrentWinEpilog) {
1018 if (CurFrame->Version < 3)
1019 return getContext().reportError(
1020 Loc, ".seh_pushreg inside epilog requires unwind v3");
1021 CurrentWinEpilog->Instructions.push_back(Inst);
1022 } else {
1023 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1024 ".seh_pushreg"))
1025 return;
1026 CurFrame->Instructions.push_back(Inst);
1027 }
1028}
1029
1031 SMLoc Loc) {
1033 if (!CurFrame)
1034 return;
1035
1036 // UOP_Push2 is V3-only - reject for V1/V2.
1037 if (CurFrame->Version < 3)
1038 return getContext().reportError(
1039 Loc, ".seh_push2regs is only supported for unwind v3");
1040
1041 MCSymbol *Label = emitCFILabel();
1042
1044 Label, encodeSEHRegNum(Context, Reg1), encodeSEHRegNum(Context, Reg2));
1045 if (CurrentWinEpilog)
1046 CurrentWinEpilog->Instructions.push_back(Inst);
1047 else
1048 CurFrame->Instructions.push_back(Inst);
1049}
1050
1052 SMLoc Loc) {
1054 if (!CurFrame)
1055 return;
1056 if (!CurrentWinEpilog && CurFrame->LastFrameInst >= 0)
1057 return getContext().reportError(
1058 Loc, "frame register and offset can be set at most once");
1059 if (Offset & 0x0F)
1060 return getContext().reportError(Loc, "offset is not a multiple of 16");
1061 if (Offset > 240)
1062 return getContext().reportError(
1063 Loc, "frame offset must be less than or equal to 240");
1064
1065 MCSymbol *Label = emitCFILabel();
1066
1069 if (CurrentWinEpilog) {
1070 if (CurFrame->Version < 3)
1071 return getContext().reportError(
1072 Loc, ".seh_setframe inside epilog requires unwind v3");
1073 CurrentWinEpilog->Instructions.push_back(Inst);
1074 } else {
1075 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1076 ".seh_setframe"))
1077 return;
1078 CurFrame->LastFrameInst = CurFrame->Instructions.size();
1079 CurFrame->Instructions.push_back(Inst);
1080 }
1081}
1082
1085 if (!CurFrame)
1086 return;
1087 if (Size == 0)
1088 return getContext().reportError(Loc,
1089 "stack allocation size must be non-zero");
1090 if (Size & 7)
1091 return getContext().reportError(
1092 Loc, "stack allocation size is not a multiple of 8");
1093
1094 MCSymbol *Label = emitCFILabel();
1095
1097 if (CurrentWinEpilog) {
1098 if (CurFrame->Version < 3)
1099 return getContext().reportError(
1100 Loc, ".seh_stackalloc inside epilog requires unwind v3");
1101 CurrentWinEpilog->Instructions.push_back(Inst);
1102 } else {
1103 CurFrame->Instructions.push_back(Inst);
1104 }
1105}
1106
1108 SMLoc Loc) {
1110 if (!CurFrame)
1111 return;
1112
1113 if (Offset & 7)
1114 return getContext().reportError(
1115 Loc, "register save offset is not 8 byte aligned");
1116
1117 MCSymbol *Label = emitCFILabel();
1118
1120 Label, encodeSEHRegNum(Context, Register), Offset);
1121 if (CurrentWinEpilog) {
1122 if (CurFrame->Version < 3)
1123 return getContext().reportError(
1124 Loc, ".seh_savereg inside epilog requires unwind v3");
1125 CurrentWinEpilog->Instructions.push_back(Inst);
1126 } else {
1127 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1128 ".seh_savereg"))
1129 return;
1130 CurFrame->Instructions.push_back(Inst);
1131 }
1132}
1133
1135 SMLoc Loc) {
1137 if (!CurFrame)
1138 return;
1139 if (Offset & 0x0F)
1140 return getContext().reportError(Loc, "offset is not a multiple of 16");
1141
1142 MCSymbol *Label = emitCFILabel();
1143
1145 Label, encodeSEHRegNum(Context, Register), Offset);
1146 if (CurrentWinEpilog) {
1147 if (CurFrame->Version < 3)
1148 return getContext().reportError(
1149 Loc, ".seh_savexmm inside epilog requires unwind v3");
1150 CurrentWinEpilog->Instructions.push_back(Inst);
1151 } else {
1152 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1153 ".seh_savexmm"))
1154 return;
1155 CurFrame->Instructions.push_back(Inst);
1156 }
1157}
1158
1161 if (!CurFrame)
1162 return;
1163 if (CurrentWinEpilog) {
1164 if (CurFrame->Version < 3)
1165 return getContext().reportError(
1166 Loc, ".seh_pushframe inside epilog requires unwind v3");
1167 MCSymbol *Label = emitCFILabel();
1169 CurrentWinEpilog->Instructions.push_back(Inst);
1170 return;
1171 }
1172 if (!CurFrame->Instructions.empty())
1173 return getContext().reportError(
1174 Loc, "If present, PushMachFrame must be the first UOP");
1175
1176 MCSymbol *Label = emitCFILabel();
1177
1179 CurFrame->Instructions.push_back(Inst);
1180}
1181
1184 if (!CurFrame)
1185 return;
1186
1187 MCSymbol *Label = emitCFILabel();
1188
1189 CurFrame->PrologEnd = Label;
1190}
1191
1194 if (!CurFrame)
1195 return;
1196
1197 MCSymbol *Label = emitCFILabel();
1198
1199 if (!CurFrame->PrologEnd) {
1200 CurFrame->PrologEnd = Label;
1202 Loc, "starting epilogue (.seh_startepilogue) before prologue has ended "
1203 "(.seh_endprologue) in " +
1204 CurFrame->Function->getName());
1205 }
1207 &CurFrame->EpilogMap.insert_or_assign(Label, WinEH::FrameInfo::Epilog())
1208 .first->second;
1209 CurrentWinEpilog->Start = Label;
1210 CurrentWinEpilog->Loc = Loc;
1211}
1212
1215 if (!CurFrame)
1216 return;
1217
1218 if (!CurrentWinEpilog)
1219 return getContext().reportError(Loc, "Stray .seh_endepilogue in " +
1220 CurFrame->Function->getName());
1221
1222 if ((CurFrame->Version == 2) && !CurrentWinEpilog->UnwindV2Start) {
1223 // Set UnwindV2Start to... something... to prevent crashes later.
1224 CurrentWinEpilog->UnwindV2Start = CurrentWinEpilog->Start;
1225 getContext().reportError(Loc, "Missing .seh_unwindv2start in " +
1226 CurFrame->Function->getName());
1227 }
1228
1230 CurrentWinEpilog = nullptr;
1231}
1232
1235 if (!CurFrame)
1236 return;
1237
1238 if (!CurrentWinEpilog)
1239 return getContext().reportError(Loc, "Stray .seh_unwindv2start in " +
1240 CurFrame->Function->getName());
1241
1242 if (CurrentWinEpilog->UnwindV2Start)
1243 return getContext().reportError(Loc, "Duplicate .seh_unwindv2start in " +
1244 CurFrame->Function->getName());
1245
1246 MCSymbol *Label = emitCFILabel();
1247 CurrentWinEpilog->UnwindV2Start = Label;
1248}
1249
1251 bool SupportedVersion = (Version >= 1 && Version <= 3);
1252
1253 // If called outside a proc, set the module-level default.
1254 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
1255 if (!SupportedVersion)
1256 return getContext().reportError(
1257 Loc, "Unsupported version for .seh_unwindversion");
1259 return;
1260 }
1261
1262 // Per-function override (existing behaviour).
1263 WinEH::FrameInfo *CurFrame = CurrentWinFrameInfo;
1264
1265 if (CurFrame->Version != DefaultWinCFIUnwindVersion &&
1267 return getContext().reportError(Loc, "Duplicate .seh_unwindversion in " +
1268 CurFrame->Function->getName());
1269
1270 if (!SupportedVersion)
1271 return getContext().reportError(
1272 Loc, "Unsupported version specified in .seh_unwindversion in " +
1273 CurFrame->Function->getName());
1274
1275 CurFrame->Version = Version;
1276}
1277
1279
1281
1283
1284void MCStreamer::emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) {}
1285
1286void MCStreamer::emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
1287
1289
1291
1292/// EmitRawText - If this file is backed by an assembly streamer, this dumps
1293/// the specified string in the output .s file. This capability is
1294/// indicated by the hasRawTextSupport() predicate.
1296 // This is not llvm_unreachable for the sake of out of tree backend
1297 // developers who may not have assembly streamers and should serve as a
1298 // reminder to not accidentally call EmitRawText in the absence of such.
1299 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
1300 "it (target backend is likely missing an AsmStreamer "
1301 "implementation)");
1302}
1303
1305 SmallString<128> Str;
1306 emitRawTextImpl(T.toStringRef(Str));
1307}
1308
1310
1312
1315 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
1316 getContext().reportError(EndLoc, "Unfinished frame!");
1317 return;
1318 }
1319
1320 if (LFIRewriter)
1321 LFIRewriter->finish(*this);
1322
1324 if (TS)
1325 TS->finish();
1326
1327 finishImpl();
1328}
1329
1331 if (Context.getDwarfFormat() != dwarf::DWARF64)
1332 return;
1333 AddComment("DWARF64 Mark");
1335}
1336
1337void MCStreamer::emitDwarfUnitLength(uint64_t Length, const Twine &Comment) {
1338 assert(Context.getDwarfFormat() == dwarf::DWARF64 ||
1341 AddComment(Comment);
1342 emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1343}
1344
1346 const Twine &Comment) {
1348 AddComment(Comment);
1349 MCSymbol *Lo = Context.createTempSymbol(Prefix + "_start");
1350 MCSymbol *Hi = Context.createTempSymbol(Prefix + "_end");
1351
1353 Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1354 // emit the begin symbol after we generate the length field.
1355 emitLabel(Lo);
1356 // Return the Hi symbol to the caller.
1357 return Hi;
1358}
1359
1361 // Set the value of the symbol, as we are at the start of the line table.
1362 emitLabel(StartSym);
1363}
1364
1367 Symbol->setVariableValue(Value);
1368
1370 if (TS)
1371 TS->emitAssignment(Symbol, Value);
1372}
1373
1375 uint64_t Address, const MCInst &Inst,
1376 const MCSubtargetInfo &STI,
1377 raw_ostream &OS) {
1378 InstPrinter.printInst(&Inst, Address, "", STI, OS);
1379}
1380
1382}
1383
1385 switch (Expr.getKind()) {
1386 case MCExpr::Target:
1387 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
1388 break;
1389
1390 case MCExpr::Constant:
1391 break;
1392
1393 case MCExpr::Binary: {
1394 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
1395 visitUsedExpr(*BE.getLHS());
1396 visitUsedExpr(*BE.getRHS());
1397 break;
1398 }
1399
1400 case MCExpr::SymbolRef:
1401 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
1402 break;
1403
1404 case MCExpr::Unary:
1405 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
1406 break;
1407
1408 case MCExpr::Specifier:
1409 visitUsedExpr(*cast<MCSpecifierExpr>(Expr).getSubExpr());
1410 break;
1411 }
1412}
1413
1415 // Scan for values.
1416 for (unsigned i = Inst.getNumOperands(); i--;)
1417 if (Inst.getOperand(i).isExpr())
1418 visitUsedExpr(*Inst.getOperand(i).getExpr());
1419}
1420
1421void MCStreamer::emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type,
1422 uint64_t Attr, uint64_t Discriminator,
1423 const MCPseudoProbeInlineStack &InlineStack,
1424 MCSymbol *FnSym) {
1425 auto &Context = getContext();
1426
1427 // Create a symbol at in the current section for use in the probe.
1428 MCSymbol *ProbeSym = Context.createTempSymbol();
1429
1430 // Set the value of the symbol to use for the MCPseudoProbe.
1431 emitLabel(ProbeSym);
1432
1433 // Create a (local) probe entry with the symbol.
1434 MCPseudoProbe Probe(ProbeSym, Guid, Index, Type, Attr, Discriminator);
1435
1436 // Add the probe entry to this section's entries.
1437 Context.getMCPseudoProbeTable().getProbeSections().addPseudoProbe(
1438 FnSym, Probe, InlineStack);
1439}
1440
1442 unsigned Size) {
1443 // Get the Hi-Lo expression.
1444 const MCExpr *Diff =
1446 MCSymbolRefExpr::create(Lo, Context), Context);
1447
1448 const MCAsmInfo &MAI = Context.getAsmInfo();
1449 if (!MAI.doesSetDirectiveSuppressReloc()) {
1450 emitValue(Diff, Size);
1451 return;
1452 }
1453
1454 // Otherwise, emit with .set (aka assignment).
1455 MCSymbol *SetLabel = Context.createTempSymbol("set");
1456 emitAssignment(SetLabel, Diff);
1457 emitSymbolValue(SetLabel, Size);
1458}
1459
1461 const MCSymbol *Lo) {
1462 // Get the Hi-Lo expression.
1463 const MCExpr *Diff =
1465 MCSymbolRefExpr::create(Lo, Context), Context);
1466
1467 emitULEB128Value(Diff);
1468}
1469
1472 "emitSubsectionsViaSymbols only supported on Mach-O targets");
1473}
1474void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
1476 llvm_unreachable("this directive only supported on COFF targets");
1477}
1479 llvm_unreachable("this directive only supported on COFF targets");
1480}
1483 StringRef CompilerVersion,
1484 StringRef TimeStamp, StringRef Description) {
1485}
1487 llvm_unreachable("this directive only supported on COFF targets");
1488}
1490 llvm_unreachable("this directive only supported on COFF targets");
1491}
1493 MCSymbol *CsectSym,
1494 Align Alignment) {
1495 llvm_unreachable("this directive only supported on XCOFF targets");
1496}
1497
1499 MCSymbolAttr Linkage,
1500 MCSymbolAttr Visibility) {
1501 llvm_unreachable("emitXCOFFSymbolLinkageWithVisibility is only supported on "
1502 "XCOFF targets");
1503}
1504
1507
1509 llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");
1510}
1511
1513 const MCSymbol *Trap,
1514 unsigned Lang, unsigned Reason,
1515 unsigned FunctionSize,
1516 bool hasDebug) {
1517 report_fatal_error("emitXCOFFExceptDirective is only supported on "
1518 "XCOFF targets");
1519}
1520
1522 llvm_unreachable("emitXCOFFCInfoSym is only supported on"
1523 "XCOFF targets");
1524}
1525
1528 StringRef Name, bool KeepOriginalSym) {}
1530 Align ByteAlignment) {}
1534 uint64_t Size, Align ByteAlignment) {}
1535
1537 CurFrag = &Sec->getDummyFragment();
1538 auto *Sym = Sec->getBeginSymbol();
1539 if (!Sym || !Sym->isUndefined())
1540 return;
1541 // In Mach-O, DWARF sections use Begin as a temporary label, requiring a label
1542 // definition, unlike section symbols in other file formats.
1543 if (getContext().getObjectFileType() == MCContext::IsMachO)
1544 emitLabel(Sym);
1545 else
1546 Sym->setFragment(CurFrag);
1547}
1548
1554}
1557void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}
1558void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
1559 SMLoc Loc) {}
1561void MCStreamer::emitPrefAlign(Align A, const MCSymbol &End, bool EmitNops,
1562 uint8_t Fill, const MCSubtargetInfo &STI) {}
1564 unsigned MaxBytesToEmit) {}
1566 SMLoc Loc) {}
1569 S.getStartTokLoc(),
1570 "aligned bundling is not supported by this object file format");
1571}
1582
1584 if (SectionStack.size() <= 1)
1585 return false;
1586 auto I = SectionStack.end();
1587 --I;
1588 MCSectionSubPair OldSec = I->first;
1589 --I;
1590 MCSectionSubPair NewSec = I->first;
1591
1592 if (NewSec.first && OldSec != NewSec)
1593 changeSection(NewSec.first, NewSec.second);
1594 SectionStack.pop_back();
1595 return true;
1596}
1597
1599 assert(Section && "Cannot switch to a null section!");
1600 MCSectionSubPair curSection = SectionStack.back().first;
1601 SectionStack.back().second = curSection;
1602 if (MCSectionSubPair(Section, Subsection) != curSection) {
1603 changeSection(Section, Subsection);
1604 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
1605 assert(!Section->hasEnded() && "Section already ended");
1606 }
1607}
1608
1609bool MCStreamer::switchSection(MCSection *Section, const MCExpr *SubsecExpr) {
1610 int64_t Subsec = 0;
1611 if (SubsecExpr) {
1612 if (!SubsecExpr->evaluateAsAbsolute(Subsec, getAssemblerPtr())) {
1613 getContext().reportError(SubsecExpr->getLoc(),
1614 "cannot evaluate subsection number");
1615 return true;
1616 }
1617 if (!isUInt<31>(Subsec)) {
1618 getContext().reportError(SubsecExpr->getLoc(),
1619 "subsection number " + Twine(Subsec) +
1620 " is not within [0,2147483647]");
1621 return true;
1622 }
1623 }
1624 switchSection(Section, Subsec);
1625 return false;
1626}
1627
1629 SectionStack.back().second = SectionStack.back().first;
1630 SectionStack.back().first = MCSectionSubPair(Section, 0);
1631 changeSection(Section, 0);
1632}
1633
1635 // TODO: keep track of the last subsection so that this symbol appears in the
1636 // correct place.
1637 MCSymbol *Sym = Section->getEndSymbol(Context);
1638 if (Sym->isInSection())
1639 return Sym;
1640
1641 switchSection(Section);
1642 emitLabel(Sym);
1643 return Sym;
1644}
1645
1647 auto *Sec = CurFrag->getParent();
1648 F->setParent(Sec);
1649 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
1650 CurFrag->Next = F;
1651 CurFrag = F;
1652 Sec->curFragList()->Tail = F;
1653}
1654
1655static VersionTuple
1657 VersionTuple TargetVersion) {
1658 VersionTuple Min = Target.getMinimumSupportedOSVersion();
1659 return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
1660}
1661
1662static MCVersionMinType
1664 assert(Target.isOSDarwin() && "expected a darwin OS");
1665 switch (Target.getOS()) {
1666 case Triple::MacOSX:
1667 case Triple::Darwin:
1668 return MCVM_OSXVersionMin;
1669 case Triple::IOS:
1670 assert(!Target.isMacCatalystEnvironment() &&
1671 "mac Catalyst should use LC_BUILD_VERSION");
1672 return MCVM_IOSVersionMin;
1673 case Triple::TvOS:
1674 return MCVM_TvOSVersionMin;
1675 case Triple::WatchOS:
1677 default:
1678 break;
1679 }
1680 llvm_unreachable("unexpected OS type");
1681}
1682
1684 assert(Target.isOSDarwin() && "expected a darwin OS");
1685 switch (Target.getOS()) {
1686 case Triple::MacOSX:
1687 case Triple::Darwin:
1688 return VersionTuple(10, 14);
1689 case Triple::IOS:
1690 // Mac Catalyst always uses the build version load command.
1691 if (Target.isMacCatalystEnvironment())
1692 return VersionTuple();
1693 [[fallthrough]];
1694 case Triple::TvOS:
1695 return VersionTuple(12);
1696 case Triple::WatchOS:
1697 return VersionTuple(5);
1698 case Triple::DriverKit:
1699 case Triple::BridgeOS:
1700 case Triple::XROS:
1701 // DriverKit/BridgeOS/XROS always use the build version load command.
1702 return VersionTuple();
1703 default:
1704 break;
1705 }
1706 llvm_unreachable("unexpected OS type");
1707}
1708
1711 assert(Target.isOSDarwin() && "expected a darwin OS");
1712 switch (Target.getOS()) {
1713 case Triple::MacOSX:
1714 case Triple::Darwin:
1715 return MachO::PLATFORM_MACOS;
1716 case Triple::IOS:
1717 if (Target.isMacCatalystEnvironment())
1718 return MachO::PLATFORM_MACCATALYST;
1719 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
1720 : MachO::PLATFORM_IOS;
1721 case Triple::TvOS:
1722 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
1723 : MachO::PLATFORM_TVOS;
1724 case Triple::WatchOS:
1725 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
1726 : MachO::PLATFORM_WATCHOS;
1727 case Triple::DriverKit:
1728 return MachO::PLATFORM_DRIVERKIT;
1729 case Triple::XROS:
1730 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
1731 : MachO::PLATFORM_XROS;
1732 case Triple::BridgeOS:
1733 return MachO::PLATFORM_BRIDGEOS;
1734 default:
1735 break;
1736 }
1737 llvm_unreachable("unexpected OS type");
1738}
1739
1741 const Triple &Target, const VersionTuple &SDKVersion,
1742 const Triple *DarwinTargetVariantTriple,
1743 const VersionTuple &DarwinTargetVariantSDKVersion) {
1744 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
1745 return;
1746 // Do we even know the version?
1747 if (Target.getOSMajorVersion() == 0)
1748 return;
1749
1751 switch (Target.getOS()) {
1752 case Triple::MacOSX:
1753 case Triple::Darwin:
1754 Target.getMacOSXVersion(Version);
1755 break;
1756 case Triple::IOS:
1757 case Triple::TvOS:
1758 Version = Target.getiOSVersion();
1759 break;
1760 case Triple::WatchOS:
1761 Version = Target.getWatchOSVersion();
1762 break;
1763 case Triple::DriverKit:
1764 Version = Target.getDriverKitVersion();
1765 break;
1766 case Triple::XROS:
1767 case Triple::BridgeOS:
1768 Version = Target.getOSVersion();
1769 break;
1770 default:
1771 llvm_unreachable("unexpected OS type");
1772 }
1773 assert(Version.getMajor() != 0 && "A non-zero major version is expected");
1774 auto LinkedTargetVersion =
1776 auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
1777 bool ShouldEmitBuildVersion = false;
1778 if (BuildVersionOSVersion.empty() ||
1779 LinkedTargetVersion >= BuildVersionOSVersion) {
1780 if (Target.isMacCatalystEnvironment() && DarwinTargetVariantTriple &&
1781 DarwinTargetVariantTriple->isMacOSX()) {
1782 emitVersionForTarget(*DarwinTargetVariantTriple,
1783 DarwinTargetVariantSDKVersion,
1784 /*DarwinTargetVariantTriple=*/nullptr,
1785 /*DarwinTargetVariantSDKVersion=*/VersionTuple());
1788 LinkedTargetVersion.getMajor(),
1789 LinkedTargetVersion.getMinor().value_or(0),
1790 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1791 return;
1792 }
1794 LinkedTargetVersion.getMajor(),
1795 LinkedTargetVersion.getMinor().value_or(0),
1796 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1797 ShouldEmitBuildVersion = true;
1798 }
1799
1800 if (const Triple *TVT = DarwinTargetVariantTriple) {
1801 if (Target.isMacOSX() && TVT->isMacCatalystEnvironment()) {
1802 auto TVLinkedTargetVersion =
1803 targetVersionOrMinimumSupportedOSVersion(*TVT, TVT->getiOSVersion());
1806 TVLinkedTargetVersion.getMajor(),
1807 TVLinkedTargetVersion.getMinor().value_or(0),
1808 TVLinkedTargetVersion.getSubminor().value_or(0),
1809 DarwinTargetVariantSDKVersion);
1810 }
1811 }
1812
1813 if (ShouldEmitBuildVersion)
1814 return;
1815
1817 LinkedTargetVersion.getMajor(),
1818 LinkedTargetVersion.getMinor().value_or(0),
1819 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1820}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
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 bool checkUnwindV3ExtendedReg(MCContext &Ctx, const WinEH::Instruction &Inst, uint8_t Version, SMLoc Loc, StringRef Directive)
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 void reportBundlingUnsupported(MCStreamer &S)
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 R2(n)
#define T
static constexpr StringLiteral Filename
This file defines the SmallString class.
Class for arbitrary precision integers.
Definition APInt.h:78
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
LLVM_ABI bool addFile(MCStreamer &OS, unsigned FileNumber, StringRef Filename, ArrayRef< uint8_t > ChecksumBytes, uint8_t ChecksumKind)
LLVM_ABI MCCVFunctionInfo * getCVFunctionInfo(unsigned FuncId)
Retreive the function info if this is a valid function id, or nullptr.
LLVM_ABI bool recordFunctionId(unsigned FuncId)
Records the function id of a normal function.
LLVM_ABI 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:67
const std::vector< MCCFIInstruction > & getInitialFrameState() const
Definition MCAsmInfo.h:715
const char * getData8bitsDirective() const
Definition MCAsmInfo.h:473
bool doesSetDirectiveSuppressReloc() const
Definition MCAsmInfo.h:618
bool usesWindowsCFI() const
Returns true if the object format describes unwind information with Windows SEH unwind opcodes (....
Definition MCAsmInfo.h:677
Binary assembler expressions.
Definition MCExpr.h:298
const MCExpr * getLHS() const
Get the left-hand side expression of the binary operator.
Definition MCExpr.h:445
const MCExpr * getRHS() const
Get the right-hand side expression of the binary operator.
Definition MCExpr.h:448
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
Definition MCExpr.h:427
static MCCFIInstruction createDefCfaRegister(MCSymbol *L, unsigned Register, SMLoc Loc={})
.cfi_def_cfa_register modifies a rule for computing CFA.
Definition MCDwarf.h:635
static MCCFIInstruction createLLVMVectorOffset(MCSymbol *L, unsigned Register, unsigned RegisterSizeInBits, unsigned MaskRegister, unsigned MaskRegisterSizeInBits, int64_t Offset, SMLoc Loc={})
.cfi_llvm_vector_offset Previous value of Register is saved at Offset from CFA.
Definition MCDwarf.h:797
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:732
static MCCFIInstruction createGnuArgsSize(MCSymbol *L, int64_t Size, SMLoc Loc={})
A special wrapper for .cfi_escape that indicates GNU_ARGS_SIZE.
Definition MCDwarf.h:765
static MCCFIInstruction createLLVMVectorRegisters(MCSymbol *L, unsigned Register, ArrayRef< VectorRegisterWithLane > VectorRegisters, SMLoc Loc={})
.cfi_llvm_vector_registers Previous value of Register is saved in lanes of vector registers.
Definition MCDwarf.h:787
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:725
static MCCFIInstruction createSetRAState(MCSymbol *L, unsigned State, MCSymbol *PACSym=nullptr, SMLoc Loc={})
.cfi_set_ra_state AArch64 set RA sign state,
Definition MCDwarf.h:708
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:660
static MCCFIInstruction createLLVMVectorRegisterMask(MCSymbol *L, unsigned Register, unsigned SpillRegister, unsigned SpillRegisterLaneSizeInBits, unsigned MaskRegister, unsigned MaskRegisterSizeInBits, SMLoc Loc={})
.cfi_llvm_vector_register_mask Previous value of Register is saved in SpillRegister,...
Definition MCDwarf.h:808
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:685
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:628
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:670
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:828
static MCCFIInstruction createNegateRAStateWithPC(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state_with_pc AArch64 negate RA state with PC.
Definition MCDwarf.h:701
static MCCFIInstruction createNegateRAState(MCSymbol *L, SMLoc Loc={})
.cfi_negate_ra_state AArch64 negate RA state.
Definition MCDwarf.h:696
static MCCFIInstruction createRememberState(MCSymbol *L, SMLoc Loc={})
.cfi_remember_state Save all current rules for all registers.
Definition MCDwarf.h:745
static MCCFIInstruction createLLVMRegisterPair(MCSymbol *L, unsigned Register, unsigned R1, unsigned R1SizeInBits, unsigned R2, unsigned R2SizeInBits, SMLoc Loc={})
.cfi_llvm_register_pair Previous value of Register is saved in R1:R2.
Definition MCDwarf.h:777
static MCCFIInstruction cfiDefCfaOffset(MCSymbol *L, int64_t Offset, SMLoc Loc={})
.cfi_def_cfa_offset modifies a rule for computing CFA.
Definition MCDwarf.h:643
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:756
static MCCFIInstruction createWindowSave(MCSymbol *L, SMLoc Loc={})
.cfi_window_save SPARC register window is saved.
Definition MCDwarf.h:691
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:651
static MCCFIInstruction createRestoreState(MCSymbol *L, SMLoc Loc={})
.cfi_restore_state Restore the previously saved state.
Definition MCDwarf.h:750
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:739
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:678
static MCCFIInstruction createLabel(MCSymbol *L, MCSymbol *CfiLabel, SMLoc Loc)
Definition MCDwarf.h:770
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:716
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:757
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:772
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:740
Instances of this class represent the line information for the dwarf line table entries.
Definition MCDwarf.h:190
LLVM_ABI void endCurrentSeqAndEmitLineStreamLabel(MCStreamer *MCOS, SMLoc DefLoc, StringRef Name)
Definition MCDwarf.cpp:288
const MCLineSection & getMCLineSections() const
Definition MCDwarf.h:451
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:580
MCFragment & getDummyFragment()
Definition MCSection.h:686
MCSymbol * getBeginSymbol()
Definition MCSection.h:653
Streaming machine code generation interface.
Definition MCStreamer.h:222
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.
virtual void emitCFILLVMVectorOffset(int64_t Register, int64_t RegisterSizeInBits, int64_t MaskRegister, int64_t MaskRegisterSizeInBits, int64_t Offset, SMLoc Loc={})
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 setDefaultWinCFIUnwindVersion(uint8_t V)
Set the default unwind version for new WinCFI frames.
void emitCFIStartProc(bool IsSimple, SMLoc Loc=SMLoc())
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
bool checkCVLocSection(unsigned FuncId, SMLoc Loc)
Returns true if the .cv_loc directive is in the right section.
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 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:299
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.
virtual void emitCFILLVMRegisterPair(int64_t Register, int64_t R1, int64_t R1SizeInBits, int64_t R2, int64_t R2SizeInBits, SMLoc Loc={})
virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo &STI, unsigned MaxBytesToEmit=0)
Emit nops until the byte alignment ByteAlignment is reached.
SmallVector< MCDwarfFrameInfo, 0 > DwarfFrameInfos
Definition MCStreamer.h:273
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:331
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:309
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:326
SMLoc getStartTokLoc() const
Definition MCStreamer.h:314
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:404
virtual void emitWinCFIBeginEpilogue(SMLoc Loc=SMLoc())
virtual void initSections(const MCSubtargetInfo &STI)
Create the default sections and set the initial one.
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.
virtual void emitBundleLock(bool AlignToEnd, const MCSubtargetInfo &STI)
The following instructions are a bundle-locked group.
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.
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:336
MCStreamer(MCContext &Ctx)
MCFragment * CurFrag
Definition MCStreamer.h:271
virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Definition MCStreamer.h:525
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 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 emitBundleUnlock(const MCSubtargetInfo &STI)
Ends a bundle-locked group.
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 emitWinCFIPush2Regs(MCRegister Reg1, MCRegister Reg2, SMLoc Loc=SMLoc())
virtual void emitULEB128Value(const MCExpr *Value)
ArrayRef< MCDwarfFrameInfo > getDwarfFrameInfos() const
virtual void emitPrefAlign(Align A, const MCSymbol &End, bool EmitNops, uint8_t Fill, const MCSubtargetInfo &STI)
virtual void emitCFILLVMVectorRegisterMask(int64_t Register, int64_t SpillRegister, int64_t SpillRegisterLaneSizeInBits, int64_t MaskRegister, int64_t MaskRegisterSizeInBits, SMLoc Loc={})
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:769
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:438
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 emitCFILLVMVectorRegisters(int64_t Register, ArrayRef< MCCFIInstruction::VectorRegisterWithLane > VRs, SMLoc Loc={})
virtual void emitVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Specify the Mach-O minimum deployment target version.
Definition MCStreamer.h:515
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:269
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 emitBundleAlignMode(Align Alignment)
Enable aligned instruction bundling with the given bundle size, from this point onward.
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:521
virtual void changeSection(MCSection *, uint32_t)
This is called by popSection and switchSection, if the current section changes.
virtual void emitCFINonHintPAuthFrame()
virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset, int64_t AddressSpace, SMLoc Loc={})
virtual void emitCFILLVMSetRAState(unsigned State, MCSymbol *PACSym, 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:213
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:95
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:97
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().
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
Target - Wrapper for Target specific information.
Triple - Helper class for working with autoconf configuration names.
Definition Triple.h:48
bool isMacOSX() const
Is this a Mac OS X triple.
Definition Triple.h:682
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:46
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
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
Definition Endian.h:267
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:1208
@ 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)
Swap the bytes of value to match the given endianness.
Definition Endian.h:45
detail::packed_endian_specific_integral< uint16_t, llvm::endianness::little, unaligned > ulittle16_t
Definition Endian.h:267
constexpr bool IsLittleEndianHost
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:577
@ Length
Definition DWP.cpp:577
LLVM_ABI void StoreIntToMemory(const APInt &IntVal, uint8_t *Dst, unsigned StoreBytes)
Fills the StoreBytes bytes of memory starting from Dst with the integer held in IntVal.
Definition APInt.cpp:3085
RelativeUniformCounterPtr Values
Definition InstrProf.h:91
@ 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:244
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
constexpr bool isUInt(uint64_t x)
Checks if an unsigned integer fits into the given bit width.
Definition MathExtras.h:190
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
Definition InstrProf.h:145
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:249
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:68
@ End
Run the machine verifier once, at the end of the pipeline.
Definition CodeGen.h:320
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:904
unsigned RememberStateDepth
Definition MCDwarf.h:908
unsigned PersonalityEncoding
Definition MCDwarf.h:909
std::vector< MCCFIInstruction > Instructions
Definition MCDwarf.h:906
const MCSymbol * Lsda
Definition MCDwarf.h:905
unsigned CurrentCfaRegister
Definition MCDwarf.h:907
static WinEH::Instruction SaveXMM(MCSymbol *L, unsigned Reg, unsigned Offset)
Definition MCWin64EH.h:45
static WinEH::Instruction PushNonVol(MCSymbol *L, unsigned Reg)
Definition MCWin64EH.h:26
static WinEH::Instruction PushMachFrame(MCSymbol *L, bool Code)
Definition MCWin64EH.h:36
static WinEH::Instruction SaveNonVol(MCSymbol *L, unsigned Reg, unsigned Offset)
Definition MCWin64EH.h:39
static WinEH::Instruction Alloc(MCSymbol *L, unsigned Size)
Definition MCWin64EH.h:32
static WinEH::Instruction SetFPReg(MCSymbol *L, unsigned Reg, unsigned Off)
Definition MCWin64EH.h:51
static WinEH::Instruction Push2(MCSymbol *L, unsigned Reg1, unsigned Reg2)
Definition MCWin64EH.h:29
std::vector< Instruction > Instructions
Definition MCWinEH.h:68
const MCSymbol * Function
Definition MCWinEH.h:51
MCSection * TextSection
Definition MCWinEH.h:55
FrameInfo * ChainedParent
Definition MCWinEH.h:67
const MCSymbol * PrologEnd
Definition MCWinEH.h:53
MapVector< MCSymbol *, Epilog > EpilogMap
Definition MCWinEH.h:77
const MCSymbol * FuncletOrFuncEnd
Definition MCWinEH.h:49
const MCSymbol * End
Definition MCWinEH.h:48
static constexpr uint8_t DefaultVersion
Definition MCWinEH.h:63
const MCSymbol * ExceptionHandler
Definition MCWinEH.h:50