47 std::unique_ptr<formatted_raw_ostream> OSOwner;
50 std::unique_ptr<MCInstPrinter> InstPrinter;
51 std::unique_ptr<MCAssembler> Assembler;
58 bool IsVerboseAsm =
false;
59 bool ShowInst =
false;
60 bool UseDwarfDirectory =
false;
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,
76 std::unique_ptr<MCAsmBackend> asmbackend)
78 MAI(Context.getAsmInfo()), InstPrinter(
printer),
81 (asmbackend) ? asmbackend->createObjectWriter(NullStream)
83 CommentStream(CommentToEmit) {
85 if (Assembler->getBackendPtr())
93 IsVerboseAsm = TO->AsmVerbose;
95 InstPrinter->setCommentStream(CommentStream);
96 ShowInst = TO->ShowMCInst;
97 switch (TO->MCUseDwarfDirectory) {
99 UseDwarfDirectory =
false;
102 UseDwarfDirectory =
true;
114 inline void EmitEOL() {
122 EmitCommentsAndEOL();
127 void EmitCommentsAndEOL();
130 bool isVerboseAsm()
const override {
return IsVerboseAsm; }
149 return CommentStream;
166 bool KeepOriginalSym)
override;
173 auto [
Ptr,
Bits] = InstPrinter->getMnemonic(
MI);
175 "Invalid char pointer for instruction with no mnemonic");
189 unsigned Minor,
unsigned Update,
221 unsigned Lang,
unsigned Reason,
222 unsigned FunctionSize,
bool hasDebug)
override;
227 Align ByteAlignment)
override;
235 Align ByteAlignment)
override;
273 void emitAlignmentDirective(
uint64_t ByteAlignment,
274 std::optional<int64_t>
Value,
unsigned ValueSize,
275 unsigned MaxBytesToEmit);
278 unsigned ValueSize = 1,
279 unsigned MaxBytesToEmit = 0)
override;
282 unsigned MaxBytesToEmit = 0)
override;
293 std::optional<MD5::MD5Result> Checksum = std::nullopt,
294 std::optional<StringRef> Source = std::nullopt,
295 unsigned CUID = 0)
override;
297 std::optional<MD5::MD5Result> Checksum,
298 std::optional<StringRef> Source,
299 unsigned CUID = 0)
override;
301 unsigned Flags,
unsigned Isa,
302 unsigned Discriminator,
310 unsigned ChecksumKind)
override;
313 unsigned IAFile,
unsigned IALine,
314 unsigned IACol,
SMLoc Loc)
override;
316 unsigned Column,
bool PrologueEnd,
bool IsStmt,
321 unsigned SourceFileId,
322 unsigned SourceLineNum,
326 void PrintCVDefRangePrefix(
327 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
330 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
334 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
338 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
342 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
415 std::optional<std::pair<bool, std::string>>
432 const Twine &Comment)
override;
437 MCSymbol *EndLabel =
nullptr)
override;
441 unsigned PointerSize)
override;
448void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
449 if (!IsVerboseAsm)
return;
451 T.toVector(CommentToEmit);
457void MCAsmStreamer::EmitCommentsAndEOL() {
466 "Comment array not newline terminated");
470 size_t Position = Comments.
find(
'\n');
473 Comments = Comments.
substr(Position+1);
474 }
while (!Comments.
empty());
476 CommentToEmit.
clear();
480 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
481 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
484void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
491void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
496 ExplicitCommentToEmit.
append(
"\t");
501 size_t p = 2, len = c.
size() - 2;
505 ExplicitCommentToEmit.
append(
"\t");
510 ExplicitCommentToEmit.
append(
"\n");
514 ExplicitCommentToEmit.
append(
"\t");
516 }
else if (c.
front() ==
'#') {
518 ExplicitCommentToEmit.
append(
"\t");
522 assert(
false &&
"Unexpected Assembly Comment");
524 if (c.
back() ==
'\n')
525 emitExplicitComments();
528void MCAsmStreamer::emitExplicitComments() {
529 StringRef Comments = ExplicitCommentToEmit;
530 if (!Comments.
empty())
532 ExplicitCommentToEmit.
clear();
537 TS->changeSection(getCurrentSection().first, Section, Subsection,
OS);
539 Section->printSwitchToSection(*MAI, getContext().getTargetTriple(),
OS,
545void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
547 bool KeepOriginalSym) {
551 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
570 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
571 assert(str !=
"" &&
"Invalid LOH name");
585void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
586 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
601 assert(!
Options.empty() &&
"At least one option is required!");
602 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
604 OS <<
", " <<
'"' << Opt <<
'"';
633 if (SDKVersion.
empty())
635 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
636 if (
auto Minor = SDKVersion.
getMinor()) {
637 OS <<
", " << *Minor;
639 OS <<
", " << *Subminor;
645 unsigned Minor,
unsigned Update,
649 OS <<
", " << Update;
656#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
658 case MachO::PLATFORM_##platform: \
660#include "llvm/BinaryFormat/MachO.def"
665void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
666 unsigned Minor,
unsigned Update,
669 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
671 OS <<
", " << Update;
676void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
677 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
679 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
682void MCAsmStreamer::emitThumbFunc(
MCSymbol *Func) {
685 OS <<
"\t.thumb_func";
697 if (
auto *E = dyn_cast<MCTargetExpr>(
Value))
698 if (E->inlineAssignedExpr())
712void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
714 OS <<
".lto_set_conditional ";
721void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
729bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
746 default:
return false;
769 OS <<
"\t.no_dead_strip\t";
774 OS <<
"\t.private_extern\t";
783 OS <<
"\t.weak_definition\t";
797 OS <<
"\t.weak_anti_dep\t";
807void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
808 OS <<
".desc" <<
' ';
810 OS <<
',' << DescValue;
814void MCAsmStreamer::emitSyntaxDirective() {
816 OS <<
"\t.intel_syntax noprefix";
824void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
831void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
836void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
837 OS <<
"\t.type\t" <<
Type <<
';';
841void MCAsmStreamer::endCOFFSymbolDef() {
846void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
847 OS <<
"\t.safeseh\t";
852void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
858void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
865 OS <<
"\t.secrel32\t";
872void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
885void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
890 "We only support writing log base-2 alignment format with XCOFF.");
896 OS <<
',' <<
Log2(Alignment);
907void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
929 switch (Visibility) {
949 if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
950 emitXCOFFRenameDirective(Symbol,
951 cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
954void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *
Name,
960 for (
char C : Rename) {
970void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
976void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
980 unsigned FunctionSize,
984 OS <<
", " << Lang <<
", " << Reason;
989 const char InfoDirective[] =
"\t.info ";
990 const char *Separator =
", ";
991 constexpr int WordSize =
sizeof(
uint32_t);
995 PrintQuotedString(
Name,
OS);
998 size_t MetadataSize =
Metadata.size();
1004 if (MetadataSize == 0) {
1015 uint32_t PaddingSize = PaddedSize - MetadataSize;
1022 constexpr int WordsPerDirective = 5;
1025 int WordsBeforeNextDirective = 0;
1026 auto PrintWord = [&](
const uint8_t *WordPtr) {
1027 if (WordsBeforeNextDirective-- == 0) {
1029 OS << InfoDirective;
1030 WordsBeforeNextDirective = WordsPerDirective;
1038 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1039 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) + Index);
1044 assert(PaddedSize - Index == WordSize);
1045 std::array<uint8_t, WordSize> LastWord = {0};
1046 ::memcpy(LastWord.data(),
Metadata.data() + Index, MetadataSize - Index);
1047 PrintWord(LastWord.data());
1062 Align ByteAlignment) {
1070 OS <<
',' <<
Log2(ByteAlignment);
1086 if (ByteAlign > 1) {
1091 OS <<
',' << ByteAlign.
value();
1094 OS <<
',' <<
Log2(ByteAlign);
1111 ".zerofill is a Mach-O specific directive");
1121 OS <<
',' <<
Log2(ByteAlignment);
1136 ".zerofill is a Mach-O specific directive");
1145 if (ByteAlignment > 1)
1146 OS <<
", " <<
Log2(ByteAlignment);
1152 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1153 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1157 return isPrint(Data.back()) || Data.back() == 0;
1164 assert(!Data.empty() &&
"Cannot generate an empty list.");
1165 const auto printCharacterInOctal = [&
OS](
unsigned char C) {
1171 const auto printOneCharacterFor = [printCharacterInOctal](
1172 auto printOnePrintingCharacter) {
1173 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1175 printOnePrintingCharacter(
static_cast<char>(
C));
1178 printCharacterInOctal(
C);
1181 const auto printCharacterList = [Data, &
OS](
const auto &printOneCharacter) {
1182 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1183 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1184 printOneCharacter(
C);
1187 printOneCharacter(*(EndPtr - 1));
1191 printCharacterList(printCharacterInOctal);
1194 printCharacterList(printOneCharacterFor([&
OS](
char C) {
1195 const char AsmCharLitBuf[2] = {
'\'',
C};
1196 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1207 for (
unsigned char C : Data) {
1214 for (
unsigned char C : Data) {
1215 if (
C ==
'"' ||
C ==
'\\') {
1254void MCAsmStreamer::emitBytes(
StringRef Data) {
1255 assert(getCurrentSectionOnly() &&
1256 "Cannot emit contents before setting section!");
1257 if (Data.empty())
return;
1259 const auto emitAsString = [
this](
StringRef Data) {
1264 Data = Data.substr(0, Data.size() - 1);
1272 "hasPairedDoubleQuoteStringConstants target must support "
1273 "PlainString Directive");
1275 "hasPairedDoubleQuoteStringConstants target must support ByteList "
1277 if (Data.back() == 0) {
1279 Data = Data.substr(0, Data.size() - 1);
1292 PrintQuotedString(Data,
OS);
1297 if (Data.size() != 1 && emitAsString(Data))
1303 TS->emitRawBytes(Data);
1307 for (
const unsigned char C : Data.bytes()) {
1313void MCAsmStreamer::emitBinaryData(
StringRef Data) {
1315 const size_t Cols = 4;
1316 for (
size_t I = 0, EI =
alignTo(Data.size(), Cols);
I < EI;
I += Cols) {
1317 size_t J =
I, EJ = std::min(
I + Cols, Data.size());
1320 for (; J < EJ - 1; ++J)
1335void MCAsmStreamer::emitIntValueInHexWithPadding(
uint64_t Value,
1343 assert(getCurrentSectionOnly() &&
1344 "Cannot emit contents before setting section!");
1356 if (!
Value->evaluateAsAbsolute(IntValue))
1371 unsigned ByteOffset =
1372 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1373 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1377 uint64_t Shift = 64 - EmissionSize * 8;
1379 std::numeric_limits<unsigned long long>::digits) &&
1380 "undefined behavior");
1381 ValueToEmit &= ~0ULL >> Shift;
1382 emitIntValue(ValueToEmit, EmissionSize);
1391 TS->emitValue(
Value);
1398void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1400 if (
Value->evaluateAsAbsolute(IntValue)) {
1401 emitULEB128IntValue(IntValue);
1404 OS <<
"\t.uleb128 ";
1409void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1411 if (
Value->evaluateAsAbsolute(IntValue)) {
1412 emitSLEB128IntValue(IntValue);
1415 OS <<
"\t.sleb128 ";
1420void MCAsmStreamer::emitDTPRel64Value(
const MCExpr *
Value) {
1427void MCAsmStreamer::emitDTPRel32Value(
const MCExpr *
Value) {
1434void MCAsmStreamer::emitTPRel64Value(
const MCExpr *
Value) {
1441void MCAsmStreamer::emitTPRel32Value(
const MCExpr *
Value) {
1448void MCAsmStreamer::emitGPRel64Value(
const MCExpr *
Value) {
1455void MCAsmStreamer::emitGPRel32Value(
const MCExpr *
Value) {
1462void MCAsmStreamer::emitFill(
const MCExpr &NumBytes,
uint64_t FillValue,
1464 int64_t IntNumBytes;
1465 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1466 if (IsAbsolute && IntNumBytes == 0)
1472 OS << ZeroDirective;
1475 OS <<
',' << (int)FillValue;
1480 "Cannot emit non-absolute expression lengths of fill.");
1481 for (
int i = 0; i < IntNumBytes; ++i) {
1492void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1493 int64_t Expr,
SMLoc Loc) {
1497 OS <<
", " <<
Size <<
", 0x";
1502void MCAsmStreamer::emitAlignmentDirective(
uint64_t ByteAlignment,
1503 std::optional<int64_t>
Value,
1505 unsigned MaxBytesToEmit) {
1519 switch (ValueSize) {
1523 OS <<
"\t.p2align\t";
1537 if (
Value.has_value() || MaxBytesToEmit) {
1538 if (
Value.has_value()) {
1546 OS <<
", " << MaxBytesToEmit;
1554 switch (ValueSize) {
1556 case 1:
OS <<
".balign";
break;
1557 case 2:
OS <<
".balignw";
break;
1558 case 4:
OS <<
".balignl";
break;
1563 if (
Value.has_value())
1565 else if (MaxBytesToEmit)
1568 OS <<
", " << MaxBytesToEmit;
1572void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t
Value,
1574 unsigned MaxBytesToEmit) {
1575 emitAlignmentDirective(Alignment.
value(),
Value, ValueSize, MaxBytesToEmit);
1578void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1580 unsigned MaxBytesToEmit) {
1586 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1589void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1590 unsigned char Value,
1599void MCAsmStreamer::emitFileDirective(
StringRef Filename) {
1602 PrintQuotedString(Filename,
OS);
1606void MCAsmStreamer::emitFileDirective(
StringRef Filename,
1612 PrintQuotedString(Filename,
OS);
1613 bool useTimeStamp = !TimeStamp.
empty();
1614 bool useCompilerVersion = !CompilerVersion.
empty();
1615 bool useDescription = !Description.
empty();
1616 if (useTimeStamp || useCompilerVersion || useDescription) {
1619 PrintQuotedString(TimeStamp,
OS);
1620 if (useCompilerVersion || useDescription) {
1622 if (useCompilerVersion)
1623 PrintQuotedString(CompilerVersion,
OS);
1624 if (useDescription) {
1626 PrintQuotedString(Description,
OS);
1633void MCAsmStreamer::printDwarfFileDirective(
1635 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1639 if (!UseDwarfDirectory && !Directory.
empty()) {
1643 FullPathName = Directory;
1650 OS <<
"\t.file\t" << FileNo <<
' ';
1651 if (!Directory.
empty()) {
1652 PrintQuotedString(Directory,
OS);
1655 PrintQuotedString(Filename,
OS);
1657 OS <<
" md5 0x" << Checksum->digest();
1660 PrintQuotedString(*Source,
OS);
1666 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1668 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1673 Table.
tryGetFile(Directory, Filename, Checksum, Source,
1677 FileNo = FileNoOrErr.
get();
1687 printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
1688 UseDwarfDirectory, OS1);
1691 TS->emitDwarfFileDirective(OS1.str());
1693 emitRawText(OS1.str());
1698void MCAsmStreamer::emitDwarfFile0Directive(
1700 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1707 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
1716 printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
1717 UseDwarfDirectory, OS1);
1720 TS->emitDwarfFileDirective(OS1.str());
1722 emitRawText(OS1.str());
1725void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1726 unsigned Column,
unsigned Flags,
1727 unsigned Isa,
unsigned Discriminator,
1736 Discriminator, FileName);
1740 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1743 OS <<
" basic_block";
1745 OS <<
" prologue_end";
1747 OS <<
" epilogue_begin";
1749 unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags();
1760 OS <<
" isa " << Isa;
1768 <<
Line <<
':' << Column;
1772 Discriminator, FileName);
1777 OS <<
".loc_label\t" <<
Name;
1781MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1787bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo,
StringRef Filename,
1789 unsigned ChecksumKind) {
1790 if (!getContext().getCVContext().addFile(*
this, FileNo, Filename, Checksum,
1794 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1795 PrintQuotedString(Filename,
OS);
1797 if (!ChecksumKind) {
1803 PrintQuotedString(toHex(Checksum),
OS);
1810bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1811 OS <<
"\t.cv_func_id " <<
FuncId <<
'\n';
1815bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1818 unsigned IALine,
unsigned IACol,
1820 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1821 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1823 IALine, IACol, Loc);
1826void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1827 unsigned Line,
unsigned Column,
1828 bool PrologueEnd,
bool IsStmt,
1831 if (!checkCVLocSection(
FunctionId, FileNo, Loc))
1837 OS <<
" prologue_end";
1850void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1861void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1862 unsigned SourceFileId,
1863 unsigned SourceLineNum,
1866 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1867 <<
' ' << SourceLineNum <<
' ';
1873 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1876void MCAsmStreamer::PrintCVDefRangePrefix(
1877 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1878 OS <<
"\t.cv_def_range\t";
1879 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
1887void MCAsmStreamer::emitCVDefRangeDirective(
1888 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1890 PrintCVDefRangePrefix(Ranges);
1891 OS <<
", reg_rel, ";
1897void MCAsmStreamer::emitCVDefRangeDirective(
1898 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1900 PrintCVDefRangePrefix(Ranges);
1901 OS <<
", subfield_reg, ";
1906void MCAsmStreamer::emitCVDefRangeDirective(
1907 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1909 PrintCVDefRangePrefix(Ranges);
1915void MCAsmStreamer::emitCVDefRangeDirective(
1916 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1918 PrintCVDefRangePrefix(Ranges);
1919 OS <<
", frame_ptr_rel, ";
1924void MCAsmStreamer::emitCVStringTableDirective() {
1925 OS <<
"\t.cv_stringtable";
1929void MCAsmStreamer::emitCVFileChecksumsDirective() {
1930 OS <<
"\t.cv_filechecksums";
1934void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1935 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1939void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
1940 OS <<
"\t.cv_fpo_data\t";
1945void MCAsmStreamer::emitIdent(
StringRef IdentString) {
1948 PrintQuotedString(IdentString,
OS);
1952void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug) {
1954 OS <<
"\t.cfi_sections ";
1958 OS <<
", .debug_frame";
1960 OS <<
".debug_frame";
1967 OS <<
"\t.cfi_startproc";
1975 OS <<
"\t.cfi_endproc";
1979void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1985 if (std::optional<MCRegister> LLVMRegister =
1987 InstPrinter->printRegName(
OS, *LLVMRegister);
1996 OS <<
"\t.cfi_def_cfa ";
2002void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
2004 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
2008void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
2011 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
2019 OS <<
"\t.cfi_escape ";
2020 if (!Values.
empty()) {
2021 size_t e = Values.
size() - 1;
2022 for (
size_t i = 0; i < e; ++i)
2034void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2037 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2044void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register,
SMLoc Loc) {
2046 OS <<
"\t.cfi_def_cfa_register ";
2053 OS <<
"\t.cfi_offset ";
2059void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *
Sym,
2060 unsigned Encoding) {
2062 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2063 Sym->print(
OS, MAI);
2067void MCAsmStreamer::emitCFILsda(
const MCSymbol *
Sym,
unsigned Encoding) {
2069 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2070 Sym->print(
OS, MAI);
2074void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2076 OS <<
"\t.cfi_remember_state";
2080void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2082 OS <<
"\t.cfi_restore_state";
2086void MCAsmStreamer::emitCFIRestore(int64_t
Register,
SMLoc Loc) {
2088 OS <<
"\t.cfi_restore ";
2093void MCAsmStreamer::emitCFISameValue(int64_t
Register,
SMLoc Loc) {
2095 OS <<
"\t.cfi_same_value ";
2100void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2103 OS <<
"\t.cfi_rel_offset ";
2109void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2111 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2115void MCAsmStreamer::emitCFISignalFrame() {
2117 OS <<
"\t.cfi_signal_frame";
2121void MCAsmStreamer::emitCFIUndefined(int64_t
Register,
SMLoc Loc) {
2123 OS <<
"\t.cfi_undefined ";
2128void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2131 OS <<
"\t.cfi_register ";
2132 EmitRegisterName(Register1);
2134 EmitRegisterName(Register2);
2138void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2140 OS <<
"\t.cfi_window_save";
2144void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2146 OS <<
"\t.cfi_negate_ra_state";
2150void MCAsmStreamer::emitCFINegateRAStateWithPC(
SMLoc Loc) {
2152 OS <<
"\t.cfi_negate_ra_state_with_pc";
2156void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2158 OS <<
"\t.cfi_return_column ";
2165 OS <<
"\t.cfi_label " <<
Name;
2169void MCAsmStreamer::emitCFIBKeyFrame() {
2171 OS <<
"\t.cfi_b_key_frame";
2175void MCAsmStreamer::emitCFIMTETaggedFrame() {
2177 OS <<
"\t.cfi_mte_tagged_frame";
2181void MCAsmStreamer::emitCFIValOffset(int64_t
Register, int64_t
Offset,
2184 OS <<
"\t.cfi_val_offset ";
2190void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2198void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2201 OS <<
"\t.seh_endproc";
2205void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2208 OS <<
"\t.seh_endfunclet";
2212void MCAsmStreamer::emitWinCFIStartChained(
SMLoc Loc) {
2215 OS <<
"\t.seh_startchained";
2219void MCAsmStreamer::emitWinCFIEndChained(
SMLoc Loc) {
2222 OS <<
"\t.seh_endchained";
2226void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *
Sym,
bool Unwind,
2227 bool Except,
SMLoc Loc) {
2230 OS <<
"\t.seh_handler ";
2231 Sym->print(
OS, MAI);
2233 const Triple &
T = getContext().getTargetTriple();
2237 OS <<
", " << Marker <<
"unwind";
2239 OS <<
", " << Marker <<
"except";
2243void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2258 MCSection *XData = getAssociatedXDataSection(TextSec);
2259 switchSectionNoPrint(XData);
2261 OS <<
"\t.seh_handlerdata";
2268 OS <<
"\t.seh_pushreg ";
2277 OS <<
"\t.seh_setframe ";
2283void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2286 OS <<
"\t.seh_stackalloc " <<
Size;
2294 OS <<
"\t.seh_savereg ";
2304 OS <<
"\t.seh_savexmm ";
2310void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2313 OS <<
"\t.seh_pushframe";
2319void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2322 OS <<
"\t.seh_endprologue";
2329 OS <<
"\t.cg_profile ";
2330 From->getSymbol().print(
OS, MAI);
2333 OS <<
", " << Count;
2337void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2344 if (!getAssembler().getEmitterPtr())
2347 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2354 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2357 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2360 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2361 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2362 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2363 assert(Index <
Code.size() * 8 &&
"Invalid offset in fixup!");
2364 FixupMap[
Index] = 1 + i;
2370 OS <<
"encoding: [";
2371 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2376 uint8_t MapEntry = FixupMap[i * 8 + 0];
2377 for (
unsigned j = 1;
j != 8; ++
j) {
2378 if (FixupMap[i * 8 + j] == MapEntry)
2385 if (MapEntry !=
uint8_t(~0U)) {
2386 if (MapEntry == 0) {
2392 <<
char(
'A' + MapEntry - 1) <<
'\'';
2394 OS <<
char(
'A' + MapEntry - 1);
2399 for (
unsigned j = 8;
j--;) {
2404 FixupBit = i * 8 + j;
2406 FixupBit = i * 8 + (7-
j);
2408 if (
uint8_t MapEntry = FixupMap[FixupBit]) {
2409 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2410 OS <<
char(
'A' + MapEntry - 1);
2418 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2421 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2422 OS <<
" fixup " <<
char(
'A' + i) <<
" - "
2423 <<
"offset: " <<
F.getOffset() <<
", value: ";
2424 F.getValue()->print(
OS, MAI);
2425 OS <<
", kind: " <<
Info.Name <<
"\n";
2429void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2437 AddEncodingComment(Inst, STI);
2441 Inst.
dump_pretty(getCommentOS(), InstPrinter.get(),
"\n ");
2442 getCommentOS() <<
"\n";
2445 if(getTargetStreamer())
2446 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI,
OS);
2448 InstPrinter->printInst(&Inst, 0,
"", STI,
OS);
2451 if (Comments.
size() && Comments.
back() !=
'\n')
2452 getCommentOS() <<
"\n";
2462 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2467 for (
const auto &Site : InlineStack)
2468 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2475void MCAsmStreamer::emitBundleAlignMode(
Align Alignment) {
2476 OS <<
"\t.bundle_align_mode " <<
Log2(Alignment);
2480void MCAsmStreamer::emitBundleLock(
bool AlignToEnd) {
2481 OS <<
"\t.bundle_lock";
2483 OS <<
" align_to_end";
2487void MCAsmStreamer::emitBundleUnlock() {
2488 OS <<
"\t.bundle_unlock";
2492std::optional<std::pair<bool, std::string>>
2504 return std::nullopt;
2507void MCAsmStreamer::emitAddrsig() {
2512void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *
Sym) {
2513 OS <<
"\t.addrsig_sym ";
2514 Sym->print(
OS, MAI);
2522 String.consume_back(
"\n");
2527void MCAsmStreamer::finishImpl() {
2529 if (getContext().getGenDwarfForAssembly())
2542 const auto &Tables = getContext().getMCDwarfLineTables();
2543 if (!Tables.empty()) {
2544 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2545 if (
auto *Label = Tables.begin()->second.getLabel()) {
2546 switchSection(getContext().getObjectFileInfo()->getDwarfLineSection());
2564MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2565 const Twine &Comment) {
2573 return getContext().createTempSymbol(Prefix +
"_end");
2577void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2588 emitLabel(DebugLineSymTmp);
2592 unsigned LengthFieldSize =
2598 emitAssignment(StartSym, OuterSym);
2604void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2613 ".loc should not be generated together with raw data!");
2626 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, EndLabel,
2631void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2634 unsigned PointerSize) {
2636 ".loc/.file don't need raw data in debug line section!");
2639 AddComment(
"Set address to " +
Label->getName());
2640 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2641 emitULEB128IntValue(PointerSize + 1);
2642 emitIntValue(dwarf::DW_LNE_set_address, 1);
2643 emitSymbolValue(Label, PointerSize);
2647 AddComment(
"Start sequence");
2655 AddComment(
"End sequence");
2656 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2657 emitULEB128IntValue(1);
2658 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2663 AddComment(
"Advance line " +
Twine(LineDelta));
2664 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2665 emitSLEB128IntValue(LineDelta);
2666 emitIntValue(dwarf::DW_LNS_copy, 1);
2669void MCAsmStreamer::doFinalizationAtSectionEnd(
MCSection *Section) {
2675 switchSectionNoPrint(Section);
2677 MCSymbol *
Sym = getCurrentSectionOnly()->getEndSymbol(getContext());
2679 if (!
Sym->isInSection())
2684 std::unique_ptr<formatted_raw_ostream>
OS,
2686 std::unique_ptr<MCCodeEmitter> &&CE,
2687 std::unique_ptr<MCAsmBackend> &&MAB) {
2688 return new MCAsmStreamer(Context, std::move(
OS), IP, std::move(CE),
unsigned const MachineRegisterInfo * MRI
BlockVerifier::State From
Analysis containing CSE Info
#define LLVM_LIKELY(EXPR)
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
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
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
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),...
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.
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
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 enableDwarfFileDirectoryDefault() 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
const MCTargetOptions * getTargetOptions() const
void setUseNamesOnTempLabels(bool Value)
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 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 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 emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
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 StringRef getMnemonic(const MCInst &MI) const
Returns the mnemonic for MI, if the streamer has access to a instruction printer and returns an empty...
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 emitCFILabelDirective(SMLoc Loc, StringRef Name)
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 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 emitCFIValOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitELFSymverDirective(const MCSymbol *OriginalSym, StringRef Name, bool KeepOriginalSym)
Emit an ELF .symver directive.
virtual void emitXCOFFCInfoSym(StringRef Name, StringRef Metadata)
Emit a C_INFO symbol with XCOFF embedded metadata to the .info section.
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 emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel, MCSymbol *EndLabel=nullptr)
Emit the debug line end entry.
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 changeSection(MCSection *, uint32_t)
This is called by popSection and switchSection, if the current section changes.
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).
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
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.
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.
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.
MCStreamer * createAsmStreamer(MCContext &Ctx, std::unique_ptr< formatted_raw_ostream > OS, 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,...
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.)
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
@ 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.
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