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 auto [
Ptr,
Bits] = InstPrinter->getMnemonic(&
MI);
159 "Invalid char pointer for instruction with no mnemonic");
173 unsigned Minor,
unsigned Update,
205 unsigned Lang,
unsigned Reason,
206 unsigned FunctionSize,
bool hasDebug)
override;
211 Align ByteAlignment)
override;
219 Align ByteAlignment)
override;
257 void emitAlignmentDirective(
unsigned ByteAlignment,
258 std::optional<int64_t>
Value,
unsigned ValueSize,
259 unsigned MaxBytesToEmit);
262 unsigned ValueSize = 1,
263 unsigned MaxBytesToEmit = 0)
override;
266 unsigned MaxBytesToEmit = 0)
override;
277 std::optional<MD5::MD5Result> Checksum = std::nullopt,
278 std::optional<StringRef> Source = std::nullopt,
279 unsigned CUID = 0)
override;
281 std::optional<MD5::MD5Result> Checksum,
282 std::optional<StringRef> Source,
283 unsigned CUID = 0)
override;
285 unsigned Flags,
unsigned Isa,
286 unsigned Discriminator,
292 unsigned ChecksumKind)
override;
295 unsigned IAFile,
unsigned IALine,
296 unsigned IACol,
SMLoc Loc)
override;
298 unsigned Column,
bool PrologueEnd,
bool IsStmt,
303 unsigned SourceFileId,
304 unsigned SourceLineNum,
308 void PrintCVDefRangePrefix(
309 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
312 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
316 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
320 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
324 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
394 std::optional<std::pair<bool, std::string>>
411 const Twine &Comment)
override;
419 unsigned PointerSize)
override;
426void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
427 if (!IsVerboseAsm)
return;
429 T.toVector(CommentToEmit);
435void MCAsmStreamer::EmitCommentsAndEOL() {
444 "Comment array not newline terminated");
448 size_t Position = Comments.
find(
'\n');
451 Comments = Comments.
substr(Position+1);
452 }
while (!Comments.
empty());
454 CommentToEmit.
clear();
458 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
459 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
462void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
469void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
474 ExplicitCommentToEmit.
append(
"\t");
479 size_t p = 2, len = c.
size() - 2;
483 ExplicitCommentToEmit.
append(
"\t");
488 ExplicitCommentToEmit.
append(
"\n");
492 ExplicitCommentToEmit.
append(
"\t");
494 }
else if (c.
front() ==
'#') {
496 ExplicitCommentToEmit.
append(
"\t");
500 assert(
false &&
"Unexpected Assembly Comment");
502 if (c.
back() ==
'\n')
503 emitExplicitComments();
506void MCAsmStreamer::emitExplicitComments() {
507 StringRef Comments = ExplicitCommentToEmit;
508 if (!Comments.
empty())
510 ExplicitCommentToEmit.
clear();
513void MCAsmStreamer::changeSection(
MCSection *Section,
514 const MCExpr *Subsection) {
515 assert(Section &&
"Cannot switch to a null section!");
517 TS->changeSection(getCurrentSectionOnly(), Section, Subsection,
OS);
519 Section->printSwitchToSection(*MAI, getContext().getTargetTriple(),
OS,
524void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
526 bool KeepOriginalSym) {
530 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
549 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
550 assert(str !=
"" &&
"Invalid LOH name");
564void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
565 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
580 assert(!
Options.empty() &&
"At least one option is required!");
581 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
583 OS <<
", " <<
'"' << Opt <<
'"';
612 if (SDKVersion.
empty())
614 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
615 if (
auto Minor = SDKVersion.
getMinor()) {
616 OS <<
", " << *Minor;
618 OS <<
", " << *Subminor;
624 unsigned Minor,
unsigned Update,
628 OS <<
", " << Update;
635#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
637 case MachO::PLATFORM_##platform: \
639#include "llvm/BinaryFormat/MachO.def"
644void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
645 unsigned Minor,
unsigned Update,
648 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
650 OS <<
", " << Update;
655void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
656 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
658 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
661void MCAsmStreamer::emitThumbFunc(
MCSymbol *Func) {
664 OS <<
"\t.thumb_func";
676 if (
auto *E = dyn_cast<MCTargetExpr>(
Value))
677 if (E->inlineAssignedExpr())
691void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
693 OS <<
".lto_set_conditional ";
700void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
708bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
725 default:
return false;
748 OS <<
"\t.no_dead_strip\t";
753 OS <<
"\t.private_extern\t";
762 OS <<
"\t.weak_definition\t";
776 OS <<
"\t.weak_anti_dep\t";
786void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
787 OS <<
".desc" <<
' ';
789 OS <<
',' << DescValue;
793void MCAsmStreamer::emitSyntaxDirective() {
795 OS <<
"\t.intel_syntax noprefix";
803void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
810void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
815void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
816 OS <<
"\t.type\t" <<
Type <<
';';
820void MCAsmStreamer::endCOFFSymbolDef() {
825void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
826 OS <<
"\t.safeseh\t";
831void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
837void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
844 OS <<
"\t.secrel32\t";
851void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
864void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
869 "We only support writing log base-2 alignment format with XCOFF.");
875 OS <<
',' <<
Log2(Alignment);
886void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
908 switch (Visibility) {
928 if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
929 emitXCOFFRenameDirective(Symbol,
930 cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
933void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *
Name,
939 for (
char C : Rename) {
949void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
955void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
959 unsigned FunctionSize,
963 OS <<
", " << Lang <<
", " << Reason;
968 const char InfoDirective[] =
"\t.info ";
969 const char *Separator =
", ";
970 constexpr int WordSize =
sizeof(
uint32_t);
974 PrintQuotedString(
Name,
OS);
977 size_t MetadataSize =
Metadata.size();
983 if (MetadataSize == 0) {
994 uint32_t PaddingSize = PaddedSize - MetadataSize;
1001 constexpr int WordsPerDirective = 5;
1004 int WordsBeforeNextDirective = 0;
1005 auto PrintWord = [&](
const uint8_t *WordPtr) {
1006 if (WordsBeforeNextDirective-- == 0) {
1008 OS << InfoDirective;
1009 WordsBeforeNextDirective = WordsPerDirective;
1017 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1018 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) +
Index);
1024 std::array<uint8_t, WordSize> LastWord = {0};
1026 PrintWord(LastWord.data());
1041 Align ByteAlignment) {
1049 OS <<
',' <<
Log2(ByteAlignment);
1065 if (ByteAlign > 1) {
1070 OS <<
',' << ByteAlign.
value();
1073 OS <<
',' <<
Log2(ByteAlign);
1084 assignFragment(Symbol, &
Section->getDummyFragment());
1090 ".zerofill is a Mach-O specific directive");
1100 OS <<
',' <<
Log2(ByteAlignment);
1110 assignFragment(Symbol, &
Section->getDummyFragment());
1112 assert(Symbol &&
"Symbol shouldn't be NULL!");
1116 ".zerofill is a Mach-O specific directive");
1125 if (ByteAlignment > 1)
1126 OS <<
", " <<
Log2(ByteAlignment);
1132 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1133 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1137 return isPrint(Data.back()) || Data.back() == 0;
1144 assert(!Data.empty() &&
"Cannot generate an empty list.");
1145 const auto printCharacterInOctal = [&
OS](
unsigned char C) {
1151 const auto printOneCharacterFor = [printCharacterInOctal](
1152 auto printOnePrintingCharacter) {
1153 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1155 printOnePrintingCharacter(
static_cast<char>(
C));
1158 printCharacterInOctal(
C);
1161 const auto printCharacterList = [Data, &
OS](
const auto &printOneCharacter) {
1162 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1163 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1164 printOneCharacter(
C);
1167 printOneCharacter(*(EndPtr - 1));
1171 printCharacterList(printCharacterInOctal);
1174 printCharacterList(printOneCharacterFor([&
OS](
char C) {
1175 const char AsmCharLitBuf[2] = {
'\'',
C};
1176 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1187 for (
unsigned char C : Data) {
1194 for (
unsigned char C : Data) {
1195 if (
C ==
'"' ||
C ==
'\\') {
1234void MCAsmStreamer::emitBytes(
StringRef Data) {
1235 assert(getCurrentSectionOnly() &&
1236 "Cannot emit contents before setting section!");
1237 if (Data.empty())
return;
1239 const auto emitAsString = [
this](
StringRef Data) {
1244 Data = Data.substr(0, Data.size() - 1);
1252 "hasPairedDoubleQuoteStringConstants target must support "
1253 "PlainString Directive");
1255 "hasPairedDoubleQuoteStringConstants target must support ByteList "
1257 if (Data.back() == 0) {
1259 Data = Data.substr(0, Data.size() - 1);
1272 PrintQuotedString(Data,
OS);
1277 if (Data.size() != 1 && emitAsString(Data))
1283 TS->emitRawBytes(Data);
1287 for (
const unsigned char C : Data.bytes()) {
1293void MCAsmStreamer::emitBinaryData(
StringRef Data) {
1295 const size_t Cols = 4;
1296 for (
size_t I = 0, EI =
alignTo(Data.size(), Cols);
I < EI;
I += Cols) {
1297 size_t J =
I, EJ = std::min(
I + Cols, Data.size());
1300 for (; J < EJ - 1; ++J)
1301 OS <<
format(
"0x%02x", uint8_t(Data[J])) <<
", ";
1302 OS <<
format(
"0x%02x", uint8_t(Data[J]));
1315void MCAsmStreamer::emitIntValueInHexWithPadding(
uint64_t Value,
1323 assert(getCurrentSectionOnly() &&
1324 "Cannot emit contents before setting section!");
1336 if (!
Value->evaluateAsAbsolute(IntValue))
1351 unsigned ByteOffset =
1352 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1353 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1357 uint64_t Shift = 64 - EmissionSize * 8;
1359 std::numeric_limits<unsigned long long>::digits) &&
1360 "undefined behavior");
1361 ValueToEmit &= ~0ULL >> Shift;
1362 emitIntValue(ValueToEmit, EmissionSize);
1371 TS->emitValue(
Value);
1378void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1380 if (
Value->evaluateAsAbsolute(IntValue)) {
1381 emitULEB128IntValue(IntValue);
1384 OS <<
"\t.uleb128 ";
1389void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1391 if (
Value->evaluateAsAbsolute(IntValue)) {
1392 emitSLEB128IntValue(IntValue);
1395 OS <<
"\t.sleb128 ";
1400void MCAsmStreamer::emitDTPRel64Value(
const MCExpr *
Value) {
1407void MCAsmStreamer::emitDTPRel32Value(
const MCExpr *
Value) {
1414void MCAsmStreamer::emitTPRel64Value(
const MCExpr *
Value) {
1421void MCAsmStreamer::emitTPRel32Value(
const MCExpr *
Value) {
1428void MCAsmStreamer::emitGPRel64Value(
const MCExpr *
Value) {
1435void MCAsmStreamer::emitGPRel32Value(
const MCExpr *
Value) {
1442void MCAsmStreamer::emitFill(
const MCExpr &NumBytes,
uint64_t FillValue,
1444 int64_t IntNumBytes;
1445 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1446 if (IsAbsolute && IntNumBytes == 0)
1452 OS << ZeroDirective;
1455 OS <<
',' << (int)FillValue;
1460 "Cannot emit non-absolute expression lengths of fill.");
1461 for (
int i = 0; i < IntNumBytes; ++i) {
1472void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1473 int64_t Expr,
SMLoc Loc) {
1477 OS <<
", " <<
Size <<
", 0x";
1482void MCAsmStreamer::emitAlignmentDirective(
unsigned ByteAlignment,
1483 std::optional<int64_t>
Value,
1485 unsigned MaxBytesToEmit) {
1499 switch (ValueSize) {
1503 OS <<
"\t.p2align\t";
1517 if (
Value.has_value() || MaxBytesToEmit) {
1518 if (
Value.has_value()) {
1526 OS <<
", " << MaxBytesToEmit;
1534 switch (ValueSize) {
1536 case 1:
OS <<
".balign";
break;
1537 case 2:
OS <<
".balignw";
break;
1538 case 4:
OS <<
".balignl";
break;
1543 if (
Value.has_value())
1545 else if (MaxBytesToEmit)
1548 OS <<
", " << MaxBytesToEmit;
1552void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t
Value,
1554 unsigned MaxBytesToEmit) {
1555 emitAlignmentDirective(Alignment.
value(),
Value, ValueSize, MaxBytesToEmit);
1558void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1560 unsigned MaxBytesToEmit) {
1566 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1569void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1570 unsigned char Value,
1579void MCAsmStreamer::emitFileDirective(
StringRef Filename) {
1582 PrintQuotedString(Filename,
OS);
1586void MCAsmStreamer::emitFileDirective(
StringRef Filename,
1592 PrintQuotedString(Filename,
OS);
1593 bool useTimeStamp = !TimeStamp.
empty();
1594 bool useCompilerVersion = !CompilerVersion.
empty();
1595 bool useDescription = !Description.
empty();
1596 if (useTimeStamp || useCompilerVersion || useDescription) {
1599 PrintQuotedString(TimeStamp,
OS);
1600 if (useCompilerVersion || useDescription) {
1602 if (useCompilerVersion)
1603 PrintQuotedString(CompilerVersion,
OS);
1604 if (useDescription) {
1606 PrintQuotedString(Description,
OS);
1613void MCAsmStreamer::printDwarfFileDirective(
1615 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1619 if (!UseDwarfDirectory && !Directory.
empty()) {
1623 FullPathName = Directory;
1630 OS <<
"\t.file\t" << FileNo <<
' ';
1631 if (!Directory.
empty()) {
1632 PrintQuotedString(Directory,
OS);
1635 PrintQuotedString(Filename,
OS);
1637 OS <<
" md5 0x" << Checksum->digest();
1640 PrintQuotedString(*Source,
OS);
1646 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1648 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1653 Table.
tryGetFile(Directory, Filename, Checksum, Source,
1657 FileNo = FileNoOrErr.
get();
1667 printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
1668 UseDwarfDirectory, OS1);
1671 TS->emitDwarfFileDirective(OS1.str());
1673 emitRawText(OS1.str());
1678void MCAsmStreamer::emitDwarfFile0Directive(
1680 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1687 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
1696 printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
1697 UseDwarfDirectory, OS1);
1700 TS->emitDwarfFileDirective(OS1.str());
1702 emitRawText(OS1.str());
1705void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1706 unsigned Column,
unsigned Flags,
1707 unsigned Isa,
unsigned Discriminator,
1716 Discriminator, FileName);
1720 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1723 OS <<
" basic_block";
1725 OS <<
" prologue_end";
1727 OS <<
" epilogue_begin";
1729 unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags();
1740 OS <<
" isa " << Isa;
1748 <<
Line <<
':' << Column;
1752 Discriminator, FileName);
1755MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1761bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo,
StringRef Filename,
1763 unsigned ChecksumKind) {
1764 if (!getContext().getCVContext().addFile(*
this, FileNo, Filename, Checksum,
1768 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1769 PrintQuotedString(Filename,
OS);
1771 if (!ChecksumKind) {
1777 PrintQuotedString(toHex(Checksum),
OS);
1784bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1785 OS <<
"\t.cv_func_id " <<
FuncId <<
'\n';
1789bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1792 unsigned IALine,
unsigned IACol,
1794 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1795 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1797 IALine, IACol, Loc);
1800void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1801 unsigned Line,
unsigned Column,
1802 bool PrologueEnd,
bool IsStmt,
1805 if (!checkCVLocSection(
FunctionId, FileNo, Loc))
1811 OS <<
" prologue_end";
1824void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1835void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1836 unsigned SourceFileId,
1837 unsigned SourceLineNum,
1840 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1841 <<
' ' << SourceLineNum <<
' ';
1847 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1850void MCAsmStreamer::PrintCVDefRangePrefix(
1851 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1852 OS <<
"\t.cv_def_range\t";
1853 for (std::pair<const MCSymbol *, const MCSymbol *> Range : Ranges) {
1861void MCAsmStreamer::emitCVDefRangeDirective(
1862 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1864 PrintCVDefRangePrefix(Ranges);
1865 OS <<
", reg_rel, ";
1871void MCAsmStreamer::emitCVDefRangeDirective(
1872 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1874 PrintCVDefRangePrefix(Ranges);
1875 OS <<
", subfield_reg, ";
1880void MCAsmStreamer::emitCVDefRangeDirective(
1881 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1883 PrintCVDefRangePrefix(Ranges);
1889void MCAsmStreamer::emitCVDefRangeDirective(
1890 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1892 PrintCVDefRangePrefix(Ranges);
1893 OS <<
", frame_ptr_rel, ";
1898void MCAsmStreamer::emitCVStringTableDirective() {
1899 OS <<
"\t.cv_stringtable";
1903void MCAsmStreamer::emitCVFileChecksumsDirective() {
1904 OS <<
"\t.cv_filechecksums";
1908void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1909 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1913void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
1914 OS <<
"\t.cv_fpo_data\t";
1919void MCAsmStreamer::emitIdent(
StringRef IdentString) {
1922 PrintQuotedString(IdentString,
OS);
1926void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug) {
1928 OS <<
"\t.cfi_sections ";
1932 OS <<
", .debug_frame";
1934 OS <<
".debug_frame";
1941 OS <<
"\t.cfi_startproc";
1949 OS <<
"\t.cfi_endproc";
1953void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1959 if (std::optional<unsigned> LLVMRegister =
1961 InstPrinter->printRegName(
OS, *LLVMRegister);
1970 OS <<
"\t.cfi_def_cfa ";
1976void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
1978 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
1982void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
1985 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
1993 OS <<
"\t.cfi_escape ";
1994 if (!Values.
empty()) {
1995 size_t e = Values.
size() - 1;
1996 for (
size_t i = 0; i < e; ++i)
1997 OS <<
format(
"0x%02x", uint8_t(Values[i])) <<
", ";
1998 OS <<
format(
"0x%02x", uint8_t(Values[e]));
2008void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2011 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2018void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register,
SMLoc Loc) {
2020 OS <<
"\t.cfi_def_cfa_register ";
2027 OS <<
"\t.cfi_offset ";
2033void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *
Sym,
2034 unsigned Encoding) {
2036 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2037 Sym->print(
OS, MAI);
2041void MCAsmStreamer::emitCFILsda(
const MCSymbol *
Sym,
unsigned Encoding) {
2043 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2044 Sym->print(
OS, MAI);
2048void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2050 OS <<
"\t.cfi_remember_state";
2054void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2056 OS <<
"\t.cfi_restore_state";
2060void MCAsmStreamer::emitCFIRestore(int64_t
Register,
SMLoc Loc) {
2062 OS <<
"\t.cfi_restore ";
2067void MCAsmStreamer::emitCFISameValue(int64_t
Register,
SMLoc Loc) {
2069 OS <<
"\t.cfi_same_value ";
2074void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2077 OS <<
"\t.cfi_rel_offset ";
2083void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2085 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2089void MCAsmStreamer::emitCFISignalFrame() {
2091 OS <<
"\t.cfi_signal_frame";
2095void MCAsmStreamer::emitCFIUndefined(int64_t
Register,
SMLoc Loc) {
2097 OS <<
"\t.cfi_undefined ";
2102void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2105 OS <<
"\t.cfi_register ";
2106 EmitRegisterName(Register1);
2108 EmitRegisterName(Register2);
2112void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2114 OS <<
"\t.cfi_window_save";
2118void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2120 OS <<
"\t.cfi_negate_ra_state";
2124void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2126 OS <<
"\t.cfi_return_column ";
2131void MCAsmStreamer::emitCFIBKeyFrame() {
2133 OS <<
"\t.cfi_b_key_frame";
2137void MCAsmStreamer::emitCFIMTETaggedFrame() {
2139 OS <<
"\t.cfi_mte_tagged_frame";
2143void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2151void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2154 OS <<
"\t.seh_endproc";
2158void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2161 OS <<
"\t.seh_endfunclet";
2165void MCAsmStreamer::emitWinCFIStartChained(
SMLoc Loc) {
2168 OS <<
"\t.seh_startchained";
2172void MCAsmStreamer::emitWinCFIEndChained(
SMLoc Loc) {
2175 OS <<
"\t.seh_endchained";
2179void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *
Sym,
bool Unwind,
2180 bool Except,
SMLoc Loc) {
2183 OS <<
"\t.seh_handler ";
2184 Sym->print(
OS, MAI);
2186 const Triple &
T = getContext().getTargetTriple();
2190 OS <<
", " << Marker <<
"unwind";
2192 OS <<
", " << Marker <<
"except";
2196void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2211 MCSection *XData = getAssociatedXDataSection(TextSec);
2212 switchSectionNoChange(XData);
2214 OS <<
"\t.seh_handlerdata";
2221 OS <<
"\t.seh_pushreg ";
2230 OS <<
"\t.seh_setframe ";
2236void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2239 OS <<
"\t.seh_stackalloc " <<
Size;
2247 OS <<
"\t.seh_savereg ";
2257 OS <<
"\t.seh_savexmm ";
2263void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2266 OS <<
"\t.seh_pushframe";
2272void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2275 OS <<
"\t.seh_endprologue";
2282 OS <<
"\t.cg_profile ";
2283 From->getSymbol().print(
OS, MAI);
2286 OS <<
", " << Count;
2290void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2297 if (!getAssembler().getEmitterPtr())
2300 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2307 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2310 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2313 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2314 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2315 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2317 FixupMap[
Index] = 1 + i;
2323 OS <<
"encoding: [";
2324 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2329 uint8_t MapEntry = FixupMap[i * 8 + 0];
2330 for (
unsigned j = 1;
j != 8; ++
j) {
2331 if (FixupMap[i * 8 + j] == MapEntry)
2334 MapEntry = uint8_t(~0U);
2338 if (MapEntry != uint8_t(~0U)) {
2339 if (MapEntry == 0) {
2340 OS <<
format(
"0x%02x", uint8_t(Code[i]));
2344 OS <<
format(
"0x%02x", uint8_t(Code[i])) <<
'\''
2345 <<
char(
'A' + MapEntry - 1) <<
'\'';
2347 OS <<
char(
'A' + MapEntry - 1);
2352 for (
unsigned j = 8;
j--;) {
2357 FixupBit = i * 8 + j;
2359 FixupBit = i * 8 + (7-
j);
2361 if (uint8_t MapEntry = FixupMap[FixupBit]) {
2362 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2363 OS <<
char(
'A' + MapEntry - 1);
2371 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2374 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2375 OS <<
" fixup " <<
char(
'A' + i) <<
" - "
2376 <<
"offset: " <<
F.getOffset() <<
", value: ";
2377 F.getValue()->print(
OS, MAI);
2378 OS <<
", kind: " <<
Info.Name <<
"\n";
2382void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2384 assert(getCurrentSectionOnly() &&
2385 "Cannot emit contents before setting section!");
2393 AddEncodingComment(Inst, STI);
2397 Inst.
dump_pretty(getCommentOS(), InstPrinter.get(),
"\n ");
2398 getCommentOS() <<
"\n";
2401 if(getTargetStreamer())
2402 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI,
OS);
2404 InstPrinter->printInst(&Inst, 0,
"", STI,
OS);
2407 if (Comments.
size() && Comments.
back() !=
'\n')
2408 getCommentOS() <<
"\n";
2418 OS <<
"\t.pseudoprobe\t" << Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2423 for (
const auto &Site : InlineStack)
2424 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2431void MCAsmStreamer::emitBundleAlignMode(
Align Alignment) {
2432 OS <<
"\t.bundle_align_mode " <<
Log2(Alignment);
2436void MCAsmStreamer::emitBundleLock(
bool AlignToEnd) {
2437 OS <<
"\t.bundle_lock";
2439 OS <<
" align_to_end";
2443void MCAsmStreamer::emitBundleUnlock() {
2444 OS <<
"\t.bundle_unlock";
2448std::optional<std::pair<bool, std::string>>
2460 return std::nullopt;
2463void MCAsmStreamer::emitAddrsig() {
2468void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *
Sym) {
2469 OS <<
"\t.addrsig_sym ";
2470 Sym->print(
OS, MAI);
2478 String.consume_back(
"\n");
2483void MCAsmStreamer::finishImpl() {
2485 if (getContext().getGenDwarfForAssembly())
2498 const auto &Tables = getContext().getMCDwarfLineTables();
2499 if (!Tables.empty()) {
2500 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2501 if (
auto *Label = Tables.begin()->second.getLabel()) {
2502 switchSection(getContext().getObjectFileInfo()->getDwarfLineSection());
2520MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2521 const Twine &Comment) {
2529 return getContext().createTempSymbol(Prefix +
"_end");
2533void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2544 emitLabel(DebugLineSymTmp);
2548 unsigned LengthFieldSize =
2554 emitAssignment(StartSym, OuterSym);
2560void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2568 ".loc should not be generated together with raw data!");
2580 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, SectionEnd,
2585void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2588 unsigned PointerSize) {
2590 ".loc/.file don't need raw data in debug line section!");
2593 AddComment(
"Set address to " +
Label->getName());
2594 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2595 emitULEB128IntValue(PointerSize + 1);
2596 emitIntValue(dwarf::DW_LNE_set_address, 1);
2597 emitSymbolValue(Label, PointerSize);
2601 AddComment(
"Start sequence");
2609 AddComment(
"End sequence");
2610 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2611 emitULEB128IntValue(1);
2612 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2617 AddComment(
"Advance line " +
Twine(LineDelta));
2618 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2619 emitSLEB128IntValue(LineDelta);
2620 emitIntValue(dwarf::DW_LNS_copy, 1);
2623void MCAsmStreamer::doFinalizationAtSectionEnd(
MCSection *Section) {
2629 switchSectionNoChange(Section);
2631 MCSymbol *
Sym = getCurrentSectionOnly()->getEndSymbol(getContext());
2633 if (!
Sym->isInSection())
2638 std::unique_ptr<formatted_raw_ostream>
OS,
2639 bool isVerboseAsm,
bool useDwarfDirectory,
2641 std::unique_ptr<MCCodeEmitter> &&CE,
2642 std::unique_ptr<MCAsmBackend> &&MAB,
2644 return new MCAsmStreamer(
Context, std::move(
OS), isVerboseAsm,
2645 useDwarfDirectory, IP, std::move(CE), std::move(MAB),
unsigned const MachineRegisterInfo * MRI
BlockVerifier::State From
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).
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.
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