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()
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;
278 void emitValueToOffset(
const MCExpr *
Offset,
282 void emitFileDirective(StringRef
Filename)
override;
283 void emitFileDirective(StringRef
Filename, StringRef CompilerVersion,
284 StringRef TimeStamp, StringRef Description)
override;
285 Expected<unsigned> tryEmitDwarfFileDirective(
286 unsigned FileNo, StringRef Directory, StringRef
Filename,
287 std::optional<MD5::MD5Result> Checksum = std::nullopt,
288 std::optional<StringRef> Source = std::nullopt,
289 unsigned CUID = 0)
override;
290 void emitDwarfFile0Directive(StringRef Directory, StringRef
Filename,
291 std::optional<MD5::MD5Result> Checksum,
292 std::optional<StringRef> Source,
293 unsigned CUID = 0)
override;
294 void emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
unsigned Column,
295 unsigned Flags,
unsigned Isa,
296 unsigned Discriminator, StringRef FileName,
297 StringRef Location = {})
override;
298 void emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name)
override;
300 MCSymbol *getDwarfLineTableSymbol(
unsigned CUID)
override;
302 bool emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
303 ArrayRef<uint8_t> Checksum,
304 unsigned ChecksumKind)
override;
305 bool emitCVFuncIdDirective(
unsigned FuncId)
override;
306 bool emitCVInlineSiteIdDirective(
unsigned FunctionId,
unsigned IAFunc,
307 unsigned IAFile,
unsigned IALine,
308 unsigned IACol, SMLoc Loc)
override;
309 void emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
unsigned Line,
310 unsigned Column,
bool PrologueEnd,
bool IsStmt,
311 StringRef FileName, SMLoc Loc)
override;
312 void emitCVLinetableDirective(
unsigned FunctionId,
const MCSymbol *FnStart,
313 const MCSymbol *FnEnd)
override;
314 void emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
315 unsigned SourceFileId,
316 unsigned SourceLineNum,
317 const MCSymbol *FnStartSym,
318 const MCSymbol *FnEndSym)
override;
320 void PrintCVDefRangePrefix(
321 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges);
323 void emitCVDefRangeDirective(
324 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
325 codeview::DefRangeRegisterRelHeader DRHdr)
override;
327 void emitCVDefRangeDirective(
328 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
329 codeview::DefRangeSubfieldRegisterHeader DRHdr)
override;
331 void emitCVDefRangeDirective(
332 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
333 codeview::DefRangeRegisterHeader DRHdr)
override;
335 void emitCVDefRangeDirective(
336 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
337 codeview::DefRangeFramePointerRelHeader DRHdr)
override;
339 void emitCVStringTableDirective()
override;
340 void emitCVFileChecksumsDirective()
override;
341 void emitCVFileChecksumOffsetDirective(
unsigned FileNo)
override;
342 void emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L)
override;
344 void emitIdent(StringRef IdentString)
override;
345 void emitCFIBKeyFrame()
override;
346 void emitCFIMTETaggedFrame()
override;
347 void emitCFISections(
bool EH,
bool Debug,
bool SFrame)
override;
348 void emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
349 void emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc)
override;
350 void emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc)
override;
353 void emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
354 void emitCFIPersonality(
const MCSymbol *Sym,
unsigned Encoding)
override;
355 void emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding)
override;
356 void emitCFIRememberState(SMLoc Loc)
override;
357 void emitCFIRestoreState(SMLoc Loc)
override;
358 void emitCFIRestore(int64_t
Register, SMLoc Loc)
override;
359 void emitCFISameValue(int64_t
Register, SMLoc Loc)
override;
360 void emitCFIRelOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
361 void emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc)
override;
362 void emitCFIEscape(StringRef Values, SMLoc Loc)
override;
363 void emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc)
override;
364 void emitCFISignalFrame()
override;
365 void emitCFIUndefined(int64_t
Register, SMLoc Loc)
override;
366 void emitCFIRegister(int64_t Register1, int64_t Register2,
368 void emitCFIWindowSave(SMLoc Loc)
override;
369 void emitCFINegateRAState(SMLoc Loc)
override;
370 void emitCFINegateRAStateWithPC(SMLoc Loc)
override;
371 void emitCFIReturnColumn(int64_t
Register)
override;
372 void emitCFILabelDirective(SMLoc Loc, StringRef Name)
override;
373 void emitCFIValOffset(int64_t
Register, int64_t
Offset, SMLoc Loc)
override;
375 void emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc)
override;
376 void emitWinCFIEndProc(SMLoc Loc)
override;
377 void emitWinCFIFuncletOrFuncEnd(SMLoc Loc)
override;
378 void emitWinCFISplitChained(SMLoc Loc)
override;
379 void emitWinCFIPushReg(MCRegister
Register, SMLoc Loc)
override;
382 void emitWinCFIAllocStack(
unsigned Size, SMLoc Loc)
override;
387 void emitWinCFIPushFrame(
bool Code, SMLoc Loc)
override;
388 void emitWinCFIEndProlog(SMLoc Loc)
override;
389 void emitWinCFIBeginEpilogue(SMLoc Loc)
override;
390 void emitWinCFIEndEpilogue(SMLoc Loc)
override;
391 void emitWinCFIUnwindV2Start(SMLoc Loc)
override;
392 void emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc)
override;
394 void emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
bool Except,
396 void emitWinEHHandlerData(SMLoc Loc)
override;
398 void emitCGProfileEntry(
const MCSymbolRefExpr *From,
399 const MCSymbolRefExpr *To, uint64_t
Count)
override;
401 void emitInstruction(
const MCInst &Inst,
const MCSubtargetInfo &STI)
override;
403 void emitPseudoProbe(uint64_t
Guid, uint64_t Index, uint64_t
Type,
404 uint64_t Attr, uint64_t Discriminator,
406 MCSymbol *FnSym)
override;
408 void emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
409 const MCExpr *Expr, SMLoc Loc)
override;
411 void emitAddrsig()
override;
412 void emitAddrsigSym(
const MCSymbol *Sym)
override;
417 void emitRawTextImpl(StringRef
String)
override;
419 void finishImpl()
override;
421 void emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment)
override;
423 MCSymbol *emitDwarfUnitLength(
const Twine &Prefix,
424 const Twine &Comment)
override;
426 void emitDwarfLineStartLabel(MCSymbol *StartSym)
override;
428 void emitDwarfLineEndEntry(MCSection *Section, MCSymbol *LastLabel,
429 MCSymbol *EndLabel =
nullptr)
override;
431 void emitDwarfAdvanceLineAddr(int64_t LineDelta,
const MCSymbol *LastLabel,
432 const MCSymbol *Label,
433 unsigned PointerSize)
override;
438void MCAsmStreamer::AddComment(
const Twine &
T,
bool EOL) {
439 if (!IsVerboseAsm)
return;
441 T.toVector(CommentToEmit);
447void MCAsmStreamer::EmitCommentsAndEOL() {
453 StringRef Comments = CommentToEmit;
456 "Comment array not newline terminated");
460 size_t Position = Comments.
find(
'\n');
463 Comments = Comments.
substr(Position+1);
464 }
while (!Comments.
empty());
466 CommentToEmit.
clear();
470 assert(Bytes > 0 && Bytes <= 8 &&
"Invalid size!");
471 return Value & ((
uint64_t) (int64_t) -1 >> (64 - Bytes * 8));
474void MCAsmStreamer::emitRawComment(
const Twine &
T,
bool TabPrefix) {
481void MCAsmStreamer::addExplicitComment(
const Twine &
T) {
482 StringRef c =
T.getSingleStringRef();
486 ExplicitCommentToEmit.
append(
"\t");
491 size_t p = 2, len = c.
size() - 2;
495 ExplicitCommentToEmit.
append(
"\t");
500 ExplicitCommentToEmit.
append(
"\n");
504 ExplicitCommentToEmit.
append(
"\t");
506 }
else if (c.
front() ==
'#') {
508 ExplicitCommentToEmit.
append(
"\t");
512 assert(
false &&
"Unexpected Assembly Comment");
514 if (c.
back() ==
'\n')
515 emitExplicitComments();
518void MCAsmStreamer::emitExplicitComments() {
519 StringRef Comments = ExplicitCommentToEmit;
520 if (!Comments.
empty())
522 ExplicitCommentToEmit.
clear();
525void MCAsmStreamer::switchSection(MCSection *Section, uint32_t Subsection) {
527 if (!EmittedSectionDirective ||
529 EmittedSectionDirective =
true;
530 if (MCTargetStreamer *TS = getTargetStreamer()) {
531 TS->changeSection(Cur.first, Section, Subsection, OS);
540bool MCAsmStreamer::popSection() {
543 auto [Sec, Subsec] = getCurrentSection();
548void MCAsmStreamer::emitELFSymverDirective(
const MCSymbol *OriginalSym,
550 bool KeepOriginalSym) {
552 OriginalSym->
print(OS, MAI);
554 if (!KeepOriginalSym && !
Name.contains(
"@@@"))
559void MCAsmStreamer::emitLabel(MCSymbol *Symbol, SMLoc Loc) {
564 if (!
Symbol->isVariable() &&
579 assert(NbArgs != -1 && ((
size_t)NbArgs) ==
Args.size() &&
"Malformed LOH!");
580 assert(str !=
"" &&
"Invalid LOH name");
585 for (
const MCSymbol *Arg : Args) {
594void MCAsmStreamer::emitGNUAttribute(
unsigned Tag,
unsigned Value) {
595 OS <<
"\t.gnu_attribute " <<
Tag <<
", " <<
Value <<
"\n";
598void MCAsmStreamer::emitSubsectionsViaSymbols() {
599 OS <<
".subsections_via_symbols\n";
602void MCAsmStreamer::emitLinkerOptions(ArrayRef<std::string>
Options) {
603 assert(!
Options.empty() &&
"At least one option is required!");
604 OS <<
"\t.linker_option \"" <<
Options[0] <<
'"';
606 OS <<
", " <<
'"' << Opt <<
'"';
635 if (SDKVersion.
empty())
637 OS <<
'\t' <<
"sdk_version " << SDKVersion.
getMajor();
638 if (
auto Minor = SDKVersion.
getMinor()) {
639 OS <<
", " << *Minor;
641 OS <<
", " << *Subminor;
647 unsigned Minor,
unsigned Update,
648 VersionTuple SDKVersion) {
651 OS <<
", " << Update;
658#define PLATFORM(platform, id, name, build_name, target, tapi_target, \
660 case MachO::PLATFORM_##platform: \
662#include "llvm/BinaryFormat/MachO.def"
667void MCAsmStreamer::emitBuildVersion(
unsigned Platform,
unsigned Major,
668 unsigned Minor,
unsigned Update,
669 VersionTuple SDKVersion) {
671 OS <<
"\t.build_version " << PlatformName <<
", " << Major <<
", " << Minor;
673 OS <<
", " << Update;
678void MCAsmStreamer::emitDarwinTargetVariantBuildVersion(
679 unsigned Platform,
unsigned Major,
unsigned Minor,
unsigned Update,
680 VersionTuple SDKVersion) {
681 emitBuildVersion(Platform, Major, Minor, Update, SDKVersion);
684void MCAsmStreamer::emitAssignment(MCSymbol *Symbol,
const MCExpr *
Value) {
689 OS << (UseSet ?
", " :
" = ");
696void MCAsmStreamer::emitConditionalAssignment(MCSymbol *Symbol,
697 const MCExpr *
Value) {
698 OS <<
".lto_set_conditional ";
705void MCAsmStreamer::emitWeakReference(MCSymbol *Alias,
const MCSymbol *Symbol) {
707 Alias->
print(OS, MAI);
713bool MCAsmStreamer::emitSymbolAttribute(MCSymbol *Symbol,
730 default:
return false;
753 OS <<
"\t.no_dead_strip\t";
758 OS <<
"\t.private_extern\t";
767 OS <<
"\t.weak_definition\t";
784 OS <<
"\t.weak_anti_dep\t";
794void MCAsmStreamer::emitSymbolDesc(MCSymbol *Symbol,
unsigned DescValue) {
795 OS <<
".desc" <<
' ';
797 OS <<
',' << DescValue;
801void MCAsmStreamer::emitSyntaxDirective() {
803 OS <<
"\t.intel_syntax noprefix";
811void MCAsmStreamer::beginCOFFSymbolDef(
const MCSymbol *Symbol) {
818void MCAsmStreamer::emitCOFFSymbolStorageClass(
int StorageClass) {
823void MCAsmStreamer::emitCOFFSymbolType(
int Type) {
824 OS <<
"\t.type\t" <<
Type <<
';';
828void MCAsmStreamer::endCOFFSymbolDef() {
833void MCAsmStreamer::emitCOFFSafeSEH(MCSymbol
const *Symbol) {
834 OS <<
"\t.safeseh\t";
839void MCAsmStreamer::emitCOFFSymbolIndex(MCSymbol
const *Symbol) {
845void MCAsmStreamer::emitCOFFSectionIndex(MCSymbol
const *Symbol) {
851void MCAsmStreamer::emitCOFFSecRel32(MCSymbol
const *Symbol, uint64_t
Offset) {
852 OS <<
"\t.secrel32\t";
859void MCAsmStreamer::emitCOFFImgRel32(MCSymbol
const *Symbol, int64_t
Offset) {
869void MCAsmStreamer::emitCOFFSecNumber(MCSymbol
const *Symbol) {
875void MCAsmStreamer::emitCOFFSecOffset(MCSymbol
const *Symbol) {
876 OS <<
"\t.secoffset\t";
884void MCAsmStreamer::emitXCOFFLocalCommonSymbol(MCSymbol *LabelSym,
889 "We only support writing log base-2 alignment format with XCOFF.");
892 LabelSym->
print(OS, MAI);
893 OS <<
',' <<
Size <<
',';
894 CsectSym->
print(OS, MAI);
895 OS <<
',' <<
Log2(Alignment);
901 auto *XSym =
static_cast<MCSymbolXCOFF *
>(CsectSym);
902 if (XSym->hasRename())
903 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
906void MCAsmStreamer::emitXCOFFSymbolLinkageWithVisibility(
908 auto &Sym =
static_cast<MCSymbolXCOFF &
>(*Symbol);
928 switch (Visibility) {
949 emitXCOFFRenameDirective(&Sym, Sym.getSymbolTableName());
952void MCAsmStreamer::emitXCOFFRenameDirective(
const MCSymbol *Name,
955 Name->print(OS, MAI);
958 for (
char C : Rename) {
968void MCAsmStreamer::emitXCOFFRefDirective(
const MCSymbol *Symbol) {
974void MCAsmStreamer::emitXCOFFExceptDirective(
const MCSymbol *Symbol,
975 const MCSymbol *
Trap,
978 unsigned FunctionSize,
982 OS <<
", " << Lang <<
", " << Reason;
986void MCAsmStreamer::emitXCOFFCInfoSym(StringRef Name, StringRef
Metadata) {
987 const char InfoDirective[] =
"\t.info ";
988 const char *Separator =
", ";
989 constexpr int WordSize =
sizeof(uint32_t);
993 PrintQuotedString(Name, OS);
996 size_t MetadataSize =
Metadata.size();
999 OS <<
format_hex(MetadataSize, 10) << Separator;
1002 if (MetadataSize == 0) {
1012 uint32_t PaddedSize =
alignTo(MetadataSize, WordSize);
1013 uint32_t PaddingSize = PaddedSize - MetadataSize;
1020 constexpr int WordsPerDirective = 5;
1023 int WordsBeforeNextDirective = 0;
1024 auto PrintWord = [&](
const uint8_t *WordPtr) {
1025 if (WordsBeforeNextDirective-- == 0) {
1027 OS << InfoDirective;
1028 WordsBeforeNextDirective = WordsPerDirective;
1036 for (;
Index + WordSize <= MetadataSize;
Index += WordSize)
1037 PrintWord(
reinterpret_cast<const uint8_t *
>(
Metadata.data()) + Index);
1042 assert(PaddedSize - Index == WordSize);
1043 std::array<uint8_t, WordSize> LastWord = {0};
1044 ::memcpy(LastWord.data(),
Metadata.data() + Index, MetadataSize - Index);
1045 PrintWord(LastWord.data());
1050void MCAsmStreamer::emitELFSize(MCSymbol *Symbol,
const MCExpr *
Value) {
1059void MCAsmStreamer::emitCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
1060 Align ByteAlignment) {
1068 OS <<
',' <<
Log2(ByteAlignment);
1074 auto *XSym =
static_cast<MCSymbolXCOFF *
>(
Symbol);
1075 if (XSym && XSym->hasRename())
1076 emitXCOFFRenameDirective(XSym, XSym->getSymbolTableName());
1080void MCAsmStreamer::emitLocalCommonSymbol(MCSymbol *Symbol, uint64_t
Size,
1086 if (ByteAlign > 1) {
1091 OS <<
',' << ByteAlign.
value();
1094 OS <<
',' <<
Log2(ByteAlign);
1101void MCAsmStreamer::emitZerofill(MCSection *Section, MCSymbol *Symbol,
1102 uint64_t
Size, Align ByteAlignment,
1111 ".zerofill is a Mach-O specific directive");
1114 const MCSectionMachO *MOSection = ((
const MCSectionMachO*)Section);
1121 OS <<
',' <<
Log2(ByteAlignment);
1129void MCAsmStreamer::emitTBSSSymbol(MCSection *Section, MCSymbol *Symbol,
1130 uint64_t
Size, Align ByteAlignment) {
1136 ".zerofill is a Mach-O specific directive");
1145 if (ByteAlignment > 1)
1146 OS <<
", " <<
Log2(ByteAlignment);
1152 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1153 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1164 assert(!
Data.empty() &&
"Cannot generate an empty list.");
1165 const auto printCharacterInOctal = [&OS](
unsigned char C) {
1171 const auto printOneCharacterFor = [printCharacterInOctal](
1172 auto printOnePrintingCharacter) {
1173 return [printCharacterInOctal, printOnePrintingCharacter](
unsigned char C) {
1175 printOnePrintingCharacter(
static_cast<char>(
C));
1178 printCharacterInOctal(
C);
1181 const auto printCharacterList = [
Data, &OS](
const auto &printOneCharacter) {
1182 const auto BeginPtr =
Data.begin(), EndPtr =
Data.end();
1183 for (
const unsigned char C :
make_range(BeginPtr, EndPtr - 1)) {
1184 printOneCharacter(
C);
1187 printOneCharacter(*(EndPtr - 1));
1191 printCharacterList(printCharacterInOctal);
1194 printCharacterList(printOneCharacterFor([&OS](
char C) {
1195 const char AsmCharLitBuf[2] = {
'\'',
C};
1196 OS <<
StringRef(AsmCharLitBuf,
sizeof(AsmCharLitBuf));
1203void MCAsmStreamer::PrintQuotedString(StringRef
Data, raw_ostream &OS)
const {
1207 for (
unsigned char C :
Data) {
1214 for (
unsigned char C :
Data) {
1215 if (
C ==
'"' ||
C ==
'\\') {
1216 OS <<
'\\' << (char)
C;
1254void MCAsmStreamer::emitBytes(StringRef
Data) {
1255 assert(getCurrentSectionOnly() &&
1256 "Cannot emit contents before setting section!");
1257 if (
Data.empty())
return;
1259 const auto emitAsString = [
this](StringRef
Data) {
1264 if (
Data.back() == 0) {
1265 OS <<
"\t.string\t";
1270 PrintQuotedString(
Data, OS);
1290 PrintQuotedString(
Data, OS);
1295 if (
Data.size() != 1 && emitAsString(
Data))
1300 if (MCTargetStreamer *TS = getTargetStreamer()) {
1301 TS->emitRawBytes(
Data);
1305 for (
const unsigned char C :
Data.bytes()) {
1306 OS << Directive << (unsigned)
C;
1311void MCAsmStreamer::emitBinaryData(StringRef
Data) {
1313 const size_t Cols = 4;
1314 for (
size_t I = 0, EI =
alignTo(
Data.size(), Cols);
I < EI;
I += Cols) {
1315 size_t J =
I, EJ = std::min(
I + Cols,
Data.size());
1318 for (; J < EJ - 1; ++J)
1319 OS <<
format(
"0x%02x", uint8_t(
Data[J])) <<
", ";
1325void MCAsmStreamer::emitIntValue(uint64_t
Value,
unsigned Size) {
1329void MCAsmStreamer::emitIntValueInHex(uint64_t
Value,
unsigned Size) {
1333void MCAsmStreamer::emitIntValueInHexWithPadding(uint64_t
Value,
1338void MCAsmStreamer::emitValueImpl(
const MCExpr *
Value,
unsigned Size,
1341 assert(getCurrentSectionOnly() &&
1342 "Cannot emit contents before setting section!");
1343 const char *Directive =
nullptr;
1354 if (!
Value->evaluateAsAbsolute(IntValue))
1369 unsigned ByteOffset =
1370 IsLittleEndian ?
Emitted : (Remaining - EmissionSize);
1371 uint64_t ValueToEmit = IntValue >> (ByteOffset * 8);
1375 uint64_t Shift = 64 - EmissionSize * 8;
1376 assert(Shift <
static_cast<uint64_t
>(
1377 std::numeric_limits<unsigned long long>::digits) &&
1378 "undefined behavior");
1379 ValueToEmit &= ~0ULL >> Shift;
1380 emitIntValue(ValueToEmit, EmissionSize);
1386 assert(Directive &&
"Invalid size for machine code value!");
1388 if (MCTargetStreamer *TS = getTargetStreamer()) {
1389 TS->emitValue(
Value);
1396void MCAsmStreamer::emitULEB128Value(
const MCExpr *
Value) {
1398 if (
Value->evaluateAsAbsolute(IntValue)) {
1399 emitULEB128IntValue(IntValue);
1402 OS <<
"\t.uleb128 ";
1407void MCAsmStreamer::emitSLEB128Value(
const MCExpr *
Value) {
1409 if (
Value->evaluateAsAbsolute(IntValue)) {
1410 emitSLEB128IntValue(IntValue);
1413 OS <<
"\t.sleb128 ";
1418void MCAsmStreamer::emitFill(
const MCExpr &NumBytes, uint64_t FillValue,
1420 int64_t IntNumBytes;
1421 const bool IsAbsolute = NumBytes.evaluateAsAbsolute(IntNumBytes);
1422 if (IsAbsolute && IntNumBytes == 0)
1426 if (!MAI->
isAIX() || FillValue == 0) {
1428 OS << ZeroDirective;
1431 OS <<
',' << (int)FillValue;
1436 "Cannot emit non-absolute expression lengths of fill.");
1437 for (
int i = 0; i < IntNumBytes; ++i) {
1448void MCAsmStreamer::emitFill(
const MCExpr &NumValues, int64_t
Size,
1449 int64_t Expr, SMLoc Loc) {
1453 OS <<
", " <<
Size <<
", 0x";
1458void MCAsmStreamer::emitAlignmentDirective(uint64_t ByteAlignment,
1459 std::optional<int64_t>
Value,
1461 unsigned MaxBytesToEmit) {
1475 switch (ValueSize) {
1479 OS <<
"\t.p2align\t";
1493 if (
Value.has_value() || MaxBytesToEmit) {
1494 if (
Value.has_value()) {
1502 OS <<
", " << MaxBytesToEmit;
1510 switch (ValueSize) {
1512 case 1: OS <<
".balign";
break;
1513 case 2: OS <<
".balignw";
break;
1514 case 4: OS <<
".balignl";
break;
1519 if (
Value.has_value())
1521 else if (MaxBytesToEmit)
1524 OS <<
", " << MaxBytesToEmit;
1528void MCAsmStreamer::emitValueToAlignment(Align Alignment, int64_t Fill,
1530 unsigned MaxBytesToEmit) {
1531 emitAlignmentDirective(Alignment.
value(), Fill, FillLen, MaxBytesToEmit);
1534void MCAsmStreamer::emitCodeAlignment(Align Alignment,
1535 const MCSubtargetInfo *STI,
1536 unsigned MaxBytesToEmit) {
1542 emitAlignmentDirective(Alignment.
value(), std::nullopt, 1, MaxBytesToEmit);
1545void MCAsmStreamer::emitValueToOffset(
const MCExpr *
Offset,
1546 unsigned char Value,
1551 OS <<
", " << (unsigned)
Value;
1555void MCAsmStreamer::emitFileDirective(StringRef
Filename) {
1562void MCAsmStreamer::emitFileDirective(StringRef
Filename,
1563 StringRef CompilerVersion,
1564 StringRef TimeStamp,
1565 StringRef Description) {
1569 bool useTimeStamp = !TimeStamp.
empty();
1570 bool useCompilerVersion = !CompilerVersion.
empty();
1571 bool useDescription = !Description.
empty();
1572 if (useTimeStamp || useCompilerVersion || useDescription) {
1575 PrintQuotedString(TimeStamp, OS);
1576 if (useCompilerVersion || useDescription) {
1578 if (useCompilerVersion)
1579 PrintQuotedString(CompilerVersion, OS);
1580 if (useDescription) {
1582 PrintQuotedString(Description, OS);
1589void MCAsmStreamer::printDwarfFileDirective(
1590 unsigned FileNo, StringRef Directory, StringRef
Filename,
1591 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1592 bool UseDwarfDirectory, raw_svector_ostream &OS)
const {
1593 SmallString<128> FullPathName;
1595 if (!UseDwarfDirectory && !Directory.
empty()) {
1599 FullPathName = Directory;
1606 OS <<
"\t.file\t" << FileNo <<
' ';
1607 if (!Directory.
empty()) {
1608 PrintQuotedString(Directory, OS);
1613 OS <<
" md5 0x" << Checksum->digest();
1616 PrintQuotedString(*Source, OS);
1620Expected<unsigned> MCAsmStreamer::tryEmitDwarfFileDirective(
1621 unsigned FileNo, StringRef Directory, StringRef
Filename,
1622 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1624 assert(CUID == 0 &&
"multiple CUs not supported by MCAsmStreamer");
1626 MCDwarfLineTable &Table =
getContext().getMCDwarfLineTable(CUID);
1628 Expected<unsigned> FileNoOrErr =
1633 FileNo = FileNoOrErr.
get();
1640 SmallString<128> Str;
1641 raw_svector_ostream OS1(Str);
1642 printDwarfFileDirective(FileNo, Directory,
Filename, Checksum, Source,
1643 UseDwarfDirectory, OS1);
1645 if (MCTargetStreamer *TS = getTargetStreamer())
1646 TS->emitDwarfFileDirective(OS1.str());
1648 emitRawText(OS1.str());
1653void MCAsmStreamer::emitDwarfFile0Directive(
1654 StringRef Directory, StringRef
Filename,
1655 std::optional<MD5::MD5Result> Checksum, std::optional<StringRef> Source,
1669 SmallString<128> Str;
1670 raw_svector_ostream OS1(Str);
1671 printDwarfFileDirective(0, Directory,
Filename, Checksum, Source,
1672 UseDwarfDirectory, OS1);
1674 if (MCTargetStreamer *TS = getTargetStreamer())
1675 TS->emitDwarfFileDirective(OS1.str());
1677 emitRawText(OS1.str());
1680void MCAsmStreamer::emitDwarfLocDirective(
unsigned FileNo,
unsigned Line,
1681 unsigned Column,
unsigned Flags,
1682 unsigned Isa,
unsigned Discriminator,
1684 StringRef Comment) {
1692 Discriminator, FileName, Comment);
1696 OS <<
"\t.loc\t" << FileNo <<
" " <<
Line <<
" " << Column;
1699 OS <<
" basic_block";
1701 OS <<
" prologue_end";
1703 OS <<
" epilogue_begin";
1705 unsigned OldFlags =
getContext().getCurrentDwarfLoc().getFlags();
1716 OS <<
" isa " << Isa;
1725 OS << FileName <<
':' <<
Line <<
':' << Column;
1731 Discriminator, FileName, Comment);
1734void MCAsmStreamer::emitDwarfLocLabelDirective(SMLoc Loc, StringRef Name) {
1736 OS <<
".loc_label\t" <<
Name;
1740MCSymbol *MCAsmStreamer::getDwarfLineTableSymbol(
unsigned CUID) {
1746bool MCAsmStreamer::emitCVFileDirective(
unsigned FileNo, StringRef
Filename,
1747 ArrayRef<uint8_t> Checksum,
1748 unsigned ChecksumKind) {
1753 OS <<
"\t.cv_file\t" << FileNo <<
' ';
1756 if (!ChecksumKind) {
1762 PrintQuotedString(
toHex(Checksum), OS);
1769bool MCAsmStreamer::emitCVFuncIdDirective(
unsigned FuncId) {
1770 OS <<
"\t.cv_func_id " << FuncId <<
'\n';
1774bool MCAsmStreamer::emitCVInlineSiteIdDirective(
unsigned FunctionId,
1777 unsigned IALine,
unsigned IACol,
1779 OS <<
"\t.cv_inline_site_id " << FunctionId <<
" within " << IAFunc
1780 <<
" inlined_at " << IAFile <<
' ' << IALine <<
' ' << IACol <<
'\n';
1782 IALine, IACol, Loc);
1785void MCAsmStreamer::emitCVLocDirective(
unsigned FunctionId,
unsigned FileNo,
1786 unsigned Line,
unsigned Column,
1787 bool PrologueEnd,
bool IsStmt,
1788 StringRef FileName, SMLoc Loc) {
1790 if (!checkCVLocSection(FunctionId, FileNo, Loc))
1793 OS <<
"\t.cv_loc\t" << FunctionId <<
" " << FileNo <<
" " <<
Line <<
" "
1796 OS <<
" prologue_end";
1809void MCAsmStreamer::emitCVLinetableDirective(
unsigned FunctionId,
1810 const MCSymbol *FnStart,
1811 const MCSymbol *FnEnd) {
1812 OS <<
"\t.cv_linetable\t" << FunctionId <<
", ";
1813 FnStart->
print(OS, MAI);
1815 FnEnd->
print(OS, MAI);
1820void MCAsmStreamer::emitCVInlineLinetableDirective(
unsigned PrimaryFunctionId,
1821 unsigned SourceFileId,
1822 unsigned SourceLineNum,
1823 const MCSymbol *FnStartSym,
1824 const MCSymbol *FnEndSym) {
1825 OS <<
"\t.cv_inline_linetable\t" << PrimaryFunctionId <<
' ' << SourceFileId
1826 <<
' ' << SourceLineNum <<
' ';
1827 FnStartSym->
print(OS, MAI);
1829 FnEndSym->
print(OS, MAI);
1832 PrimaryFunctionId, SourceFileId, SourceLineNum, FnStartSym, FnEndSym);
1835void MCAsmStreamer::PrintCVDefRangePrefix(
1836 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges) {
1837 OS <<
"\t.cv_def_range\t";
1838 for (std::pair<const MCSymbol *, const MCSymbol *>
Range : Ranges) {
1846void MCAsmStreamer::emitCVDefRangeDirective(
1847 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1848 codeview::DefRangeRegisterRelHeader DRHdr) {
1849 PrintCVDefRangePrefix(Ranges);
1850 OS <<
", reg_rel, ";
1856void MCAsmStreamer::emitCVDefRangeDirective(
1857 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1858 codeview::DefRangeSubfieldRegisterHeader DRHdr) {
1859 PrintCVDefRangePrefix(Ranges);
1860 OS <<
", subfield_reg, ";
1865void MCAsmStreamer::emitCVDefRangeDirective(
1866 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1867 codeview::DefRangeRegisterHeader DRHdr) {
1868 PrintCVDefRangePrefix(Ranges);
1874void MCAsmStreamer::emitCVDefRangeDirective(
1875 ArrayRef<std::pair<const MCSymbol *, const MCSymbol *>> Ranges,
1876 codeview::DefRangeFramePointerRelHeader DRHdr) {
1877 PrintCVDefRangePrefix(Ranges);
1878 OS <<
", frame_ptr_rel, ";
1883void MCAsmStreamer::emitCVStringTableDirective() {
1884 OS <<
"\t.cv_stringtable";
1888void MCAsmStreamer::emitCVFileChecksumsDirective() {
1889 OS <<
"\t.cv_filechecksums";
1893void MCAsmStreamer::emitCVFileChecksumOffsetDirective(
unsigned FileNo) {
1894 OS <<
"\t.cv_filechecksumoffset\t" << FileNo;
1898void MCAsmStreamer::emitCVFPOData(
const MCSymbol *ProcSym, SMLoc L) {
1899 OS <<
"\t.cv_fpo_data\t";
1900 ProcSym->
print(OS, MAI);
1904void MCAsmStreamer::emitIdent(StringRef IdentString) {
1907 PrintQuotedString(IdentString, OS);
1911void MCAsmStreamer::emitCFISections(
bool EH,
bool Debug,
bool SFrame) {
1913 OS <<
"\t.cfi_sections ";
1922 OS <<
".debug_frame";
1934void MCAsmStreamer::emitCFIStartProcImpl(MCDwarfFrameInfo &Frame) {
1935 OS <<
"\t.cfi_startproc";
1941void MCAsmStreamer::emitCFIEndProcImpl(MCDwarfFrameInfo &Frame) {
1943 OS <<
"\t.cfi_endproc";
1947void MCAsmStreamer::EmitRegisterName(int64_t
Register) {
1953 if (std::optional<MCRegister> LLVMRegister =
1955 InstPrinter->printRegName(OS, *LLVMRegister);
1962void MCAsmStreamer::emitCFIDefCfa(int64_t
Register, int64_t
Offset, SMLoc Loc) {
1964 OS <<
"\t.cfi_def_cfa ";
1970void MCAsmStreamer::emitCFIDefCfaOffset(int64_t
Offset, SMLoc Loc) {
1972 OS <<
"\t.cfi_def_cfa_offset " <<
Offset;
1976void MCAsmStreamer::emitCFILLVMDefAspaceCfa(int64_t
Register, int64_t
Offset,
1979 OS <<
"\t.cfi_llvm_def_aspace_cfa ";
1987 OS <<
"\t.cfi_escape ";
1988 if (!Values.
empty()) {
1989 size_t e = Values.
size() - 1;
1990 for (
size_t i = 0; i < e; ++i)
1996void MCAsmStreamer::emitCFIEscape(StringRef Values, SMLoc Loc) {
2002void MCAsmStreamer::emitCFIGnuArgsSize(int64_t
Size, SMLoc Loc) {
2005 uint8_t Buffer[16] = { dwarf::DW_CFA_GNU_args_size };
2012void MCAsmStreamer::emitCFIDefCfaRegister(int64_t
Register, SMLoc Loc) {
2014 OS <<
"\t.cfi_def_cfa_register ";
2019void MCAsmStreamer::emitCFIOffset(int64_t
Register, int64_t
Offset, SMLoc Loc) {
2021 OS <<
"\t.cfi_offset ";
2027void MCAsmStreamer::emitCFIPersonality(
const MCSymbol *Sym,
2028 unsigned Encoding) {
2030 OS <<
"\t.cfi_personality " << Encoding <<
", ";
2031 Sym->
print(OS, MAI);
2035void MCAsmStreamer::emitCFILsda(
const MCSymbol *Sym,
unsigned Encoding) {
2037 OS <<
"\t.cfi_lsda " << Encoding <<
", ";
2038 Sym->
print(OS, MAI);
2042void MCAsmStreamer::emitCFIRememberState(SMLoc Loc) {
2044 OS <<
"\t.cfi_remember_state";
2048void MCAsmStreamer::emitCFIRestoreState(SMLoc Loc) {
2050 OS <<
"\t.cfi_restore_state";
2054void MCAsmStreamer::emitCFIRestore(int64_t
Register, SMLoc Loc) {
2056 OS <<
"\t.cfi_restore ";
2061void MCAsmStreamer::emitCFISameValue(int64_t
Register, SMLoc Loc) {
2063 OS <<
"\t.cfi_same_value ";
2068void MCAsmStreamer::emitCFIRelOffset(int64_t
Register, int64_t
Offset,
2071 OS <<
"\t.cfi_rel_offset ";
2077void MCAsmStreamer::emitCFIAdjustCfaOffset(int64_t Adjustment, SMLoc Loc) {
2079 OS <<
"\t.cfi_adjust_cfa_offset " << Adjustment;
2083void MCAsmStreamer::emitCFISignalFrame() {
2085 OS <<
"\t.cfi_signal_frame";
2089void MCAsmStreamer::emitCFIUndefined(int64_t
Register, SMLoc Loc) {
2091 OS <<
"\t.cfi_undefined ";
2096void MCAsmStreamer::emitCFIRegister(int64_t Register1, int64_t Register2,
2099 OS <<
"\t.cfi_register ";
2100 EmitRegisterName(Register1);
2102 EmitRegisterName(Register2);
2106void MCAsmStreamer::emitCFIWindowSave(SMLoc Loc) {
2108 OS <<
"\t.cfi_window_save";
2112void MCAsmStreamer::emitCFINegateRAState(SMLoc Loc) {
2114 OS <<
"\t.cfi_negate_ra_state";
2118void MCAsmStreamer::emitCFINegateRAStateWithPC(SMLoc Loc) {
2120 OS <<
"\t.cfi_negate_ra_state_with_pc";
2124void MCAsmStreamer::emitCFIReturnColumn(int64_t
Register) {
2126 OS <<
"\t.cfi_return_column ";
2131void MCAsmStreamer::emitCFILabelDirective(SMLoc Loc, StringRef Name) {
2133 OS <<
"\t.cfi_label " <<
Name;
2137void MCAsmStreamer::emitCFIBKeyFrame() {
2139 OS <<
"\t.cfi_b_key_frame";
2143void MCAsmStreamer::emitCFIMTETaggedFrame() {
2145 OS <<
"\t.cfi_mte_tagged_frame";
2149void MCAsmStreamer::emitCFIValOffset(int64_t
Register, int64_t
Offset,
2152 OS <<
"\t.cfi_val_offset ";
2158void MCAsmStreamer::emitWinCFIStartProc(
const MCSymbol *Symbol, SMLoc Loc) {
2166void MCAsmStreamer::emitWinCFIEndProc(SMLoc Loc) {
2169 OS <<
"\t.seh_endproc";
2173void MCAsmStreamer::emitWinCFIFuncletOrFuncEnd(SMLoc Loc) {
2176 OS <<
"\t.seh_endfunclet";
2180void MCAsmStreamer::emitWinCFISplitChained(SMLoc Loc) {
2183 OS <<
"\t.seh_splitchained";
2187void MCAsmStreamer::emitWinEHHandler(
const MCSymbol *Sym,
bool Unwind,
2188 bool Except, SMLoc Loc) {
2191 OS <<
"\t.seh_handler ";
2192 Sym->
print(OS, MAI);
2198 OS <<
", " << Marker <<
"unwind";
2200 OS <<
", " << Marker <<
"except";
2204void MCAsmStreamer::emitWinEHHandlerData(SMLoc Loc) {
2211 WinEH::FrameInfo *CurFrame = getCurrentWinFrameInfo();
2219 MCSection *XData = getAssociatedXDataSection(TextSec);
2220 switchSectionNoPrint(XData);
2222 OS <<
"\t.seh_handlerdata";
2226void MCAsmStreamer::emitWinCFIPushReg(MCRegister
Register, SMLoc Loc) {
2229 OS <<
"\t.seh_pushreg ";
2230 InstPrinter->printRegName(OS,
Register);
2234void MCAsmStreamer::emitWinCFISetFrame(MCRegister
Register,
unsigned Offset,
2238 OS <<
"\t.seh_setframe ";
2239 InstPrinter->printRegName(OS,
Register);
2244void MCAsmStreamer::emitWinCFIAllocStack(
unsigned Size, SMLoc Loc) {
2247 OS <<
"\t.seh_stackalloc " <<
Size;
2251void MCAsmStreamer::emitWinCFISaveReg(MCRegister
Register,
unsigned Offset,
2255 OS <<
"\t.seh_savereg ";
2256 InstPrinter->printRegName(OS,
Register);
2261void MCAsmStreamer::emitWinCFISaveXMM(MCRegister
Register,
unsigned Offset,
2265 OS <<
"\t.seh_savexmm ";
2266 InstPrinter->printRegName(OS,
Register);
2271void MCAsmStreamer::emitWinCFIPushFrame(
bool Code, SMLoc Loc) {
2274 OS <<
"\t.seh_pushframe";
2280void MCAsmStreamer::emitWinCFIEndProlog(SMLoc Loc) {
2283 OS <<
"\t.seh_endprologue";
2287void MCAsmStreamer::emitWinCFIBeginEpilogue(SMLoc Loc) {
2290 OS <<
"\t.seh_startepilogue";
2294void MCAsmStreamer::emitWinCFIEndEpilogue(SMLoc Loc) {
2297 OS <<
"\t.seh_endepilogue";
2301void MCAsmStreamer::emitWinCFIUnwindV2Start(SMLoc Loc) {
2304 OS <<
"\t.seh_unwindv2start";
2308void MCAsmStreamer::emitWinCFIUnwindVersion(uint8_t
Version, SMLoc Loc) {
2311 OS <<
"\t.seh_unwindversion " << (unsigned)
Version;
2315void MCAsmStreamer::emitCGProfileEntry(
const MCSymbolRefExpr *From,
2316 const MCSymbolRefExpr *To,
2318 OS <<
"\t.cg_profile ";
2322 OS <<
", " <<
Count;
2326void MCAsmStreamer::AddEncodingComment(
const MCInst &Inst,
2327 const MCSubtargetInfo &STI) {
2328 raw_ostream &OS = getCommentOS();
2329 SmallString<256>
Code;
2333 if (!getAssembler().getEmitterPtr())
2336 getAssembler().getEmitter().encodeInstruction(Inst, Code, Fixups, STI);
2339 bool ForceLE =
getContext().getTargetTriple().isRISCV();
2346 for (
unsigned i = 0, e =
Code.size() * 8; i != e; ++i)
2349 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2351 MCFixupKindInfo
Info =
2352 getAssembler().getBackend().getFixupKindInfo(
F.getKind());
2353 for (
unsigned j = 0;
j !=
Info.TargetSize; ++
j) {
2354 unsigned Index =
F.getOffset() * 8 +
Info.TargetOffset +
j;
2355 assert(Index <
Code.size() * 8 &&
"Invalid offset in fixup!");
2356 FixupMap[
Index] = 1 + i;
2362 OS <<
"encoding: [";
2363 for (
unsigned i = 0, e =
Code.size(); i != e; ++i) {
2368 uint8_t MapEntry = FixupMap[i * 8 + 0];
2369 for (
unsigned j = 1;
j != 8; ++
j) {
2370 if (FixupMap[i * 8 + j] == MapEntry)
2373 MapEntry = uint8_t(~0U);
2377 if (MapEntry != uint8_t(~0U)) {
2378 if (MapEntry == 0) {
2379 OS <<
format(
"0x%02x", uint8_t(Code[i]));
2383 OS <<
format(
"0x%02x", uint8_t(Code[i])) <<
'\''
2384 << char(
'A' + MapEntry - 1) <<
'\'';
2386 OS << char(
'A' + MapEntry - 1);
2391 for (
unsigned j = 8;
j--;) {
2399 FixupBit = i * 8 +
j;
2401 FixupBit = i * 8 + (7-
j);
2403 if (uint8_t MapEntry = FixupMap[FixupBit]) {
2404 assert(Bit == 0 &&
"Encoder wrote into fixed up bit!");
2405 OS << char(
'A' + MapEntry - 1);
2413 for (
unsigned i = 0, e =
Fixups.size(); i != e; ++i) {
2415 OS <<
" fixup " << char(
'A' + i) <<
" - "
2416 <<
"offset: " <<
F.getOffset() <<
", value: ";
2418 auto Kind =
F.getKind();
2420 OS <<
", relocation type: " <<
Kind;
2423 auto Info = getAssembler().getBackend().getFixupKindInfo(Kind);
2424 if (
F.isPCRel() && StringRef(
Info.Name).starts_with(
"FK_Data_"))
2425 OS <<
"FK_PCRel_" << (
Info.TargetSize / 8);
2433void MCAsmStreamer::emitInstruction(
const MCInst &Inst,
2434 const MCSubtargetInfo &STI) {
2436 MCSection *Sec = getCurrentSectionOnly();
2440 if (MAI->
isAIX() && CurFrag)
2446 AddEncodingComment(Inst, STI);
2451 getCommentOS() <<
"\n";
2454 if(getTargetStreamer())
2455 getTargetStreamer()->prettyPrintAsm(*InstPrinter, 0, Inst, STI, OS);
2457 InstPrinter->printInst(&Inst, 0,
"", STI, OS);
2459 StringRef Comments = CommentToEmit;
2460 if (Comments.
size() && Comments.
back() !=
'\n')
2461 getCommentOS() <<
"\n";
2466void MCAsmStreamer::emitPseudoProbe(uint64_t
Guid, uint64_t Index,
2467 uint64_t
Type, uint64_t Attr,
2468 uint64_t Discriminator,
2471 OS <<
"\t.pseudoprobe\t" <<
Guid <<
" " <<
Index <<
" " <<
Type <<
" " << Attr;
2476 for (
const auto &Site : InlineStack)
2477 OS <<
" @ " << std::get<0>(Site) <<
":" << std::get<1>(Site);
2480 FnSym->
print(OS, MAI);
2485void MCAsmStreamer::emitRelocDirective(
const MCExpr &
Offset, StringRef Name,
2486 const MCExpr *Expr, SMLoc) {
2497void MCAsmStreamer::emitAddrsig() {
2502void MCAsmStreamer::emitAddrsigSym(
const MCSymbol *Sym) {
2503 OS <<
"\t.addrsig_sym ";
2504 Sym->
print(OS, MAI);
2511void MCAsmStreamer::emitRawTextImpl(StringRef
String) {
2512 String.consume_back(
"\n");
2517void MCAsmStreamer::finishImpl() {
2532 const auto &Tables =
getContext().getMCDwarfLineTables();
2533 if (!Tables.empty()) {
2534 assert(Tables.size() == 1 &&
"asm output only supports one line table");
2535 if (
auto *Label = Tables.begin()->second.getLabel()) {
2536 switchSection(
getContext().getObjectFileInfo()->getDwarfLineSection(), 0);
2542void MCAsmStreamer::emitDwarfUnitLength(uint64_t
Length,
const Twine &Comment) {
2554MCSymbol *MCAsmStreamer::emitDwarfUnitLength(
const Twine &Prefix,
2555 const Twine &Comment) {
2563 return getContext().createTempSymbol(Prefix +
"_end");
2567void MCAsmStreamer::emitDwarfLineStartLabel(MCSymbol *StartSym) {
2578 emitLabel(DebugLineSymTmp);
2582 unsigned LengthFieldSize =
2588 emitAssignment(StartSym, OuterSym);
2594void MCAsmStreamer::emitDwarfLineEndEntry(MCSection *Section,
2595 MCSymbol *LastLabel,
2596 MCSymbol *EndLabel) {
2603 ".loc should not be generated together with raw data!");
2616 emitDwarfAdvanceLineAddr(
INT64_MAX, LastLabel, EndLabel,
2621void MCAsmStreamer::emitDwarfAdvanceLineAddr(int64_t LineDelta,
2622 const MCSymbol *LastLabel,
2623 const MCSymbol *Label,
2624 unsigned PointerSize) {
2626 ".loc/.file don't need raw data in debug line section!");
2629 AddComment(
"Set address to " +
Label->getName());
2630 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2631 emitULEB128IntValue(PointerSize + 1);
2632 emitIntValue(dwarf::DW_LNE_set_address, 1);
2633 emitSymbolValue(Label, PointerSize);
2637 AddComment(
"Start sequence");
2645 AddComment(
"End sequence");
2646 emitIntValue(dwarf::DW_LNS_extended_op, 1);
2647 emitULEB128IntValue(1);
2648 emitIntValue(dwarf::DW_LNE_end_sequence, 1);
2653 AddComment(
"Advance line " + Twine(LineDelta));
2654 emitIntValue(dwarf::DW_LNS_advance_line, 1);
2655 emitSLEB128IntValue(LineDelta);
2656 emitIntValue(dwarf::DW_LNS_copy, 1);
2660 std::unique_ptr<formatted_raw_ostream> OS,
2661 std::unique_ptr<MCInstPrinter> IP,
2662 std::unique_ptr<MCCodeEmitter> CE,
2663 std::unique_ptr<MCAsmBackend> MAB) {
2664 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!")
Analysis containing CSE Info
#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 getAssemblerDialect() 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
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