45 std::unique_ptr<formatted_raw_ostream> OSOwner;
46 formatted_raw_ostream &OS;
48 std::unique_ptr<MCInstPrinter> InstPrinter;
49 std::unique_ptr<MCAssembler> Assembler;
51 SmallString<128> ExplicitCommentToEmit;
52 SmallString<128> CommentToEmit;
53 raw_svector_ostream CommentStream;
54 raw_null_ostream NullStream;
56 bool EmittedSectionDirective =
false;
58 bool IsVerboseAsm =
false;
59 bool ShowInst =
false;
60 bool UseDwarfDirectory =
false;
62 void EmitRegisterName(int64_t
Register);
63 void PrintQuotedString(StringRef
Data, raw_ostream &OS)
const;
64 void printDwarfFileDirective(
unsigned FileNo, StringRef Directory,
66 std::optional<MD5::MD5Result> Checksum,
67 std::optional<StringRef> Source,
68 bool UseDwarfDirectory,
69 raw_svector_ostream &OS)
const;
70 void emitCFIStartProcImpl(MCDwarfFrameInfo &Frame)
override;
71 void emitCFIEndProcImpl(MCDwarfFrameInfo &Frame)
override;
74 MCAsmStreamer(MCContext &
Context, std::unique_ptr<formatted_raw_ostream> os,
75 std::unique_ptr<MCInstPrinter>
printer,
76 std::unique_ptr<MCCodeEmitter> emitter,
77 std::unique_ptr<MCAsmBackend> asmbackend)
78 : MCStreamer(
Context), OSOwner(std::
move(os)), OS(*OSOwner),
80 Assembler(std::make_unique<MCAssembler>(
82 (asmbackend) ? asmbackend->createObjectWriter(NullStream)
84 CommentStream(CommentToEmit) {
86 if (Assembler->getBackendPtr())
87 setAllowAutoPadding(Assembler->getBackend().allowAutoPadding());
89 Context.setUseNamesOnTempLabels(
true);
91 auto *TO =
Context.getTargetOptions();
94 IsVerboseAsm = TO->AsmVerbose;
96 InstPrinter->setCommentStream(CommentStream);
97 ShowInst = TO->ShowMCInst;
98 switch (TO->MCUseDwarfDirectory) {
100 UseDwarfDirectory =
false;
103 UseDwarfDirectory =
true;
107 Context.getAsmInfo()->enableDwarfFileDirectoryDefault();
112 MCAssembler &getAssembler() {
return *Assembler; }
113 MCAssembler *getAssemblerPtr()
override {
return nullptr; }
115 inline void EmitEOL() {
117 emitExplicitComments();
123 EmitCommentsAndEOL();
126 void emitSyntaxDirective(StringRef Syntax, StringRef
Options)
override;
128 void EmitCommentsAndEOL();
131 bool isVerboseAsm()
const override {
return IsVerboseAsm; }
134 bool hasRawTextSupport()
const override {
return true; }
139 void AddComment(
const Twine &
T,
bool EOL =
true)
override;
142 void AddEncodingComment(
const MCInst &Inst,
const MCSubtargetInfo &);
147 raw_ostream &getCommentOS()
override {
150 return CommentStream;
153 void emitRawComment(
const Twine &
T,
bool TabPrefix =
true)
override;
155 void addExplicitComment(
const Twine &
T)
override;
156 void emitExplicitComments()
override;
159 void addBlankLine()
override { EmitEOL(); }
164 void switchSection(MCSection *Section, uint32_t Subsection)
override;
165 bool popSection()
override;
167 void emitELFSymverDirective(
const MCSymbol *OriginalSym, StringRef Name,
168 bool KeepOriginalSym)
override;
172 void emitGNUAttribute(
unsigned Tag,
unsigned Value)
override;
175 auto [Ptr,
Bits] = InstPrinter->getMnemonic(
MI);
176 assert((Bits != 0 || Ptr ==
nullptr) &&
177 "Invalid char pointer for instruction with no mnemonic");
181 void emitLabel(MCSymbol *Symbol, SMLoc Loc = SMLoc())
override;
183 void emitSubsectionsViaSymbols()
override;
184 void emitLinkerOptions(ArrayRef<std::string>
Options)
override;
187 unsigned Update, VersionTuple SDKVersion)
override;
188 void emitBuildVersion(
unsigned Platform,
unsigned Major,
unsigned Minor,
189 unsigned Update, VersionTuple SDKVersion)
override;
190 void emitDarwinTargetVariantBuildVersion(
unsigned Platform,
unsigned Major,
191 unsigned Minor,
unsigned Update,
192 VersionTuple SDKVersion)
override;
194 void emitAssignment(MCSymbol *Symbol,
const MCExpr *
Value)
override;
195 void emitConditionalAssignment(MCSymbol *Symbol,
196 const MCExpr *
Value)
override;
197 void emitWeakReference(MCSymbol *Alias,
const MCSymbol *Symbol)
override;
200 void emitSymbolDesc(MCSymbol *Symbol,
unsigned DescValue)
override;
201 void beginCOFFSymbolDef(
const MCSymbol *Symbol)
override;
202 void emitCOFFSymbolStorageClass(
int StorageClass)
override;
203 void emitCOFFSymbolType(
int Type)
override;
204 void endCOFFSymbolDef()
override;
205 void emitCOFFSafeSEH(MCSymbol
const *Symbol)
override;
206 void emitCOFFSymbolIndex(MCSymbol
const *Symbol)
override;
207 void emitCOFFSectionIndex(MCSymbol
const *Symbol)
override;
208 void emitCOFFSecRel32(MCSymbol
const *Symbol, uint64_t
Offset)
override;
209 void emitCOFFImgRel32(MCSymbol
const *Symbol, int64_t
Offset)
override;
210 void emitCOFFSecNumber(MCSymbol
const *Symbol)
override;
211 void emitCOFFSecOffset(MCSymbol
const *Symbol)
override;
212 void emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym, uint64_t
Size,
213 MCSymbol *CsectSym, Align Alignment)
override;
214 void emitXCOFFSymbolLinkageWithVisibility(MCSymbol *Symbol,
217 void emitXCOFFRenameDirective(
const MCSymbol *Name,
218 StringRef Rename)
override;
220 void emitXCOFFRefDirective(
const MCSymbol *Symbol)
override;
222 void emitXCOFFExceptDirective(
const MCSymbol *Symbol,
223 const MCSymbol *
Trap,
224 unsigned Lang,
unsigned Reason,
225 unsigned FunctionSize,
bool hasDebug)
override;
226 void emitXCOFFCInfoSym(StringRef Name, StringRef
Metadata)
override;
228 void emitELFSize(MCSymbol *Symbol,
const MCExpr *
Value)
override;
229 void emitCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
230 Align ByteAlignment)
override;
237 void emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
238 Align ByteAlignment)
override;
240 void emitZerofill(MCSection *Section, MCSymbol *Symbol =
nullptr,
241 uint64_t
Size = 0, Align ByteAlignment =
Align(1),
242 SMLoc Loc = SMLoc())
override;
244 void emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol, uint64_t
Size,
245 Align ByteAlignment =
Align(1))
override;
247 void emitBinaryData(StringRef
Data)
override;
249 void emitBytes(StringRef
Data)
override;
251 void emitValueImpl(
const MCExpr *
Value,
unsigned Size,
252 SMLoc Loc = SMLoc())
override;
253 void emitIntValue(uint64_t
Value,
unsigned Size)
override;
254 void emitIntValueInHex(uint64_t
Value,
unsigned Size)
override;
255 void emitIntValueInHexWithPadding(uint64_t
Value,
unsigned Size)
override;
257 void emitULEB128Value(
const MCExpr *
Value)
override;
259 void emitSLEB128Value(
const MCExpr *
Value)
override;
261 void emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
262 SMLoc Loc = SMLoc())
override;
264 void emitFill(
const MCExpr &NumValues, int64_t
Size, int64_t Expr,
265 SMLoc Loc = SMLoc())
override;
267 void emitAlignmentDirective(uint64_t ByteAlignment,
268 std::optional<int64_t>
Value,
unsigned ValueSize,
269 unsigned MaxBytesToEmit);
271 void emitValueToAlignment(Align Alignment, int64_t Fill = 0,
273 unsigned MaxBytesToEmit = 0)
override;
275 void emitCodeAlignment(Align Alignment,
const MCSubtargetInfo *STI,
276 unsigned MaxBytesToEmit = 0)
override;
277 void emitPrefAlign(Align Alignment)
override;
279 void emitValueToOffset(
const MCExpr *
Offset,
283 void emitFileDirective(StringRef
Filename)
override;
284 void emitFileDirective(StringRef
Filename, StringRef CompilerVersion,
285 StringRef TimeStamp, StringRef Description)
override;
286 Expected<unsigned> tryEmitDwarfFileDirective(
287 unsigned FileNo, StringRef Directory, StringRef
Filename,
288 std::optional<MD5::MD5Result> Checksum = std::nullopt,
289 std::optional<StringRef> Source = std::nullopt,
290 unsigned CUID = 0)
override;
291 void emitDwarfFile0Directive(StringRef Directory, StringRef
Filename,
292 std::optional<MD5::MD5Result> Checksum,
293 std::optional<StringRef> Source,
294 unsigned CUID = 0)
override;
295 void emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
unsigned Column,
296 unsigned Flags,
unsigned Isa,
297 unsigned Discriminator, StringRef FileName,
298 StringRef Location = {})
override;
299 void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
override;
301 MCSymbol *getDwarfLineTableSymbol(
unsigned CUID)
override;
303 bool emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
304 ArrayRef<uint8_t> Checksum,
305 unsigned ChecksumKind)
override;
306 bool emitCVFuncIdDirective(
unsigned FuncId)
override;
307 bool emitCVInlineSiteIdDirective(
unsigned FunctionId,
unsigned IAFunc,
308 unsigned IAFile,
unsigned IALine,
309 unsigned IACol, SMLoc Loc)
override;
310 void emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
unsigned Line,
311 unsigned Column,
bool PrologueEnd,
bool IsStmt,
312 StringRef FileName, SMLoc Loc)
override;
313 void emitCVLinetableDirective(
unsigned FunctionId,
const MCSymbol *FnStart,
314 const MCSymbol *FnEnd)
override;
315 void emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
316 unsigned SourceFileId,
317 unsigned SourceLineNum,
318 const MCSymbol *FnStartSym,
319 const MCSymbol *FnEndSym)
override;
321 void PrintCVDefRangePrefix(
322 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
324 void emitCVDefRangeDirective(
325 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
326 codeview::DefRangeRegisterRelHeader DRHdr)
override;
328 void emitCVDefRangeDirective(
329 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
330 codeview::DefRangeSubfieldRegisterHeader DRHdr)
override;
332 void emitCVDefRangeDirective(
333 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
334 codeview::DefRangeRegisterHeader DRHdr)
override;
336 void emitCVDefRangeDirective(
337 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
338 codeview::DefRangeFramePointerRelHeader DRHdr)
override;
340 void emitCVStringTableDirective()
override;
341 void emitCVFileChecksumsDirective()
override;
342 void emitCVFileChecksumOffsetDirective(
unsigned FileNo)
override;
343 void emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L)
override;
345 void emitIdent(StringRef IdentString)
override;
346 void emitCFIBKeyFrame()
override;
347 void emitCFIMTETaggedFrame()
override;
348 void emitCFISections(
bool EH,
bool Debug,
bool SFrame)
override;
349 void emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
350 void emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc)
override;
351 void emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc)
override;
354 void emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
355 void emitCFIPersonality(
const MCSymbol *Sym,
unsigned Encoding)
override;
356 void emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding)
override;
357 void emitCFIRememberState(SMLoc Loc)
override;
358 void emitCFIRestoreState(SMLoc Loc)
override;
359 void emitCFIRestore(int64_t
Register, SMLoc Loc)
override;
360 void emitCFISameValue(int64_t
Register, SMLoc Loc)
override;
361 void emitCFIRelOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
362 void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc)
override;
363 void emitCFIEscape(StringRef Values, SMLoc Loc)
override;
364 void emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc)
override;
365 void emitCFISignalFrame()
override;
366 void emitCFIUndefined(int64_t
Register, SMLoc Loc)
override;
367 void emitCFIRegister(int64_t Register1, int64_t Register2,
369 void emitCFIWindowSave(SMLoc Loc)
override;
370 void emitCFINegateRAState(SMLoc Loc)
override;
371 void emitCFINegateRAStateWithPC(SMLoc Loc)
override;
372 void emitCFIReturnColumn(int64_t
Register)
override;
373 void emitCFILabelDirective(SMLoc Loc, StringRef Name)
override;
374 void emitCFIValOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
376 void emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc)
override;
377 void emitWinCFIEndProc(SMLoc Loc)
override;
378 void emitWinCFIFuncletOrFuncEnd(SMLoc Loc)
override;
379 void emitWinCFISplitChained(SMLoc Loc)
override;
380 void emitWinCFIPushReg(MCRegister
Register, SMLoc Loc)
override;
383 void emitWinCFIAllocStack(
unsigned Size, SMLoc Loc)
override;
388 void emitWinCFIPushFrame(
bool Code, SMLoc Loc)
override;
389 void emitWinCFIEndProlog(SMLoc Loc)
override;
390 void emitWinCFIBeginEpilogue(SMLoc Loc)
override;
391 void emitWinCFIEndEpilogue(SMLoc Loc)
override;
392 void emitWinCFIUnwindV2Start(SMLoc Loc)
override;
393 void emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc)
override;
395 void emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
bool Except,
397 void emitWinEHHandlerData(SMLoc Loc)
override;
399 void emitCGProfileEntry(
const MCSymbolRefExpr *From,
400 const MCSymbolRefExpr *To, uint64_t
Count)
override;
402 void emitInstruction(
const MCInst &Inst,
const MCSubtargetInfo &STI)
override;
404 void emitPseudoProbe(uint64_t
Guid, uint64_t Index, uint64_t
Type,
405 uint64_t Attr, uint64_t Discriminator,
407 MCSymbol *FnSym)
override;
409 void emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
410 const MCExpr *Expr, SMLoc Loc)
override;
412 void emitAddrsig()
override;
413 void emitAddrsigSym(
const MCSymbol *Sym)
override;
418 void emitRawTextImpl(StringRef
String)
override;
420 void finishImpl()
override;
422 void emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment)
override;
424 MCSymbol *emitDwarfUnitLength(
const Twine &Prefix,
425 const Twine &Comment)
override;
427 void emitDwarfLineStartLabel(MCSymbol *StartSym)
override;
429 void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
430 MCSymbol *EndLabel =
nullptr)
override;
432 void emitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
433 const MCSymbol *Label,
434 unsigned PointerSize)
override;
439void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
440 if (!IsVerboseAsm)
return;
442 T.toVector(CommentToEmit);
448void MCAsmStreamer::EmitCommentsAndEOL() {
454 StringRef Comments = CommentToEmit;
457 "Comment array not newline terminated");
461 size_t Position = Comments.
find(
'\n');
464 Comments = Comments.
substr(Position+1);
465 }
while (!Comments.
empty());
467 CommentToEmit.
clear();
471 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
472 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
475void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
482void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
483 StringRef c =
T.getSingleStringRef();
487 ExplicitCommentToEmit.
append(
"\t");
492 size_t p = 2, len = c.
size() - 2;
496 ExplicitCommentToEmit.
append(
"\t");
501 ExplicitCommentToEmit.
append(
"\n");
505 ExplicitCommentToEmit.
append(
"\t");
507 }
else if (c.
front() ==
'#') {
509 ExplicitCommentToEmit.
append(
"\t");
513 assert(
false &&
"Unexpected Assembly Comment");
515 if (c.
back() ==
'\n')
516 emitExplicitComments();
519void MCAsmStreamer::emitExplicitComments() {
520 StringRef Comments = ExplicitCommentToEmit;
521 if (!Comments.
empty())
523 ExplicitCommentToEmit.
clear();
526void MCAsmStreamer::switchSection(MCSection *Section, uint32_t Subsection) {
528 if (!EmittedSectionDirective ||
530 EmittedSectionDirective =
true;
531 if (MCTargetStreamer *TS = getTargetStreamer()) {
532 TS->changeSection(Cur.first, Section, Subsection, OS);
541bool MCAsmStreamer::popSection() {
544 auto [Sec, Subsec] = getCurrentSection();
549void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
551 bool KeepOriginalSym) {
553 OriginalSym->
print(OS, MAI);
555 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
560void MCAsmStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
565 if (!
Symbol->isVariable() &&
580 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
581 assert(str !=
"" &&
"Invalid LOH name");
586 for (
const MCSymbol *Arg : Args) {
595void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
596 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
599void MCAsmStreamer::emitSubsectionsViaSymbols() {
600 OS <<
".subsections_via_symbols\n";
603void MCAsmStreamer::emitLinkerOptions(ArrayRef<std::string>
Options) {
604 assert(!
Options.empty() &&
"At least one option is required!");
605 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
607 OS <<
", " <<
'"' << Opt <<
'"';
636 if (SDKVersion.
empty())
638 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
639 if (
auto Minor = SDKVersion.
getMinor()) {
640 OS <<
", " << *Minor;
642 OS <<
", " << *Subminor;
648 unsigned Minor,
unsigned Update,
649 VersionTuple SDKVersion) {
652 OS <<
", " << Update;
659#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
661 case MachO::PLATFORM_##platform: \
663#include "llvm/BinaryFormat/MachO.def"
668void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
669 unsigned Minor,
unsigned Update,
670 VersionTuple SDKVersion) {
672 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
674 OS <<
", " << Update;
679void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
680 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
681 VersionTuple SDKVersion) {
682 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
685void MCAsmStreamer::emitAssignment(MCSymbol *Symbol,
const MCExpr *
Value) {
690 OS << (UseSet ?
", " :
" = ");
697void MCAsmStreamer::emitConditionalAssignment(MCSymbol *Symbol,
698 const MCExpr *
Value) {
699 OS <<
".lto_set_conditional ";
706void MCAsmStreamer::emitWeakReference(MCSymbol *Alias,
const MCSymbol *Symbol) {
708 Alias->
print(OS, MAI);
714bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol,
731 default:
return false;
754 OS <<
"\t.no_dead_strip\t";
759 OS <<
"\t.private_extern\t";
768 OS <<
"\t.weak_definition\t";
785 OS <<
"\t.weak_anti_dep\t";
795void MCAsmStreamer::emitSymbolDesc(MCSymbol *Symbol,
unsigned DescValue) {
796 OS <<
".desc" <<
' ';
798 OS <<
',' << DescValue;
802void MCAsmStreamer::emitSyntaxDirective(StringRef Syntax, StringRef
Options) {
803 OS <<
"\t." << Syntax <<
"_syntax";
809void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
816void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
821void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
822 OS <<
"\t.type\t" <<
Type <<
';';
826void MCAsmStreamer::endCOFFSymbolDef() {
831void MCAsmStreamer::emitCOFFSafeSEH(MCSymbol
const *Symbol) {
832 OS <<
"\t.safeseh\t";
837void MCAsmStreamer::emitCOFFSymbolIndex(MCSymbol
const *Symbol) {
843void MCAsmStreamer::emitCOFFSectionIndex(MCSymbol
const *Symbol) {
849void MCAsmStreamer::emitCOFFSecRel32(MCSymbol
const *Symbol, uint64_t
Offset) {
850 OS <<
"\t.secrel32\t";
857void MCAsmStreamer::emitCOFFImgRel32(MCSymbol
const *Symbol, int64_t
Offset) {
867void MCAsmStreamer::emitCOFFSecNumber(MCSymbol
const *Symbol) {
873void MCAsmStreamer::emitCOFFSecOffset(MCSymbol
const *Symbol) {
874 OS <<
"\t.secoffset\t";
882void MCAsmStreamer::emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym,
887 "We only support writing log base-2 alignment format with XCOFF.");
890 LabelSym->
print(OS, MAI);
891 OS <<
',' <<
Size <<
',';
892 CsectSym->
print(OS, MAI);
893 OS <<
',' <<
Log2(Alignment);
899 auto *XSym =
static_cast<MCSymbolXCOFF *
>(CsectSym);
900 if (XSym->hasRename())
901 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
904void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
906 auto &Sym =
static_cast<MCSymbolXCOFF &
>(*Symbol);
926 switch (Visibility) {
947 emitXCOFFRenameDirective(&Sym, Sym.getSymbolTableName());
950void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *Name,
953 Name->print(OS, MAI);
956 for (
char C : Rename) {
966void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
972void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
973 const MCSymbol *
Trap,
976 unsigned FunctionSize,
980 OS <<
", " << Lang <<
", " << Reason;
984void MCAsmStreamer::emitXCOFFCInfoSym(StringRef Name, StringRef
Metadata) {
985 const char InfoDirective[] =
"\t.info ";
986 const char *Separator =
", ";
987 constexpr int WordSize =
sizeof(uint32_t);
991 PrintQuotedString(Name, OS);
994 size_t MetadataSize =
Metadata.size();
997 OS <<
format_hex(MetadataSize, 10) << Separator;
1000 if (MetadataSize == 0) {
1010 uint32_t PaddedSize =
alignTo(MetadataSize, WordSize);
1011 uint32_t PaddingSize = PaddedSize - MetadataSize;
1018 constexpr int WordsPerDirective = 5;
1021 int WordsBeforeNextDirective = 0;
1022 auto PrintWord = [&](
const uint8_t *WordPtr) {
1023 if (WordsBeforeNextDirective-- == 0) {
1025 OS << InfoDirective;
1026 WordsBeforeNextDirective = WordsPerDirective;
1034 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1035 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) + Index);
1040 assert(PaddedSize - Index == WordSize);
1041 std::array<uint8_t, WordSize> LastWord = {0};
1042 ::memcpy(LastWord.data(),
Metadata.data() + Index, MetadataSize - Index);
1043 PrintWord(LastWord.data());
1048void MCAsmStreamer::emitELFSize(MCSymbol *Symbol,
const MCExpr *
Value) {
1057void MCAsmStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
1058 Align ByteAlignment) {
1066 OS <<
',' <<
Log2(ByteAlignment);
1072 auto *XSym =
static_cast<MCSymbolXCOFF *
>(
Symbol);
1073 if (XSym && XSym->hasRename())
1074 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1078void MCAsmStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
1084 if (ByteAlign > 1) {
1089 OS <<
',' << ByteAlign.
value();
1092 OS <<
',' <<
Log2(ByteAlign);
1099void MCAsmStreamer::emitZerofill(MCSection *Section, MCSymbol *Symbol,
1100 uint64_t
Size, Align ByteAlignment,
1109 ".zerofill is a Mach-O specific directive");
1112 const MCSectionMachO *MOSection = ((
const MCSectionMachO*)Section);
1119 OS <<
',' <<
Log2(ByteAlignment);
1127void MCAsmStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
1128 uint64_t
Size, Align ByteAlignment) {
1134 ".zerofill is a Mach-O specific directive");
1143 if (ByteAlignment > 1)
1144 OS <<
", " <<
Log2(ByteAlignment);
1150 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1151 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1162 assert(!
Data.empty() &&
"Cannot generate an empty list.");
1163 const auto printCharacterInOctal = [&OS](
unsigned char C) {
1169 const auto printOneCharacterFor = [printCharacterInOctal](
1170 auto printOnePrintingCharacter) {
1171 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1173 printOnePrintingCharacter(
static_cast<char>(
C));
1176 printCharacterInOctal(
C);
1179 const auto printCharacterList = [
Data, &OS](
const auto &printOneCharacter) {
1180 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1181 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1182 printOneCharacter(
C);
1185 printOneCharacter(*(EndPtr - 1));
1189 printCharacterList(printCharacterInOctal);
1192 printCharacterList(printOneCharacterFor([&OS](
char C) {
1193 const char AsmCharLitBuf[2] = {
'\'',
C};
1194 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1201void MCAsmStreamer::PrintQuotedString(StringRef
Data, raw_ostream &OS)
const {
1205 for (
unsigned char C :
Data) {
1212 for (
unsigned char C :
Data) {
1213 if (
C ==
'"' ||
C ==
'\\') {
1214 OS <<
'\\' << (char)
C;
1252void MCAsmStreamer::emitBytes(StringRef
Data) {
1253 assert(getCurrentSectionOnly() &&
1254 "Cannot emit contents before setting section!");
1255 if (
Data.empty())
return;
1257 const auto emitAsString = [
this](StringRef
Data) {
1262 if (
Data.back() == 0) {
1263 OS <<
"\t.string\t";
1268 PrintQuotedString(
Data, OS);
1288 PrintQuotedString(
Data, OS);
1293 if (
Data.size() != 1 && emitAsString(
Data))
1298 if (MCTargetStreamer *TS = getTargetStreamer()) {
1299 TS->emitRawBytes(
Data);
1303 for (
const unsigned char C :
Data.bytes()) {
1304 OS << Directive << (unsigned)
C;
1309void MCAsmStreamer::emitBinaryData(StringRef
Data) {
1311 const size_t Cols = 4;
1312 for (
size_t I = 0, EI =
alignTo(
Data.size(), Cols);
I < EI;
I += Cols) {
1313 size_t J =
I, EJ = std::min(
I + Cols,
Data.size());
1316 for (; J < EJ - 1; ++J)
1317 OS <<
format(
"0x%02x", uint8_t(
Data[J])) <<
", ";
1323void MCAsmStreamer::emitIntValue(uint64_t
Value,
unsigned Size) {
1327void MCAsmStreamer::emitIntValueInHex(uint64_t
Value,
unsigned Size) {
1331void MCAsmStreamer::emitIntValueInHexWithPadding(uint64_t
Value,
1336void MCAsmStreamer::emitValueImpl(
const MCExpr *
Value,
unsigned Size,
1339 assert(getCurrentSectionOnly() &&
1340 "Cannot emit contents before setting section!");
1341 const char *Directive =
nullptr;
1352 if (!
Value->evaluateAsAbsolute(IntValue))
1367 unsigned ByteOffset =
1368 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1369 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1373 uint64_t Shift = 64 - EmissionSize * 8;
1374 assert(Shift <
static_cast<uint64_t
>(
1375 std::numeric_limits<unsigned long long>::digits) &&
1376 "undefined behavior");
1377 ValueToEmit &= ~0ULL >> Shift;
1378 emitIntValue(ValueToEmit, EmissionSize);
1384 assert(Directive &&
"Invalid size for machine code value!");
1386 if (MCTargetStreamer *TS = getTargetStreamer()) {
1387 TS->emitValue(
Value);
1394void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1396 if (
Value->evaluateAsAbsolute(IntValue)) {
1397 emitULEB128IntValue(IntValue);
1400 OS <<
"\t.uleb128 ";
1405void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1407 if (
Value->evaluateAsAbsolute(IntValue)) {
1408 emitSLEB128IntValue(IntValue);
1411 OS <<
"\t.sleb128 ";
1416void MCAsmStreamer::emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
1418 int64_t IntNumBytes;
1419 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1420 if (IsAbsolute && IntNumBytes == 0)
1424 if (!MAI->
isAIX() || FillValue == 0) {
1426 OS << ZeroDirective;
1429 OS <<
',' << (int)FillValue;
1434 "Cannot emit non-absolute expression lengths of fill.");
1435 for (
int i = 0; i < IntNumBytes; ++i) {
1446void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1447 int64_t Expr, SMLoc Loc) {
1451 OS <<
", " <<
Size <<
", 0x";
1456void MCAsmStreamer::emitAlignmentDirective(uint64_t ByteAlignment,
1457 std::optional<int64_t>
Value,
1459 unsigned MaxBytesToEmit) {
1473 switch (ValueSize) {
1477 OS <<
"\t.p2align\t";
1491 if (
Value.has_value() || MaxBytesToEmit) {
1492 if (
Value.has_value()) {
1500 OS <<
", " << MaxBytesToEmit;
1508 switch (ValueSize) {
1510 case 1: OS <<
".balign";
break;
1511 case 2: OS <<
".balignw";
break;
1512 case 4: OS <<
".balignl";
break;
1517 if (
Value.has_value())
1519 else if (MaxBytesToEmit)
1522 OS <<
", " << MaxBytesToEmit;
1526void MCAsmStreamer::emitValueToAlignment(Align Alignment, int64_t Fill,
1528 unsigned MaxBytesToEmit) {
1529 emitAlignmentDirective(Alignment.
value(), Fill, FillLen, MaxBytesToEmit);
1532void MCAsmStreamer::emitCodeAlignment(Align Alignment,
1533 const MCSubtargetInfo *STI,
1534 unsigned MaxBytesToEmit) {
1540 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1543void MCAsmStreamer::emitPrefAlign(Align Alignment) {
1544 OS <<
"\t.prefalign\t" << Alignment.
value();
1548void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1549 unsigned char Value,
1554 OS <<
", " << (unsigned)
Value;
1558void MCAsmStreamer::emitFileDirective(StringRef
Filename) {
1565void MCAsmStreamer::emitFileDirective(StringRef
Filename,
1566 StringRef CompilerVersion,
1567 StringRef TimeStamp,
1568 StringRef Description) {
1572 bool useTimeStamp = !TimeStamp.
empty();
1573 bool useCompilerVersion = !CompilerVersion.
empty();
1574 bool useDescription = !Description.
empty();
1575 if (useTimeStamp || useCompilerVersion || useDescription) {
1578 PrintQuotedString(TimeStamp, OS);
1579 if (useCompilerVersion || useDescription) {
1581 if (useCompilerVersion)
1582 PrintQuotedString(CompilerVersion, OS);
1583 if (useDescription) {
1585 PrintQuotedString(Description, OS);
1592void MCAsmStreamer::printDwarfFileDirective(
1593 unsigned FileNo, StringRef Directory, StringRef
Filename,
1594 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1595 bool UseDwarfDirectory, raw_svector_ostream &OS)
const {
1596 SmallString<128> FullPathName;
1598 if (!UseDwarfDirectory && !Directory.
empty()) {
1602 FullPathName = Directory;
1609 OS <<
"\t.file\t" << FileNo <<
' ';
1610 if (!Directory.
empty()) {
1611 PrintQuotedString(Directory, OS);
1616 OS <<
" md5 0x" << Checksum->digest();
1619 PrintQuotedString(*Source, OS);
1623Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
1624 unsigned FileNo, StringRef Directory, StringRef
Filename,
1625 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1627 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1629 MCDwarfLineTable &Table =
getContext().getMCDwarfLineTable(CUID);
1631 Expected<unsigned> FileNoOrErr =
1636 FileNo = FileNoOrErr.
get();
1643 SmallString<128> Str;
1644 raw_svector_ostream OS1(Str);
1645 printDwarfFileDirective(FileNo, Directory,
Filename, Checksum, Source,
1646 UseDwarfDirectory, OS1);
1648 if (MCTargetStreamer *TS = getTargetStreamer())
1649 TS->emitDwarfFileDirective(OS1.str());
1651 emitRawText(OS1.str());
1656void MCAsmStreamer::emitDwarfFile0Directive(
1657 StringRef Directory, StringRef
Filename,
1658 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1672 SmallString<128> Str;
1673 raw_svector_ostream OS1(Str);
1674 printDwarfFileDirective(0, Directory,
Filename, Checksum, Source,
1675 UseDwarfDirectory, OS1);
1677 if (MCTargetStreamer *TS = getTargetStreamer())
1678 TS->emitDwarfFileDirective(OS1.str());
1680 emitRawText(OS1.str());
1683void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1684 unsigned Column,
unsigned Flags,
1685 unsigned Isa,
unsigned Discriminator,
1687 StringRef Comment) {
1695 Discriminator, FileName, Comment);
1699 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1702 OS <<
" basic_block";
1704 OS <<
" prologue_end";
1706 OS <<
" epilogue_begin";
1708 unsigned OldFlags =
getContext().getCurrentDwarfLoc().getFlags();
1719 OS <<
" isa " << Isa;
1728 OS << FileName <<
':' <<
Line <<
':' << Column;
1734 Discriminator, FileName, Comment);
1737void MCAsmStreamer::emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name) {
1739 OS <<
".loc_label\t" <<
Name;
1743MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1749bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
1750 ArrayRef<uint8_t> Checksum,
1751 unsigned ChecksumKind) {
1756 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1759 if (!ChecksumKind) {
1765 PrintQuotedString(
toHex(Checksum), OS);
1772bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1773 OS <<
"\t.cv_func_id " << FuncId <<
'\n';
1777bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1780 unsigned IALine,
unsigned IACol,
1782 OS <<
"\t.cv_inline_site_id " << FunctionId <<
" within " << IAFunc
1783 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1785 IALine, IACol, Loc);
1788void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1789 unsigned Line,
unsigned Column,
1790 bool PrologueEnd,
bool IsStmt,
1791 StringRef FileName, SMLoc Loc) {
1793 if (!checkCVLocSection(FunctionId, FileNo, Loc))
1796 OS <<
"\t.cv_loc\t" << FunctionId <<
" " << FileNo <<
" " <<
Line <<
" "
1799 OS <<
" prologue_end";
1812void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1813 const MCSymbol *FnStart,
1814 const MCSymbol *FnEnd) {
1815 OS <<
"\t.cv_linetable\t" << FunctionId <<
", ";
1816 FnStart->
print(OS, MAI);
1818 FnEnd->
print(OS, MAI);
1823void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1824 unsigned SourceFileId,
1825 unsigned SourceLineNum,
1826 const MCSymbol *FnStartSym,
1827 const MCSymbol *FnEndSym) {
1828 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1829 <<
' ' << SourceLineNum <<
' ';
1830 FnStartSym->
print(OS, MAI);
1832 FnEndSym->
print(OS, MAI);
1835 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1838void MCAsmStreamer::PrintCVDefRangePrefix(
1839 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1840 OS <<
"\t.cv_def_range\t";
1841 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
1849void MCAsmStreamer::emitCVDefRangeDirective(
1850 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1851 codeview::DefRangeRegisterRelHeader DRHdr) {
1852 PrintCVDefRangePrefix(Ranges);
1853 OS <<
", reg_rel, ";
1859void MCAsmStreamer::emitCVDefRangeDirective(
1860 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1861 codeview::DefRangeSubfieldRegisterHeader DRHdr) {
1862 PrintCVDefRangePrefix(Ranges);
1863 OS <<
", subfield_reg, ";
1868void MCAsmStreamer::emitCVDefRangeDirective(
1869 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1870 codeview::DefRangeRegisterHeader DRHdr) {
1871 PrintCVDefRangePrefix(Ranges);
1877void MCAsmStreamer::emitCVDefRangeDirective(
1878 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1879 codeview::DefRangeFramePointerRelHeader DRHdr) {
1880 PrintCVDefRangePrefix(Ranges);
1881 OS <<
", frame_ptr_rel, ";
1886void MCAsmStreamer::emitCVStringTableDirective() {
1887 OS <<
"\t.cv_stringtable";
1891void MCAsmStreamer::emitCVFileChecksumsDirective() {
1892 OS <<
"\t.cv_filechecksums";
1896void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1897 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1901void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L) {
1902 OS <<
"\t.cv_fpo_data\t";
1903 ProcSym->
print(OS, MAI);
1907void MCAsmStreamer::emitIdent(StringRef IdentString) {
1910 PrintQuotedString(IdentString, OS);
1914void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug,
bool SFrame) {
1916 OS <<
"\t.cfi_sections ";
1925 OS <<
".debug_frame";
1937void MCAsmStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
1938 OS <<
"\t.cfi_startproc";
1944void MCAsmStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
1946 OS <<
"\t.cfi_endproc";
1950void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1956 if (std::optional<MCRegister> LLVMRegister =
1958 InstPrinter->printRegName(OS, *LLVMRegister);
1965void MCAsmStreamer::emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc) {
1967 OS <<
"\t.cfi_def_cfa ";
1973void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc) {
1975 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
1979void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
1982 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
1990 OS <<
"\t.cfi_escape ";
1991 if (!Values.
empty()) {
1992 size_t e = Values.
size() - 1;
1993 for (
size_t i = 0; i < e; ++i)
1999void MCAsmStreamer::emitCFIEscape(StringRef Values, SMLoc Loc) {
2005void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc) {
2008 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2015void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc) {
2017 OS <<
"\t.cfi_def_cfa_register ";
2022void MCAsmStreamer::emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc) {
2024 OS <<
"\t.cfi_offset ";
2030void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *Sym,
2031 unsigned Encoding) {
2033 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2034 Sym->
print(OS, MAI);
2038void MCAsmStreamer::emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding) {
2040 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2041 Sym->
print(OS, MAI);
2045void MCAsmStreamer::emitCFIRememberState(SMLoc Loc) {
2047 OS <<
"\t.cfi_remember_state";
2051void MCAsmStreamer::emitCFIRestoreState(SMLoc Loc) {
2053 OS <<
"\t.cfi_restore_state";
2057void MCAsmStreamer::emitCFIRestore(int64_t
Register, SMLoc Loc) {
2059 OS <<
"\t.cfi_restore ";
2064void MCAsmStreamer::emitCFISameValue(int64_t
Register, SMLoc Loc) {
2066 OS <<
"\t.cfi_same_value ";
2071void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2074 OS <<
"\t.cfi_rel_offset ";
2080void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc) {
2082 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2086void MCAsmStreamer::emitCFISignalFrame() {
2088 OS <<
"\t.cfi_signal_frame";
2092void MCAsmStreamer::emitCFIUndefined(int64_t
Register, SMLoc Loc) {
2094 OS <<
"\t.cfi_undefined ";
2099void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2102 OS <<
"\t.cfi_register ";
2103 EmitRegisterName(Register1);
2105 EmitRegisterName(Register2);
2109void MCAsmStreamer::emitCFIWindowSave(SMLoc Loc) {
2111 OS <<
"\t.cfi_window_save";
2115void MCAsmStreamer::emitCFINegateRAState(SMLoc Loc) {
2117 OS <<
"\t.cfi_negate_ra_state";
2121void MCAsmStreamer::emitCFINegateRAStateWithPC(SMLoc Loc) {
2123 OS <<
"\t.cfi_negate_ra_state_with_pc";
2127void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2129 OS <<
"\t.cfi_return_column ";
2134void MCAsmStreamer::emitCFILabelDirective(SMLoc Loc, StringRef Name) {
2136 OS <<
"\t.cfi_label " <<
Name;
2140void MCAsmStreamer::emitCFIBKeyFrame() {
2142 OS <<
"\t.cfi_b_key_frame";
2146void MCAsmStreamer::emitCFIMTETaggedFrame() {
2148 OS <<
"\t.cfi_mte_tagged_frame";
2152void MCAsmStreamer::emitCFIValOffset(int64_t
Register, int64_t
Offset,
2155 OS <<
"\t.cfi_val_offset ";
2161void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc) {
2169void MCAsmStreamer::emitWinCFIEndProc(SMLoc Loc) {
2172 OS <<
"\t.seh_endproc";
2176void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(SMLoc Loc) {
2179 OS <<
"\t.seh_endfunclet";
2183void MCAsmStreamer::emitWinCFISplitChained(SMLoc Loc) {
2186 OS <<
"\t.seh_splitchained";
2190void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
2191 bool Except, SMLoc Loc) {
2194 OS <<
"\t.seh_handler ";
2195 Sym->
print(OS, MAI);
2201 OS <<
", " << Marker <<
"unwind";
2203 OS <<
", " << Marker <<
"except";
2207void MCAsmStreamer::emitWinEHHandlerData(SMLoc Loc) {
2214 WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo();
2222 MCSection *XData = getAssociatedXDataSection(TextSec);
2223 switchSectionNoPrint(XData);
2225 OS <<
"\t.seh_handlerdata";
2229void MCAsmStreamer::emitWinCFIPushReg(MCRegister
Register, SMLoc Loc) {
2232 OS <<
"\t.seh_pushreg ";
2233 InstPrinter->printRegName(OS,
Register);
2237void MCAsmStreamer::emitWinCFISetFrame(MCRegister
Register,
unsigned Offset,
2241 OS <<
"\t.seh_setframe ";
2242 InstPrinter->printRegName(OS,
Register);
2247void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size, SMLoc Loc) {
2250 OS <<
"\t.seh_stackalloc " <<
Size;
2254void MCAsmStreamer::emitWinCFISaveReg(MCRegister
Register,
unsigned Offset,
2258 OS <<
"\t.seh_savereg ";
2259 InstPrinter->printRegName(OS,
Register);
2264void MCAsmStreamer::emitWinCFISaveXMM(MCRegister
Register,
unsigned Offset,
2268 OS <<
"\t.seh_savexmm ";
2269 InstPrinter->printRegName(OS,
Register);
2274void MCAsmStreamer::emitWinCFIPushFrame(
bool Code, SMLoc Loc) {
2277 OS <<
"\t.seh_pushframe";
2283void MCAsmStreamer::emitWinCFIEndProlog(SMLoc Loc) {
2286 OS <<
"\t.seh_endprologue";
2290void MCAsmStreamer::emitWinCFIBeginEpilogue(SMLoc Loc) {
2293 OS <<
"\t.seh_startepilogue";
2297void MCAsmStreamer::emitWinCFIEndEpilogue(SMLoc Loc) {
2300 OS <<
"\t.seh_endepilogue";
2304void MCAsmStreamer::emitWinCFIUnwindV2Start(SMLoc Loc) {
2307 OS <<
"\t.seh_unwindv2start";
2311void MCAsmStreamer::emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc) {
2314 OS <<
"\t.seh_unwindversion " << (unsigned)
Version;
2318void MCAsmStreamer::emitCGProfileEntry(
const MCSymbolRefExpr *From,
2319 const MCSymbolRefExpr *To,
2321 OS <<
"\t.cg_profile ";
2325 OS <<
", " <<
Count;
2329void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2330 const MCSubtargetInfo &STI) {
2331 raw_ostream &OS = getCommentOS();
2332 SmallString<256>
Code;
2336 if (!getAssembler().getEmitterPtr())
2339 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2342 bool ForceLE =
getContext().getTargetTriple().isRISCV();
2349 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2352 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2354 MCFixupKindInfo
Info =
2355 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2356 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2357 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2358 assert(Index <
Code.size() * 8 &&
"Invalid offset in fixup!");
2359 FixupMap[
Index] = 1 + i;
2365 OS <<
"encoding: [";
2366 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2371 uint8_t MapEntry = FixupMap[i * 8 + 0];
2372 for (
unsigned j = 1;
j != 8; ++
j) {
2373 if (FixupMap[i * 8 + j] == MapEntry)
2376 MapEntry = uint8_t(~0U);
2380 if (MapEntry != uint8_t(~0U)) {
2381 if (MapEntry == 0) {
2382 OS <<
format(
"0x%02x", uint8_t(Code[i]));
2386 OS <<
format(
"0x%02x", uint8_t(Code[i])) <<
'\''
2387 << char(
'A' + MapEntry - 1) <<
'\'';
2389 OS << char(
'A' + MapEntry - 1);
2394 for (
unsigned j = 8;
j--;) {
2402 FixupBit = i * 8 +
j;
2404 FixupBit = i * 8 + (7-
j);
2406 if (uint8_t MapEntry = FixupMap[FixupBit]) {
2407 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2408 OS << char(
'A' + MapEntry - 1);
2416 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2418 OS <<
" fixup " << char(
'A' + i) <<
" - "
2419 <<
"offset: " <<
F.getOffset() <<
", value: ";
2421 auto Kind =
F.getKind();
2423 OS <<
", relocation type: " <<
Kind;
2426 auto Info = getAssembler().getBackend().getFixupKindInfo(Kind);
2427 if (
F.isPCRel() && StringRef(
Info.Name).starts_with(
"FK_Data_"))
2428 OS <<
"FK_PCRel_" << (
Info.TargetSize / 8);
2436void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2437 const MCSubtargetInfo &STI) {
2439 MCSection *Sec = getCurrentSectionOnly();
2443 if (MAI->
isAIX() && CurFrag)
2449 AddEncodingComment(Inst, STI);
2454 getCommentOS() <<
"\n";
2457 if(getTargetStreamer())
2458 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
2460 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
2462 StringRef Comments = CommentToEmit;
2463 if (Comments.
size() && Comments.
back() !=
'\n')
2464 getCommentOS() <<
"\n";
2469void MCAsmStreamer::emitPseudoProbe(uint64_t
Guid, uint64_t Index,
2470 uint64_t
Type, uint64_t Attr,
2471 uint64_t Discriminator,
2474 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2479 for (
const auto &Site : InlineStack)
2480 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2483 FnSym->
print(OS, MAI);
2488void MCAsmStreamer::emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
2489 const MCExpr *Expr, SMLoc) {
2500void MCAsmStreamer::emitAddrsig() {
2505void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *Sym) {
2506 OS <<
"\t.addrsig_sym ";
2507 Sym->
print(OS, MAI);
2514void MCAsmStreamer::emitRawTextImpl(StringRef
String) {
2515 String.consume_back(
"\n");
2520void MCAsmStreamer::finishImpl() {
2535 const auto &Tables =
getContext().getMCDwarfLineTables();
2536 if (!Tables.empty()) {
2537 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2538 if (
auto *Label = Tables.begin()->second.getLabel()) {
2539 switchSection(
getContext().getObjectFileInfo()->getDwarfLineSection(), 0);
2545void MCAsmStreamer::emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment) {
2557MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2558 const Twine &Comment) {
2566 return getContext().createTempSymbol(Prefix +
"_end");
2570void MCAsmStreamer::emitDwarfLineStartLabel(MCSymbol *StartSym) {
2581 emitLabel(DebugLineSymTmp);
2585 unsigned LengthFieldSize =
2591 emitAssignment(StartSym, OuterSym);
2597void MCAsmStreamer::emitDwarfLineEndEntry(MCSection *Section,
2598 MCSymbol *LastLabel,
2599 MCSymbol *EndLabel) {
2606 ".loc should not be generated together with raw data!");
2619 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, EndLabel,
2624void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2625 const MCSymbol *LastLabel,
2626 const MCSymbol *Label,
2627 unsigned PointerSize) {
2629 ".loc/.file don't need raw data in debug line section!");
2632 AddComment(
"Set address to " +
Label->getName());
2633 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2634 emitULEB128IntValue(PointerSize + 1);
2635 emitIntValue(dwarf::DW_LNE_set_address, 1);
2636 emitSymbolValue(Label, PointerSize);
2640 AddComment(
"Start sequence");
2648 AddComment(
"End sequence");
2649 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2650 emitULEB128IntValue(1);
2651 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2656 AddComment(
"Advance line " + Twine(LineDelta));
2657 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2658 emitSLEB128IntValue(LineDelta);
2659 emitIntValue(dwarf::DW_LNS_copy, 1);
2663 std::unique_ptr<formatted_raw_ostream> OS,
2664 std::unique_ptr<MCInstPrinter> IP,
2665 std::unique_ptr<MCCodeEmitter> CE,
2666 std::unique_ptr<MCAsmBackend> MAB) {
2667 return new MCAsmStreamer(Context, std::move(OS), std::move(IP), std::move(CE),
unsigned const MachineRegisterInfo * MRI
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_LIKELY(EXPR)
static ManagedStatic< cl::opt< bool, true >, CreateDebug > Debug
static void PrintCFIEscape(llvm::formatted_raw_ostream &OS, StringRef Values)
static const char * getVersionMinDirective(MCVersionMinType Type)
static bool isPrintableString(StringRef Data)
static void PrintByteList(StringRef Data, raw_ostream &OS, MCAsmInfo::AsmCharLiteralSyntax ACLS)
static char toOctal(int X)
static void EmitSDKVersionSuffix(raw_ostream &OS, const VersionTuple &SDKVersion)
static int64_t truncateToSize(int64_t Value, unsigned Bytes)
static const char * getPlatformName(MachO::PlatformType Type)
#define DWARF2_FLAG_IS_STMT
#define DWARF2_FLAG_BASIC_BLOCK
#define DWARF2_FLAG_PROLOGUE_END
#define DWARF2_FLAG_EPILOGUE_BEGIN
Promote Memory to Register
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
static constexpr StringLiteral Filename
This file defines the SmallString class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
StringRef getMnemonic(unsigned Opc)
LLVM_ABI void print(raw_ostream &OS) const
Print out the bounds to a stream.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
const char * getLabelSuffix() const
bool hasDotTypeDotSizeDirective() const
bool isLittleEndian() const
True if the target is little endian.
bool doesSupportDataRegionDirectives() const
bool usesSetToEquateSymbol() const
const char * getData32bitsDirective() const
unsigned getTextAlignFillValue() const
bool useDwarfRegNumForCFI() const
bool supportsExtendedDwarfLocDirective() const
const char * getData8bitsDirective() const
const char * getData64bitsDirective() const
AsmCharLiteralSyntax characterLiteralSyntax() const
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
void printExpr(raw_ostream &, const MCExpr &) const
virtual void printSwitchToSection(const MCSection &, uint32_t Subsection, const Triple &, raw_ostream &) const
StringRef getCommentString() const
const char * getAscizDirective() const
const char * getZeroDirective() const
const char * getWeakDirective() const
const char * getData16bitsDirective() const
const char * getSeparatorString() const
bool getCOMMDirectiveAlignmentIsInBytes() const
const char * getGlobalDirective() const
unsigned getCommentColumn() const
bool hasSingleParameterDotFile() const
const char * getAsciiDirective() const
AsmCharLiteralSyntax
Assembly character literal syntax types.
@ ACLS_SingleQuotePrefix
Unknown; character literals not used by LLVM for this target.
const char * getWeakRefDirective() const
bool hasNoDeadStrip() const
bool hasIdentDirective() const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static LLVM_ABI const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
LLVM_ABI MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
const MCAsmInfo * getAsmInfo() const
dwarf::DwarfFormat getDwarfFormat() const
static LLVM_ABI void Emit(MCStreamer *MCOS, MCDwarfLineTableParams Params, int64_t LineDelta, uint64_t AddrDelta)
Utility function to emit the encoding to a streamer.
static LLVM_ABI void make(MCStreamer *MCOS, MCSection *Section)
static LLVM_ABI void emit(MCStreamer *MCOS, MCDwarfLineTableParams Params)
LLVM_ABI Expected< unsigned > tryGetFile(StringRef &Directory, StringRef &FileName, std::optional< MD5::MD5Result > Checksum, std::optional< StringRef > Source, uint16_t DwarfVersion, unsigned FileNumber=0)
const SmallVectorImpl< MCDwarfFile > & getMCDwarfFiles() const
static LLVM_ABI void Emit(MCStreamer *MCOS)
LLVM_ABI void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer=nullptr, StringRef Separator=" ", const MCContext *Ctx=nullptr) const
Dump the MCInst as prettily as possible using the additional MC structures, if given.
MCSection * getTextSection() const
StringRef getSegmentName() const
MCSymbol * getEndSymbol(MCContext &Ctx)
void setHasInstructions(bool Value)
StringRef getName() const
Streaming machine code generation interface.
virtual void emitCFIGnuArgsSize(int64_t Size, SMLoc Loc={})
virtual void emitAssignment(MCSymbol *Symbol, const MCExpr *Value)
Emit an assignment of Value to Symbol.
virtual void emitCFIDefCfa(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFIUnwindVersion(uint8_t Version, SMLoc Loc=SMLoc())
virtual bool emitCVFuncIdDirective(unsigned FunctionId)
Introduces a function id for use with .cv_loc.
virtual void emitCFIBKeyFrame()
virtual void emitWinCFIPushReg(MCRegister Register, SMLoc Loc=SMLoc())
virtual bool popSection()
Restore the current and previous section from the section stack.
virtual void emitWinEHHandler(const MCSymbol *Sym, bool Unwind, bool Except, SMLoc Loc=SMLoc())
virtual void emitCFISections(bool EH, bool Debug, bool SFrame)
virtual void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
This implements the '.loc_label Name' directive.
virtual void emitCFINegateRAStateWithPC(SMLoc Loc={})
virtual void emitCFISameValue(int64_t Register, SMLoc Loc={})
virtual void emitCFIReturnColumn(int64_t Register)
virtual void emitCFIPersonality(const MCSymbol *Sym, unsigned Encoding)
virtual void emitDwarfUnitLength(uint64_t Length, const Twine &Comment)
Emit a unit length field.
virtual void emitCFIWindowSave(SMLoc Loc={})
virtual void emitWinCFIUnwindV2Start(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndEpilogue(SMLoc Loc=SMLoc())
virtual void emitWinCFIPushFrame(bool Code, SMLoc Loc=SMLoc())
virtual void emitWinEHHandlerData(SMLoc Loc=SMLoc())
virtual void emitCFIUndefined(int64_t Register, SMLoc Loc={})
virtual void emitWinCFISaveXMM(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFINegateRAState(SMLoc Loc={})
virtual void emitCFILsda(const MCSymbol *Sym, unsigned Encoding)
virtual void emitWinCFIBeginEpilogue(SMLoc Loc=SMLoc())
virtual void emitCFIMTETaggedFrame()
virtual void emitWinCFIStartProc(const MCSymbol *Symbol, SMLoc Loc=SMLoc())
virtual void emitDwarfLineStartLabel(MCSymbol *StartSym)
Emit the debug line start label.
virtual void emitCFIEscape(StringRef Values, SMLoc Loc={})
virtual void emitLabel(MCSymbol *Symbol, SMLoc Loc=SMLoc())
Emit a label for Symbol into the current section.
virtual void emitCFIRememberState(SMLoc Loc)
virtual void emitCFILabelDirective(SMLoc Loc, StringRef Name)
virtual void emitDwarfLocDirective(unsigned FileNo, unsigned Line, unsigned Column, unsigned Flags, unsigned Isa, unsigned Discriminator, StringRef FileName, StringRef Comment={})
This implements the DWARF2 '.loc fileno lineno ...' assembler directive.
virtual void emitCVLinetableDirective(unsigned FunctionId, const MCSymbol *FnStart, const MCSymbol *FnEnd)
This implements the CodeView '.cv_linetable' assembler directive.
virtual void emitWinCFISaveReg(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProlog(SMLoc Loc=SMLoc())
virtual void emitWinCFIEndProc(SMLoc Loc=SMLoc())
virtual void emitCFIEndProcImpl(MCDwarfFrameInfo &CurFrame)
virtual void emitCFIDefCfaRegister(int64_t Register, SMLoc Loc={})
virtual MCSymbol * getDwarfLineTableSymbol(unsigned CUID)
virtual void emitCFIRegister(int64_t Register1, int64_t Register2, SMLoc Loc={})
virtual void emitWinCFIFuncletOrFuncEnd(SMLoc Loc=SMLoc())
This is used on platforms, such as Windows on ARM64, that require function or funclet sizes to be emi...
virtual void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc={})
virtual void emitCFIRelOffset(int64_t Register, int64_t Offset, SMLoc Loc)
virtual void switchSection(MCSection *Section, uint32_t Subsec=0)
Set the current section where code is being emitted to Section.
virtual void emitCFIRestoreState(SMLoc Loc)
virtual void emitCFIOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISetFrame(MCRegister Register, unsigned Offset, SMLoc Loc=SMLoc())
virtual void emitCFIDefCfaOffset(int64_t Offset, SMLoc Loc={})
virtual void emitWinCFISplitChained(SMLoc Loc=SMLoc())
virtual void emitWinCFIAllocStack(unsigned Size, SMLoc Loc=SMLoc())
virtual void emitCFIValOffset(int64_t Register, int64_t Offset, SMLoc Loc={})
virtual bool emitCVInlineSiteIdDirective(unsigned FunctionId, unsigned IAFunc, unsigned IAFile, unsigned IALine, unsigned IACol, SMLoc Loc)
Introduces an inline call site id for use with .cv_loc.
virtual void emitCFISignalFrame()
virtual void emitCFIRestore(int64_t Register, SMLoc Loc={})
virtual void emitCVInlineLinetableDirective(unsigned PrimaryFunctionId, unsigned SourceFileId, unsigned SourceLineNum, const MCSymbol *FnStartSym, const MCSymbol *FnEndSym)
This implements the CodeView '.cv_inline_linetable' assembler directive.
void emitFill(uint64_t NumBytes, uint8_t FillValue)
Emit NumBytes bytes worth of the value specified by FillValue.
virtual void emitCFILLVMDefAspaceCfa(int64_t Register, int64_t Offset, int64_t AddressSpace, SMLoc Loc={})
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx, SMLoc Loc=SMLoc())
LLVM_ABI void print(raw_ostream &OS, const MCAsmInfo *MAI) const
print - Print the value to the stream OS.
MCSection & getSection() const
Get the section associated with a defined, non-absolute symbol.
void append(StringRef RHS)
Append from a StringRef.
void push_back(const T &Elt)
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.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
Represents a version number in the form major[.minor[.subminor[.build]]].
unsigned getMajor() const
Retrieve the major version number.
std::optional< unsigned > getSubminor() const
Retrieve the subminor version number, if provided.
bool empty() const
Determine whether this version information is empty (e.g., all version components are zero).
std::optional< unsigned > getMinor() const
Retrieve the minor version number, if provided.
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & write_hex(unsigned long long N)
Output N in hexadecimal, without any prefix or padding.
size_t GetNumBytesInBuffer() const
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
constexpr char Align[]
Key for Kernel::Arg::Metadata::mAlign.
constexpr char Args[]
Key for Kernel::Metadata::mArgs.
@ C
The default llvm calling convention, compatible with C.
void emitInstruction(MCObjectStreamer &, const MCInst &Inst, const MCSubtargetInfo &STI)
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
support::ulittle32_t Word
bool isRelocation(MCFixupKind FixupKind)
LLVM_ABI int getDwarfVersion()
@ Emitted
Assigned address, still materializing.
NodeAddr< CodeNode * > Code
Context & getContext() const
uint32_t read32be(const void *P)
LLVM_ABI bool is_absolute(const Twine &path, Style style=Style::native)
Is path absolute?
LLVM_ABI void append(SmallVectorImpl< char > &path, const Twine &a, const Twine &b="", const Twine &c="", const Twine &d="")
Append to path.
This is an optimization pass for GlobalISel generic memory operations.
auto drop_begin(T &&RangeOrContainer, size_t N=1)
Return a range covering RangeOrContainer with the first N elements excluded.
FunctionAddr VTableAddr Value
@ Debug
Register 'use' is for debugging purpose.
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
static StringRef MCLOHDirectiveName()
constexpr bool isPowerOf2_64(uint64_t Value)
Return true if the argument is a power of two > 0 (64 bit edition.)
LLVM_ABI MCStreamer * createAsmStreamer(MCContext &Ctx, std::unique_ptr< formatted_raw_ostream > OS, std::unique_ptr< MCInstPrinter > InstPrint, std::unique_ptr< MCCodeEmitter > CE, std::unique_ptr< MCAsmBackend > TAB)
Create a machine code streamer which will print out assembly for the native target,...
unsigned Log2_64(uint64_t Value)
Return the floor log base 2 of the specified value, -1 if the value is zero.
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegion
.data_region
@ MCDR_DataRegionJT8
.data_region jt8
@ MCDR_DataRegionJT32
.data_region jt32
@ MCDR_DataRegionJT16
.data_region jt16
MCLOHDirective::LOHArgs MCLOHArgs
FunctionAddr VTableAddr uintptr_t uintptr_t Version
SmallVector< InlineSite, 8 > MCPseudoProbeInlineStack
@ MCVM_WatchOSVersionMin
.watchos_version_min
@ MCVM_OSXVersionMin
.macosx_version_min
@ MCVM_TvOSVersionMin
.tvos_version_min
@ MCVM_IOSVersionMin
.ios_version_min
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
FunctionAddr VTableAddr Count
LLVM_ABI raw_ostream & nulls()
This returns a reference to a raw_ostream which simply discards output.
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
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)
FunctionAddr VTableAddr uintptr_t uintptr_t Data
MCLOHType
Linker Optimization Hint Type.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
ArrayRef(const T &OneElt) -> ArrayRef< T >
void toHex(ArrayRef< uint8_t > Input, bool LowerCase, SmallVectorImpl< char > &Output)
Convert buffer Input to its hexadecimal representation. The returned string is double the size of Inp...
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
bool isPrint(char C)
Checks whether character C is printable.
unsigned encodeULEB128(uint64_t Value, raw_ostream &OS, unsigned PadTo=0)
Utility function to encode a ULEB128 value to an output stream.
unsigned Log2(Align A)
Returns the log2 of the alignment.
std::pair< MCSection *, uint32_t > MCSectionSubPair
T bit_floor(T Value)
Returns the largest integral power of two no greater than Value if Value is nonzero.
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_Memtag
.memtag (ELF)
@ MCSA_Protected
.protected (ELF)
@ MCSA_OSLinkage
symbol uses OS linkage (GOFF)
@ MCSA_Exported
.globl _foo, exported (XCOFF)
@ MCSA_PrivateExtern
.private_extern (MachO)
@ MCSA_Internal
.internal (ELF)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_LazyReference
.lazy_reference (MachO)
@ MCSA_ELF_TypeNoType
.type _foo, STT_NOTYPE # aka @notype
@ MCSA_Reference
.reference (MachO)
@ MCSA_SymbolResolver
.symbol_resolver (MachO)
@ MCSA_ELF_TypeTLS
.type _foo, STT_TLS # aka @tls_object
@ MCSA_IndirectSymbol
.indirect_symbol (MachO)
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_ELF_TypeCommon
.type _foo, STT_COMMON # aka @common
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_WeakAntiDep
.weak_anti_dep (COFF)
@ MCSA_XPLinkage
symbol uses XP linkage (GOFF)
@ MCSA_Extern
.extern (XCOFF)
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_ELF_TypeGnuUniqueObject
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
@ MCSA_Hidden
.hidden (ELF)
@ MCSA_LGlobal
.lglobl (XCOFF)
@ MCSA_Invalid
Not a valid directive.
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
static StringRef MCLOHIdToName(MCLOHType Kind)
constexpr uint64_t value() const
This is a hole in the type system and should not be abused.
const MCSymbol * Function