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,
308 unsigned ChecksumKind)
override;
311 unsigned IAFile,
unsigned IALine,
312 unsigned IACol,
SMLoc Loc)
override;
314 unsigned Column,
bool PrologueEnd,
bool IsStmt,
319 unsigned SourceFileId,
320 unsigned SourceLineNum,
324 void PrintCVDefRangePrefix(
325 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
328 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
332 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
336 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
340 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
411 std::optional<std::pair<bool, std::string>>
428 const Twine &Comment)
override;
436 unsigned PointerSize)
override;
443void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
444 if (!IsVerboseAsm)
return;
446 T.toVector(CommentToEmit);
452void MCAsmStreamer::EmitCommentsAndEOL() {
461 "Comment array not newline terminated");
465 size_t Position = Comments.
find(
'\n');
468 Comments = Comments.
substr(Position+1);
469 }
while (!Comments.
empty());
471 CommentToEmit.
clear();
475 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
476 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
479void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
486void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
491 ExplicitCommentToEmit.
append(
"\t");
496 size_t p = 2, len = c.
size() - 2;
500 ExplicitCommentToEmit.
append(
"\t");
505 ExplicitCommentToEmit.
append(
"\n");
509 ExplicitCommentToEmit.
append(
"\t");
511 }
else if (c.
front() ==
'#') {
513 ExplicitCommentToEmit.
append(
"\t");
517 assert(
false &&
"Unexpected Assembly Comment");
519 if (c.
back() ==
'\n')
520 emitExplicitComments();
523void MCAsmStreamer::emitExplicitComments() {
524 StringRef Comments = ExplicitCommentToEmit;
525 if (!Comments.
empty())
527 ExplicitCommentToEmit.
clear();
532 TS->changeSection(getCurrentSection().first, Section, Subsection,
OS);
534 Section->printSwitchToSection(*MAI, getContext().getTargetTriple(),
OS,
540void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
542 bool KeepOriginalSym) {
546 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
565 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
566 assert(str !=
"" &&
"Invalid LOH name");
580void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
581 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
596 assert(!
Options.empty() &&
"At least one option is required!");
597 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
599 OS <<
", " <<
'"' << Opt <<
'"';
628 if (SDKVersion.
empty())
630 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
631 if (
auto Minor = SDKVersion.
getMinor()) {
632 OS <<
", " << *Minor;
634 OS <<
", " << *Subminor;
640 unsigned Minor,
unsigned Update,
644 OS <<
", " << Update;
651#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
653 case MachO::PLATFORM_##platform: \
655#include "llvm/BinaryFormat/MachO.def"
660void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
661 unsigned Minor,
unsigned Update,
664 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
666 OS <<
", " << Update;
671void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
672 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
674 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
677void MCAsmStreamer::emitThumbFunc(
MCSymbol *Func) {
680 OS <<
"\t.thumb_func";
692 if (
auto *E = dyn_cast<MCTargetExpr>(
Value))
693 if (E->inlineAssignedExpr())
707void MCAsmStreamer::emitConditionalAssignment(
MCSymbol *Symbol,
709 OS <<
".lto_set_conditional ";
716void MCAsmStreamer::emitWeakReference(
MCSymbol *Alias,
const MCSymbol *Symbol) {
724bool MCAsmStreamer::emitSymbolAttribute(
MCSymbol *Symbol,
741 default:
return false;
764 OS <<
"\t.no_dead_strip\t";
769 OS <<
"\t.private_extern\t";
778 OS <<
"\t.weak_definition\t";
792 OS <<
"\t.weak_anti_dep\t";
802void MCAsmStreamer::emitSymbolDesc(
MCSymbol *Symbol,
unsigned DescValue) {
803 OS <<
".desc" <<
' ';
805 OS <<
',' << DescValue;
809void MCAsmStreamer::emitSyntaxDirective() {
811 OS <<
"\t.intel_syntax noprefix";
819void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
826void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
831void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
832 OS <<
"\t.type\t" <<
Type <<
';';
836void MCAsmStreamer::endCOFFSymbolDef() {
841void MCAsmStreamer::emitCOFFSafeSEH(
MCSymbol const *Symbol) {
842 OS <<
"\t.safeseh\t";
847void MCAsmStreamer::emitCOFFSymbolIndex(
MCSymbol const *Symbol) {
853void MCAsmStreamer::emitCOFFSectionIndex(
MCSymbol const *Symbol) {
860 OS <<
"\t.secrel32\t";
867void MCAsmStreamer::emitCOFFImgRel32(
MCSymbol const *Symbol, int64_t
Offset) {
880void MCAsmStreamer::emitXCOFFLocalCommonSymbol(
MCSymbol *LabelSym,
885 "We only support writing log base-2 alignment format with XCOFF.");
891 OS <<
',' <<
Log2(Alignment);
902void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
924 switch (Visibility) {
944 if (cast<MCSymbolXCOFF>(Symbol)->hasRename())
945 emitXCOFFRenameDirective(Symbol,
946 cast<MCSymbolXCOFF>(Symbol)->getSymbolTableName());
949void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *
Name,
955 for (
char C : Rename) {
965void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
971void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
975 unsigned FunctionSize,
979 OS <<
", " << Lang <<
", " << Reason;
984 const char InfoDirective[] =
"\t.info ";
985 const char *Separator =
", ";
986 constexpr int WordSize =
sizeof(
uint32_t);
990 PrintQuotedString(
Name,
OS);
993 size_t MetadataSize =
Metadata.size();
999 if (MetadataSize == 0) {
1010 uint32_t PaddingSize = PaddedSize - MetadataSize;
1017 constexpr int WordsPerDirective = 5;
1020 int WordsBeforeNextDirective = 0;
1021 auto PrintWord = [&](
const uint8_t *WordPtr) {
1022 if (WordsBeforeNextDirective-- == 0) {
1024 OS << InfoDirective;
1025 WordsBeforeNextDirective = WordsPerDirective;
1033 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1034 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) +
Index);
1040 std::array<uint8_t, WordSize> LastWord = {0};
1042 PrintWord(LastWord.data());
1057 Align ByteAlignment) {
1065 OS <<
',' <<
Log2(ByteAlignment);
1081 if (ByteAlign > 1) {
1086 OS <<
',' << ByteAlign.
value();
1089 OS <<
',' <<
Log2(ByteAlign);
1106 ".zerofill is a Mach-O specific directive");
1116 OS <<
',' <<
Log2(ByteAlignment);
1131 ".zerofill is a Mach-O specific directive");
1140 if (ByteAlignment > 1)
1141 OS <<
", " <<
Log2(ByteAlignment);
1147 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1148 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1152 return isPrint(Data.back()) || Data.back() == 0;
1159 assert(!Data.empty() &&
"Cannot generate an empty list.");
1160 const auto printCharacterInOctal = [&
OS](
unsigned char C) {
1166 const auto printOneCharacterFor = [printCharacterInOctal](
1167 auto printOnePrintingCharacter) {
1168 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1170 printOnePrintingCharacter(
static_cast<char>(
C));
1173 printCharacterInOctal(
C);
1176 const auto printCharacterList = [Data, &
OS](
const auto &printOneCharacter) {
1177 const auto BeginPtr = Data.begin(), EndPtr = Data.end();
1178 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1179 printOneCharacter(
C);
1182 printOneCharacter(*(EndPtr - 1));
1186 printCharacterList(printCharacterInOctal);
1189 printCharacterList(printOneCharacterFor([&
OS](
char C) {
1190 const char AsmCharLitBuf[2] = {
'\'',
C};
1191 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1202 for (
unsigned char C : Data) {
1209 for (
unsigned char C : Data) {
1210 if (
C ==
'"' ||
C ==
'\\') {
1249void MCAsmStreamer::emitBytes(
StringRef Data) {
1250 assert(getCurrentSectionOnly() &&
1251 "Cannot emit contents before setting section!");
1252 if (Data.empty())
return;
1254 const auto emitAsString = [
this](
StringRef Data) {
1259 Data = Data.substr(0, Data.size() - 1);
1267 "hasPairedDoubleQuoteStringConstants target must support "
1268 "PlainString Directive");
1270 "hasPairedDoubleQuoteStringConstants target must support ByteList "
1272 if (Data.back() == 0) {
1274 Data = Data.substr(0, Data.size() - 1);
1287 PrintQuotedString(Data,
OS);
1292 if (Data.size() != 1 && emitAsString(Data))
1298 TS->emitRawBytes(Data);
1302 for (
const unsigned char C : Data.bytes()) {
1308void MCAsmStreamer::emitBinaryData(
StringRef Data) {
1310 const size_t Cols = 4;
1311 for (
size_t I = 0, EI =
alignTo(Data.size(), Cols);
I < EI;
I += Cols) {
1312 size_t J =
I, EJ = std::min(
I + Cols, Data.size());
1315 for (; J < EJ - 1; ++J)
1316 OS <<
format(
"0x%02x", uint8_t(Data[J])) <<
", ";
1317 OS <<
format(
"0x%02x", uint8_t(Data[J]));
1330void MCAsmStreamer::emitIntValueInHexWithPadding(
uint64_t Value,
1338 assert(getCurrentSectionOnly() &&
1339 "Cannot emit contents before setting section!");
1351 if (!
Value->evaluateAsAbsolute(IntValue))
1366 unsigned ByteOffset =
1367 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1368 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1372 uint64_t Shift = 64 - EmissionSize * 8;
1374 std::numeric_limits<unsigned long long>::digits) &&
1375 "undefined behavior");
1376 ValueToEmit &= ~0ULL >> Shift;
1377 emitIntValue(ValueToEmit, EmissionSize);
1386 TS->emitValue(
Value);
1393void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1395 if (
Value->evaluateAsAbsolute(IntValue)) {
1396 emitULEB128IntValue(IntValue);
1399 OS <<
"\t.uleb128 ";
1404void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1406 if (
Value->evaluateAsAbsolute(IntValue)) {
1407 emitSLEB128IntValue(IntValue);
1410 OS <<
"\t.sleb128 ";
1415void MCAsmStreamer::emitDTPRel64Value(
const MCExpr *
Value) {
1422void MCAsmStreamer::emitDTPRel32Value(
const MCExpr *
Value) {
1429void MCAsmStreamer::emitTPRel64Value(
const MCExpr *
Value) {
1436void MCAsmStreamer::emitTPRel32Value(
const MCExpr *
Value) {
1443void MCAsmStreamer::emitGPRel64Value(
const MCExpr *
Value) {
1450void MCAsmStreamer::emitGPRel32Value(
const MCExpr *
Value) {
1457void MCAsmStreamer::emitFill(
const MCExpr &NumBytes,
uint64_t FillValue,
1459 int64_t IntNumBytes;
1460 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1461 if (IsAbsolute && IntNumBytes == 0)
1467 OS << ZeroDirective;
1470 OS <<
',' << (int)FillValue;
1475 "Cannot emit non-absolute expression lengths of fill.");
1476 for (
int i = 0; i < IntNumBytes; ++i) {
1487void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1488 int64_t Expr,
SMLoc Loc) {
1492 OS <<
", " <<
Size <<
", 0x";
1497void MCAsmStreamer::emitAlignmentDirective(
uint64_t ByteAlignment,
1498 std::optional<int64_t>
Value,
1500 unsigned MaxBytesToEmit) {
1514 switch (ValueSize) {
1518 OS <<
"\t.p2align\t";
1532 if (
Value.has_value() || MaxBytesToEmit) {
1533 if (
Value.has_value()) {
1541 OS <<
", " << MaxBytesToEmit;
1549 switch (ValueSize) {
1551 case 1:
OS <<
".balign";
break;
1552 case 2:
OS <<
".balignw";
break;
1553 case 4:
OS <<
".balignl";
break;
1558 if (
Value.has_value())
1560 else if (MaxBytesToEmit)
1563 OS <<
", " << MaxBytesToEmit;
1567void MCAsmStreamer::emitValueToAlignment(
Align Alignment, int64_t
Value,
1569 unsigned MaxBytesToEmit) {
1570 emitAlignmentDirective(Alignment.
value(),
Value, ValueSize, MaxBytesToEmit);
1573void MCAsmStreamer::emitCodeAlignment(
Align Alignment,
1575 unsigned MaxBytesToEmit) {
1581 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1584void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1585 unsigned char Value,
1594void MCAsmStreamer::emitFileDirective(
StringRef Filename) {
1597 PrintQuotedString(Filename,
OS);
1601void MCAsmStreamer::emitFileDirective(
StringRef Filename,
1607 PrintQuotedString(Filename,
OS);
1608 bool useTimeStamp = !TimeStamp.
empty();
1609 bool useCompilerVersion = !CompilerVersion.
empty();
1610 bool useDescription = !Description.
empty();
1611 if (useTimeStamp || useCompilerVersion || useDescription) {
1614 PrintQuotedString(TimeStamp,
OS);
1615 if (useCompilerVersion || useDescription) {
1617 if (useCompilerVersion)
1618 PrintQuotedString(CompilerVersion,
OS);
1619 if (useDescription) {
1621 PrintQuotedString(Description,
OS);
1628void MCAsmStreamer::printDwarfFileDirective(
1630 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1634 if (!UseDwarfDirectory && !Directory.
empty()) {
1638 FullPathName = Directory;
1645 OS <<
"\t.file\t" << FileNo <<
' ';
1646 if (!Directory.
empty()) {
1647 PrintQuotedString(Directory,
OS);
1650 PrintQuotedString(Filename,
OS);
1652 OS <<
" md5 0x" << Checksum->digest();
1655 PrintQuotedString(*Source,
OS);
1661 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1663 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1668 Table.
tryGetFile(Directory, Filename, Checksum, Source,
1672 FileNo = FileNoOrErr.
get();
1682 printDwarfFileDirective(FileNo, Directory, Filename, Checksum, Source,
1683 UseDwarfDirectory, OS1);
1686 TS->emitDwarfFileDirective(OS1.str());
1688 emitRawText(OS1.str());
1693void MCAsmStreamer::emitDwarfFile0Directive(
1695 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1702 getContext().setMCLineTableRootFile(CUID, Directory, Filename, Checksum,
1711 printDwarfFileDirective(0, Directory, Filename, Checksum, Source,
1712 UseDwarfDirectory, OS1);
1715 TS->emitDwarfFileDirective(OS1.str());
1717 emitRawText(OS1.str());
1720void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1721 unsigned Column,
unsigned Flags,
1722 unsigned Isa,
unsigned Discriminator,
1731 Discriminator, FileName);
1735 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1738 OS <<
" basic_block";
1740 OS <<
" prologue_end";
1742 OS <<
" epilogue_begin";
1744 unsigned OldFlags = getContext().getCurrentDwarfLoc().getFlags();
1755 OS <<
" isa " << Isa;
1763 <<
Line <<
':' << Column;
1767 Discriminator, FileName);
1770MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1776bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo,
StringRef Filename,
1778 unsigned ChecksumKind) {
1779 if (!getContext().getCVContext().addFile(*
this, FileNo, Filename, Checksum,
1783 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1784 PrintQuotedString(Filename,
OS);
1786 if (!ChecksumKind) {
1792 PrintQuotedString(toHex(Checksum),
OS);
1799bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1800 OS <<
"\t.cv_func_id " <<
FuncId <<
'\n';
1804bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1807 unsigned IALine,
unsigned IACol,
1809 OS <<
"\t.cv_inline_site_id " <<
FunctionId <<
" within " << IAFunc
1810 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1812 IALine, IACol, Loc);
1815void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1816 unsigned Line,
unsigned Column,
1817 bool PrologueEnd,
bool IsStmt,
1820 if (!checkCVLocSection(
FunctionId, FileNo, Loc))
1826 OS <<
" prologue_end";
1839void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1850void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1851 unsigned SourceFileId,
1852 unsigned SourceLineNum,
1855 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1856 <<
' ' << SourceLineNum <<
' ';
1862 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1865void MCAsmStreamer::PrintCVDefRangePrefix(
1866 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1867 OS <<
"\t.cv_def_range\t";
1868 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
1876void MCAsmStreamer::emitCVDefRangeDirective(
1877 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1879 PrintCVDefRangePrefix(Ranges);
1880 OS <<
", reg_rel, ";
1886void MCAsmStreamer::emitCVDefRangeDirective(
1887 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1889 PrintCVDefRangePrefix(Ranges);
1890 OS <<
", subfield_reg, ";
1895void MCAsmStreamer::emitCVDefRangeDirective(
1896 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1898 PrintCVDefRangePrefix(Ranges);
1904void MCAsmStreamer::emitCVDefRangeDirective(
1905 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1907 PrintCVDefRangePrefix(Ranges);
1908 OS <<
", frame_ptr_rel, ";
1913void MCAsmStreamer::emitCVStringTableDirective() {
1914 OS <<
"\t.cv_stringtable";
1918void MCAsmStreamer::emitCVFileChecksumsDirective() {
1919 OS <<
"\t.cv_filechecksums";
1923void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1924 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1928void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym,
SMLoc L) {
1929 OS <<
"\t.cv_fpo_data\t";
1934void MCAsmStreamer::emitIdent(
StringRef IdentString) {
1937 PrintQuotedString(IdentString,
OS);
1941void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug) {
1943 OS <<
"\t.cfi_sections ";
1947 OS <<
", .debug_frame";
1949 OS <<
".debug_frame";
1956 OS <<
"\t.cfi_startproc";
1964 OS <<
"\t.cfi_endproc";
1968void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1974 if (std::optional<unsigned> LLVMRegister =
1976 InstPrinter->printRegName(
OS, *LLVMRegister);
1985 OS <<
"\t.cfi_def_cfa ";
1991void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset,
SMLoc Loc) {
1993 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
1997void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
2000 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
2008 OS <<
"\t.cfi_escape ";
2009 if (!Values.
empty()) {
2010 size_t e = Values.
size() - 1;
2011 for (
size_t i = 0; i < e; ++i)
2012 OS <<
format(
"0x%02x", uint8_t(Values[i])) <<
", ";
2013 OS <<
format(
"0x%02x", uint8_t(Values[e]));
2023void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size,
SMLoc Loc) {
2026 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2033void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register,
SMLoc Loc) {
2035 OS <<
"\t.cfi_def_cfa_register ";
2042 OS <<
"\t.cfi_offset ";
2048void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *
Sym,
2049 unsigned Encoding) {
2051 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2052 Sym->print(
OS, MAI);
2056void MCAsmStreamer::emitCFILsda(
const MCSymbol *
Sym,
unsigned Encoding) {
2058 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2059 Sym->print(
OS, MAI);
2063void MCAsmStreamer::emitCFIRememberState(
SMLoc Loc) {
2065 OS <<
"\t.cfi_remember_state";
2069void MCAsmStreamer::emitCFIRestoreState(
SMLoc Loc) {
2071 OS <<
"\t.cfi_restore_state";
2075void MCAsmStreamer::emitCFIRestore(int64_t
Register,
SMLoc Loc) {
2077 OS <<
"\t.cfi_restore ";
2082void MCAsmStreamer::emitCFISameValue(int64_t
Register,
SMLoc Loc) {
2084 OS <<
"\t.cfi_same_value ";
2089void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2092 OS <<
"\t.cfi_rel_offset ";
2098void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment,
SMLoc Loc) {
2100 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2104void MCAsmStreamer::emitCFISignalFrame() {
2106 OS <<
"\t.cfi_signal_frame";
2110void MCAsmStreamer::emitCFIUndefined(int64_t
Register,
SMLoc Loc) {
2112 OS <<
"\t.cfi_undefined ";
2117void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2120 OS <<
"\t.cfi_register ";
2121 EmitRegisterName(Register1);
2123 EmitRegisterName(Register2);
2127void MCAsmStreamer::emitCFIWindowSave(
SMLoc Loc) {
2129 OS <<
"\t.cfi_window_save";
2133void MCAsmStreamer::emitCFINegateRAState(
SMLoc Loc) {
2135 OS <<
"\t.cfi_negate_ra_state";
2139void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2141 OS <<
"\t.cfi_return_column ";
2148 OS <<
"\t.cfi_label " <<
Name;
2152void MCAsmStreamer::emitCFIBKeyFrame() {
2154 OS <<
"\t.cfi_b_key_frame";
2158void MCAsmStreamer::emitCFIMTETaggedFrame() {
2160 OS <<
"\t.cfi_mte_tagged_frame";
2164void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol,
SMLoc Loc) {
2172void MCAsmStreamer::emitWinCFIEndProc(
SMLoc Loc) {
2175 OS <<
"\t.seh_endproc";
2179void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(
SMLoc Loc) {
2182 OS <<
"\t.seh_endfunclet";
2186void MCAsmStreamer::emitWinCFIStartChained(
SMLoc Loc) {
2189 OS <<
"\t.seh_startchained";
2193void MCAsmStreamer::emitWinCFIEndChained(
SMLoc Loc) {
2196 OS <<
"\t.seh_endchained";
2200void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *
Sym,
bool Unwind,
2201 bool Except,
SMLoc Loc) {
2204 OS <<
"\t.seh_handler ";
2205 Sym->print(
OS, MAI);
2207 const Triple &
T = getContext().getTargetTriple();
2211 OS <<
", " << Marker <<
"unwind";
2213 OS <<
", " << Marker <<
"except";
2217void MCAsmStreamer::emitWinEHHandlerData(
SMLoc Loc) {
2232 MCSection *XData = getAssociatedXDataSection(TextSec);
2233 switchSectionNoPrint(XData);
2235 OS <<
"\t.seh_handlerdata";
2242 OS <<
"\t.seh_pushreg ";
2251 OS <<
"\t.seh_setframe ";
2257void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size,
SMLoc Loc) {
2260 OS <<
"\t.seh_stackalloc " <<
Size;
2268 OS <<
"\t.seh_savereg ";
2278 OS <<
"\t.seh_savexmm ";
2284void MCAsmStreamer::emitWinCFIPushFrame(
bool Code,
SMLoc Loc) {
2287 OS <<
"\t.seh_pushframe";
2293void MCAsmStreamer::emitWinCFIEndProlog(
SMLoc Loc) {
2296 OS <<
"\t.seh_endprologue";
2303 OS <<
"\t.cg_profile ";
2304 From->getSymbol().print(
OS, MAI);
2307 OS <<
", " << Count;
2311void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2318 if (!getAssembler().getEmitterPtr())
2321 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2328 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2331 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2334 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2335 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2336 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2338 FixupMap[
Index] = 1 + i;
2344 OS <<
"encoding: [";
2345 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2350 uint8_t MapEntry = FixupMap[i * 8 + 0];
2351 for (
unsigned j = 1;
j != 8; ++
j) {
2352 if (FixupMap[i * 8 + j] == MapEntry)
2355 MapEntry = uint8_t(~0U);
2359 if (MapEntry != uint8_t(~0U)) {
2360 if (MapEntry == 0) {
2361 OS <<
format(
"0x%02x", uint8_t(Code[i]));
2365 OS <<
format(
"0x%02x", uint8_t(Code[i])) <<
'\''
2366 <<
char(
'A' + MapEntry - 1) <<
'\'';
2368 OS <<
char(
'A' + MapEntry - 1);
2373 for (
unsigned j = 8;
j--;) {
2378 FixupBit = i * 8 + j;
2380 FixupBit = i * 8 + (7-
j);
2382 if (uint8_t MapEntry = FixupMap[FixupBit]) {
2383 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2384 OS <<
char(
'A' + MapEntry - 1);
2392 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2395 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2396 OS <<
" fixup " <<
char(
'A' + i) <<
" - "
2397 <<
"offset: " <<
F.getOffset() <<
", value: ";
2398 F.getValue()->print(
OS, MAI);
2399 OS <<
", kind: " <<
Info.Name <<
"\n";
2403void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2405 assert(getCurrentSectionOnly() &&
2406 "Cannot emit contents before setting section!");
2414 AddEncodingComment(Inst, STI);
2418 Inst.
dump_pretty(getCommentOS(), InstPrinter.get(),
"\n ");
2419 getCommentOS() <<
"\n";
2422 if(getTargetStreamer())
2423 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI,
OS);
2425 InstPrinter->printInst(&Inst, 0,
"", STI,
OS);
2428 if (Comments.
size() && Comments.
back() !=
'\n')
2429 getCommentOS() <<
"\n";
2439 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2444 for (
const auto &Site : InlineStack)
2445 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2452void MCAsmStreamer::emitBundleAlignMode(
Align Alignment) {
2453 OS <<
"\t.bundle_align_mode " <<
Log2(Alignment);
2457void MCAsmStreamer::emitBundleLock(
bool AlignToEnd) {
2458 OS <<
"\t.bundle_lock";
2460 OS <<
" align_to_end";
2464void MCAsmStreamer::emitBundleUnlock() {
2465 OS <<
"\t.bundle_unlock";
2469std::optional<std::pair<bool, std::string>>
2481 return std::nullopt;
2484void MCAsmStreamer::emitAddrsig() {
2489void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *
Sym) {
2490 OS <<
"\t.addrsig_sym ";
2491 Sym->print(
OS, MAI);
2499 String.consume_back(
"\n");
2504void MCAsmStreamer::finishImpl() {
2506 if (getContext().getGenDwarfForAssembly())
2519 const auto &Tables = getContext().getMCDwarfLineTables();
2520 if (!Tables.empty()) {
2521 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2522 if (
auto *Label = Tables.begin()->second.getLabel()) {
2523 switchSection(getContext().getObjectFileInfo()->getDwarfLineSection());
2541MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2542 const Twine &Comment) {
2550 return getContext().createTempSymbol(Prefix +
"_end");
2554void MCAsmStreamer::emitDwarfLineStartLabel(
MCSymbol *StartSym) {
2565 emitLabel(DebugLineSymTmp);
2569 unsigned LengthFieldSize =
2575 emitAssignment(StartSym, OuterSym);
2581void MCAsmStreamer::emitDwarfLineEndEntry(
MCSection *Section,
2589 ".loc should not be generated together with raw data!");
2601 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, SectionEnd,
2606void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2609 unsigned PointerSize) {
2611 ".loc/.file don't need raw data in debug line section!");
2614 AddComment(
"Set address to " +
Label->getName());
2615 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2616 emitULEB128IntValue(PointerSize + 1);
2617 emitIntValue(dwarf::DW_LNE_set_address, 1);
2618 emitSymbolValue(Label, PointerSize);
2622 AddComment(
"Start sequence");
2630 AddComment(
"End sequence");
2631 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2632 emitULEB128IntValue(1);
2633 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2638 AddComment(
"Advance line " +
Twine(LineDelta));
2639 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2640 emitSLEB128IntValue(LineDelta);
2641 emitIntValue(dwarf::DW_LNS_copy, 1);
2644void MCAsmStreamer::doFinalizationAtSectionEnd(
MCSection *Section) {
2650 switchSectionNoPrint(Section);
2652 MCSymbol *
Sym = getCurrentSectionOnly()->getEndSymbol(getContext());
2654 if (!
Sym->isInSection())
2659 std::unique_ptr<formatted_raw_ostream>
OS,
2661 std::unique_ptr<MCCodeEmitter> &&CE,
2662 std::unique_ptr<MCAsmBackend> &&MAB) {
2663 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 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 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 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 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