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;
303 void emitAssignment(MCSymbol *Symbol,
const MCExpr *
Value)
override;
304 void emitConditionalAssignment(MCSymbol *Symbol,
305 const MCExpr *
Value)
override;
306 void emitWeakReference(MCSymbol *Alias,
const MCSymbol *Symbol)
override;
309 void emitSymbolDesc(MCSymbol *Symbol,
unsigned DescValue)
override;
310 void beginCOFFSymbolDef(
const MCSymbol *Symbol)
override;
311 void emitCOFFSymbolStorageClass(
int StorageClass)
override;
312 void emitCOFFSymbolType(
int Type)
override;
313 void endCOFFSymbolDef()
override;
314 void emitCOFFSafeSEH(MCSymbol
const *Symbol)
override;
315 void emitCOFFSymbolIndex(MCSymbol
const *Symbol)
override;
316 void emitCOFFSectionIndex(MCSymbol
const *Symbol)
override;
317 void emitCOFFSecRel32(MCSymbol
const *Symbol, uint64_t
Offset)
override;
318 void emitCOFFImgRel32(MCSymbol
const *Symbol, int64_t
Offset)
override;
319 void emitCOFFSecNumber(MCSymbol
const *Symbol)
override;
320 void emitCOFFSecOffset(MCSymbol
const *Symbol)
override;
321 void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t
Size,
322 MCSymbol *CsectSym, Align Alignment)
override;
323 void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
326 void emitXCOFFRenameDirective(
const MCSymbol *Name,
327 StringRef Rename)
override;
329 void emitXCOFFRefDirective(
const MCSymbol *Symbol)
override;
331 void emitXCOFFExceptDirective(
const MCSymbol *Symbol,
332 const MCSymbol *
Trap,
333 unsigned Lang,
unsigned Reason,
334 unsigned FunctionSize,
bool hasDebug)
override;
335 void emitXCOFFCInfoSym(StringRef Name, StringRef
Metadata)
override;
337 void emitELFSize(MCSymbol *Symbol,
const MCExpr *
Value)
override;
338 void emitCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
339 Align ByteAlignment)
override;
346 void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
347 Align ByteAlignment)
override;
349 void emitZerofill(MCSection *Section, MCSymbol *Symbol =
nullptr,
350 uint64_t
Size = 0, Align ByteAlignment =
Align(1),
351 SMLoc Loc = SMLoc())
override;
353 void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t
Size,
354 Align ByteAlignment =
Align(1))
override;
356 void emitBinaryData(StringRef
Data)
override;
358 void emitBytes(StringRef
Data)
override;
360 void emitValueImpl(
const MCExpr *
Value,
unsigned Size,
361 SMLoc Loc = SMLoc())
override;
362 void emitIntValue(uint64_t
Value,
unsigned Size)
override;
363 void emitIntValueInHex(uint64_t
Value,
unsigned Size)
override;
364 void emitIntValueInHexWithPadding(uint64_t
Value,
unsigned Size)
override;
366 void emitULEB128Value(
const MCExpr *
Value)
override;
368 void emitSLEB128Value(
const MCExpr *
Value)
override;
370 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
371 SMLoc Loc = SMLoc())
override;
373 void emitFill(
const MCExpr &NumValues, int64_t
Size, int64_t Expr,
374 SMLoc Loc = SMLoc())
override;
376 void emitAlignmentDirective(uint64_t ByteAlignment,
377 std::optional<int64_t>
Value,
unsigned ValueSize,
378 unsigned MaxBytesToEmit);
380 void emitValueToAlignment(Align Alignment, int64_t Fill = 0,
382 unsigned MaxBytesToEmit = 0)
override;
384 void emitCodeAlignment(Align Alignment,
const MCSubtargetInfo &STI,
385 unsigned MaxBytesToEmit = 0)
override;
386 void emitPrefAlign(Align Alignment,
const MCSymbol &End,
bool EmitNops,
387 uint8_t Fill,
const MCSubtargetInfo &STI)
override;
389 void emitValueToOffset(
const MCExpr *
Offset,
393 void emitFileDirective(StringRef
Filename)
override;
394 void emitFileDirective(StringRef
Filename, StringRef CompilerVersion,
395 StringRef TimeStamp, StringRef Description)
override;
396 Expected<unsigned> tryEmitDwarfFileDirective(
397 unsigned FileNo, StringRef Directory, StringRef
Filename,
398 std::optional<MD5::MD5Result> Checksum = std::nullopt,
399 std::optional<StringRef> Source = std::nullopt,
400 unsigned CUID = 0)
override;
401 void emitDwarfFile0Directive(StringRef Directory, StringRef
Filename,
402 std::optional<MD5::MD5Result> Checksum,
403 std::optional<StringRef> Source,
404 unsigned CUID = 0)
override;
405 void emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
unsigned Column,
406 unsigned Flags,
unsigned Isa,
407 unsigned Discriminator, StringRef FileName,
408 StringRef Location = {})
override;
409 void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
override;
413 void emitDwarfLocDirectiveWithInlinedAt(
unsigned FileNo,
unsigned Line,
414 unsigned Column,
unsigned FileIA,
415 unsigned LineIA,
unsigned ColIA,
416 const MCSymbol *Sym,
unsigned Flags,
417 unsigned Isa,
unsigned Discriminator,
419 StringRef Comment = {})
override;
421 MCSymbol *getDwarfLineTableSymbol(
unsigned CUID)
override;
423 bool emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
424 ArrayRef<uint8_t> Checksum,
425 unsigned ChecksumKind)
override;
426 bool emitCVFuncIdDirective(
unsigned FuncId)
override;
427 bool emitCVInlineSiteIdDirective(
unsigned FunctionId,
unsigned IAFunc,
428 unsigned IAFile,
unsigned IALine,
429 unsigned IACol, SMLoc Loc)
override;
430 void emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
unsigned Line,
431 unsigned Column,
bool PrologueEnd,
bool IsStmt,
432 StringRef FileName, SMLoc Loc)
override;
433 void emitCVLinetableDirective(
unsigned FunctionId,
const MCSymbol *FnStart,
434 const MCSymbol *FnEnd)
override;
435 void emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
436 unsigned SourceFileId,
437 unsigned SourceLineNum,
438 const MCSymbol *FnStartSym,
439 const MCSymbol *FnEndSym)
override;
441 void PrintCVDefRangePrefix(
442 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
444 void emitCVDefRangeDirective(
445 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
446 codeview::DefRangeRegisterRelHeader DRHdr)
override;
448 void emitCVDefRangeDirective(
449 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
450 codeview::DefRangeSubfieldRegisterHeader DRHdr)
override;
452 void emitCVDefRangeDirective(
453 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
454 codeview::DefRangeRegisterHeader DRHdr)
override;
456 void emitCVDefRangeDirective(
457 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
458 codeview::DefRangeFramePointerRelHeader DRHdr)
override;
460 void emitCVDefRangeDirective(
461 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
462 codeview::DefRangeRegisterRelIndirHeader DRHdr)
override;
464 void emitCVStringTableDirective()
override;
465 void emitCVFileChecksumsDirective()
override;
466 void emitCVFileChecksumOffsetDirective(
unsigned FileNo)
override;
467 void emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L)
override;
469 void emitIdent(StringRef IdentString)
override;
470 void emitCFIBKeyFrame()
override;
471 void emitCFIMTETaggedFrame()
override;
472 void emitCFISections(
bool EH,
bool Debug,
bool SFrame)
override;
473 void emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
474 void emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc)
override;
475 void emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc)
override;
478 void emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
479 void emitCFIPersonality(
const MCSymbol *Sym,
unsigned Encoding)
override;
480 void emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding)
override;
481 void emitCFIRememberState(SMLoc Loc)
override;
482 void emitCFIRestoreState(SMLoc Loc)
override;
483 void emitCFIRestore(int64_t
Register, SMLoc Loc)
override;
484 void emitCFISameValue(int64_t
Register, SMLoc Loc)
override;
485 void emitCFIRelOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
486 void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc)
override;
487 void emitCFIEscape(StringRef
Values, SMLoc Loc)
override;
488 void emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc)
override;
489 void emitCFISignalFrame()
override;
490 void emitCFIUndefined(int64_t
Register, SMLoc Loc)
override;
491 void emitCFIRegister(int64_t Register1, int64_t Register2,
493 void emitCFIWindowSave(SMLoc Loc)
override;
494 void emitCFINegateRAState(SMLoc Loc)
override;
495 void emitCFINegateRAStateWithPC(SMLoc Loc)
override;
496 void emitCFILLVMSetRAState(
unsigned State, MCSymbol *PACSym,
498 void emitCFILLVMSetRAState(
unsigned State, int64_t
Offset,
500 void emitCFIReturnColumn(int64_t
Register)
override;
501 void emitCFILLVMRegisterPair(int64_t
Register, int64_t R1, int64_t R1Size,
502 int64_t
R2, int64_t R2Size, SMLoc Loc)
override;
503 void emitCFILLVMVectorRegisters(
506 void emitCFILLVMVectorOffset(int64_t
Register, int64_t RegisterSize,
507 int64_t MaskRegister, int64_t MaskRegisterSize,
508 int64_t
Offset, SMLoc Loc)
override;
509 void emitCFILLVMVectorRegisterMask(int64_t
Register, int64_t SpillRegister,
510 int64_t SpillRegisterLaneSizeInBits,
511 int64_t MaskRegister,
512 int64_t MaskRegisterSizeInBits,
515 void emitCFILabelDirective(SMLoc Loc, StringRef Name)
override;
516 void emitCFIValOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
518 void emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc)
override;
519 void emitWinCFIEndProc(SMLoc Loc)
override;
520 void emitWinCFIFuncletOrFuncEnd(SMLoc Loc)
override;
521 void emitWinCFISplitChained(SMLoc Loc)
override;
522 void emitWinCFIPushReg(MCRegister
Register, SMLoc Loc)
override;
523 void emitWinCFIPush2Regs(MCRegister Reg1, MCRegister Reg2,
527 void emitWinCFIAllocStack(
unsigned Size, SMLoc Loc)
override;
532 void emitWinCFIPushFrame(
bool Code, SMLoc Loc)
override;
533 void emitWinCFIEndProlog(SMLoc Loc)
override;
534 void emitWinCFIBeginEpilogue(SMLoc Loc)
override;
535 void emitWinCFIEndEpilogue(SMLoc Loc)
override;
536 void emitWinCFIUnwindV2Start(SMLoc Loc)
override;
537 void emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc)
override;
539 void emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
bool Except,
541 void emitWinEHHandlerData(SMLoc Loc)
override;
543 void emitCGProfileEntry(
const MCSymbolRefExpr *From,
544 const MCSymbolRefExpr *To, uint64_t
Count)
override;
546 void emitInstruction(
const MCInst &Inst,
const MCSubtargetInfo &STI)
override;
548 void emitPseudoProbe(uint64_t
Guid, uint64_t Index, uint64_t
Type,
549 uint64_t Attr, uint64_t Discriminator,
551 MCSymbol *FnSym)
override;
553 void emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
554 const MCExpr *Expr, SMLoc Loc)
override;
556 void emitAddrsig()
override;
557 void emitAddrsigSym(
const MCSymbol *Sym)
override;
562 void emitRawTextImpl(StringRef
String)
override;
564 void finishImpl()
override;
566 void emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment)
override;
568 MCSymbol *emitDwarfUnitLength(
const Twine &Prefix,
569 const Twine &Comment)
override;
571 void emitDwarfLineStartLabel(MCSymbol *StartSym)
override;
573 void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
574 MCSymbol *EndLabel =
nullptr)
override;
576 void emitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
577 const MCSymbol *Label,
578 unsigned PointerSize)
override;
583void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
584 if (!IsVerboseAsm)
return;
586 T.toVector(CommentToEmit);
589 CommentToEmit.push_back(
'\n');
592void MCAsmStreamer::EmitCommentsAndEOL() {
593 if (CommentToEmit.empty() && CommentStream.GetNumBytesInBuffer() == 0) {
601 "Comment array not newline terminated");
605 size_t Position = Comments.
find(
'\n');
608 Comments = Comments.
substr(Position+1);
609 }
while (!Comments.
empty());
611 CommentToEmit.clear();
615 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
616 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
619void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
626void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
631 ExplicitCommentToEmit.
append(
"\t");
636 size_t p = 2, len = c.
size() - 2;
640 ExplicitCommentToEmit.
append(
"\t");
645 ExplicitCommentToEmit.
append(
"\n");
649 ExplicitCommentToEmit.
append(
"\t");
651 }
else if (c.
front() ==
'#') {
653 ExplicitCommentToEmit.
append(
"\t");
657 assert(
false &&
"Unexpected Assembly Comment");
659 if (c.
back() ==
'\n')
660 emitExplicitComments();
663void MCAsmStreamer::emitExplicitComments() {
664 StringRef Comments = ExplicitCommentToEmit;
665 if (!Comments.
empty())
667 ExplicitCommentToEmit.
clear();
670void MCAsmStreamer::switchSection(
MCSection *Section, uint32_t Subsection) {
672 if (!EmittedSectionDirective ||
674 EmittedSectionDirective =
true;
676 TS->changeSection(Cur.first, Section, Subsection, OS);
685bool MCAsmStreamer::popSection() {
688 auto [Sec, Subsec] = getCurrentSection();
693void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
695 bool KeepOriginalSym) {
697 OriginalSym->
print(OS, MAI);
699 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
709 if (!
Symbol->isVariable() &&
724 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
725 assert(str !=
"" &&
"Invalid LOH name");
739void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
740 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
743void MCAsmStreamer::emitSubsectionsViaSymbols() {
744 OS <<
".subsections_via_symbols\n";
748 assert(!
Options.empty() &&
"At least one option is required!");
749 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
751 OS <<
", " <<
'"' << Opt <<
'"';
780 if (SDKVersion.
empty())
782 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
783 if (
auto Minor = SDKVersion.
getMinor()) {
784 OS <<
", " << *Minor;
786 OS <<
", " << *Subminor;
792 unsigned Minor,
unsigned Update,
796 OS <<
", " << Update;
803#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
805 case MachO::PLATFORM_##platform: \
807#include "llvm/BinaryFormat/MachO.def"
812void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
813 unsigned Minor,
unsigned Update,
816 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
818 OS <<
", " << Update;
823void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
824 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
826 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
834 OS << (UseSet ?
", " :
" = ");
841void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
843 OS <<
".lto_set_conditional ";
850void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
852 Alias->
print(OS, MAI);
858bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
875 default:
return false;
898 OS <<
"\t.no_dead_strip\t";
903 OS <<
"\t.private_extern\t";
912 OS <<
"\t.weak_definition\t";
929 OS <<
"\t.weak_anti_dep\t";
939void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
940 OS <<
".desc" <<
' ';
942 OS <<
',' << DescValue;
947 OS <<
"\t." << Syntax <<
"_syntax";
953void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
960void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
965void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
966 OS <<
"\t.type\t" <<
Type <<
';';
970void MCAsmStreamer::endCOFFSymbolDef() {
975void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
976 OS <<
"\t.safeseh\t";
981void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
987void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
993void MCAsmStreamer::emitCOFFSecRel32(
MCSymbol const *Symbol, uint64_t
Offset) {
994 OS <<
"\t.secrel32\t";
1001void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
1011void MCAsmStreamer::emitCOFFSecNumber(
MCSymbol const *Symbol) {
1012 OS <<
"\t.secnum\t";
1017void MCAsmStreamer::emitCOFFSecOffset(
MCSymbol const *Symbol) {
1018 OS <<
"\t.secoffset\t";
1026void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
1031 "We only support writing log base-2 alignment format with XCOFF.");
1034 LabelSym->
print(OS, MAI);
1035 OS <<
',' <<
Size <<
',';
1036 CsectSym->
print(OS, MAI);
1037 OS <<
',' <<
Log2(Alignment);
1044 if (XSym->hasRename())
1045 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1048void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
1059 OS <<
"\t.extern\t";
1062 OS <<
"\t.lglobl\t";
1070 switch (Visibility) {
1090 if (Sym.hasRename())
1091 emitXCOFFRenameDirective(&Sym, Sym.getSymbolTableName());
1094void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *Name,
1096 OS <<
"\t.rename\t";
1097 Name->print(OS, MAI);
1098 const char DQ =
'"';
1100 for (
char C : Rename) {
1110void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
1116void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
1120 unsigned FunctionSize,
1122 OS <<
"\t.except\t";
1124 OS <<
", " << Lang <<
", " << Reason;
1129 const char InfoDirective[] =
"\t.info ";
1130 const char *Separator =
", ";
1131 constexpr int WordSize =
sizeof(uint32_t);
1134 OS << InfoDirective;
1135 PrintQuotedString(Name, OS);
1138 size_t MetadataSize =
Metadata.size();
1141 OS <<
format_hex(MetadataSize, 10) << Separator;
1144 if (MetadataSize == 0) {
1154 uint32_t PaddedSize =
alignTo(MetadataSize, WordSize);
1155 uint32_t PaddingSize = PaddedSize - MetadataSize;
1162 constexpr int WordsPerDirective = 5;
1165 int WordsBeforeNextDirective = 0;
1166 auto PrintWord = [&](
const uint8_t *WordPtr) {
1167 if (WordsBeforeNextDirective-- == 0) {
1169 OS << InfoDirective;
1170 WordsBeforeNextDirective = WordsPerDirective;
1178 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1179 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) + Index);
1184 assert(PaddedSize - Index == WordSize);
1185 std::array<uint8_t, WordSize> LastWord = {0};
1186 ::memcpy(LastWord.data(),
Metadata.data() + Index, MetadataSize - Index);
1187 PrintWord(LastWord.data());
1201void MCAsmStreamer::emitCommonSymbol(
MCSymbol *Symbol, uint64_t
Size,
1202 Align ByteAlignment) {
1210 OS <<
',' <<
Log2(ByteAlignment);
1217 if (XSym && XSym->hasRename())
1218 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1222void MCAsmStreamer::emitLocalCommonSymbol(
MCSymbol *Symbol, uint64_t
Size,
1228 if (ByteAlign > 1) {
1233 OS <<
',' << ByteAlign.
value();
1236 OS <<
',' <<
Log2(ByteAlign);
1253 ".zerofill is a Mach-O specific directive");
1263 OS <<
',' <<
Log2(ByteAlignment);
1278 ".zerofill is a Mach-O specific directive");
1287 if (ByteAlignment > 1)
1288 OS <<
", " <<
Log2(ByteAlignment);
1294 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1295 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1306 assert(!
Data.empty() &&
"Cannot generate an empty list.");
1307 const auto printCharacterInOctal = [&OS](
unsigned char C) {
1313 const auto printOneCharacterFor = [printCharacterInOctal](
1314 auto printOnePrintingCharacter) {
1315 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1317 printOnePrintingCharacter(
static_cast<char>(
C));
1320 printCharacterInOctal(
C);
1323 const auto printCharacterList = [
Data, &OS](
const auto &printOneCharacter) {
1324 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1325 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1326 printOneCharacter(
C);
1329 printOneCharacter(*(EndPtr - 1));
1333 printCharacterList(printCharacterInOctal);
1336 printCharacterList(printOneCharacterFor([&OS](
char C) {
1337 const char AsmCharLitBuf[2] = {
'\'',
C};
1338 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1349 for (
unsigned char C :
Data) {
1356 for (
unsigned char C :
Data) {
1357 if (
C ==
'"' ||
C ==
'\\') {
1358 OS <<
'\\' << (char)
C;
1397 assert(getCurrentSectionOnly() &&
1398 "Cannot emit contents before setting section!");
1399 if (
Data.empty())
return;
1406 if (
Data.back() == 0) {
1407 OS <<
"\t.string\t";
1412 PrintQuotedString(
Data, OS);
1432 PrintQuotedString(
Data, OS);
1437 if (
Data.size() != 1 && emitAsString(
Data))
1443 TS->emitRawBytes(
Data);
1447 for (
const unsigned char C :
Data.bytes()) {
1455 const size_t Cols = 4;
1456 for (
size_t I = 0, EI =
alignTo(
Data.size(), Cols);
I < EI;
I += Cols) {
1457 size_t J =
I, EJ = std::min(
I + Cols,
Data.size());
1460 for (; J < EJ - 1; ++J)
1461 OS <<
format(
"0x%02x", uint8_t(
Data[J])) <<
", ";
1467void MCAsmStreamer::emitIntValue(uint64_t
Value,
unsigned Size) {
1471void MCAsmStreamer::emitIntValueInHex(uint64_t
Value,
unsigned Size) {
1475void MCAsmStreamer::emitIntValueInHexWithPadding(uint64_t
Value,
1483 assert(getCurrentSectionOnly() &&
1484 "Cannot emit contents before setting section!");
1496 if (!
Value->evaluateAsAbsolute(IntValue))
1511 unsigned ByteOffset =
1512 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1513 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1517 uint64_t Shift = 64 - EmissionSize * 8;
1518 assert(Shift <
static_cast<uint64_t
>(
1519 std::numeric_limits<unsigned long long>::digits) &&
1520 "undefined behavior");
1521 ValueToEmit &= ~0ULL >> Shift;
1522 emitIntValue(ValueToEmit, EmissionSize);
1531 TS->emitValue(
Value);
1538void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1540 if (
Value->evaluateAsAbsolute(IntValue)) {
1541 emitULEB128IntValue(IntValue);
1544 OS <<
"\t.uleb128 ";
1549void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1551 if (
Value->evaluateAsAbsolute(IntValue)) {
1552 emitSLEB128IntValue(IntValue);
1555 OS <<
"\t.sleb128 ";
1560void MCAsmStreamer::emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
1562 int64_t IntNumBytes;
1563 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1564 if (IsAbsolute && IntNumBytes == 0)
1568 if (!MAI->
isAIX() || FillValue == 0) {
1570 OS << ZeroDirective;
1573 OS <<
',' << (int)FillValue;
1578 "Cannot emit non-absolute expression lengths of fill.");
1579 for (
int i = 0; i < IntNumBytes; ++i) {
1590void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1595 OS <<
", " <<
Size <<
", 0x";
1600void MCAsmStreamer::emitAlignmentDirective(uint64_t ByteAlignment,
1601 std::optional<int64_t>
Value,
1603 unsigned MaxBytesToEmit) {
1617 switch (ValueSize) {
1621 OS <<
"\t.p2align\t";
1635 if (
Value.has_value() || MaxBytesToEmit) {
1636 if (
Value.has_value()) {
1644 OS <<
", " << MaxBytesToEmit;
1652 switch (ValueSize) {
1654 case 1: OS <<
".balign";
break;
1655 case 2: OS <<
".balignw";
break;
1656 case 4: OS <<
".balignl";
break;
1661 if (
Value.has_value())
1663 else if (MaxBytesToEmit)
1666 OS <<
", " << MaxBytesToEmit;
1670void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t Fill,
1672 unsigned MaxBytesToEmit) {
1673 emitAlignmentDirective(Alignment.
value(), Fill, FillLen, MaxBytesToEmit);
1676void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1678 unsigned MaxBytesToEmit) {
1684 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1687void MCAsmStreamer::emitPrefAlign(
Align Alignment,
const MCSymbol &End,
1688 bool EmitNops, uint8_t Fill,
1690 OS <<
"\t.prefalign\t" <<
Log2(Alignment) <<
", ";
1695 OS <<
", " <<
static_cast<unsigned>(Fill);
1699void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1700 unsigned char Value,
1705 OS <<
", " << (unsigned)
Value;
1723 bool useTimeStamp = !TimeStamp.
empty();
1724 bool useCompilerVersion = !CompilerVersion.
empty();
1725 bool useDescription = !Description.
empty();
1726 if (useTimeStamp || useCompilerVersion || useDescription) {
1729 PrintQuotedString(TimeStamp, OS);
1730 if (useCompilerVersion || useDescription) {
1732 if (useCompilerVersion)
1733 PrintQuotedString(CompilerVersion, OS);
1734 if (useDescription) {
1736 PrintQuotedString(Description, OS);
1743void MCAsmStreamer::printDwarfFileDirective(
1745 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1749 if (!UseDwarfDirectory && !Directory.
empty()) {
1753 FullPathName = Directory;
1760 OS <<
"\t.file\t" << FileNo <<
' ';
1761 if (!Directory.
empty()) {
1762 PrintQuotedString(Directory, OS);
1767 OS <<
" md5 0x" << Checksum->digest();
1770 PrintQuotedString(*Source, OS);
1776 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1778 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1787 FileNo = FileNoOrErr.
get();
1796 printDwarfFileDirective(FileNo, Directory,
Filename, Checksum, Source,
1797 UseDwarfDirectory, OS1);
1800 TS->emitDwarfFileDirective(OS1.str());
1802 emitRawText(OS1.str());
1807void MCAsmStreamer::emitDwarfFile0Directive(
1809 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1825 printDwarfFileDirective(0, Directory,
Filename, Checksum, Source,
1826 UseDwarfDirectory, OS1);
1829 TS->emitDwarfFileDirective(OS1.str());
1831 emitRawText(OS1.str());
1835void MCAsmStreamer::emitDwarfLocDirectiveFlags(
unsigned Flags,
unsigned Isa,
1836 unsigned Discriminator) {
1841 OS <<
" basic_block";
1843 OS <<
" prologue_end";
1845 OS <<
" epilogue_begin";
1847 const unsigned OldFlags =
getContext().getCurrentDwarfLoc().getFlags();
1854 OS <<
" isa " << Isa;
1860void MCAsmStreamer::emitDwarfLocDirectiveSuffix(
unsigned FileNo,
unsigned Line,
1861 unsigned Column,
unsigned Flags,
1863 unsigned Discriminator,
1867 emitDwarfLocDirectiveFlags(Flags, Isa, Discriminator);
1874 OS << FileName <<
':' <<
Line <<
':' << Column;
1882 Discriminator, FileName, Comment);
1885void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1886 unsigned Column,
unsigned Flags,
1887 unsigned Isa,
unsigned Discriminator,
1897 Discriminator, FileName, Comment);
1902 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1905 emitDwarfLocDirectiveSuffix(FileNo, Line, Column, Flags, Isa, Discriminator,
1911void MCAsmStreamer::emitDwarfLocDirectiveWithInlinedAt(
1912 unsigned FileNo,
unsigned Line,
unsigned Column,
unsigned FileIA,
1913 unsigned LineIA,
unsigned ColIA,
const MCSymbol *Sym,
unsigned Flags,
1914 unsigned Isa,
unsigned Discriminator,
StringRef FileName,
1917 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1918 OS <<
", function_name " << *Sym;
1919 OS <<
", inlined_at " << FileIA <<
" " << LineIA <<
" " << ColIA;
1922 emitDwarfLocDirectiveSuffix(FileNo, Line, Column, Flags, Isa, Discriminator,
1928 OS <<
".loc_label\t" <<
Name;
1932MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1940 unsigned ChecksumKind) {
1945 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1948 if (!ChecksumKind) {
1954 PrintQuotedString(
toHex(Checksum), OS);
1961bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1962 OS <<
"\t.cv_func_id " << FuncId <<
'\n';
1966bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1969 unsigned IALine,
unsigned IACol,
1971 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1972 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1974 IALine, IACol,
Loc);
1977void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1978 unsigned Line,
unsigned Column,
1979 bool PrologueEnd,
bool IsStmt,
1985 OS <<
"\t.cv_loc\t" <<
FunctionId <<
" " << FileNo <<
" " <<
Line <<
" "
1988 OS <<
" prologue_end";
2001void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
2004 OS <<
"\t.cv_linetable\t" <<
FunctionId <<
", ";
2005 FnStart->
print(OS, MAI);
2007 FnEnd->
print(OS, MAI);
2012void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
2013 unsigned SourceFileId,
2014 unsigned SourceLineNum,
2017 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
2018 <<
' ' << SourceLineNum <<
' ';
2019 FnStartSym->
print(OS, MAI);
2021 FnEndSym->
print(OS, MAI);
2024 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
2027void MCAsmStreamer::PrintCVDefRangePrefix(
2028 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
2029 OS <<
"\t.cv_def_range\t";
2030 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
2038void MCAsmStreamer::emitCVDefRangeDirective(
2039 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2041 PrintCVDefRangePrefix(Ranges);
2042 OS <<
", reg_rel, ";
2048void MCAsmStreamer::emitCVDefRangeDirective(
2049 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2051 PrintCVDefRangePrefix(Ranges);
2052 OS <<
", subfield_reg, ";
2057void MCAsmStreamer::emitCVDefRangeDirective(
2058 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2060 PrintCVDefRangePrefix(Ranges);
2066void MCAsmStreamer::emitCVDefRangeDirective(
2067 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2069 PrintCVDefRangePrefix(Ranges);
2070 OS <<
", frame_ptr_rel, ";
2075void MCAsmStreamer::emitCVDefRangeDirective(
2076 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
2078 PrintCVDefRangePrefix(Ranges);
2079 OS <<
", reg_rel_indir, ";
2085void MCAsmStreamer::emitCVStringTableDirective() {
2086 OS <<
"\t.cv_stringtable";
2090void MCAsmStreamer::emitCVFileChecksumsDirective() {
2091 OS <<
"\t.cv_filechecksums";
2095void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
2096 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
2100void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
2101 OS <<
"\t.cv_fpo_data\t";
2102 ProcSym->
print(OS, MAI);
2106void MCAsmStreamer::emitIdent(
StringRef IdentString) {
2109 PrintQuotedString(IdentString, OS);
2113void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug,
bool SFrame) {
2115 OS <<
"\t.cfi_sections ";
2124 OS <<
".debug_frame";
2137 OS <<
"\t.cfi_startproc";
2145 OS <<
"\t.cfi_endproc";
2149void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
2155 if (std::optional<MCRegister> LLVMRegister =
2157 InstPrinter->printRegName(OS, *LLVMRegister);
2166 OS <<
"\t.cfi_def_cfa ";
2172void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
2174 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
2178void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
2181 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
2189 OS <<
"\t.cfi_escape ";
2191 size_t e =
Values.size() - 1;
2192 for (
size_t i = 0; i < e; ++i)
2204void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2207 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2216 OS <<
"\t.cfi_def_cfa_register ";
2223 OS <<
"\t.cfi_offset ";
2229void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *Sym,
2230 unsigned Encoding) {
2232 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2233 Sym->
print(OS, MAI);
2237void MCAsmStreamer::emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding) {
2239 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2240 Sym->
print(OS, MAI);
2244void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2246 OS <<
"\t.cfi_remember_state";
2250void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2252 OS <<
"\t.cfi_restore_state";
2258 OS <<
"\t.cfi_restore ";
2265 OS <<
"\t.cfi_same_value ";
2270void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2273 OS <<
"\t.cfi_rel_offset ";
2279void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2281 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2285void MCAsmStreamer::emitCFISignalFrame() {
2287 OS <<
"\t.cfi_signal_frame";
2293 OS <<
"\t.cfi_undefined ";
2298void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2301 OS <<
"\t.cfi_register ";
2302 EmitRegisterName(Register1);
2304 EmitRegisterName(Register2);
2308void MCAsmStreamer::emitCFILLVMRegisterPair(int64_t
Register, int64_t R1,
2309 int64_t R1Size, int64_t
R2,
2313 OS <<
"\t.cfi_llvm_register_pair ";
2316 EmitRegisterName(R1);
2317 OS <<
", " << R1Size <<
", ";
2318 EmitRegisterName(
R2);
2319 OS <<
", " << R2Size;
2323void MCAsmStreamer::emitCFILLVMVectorRegisters(
2328 OS <<
"\t.cfi_llvm_vector_registers ";
2330 for (
auto [
Reg, Lane,
Size] : VRs)
2331 OS <<
", " <<
Reg <<
", " << Lane <<
", " <<
Size;
2335void MCAsmStreamer::emitCFILLVMVectorOffset(int64_t
Register,
2336 int64_t RegisterSize,
2337 int64_t MaskRegister,
2338 int64_t MaskRegisterSize,
2343 OS <<
"\t.cfi_llvm_vector_offset ";
2345 OS <<
", " << RegisterSize <<
", ";
2346 EmitRegisterName(MaskRegister);
2347 OS <<
", " << MaskRegisterSize <<
", " <<
Offset;
2351void MCAsmStreamer::emitCFILLVMVectorRegisterMask(
2352 int64_t
Register, int64_t SpillRegister,
2353 int64_t SpillRegisterLaneSizeInBits, int64_t MaskRegister,
2354 int64_t MaskRegisterSizeInBits,
SMLoc Loc) {
2356 Register, SpillRegister, SpillRegisterLaneSizeInBits, MaskRegister,
2357 MaskRegisterSizeInBits,
Loc);
2359 OS <<
"\t.cfi_llvm_vector_register_mask ";
2362 EmitRegisterName(SpillRegister);
2363 OS <<
", " << SpillRegisterLaneSizeInBits <<
", ";
2364 EmitRegisterName(MaskRegister);
2365 OS <<
", " << MaskRegisterSizeInBits;
2369void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2371 OS <<
"\t.cfi_window_save";
2375void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2377 OS <<
"\t.cfi_negate_ra_state";
2381void MCAsmStreamer::emitCFINegateRAStateWithPC(
SMLoc Loc) {
2383 OS <<
"\t.cfi_negate_ra_state_with_pc";
2387void MCAsmStreamer::emitCFILLVMSetRAState(
unsigned State,
MCSymbol *PACSym,
2390 OS <<
"\t.cfi_set_ra_state " << State <<
", ";
2392 PACSym->
print(OS, MAI);
2398void MCAsmStreamer::emitCFILLVMSetRAState(
unsigned State, int64_t
Offset,
2401 OS <<
"\t.cfi_set_ra_state " << State <<
", " <<
Offset;
2405void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2407 OS <<
"\t.cfi_return_column ";
2414 OS <<
"\t.cfi_label " <<
Name;
2418void MCAsmStreamer::emitCFIBKeyFrame() {
2420 OS <<
"\t.cfi_b_key_frame";
2424void MCAsmStreamer::emitCFIMTETaggedFrame() {
2426 OS <<
"\t.cfi_mte_tagged_frame";
2430void MCAsmStreamer::emitCFIValOffset(int64_t
Register, int64_t
Offset,
2433 OS <<
"\t.cfi_val_offset ";
2439void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2447void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2450 OS <<
"\t.seh_endproc";
2454void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2457 OS <<
"\t.seh_endfunclet";
2461void MCAsmStreamer::emitWinCFISplitChained(
SMLoc Loc) {
2464 OS <<
"\t.seh_splitchained";
2468void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
2472 OS <<
"\t.seh_handler ";
2473 Sym->
print(OS, MAI);
2479 OS <<
", " << Marker <<
"unwind";
2481 OS <<
", " << Marker <<
"except";
2485void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2500 MCSection *XData = getAssociatedXDataSection(TextSec);
2501 switchSectionNoPrint(XData);
2503 OS <<
"\t.seh_handlerdata";
2510 OS <<
"\t.seh_pushreg ";
2511 InstPrinter->printRegName(OS,
Register);
2519 OS <<
"\t.seh_push2regs ";
2520 InstPrinter->printRegName(OS, Reg1);
2522 InstPrinter->printRegName(OS, Reg2);
2530 OS <<
"\t.seh_setframe ";
2531 InstPrinter->printRegName(OS,
Register);
2536void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2539 OS <<
"\t.seh_stackalloc " <<
Size;
2547 OS <<
"\t.seh_savereg ";
2548 InstPrinter->printRegName(OS,
Register);
2557 OS <<
"\t.seh_savexmm ";
2558 InstPrinter->printRegName(OS,
Register);
2563void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2566 OS <<
"\t.seh_pushframe";
2572void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2575 OS <<
"\t.seh_endprologue";
2579void MCAsmStreamer::emitWinCFIBeginEpilogue(
SMLoc Loc) {
2582 OS <<
"\t.seh_startepilogue";
2586void MCAsmStreamer::emitWinCFIEndEpilogue(
SMLoc Loc) {
2589 OS <<
"\t.seh_endepilogue";
2593void MCAsmStreamer::emitWinCFIUnwindV2Start(
SMLoc Loc) {
2596 OS <<
"\t.seh_unwindv2start";
2600void MCAsmStreamer::emitWinCFIUnwindVersion(uint8_t
Version,
SMLoc Loc) {
2603 OS <<
"\t.seh_unwindversion " << (unsigned)
Version;
2610 OS <<
"\t.cg_profile ";
2614 OS <<
", " <<
Count;
2618void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2620 if (LFIRewriter && LFIRewriter->rewriteInst(Inst, *
this, STI))
2624 MCSection *Sec = getCurrentSectionOnly();
2628 if (MAI->
isAIX() && CurFrag)
2634 addEncodingComment(Inst, STI);
2639 getCommentOS() <<
"\n";
2642 if(getTargetStreamer())
2643 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
2645 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
2648 if (Comments.
size() && Comments.
back() !=
'\n')
2649 getCommentOS() <<
"\n";
2654void MCAsmStreamer::emitPseudoProbe(uint64_t
Guid, uint64_t Index,
2655 uint64_t
Type, uint64_t Attr,
2656 uint64_t Discriminator,
2659 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2664 for (
const auto &Site : InlineStack)
2665 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2668 FnSym->
print(OS, MAI);
2685void MCAsmStreamer::emitAddrsig() {
2690void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *Sym) {
2691 OS <<
"\t.addrsig_sym ";
2692 Sym->
print(OS, MAI);
2700 String.consume_back(
"\n");
2705void MCAsmStreamer::finishImpl() {
2723 const auto &Tables =
getContext().getMCDwarfLineTables();
2724 if (!Tables.empty()) {
2725 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2726 if (
auto *Label = Tables.begin()->second.getLabel()) {
2727 switchSection(
getContext().getObjectFileInfo()->getDwarfLineSection(), 0);
2733void MCAsmStreamer::emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment) {
2745MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2746 const Twine &Comment) {
2754 return getContext().createTempSymbol(Prefix +
"_end");
2758void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2769 emitLabel(DebugLineSymTmp);
2773 unsigned LengthFieldSize =
2779 emitAssignment(StartSym, OuterSym);
2785void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2794 ".loc should not be generated together with raw data!");
2807 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, EndLabel,
2812void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2815 unsigned PointerSize) {
2817 ".loc/.file don't need raw data in debug line section!");
2820 AddComment(
"Set address to " +
Label->getName());
2821 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2822 emitULEB128IntValue(PointerSize + 1);
2823 emitIntValue(dwarf::DW_LNE_set_address, 1);
2824 emitSymbolValue(Label, PointerSize);
2828 AddComment(
"Start sequence");
2836 AddComment(
"End sequence");
2837 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2838 emitULEB128IntValue(1);
2839 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2844 AddComment(
"Advance line " +
Twine(LineDelta));
2845 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2846 emitSLEB128IntValue(LineDelta);
2847 emitIntValue(dwarf::DW_LNS_copy, 1);
2851 std::unique_ptr<formatted_raw_ostream> OS,
2852 std::unique_ptr<MCInstPrinter> IP,
2853 std::unique_ptr<MCCodeEmitter> CE,
2854 std::unique_ptr<MCAsmBackend> MAB) {
2855 return new MCAsmStreamer(Context, std::move(OS), std::move(IP), std::move(CE),
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#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)
LLVM_ABI Expected< unsigned > tryGetFile(StringRef &Directory, StringRef &FileName, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, uint16_t DwarfVersion, unsigned FileNumber=0)
const SmallVectorImpl< MCDwarfFile > & getMCDwarfFiles() const
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.
@ C
The default llvm calling convention, compatible with C.
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