46 std::unique_ptr<MCCodeEmitter>
Emitter,
47 std::unique_ptr<MCAsmBackend> AsmBackend)
51 (AsmBackend) ? AsmBackend->createObjectWriter(
NullStream) : nullptr)),
75 FixupMap.
resize(Code.size() * 8);
76 for (
unsigned I = 0, E = Code.size() * 8;
I != E; ++
I)
79 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
83 for (
unsigned J = 0; J != Info.TargetSize; ++J) {
84 unsigned Index =
F.getOffset() * 8 + Info.TargetOffset + J;
85 assert(Index < Code.size() * 8 &&
"Invalid offset in fixup!");
86 FixupMap[Index] = 1 +
I;
93 for (
unsigned I = 0, E = Code.size();
I != E; ++
I) {
98 uint8_t MapEntry = FixupMap[
I * 8 + 0];
99 for (
unsigned J = 1; J != 8; ++J) {
100 if (FixupMap[
I * 8 + J] == MapEntry)
107 if (MapEntry !=
uint8_t(~0U)) {
114 <<
char(
'A' + MapEntry - 1) <<
'\'';
116 OS <<
char(
'A' + MapEntry - 1);
121 for (
unsigned J = 8; J--;) {
122 unsigned Bit = (Code[
I] >> J) & 1;
129 FixupBit =
I * 8 + J;
131 FixupBit =
I * 8 + (7 - J);
133 if (
uint8_t MapEntry = FixupMap[FixupBit]) {
134 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
135 OS <<
char(
'A' + MapEntry - 1);
143 for (
unsigned I = 0, E = Fixups.size();
I != E; ++
I) {
145 OS <<
" fixup " <<
char(
'A' +
I) <<
" - "
146 <<
"offset: " <<
F.getOffset() <<
", value: ";
148 auto Kind =
F.getKind();
150 OS <<
", relocation type: " << Kind;
155 OS <<
"FK_PCRel_" << (Info.TargetSize / 8);
166 std::unique_ptr<formatted_raw_ostream> OSOwner;
169 std::unique_ptr<MCInstPrinter> InstPrinter;
173 bool EmittedSectionDirective =
false;
175 bool IsVerboseAsm =
false;
176 bool ShowInst =
false;
177 bool UseDwarfDirectory =
false;
179 void EmitRegisterName(int64_t
Register);
181 void printDwarfFileDirective(
unsigned FileNo,
StringRef Directory,
183 std::optional<MD5::MD5Result> Checksum,
184 std::optional<StringRef> Source,
185 bool UseDwarfDirectory,
191 void emitDwarfLocDirectiveFlags(
unsigned Flags,
unsigned Isa,
192 unsigned Discriminator);
196 void emitDwarfLocDirectiveSuffix(
unsigned FileNo,
unsigned Line,
197 unsigned Column,
unsigned Flags,
198 unsigned Isa,
unsigned Discriminator,
202 MCAsmStreamer(
MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
203 std::unique_ptr<MCInstPrinter>
printer,
204 std::unique_ptr<MCCodeEmitter> emitter,
205 std::unique_ptr<MCAsmBackend> asmbackend)
207 OSOwner(
std::
move(os)), OS(*OSOwner), MAI(&Context.getAsmInfo()),
210 if (Assembler->getBackendPtr())
211 setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
213 Context.setUseNamesOnTempLabels(
true);
218 InstPrinter->setCommentStream(CommentStream);
222 UseDwarfDirectory =
false;
225 UseDwarfDirectory =
true;
229 Context.getAsmInfo().enableDwarfFileDirectoryDefault();
234 MCAssembler *getAssemblerPtr()
override {
return nullptr; }
236 inline void EmitEOL() {
238 emitExplicitComments();
244 EmitCommentsAndEOL();
247 void emitSyntaxDirective(StringRef Syntax, StringRef
Options)
override;
249 void EmitCommentsAndEOL();
252 bool isVerboseAsm()
const override {
return IsVerboseAsm; }
255 bool hasRawTextSupport()
const override {
return true; }
260 void AddComment(
const Twine &
T,
bool EOL =
true)
override;
262 void emitRawComment(
const Twine &
T,
bool TabPrefix =
true)
override;
264 void addExplicitComment(
const Twine &
T)
override;
265 void emitExplicitComments()
override;
268 void addBlankLine()
override { EmitEOL(); }
273 void switchSection(MCSection *Section, uint32_t Subsection)
override;
274 bool popSection()
override;
276 void emitELFSymverDirective(
const MCSymbol *OriginalSym, StringRef Name,
277 bool KeepOriginalSym)
override;
281 void emitGNUAttribute(
unsigned Tag,
unsigned Value)
override;
284 auto [Ptr,
Bits] = InstPrinter->getMnemonic(
MI);
285 assert((Bits != 0 || Ptr ==
nullptr) &&
286 "Invalid char pointer for instruction with no mnemonic");
290 void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc())
override;
292 void emitSubsectionsViaSymbols()
override;
293 void emitLinkerOptions(ArrayRef<std::string>
Options)
override;
296 unsigned Update, VersionTuple SDKVersion)
override;
297 void emitBuildVersion(
unsigned Platform,
unsigned Major,
unsigned Minor,
298 unsigned Update, VersionTuple SDKVersion)
override;
299 void emitDarwinTargetVariantBuildVersion(
unsigned Platform,
unsigned Major,
300 unsigned Minor,
unsigned Update,
301 VersionTuple SDKVersion)
override;
302 void emitTargetTriple(StringRef TargetTriple)
override;
304 void emitAssignment(MCSymbol *Symbol,
const MCExpr *
Value)
override;
305 void emitConditionalAssignment(MCSymbol *Symbol,
306 const MCExpr *
Value)
override;
307 void emitWeakReference(MCSymbol *Alias,
const MCSymbol *Symbol)
override;
310 void emitSymbolDesc(MCSymbol *Symbol,
unsigned DescValue)
override;
311 void beginCOFFSymbolDef(
const MCSymbol *Symbol)
override;
312 void emitCOFFSymbolStorageClass(
int StorageClass)
override;
313 void emitCOFFSymbolType(
int Type)
override;
314 void endCOFFSymbolDef()
override;
315 void emitCOFFSafeSEH(MCSymbol
const *Symbol)
override;
316 void emitCOFFSymbolIndex(MCSymbol
const *Symbol)
override;
317 void emitCOFFSectionIndex(MCSymbol
const *Symbol)
override;
318 void emitCOFFSecRel32(MCSymbol
const *Symbol, uint64_t
Offset)
override;
319 void emitCOFFImgRel32(MCSymbol
const *Symbol, int64_t
Offset)
override;
320 void emitCOFFSecNumber(MCSymbol
const *Symbol)
override;
321 void emitCOFFSecOffset(MCSymbol
const *Symbol)
override;
322 void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t
Size,
323 MCSymbol *CsectSym, Align Alignment)
override;
324 void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
327 void emitXCOFFRenameDirective(
const MCSymbol *Name,
328 StringRef Rename)
override;
330 void emitXCOFFRefDirective(
const MCSymbol *Symbol)
override;
332 void emitXCOFFExceptDirective(
const MCSymbol *Symbol,
333 const MCSymbol *
Trap,
334 unsigned Lang,
unsigned Reason,
335 unsigned FunctionSize,
bool hasDebug)
override;
336 void emitXCOFFCInfoSym(StringRef Name, StringRef
Metadata)
override;
338 void emitELFSize(MCSymbol *Symbol,
const MCExpr *
Value)
override;
339 void emitCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
340 Align ByteAlignment)
override;
347 void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
348 Align ByteAlignment)
override;
350 void emitZerofill(MCSection *Section, MCSymbol *Symbol =
nullptr,
351 uint64_t
Size = 0, Align ByteAlignment =
Align(1),
352 SMLoc Loc = SMLoc())
override;
354 void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t
Size,
355 Align ByteAlignment =
Align(1))
override;
357 void emitBinaryData(StringRef
Data)
override;
359 void emitBytes(StringRef
Data)
override;
361 void emitValueImpl(
const MCExpr *
Value,
unsigned Size,
362 SMLoc Loc = SMLoc())
override;
363 void emitIntValue(uint64_t
Value,
unsigned Size)
override;
364 void emitIntValueInHex(uint64_t
Value,
unsigned Size)
override;
365 void emitIntValueInHexWithPadding(uint64_t
Value,
unsigned Size)
override;
367 void emitULEB128Value(
const MCExpr *
Value)
override;
369 void emitSLEB128Value(
const MCExpr *
Value)
override;
371 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
372 SMLoc Loc = SMLoc())
override;
374 void emitFill(
const MCExpr &NumValues, int64_t
Size, int64_t Expr,
375 SMLoc Loc = SMLoc())
override;
377 void emitAlignmentDirective(uint64_t ByteAlignment,
378 std::optional<int64_t>
Value,
unsigned ValueSize,
379 unsigned MaxBytesToEmit);
381 void emitValueToAlignment(Align Alignment, int64_t Fill = 0,
383 unsigned MaxBytesToEmit = 0)
override;
385 void emitCodeAlignment(Align Alignment,
const MCSubtargetInfo &STI,
386 unsigned MaxBytesToEmit = 0)
override;
387 void emitPrefAlign(Align Alignment,
const MCSymbol &End,
bool EmitNops,
388 uint8_t Fill,
const MCSubtargetInfo &STI)
override;
390 void emitValueToOffset(
const MCExpr *
Offset,
394 void emitFileDirective(StringRef
Filename)
override;
395 void emitFileDirective(StringRef
Filename, StringRef CompilerVersion,
396 StringRef TimeStamp, StringRef Description)
override;
397 Expected<unsigned> tryEmitDwarfFileDirective(
398 unsigned FileNo, StringRef Directory, StringRef
Filename,
399 std::optional<MD5::MD5Result> Checksum = std::nullopt,
400 std::optional<StringRef> Source = std::nullopt,
401 unsigned CUID = 0)
override;
402 void emitDwarfFile0Directive(StringRef Directory, StringRef
Filename,
403 std::optional<MD5::MD5Result> Checksum,
404 std::optional<StringRef> Source,
405 unsigned CUID = 0)
override;
406 void emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
unsigned Column,
407 unsigned Flags,
unsigned Isa,
408 unsigned Discriminator, StringRef FileName,
409 StringRef Location = {})
override;
410 void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
override;
414 void emitDwarfLocDirectiveWithInlinedAt(
unsigned FileNo,
unsigned Line,
415 unsigned Column,
unsigned FileIA,
416 unsigned LineIA,
unsigned ColIA,
417 const MCSymbol *Sym,
unsigned Flags,
418 unsigned Isa,
unsigned Discriminator,
420 StringRef Comment = {})
override;
422 MCSymbol *getDwarfLineTableSymbol(
unsigned CUID)
override;
424 bool emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
425 ArrayRef<uint8_t> Checksum,
426 unsigned ChecksumKind)
override;
427 bool emitCVFuncIdDirective(
unsigned FuncId)
override;
428 bool emitCVInlineSiteIdDirective(
unsigned FunctionId,
unsigned IAFunc,
429 unsigned IAFile,
unsigned IALine,
430 unsigned IACol, SMLoc Loc)
override;
431 void emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
unsigned Line,
432 unsigned Column,
bool PrologueEnd,
bool IsStmt,
433 StringRef FileName, SMLoc Loc)
override;
434 void emitCVLinetableDirective(
unsigned FunctionId,
const MCSymbol *FnStart,
435 const MCSymbol *FnEnd)
override;
436 void emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
437 unsigned SourceFileId,
438 unsigned SourceLineNum,
439 const MCSymbol *FnStartSym,
440 const MCSymbol *FnEndSym)
override;
442 void PrintCVDefRangePrefix(
443 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
445 void emitCVDefRangeDirective(
446 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
447 codeview::DefRangeRegisterRelHeader DRHdr)
override;
449 void emitCVDefRangeDirective(
450 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
451 codeview::DefRangeSubfieldRegisterHeader DRHdr)
override;
453 void emitCVDefRangeDirective(
454 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
455 codeview::DefRangeRegisterHeader DRHdr)
override;
457 void emitCVDefRangeDirective(
458 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
459 codeview::DefRangeFramePointerRelHeader DRHdr)
override;
461 void emitCVDefRangeDirective(
462 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
463 codeview::DefRangeRegisterRelIndirHeader DRHdr)
override;
465 void emitCVStringTableDirective()
override;
466 void emitCVFileChecksumsDirective()
override;
467 void emitCVFileChecksumOffsetDirective(
unsigned FileNo)
override;
468 void emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L)
override;
470 void emitIdent(StringRef IdentString)
override;
471 void emitCFIBKeyFrame()
override;
472 void emitCFIMTETaggedFrame()
override;
473 void emitCFISections(
bool EH,
bool Debug,
bool SFrame)
override;
474 void emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
475 void emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc)
override;
476 void emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc)
override;
479 void emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
480 void emitCFIPersonality(
const MCSymbol *Sym,
unsigned Encoding)
override;
481 void emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding)
override;
482 void emitCFIRememberState(SMLoc Loc)
override;
483 void emitCFIRestoreState(SMLoc Loc)
override;
484 void emitCFIRestore(int64_t
Register, SMLoc Loc)
override;
485 void emitCFISameValue(int64_t
Register, SMLoc Loc)
override;
486 void emitCFIRelOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
487 void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc)
override;
488 void emitCFIEscape(StringRef
Values, SMLoc Loc)
override;
489 void emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc)
override;
490 void emitCFISignalFrame()
override;
491 void emitCFIUndefined(int64_t
Register, SMLoc Loc)
override;
492 void emitCFIRegister(int64_t Register1, int64_t Register2,
494 void emitCFIWindowSave(SMLoc Loc)
override;
495 void emitCFINegateRAState(SMLoc Loc)
override;
496 void emitCFINegateRAStateWithPC(SMLoc Loc)
override;
497 void emitCFILLVMSetRAState(
unsigned State, MCSymbol *PACSym,
499 void emitCFILLVMSetRAState(
unsigned State, int64_t
Offset,
501 void emitCFIReturnColumn(int64_t
Register)
override;
502 void emitCFILLVMRegisterPair(int64_t
Register, int64_t R1, int64_t R1Size,
503 int64_t
R2, int64_t R2Size, SMLoc Loc)
override;
504 void emitCFILLVMVectorRegisters(
507 void emitCFILLVMVectorOffset(int64_t
Register, int64_t RegisterSize,
508 int64_t MaskRegister, int64_t MaskRegisterSize,
509 int64_t
Offset, SMLoc Loc)
override;
510 void emitCFILLVMVectorRegisterMask(int64_t
Register, int64_t SpillRegister,
511 int64_t SpillRegisterLaneSizeInBits,
512 int64_t MaskRegister,
513 int64_t MaskRegisterSizeInBits,
516 void emitCFILabelDirective(SMLoc Loc, StringRef Name)
override;
517 void emitCFIValOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
519 void emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc)
override;
520 void emitWinCFIEndProc(SMLoc Loc)
override;
521 void emitWinCFIFuncletOrFuncEnd(SMLoc Loc)
override;
522 void emitWinCFISplitChained(SMLoc Loc)
override;
523 void emitWinCFIPushReg(MCRegister
Register, SMLoc Loc)
override;
524 void emitWinCFIPush2Regs(MCRegister Reg1, MCRegister Reg2,
528 void emitWinCFIAllocStack(
unsigned Size, SMLoc Loc)
override;
533 void emitWinCFIPushFrame(
bool Code, SMLoc Loc)
override;
534 void emitWinCFIEndProlog(SMLoc Loc)
override;
535 void emitWinCFIBeginEpilogue(SMLoc Loc)
override;
536 void emitWinCFIEndEpilogue(SMLoc Loc)
override;
537 void emitWinCFIUnwindV2Start(SMLoc Loc)
override;
538 void emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc)
override;
540 void emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
bool Except,
542 void emitWinEHHandlerData(SMLoc Loc)
override;
544 void emitCGProfileEntry(
const MCSymbolRefExpr *From,
545 const MCSymbolRefExpr *To, uint64_t
Count)
override;
547 void emitInstruction(
const MCInst &Inst,
const MCSubtargetInfo &STI)
override;
549 void emitPseudoProbe(uint64_t
Guid, uint64_t Index, uint64_t
Type,
550 uint64_t Attr, uint64_t Discriminator,
552 MCSymbol *FnSym)
override;
554 void emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
555 const MCExpr *Expr, SMLoc Loc)
override;
557 void emitAddrsig()
override;
558 void emitAddrsigSym(
const MCSymbol *Sym)
override;
563 void emitRawTextImpl(StringRef
String)
override;
565 void finishImpl()
override;
567 void emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment)
override;
569 MCSymbol *emitDwarfUnitLength(
const Twine &Prefix,
570 const Twine &Comment)
override;
572 void emitDwarfLineStartLabel(MCSymbol *StartSym)
override;
574 void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
575 MCSymbol *EndLabel =
nullptr)
override;
577 void emitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
578 const MCSymbol *Label,
579 unsigned PointerSize)
override;
584void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
585 if (!IsVerboseAsm)
return;
587 T.toVector(CommentToEmit);
590 CommentToEmit.push_back(
'\n');
593void MCAsmStreamer::EmitCommentsAndEOL() {
594 if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0) {
602 "Comment array not newline terminated");
606 size_t Position = Comments.
find(
'\n');
609 Comments = Comments.
substr(Position+1);
610 }
while (!Comments.
empty());
612 CommentToEmit.clear();
616 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
617 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
620void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
627void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
632 ExplicitCommentToEmit.
append(
"\t");
637 size_t p = 2, len = c.
size() - 2;
641 ExplicitCommentToEmit.
append(
"\t");
646 ExplicitCommentToEmit.
append(
"\n");
650 ExplicitCommentToEmit.
append(
"\t");
652 }
else if (c.
front() ==
'#') {
654 ExplicitCommentToEmit.
append(
"\t");
658 assert(
false &&
"Unexpected Assembly Comment");
660 if (c.
back() ==
'\n')
661 emitExplicitComments();
664void MCAsmStreamer::emitExplicitComments() {
665 StringRef Comments = ExplicitCommentToEmit;
666 if (!Comments.
empty())
668 ExplicitCommentToEmit.
clear();
671void MCAsmStreamer::switchSection(
MCSection *Section, uint32_t Subsection) {
673 if (!EmittedSectionDirective ||
675 EmittedSectionDirective =
true;
677 TS->changeSection(Cur.first, Section, Subsection, OS);
686bool MCAsmStreamer::popSection() {
689 auto [Sec, Subsec] = getCurrentSection();
694void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
696 bool KeepOriginalSym) {
698 OriginalSym->
print(OS, MAI);
700 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
710 if (!
Symbol->isVariable() &&
725 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
726 assert(str !=
"" &&
"Invalid LOH name");
740void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
741 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
744void MCAsmStreamer::emitSubsectionsViaSymbols() {
745 OS <<
".subsections_via_symbols\n";
749 assert(!
Options.empty() &&
"At least one option is required!");
750 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
752 OS <<
", " <<
'"' << Opt <<
'"';
781 if (SDKVersion.
empty())
783 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
784 if (
auto Minor = SDKVersion.
getMinor()) {
785 OS <<
", " << *Minor;
787 OS <<
", " << *Subminor;
793 unsigned Minor,
unsigned Update,
797 OS <<
", " << Update;
804#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
806 case MachO::PLATFORM_##platform: \
808#include "llvm/BinaryFormat/MachO.def"
813void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
814 unsigned Minor,
unsigned Update,
817 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
819 OS <<
", " << Update;
824void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
825 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
827 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
830void MCAsmStreamer::emitTargetTriple(
StringRef TargetTriple) {
831 OS <<
"\t.target_triple \"" << TargetTriple <<
'"';
840 OS << (UseSet ?
", " :
" = ");
847void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
849 OS <<
".lto_set_conditional ";
856void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
858 Alias->
print(OS, MAI);
864bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
881 default:
return false;
904 OS <<
"\t.no_dead_strip\t";
909 OS <<
"\t.private_extern\t";
918 OS <<
"\t.weak_definition\t";
935 OS <<
"\t.weak_anti_dep\t";
945void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
946 OS <<
".desc" <<
' ';
948 OS <<
',' << DescValue;
953 OS <<
"\t." << Syntax <<
"_syntax";
959void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
966void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
971void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
972 OS <<
"\t.type\t" <<
Type <<
';';
976void MCAsmStreamer::endCOFFSymbolDef() {
981void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
982 OS <<
"\t.safeseh\t";
987void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
993void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
999void MCAsmStreamer::emitCOFFSecRel32(
MCSymbol const *Symbol, uint64_t
Offset) {
1000 OS <<
"\t.secrel32\t";
1007void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
1017void MCAsmStreamer::emitCOFFSecNumber(
MCSymbol const *Symbol) {
1018 OS <<
"\t.secnum\t";
1023void MCAsmStreamer::emitCOFFSecOffset(
MCSymbol const *Symbol) {
1024 OS <<
"\t.secoffset\t";
1032void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
1037 "We only support writing log base-2 alignment format with XCOFF.");
1040 LabelSym->
print(OS, MAI);
1041 OS <<
',' <<
Size <<
',';
1042 CsectSym->
print(OS, MAI);
1043 OS <<
',' <<
Log2(Alignment);
1050 if (XSym->hasRename())
1051 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1054void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
1065 OS <<
"\t.extern\t";
1068 OS <<
"\t.lglobl\t";
1076 switch (Visibility) {
1096 if (Sym.hasRename())
1097 emitXCOFFRenameDirective(&Sym, Sym.getSymbolTableName());
1100void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *Name,
1102 OS <<
"\t.rename\t";
1103 Name->print(OS, MAI);
1104 const char DQ =
'"';
1106 for (
char C : Rename) {
1116void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
1122void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
1126 unsigned FunctionSize,
1128 OS <<
"\t.except\t";
1130 OS <<
", " << Lang <<
", " << Reason;
1135 const char InfoDirective[] =
"\t.info ";
1136 const char *Separator =
", ";
1137 constexpr int WordSize =
sizeof(uint32_t);
1140 OS << InfoDirective;
1141 PrintQuotedString(Name, OS);
1144 size_t MetadataSize =
Metadata.size();
1147 OS <<
format_hex(MetadataSize, 10) << Separator;
1150 if (MetadataSize == 0) {
1160 uint32_t PaddedSize =
alignTo(MetadataSize, WordSize);
1161 uint32_t PaddingSize = PaddedSize - MetadataSize;
1168 constexpr int WordsPerDirective = 5;
1171 int WordsBeforeNextDirective = 0;
1172 auto PrintWord = [&](
const uint8_t *WordPtr) {
1173 if (WordsBeforeNextDirective-- == 0) {
1175 OS << InfoDirective;
1176 WordsBeforeNextDirective = WordsPerDirective;
1184 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1185 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) + Index);
1190 assert(PaddedSize - Index == WordSize);
1191 std::array<uint8_t, WordSize> LastWord = {0};
1192 ::memcpy(LastWord.data(),
Metadata.data() + Index, MetadataSize - Index);
1193 PrintWord(LastWord.data());
1207void MCAsmStreamer::emitCommonSymbol(
MCSymbol *Symbol, uint64_t
Size,
1208 Align ByteAlignment) {
1216 OS <<
',' <<
Log2(ByteAlignment);
1223 if (XSym && XSym->hasRename())
1224 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1228void MCAsmStreamer::emitLocalCommonSymbol(
MCSymbol *Symbol, uint64_t
Size,
1234 if (ByteAlign > 1) {
1239 OS <<
',' << ByteAlign.
value();
1242 OS <<
',' <<
Log2(ByteAlign);
1259 ".zerofill is a Mach-O specific directive");
1269 OS <<
',' <<
Log2(ByteAlignment);
1284 ".zerofill is a Mach-O specific directive");
1293 if (ByteAlignment > 1)
1294 OS <<
", " <<
Log2(ByteAlignment);
1300 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1301 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1312 assert(!
Data.empty() &&
"Cannot generate an empty list.");
1313 const auto printCharacterInOctal = [&OS](
unsigned char C) {
1319 const auto printOneCharacterFor = [printCharacterInOctal](
1320 auto printOnePrintingCharacter) {
1321 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1323 printOnePrintingCharacter(
static_cast<char>(
C));
1326 printCharacterInOctal(
C);
1329 const auto printCharacterList = [
Data, &OS](
const auto &printOneCharacter) {
1330 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1331 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1332 printOneCharacter(
C);
1335 printOneCharacter(*(EndPtr - 1));
1339 printCharacterList(printCharacterInOctal);
1342 printCharacterList(printOneCharacterFor([&OS](
char C) {
1343 const char AsmCharLitBuf[2] = {
'\'',
C};
1344 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1355 for (
unsigned char C :
Data) {
1362 for (
unsigned char C :
Data) {
1363 if (
C ==
'"' ||
C ==
'\\') {
1364 OS <<
'\\' << (char)
C;
1403 assert(getCurrentSectionOnly() &&
1404 "Cannot emit contents before setting section!");
1405 if (
Data.empty())
return;
1412 if (
Data.back() == 0) {
1413 OS <<
"\t.string\t";
1418 PrintQuotedString(
Data, OS);
1438 PrintQuotedString(
Data, OS);
1443 if (
Data.size() != 1 && emitAsString(
Data))
1449 TS->emitRawBytes(
Data);
1453 for (
const unsigned char C :
Data.bytes()) {
1461 const size_t Cols = 4;
1462 for (
size_t I = 0, EI =
alignTo(
Data.size(), Cols);
I < EI;
I += Cols) {
1463 size_t J =
I, EJ = std::min(
I + Cols,
Data.size());
1466 for (; J < EJ - 1; ++J)
1467 OS <<
format(
"0x%02x", uint8_t(
Data[J])) <<
", ";
1473void MCAsmStreamer::emitIntValue(uint64_t
Value,
unsigned Size) {
1477void MCAsmStreamer::emitIntValueInHex(uint64_t
Value,
unsigned Size) {
1481void MCAsmStreamer::emitIntValueInHexWithPadding(uint64_t
Value,
1489 assert(getCurrentSectionOnly() &&
1490 "Cannot emit contents before setting section!");
1502 if (!
Value->evaluateAsAbsolute(IntValue))
1517 unsigned ByteOffset =
1518 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1519 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1523 uint64_t Shift = 64 - EmissionSize * 8;
1524 assert(Shift <
static_cast<uint64_t
>(
1525 std::numeric_limits<unsigned long long>::digits) &&
1526 "undefined behavior");
1527 ValueToEmit &= ~0ULL >> Shift;
1528 emitIntValue(ValueToEmit, EmissionSize);
1537 TS->emitValue(
Value);
1544void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1546 if (
Value->evaluateAsAbsolute(IntValue)) {
1547 emitULEB128IntValue(IntValue);
1550 OS <<
"\t.uleb128 ";
1555void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1557 if (
Value->evaluateAsAbsolute(IntValue)) {
1558 emitSLEB128IntValue(IntValue);
1561 OS <<
"\t.sleb128 ";
1566void MCAsmStreamer::emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
1568 int64_t IntNumBytes;
1569 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1570 if (IsAbsolute && IntNumBytes == 0)
1574 if (!MAI->
isAIX() || FillValue == 0) {
1576 OS << ZeroDirective;
1579 OS <<
',' << (int)FillValue;
1584 "Cannot emit non-absolute expression lengths of fill.");
1585 for (
int i = 0; i < IntNumBytes; ++i) {
1596void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1601 OS <<
", " <<
Size <<
", 0x";
1606void MCAsmStreamer::emitAlignmentDirective(uint64_t ByteAlignment,
1607 std::optional<int64_t>
Value,
1609 unsigned MaxBytesToEmit) {
1623 switch (ValueSize) {
1627 OS <<
"\t.p2align\t";
1641 if (
Value.has_value() || MaxBytesToEmit) {
1642 if (
Value.has_value()) {
1650 OS <<
", " << MaxBytesToEmit;
1658 switch (ValueSize) {
1660 case 1: OS <<
".balign";
break;
1661 case 2: OS <<
".balignw";
break;
1662 case 4: OS <<
".balignl";
break;
1667 if (
Value.has_value())
1669 else if (MaxBytesToEmit)
1672 OS <<
", " << MaxBytesToEmit;
1676void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t Fill,
1678 unsigned MaxBytesToEmit) {
1679 emitAlignmentDirective(Alignment.
value(), Fill, FillLen, MaxBytesToEmit);
1682void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1684 unsigned MaxBytesToEmit) {
1690 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1693void MCAsmStreamer::emitPrefAlign(
Align Alignment,
const MCSymbol &End,
1694 bool EmitNops, uint8_t Fill,
1696 OS <<
"\t.prefalign\t" <<
Log2(Alignment) <<
", ";
1701 OS <<
", " <<
static_cast<unsigned>(Fill);
1705void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1706 unsigned char Value,
1711 OS <<
", " << (unsigned)
Value;
1729 bool useTimeStamp = !TimeStamp.
empty();
1730 bool useCompilerVersion = !CompilerVersion.
empty();
1731 bool useDescription = !Description.
empty();
1732 if (useTimeStamp || useCompilerVersion || useDescription) {
1735 PrintQuotedString(TimeStamp, OS);
1736 if (useCompilerVersion || useDescription) {
1738 if (useCompilerVersion)
1739 PrintQuotedString(CompilerVersion, OS);
1740 if (useDescription) {
1742 PrintQuotedString(Description, OS);
1749void MCAsmStreamer::printDwarfFileDirective(
1751 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1755 if (!UseDwarfDirectory && !Directory.
empty()) {
1759 FullPathName = Directory;
1766 OS <<
"\t.file\t" << FileNo <<
' ';
1767 if (!Directory.
empty()) {
1768 PrintQuotedString(Directory, OS);
1773 OS <<
" md5 0x" << Checksum->digest();
1776 PrintQuotedString(*Source, OS);
1782 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1784 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1787 unsigned NumFiles =
Table.getMCDwarfFiles().size();
1793 FileNo = FileNoOrErr.
get();
1797 if (NumFiles ==
Table.getMCDwarfFiles().size() || MAI->
isAIX())
1802 printDwarfFileDirective(FileNo, Directory,
Filename, Checksum, Source,
1803 UseDwarfDirectory, OS1);
1806 TS->emitDwarfFileDirective(OS1.str());
1808 emitRawText(OS1.str());
1813void MCAsmStreamer::emitDwarfFile0Directive(
1815 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1831 printDwarfFileDirective(0, Directory,
Filename, Checksum, Source,
1832 UseDwarfDirectory, OS1);
1835 TS->emitDwarfFileDirective(OS1.str());
1837 emitRawText(OS1.str());
1841void MCAsmStreamer::emitDwarfLocDirectiveFlags(
unsigned Flags,
unsigned Isa,
1842 unsigned Discriminator) {
1847 OS <<
" basic_block";
1849 OS <<
" prologue_end";
1851 OS <<
" epilogue_begin";
1853 const unsigned OldFlags =
getContext().getCurrentDwarfLoc().getFlags();
1860 OS <<
" isa " << Isa;
1866void MCAsmStreamer::emitDwarfLocDirectiveSuffix(
unsigned FileNo,
unsigned Line,
1867 unsigned Column,
unsigned Flags,
1869 unsigned Discriminator,
1873 emitDwarfLocDirectiveFlags(Flags, Isa, Discriminator);
1880 OS << FileName <<
':' <<
Line <<
':' << Column;
1888 Discriminator, FileName, Comment);
1891void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1892 unsigned Column,
unsigned Flags,
1893 unsigned Isa,
unsigned Discriminator,
1903 Discriminator, FileName, Comment);
1908 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1911 emitDwarfLocDirectiveSuffix(FileNo, Line, Column, Flags, Isa, Discriminator,
1917void MCAsmStreamer::emitDwarfLocDirectiveWithInlinedAt(
1918 unsigned FileNo,
unsigned Line,
unsigned Column,
unsigned FileIA,
1919 unsigned LineIA,
unsigned ColIA,
const MCSymbol *Sym,
unsigned Flags,
1920 unsigned Isa,
unsigned Discriminator,
StringRef FileName,
1923 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1924 OS <<
", function_name " << *Sym;
1925 OS <<
", inlined_at " << FileIA <<
" " << LineIA <<
" " << ColIA;
1928 emitDwarfLocDirectiveSuffix(FileNo, Line, Column, Flags, Isa, Discriminator,
1934 OS <<
".loc_label\t" <<
Name;
1938MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1946 unsigned ChecksumKind) {
1951 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1954 if (!ChecksumKind) {
1960 PrintQuotedString(
toHex(Checksum), OS);
1967bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1968 OS <<
"\t.cv_func_id " << FuncId <<
'\n';
1972bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1975 unsigned IALine,
unsigned IACol,
1977 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1978 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1980 IALine, IACol,
Loc);
1983void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1984 unsigned Line,
unsigned Column,
1985 bool PrologueEnd,
bool IsStmt,
1991 OS <<
"\t.cv_loc\t" <<
FunctionId <<
" " << FileNo <<
" " <<
Line <<
" "
1994 OS <<
" prologue_end";
2007void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
2010 OS <<
"\t.cv_linetable\t" <<
FunctionId <<
", ";
2011 FnStart->
print(OS, MAI);
2013 FnEnd->
print(OS, MAI);
2018void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
2019 unsigned SourceFileId,
2020 unsigned SourceLineNum,
2023 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
2024 <<
' ' << SourceLineNum <<
' ';
2025 FnStartSym->
print(OS, MAI);
2027 FnEndSym->
print(OS, MAI);
2030 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
2033void MCAsmStreamer::PrintCVDefRangePrefix(
2034 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
2035 OS <<
"\t.cv_def_range\t";
2036 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
2044void MCAsmStreamer::emitCVDefRangeDirective(
2045 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2047 PrintCVDefRangePrefix(Ranges);
2048 OS <<
", reg_rel, ";
2054void MCAsmStreamer::emitCVDefRangeDirective(
2055 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2057 PrintCVDefRangePrefix(Ranges);
2058 OS <<
", subfield_reg, ";
2063void MCAsmStreamer::emitCVDefRangeDirective(
2064 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2066 PrintCVDefRangePrefix(Ranges);
2072void MCAsmStreamer::emitCVDefRangeDirective(
2073 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2075 PrintCVDefRangePrefix(Ranges);
2076 OS <<
", frame_ptr_rel, ";
2081void MCAsmStreamer::emitCVDefRangeDirective(
2082 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2084 PrintCVDefRangePrefix(Ranges);
2085 OS <<
", reg_rel_indir, ";
2091void MCAsmStreamer::emitCVStringTableDirective() {
2092 OS <<
"\t.cv_stringtable";
2096void MCAsmStreamer::emitCVFileChecksumsDirective() {
2097 OS <<
"\t.cv_filechecksums";
2101void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
2102 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
2106void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
2107 OS <<
"\t.cv_fpo_data\t";
2108 ProcSym->
print(OS, MAI);
2112void MCAsmStreamer::emitIdent(
StringRef IdentString) {
2115 PrintQuotedString(IdentString, OS);
2119void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug,
bool SFrame) {
2121 OS <<
"\t.cfi_sections ";
2130 OS <<
".debug_frame";
2143 OS <<
"\t.cfi_startproc";
2151 OS <<
"\t.cfi_endproc";
2155void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
2161 if (std::optional<MCRegister> LLVMRegister =
2163 InstPrinter->printRegName(OS, *LLVMRegister);
2172 OS <<
"\t.cfi_def_cfa ";
2178void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
2180 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
2184void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
2187 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
2195 OS <<
"\t.cfi_escape ";
2197 size_t e =
Values.size() - 1;
2198 for (
size_t i = 0; i < e; ++i)
2210void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2213 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2222 OS <<
"\t.cfi_def_cfa_register ";
2229 OS <<
"\t.cfi_offset ";
2235void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *Sym,
2236 unsigned Encoding) {
2238 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2239 Sym->
print(OS, MAI);
2243void MCAsmStreamer::emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding) {
2245 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2246 Sym->
print(OS, MAI);
2250void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2252 OS <<
"\t.cfi_remember_state";
2256void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2258 OS <<
"\t.cfi_restore_state";
2264 OS <<
"\t.cfi_restore ";
2271 OS <<
"\t.cfi_same_value ";
2276void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2279 OS <<
"\t.cfi_rel_offset ";
2285void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2287 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2291void MCAsmStreamer::emitCFISignalFrame() {
2293 OS <<
"\t.cfi_signal_frame";
2299 OS <<
"\t.cfi_undefined ";
2304void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2307 OS <<
"\t.cfi_register ";
2308 EmitRegisterName(Register1);
2310 EmitRegisterName(Register2);
2314void MCAsmStreamer::emitCFILLVMRegisterPair(int64_t
Register, int64_t R1,
2315 int64_t R1Size, int64_t
R2,
2319 OS <<
"\t.cfi_llvm_register_pair ";
2322 EmitRegisterName(R1);
2323 OS <<
", " << R1Size <<
", ";
2324 EmitRegisterName(
R2);
2325 OS <<
", " << R2Size;
2329void MCAsmStreamer::emitCFILLVMVectorRegisters(
2334 OS <<
"\t.cfi_llvm_vector_registers ";
2336 for (
auto [
Reg, Lane,
Size] : VRs)
2337 OS <<
", " <<
Reg <<
", " << Lane <<
", " <<
Size;
2341void MCAsmStreamer::emitCFILLVMVectorOffset(int64_t
Register,
2342 int64_t RegisterSize,
2343 int64_t MaskRegister,
2344 int64_t MaskRegisterSize,
2349 OS <<
"\t.cfi_llvm_vector_offset ";
2351 OS <<
", " << RegisterSize <<
", ";
2352 EmitRegisterName(MaskRegister);
2353 OS <<
", " << MaskRegisterSize <<
", " <<
Offset;
2357void MCAsmStreamer::emitCFILLVMVectorRegisterMask(
2358 int64_t
Register, int64_t SpillRegister,
2359 int64_t SpillRegisterLaneSizeInBits, int64_t MaskRegister,
2360 int64_t MaskRegisterSizeInBits,
SMLoc Loc) {
2362 Register, SpillRegister, SpillRegisterLaneSizeInBits, MaskRegister,
2363 MaskRegisterSizeInBits,
Loc);
2365 OS <<
"\t.cfi_llvm_vector_register_mask ";
2368 EmitRegisterName(SpillRegister);
2369 OS <<
", " << SpillRegisterLaneSizeInBits <<
", ";
2370 EmitRegisterName(MaskRegister);
2371 OS <<
", " << MaskRegisterSizeInBits;
2375void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2377 OS <<
"\t.cfi_window_save";
2381void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2383 OS <<
"\t.cfi_negate_ra_state";
2387void MCAsmStreamer::emitCFINegateRAStateWithPC(
SMLoc Loc) {
2389 OS <<
"\t.cfi_negate_ra_state_with_pc";
2393void MCAsmStreamer::emitCFILLVMSetRAState(
unsigned State,
MCSymbol *PACSym,
2396 OS <<
"\t.cfi_set_ra_state " << State <<
", ";
2398 PACSym->
print(OS, MAI);
2404void MCAsmStreamer::emitCFILLVMSetRAState(
unsigned State, int64_t
Offset,
2407 OS <<
"\t.cfi_set_ra_state " << State <<
", " <<
Offset;
2411void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2413 OS <<
"\t.cfi_return_column ";
2420 OS <<
"\t.cfi_label " <<
Name;
2424void MCAsmStreamer::emitCFIBKeyFrame() {
2426 OS <<
"\t.cfi_b_key_frame";
2430void MCAsmStreamer::emitCFIMTETaggedFrame() {
2432 OS <<
"\t.cfi_mte_tagged_frame";
2436void MCAsmStreamer::emitCFIValOffset(int64_t
Register, int64_t
Offset,
2439 OS <<
"\t.cfi_val_offset ";
2445void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2453void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2456 OS <<
"\t.seh_endproc";
2460void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2463 OS <<
"\t.seh_endfunclet";
2467void MCAsmStreamer::emitWinCFISplitChained(
SMLoc Loc) {
2470 OS <<
"\t.seh_splitchained";
2474void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
2478 OS <<
"\t.seh_handler ";
2479 Sym->
print(OS, MAI);
2485 OS <<
", " << Marker <<
"unwind";
2487 OS <<
", " << Marker <<
"except";
2491void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2506 MCSection *XData = getAssociatedXDataSection(TextSec);
2507 switchSectionNoPrint(XData);
2509 OS <<
"\t.seh_handlerdata";
2516 OS <<
"\t.seh_pushreg ";
2517 InstPrinter->printRegName(OS,
Register);
2525 OS <<
"\t.seh_push2regs ";
2526 InstPrinter->printRegName(OS, Reg1);
2528 InstPrinter->printRegName(OS, Reg2);
2536 OS <<
"\t.seh_setframe ";
2537 InstPrinter->printRegName(OS,
Register);
2542void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2545 OS <<
"\t.seh_stackalloc " <<
Size;
2553 OS <<
"\t.seh_savereg ";
2554 InstPrinter->printRegName(OS,
Register);
2563 OS <<
"\t.seh_savexmm ";
2564 InstPrinter->printRegName(OS,
Register);
2569void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2572 OS <<
"\t.seh_pushframe";
2578void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2581 OS <<
"\t.seh_endprologue";
2585void MCAsmStreamer::emitWinCFIBeginEpilogue(
SMLoc Loc) {
2588 OS <<
"\t.seh_startepilogue";
2592void MCAsmStreamer::emitWinCFIEndEpilogue(
SMLoc Loc) {
2595 OS <<
"\t.seh_endepilogue";
2599void MCAsmStreamer::emitWinCFIUnwindV2Start(
SMLoc Loc) {
2602 OS <<
"\t.seh_unwindv2start";
2606void MCAsmStreamer::emitWinCFIUnwindVersion(uint8_t
Version,
SMLoc Loc) {
2609 OS <<
"\t.seh_unwindversion " << (unsigned)
Version;
2616 OS <<
"\t.cg_profile ";
2620 OS <<
", " <<
Count;
2624void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2626 if (LFIRewriter && LFIRewriter->rewriteInst(Inst, *
this, STI))
2630 MCSection *Sec = getCurrentSectionOnly();
2634 if (MAI->
isAIX() && CurFrag)
2640 addEncodingComment(Inst, STI);
2645 getCommentOS() <<
"\n";
2648 if(getTargetStreamer())
2649 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
2651 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
2654 if (Comments.
size() && Comments.
back() !=
'\n')
2655 getCommentOS() <<
"\n";
2660void MCAsmStreamer::emitPseudoProbe(uint64_t
Guid, uint64_t Index,
2661 uint64_t
Type, uint64_t Attr,
2662 uint64_t Discriminator,
2665 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2670 for (
const auto &Site : InlineStack)
2671 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2674 FnSym->
print(OS, MAI);
2691void MCAsmStreamer::emitAddrsig() {
2696void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *Sym) {
2697 OS <<
"\t.addrsig_sym ";
2698 Sym->
print(OS, MAI);
2706 String.consume_back(
"\n");
2711void MCAsmStreamer::finishImpl() {
2729 const auto &Tables =
getContext().getMCDwarfLineTables();
2730 if (!Tables.empty()) {
2731 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2732 if (
auto *Label = Tables.begin()->second.getLabel()) {
2733 switchSection(
getContext().getObjectFileInfo()->getDwarfLineSection(), 0);
2739void MCAsmStreamer::emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment) {
2751MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2752 const Twine &Comment) {
2760 return getContext().createTempSymbol(Prefix +
"_end");
2764void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2775 emitLabel(DebugLineSymTmp);
2779 unsigned LengthFieldSize =
2785 emitAssignment(StartSym, OuterSym);
2791void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2800 ".loc should not be generated together with raw data!");
2813 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, EndLabel,
2818void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2821 unsigned PointerSize) {
2823 ".loc/.file don't need raw data in debug line section!");
2826 AddComment(
"Set address to " +
Label->getName());
2827 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2828 emitULEB128IntValue(PointerSize + 1);
2829 emitIntValue(dwarf::DW_LNE_set_address, 1);
2830 emitSymbolValue(Label, PointerSize);
2834 AddComment(
"Start sequence");
2842 AddComment(
"End sequence");
2843 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2844 emitULEB128IntValue(1);
2845 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2850 AddComment(
"Advance line " +
Twine(LineDelta));
2851 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2852 emitSLEB128IntValue(LineDelta);
2853 emitIntValue(dwarf::DW_LNS_copy, 1);
2857 std::unique_ptr<formatted_raw_ostream> OS,
2858 std::unique_ptr<MCInstPrinter> IP,
2859 std::unique_ptr<MCCodeEmitter> CE,
2860 std::unique_ptr<MCAsmBackend> MAB) {
2861 return new MCAsmStreamer(Context, std::move(OS), std::move(IP), std::move(CE),
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
#define LLVM_LIKELY(EXPR)
dxil DXContainer Global Emitter
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
static void PrintCFIEscape(llvm::formatted_raw_ostream &OS, StringRef Values)
static const char * getVersionMinDirective(MCVersionMinType Type)
static bool isPrintableString(StringRef Data)
static void PrintByteList(StringRef Data, raw_ostream &OS, MCAsmInfo::AsmCharLiteralSyntax ACLS)
static char toOctal(int X)
static void EmitSDKVersionSuffix(raw_ostream &OS, const VersionTuple &SDKVersion)
static int64_t truncateToSize(int64_t Value, unsigned Bytes)
static const char * getPlatformName(MachO::PlatformType Type)
#define DWARF2_FLAG_IS_STMT
#define DWARF2_FLAG_BASIC_BLOCK
#define DWARF2_FLAG_PROLOGUE_END
#define DWARF2_FLAG_EPILOGUE_BEGIN
This file declares the MCLFIRewriter class, an abstract class that encapsulates the rewriting logic f...
LFI-specific code for MC.
Promote Memory to Register
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static constexpr StringLiteral Filename
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
This file defines the SmallString class.
StringRef getMnemonic(unsigned Opc)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Functions, function parameters, and return types can have attributes to indicate how they should be t...
LLVM_ABI void print(raw_ostream &OS) const
Print out the bounds to a stream.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
virtual MCFixupKindInfo getFixupKindInfo(MCFixupKind Kind) const
Get information on a fixup kind.
void addEncodingComment(const MCInst &Inst, const MCSubtargetInfo &STI)
Add a comment showing the encoding of an instruction.
std::unique_ptr< MCAssembler > Assembler
SmallString< 128 > CommentToEmit
MCAssembler & getAssembler()
raw_ostream & getCommentOS() override
Return a raw_ostream that comments can be written to.
raw_null_ostream NullStream
MCAsmBaseStreamer(MCContext &Context, std::unique_ptr< MCCodeEmitter > Emitter, std::unique_ptr< MCAsmBackend > AsmBackend)
raw_svector_ostream CommentStream
This class is intended to be used as a base class for asm properties and features specific to the tar...
const char * getLabelSuffix() const
bool hasDotTypeDotSizeDirective() const
bool isLittleEndian() const
True if the target is little endian.
bool doesSupportDataRegionDirectives() const
bool usesSetToEquateSymbol() const
const char * getData32bitsDirective() const
unsigned getTextAlignFillValue() const
bool useDwarfRegNumForCFI() const
bool supportsExtendedDwarfLocDirective() const
const char * getData8bitsDirective() const
const char * getData64bitsDirective() const
AsmCharLiteralSyntax characterLiteralSyntax() const
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
void printExpr(raw_ostream &, const MCExpr &) const
virtual void printSwitchToSection(const MCSection &, uint32_t Subsection, const Triple &, raw_ostream &) const
StringRef getCommentString() const
const char * getAscizDirective() const
const char * getZeroDirective() const
const char * getWeakDirective() const
const char * getData16bitsDirective() const
const char * getSeparatorString() const
bool getCOMMDirectiveAlignmentIsInBytes() const
const char * getGlobalDirective() const
unsigned getCommentColumn() const
bool hasSingleParameterDotFile() const
const char * getAsciiDirective() const
AsmCharLiteralSyntax
Assembly character literal syntax types.
@ ACLS_SingleQuotePrefix
Unknown; character literals not used by LLVM for this target.
const char * getWeakRefDirective() const
bool hasNoDeadStrip() const
bool hasIdentDirective() const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
MCCodeEmitter & getEmitter() const
MCAsmBackend & getBackend() const
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
virtual void encodeInstruction(const MCInst &Inst, SmallVectorImpl< char > &CB, SmallVectorImpl< MCFixup > &Fixups, const MCSubtargetInfo &STI) const =0
Encode the given Inst to bytes and append to CB.
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
dwarf::DwarfFormat getDwarfFormat() const
const MCAsmInfo & getAsmInfo() const
const Triple & getTargetTriple() const
static LLVM_ABI void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
static LLVM_ABI void make(MCStreamer *MCOS, MCSection *Section)
static LLVM_ABI void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
Base class for the full range of assembler expressions which are needed for parsing.
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
static LLVM_ABI void Emit(MCStreamer *MCOS)
Instances of this class represent a single low-level machine instruction.
LLVM_ABI void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ", const MCContext *Ctx=nullptr) const
Dump the MCInst as prettily as possible using the additional MC structures, if given.
MCSection * getTextSection() const
MCRegisterInfo base class - We assume that the target defines a static array of MCRegisterDesc object...
std::optional< MCRegister > getLLVMRegNum(uint64_t RegNum, bool isEH) const
Map a dwarf register back to a target register.
Wrapper class representing physical registers. Should be passed by value.
This represents a section on a Mach-O system (used by Mac OS X).
StringRef getSegmentName() const
Instances of this class represent a uniqued identifier for a section in the current translation unit.
MCSymbol * getEndSymbol(MCContext &Ctx)
void setHasInstructions(bool Value)
StringRef getName() const
Streaming machine code generation interface.
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
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={})
virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFIUnwindVersion(uint8_t Version, SMLoc Loc=SMLoc())
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
virtual void emitCFIBKeyFrame()
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, SMLoc Loc=SMLoc())
virtual void emitCFISections(bool EH, bool Debug, bool SFrame)
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
virtual void emitCFIReturnColumn(int64_t Register)
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 emitCFILLVMRegisterPair(int64_t Register, int64_t R1, int64_t R1SizeInBits, int64_t R2, int64_t R2SizeInBits, SMLoc Loc={})
virtual void emitWinCFIUnwindV2Start(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndEpilogue(SMLoc Loc=SMLoc())
virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc=SMLoc())
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
virtual void emitCFIUndefined(int64_t Register, SMLoc Loc={})
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFINegateRAState(SMLoc Loc={})
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
MCContext & getContext() const
virtual void emitWinCFIBeginEpilogue(SMLoc Loc=SMLoc())
virtual void emitCFIMTETaggedFrame()
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitCFIRememberState(SMLoc Loc)
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.
MCStreamer(MCContext &Ctx)
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
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 emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
virtual void emitWinCFIPush2Regs(MCRegister Reg1, MCRegister Reg2, SMLoc Loc=SMLoc())
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 switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitCFIRestoreState(SMLoc Loc)
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISplitChained(SMLoc Loc=SMLoc())
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
virtual void emitCFIValOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
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 emitCFIRestore(int64_t Register, SMLoc Loc={})
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 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.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
DwarfDirectory MCUseDwarfDirectory
Target specific streamer interface.
Wrapper class representing virtual and physical registers.
Represents a location in source code.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
void append(StringRef RHS)
Append from a StringRef.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
std::string str() const
Get the contents as an std::string.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
constexpr bool empty() const
Check if the string is empty.
char back() const
Get the last character in the string.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
Get the string size.
char front() const
Get the first character in the string.
size_t find_first_of(char C, size_t From=0) const
Find the first character in the string that is C, or npos if not found.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Triple - Helper class for working with autoconf configuration names.
bool isRISCV() const
Tests whether the target is RISC-V (32- and 64-bit).
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
Represents a version number in the form major[.minor[.subminor[.build]]].
unsigned getMajor() const
Retrieve the major version number.
std::optional< unsigned > getSubminor() const
Retrieve the subminor version number, if provided.
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
std::optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_hex(unsigned long long N)
Output N in hexadecimal, without any prefix or padding.
A raw_ostream that writes to an SmallVector or SmallString.
This class represents a function that is read from a sample profile.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
void emitInstruction(MCObjectStreamer &, const MCInst &Inst, const MCSubtargetInfo &STI)
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
support::ulittle32_t Word
bool isRelocation(MCFixupKind FixupKind)
LLVM_ABI int getDwarfVersion()
@ Emitted
Assigned address, still materializing.
uint32_t read32be(const void *P)
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
RelativeUniformCounterPtr Values
@ Debug
Register 'use' is for debugging purpose.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
static StringRef MCLOHDirectiveName()
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
LLVM_ABI MCStreamer * createAsmStreamer(MCContext &Ctx, std::unique_ptr< formatted_raw_ostream > OS, std::unique_ptr< MCInstPrinter > InstPrint, std::unique_ptr< MCCodeEmitter > CE, std::unique_ptr< MCAsmBackend > TAB)
Create a machine code streamer which will print out assembly for the native target,...
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
MCLOHDirective::LOHArgs MCLOHArgs
LLVM_ABI void emitLFINoteSection(MCStreamer &Streamer, MCContext &Ctx)
SmallVector< InlineSite, 8 > MCPseudoProbeInlineStack
@ 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)
constexpr uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
FormattedNumber format_hex(uint64_t N, unsigned Width, bool Upper=false)
format_hex - Output N as a fixed width hexadecimal.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
static int MCLOHIdToNbArgs(MCLOHType Kind)
MCLOHType
Linker Optimization Hint Type.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
ArrayRef(const T &OneElt) -> ArrayRef< T >
void toHex(ArrayRef< uint8_t > Input, bool LowerCase, SmallVectorImpl< char > &Output)
Convert buffer Input to its hexadecimal representation. The returned string is double the size of Inp...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool isPrint(char C)
Checks whether character C is printable.
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
unsigned Log2(Align A)
Returns the log2 of the alignment.
std::pair< MCSection *, uint32_t > MCSectionSubPair
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_Memtag
.memtag (ELF)
@ MCSA_Protected
.protected (ELF)
@ MCSA_OSLinkage
symbol uses OS linkage (GOFF)
@ MCSA_Exported
.globl _foo, exported (XCOFF)
@ MCSA_PrivateExtern
.private_extern (MachO)
@ MCSA_Internal
.internal (ELF)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_LazyReference
.lazy_reference (MachO)
@ MCSA_ELF_TypeNoType
.type _foo, STT_NOTYPE # aka @notype
@ MCSA_Reference
.reference (MachO)
@ MCSA_SymbolResolver
.symbol_resolver (MachO)
@ MCSA_ELF_TypeTLS
.type _foo, STT_TLS # aka @tls_object
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_ELF_TypeCommon
.type _foo, STT_COMMON # aka @common
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_WeakAntiDep
.weak_anti_dep (COFF)
@ MCSA_XPLinkage
symbol uses XP linkage (GOFF)
@ MCSA_Extern
.extern (XCOFF)
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_ELF_TypeGnuUniqueObject
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
@ MCSA_Hidden
.hidden (ELF)
@ MCSA_LGlobal
.lglobl (XCOFF)
@ MCSA_Invalid
Not a valid directive.
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
static StringRef MCLOHIdToName(MCLOHType Kind)
Implement std::hash so that hash_code can be used in STL containers.
This struct is a compact representation of a valid (non-zero power of two) alignment.
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
Target independent information on a fixup kind.
const MCSymbol * Function