47 std::unique_ptr<formatted_raw_ostream> OSOwner;
50 std::unique_ptr<MCInstPrinter> InstPrinter;
51 std::unique_ptr<MCAssembler> Assembler;
58 unsigned IsVerboseAsm : 1;
59 unsigned ShowInst : 1;
60 unsigned UseDwarfDirectory : 1;
62 void EmitRegisterName(int64_t
Register);
64 void printDwarfFileDirective(
unsigned FileNo,
StringRef Directory,
66 std::optional<MD5::MD5Result> Checksum,
67 std::optional<StringRef> Source,
68 bool UseDwarfDirectory,
74 MCAsmStreamer(
MCContext &Context, std::unique_ptr<formatted_raw_ostream> os,
75 bool isVerboseAsm,
bool useDwarfDirectory,
77 std::unique_ptr<MCAsmBackend> asmbackend,
bool showInst)
82 (asmbackend) ? asmbackend->createObjectWriter(NullStream)
84 CommentStream(CommentToEmit), IsVerboseAsm(isVerboseAsm),
85 ShowInst(showInst), UseDwarfDirectory(useDwarfDirectory) {
88 InstPrinter->setCommentStream(CommentStream);
89 if (Assembler->getBackendPtr())
92 Context.setUseNamesOnTempLabels(
true);
98 inline void EmitEOL() {
106 EmitCommentsAndEOL();
111 void EmitCommentsAndEOL();
114 bool isVerboseAsm()
const override {
return IsVerboseAsm; }
133 return CommentStream;
150 bool KeepOriginalSym)
override;
157 return InstPrinter->getMnemonic(&
MI).first;
170 unsigned Minor,
unsigned Update,
202 unsigned Lang,
unsigned Reason,
203 unsigned FunctionSize,
bool hasDebug)
override;
208 Align ByteAlignment)
override;
216 Align ByteAlignment)
override;
254 void emitAlignmentDirective(
unsigned ByteAlignment,
255 std::optional<int64_t>
Value,
unsigned ValueSize,
256 unsigned MaxBytesToEmit);
259 unsigned ValueSize = 1,
260 unsigned MaxBytesToEmit = 0)
override;
263 unsigned MaxBytesToEmit = 0)
override;
274 std::optional<MD5::MD5Result> Checksum = std::nullopt,
275 std::optional<StringRef> Source = std::nullopt,
276 unsigned CUID = 0)
override;
278 std::optional<MD5::MD5Result> Checksum,
279 std::optional<StringRef> Source,
280 unsigned CUID = 0)
override;
282 unsigned Flags,
unsigned Isa,
283 unsigned Discriminator,
289 unsigned ChecksumKind)
override;
292 unsigned IAFile,
unsigned IALine,
293 unsigned IACol,
SMLoc Loc)
override;
295 unsigned Column,
bool PrologueEnd,
bool IsStmt,
300 unsigned SourceFileId,
301 unsigned SourceLineNum,
305 void PrintCVDefRangePrefix(
306 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
309 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
313 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
317 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
321 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
391 std::optional<std::pair<bool, std::string>>
408 const Twine &Comment)
override;
416 unsigned PointerSize)
override;
423void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
424 if (!IsVerboseAsm)
return;
426 T.toVector(CommentToEmit);
432void MCAsmStreamer::EmitCommentsAndEOL() {
441 "Comment array not newline terminated");
445 size_t Position = Comments.
find(
'\n');
448 Comments = Comments.
substr(Position+1);
449 }
while (!Comments.
empty());
451 CommentToEmit.
clear();
455 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
456 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
459void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
466void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
471 ExplicitCommentToEmit.
append(
"\t");
476 size_t p = 2, len = c.
size() - 2;
480 ExplicitCommentToEmit.
append(
"\t");
485 ExplicitCommentToEmit.
append(
"\n");
489 ExplicitCommentToEmit.
append(
"\t");
491 }
else if (c.
front() ==
'#') {
493 ExplicitCommentToEmit.
append(
"\t");
497 assert(
false &&
"Unexpected Assembly Comment");
499 if (c.
back() ==
'\n')
500 emitExplicitComments();
503void MCAsmStreamer::emitExplicitComments() {
504 StringRef Comments = ExplicitCommentToEmit;
505 if (!Comments.
empty())
507 ExplicitCommentToEmit.
clear();
510void MCAsmStreamer::changeSection(
MCSection *Section,
511 const MCExpr *Subsection) {
512 assert(Section &&
"Cannot switch to a null section!");
514 TS->changeSection(getCurrentSectionOnly(), Section, Subsection,
OS);
516 Section->printSwitchToSection(*MAI, getContext().getTargetTriple(),
OS,
521void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
523 bool KeepOriginalSym) {
527 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
546 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
547 assert(str !=
"" &&
"Invalid LOH name");
561void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
562 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
577 assert(!
Options.empty() &&
"At least one option is required!");
578 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
580 OS <<
", " <<
'"' << Opt <<
'"';
609 if (SDKVersion.
empty())
611 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
612 if (
auto Minor = SDKVersion.
getMinor()) {
613 OS <<
", " << *Minor;
615 OS <<
", " << *Subminor;
621 unsigned Minor,
unsigned Update,
625 OS <<
", " << Update;
632#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
634 case MachO::PLATFORM_##platform: \
636#include "llvm/BinaryFormat/MachO.def"
641void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
642 unsigned Minor,
unsigned Update,
645 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
647 OS <<
", " << Update;
652void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
653 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
655 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
658void MCAsmStreamer::emitThumbFunc(
MCSymbol *Func) {
661 OS <<
"\t.thumb_func";
673 if (
auto *
E = dyn_cast<MCTargetExpr>(
Value))
674 if (
E->inlineAssignedExpr())
688void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
690 OS <<
".lto_set_conditional ";
697void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
705bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
722 default:
return false;
745 OS <<
"\t.no_dead_strip\t";
750 OS <<
"\t.private_extern\t";
759 OS <<
"\t.weak_definition\t";
773 OS <<
"\t.weak_anti_dep\t";
783void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
784 OS <<
".desc" <<
' ';
786 OS <<
',' << DescValue;
790void MCAsmStreamer::emitSyntaxDirective() {
792 OS <<
"\t.intel_syntax noprefix";
800void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
807void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
812void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
813 OS <<
"\t.type\t" <<
Type <<
';';
817void MCAsmStreamer::endCOFFSymbolDef() {
822void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
823 OS <<
"\t.safeseh\t";
828void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
834void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
841 OS <<
"\t.secrel32\t";
848void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
861void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
866 "We only support writing log base-2 alignment format with XCOFF.");
872 OS <<
',' <<
Log2(Alignment);
883void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
905 switch (Visibility) {
925 if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
926 emitXCOFFRenameDirective(Symbol,
927 cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
930void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *
Name,
936 for (
char C : Rename) {
946void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
952void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
956 unsigned FunctionSize,
960 OS <<
", " << Lang <<
", " << Reason;
965 const char InfoDirective[] =
"\t.info ";
966 const char *Separator =
", ";
967 constexpr int WordSize =
sizeof(
uint32_t);
971 PrintQuotedString(
Name,
OS);
974 size_t MetadataSize =
Metadata.size();
980 if (MetadataSize == 0) {
991 uint32_t PaddingSize = PaddedSize - MetadataSize;
998 constexpr int WordsPerDirective = 5;
1001 int WordsBeforeNextDirective = 0;
1002 auto PrintWord = [&](
const uint8_t *WordPtr) {
1003 if (WordsBeforeNextDirective-- == 0) {
1005 OS << InfoDirective;
1006 WordsBeforeNextDirective = WordsPerDirective;
1014 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1015 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) +
Index);
1021 std::array<uint8_t, WordSize> LastWord = {0};
1023 PrintWord(LastWord.data());
1038 Align ByteAlignment) {
1046 OS <<
',' <<
Log2(ByteAlignment);
1062 if (ByteAlign > 1) {
1067 OS <<
',' << ByteAlign.
value();
1070 OS <<
',' <<
Log2(ByteAlign);
1081 assignFragment(Symbol, &
Section->getDummyFragment());
1087 ".zerofill is a Mach-O specific directive");
1097 OS <<
',' <<
Log2(ByteAlignment);
1107 assignFragment(Symbol, &
Section->getDummyFragment());
1109 assert(Symbol &&
"Symbol shouldn't be NULL!");
1113 ".zerofill is a Mach-O specific directive");
1122 if (ByteAlignment > 1)
1123 OS <<
", " <<
Log2(ByteAlignment);
1129 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1130 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1134 return isPrint(Data.back()) || Data.back() == 0;
1141 assert(!Data.empty() &&
"Cannot generate an empty list.");
1142 const auto printCharacterInOctal = [&
OS](
unsigned char C) {
1148 const auto printOneCharacterFor = [printCharacterInOctal](
1149 auto printOnePrintingCharacter) {
1150 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1152 printOnePrintingCharacter(
static_cast<char>(
C));
1155 printCharacterInOctal(
C);
1158 const auto printCharacterList = [Data, &
OS](
const auto &printOneCharacter) {
1159 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1160 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1161 printOneCharacter(
C);
1164 printOneCharacter(*(EndPtr - 1));
1168 printCharacterList(printCharacterInOctal);
1171 printCharacterList(printOneCharacterFor([&
OS](
char C) {
1172 const char AsmCharLitBuf[2] = {
'\'',
C};
1173 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1184 for (
unsigned char C : Data) {
1191 for (
unsigned char C : Data) {
1192 if (
C ==
'"' ||
C ==
'\\') {
1231void MCAsmStreamer::emitBytes(
StringRef Data) {
1232 assert(getCurrentSectionOnly() &&
1233 "Cannot emit contents before setting section!");
1234 if (Data.empty())
return;
1236 const auto emitAsString = [
this](
StringRef Data) {
1241 Data = Data.substr(0, Data.size() - 1);
1249 "hasPairedDoubleQuoteStringConstants target must support "
1250 "PlainString Directive");
1252 "hasPairedDoubleQuoteStringConstants target must support ByteList "
1254 if (Data.back() == 0) {
1256 Data = Data.substr(0, Data.size() - 1);
1269 PrintQuotedString(Data,
OS);
1274 if (Data.size() != 1 && emitAsString(Data))
1280 TS->emitRawBytes(Data);
1284 for (
const unsigned char C : Data.bytes()) {
1290void MCAsmStreamer::emitBinaryData(
StringRef Data) {
1292 const size_t Cols = 4;
1293 for (
size_t I = 0, EI =
alignTo(Data.size(), Cols);
I < EI;
I += Cols) {
1294 size_t J =
I, EJ = std::min(
I + Cols, Data.size());
1297 for (; J < EJ - 1; ++J)
1298 OS <<
format(
"0x%02x", uint8_t(Data[J])) <<
", ";
1299 OS <<
format(
"0x%02x", uint8_t(Data[J]));
1312void MCAsmStreamer::emitIntValueInHexWithPadding(
uint64_t Value,
1320 assert(getCurrentSectionOnly() &&
1321 "Cannot emit contents before setting section!");
1333 if (!
Value->evaluateAsAbsolute(IntValue))
1348 unsigned ByteOffset =
1349 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1350 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1354 uint64_t Shift = 64 - EmissionSize * 8;
1356 std::numeric_limits<unsigned long long>::digits) &&
1357 "undefined behavior");
1358 ValueToEmit &= ~0ULL >> Shift;
1359 emitIntValue(ValueToEmit, EmissionSize);
1368 TS->emitValue(
Value);
1375void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1377 if (
Value->evaluateAsAbsolute(IntValue)) {
1378 emitULEB128IntValue(IntValue);
1381 OS <<
"\t.uleb128 ";
1386void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1388 if (
Value->evaluateAsAbsolute(IntValue)) {
1389 emitSLEB128IntValue(IntValue);
1392 OS <<
"\t.sleb128 ";
1397void MCAsmStreamer::emitDTPRel64Value(
const MCExpr *
Value) {
1404void MCAsmStreamer::emitDTPRel32Value(
const MCExpr *
Value) {
1411void MCAsmStreamer::emitTPRel64Value(
const MCExpr *
Value) {
1418void MCAsmStreamer::emitTPRel32Value(
const MCExpr *
Value) {
1425void MCAsmStreamer::emitGPRel64Value(
const MCExpr *
Value) {
1432void MCAsmStreamer::emitGPRel32Value(
const MCExpr *
Value) {
1439void MCAsmStreamer::emitFill(
const MCExpr &NumBytes,
uint64_t FillValue,
1441 int64_t IntNumBytes;
1442 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1443 if (IsAbsolute && IntNumBytes == 0)
1449 OS << ZeroDirective;
1452 OS <<
',' << (int)FillValue;
1457 "Cannot emit non-absolute expression lengths of fill.");
1458 for (
int i = 0; i < IntNumBytes; ++i) {
1469void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1470 int64_t Expr,
SMLoc Loc) {
1474 OS <<
", " <<
Size <<
", 0x";
1479void MCAsmStreamer::emitAlignmentDirective(
unsigned ByteAlignment,
1480 std::optional<int64_t>
Value,
1482 unsigned MaxBytesToEmit) {
1496 switch (ValueSize) {
1500 OS <<
"\t.p2align\t";
1514 if (
Value.has_value() || MaxBytesToEmit) {
1515 if (
Value.has_value()) {
1523 OS <<
", " << MaxBytesToEmit;
1531 switch (ValueSize) {
1533 case 1:
OS <<
".balign";
break;
1534 case 2:
OS <<
".balignw";
break;
1535 case 4:
OS <<
".balignl";
break;
1540 if (
Value.has_value())
1542 else if (MaxBytesToEmit)
1545 OS <<
", " << MaxBytesToEmit;
1549void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t
Value,
1551 unsigned MaxBytesToEmit) {
1552 emitAlignmentDirective(Alignment.
value(),
Value, ValueSize, MaxBytesToEmit);
1555void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1557 unsigned MaxBytesToEmit) {
1563 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1566void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1567 unsigned char Value,
1576void MCAsmStreamer::emitFileDirective(
StringRef Filename) {
1579 PrintQuotedString(Filename,
OS);
1583void MCAsmStreamer::emitFileDirective(
StringRef Filename,
1589 PrintQuotedString(Filename,
OS);
1591 if (!CompilerVerion.
empty()) {
1592 PrintQuotedString(CompilerVerion,
OS);
1594 if (!TimeStamp.
empty()) {
1596 PrintQuotedString(TimeStamp,
OS);
1598 if (!Description.
empty()) {
1600 PrintQuotedString(Description,
OS);
1605void MCAsmStreamer::printDwarfFileDirective(
1607 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1611 if (!UseDwarfDirectory && !Directory.
empty()) {
1615 FullPathName = Directory;
1622 OS <<
"\t.file\t" << FileNo <<
' ';
1623 if (!Directory.
empty()) {
1624 PrintQuotedString(Directory,
OS);
1627 PrintQuotedString(Filename,
OS);
1629 OS <<
" md5 0x" << Checksum->digest();
1632 PrintQuotedString(*Source,
OS);
1638 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1640 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1645 Table.
tryGetFile(Directory, Filename, Checksum, Source,
1649 FileNo = FileNoOrErr.
get();
1659 printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
1660 UseDwarfDirectory, OS1);
1663 TS->emitDwarfFileDirective(OS1.str());
1665 emitRawText(OS1.str());
1670void MCAsmStreamer::emitDwarfFile0Directive(
1672 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1679 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
1688 printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
1689 UseDwarfDirectory, OS1);
1692 TS->emitDwarfFileDirective(OS1.str());
1694 emitRawText(OS1.str());
1697void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1698 unsigned Column,
unsigned Flags,
1699 unsigned Isa,
unsigned Discriminator,
1708 Discriminator, FileName);
1712 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1715 OS <<
" basic_block";
1717 OS <<
" prologue_end";
1719 OS <<
" epilogue_begin";
1721 unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags();
1732 OS <<
" isa " << Isa;
1740 <<
Line <<
':' << Column;
1744 Discriminator, FileName);
1747MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1753bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo,
StringRef Filename,
1755 unsigned ChecksumKind) {
1756 if (!getContext().getCVContext().addFile(*
this, FileNo, Filename, Checksum,
1760 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1761 PrintQuotedString(Filename,
OS);
1763 if (!ChecksumKind) {
1769 PrintQuotedString(toHex(Checksum),
OS);
1776bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1777 OS <<
"\t.cv_func_id " <<
FuncId <<
'\n';
1781bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1784 unsigned IALine,
unsigned IACol,
1786 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1787 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1789 IALine, IACol, Loc);
1792void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1793 unsigned Line,
unsigned Column,
1794 bool PrologueEnd,
bool IsStmt,
1797 if (!checkCVLocSection(
FunctionId, FileNo, Loc))
1803 OS <<
" prologue_end";
1816void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1827void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1828 unsigned SourceFileId,
1829 unsigned SourceLineNum,
1832 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1833 <<
' ' << SourceLineNum <<
' ';
1839 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1842void MCAsmStreamer::PrintCVDefRangePrefix(
1843 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1844 OS <<
"\t.cv_def_range\t";
1845 for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
1853void MCAsmStreamer::emitCVDefRangeDirective(
1854 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1856 PrintCVDefRangePrefix(Ranges);
1857 OS <<
", reg_rel, ";
1863void MCAsmStreamer::emitCVDefRangeDirective(
1864 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1866 PrintCVDefRangePrefix(Ranges);
1867 OS <<
", subfield_reg, ";
1872void MCAsmStreamer::emitCVDefRangeDirective(
1873 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1875 PrintCVDefRangePrefix(Ranges);
1881void MCAsmStreamer::emitCVDefRangeDirective(
1882 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1884 PrintCVDefRangePrefix(Ranges);
1885 OS <<
", frame_ptr_rel, ";
1890void MCAsmStreamer::emitCVStringTableDirective() {
1891 OS <<
"\t.cv_stringtable";
1895void MCAsmStreamer::emitCVFileChecksumsDirective() {
1896 OS <<
"\t.cv_filechecksums";
1900void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1901 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1905void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
1906 OS <<
"\t.cv_fpo_data\t";
1911void MCAsmStreamer::emitIdent(
StringRef IdentString) {
1914 PrintQuotedString(IdentString,
OS);
1918void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug) {
1920 OS <<
"\t.cfi_sections ";
1924 OS <<
", .debug_frame";
1926 OS <<
".debug_frame";
1933 OS <<
"\t.cfi_startproc";
1941 OS <<
"\t.cfi_endproc";
1945void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1951 if (std::optional<unsigned> LLVMRegister =
1953 InstPrinter->printRegName(
OS, *LLVMRegister);
1962 OS <<
"\t.cfi_def_cfa ";
1968void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
1970 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
1974void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
1977 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
1985 OS <<
"\t.cfi_escape ";
1986 if (!Values.
empty()) {
1987 size_t e = Values.
size() - 1;
1988 for (
size_t i = 0; i < e; ++i)
1989 OS <<
format(
"0x%02x", uint8_t(Values[i])) <<
", ";
1990 OS <<
format(
"0x%02x", uint8_t(Values[e]));
2000void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2003 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2010void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register,
SMLoc Loc) {
2012 OS <<
"\t.cfi_def_cfa_register ";
2019 OS <<
"\t.cfi_offset ";
2025void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *
Sym,
2026 unsigned Encoding) {
2028 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2029 Sym->print(
OS, MAI);
2033void MCAsmStreamer::emitCFILsda(
const MCSymbol *
Sym,
unsigned Encoding) {
2035 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2036 Sym->print(
OS, MAI);
2040void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2042 OS <<
"\t.cfi_remember_state";
2046void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2048 OS <<
"\t.cfi_restore_state";
2052void MCAsmStreamer::emitCFIRestore(int64_t
Register,
SMLoc Loc) {
2054 OS <<
"\t.cfi_restore ";
2059void MCAsmStreamer::emitCFISameValue(int64_t
Register,
SMLoc Loc) {
2061 OS <<
"\t.cfi_same_value ";
2066void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2069 OS <<
"\t.cfi_rel_offset ";
2075void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2077 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2081void MCAsmStreamer::emitCFISignalFrame() {
2083 OS <<
"\t.cfi_signal_frame";
2087void MCAsmStreamer::emitCFIUndefined(int64_t
Register,
SMLoc Loc) {
2089 OS <<
"\t.cfi_undefined ";
2094void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2097 OS <<
"\t.cfi_register ";
2098 EmitRegisterName(Register1);
2100 EmitRegisterName(Register2);
2104void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2106 OS <<
"\t.cfi_window_save";
2110void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2112 OS <<
"\t.cfi_negate_ra_state";
2116void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2118 OS <<
"\t.cfi_return_column ";
2123void MCAsmStreamer::emitCFIBKeyFrame() {
2125 OS <<
"\t.cfi_b_key_frame";
2129void MCAsmStreamer::emitCFIMTETaggedFrame() {
2131 OS <<
"\t.cfi_mte_tagged_frame";
2135void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2143void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2146 OS <<
"\t.seh_endproc";
2150void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2153 OS <<
"\t.seh_endfunclet";
2157void MCAsmStreamer::emitWinCFIStartChained(
SMLoc Loc) {
2160 OS <<
"\t.seh_startchained";
2164void MCAsmStreamer::emitWinCFIEndChained(
SMLoc Loc) {
2167 OS <<
"\t.seh_endchained";
2171void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *
Sym,
bool Unwind,
2172 bool Except,
SMLoc Loc) {
2175 OS <<
"\t.seh_handler ";
2176 Sym->print(
OS, MAI);
2178 const Triple &
T = getContext().getTargetTriple();
2182 OS <<
", " << Marker <<
"unwind";
2184 OS <<
", " << Marker <<
"except";
2188void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2203 MCSection *XData = getAssociatedXDataSection(TextSec);
2204 switchSectionNoChange(XData);
2206 OS <<
"\t.seh_handlerdata";
2213 OS <<
"\t.seh_pushreg ";
2222 OS <<
"\t.seh_setframe ";
2228void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2231 OS <<
"\t.seh_stackalloc " <<
Size;
2239 OS <<
"\t.seh_savereg ";
2249 OS <<
"\t.seh_savexmm ";
2255void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2258 OS <<
"\t.seh_pushframe";
2264void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2267 OS <<
"\t.seh_endprologue";
2274 OS <<
"\t.cg_profile ";
2275 From->getSymbol().print(
OS, MAI);
2278 OS <<
", " << Count;
2282void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2289 if (!getAssembler().getEmitterPtr())
2292 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2299 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2302 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2305 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2306 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2307 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2309 FixupMap[
Index] = 1 + i;
2315 OS <<
"encoding: [";
2316 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2321 uint8_t MapEntry = FixupMap[i * 8 + 0];
2322 for (
unsigned j = 1;
j != 8; ++
j) {
2323 if (FixupMap[i * 8 + j] == MapEntry)
2326 MapEntry = uint8_t(~0U);
2330 if (MapEntry != uint8_t(~0U)) {
2331 if (MapEntry == 0) {
2332 OS <<
format(
"0x%02x", uint8_t(Code[i]));
2336 OS <<
format(
"0x%02x", uint8_t(Code[i])) <<
'\''
2337 <<
char(
'A' + MapEntry - 1) <<
'\'';
2339 OS <<
char(
'A' + MapEntry - 1);
2344 for (
unsigned j = 8;
j--;) {
2349 FixupBit = i * 8 + j;
2351 FixupBit = i * 8 + (7-
j);
2353 if (uint8_t MapEntry = FixupMap[FixupBit]) {
2354 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2355 OS <<
char(
'A' + MapEntry - 1);
2363 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2366 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2367 OS <<
" fixup " <<
char(
'A' + i) <<
" - "
2368 <<
"offset: " <<
F.getOffset() <<
", value: ";
2369 F.getValue()->print(
OS, MAI);
2370 OS <<
", kind: " <<
Info.Name <<
"\n";
2374void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2376 assert(getCurrentSectionOnly() &&
2377 "Cannot emit contents before setting section!");
2385 AddEncodingComment(Inst, STI);
2389 Inst.
dump_pretty(getCommentOS(), InstPrinter.get(),
"\n ");
2390 getCommentOS() <<
"\n";
2393 if(getTargetStreamer())
2394 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI,
OS);
2396 InstPrinter->printInst(&Inst, 0,
"", STI,
OS);
2399 if (Comments.
size() && Comments.
back() !=
'\n')
2400 getCommentOS() <<
"\n";
2410 OS <<
"\t.pseudoprobe\t" << Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2415 for (
const auto &Site : InlineStack)
2416 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2423void MCAsmStreamer::emitBundleAlignMode(
Align Alignment) {
2424 OS <<
"\t.bundle_align_mode " <<
Log2(Alignment);
2428void MCAsmStreamer::emitBundleLock(
bool AlignToEnd) {
2429 OS <<
"\t.bundle_lock";
2431 OS <<
" align_to_end";
2435void MCAsmStreamer::emitBundleUnlock() {
2436 OS <<
"\t.bundle_unlock";
2440std::optional<std::pair<bool, std::string>>
2452 return std::nullopt;
2455void MCAsmStreamer::emitAddrsig() {
2460void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *
Sym) {
2461 OS <<
"\t.addrsig_sym ";
2462 Sym->print(
OS, MAI);
2476void MCAsmStreamer::finishImpl() {
2478 if (getContext().getGenDwarfForAssembly())
2491 const auto &Tables = getContext().getMCDwarfLineTables();
2492 if (!Tables.empty()) {
2493 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2494 if (
auto *Label = Tables.begin()->second.getLabel()) {
2495 switchSection(getContext().getObjectFileInfo()->getDwarfLineSection());
2513MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2514 const Twine &Comment) {
2522 return getContext().createTempSymbol(Prefix +
"_end");
2526void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2537 emitLabel(DebugLineSymTmp);
2541 unsigned LengthFieldSize =
2547 emitAssignment(StartSym, OuterSym);
2553void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2561 ".loc should not be generated together with raw data!");
2573 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, SectionEnd,
2578void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2581 unsigned PointerSize) {
2583 ".loc/.file don't need raw data in debug line section!");
2586 AddComment(
"Set address to " +
Label->getName());
2587 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2588 emitULEB128IntValue(PointerSize + 1);
2589 emitIntValue(dwarf::DW_LNE_set_address, 1);
2590 emitSymbolValue(Label, PointerSize);
2594 AddComment(
"Start sequence");
2602 AddComment(
"End sequence");
2603 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2604 emitULEB128IntValue(1);
2605 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2610 AddComment(
"Advance line " +
Twine(LineDelta));
2611 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2612 emitSLEB128IntValue(LineDelta);
2613 emitIntValue(dwarf::DW_LNS_copy, 1);
2616void MCAsmStreamer::doFinalizationAtSectionEnd(
MCSection *Section) {
2622 switchSectionNoChange(Section);
2624 MCSymbol *
Sym = getCurrentSectionOnly()->getEndSymbol(getContext());
2626 if (!
Sym->isInSection())
2631 std::unique_ptr<formatted_raw_ostream>
OS,
2632 bool isVerboseAsm,
bool useDwarfDirectory,
2634 std::unique_ptr<MCCodeEmitter> &&CE,
2635 std::unique_ptr<MCAsmBackend> &&MAB,
2637 return new MCAsmStreamer(
Context, std::move(
OS), isVerboseAsm,
2638 useDwarfDirectory, IP, std::move(CE), std::move(MAB),
unsigned const MachineRegisterInfo * MRI
BlockVerifier::State From
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Analysis containing CSE Info
#define LLVM_LIKELY(EXPR)
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
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
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallString class.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
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.
This class is intended to be used as a base class for asm properties and features specific to the tar...
const char * getPlainStringDirective() const
const char * getLabelSuffix() const
bool hasDotTypeDotSizeDirective() const
bool isLittleEndian() const
True if the target is little endian.
bool doesSupportDataRegionDirectives() const
const char * getTPRel64Directive() const
const char * getData32bitsDirective() const
bool hasFourStringsDotFile() const
unsigned getAssemblerDialect() const
unsigned getTextAlignFillValue() const
bool useDwarfRegNumForCFI() const
bool supportsExtendedDwarfLocDirective() const
const char * getData8bitsDirective() const
const char * getTPRel32Directive() const
const char * getData64bitsDirective() const
AsmCharLiteralSyntax characterLiteralSyntax() const
const char * getByteListDirective() const
const char * getCode16Directive() const
const char * getGPRel64Directive() const
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
StringRef getCommentString() const
const char * getAscizDirective() const
const char * getDTPRel64Directive() const
const char * getZeroDirective() const
const char * getWeakDirective() const
bool hasSubsectionsViaSymbols() const
const char * getData16bitsDirective() const
const char * getSeparatorString() const
bool getCOMMDirectiveAlignmentIsInBytes() const
bool hasPairedDoubleQuoteStringConstants() const
bool needsDwarfSectionSizeInHeader() const
const char * getGlobalDirective() const
const char * getCode32Directive() const
unsigned getCommentColumn() const
This indicates the column (zero-based) at which asm comments should be printed.
const char * getCode64Directive() const
bool hasSingleParameterDotFile() const
bool doesZeroDirectiveSupportNonZeroValue() const
const char * getAsciiDirective() const
AsmCharLiteralSyntax
Assembly character literal syntax types.
@ ACLS_SingleQuotePrefix
Unknown; character literals not used by LLVM for this target.
bool useDotAlignForAlignment() const
const char * getGPRel32Directive() const
const char * getWeakRefDirective() const
const char * getDTPRel32Directive() const
bool hasNoDeadStrip() const
bool usesDwarfFileAndLocDirectives() const
bool hasIdentDirective() const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
const MCAsmInfo * getAsmInfo() const
dwarf::DwarfFormat getDwarfFormat() const
static void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
static void make(MCStreamer *MCOS, MCSection *Section)
static void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
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.
void print(raw_ostream &OS, const MCAsmInfo *MAI, bool InParens=false) const
Encode information on a single operation to perform on a byte sequence (e.g., an encoded instruction)...
static void Emit(MCStreamer *MCOS)
This is an instance of a target assembly language printer that converts an MCInst to valid target ass...
Instances of this class represent a single low-level machine instruction.
void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ", const MCRegisterInfo *RegInfo=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...
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)
StringRef getName() const
Streaming machine code generation interface.
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
virtual void emitAddrsig()
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void addBlankLine()
Emit a blank line to a .s file to pretty it up.
virtual void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel)
Emit the debug line end entry.
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
virtual void finishImpl()
Streamer specific finalization.
virtual void emitDTPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (64-bit DTP relative) value.
virtual void emitCFIBKeyFrame()
virtual void beginCOFFSymbolDef(const MCSymbol *Symbol)
Start emitting COFF symbol definition.
virtual void emitSyntaxDirective()
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual StringRef getMnemonic(MCInst &MI)
Returns the mnemonic for MI, if the streamer has access to a instruction printer and returns an empty...
virtual void emitGNUAttribute(unsigned Tag, unsigned Value)
Emit a .gnu_attribute directive.
virtual raw_ostream & getCommentOS()
Return a raw_ostream that comments can be written to.
virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, SMLoc Loc=SMLoc())
virtual void emitBundleLock(bool AlignToEnd)
The following instructions are a bundle-locked group.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual void emitGPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a gprel64 (64-bit GP relative) value.
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
virtual bool emitSymbolAttribute(MCSymbol *Symbol, MCSymbolAttr Attribute)=0
Add the given Attribute to Symbol.
virtual bool emitCVFileDirective(unsigned FileNo, StringRef Filename, ArrayRef< uint8_t > Checksum, unsigned ChecksumKind)
Associate a filename with a specified logical file number, and also specify that file's checksum info...
virtual void emitCFIReturnColumn(int64_t Register)
virtual void emitCOFFSymbolType(int Type)
Emit the type of the symbol.
virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment)
Emit a unit length field.
virtual void emitCFIWindowSave(SMLoc Loc={})
virtual void emitCOFFSymbolIndex(MCSymbol const *Symbol)
Emits the symbol table index of a Symbol into the current section.
virtual void emitCVStringTableDirective()
This implements the CodeView '.cv_stringtable' assembler directive.
virtual bool hasRawTextSupport() const
Return true if this asm streamer supports emitting unformatted text to the .s file with EmitRawText.
virtual void emitIntValueInHex(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers & p...
virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName)
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
virtual bool isVerboseAsm() const
Return true if this streamer supports verbose assembly and if it is enabled.
virtual void emitCOFFImgRel32(MCSymbol const *Symbol, int64_t Offset)
Emits a COFF image relative relocation.
virtual void endCOFFSymbolDef()
Marks the end of the symbol definition.
virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc=SMLoc())
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
virtual void emitCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)=0
Emit a common symbol.
virtual MCAssembler * getAssemblerPtr()
virtual void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol, MCSymbolAttr Linkage, MCSymbolAttr Visibility)
Emit a symbol's linkage and visibility with a linkage directive for XCOFF.
virtual void emitCFIUndefined(int64_t Register, SMLoc Loc={})
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
virtual void emitCVFileChecksumOffsetDirective(unsigned FileNo)
This implements the CodeView '.cv_filechecksumoffset' assembler directive.
virtual void emitCFINegateRAState(SMLoc Loc={})
virtual void emitGPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a gprel32 (32-bit GP relative) value.
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
virtual void emitBundleUnlock()
Ends a bundle-locked group.
virtual Expected< unsigned > tryEmitDwarfFileDirective(unsigned FileNo, StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum=std::nullopt, std::optional< StringRef > Source=std::nullopt, unsigned CUID=0)
Associate a filename with a specified logical file number.
virtual void addExplicitComment(const Twine &T)
Add explicit comment T.
virtual void AddComment(const Twine &T, bool EOL=true)
Add a textual comment.
virtual void emitCVFPOData(const MCSymbol *ProcSym, SMLoc Loc={})
This implements the CodeView '.cv_fpo_data' assembler directive.
virtual void emitELFSize(MCSymbol *Symbol, const MCExpr *Value)
Emit an ELF .size directive.
virtual void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t Size, MCSymbol *CsectSym, Align Alignment)
Emits an lcomm directive with XCOFF csect information.
virtual void emitCFIMTETaggedFrame()
virtual void emitTPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a tprel (32-bit TP relative) value.
virtual void emitCOFFSecRel32(MCSymbol const *Symbol, uint64_t Offset)
Emits a COFF section relative relocation.
virtual void doFinalizationAtSectionEnd(MCSection *Section)
Do finalization for the streamer at the end of a section.
virtual void emitRawComment(const Twine &T, bool TabPrefix=true)
Print T and prefix it with the comment string (normally #) and optionally a tab.
virtual std::optional< std::pair< bool, std::string > > emitRelocDirective(const MCExpr &Offset, StringRef Name, const MCExpr *Expr, SMLoc Loc, const MCSubtargetInfo &STI)
Record a relocation described by the .reloc directive.
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
virtual void emitIdent(StringRef IdentString)
Emit the "identifiers" directive.
virtual void emitCVFileChecksumsDirective()
This implements the CodeView '.cv_filechecksums' assembler directive.
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
virtual void emitXCOFFExceptDirective(const MCSymbol *Symbol, const MCSymbol *Trap, unsigned Lang, unsigned Reason, unsigned FunctionSize, bool hasDebug)
Emit an XCOFF .except directive which adds information about a trap instruction to the object file ex...
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitCOFFSectionIndex(MCSymbol const *Symbol)
Emits a COFF section index.
void setAllowAutoPadding(bool v)
virtual void emitCFIRememberState(SMLoc Loc)
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
virtual void emitTPRel64Value(const MCExpr *Value)
Emit the expression Value into the output as a tprel (64-bit TP relative) value.
virtual void emitCFISections(bool EH, bool Debug)
virtual void emitIntValueInHexWithPadding(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers & p...
virtual void emitAssemblerFlag(MCAssemblerFlag Flag)
Note in the output the specified Flag.
virtual void emitDarwinTargetVariantBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
virtual void emitValueToAlignment(Align Alignment, int64_t Value=0, unsigned ValueSize=1, unsigned MaxBytesToEmit=0)
Emit some number of copies of Value until the byte alignment ByteAlignment is reached.
virtual void emitIntValue(uint64_t Value, unsigned Size)
Special case of EmitValue that avoids the client having to pass in a MCExpr for constant integers.
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitWinCFIEndChained(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
virtual void emitDwarfAdvanceLineAddr(int64_t LineDelta, const MCSymbol *LastLabel, const MCSymbol *Label, unsigned PointerSize)
If targets does not support representing debug line section by .loc/.file directives in assembly outp...
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
virtual void emitCodeAlignment(Align Alignment, const MCSubtargetInfo *STI, unsigned MaxBytesToEmit=0)
Emit nops until the byte alignment ByteAlignment is reached.
virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
virtual void emitSymbolDesc(MCSymbol *Symbol, unsigned DescValue)
Set the DescValue for the Symbol.
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
virtual void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t Size, Align ByteAlignment)
Emit a local common (.lcomm) symbol.
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
virtual void emitCOFFSafeSEH(MCSymbol const *Symbol)
virtual void 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 changeSection(MCSection *, const MCExpr *)
Update streamer for a new active section.
virtual void emitXCOFFRenameDirective(const MCSymbol *Name, StringRef Rename)
Emit a XCOFF .rename directive which creates a synonym for an illegal or undesirable name.
virtual void emitPseudoProbe(uint64_t Guid, uint64_t Index, uint64_t Type, uint64_t Attr, uint64_t Discriminator, const MCPseudoProbeInlineStack &InlineStack, MCSymbol *FnSym)
Emit the a pseudo probe into the current section.
virtual void emitCGProfileEntry(const MCSymbolRefExpr *From, const MCSymbolRefExpr *To, uint64_t Count)
virtual void emitDataRegion(MCDataRegionType Kind)
Note in the output the specified region Kind.
virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
virtual void emitULEB128Value(const MCExpr *Value)
virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc)
virtual void emitLinkerOptions(ArrayRef< std::string > Kind)
Emit the given list Options of strings as linker options into the output.
virtual void emitValueToOffset(const MCExpr *Offset, unsigned char Value, SMLoc Loc)
Emit some number of copies of Value until the byte offset Offset is reached.
virtual void emitExplicitComments()
Emit added explicit comments.
virtual void emitThumbFunc(MCSymbol *Func)
Note in the output that the specified Func is a Thumb mode function (ARM target only).
virtual void emitCFIRestoreState(SMLoc Loc)
virtual void emitXCOFFRefDirective(const MCSymbol *Symbol)
Emit a XCOFF .ref directive which creates R_REF type entry in the relocation table for one or more sy...
virtual void emitCVDefRangeDirective(ArrayRef< std::pair< const MCSymbol *, const MCSymbol * > > Ranges, StringRef FixedSizePortion)
This implements the CodeView '.cv_def_range' assembler directive.
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitDTPRel32Value(const MCExpr *Value)
Emit the expression Value into the output as a dtprel (32-bit DTP relative) value.
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
virtual void emitZerofill(MCSection *Section, MCSymbol *Symbol=nullptr, uint64_t Size=0, Align ByteAlignment=Align(1), SMLoc Loc=SMLoc())=0
Emit the zerofill section and an optional symbol.
virtual void emitCVLocDirective(unsigned FunctionId, unsigned FileNo, unsigned Line, unsigned Column, bool PrologueEnd, bool IsStmt, StringRef FileName, SMLoc Loc)
This implements the CodeView '.cv_loc' assembler directive.
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
virtual void emitFileDirective(StringRef Filename)
Switch to a new logical file.
virtual void emitSLEB128Value(const MCExpr *Value)
virtual void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym)
Emit an ELF .symver directive.
virtual void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata)
Emit a C_INFO symbol with XCOFF embedded metadata to the .info section.
virtual void emitValueImpl(const MCExpr *Value, unsigned Size, SMLoc Loc=SMLoc())
Emit the expression Value into the output as a native integer of the given Size bytes.
virtual void emitLOHDirective(MCLOHType Kind, const MCLOHArgs &Args)
Emit a Linker Optimization Hint (LOH) directive.
virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol, SMLoc Loc)
Introduces an inline call site id for use with .cv_loc.
virtual void emitCFISignalFrame()
virtual void emitVersionMin(MCVersionMinType Type, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Specify the Mach-O minimum deployment target version.
virtual void emitCOFFSymbolStorageClass(int StorageClass)
Emit the storage class of the symbol.
virtual void emitConditionalAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol, but only if Value is also emitted.
virtual void emitWinCFIStartChained(SMLoc Loc=SMLoc())
virtual void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t Size, Align ByteAlignment=Align(1))
Emit a thread local bss (.tbss) symbol.
virtual void emitCFIRestore(int64_t Register, SMLoc Loc={})
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
virtual void emitBundleAlignMode(Align Alignment)
Set the bundle alignment mode from now on in the section.
virtual void emitRawTextImpl(StringRef String)
EmitRawText - If this file is backed by an assembly streamer, this dumps the specified string in the ...
virtual void emitBytes(StringRef Data)
Emit the bytes in Data into the output.
virtual void emitAddrsigSym(const MCSymbol *Sym)
virtual void emitWeakReference(MCSymbol *Alias, const MCSymbol *Symbol)
Emit an weak reference from Alias to Symbol.
virtual void emitDwarfFile0Directive(StringRef Directory, StringRef Filename, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, unsigned CUID=0)
Specify the "root" file of the compilation, using the ".file 0" extension.
virtual void emitBuildVersion(unsigned Platform, unsigned Major, unsigned Minor, unsigned Update, VersionTuple SDKVersion)
Emit/Specify Mach-O build version command.
virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset, int64_t AddressSpace, SMLoc Loc={})
Generic base class for all target subtargets.
Represent a reference to a symbol from inside an expression.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
StringRef getSymbolTableName() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
StringRef getName() const
getName - Get the symbol name.
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
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 class consists of common code factored out of the SmallVector class to reduce code duplication b...
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
std::string str() const
str - 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).
constexpr bool empty() const
empty - Check if the string is empty.
char back() const
back - 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
size - Get the string size.
char front() const
front - Get the first character in the string.
bool startswith(StringRef Prefix) const
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.
bool equals(StringRef RHS) const
equals - Check for string equality, this is more efficient than compare() when the relative ordering ...
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.
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.
void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
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.
A raw_ostream that discards all output.
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.
size_t GetNumBytesInBuffer() const
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 Args[]
Key for Kernel::Metadata::mArgs.
@ C
The default llvm calling convention, compatible with C.
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
support::ulittle32_t Word
@ Emitted
Assigned address, still materializing.
NodeAddr< FuncNode * > Func
NodeAddr< CodeNode * > Code
uint32_t read32be(const void *P)
bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
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.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
static StringRef MCLOHDirectiveName()
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
unsigned Log2_32(uint32_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
constexpr bool isPowerOf2_32(uint32_t Value)
Return true if the argument is a power of two > 0.
@ MCVM_WatchOSVersionMin
.watchos_version_min
@ MCVM_OSXVersionMin
.macosx_version_min
@ MCVM_TvOSVersionMin
.tvos_version_min
@ MCVM_IOSVersionMin
.ios_version_min
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
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)
@ MCAF_SyntaxUnified
.syntax (ARM/ELF)
@ MCAF_Code64
.code64 (X86)
@ MCAF_Code16
.code16 (X86) / .code 16 (ARM)
@ MCAF_Code32
.code32 (X86) / .code 32 (ARM)
@ MCAF_SubsectionsViaSymbols
.subsections_via_symbols (MachO)
MCLOHType
Linker Optimization Hint Type.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
MCStreamer * createAsmStreamer(MCContext &Ctx, std::unique_ptr< formatted_raw_ostream > OS, bool isVerboseAsm, bool useDwarfDirectory, MCInstPrinter *InstPrint, std::unique_ptr< MCCodeEmitter > &&CE, std::unique_ptr< MCAsmBackend > &&TAB, bool ShowInst)
Create a machine code streamer which will print out assembly for the native target,...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
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.
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_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_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.
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