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
183
185 unsigned Size) {
186 const MCAsmInfo &MAI = getContext().getAsmInfo();
189 if (Size > 4)
190 emitZeros(Size - 4);
191 return;
192 }
193
195}
196
197/// Emit NumBytes bytes worth of the value specified by FillValue.
198/// This implements directives such as '.space'.
199void MCStreamer::emitFill(uint64_t NumBytes, uint8_t FillValue) {
200 if (NumBytes)
201 emitFill(*MCConstantExpr::create(NumBytes, getContext()), FillValue);
202}
203
204void llvm::MCStreamer::emitNops(int64_t NumBytes, int64_t ControlledNopLen,
205 llvm::SMLoc, const MCSubtargetInfo& STI) {}
206
207/// The implementation in this class just redirects to emitFill.
208void MCStreamer::emitZeros(uint64_t NumBytes) { emitFill(NumBytes, 0); }
209
211 unsigned FileNo, StringRef Directory, StringRef Filename,
212 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
213 unsigned CUID) {
214 return getContext().getDwarfFile(Directory, Filename, FileNo, Checksum,
215 Source, CUID);
216}
217
220 std::optional<MD5::MD5Result> Checksum,
221 std::optional<StringRef> Source,
222 unsigned CUID) {
223 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
224 Source);
225}
226
228 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
229 if (!CurFrame)
230 return;
231 CurFrame->IsBKeyFrame = true;
232}
233
235 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
236 if (!CurFrame)
237 return;
238 CurFrame->IsMTETaggedFrame = true;
239}
240
242 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
243 if (!CurFrame)
244 return;
245 CurFrame->IsNonHintPAuthFrame = true;
246}
247
248void MCStreamer::emitDwarfLocDirective(unsigned FileNo, unsigned Line,
249 unsigned Column, unsigned Flags,
250 unsigned Isa, unsigned Discriminator,
251 StringRef FileName, StringRef Comment) {
252 getContext().setCurrentDwarfLoc(FileNo, Line, Column, Flags, Isa,
253 Discriminator);
254}
255
261
264 if (!Table.getLabel()) {
265 StringRef Prefix = Context.getAsmInfo().getInternalSymbolPrefix();
266 Table.setLabel(
267 Context.getOrCreateSymbol(Prefix + "line_table_start" + Twine(CUID)));
268 }
269 return Table.getLabel();
270}
271
273 return !FrameInfoStack.empty();
274}
275
276MCDwarfFrameInfo *MCStreamer::getCurrentDwarfFrameInfo() {
279 "this directive must appear between "
280 ".cfi_startproc and .cfi_endproc directives");
281 return nullptr;
282 }
283 return &DwarfFrameInfos[FrameInfoStack.back().first];
284}
285
287 ArrayRef<uint8_t> Checksum,
288 unsigned ChecksumKind) {
289 return getContext().getCVContext().addFile(*this, FileNo, Filename, Checksum,
290 ChecksumKind);
291}
292
296
298 unsigned IAFunc, unsigned IAFile,
299 unsigned IALine, unsigned IACol,
300 SMLoc Loc) {
301 if (getContext().getCVContext().getCVFunctionInfo(IAFunc) == nullptr) {
302 getContext().reportError(Loc, "parent function id not introduced by "
303 ".cv_func_id or .cv_inline_site_id");
304 return true;
305 }
306
308 FunctionId, IAFunc, IAFile, IALine, IACol);
309}
310
311void MCStreamer::emitCVLocDirective(unsigned FunctionId, unsigned FileNo,
312 unsigned Line, unsigned Column,
313 bool PrologueEnd, bool IsStmt,
314 StringRef FileName, SMLoc Loc) {}
315
318 MCCVFunctionInfo *FI = CVC.getCVFunctionInfo(FuncId);
319 if (!FI) {
321 Loc, "function id not introduced by .cv_func_id or .cv_inline_site_id");
322 return false;
323 }
324
325 // Track the section
326 if (FI->Section == nullptr)
328 else if (FI->Section != getCurrentSectionOnly()) {
330 Loc,
331 "all .cv_loc directives for a function must be in the same section");
332 return false;
333 }
334 return true;
335}
336
338 const MCSymbol *Begin,
339 const MCSymbol *End) {}
340
341void MCStreamer::emitCVInlineLinetableDirective(unsigned PrimaryFunctionId,
342 unsigned SourceFileId,
343 unsigned SourceLineNum,
344 const MCSymbol *FnStartSym,
345 const MCSymbol *FnEndSym) {}
346
347/// Only call this on endian-specific types like ulittle16_t and little32_t, or
348/// structs composed of them.
349template <typename T>
350static void copyBytesForDefRange(SmallString<20> &BytePrefix,
351 codeview::SymbolKind SymKind,
352 const T &DefRangeHeader) {
353 BytePrefix.resize(2 + sizeof(T));
354 codeview::ulittle16_t SymKindLE = codeview::ulittle16_t(SymKind);
355 memcpy(&BytePrefix[0], &SymKindLE, 2);
356 memcpy(&BytePrefix[2], &DefRangeHeader, sizeof(T));
357}
358
360 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
361 StringRef FixedSizePortion) {}
362
364 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
366 SmallString<20> BytePrefix;
367 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL, DRHdr);
368 emitCVDefRangeDirective(Ranges, BytePrefix);
369}
370
372 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
374 SmallString<20> BytePrefix;
375 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_SUBFIELD_REGISTER,
376 DRHdr);
377 emitCVDefRangeDirective(Ranges, BytePrefix);
378}
379
381 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
383 SmallString<20> BytePrefix;
384 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER, DRHdr);
385 emitCVDefRangeDirective(Ranges, BytePrefix);
386}
387
389 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
391 SmallString<20> BytePrefix;
392 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_FRAMEPOINTER_REL,
393 DRHdr);
394 emitCVDefRangeDirective(Ranges, BytePrefix);
395}
396
398 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
400 SmallString<20> BytePrefix;
401 copyBytesForDefRange(BytePrefix, codeview::S_DEFRANGE_REGISTER_REL_INDIR,
402 DRHdr);
403 emitCVDefRangeDirective(Ranges, BytePrefix);
404}
405
407 MCSymbol *EHSymbol) {
408}
409
411 switchSectionNoPrint(getContext().getObjectFileInfo()->getTextSection());
412}
413
415 Symbol->redefineIfPossible();
416
417 if (!Symbol->isUndefined() || Symbol->isVariable())
418 return getContext().reportError(Loc, "symbol '" + Twine(Symbol->getName()) +
419 "' is already defined");
420
421 assert(!Symbol->isVariable() && "Cannot emit a variable symbol!");
422 assert(getCurrentSectionOnly() && "Cannot emit before setting section!");
423 assert(!Symbol->getFragment() && "Unexpected fragment on symbol data!");
424 assert(Symbol->isUndefined() && "Cannot define a symbol twice!");
425
426 Symbol->setFragment(&getCurrentSectionOnly()->getDummyFragment());
427
428 if (LFIRewriter)
429 LFIRewriter->onLabel(Symbol, *this);
430
432 if (TS)
433 TS->emitLabel(Symbol);
434}
435
438
439void MCStreamer::emitCFISections(bool EH, bool Debug, bool SFrame) {}
440
442 if (!FrameInfoStack.empty() &&
443 getCurrentSectionOnly() == FrameInfoStack.back().second)
444 return getContext().reportError(
445 Loc, "starting new .cfi frame before finishing the previous one");
446
447 MCDwarfFrameInfo Frame;
448 Frame.IsSimple = IsSimple;
450
451 const MCAsmInfo &MAI = Context.getAsmInfo();
452 for (const MCCFIInstruction &Inst : MAI.getInitialFrameState()) {
453 if (Inst.getOperation() == MCCFIInstruction::OpDefCfa ||
454 Inst.getOperation() == MCCFIInstruction::OpDefCfaRegister ||
455 Inst.getOperation() == MCCFIInstruction::OpLLVMDefAspaceCfa) {
456 Frame.CurrentCfaRegister = Inst.getRegister();
457 }
458 }
459
460 FrameInfoStack.emplace_back(DwarfFrameInfos.size(), getCurrentSectionOnly());
461 DwarfFrameInfos.push_back(std::move(Frame));
462}
463
466
468 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
469 if (!CurFrame)
470 return;
471 emitCFIEndProcImpl(*CurFrame);
472 FrameInfoStack.pop_back();
473}
474
476 // Put a dummy non-null value in Frame.End to mark that this frame has been
477 // closed.
478 Frame.End = (MCSymbol *)1;
479}
480
482 // Create a label and insert it into the line table and return this label
483 const MCDwarfLoc &DwarfLoc = getContext().getCurrentDwarfLoc();
484
485 MCSymbol *LineStreamLabel = getContext().createTempSymbol();
486 MCDwarfLineEntry LabelLineEntry(nullptr, DwarfLoc, LineStreamLabel);
487 getContext()
488 .getMCDwarfLineTable(getContext().getDwarfCompileUnitID())
490 .addLineEntry(LabelLineEntry, getCurrentSectionOnly() /*Section*/);
491
492 return LineStreamLabel;
493}
494
496 // Return a dummy non-null value so that label fields appear filled in when
497 // generating textual assembly.
498 return (MCSymbol *)1;
499}
500
502 MCSymbol *Label = emitCFILabel();
505 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
506 if (!CurFrame)
507 return;
508 CurFrame->Instructions.push_back(std::move(Instruction));
509 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
510}
511
513 MCSymbol *Label = emitCFILabel();
516 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
517 if (!CurFrame)
518 return;
519 CurFrame->Instructions.push_back(std::move(Instruction));
520}
521
523 MCSymbol *Label = emitCFILabel();
526 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
527 if (!CurFrame)
528 return;
529 CurFrame->Instructions.push_back(std::move(Instruction));
530}
531
533 MCSymbol *Label = emitCFILabel();
536 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
537 if (!CurFrame)
538 return;
539 CurFrame->Instructions.push_back(std::move(Instruction));
540 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
541}
542
544 int64_t AddressSpace, SMLoc Loc) {
545 MCSymbol *Label = emitCFILabel();
547 Label, Register, Offset, AddressSpace, Loc);
548 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
549 if (!CurFrame)
550 return;
551 CurFrame->Instructions.push_back(std::move(Instruction));
552 CurFrame->CurrentCfaRegister = static_cast<unsigned>(Register);
553}
554
556 MCSymbol *Label = emitCFILabel();
559 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
560 if (!CurFrame)
561 return;
562 CurFrame->Instructions.push_back(std::move(Instruction));
563}
564
566 MCSymbol *Label = emitCFILabel();
569 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
570 if (!CurFrame)
571 return;
572 CurFrame->Instructions.push_back(std::move(Instruction));
573}
574
576 unsigned Encoding) {
577 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
578 if (!CurFrame)
579 return;
580 CurFrame->Personality = Sym;
581 CurFrame->PersonalityEncoding = Encoding;
582}
583
584void MCStreamer::emitCFILsda(const MCSymbol *Sym, unsigned Encoding) {
585 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
586 if (!CurFrame)
587 return;
588 CurFrame->Lsda = Sym;
589 CurFrame->LsdaEncoding = Encoding;
590}
591
593 MCSymbol *Label = emitCFILabel();
596 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
597 if (!CurFrame)
598 return;
599 ++CurFrame->RememberStateDepth;
600 CurFrame->Instructions.push_back(std::move(Instruction));
601}
602
604 MCSymbol *Label = emitCFILabel();
607 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
608 if (!CurFrame)
609 return;
610 if (!CurFrame->RememberStateDepth) {
611 getContext().reportError(Loc, "no matching .cfi_remember_state");
612 return;
613 }
614 --CurFrame->RememberStateDepth;
615 CurFrame->Instructions.push_back(std::move(Instruction));
616}
617
619 MCSymbol *Label = emitCFILabel();
622 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
623 if (!CurFrame)
624 return;
625 CurFrame->Instructions.push_back(std::move(Instruction));
626}
627
629 MCSymbol *Label = emitCFILabel();
632 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
633 if (!CurFrame)
634 return;
635 CurFrame->Instructions.push_back(std::move(Instruction));
636}
637
639 MCSymbol *Label = emitCFILabel();
642 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
643 if (!CurFrame)
644 return;
645 CurFrame->Instructions.push_back(std::move(Instruction));
646}
647
649 MCSymbol *Label = emitCFILabel();
652 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
653 if (!CurFrame)
654 return;
655 CurFrame->Instructions.push_back(std::move(Instruction));
656}
657
659 int64_t R1Size, int64_t R2,
660 int64_t R2Size, SMLoc Loc) {
661 MCSymbol *Label = emitCFILabel();
663 Label, Register, R1, R1Size, R2, R2Size, Loc);
664 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
665 if (!CurFrame)
666 return;
667 CurFrame->Instructions.push_back(std::move(Instruction));
668}
669
672 SMLoc Loc) {
673 MCSymbol *Label = emitCFILabel();
676 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
677 if (!CurFrame)
678 return;
679 CurFrame->Instructions.push_back(std::move(Instruction));
680}
681
683 int64_t RegisterSizeInBits,
684 int64_t MaskRegister,
685 int64_t MaskRegisterSizeInBits,
686 int64_t Offset, SMLoc Loc) {
687 MCSymbol *Label = emitCFILabel();
689 Label, Register, RegisterSizeInBits, MaskRegister, MaskRegisterSizeInBits,
690 Offset, Loc);
691 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
692 if (!CurFrame)
693 return;
694 CurFrame->Instructions.push_back(std::move(Instruction));
695}
696
698 int64_t Register, int64_t SpillRegister,
699 int64_t SpillRegisterLaneSizeInBits, int64_t MaskRegister,
700 int64_t MaskRegisterSizeInBits, SMLoc Loc) {
701
702 MCSymbol *Label = emitCFILabel();
704 Label, Register, SpillRegister, SpillRegisterLaneSizeInBits, MaskRegister,
705 MaskRegisterSizeInBits, Loc);
706 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
707 if (!CurFrame)
708 return;
709 CurFrame->Instructions.push_back(std::move(Instruction));
710}
711
713 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
714 if (!CurFrame)
715 return;
716 CurFrame->IsSignalFrame = true;
717}
718
720 MCSymbol *Label = emitCFILabel();
723 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
724 if (!CurFrame)
725 return;
726 CurFrame->Instructions.push_back(std::move(Instruction));
727}
728
729void MCStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
730 SMLoc Loc) {
731 MCSymbol *Label = emitCFILabel();
733 MCCFIInstruction::createRegister(Label, Register1, Register2, Loc);
734 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
735 if (!CurFrame)
736 return;
737 CurFrame->Instructions.push_back(std::move(Instruction));
738}
739
741 MCSymbol *Label = emitCFILabel();
743 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
744 if (!CurFrame)
745 return;
746 CurFrame->Instructions.push_back(std::move(Instruction));
747}
748
750 MCSymbol *Label = emitCFILabel();
753 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
754 if (!CurFrame)
755 return;
756 CurFrame->Instructions.push_back(std::move(Instruction));
757}
758
760 MCSymbol *Label = emitCFILabel();
763 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
764 if (!CurFrame)
765 return;
766 CurFrame->Instructions.push_back(std::move(Instruction));
767}
768
769void MCStreamer::emitCFILLVMSetRAState(unsigned State, MCSymbol *PACSym,
770 SMLoc Loc) {
771 MCSymbol *Label = emitCFILabel();
773 MCCFIInstruction::createSetRAState(Label, State, PACSym, Loc);
774 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
775 if (!CurFrame)
776 return;
777 CurFrame->Instructions.push_back(std::move(Instruction));
778}
779
780void MCStreamer::emitCFILLVMSetRAState(unsigned State, int64_t Offset,
781 SMLoc Loc) {
782 MCSymbol *Label = emitCFILabel();
785 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
786 if (!CurFrame)
787 return;
788 CurFrame->Instructions.push_back(std::move(Instruction));
789}
790
792 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
793 if (!CurFrame)
794 return;
795 CurFrame->RAReg = Register;
796}
797
799 MCSymbol *Label = emitCFILabel();
801 if (MCDwarfFrameInfo *F = getCurrentDwarfFrameInfo())
802 F->Instructions.push_back(MCCFIInstruction::createLabel(Label, Sym, Loc));
803}
804
806 MCSymbol *Label = emitCFILabel();
809 MCDwarfFrameInfo *CurFrame = getCurrentDwarfFrameInfo();
810 if (!CurFrame)
811 return;
812 CurFrame->Instructions.push_back(std::move(Instruction));
813}
814
816 const MCAsmInfo &MAI = Context.getAsmInfo();
817 if (!MAI.usesWindowsCFI()) {
819 Loc, ".seh_* directives are not supported on this target");
820 return nullptr;
821 }
822 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
824 Loc, ".seh_ directive must appear within an active frame");
825 return nullptr;
826 }
827 return CurrentWinFrameInfo;
828}
829
831 const MCAsmInfo &MAI = Context.getAsmInfo();
832 if (!MAI.usesWindowsCFI())
833 return getContext().reportError(
834 Loc, ".seh_* directives are not supported on this target");
835 if (CurrentWinFrameInfo && !CurrentWinFrameInfo->End)
837 Loc, "Starting a function before ending the previous one!");
838
839 MCSymbol *StartProc = emitCFILabel();
840
841 CurrentProcWinFrameInfoStartIndex = WinFrameInfos.size();
842 WinFrameInfos.emplace_back(
843 std::make_unique<WinEH::FrameInfo>(Symbol, StartProc));
844 CurrentWinFrameInfo = WinFrameInfos.back().get();
845 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
846 CurrentWinFrameInfo->FunctionLoc = Loc;
847 // Inherit the module-wide default unwind version.
848 CurrentWinFrameInfo->Version = DefaultWinCFIUnwindVersion;
849}
850
853 if (!CurFrame)
854 return;
855 CurrentWinFrameInfo = nullptr;
856
857 MCSymbol *Label = emitCFILabel();
858 CurFrame->End = Label;
859 const MCSymbol **FuncletOrFuncEndPtr =
860 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
861 : &CurFrame->FuncletOrFuncEnd;
862 if (!*FuncletOrFuncEndPtr)
863 *FuncletOrFuncEndPtr = CurFrame->End;
864
865 if (CurrentWinEpilog) {
866 // Set End to... something... to prevent crashes later.
868 CurrentWinEpilog = nullptr;
869 getContext().reportError(Loc, "Missing .seh_endepilogue in " +
870 CurFrame->Function->getName());
871 }
872
873 for (size_t I = CurrentProcWinFrameInfoStartIndex, E = WinFrameInfos.size();
874 I != E; ++I)
875 emitWindowsUnwindTables(WinFrameInfos[I].get());
876 switchSection(CurFrame->TextSection);
877}
878
881 if (!CurFrame)
882 return;
883
884 MCSymbol *Label = emitCFILabel();
885 const MCSymbol **FuncletOrFuncEndPtr =
886 CurFrame->ChainedParent ? &CurFrame->ChainedParent->FuncletOrFuncEnd
887 : &CurFrame->FuncletOrFuncEnd;
888 *FuncletOrFuncEndPtr = Label;
889}
890
893 if (!CurFrame)
894 return;
895
896 if (!CurFrame->PrologEnd)
897 return getContext().reportError(
898 Loc, "can't split into a new chained region (.seh_splitchained) in the "
899 "middle of a prolog in " +
900 CurFrame->Function->getName());
901
902 MCSymbol *Label = emitCFILabel();
903
904 // Complete the current frame before starting a new, chained one.
905 CurFrame->End = Label;
906
907 // All chained frames point to the same parent.
908 WinEH::FrameInfo *ChainedParent =
909 CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
910
911 WinFrameInfos.emplace_back(std::make_unique<WinEH::FrameInfo>(
912 CurFrame->Function, Label, ChainedParent));
913 CurrentWinFrameInfo = WinFrameInfos.back().get();
914 CurrentWinFrameInfo->TextSection = getCurrentSectionOnly();
915}
916
917void MCStreamer::emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except,
918 SMLoc Loc) {
920 if (!CurFrame)
921 return;
922
923 // Handlers are always associated with the parent frame.
924 CurFrame = CurFrame->ChainedParent ? CurFrame->ChainedParent : CurFrame;
925
926 CurFrame->ExceptionHandler = Sym;
927 if (!Except && !Unwind)
928 getContext().reportError(Loc, "Don't know what kind of handler this is!");
929 if (Unwind)
930 CurFrame->HandlesUnwind = true;
931 if (Except)
932 CurFrame->HandlesExceptions = true;
933}
934
937 if (!CurFrame)
938 return;
939}
940
942 const MCSymbolRefExpr *To, uint64_t Count) {
943}
944
945static MCSection *getWinCFISection(MCContext &Context, unsigned *NextWinCFIID,
946 MCSection *MainCFISec,
947 const MCSection *TextSec) {
948 // If this is the main .text section, use the main unwind info section.
949 if (TextSec == Context.getObjectFileInfo()->getTextSection())
950 return MainCFISec;
951
952 const auto *TextSecCOFF = static_cast<const MCSectionCOFF *>(TextSec);
953 auto *MainCFISecCOFF = static_cast<MCSectionCOFF *>(MainCFISec);
954 unsigned UniqueID = TextSecCOFF->getOrAssignWinCFISectionID(NextWinCFIID);
955
956 // If this section is COMDAT, this unwind section should be COMDAT associative
957 // with its group.
958 const MCSymbol *KeySym = nullptr;
959 if (TextSecCOFF->getCharacteristics() & COFF::IMAGE_SCN_LNK_COMDAT) {
960 KeySym = TextSecCOFF->getCOMDATSymbol();
961
962 // In a GNU environment, we can't use associative comdats. Instead, do what
963 // GCC does, which is to make plain comdat selectany section named like
964 // ".[px]data$_Z3foov".
965 if (!Context.getAsmInfo().hasCOFFAssociativeComdats()) {
966 std::string SectionName = (MainCFISecCOFF->getName() + "$" +
967 TextSecCOFF->getName().split('$').second)
968 .str();
969 return Context.getCOFFSection(SectionName,
970 MainCFISecCOFF->getCharacteristics() |
973 }
974 }
975
976 return Context.getAssociativeCOFFSection(MainCFISecCOFF, KeySym, UniqueID);
977}
978
980 return getWinCFISection(getContext(), &NextWinCFIID,
981 getContext().getObjectFileInfo()->getPDataSection(),
982 TextSec);
983}
984
986 return getWinCFISection(getContext(), &NextWinCFIID,
987 getContext().getObjectFileInfo()->getXDataSection(),
988 TextSec);
989}
990
992
993static unsigned encodeSEHRegNum(MCContext &Ctx, MCRegister Reg) {
994 return Ctx.getRegisterInfo()->getSEHRegNum(Reg);
995}
996
997// Unwind formats before v3 store the register operand of an unwind code in a
998// 4-bit field, so extended registers (r16-r31 / xmm16-xmm31, i.e. SEH register
999// numbers greater than 15) cannot be represented. Report an error rather than
1000// silently truncating the register number to a different register. Returns true
1001// if an error was reported.
1003 const WinEH::Instruction &Inst,
1004 uint8_t Version, SMLoc Loc,
1007 Ctx.reportError(Loc, Directive +
1008 " with an extended register requires unwind v3");
1009 return true;
1010 }
1011 return false;
1012}
1013
1016 if (!CurFrame)
1017 return;
1018
1019 MCSymbol *Label = emitCFILabel();
1020
1022 Label, encodeSEHRegNum(Context, Register));
1023 if (CurrentWinEpilog) {
1024 if (CurFrame->Version < 3)
1025 return getContext().reportError(
1026 Loc, ".seh_pushreg inside epilog requires unwind v3");
1027 CurrentWinEpilog->Instructions.push_back(Inst);
1028 } else {
1029 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1030 ".seh_pushreg"))
1031 return;
1032 CurFrame->Instructions.push_back(Inst);
1033 }
1034}
1035
1037 SMLoc Loc) {
1039 if (!CurFrame)
1040 return;
1041
1042 // UOP_Push2 is V3-only - reject for V1/V2.
1043 if (CurFrame->Version < 3)
1044 return getContext().reportError(
1045 Loc, ".seh_push2regs is only supported for unwind v3");
1046
1047 MCSymbol *Label = emitCFILabel();
1048
1050 Label, encodeSEHRegNum(Context, Reg1), encodeSEHRegNum(Context, Reg2));
1051 if (CurrentWinEpilog)
1052 CurrentWinEpilog->Instructions.push_back(Inst);
1053 else
1054 CurFrame->Instructions.push_back(Inst);
1055}
1056
1058 SMLoc Loc) {
1060 if (!CurFrame)
1061 return;
1062 if (!CurrentWinEpilog && CurFrame->LastFrameInst >= 0)
1063 return getContext().reportError(
1064 Loc, "frame register and offset can be set at most once");
1065 if (Offset & 0x0F)
1066 return getContext().reportError(Loc, "offset is not a multiple of 16");
1067 if (Offset > 240)
1068 return getContext().reportError(
1069 Loc, "frame offset must be less than or equal to 240");
1070
1071 MCSymbol *Label = emitCFILabel();
1072
1075 if (CurrentWinEpilog) {
1076 if (CurFrame->Version < 3)
1077 return getContext().reportError(
1078 Loc, ".seh_setframe inside epilog requires unwind v3");
1079 CurrentWinEpilog->Instructions.push_back(Inst);
1080 } else {
1081 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1082 ".seh_setframe"))
1083 return;
1084 CurFrame->LastFrameInst = CurFrame->Instructions.size();
1085 CurFrame->Instructions.push_back(Inst);
1086 }
1087}
1088
1091 if (!CurFrame)
1092 return;
1093 if (Size == 0)
1094 return getContext().reportError(Loc,
1095 "stack allocation size must be non-zero");
1096 if (Size & 7)
1097 return getContext().reportError(
1098 Loc, "stack allocation size is not a multiple of 8");
1099
1100 MCSymbol *Label = emitCFILabel();
1101
1103 if (CurrentWinEpilog) {
1104 if (CurFrame->Version < 3)
1105 return getContext().reportError(
1106 Loc, ".seh_stackalloc inside epilog requires unwind v3");
1107 CurrentWinEpilog->Instructions.push_back(Inst);
1108 } else {
1109 CurFrame->Instructions.push_back(Inst);
1110 }
1111}
1112
1114 SMLoc Loc) {
1116 if (!CurFrame)
1117 return;
1118
1119 if (Offset & 7)
1120 return getContext().reportError(
1121 Loc, "register save offset is not 8 byte aligned");
1122
1123 MCSymbol *Label = emitCFILabel();
1124
1126 Label, encodeSEHRegNum(Context, Register), Offset);
1127 if (CurrentWinEpilog) {
1128 if (CurFrame->Version < 3)
1129 return getContext().reportError(
1130 Loc, ".seh_savereg inside epilog requires unwind v3");
1131 CurrentWinEpilog->Instructions.push_back(Inst);
1132 } else {
1133 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1134 ".seh_savereg"))
1135 return;
1136 CurFrame->Instructions.push_back(Inst);
1137 }
1138}
1139
1141 SMLoc Loc) {
1143 if (!CurFrame)
1144 return;
1145 if (Offset & 0x0F)
1146 return getContext().reportError(Loc, "offset is not a multiple of 16");
1147
1148 MCSymbol *Label = emitCFILabel();
1149
1151 Label, encodeSEHRegNum(Context, Register), Offset);
1152 if (CurrentWinEpilog) {
1153 if (CurFrame->Version < 3)
1154 return getContext().reportError(
1155 Loc, ".seh_savexmm inside epilog requires unwind v3");
1156 CurrentWinEpilog->Instructions.push_back(Inst);
1157 } else {
1158 if (checkUnwindV3ExtendedReg(getContext(), Inst, CurFrame->Version, Loc,
1159 ".seh_savexmm"))
1160 return;
1161 CurFrame->Instructions.push_back(Inst);
1162 }
1163}
1164
1167 if (!CurFrame)
1168 return;
1169 if (CurrentWinEpilog) {
1170 if (CurFrame->Version < 3)
1171 return getContext().reportError(
1172 Loc, ".seh_pushframe inside epilog requires unwind v3");
1173 MCSymbol *Label = emitCFILabel();
1175 CurrentWinEpilog->Instructions.push_back(Inst);
1176 return;
1177 }
1178 if (!CurFrame->Instructions.empty())
1179 return getContext().reportError(
1180 Loc, "If present, PushMachFrame must be the first UOP");
1181
1182 MCSymbol *Label = emitCFILabel();
1183
1185 CurFrame->Instructions.push_back(Inst);
1186}
1187
1190 if (!CurFrame)
1191 return;
1192
1193 MCSymbol *Label = emitCFILabel();
1194
1195 CurFrame->PrologEnd = Label;
1196}
1197
1200 if (!CurFrame)
1201 return;
1202
1203 MCSymbol *Label = emitCFILabel();
1204
1205 if (!CurFrame->PrologEnd) {
1206 CurFrame->PrologEnd = Label;
1208 Loc, "starting epilogue (.seh_startepilogue) before prologue has ended "
1209 "(.seh_endprologue) in " +
1210 CurFrame->Function->getName());
1211 }
1213 &CurFrame->EpilogMap.insert_or_assign(Label, WinEH::FrameInfo::Epilog())
1214 .first->second;
1215 CurrentWinEpilog->Start = Label;
1216 CurrentWinEpilog->Loc = Loc;
1217}
1218
1221 if (!CurFrame)
1222 return;
1223
1224 if (!CurrentWinEpilog)
1225 return getContext().reportError(Loc, "Stray .seh_endepilogue in " +
1226 CurFrame->Function->getName());
1227
1228 if ((CurFrame->Version == 2) && !CurrentWinEpilog->UnwindV2Start) {
1229 // Set UnwindV2Start to... something... to prevent crashes later.
1230 CurrentWinEpilog->UnwindV2Start = CurrentWinEpilog->Start;
1231 getContext().reportError(Loc, "Missing .seh_unwindv2start in " +
1232 CurFrame->Function->getName());
1233 }
1234
1236 CurrentWinEpilog = nullptr;
1237}
1238
1241 if (!CurFrame)
1242 return;
1243
1244 if (!CurrentWinEpilog)
1245 return getContext().reportError(Loc, "Stray .seh_unwindv2start in " +
1246 CurFrame->Function->getName());
1247
1248 if (CurrentWinEpilog->UnwindV2Start)
1249 return getContext().reportError(Loc, "Duplicate .seh_unwindv2start in " +
1250 CurFrame->Function->getName());
1251
1252 MCSymbol *Label = emitCFILabel();
1253 CurrentWinEpilog->UnwindV2Start = Label;
1254}
1255
1257 bool SupportedVersion = (Version >= 1 && Version <= 3);
1258
1259 // If called outside a proc, set the module-level default.
1260 if (!CurrentWinFrameInfo || CurrentWinFrameInfo->End) {
1261 if (!SupportedVersion)
1262 return getContext().reportError(
1263 Loc, "Unsupported version for .seh_unwindversion");
1265 return;
1266 }
1267
1268 // Per-function override (existing behaviour).
1269 WinEH::FrameInfo *CurFrame = CurrentWinFrameInfo;
1270
1271 if (CurFrame->Version != DefaultWinCFIUnwindVersion &&
1273 return getContext().reportError(Loc, "Duplicate .seh_unwindversion in " +
1274 CurFrame->Function->getName());
1275
1276 if (!SupportedVersion)
1277 return getContext().reportError(
1278 Loc, "Unsupported version specified in .seh_unwindversion in " +
1279 CurFrame->Function->getName());
1280
1281 CurFrame->Version = Version;
1282}
1283
1285
1287
1289
1290void MCStreamer::emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset) {}
1291
1292void MCStreamer::emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset) {}
1293
1295
1297
1298/// EmitRawText - If this file is backed by an assembly streamer, this dumps
1299/// the specified string in the output .s file. This capability is
1300/// indicated by the hasRawTextSupport() predicate.
1302 // This is not llvm_unreachable for the sake of out of tree backend
1303 // developers who may not have assembly streamers and should serve as a
1304 // reminder to not accidentally call EmitRawText in the absence of such.
1305 report_fatal_error("EmitRawText called on an MCStreamer that doesn't support "
1306 "it (target backend is likely missing an AsmStreamer "
1307 "implementation)");
1308}
1309
1311 SmallString<128> Str;
1312 emitRawTextImpl(T.toStringRef(Str));
1313}
1314
1316
1318
1321 (!WinFrameInfos.empty() && !WinFrameInfos.back()->End)) {
1322 getContext().reportError(EndLoc, "Unfinished frame!");
1323 return;
1324 }
1325
1326 if (LFIRewriter)
1327 LFIRewriter->finish(*this);
1328
1330 if (TS)
1331 TS->finish();
1332
1333 finishImpl();
1334}
1335
1337 if (Context.getDwarfFormat() != dwarf::DWARF64)
1338 return;
1339 AddComment("DWARF64 Mark");
1341}
1342
1343void MCStreamer::emitDwarfUnitLength(uint64_t Length, const Twine &Comment) {
1344 assert(Context.getDwarfFormat() == dwarf::DWARF64 ||
1347 AddComment(Comment);
1348 emitIntValue(Length, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1349}
1350
1352 const Twine &Comment) {
1354 AddComment(Comment);
1355 MCSymbol *Lo = Context.createTempSymbol(Prefix + "_start");
1356 MCSymbol *Hi = Context.createTempSymbol(Prefix + "_end");
1357
1359 Hi, Lo, dwarf::getDwarfOffsetByteSize(Context.getDwarfFormat()));
1360 // emit the begin symbol after we generate the length field.
1361 emitLabel(Lo);
1362 // Return the Hi symbol to the caller.
1363 return Hi;
1364}
1365
1367 // Set the value of the symbol, as we are at the start of the line table.
1368 emitLabel(StartSym);
1369}
1370
1373 Symbol->setVariableValue(Value);
1374
1376 if (TS)
1377 TS->emitAssignment(Symbol, Value);
1378}
1379
1381 uint64_t Address, const MCInst &Inst,
1382 const MCSubtargetInfo &STI,
1383 raw_ostream &OS) {
1384 InstPrinter.printInst(&Inst, Address, "", STI, OS);
1385}
1386
1388}
1389
1391 switch (Expr.getKind()) {
1392 case MCExpr::Target:
1393 cast<MCTargetExpr>(Expr).visitUsedExpr(*this);
1394 break;
1395
1396 case MCExpr::Constant:
1397 break;
1398
1399 case MCExpr::Binary: {
1400 const MCBinaryExpr &BE = cast<MCBinaryExpr>(Expr);
1401 visitUsedExpr(*BE.getLHS());
1402 visitUsedExpr(*BE.getRHS());
1403 break;
1404 }
1405
1406 case MCExpr::SymbolRef:
1407 visitUsedSymbol(cast<MCSymbolRefExpr>(Expr).getSymbol());
1408 break;
1409
1410 case MCExpr::Unary:
1411 visitUsedExpr(*cast<MCUnaryExpr>(Expr).getSubExpr());
1412 break;
1413
1414 case MCExpr::Specifier:
1415 visitUsedExpr(*cast<MCSpecifierExpr>(Expr).getSubExpr());
1416 break;
1417 }
1418}
1419
1421 // Scan for values.
1422 for (unsigned i = Inst.getNumOperands(); i--;)
1423 if (Inst.getOperand(i).isExpr())
1424 visitUsedExpr(*Inst.getOperand(i).getExpr());
1425}
1426
1427void MCStreamer::emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type,
1428 uint64_t Attr, uint64_t Discriminator,
1429 const MCPseudoProbeInlineStack &InlineStack,
1430 MCSymbol *FnSym) {
1431 auto &Context = getContext();
1432
1433 // Create a symbol at in the current section for use in the probe.
1434 MCSymbol *ProbeSym = Context.createTempSymbol();
1435
1436 // Set the value of the symbol to use for the MCPseudoProbe.
1437 emitLabel(ProbeSym);
1438
1439 // Create a (local) probe entry with the symbol.
1440 MCPseudoProbe Probe(ProbeSym, Guid, Index, Type, Attr, Discriminator);
1441
1442 // Add the probe entry to this section's entries.
1443 Context.getMCPseudoProbeTable().getProbeSections().addPseudoProbe(
1444 FnSym, Probe, InlineStack);
1445}
1446
1448 unsigned Size) {
1449 // Get the Hi-Lo expression.
1450 const MCExpr *Diff =
1452 MCSymbolRefExpr::create(Lo, Context), Context);
1453
1454 const MCAsmInfo &MAI = Context.getAsmInfo();
1455 if (!MAI.doesSetDirectiveSuppressReloc()) {
1456 emitValue(Diff, Size);
1457 return;
1458 }
1459
1460 // Otherwise, emit with .set (aka assignment).
1461 MCSymbol *SetLabel = Context.createTempSymbol("set");
1462 emitAssignment(SetLabel, Diff);
1463 emitSymbolValue(SetLabel, Size);
1464}
1465
1467 const MCSymbol *Lo) {
1468 // Get the Hi-Lo expression.
1469 const MCExpr *Diff =
1471 MCSymbolRefExpr::create(Lo, Context), Context);
1472
1473 emitULEB128Value(Diff);
1474}
1475
1478 "emitSubsectionsViaSymbols only supported on Mach-O targets");
1479}
1480void MCStreamer::emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue) {}
1482 llvm_unreachable("this directive only supported on COFF targets");
1483}
1485 llvm_unreachable("this directive only supported on COFF targets");
1486}
1489 StringRef CompilerVersion,
1490 StringRef TimeStamp, StringRef Description) {
1491}
1493 llvm_unreachable("this directive only supported on COFF targets");
1494}
1496 llvm_unreachable("this directive only supported on COFF targets");
1497}
1499 MCSymbol *CsectSym,
1500 Align Alignment) {
1501 llvm_unreachable("this directive only supported on XCOFF targets");
1502}
1503
1505 MCSymbolAttr Linkage,
1506 MCSymbolAttr Visibility) {
1507 llvm_unreachable("emitXCOFFSymbolLinkageWithVisibility is only supported on "
1508 "XCOFF targets");
1509}
1510
1513
1515 llvm_unreachable("emitXCOFFRefDirective is only supported on XCOFF targets");
1516}
1517
1519 const MCSymbol *Trap,
1520 unsigned Lang, unsigned Reason,
1521 unsigned FunctionSize,
1522 bool hasDebug) {
1523 report_fatal_error("emitXCOFFExceptDirective is only supported on "
1524 "XCOFF targets");
1525}
1526
1528 llvm_unreachable("emitXCOFFCInfoSym is only supported on"
1529 "XCOFF targets");
1530}
1531
1534 StringRef Name, bool KeepOriginalSym) {}
1536 Align ByteAlignment) {}
1540 uint64_t Size, Align ByteAlignment) {}
1541
1543 CurFrag = &Sec->getDummyFragment();
1544 auto *Sym = Sec->getBeginSymbol();
1545 if (!Sym || !Sym->isUndefined())
1546 return;
1547 // In Mach-O, DWARF sections use Begin as a temporary label, requiring a label
1548 // definition, unlike section symbols in other file formats.
1549 if (getContext().getObjectFileType() == MCContext::IsMachO)
1550 emitLabel(Sym);
1551 else
1552 Sym->setFragment(CurFrag);
1553}
1554
1560}
1563void MCStreamer::emitFill(const MCExpr &NumBytes, uint64_t Value, SMLoc Loc) {}
1564void MCStreamer::emitFill(const MCExpr &NumValues, int64_t Size, int64_t Expr,
1565 SMLoc Loc) {}
1567void MCStreamer::emitPrefAlign(Align A, const MCSymbol &End, bool EmitNops,
1568 uint8_t Fill, const MCSubtargetInfo &STI) {}
1570 unsigned MaxBytesToEmit) {}
1572 SMLoc Loc) {}
1575 S.getStartTokLoc(),
1576 "aligned bundling is not supported by this object file format");
1577}
1588
1590 if (SectionStack.size() <= 1)
1591 return false;
1592 auto I = SectionStack.end();
1593 --I;
1594 MCSectionSubPair OldSec = I->first;
1595 --I;
1596 MCSectionSubPair NewSec = I->first;
1597
1598 if (NewSec.first && OldSec != NewSec)
1599 changeSection(NewSec.first, NewSec.second);
1600 SectionStack.pop_back();
1601 return true;
1602}
1603
1605 assert(Section && "Cannot switch to a null section!");
1606 MCSectionSubPair curSection = SectionStack.back().first;
1607 SectionStack.back().second = curSection;
1608 if (MCSectionSubPair(Section, Subsection) != curSection) {
1609 changeSection(Section, Subsection);
1610 SectionStack.back().first = MCSectionSubPair(Section, Subsection);
1611 assert(!Section->hasEnded() && "Section already ended");
1612 }
1613}
1614
1615bool MCStreamer::switchSection(MCSection *Section, const MCExpr *SubsecExpr) {
1616 int64_t Subsec = 0;
1617 if (SubsecExpr) {
1618 if (!SubsecExpr->evaluateAsAbsolute(Subsec, getAssemblerPtr())) {
1619 getContext().reportError(SubsecExpr->getLoc(),
1620 "cannot evaluate subsection number");
1621 return true;
1622 }
1623 if (!isUInt<31>(Subsec)) {
1624 getContext().reportError(SubsecExpr->getLoc(),
1625 "subsection number " + Twine(Subsec) +
1626 " is not within [0,2147483647]");
1627 return true;
1628 }
1629 }
1630 switchSection(Section, Subsec);
1631 return false;
1632}
1633
1635 SectionStack.back().second = SectionStack.back().first;
1636 SectionStack.back().first = MCSectionSubPair(Section, 0);
1637 changeSection(Section, 0);
1638}
1639
1641 // TODO: keep track of the last subsection so that this symbol appears in the
1642 // correct place.
1643 MCSymbol *Sym = Section->getEndSymbol(Context);
1644 if (Sym->isInSection())
1645 return Sym;
1646
1647 switchSection(Section);
1648 emitLabel(Sym);
1649 return Sym;
1650}
1651
1653 auto *Sec = CurFrag->getParent();
1654 F->setParent(Sec);
1655 F->setLayoutOrder(CurFrag->getLayoutOrder() + 1);
1656 CurFrag->Next = F;
1657 CurFrag = F;
1658 Sec->curFragList()->Tail = F;
1659}
1660
1661static VersionTuple
1663 VersionTuple TargetVersion) {
1664 VersionTuple Min = Target.getMinimumSupportedOSVersion();
1665 return !Min.empty() && Min > TargetVersion ? Min : TargetVersion;
1666}
1667
1668static MCVersionMinType
1670 assert(Target.isOSDarwin() && "expected a darwin OS");
1671 switch (Target.getOS()) {
1672 case Triple::MacOSX:
1673 case Triple::Darwin:
1674 return MCVM_OSXVersionMin;
1675 case Triple::IOS:
1676 assert(!Target.isMacCatalystEnvironment() &&
1677 "mac Catalyst should use LC_BUILD_VERSION");
1678 return MCVM_IOSVersionMin;
1679 case Triple::TvOS:
1680 return MCVM_TvOSVersionMin;
1681 case Triple::WatchOS:
1683 default:
1684 break;
1685 }
1686 llvm_unreachable("unexpected OS type");
1687}
1688
1690 assert(Target.isOSDarwin() && "expected a darwin OS");
1691 switch (Target.getOS()) {
1692 case Triple::MacOSX:
1693 case Triple::Darwin:
1694 return VersionTuple(10, 14);
1695 case Triple::IOS:
1696 // Mac Catalyst always uses the build version load command.
1697 if (Target.isMacCatalystEnvironment())
1698 return VersionTuple();
1699 [[fallthrough]];
1700 case Triple::TvOS:
1701 return VersionTuple(12);
1702 case Triple::WatchOS:
1703 return VersionTuple(5);
1704 case Triple::DriverKit:
1705 case Triple::BridgeOS:
1706 case Triple::XROS:
1707 // DriverKit/BridgeOS/XROS always use the build version load command.
1708 return VersionTuple();
1709 default:
1710 break;
1711 }
1712 llvm_unreachable("unexpected OS type");
1713}
1714
1717 assert(Target.isOSDarwin() && "expected a darwin OS");
1718 switch (Target.getOS()) {
1719 case Triple::MacOSX:
1720 case Triple::Darwin:
1721 return MachO::PLATFORM_MACOS;
1722 case Triple::IOS:
1723 if (Target.isMacCatalystEnvironment())
1724 return MachO::PLATFORM_MACCATALYST;
1725 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_IOSSIMULATOR
1726 : MachO::PLATFORM_IOS;
1727 case Triple::TvOS:
1728 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_TVOSSIMULATOR
1729 : MachO::PLATFORM_TVOS;
1730 case Triple::WatchOS:
1731 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_WATCHOSSIMULATOR
1732 : MachO::PLATFORM_WATCHOS;
1733 case Triple::DriverKit:
1734 return MachO::PLATFORM_DRIVERKIT;
1735 case Triple::XROS:
1736 return Target.isSimulatorEnvironment() ? MachO::PLATFORM_XROS_SIMULATOR
1737 : MachO::PLATFORM_XROS;
1738 case Triple::BridgeOS:
1739 return MachO::PLATFORM_BRIDGEOS;
1740 default:
1741 break;
1742 }
1743 llvm_unreachable("unexpected OS type");
1744}
1745
1747 const Triple &Target, const VersionTuple &SDKVersion,
1748 const Triple *DarwinTargetVariantTriple,
1749 const VersionTuple &DarwinTargetVariantSDKVersion) {
1750 if (!Target.isOSBinFormatMachO() || !Target.isOSDarwin())
1751 return;
1752 // Do we even know the version?
1753 if (Target.getOSMajorVersion() == 0)
1754 return;
1755
1757 switch (Target.getOS()) {
1758 case Triple::MacOSX:
1759 case Triple::Darwin:
1760 Target.getMacOSXVersion(Version);
1761 break;
1762 case Triple::IOS:
1763 case Triple::TvOS:
1764 Version = Target.getiOSVersion();
1765 break;
1766 case Triple::WatchOS:
1767 Version = Target.getWatchOSVersion();
1768 break;
1769 case Triple::DriverKit:
1770 Version = Target.getDriverKitVersion();
1771 break;
1772 case Triple::XROS:
1773 case Triple::BridgeOS:
1774 Version = Target.getOSVersion();
1775 break;
1776 default:
1777 llvm_unreachable("unexpected OS type");
1778 }
1779 assert(Version.getMajor() != 0 && "A non-zero major version is expected");
1780 auto LinkedTargetVersion =
1782 auto BuildVersionOSVersion = getMachoBuildVersionSupportedOS(Target);
1783 bool ShouldEmitBuildVersion = false;
1784 if (BuildVersionOSVersion.empty() ||
1785 LinkedTargetVersion >= BuildVersionOSVersion) {
1786 if (Target.isMacCatalystEnvironment() && DarwinTargetVariantTriple &&
1787 DarwinTargetVariantTriple->isMacOSX()) {
1788 emitVersionForTarget(*DarwinTargetVariantTriple,
1789 DarwinTargetVariantSDKVersion,
1790 /*DarwinTargetVariantTriple=*/nullptr,
1791 /*DarwinTargetVariantSDKVersion=*/VersionTuple());
1794 LinkedTargetVersion.getMajor(),
1795 LinkedTargetVersion.getMinor().value_or(0),
1796 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1797 return;
1798 }
1800 LinkedTargetVersion.getMajor(),
1801 LinkedTargetVersion.getMinor().value_or(0),
1802 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1803 ShouldEmitBuildVersion = true;
1804 }
1805
1806 if (const Triple *TVT = DarwinTargetVariantTriple) {
1807 if (Target.isMacOSX() && TVT->isMacCatalystEnvironment()) {
1808 auto TVLinkedTargetVersion =
1809 targetVersionOrMinimumSupportedOSVersion(*TVT, TVT->getiOSVersion());
1812 TVLinkedTargetVersion.getMajor(),
1813 TVLinkedTargetVersion.getMinor().value_or(0),
1814 TVLinkedTargetVersion.getSubminor().value_or(0),
1815 DarwinTargetVariantSDKVersion);
1816 }
1817 }
1818
1819 if (ShouldEmitBuildVersion)
1820 return;
1821
1823 LinkedTargetVersion.getMajor(),
1824 LinkedTargetVersion.getMinor().value_or(0),
1825 LinkedTargetVersion.getSubminor().value_or(0), SDKVersion);
1826}
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:723
const char * getData8bitsDirective() const
Definition MCAsmInfo.h:475
bool needsDwarfSectionOffsetDirective() const
Definition MCAsmInfo.h:540
bool doesSetDirectiveSuppressReloc() const
Definition MCAsmInfo.h:626
virtual const MCExpr * getDwarfSectionOffsetExpr(const MCSymbol *Sym, uint64_t Offset, MCContext &Ctx) const
Return the expression used to emit the offset of Sym + Offset from the start of its DWARF section.
Definition MCAsmInfo.cpp:73
bool usesWindowsCFI() const
Returns true if the object format describes unwind information with Windows SEH unwind opcodes (....
Definition MCAsmInfo.h:685
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
const MCAsmInfo & getAsmInfo() const
Definition MCContext.h:411
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:277
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.
void emitSymbolValue(const MCSymbol *Sym, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for MCSymbols.
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())
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 ...
void emitDwarfSectionOffset(const MCSymbol *Sym, uint64_t Offset, unsigned Size)
Emit the offset of Sym + Offset from the start of its DWARF section as a section-relative relocation.
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
bool isUndefined() const
isUndefined - Check if this symbol undefined (i.e., implicitly defined).
Definition MCSymbol.h:243
StringRef getName() const
getName - Get the symbol name.
Definition MCSymbol.h:188
void setFragment(MCFragment *F) const
Mark the symbol as defined in the fragment F.
Definition MCSymbol.h:257
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:28
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:683
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