LLVM: lib/CodeGen/AsmPrinter/AsmPrinter.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
64#include "llvm/Config/config.h"
118#include "llvm/Support/VCSRevision.h"
124#include
125#include
126#include
127#include
128#include
129#include
130#include
131#include
132#include
133#include
134
135using namespace llvm;
136
137#define DEBUG_TYPE "asm-printer"
138
139
140
141
142
149};
155 "Function Entry Count"),
157 "Basic Block Frequency"),
161 "Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is "
162 "extracted from PGO related analysis."));
163
165 "basic-block-address-map-skip-bb-entries",
166 cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP "
167 "section. It's used to save binary size when BB entries are "
168 "unnecessary for some PGOAnalysisMap features."),
170
172 "emit-jump-table-sizes-section",
173 cl::desc("Emit a section containing jump table addresses and sizes"),
175
176
177
179 "asm-print-latency",
180 cl::desc("Print instruction latencies as verbose asm comments"), cl::Hidden,
182
183STATISTIC(EmittedInsts, "Number of machine instrs printed");
184
185char AsmPrinter::ID = 0;
186
187namespace {
188class AddrLabelMapCallbackPtr final : CallbackVH {
190
191public:
192 AddrLabelMapCallbackPtr() = default;
194
197 }
198
200
203};
204}
205
208 struct AddrLabelSymEntry {
209
211
212 Function *Fn;
213 unsigned Index;
214 };
215
217
218
219
220 std::vector BBCallbacks;
221
222
223
224
226 DeletedAddrLabelsNeedingEmission;
227
228public:
230
232 assert(DeletedAddrLabelsNeedingEmission.empty() &&
233 "Some labels for deleted blocks never got emitted");
234 }
235
237
239 std::vector<MCSymbol *> &Result);
240
243};
244
247 "Shouldn't get label for block without address taken");
248 AddrLabelSymEntry &Entry = AddrLabelSymbols[BB];
249
250
251 if (!Entry.Symbols.empty()) {
253 return Entry.Symbols;
254 }
255
256
257
258 BBCallbacks.emplace_back(BB);
259 BBCallbacks.back().setMap(this);
260 Entry.Index = BBCallbacks.size() - 1;
264 Entry.Symbols.push_back(Sym);
265 return Entry.Symbols;
266}
267
268
270 Function *F, std::vector<MCSymbol *> &Result) {
272 DeletedAddrLabelsNeedingEmission.find(F);
273
274
275 if (I == DeletedAddrLabelsNeedingEmission.end())
276 return;
277
278
280 DeletedAddrLabelsNeedingEmission.erase(I);
281}
282
283
284
287
288 if (!AddrLabelSymbols)
289 AddrLabelSymbols = std::make_unique(OutContext);
290 return AddrLabelSymbols->getAddrLabelSymbolToEmit(
292}
293
295 const Function *F, std::vector<MCSymbol *> &Result) {
296
297 if (!AddrLabelSymbols)
298 return;
299 return AddrLabelSymbols->takeDeletedSymbolsForFunction(
300 const_cast<Function *>(F), Result);
301}
302
304
305
306
307 AddrLabelSymEntry Entry = std::move(AddrLabelSymbols[BB]);
308 AddrLabelSymbols.erase(BB);
309 assert(!Entry.Symbols.empty() && "Didn't have a symbol, why a callback?");
310 BBCallbacks[Entry.Index] = nullptr;
311
312#if !LLVM_MEMORY_SANITIZER_BUILD
313
315 "Block/parent mismatch");
316#endif
317
319 if (Sym->isDefined())
320 return;
321
322
323
324
325
326 DeletedAddrLabelsNeedingEmission[Entry.Fn].push_back(Sym);
327 }
328}
329
331
332 AddrLabelSymEntry OldEntry = std::move(AddrLabelSymbols[Old]);
333 AddrLabelSymbols.erase(Old);
334 assert(!OldEntry.Symbols.empty() && "Didn't have a symbol, why a callback?");
335
336 AddrLabelSymEntry &NewEntry = AddrLabelSymbols[New];
337
338
339 if (NewEntry.Symbols.empty()) {
340 BBCallbacks[OldEntry.Index].setPtr(New);
341 NewEntry = std::move(OldEntry);
342 return;
343 }
344
345 BBCallbacks[OldEntry.Index] = nullptr;
346
347
349}
350
351void AddrLabelMapCallbackPtr::deleted() {
352 Map->UpdateForDeletedBlock(cast(getValPtr()));
353}
354
355void AddrLabelMapCallbackPtr::allUsesReplacedWith(Value *V2) {
356 Map->UpdateForRAUWBlock(cast(getValPtr()), cast(V2));
357}
358
359
360
364 if (const GlobalVariable *GVar = dyn_cast(GV))
365 Alignment = DL.getPreferredAlign(GVar);
366
367
368 if (InAlign > Alignment)
369 Alignment = InAlign;
370
371
373 if (!GVAlign)
374 return Alignment;
375
376 assert(GVAlign && "GVAlign must be set");
377
378
379
380 if (*GVAlign > Alignment || GV->hasSection())
381 Alignment = *GVAlign;
382 return Alignment;
383}
384
387 OutContext(Streamer->getContext()), OutStreamer(std::move(Streamer)),
388 SM(*this) {
389 VerboseAsm = OutStreamer->isVerboseAsm();
390 DwarfUsesRelocationsAcrossSections =
392}
393
396 "Debug/EH info didn't get finalized");
397}
398
401}
402
403
406}
407
410}
411
413 assert(MMI && "MMI could not be nullptr!");
415}
416
417
418
421}
422
424 assert(MF && "getSubtargetInfo requires a valid MachineFunction!");
426}
427
430}
431
433 if (DD) {
435 "Expected assembly output mode.");
436
437
439 if (!MFSP)
440 return;
442 }
443}
444
445
447 return OutStreamer->getCurrentSectionOnly();
448}
449
457}
458
460 auto *MMIWP = getAnalysisIfAvailable();
461 MMI = MMIWP ? &MMIWP->getMMI() : nullptr;
462 HasSplitStack = false;
463 HasNoSplitStack = false;
464 DbgInfoAvailable = !M.debug_compile_units().empty();
465
466 AddrLabelSymbols = nullptr;
467
468
471
473 .getModuleMetadata(M);
474
475
476
477
478
481
482
483
484
485
486
487
488
489
491 if (Target.isOSBinFormatMachO() && Target.isOSDarwin()) {
492 Triple TVT(M.getDarwinTargetVariantTriple());
494 Target, M.getSDKVersion(),
495 M.getDarwinTargetVariantTriple().empty() ? nullptr : &TVT,
496 M.getDarwinTargetVariantSDKVersion());
497 }
498
499
501
502
503
505
507 const char VerStr[] =
508#ifdef PACKAGE_VENDOR
509 PACKAGE_VENDOR " "
510#endif
511 PACKAGE_NAME " version " PACKAGE_VERSION
512#ifdef LLVM_REVISION
513 " (" LLVM_REVISION ")"
514#endif
515 ;
516
517 OutStreamer->emitFileDirective(M.getSourceFileName(), VerStr, "", "");
518 } else {
521 }
522 }
523
524
525
527 emitModuleCommandLines(M);
528
531
532
533
534
536 OutStreamer->getContext().getObjectFileInfo()->getTextSection();
538 static_cast<MCSectionXCOFF *>(TextSection)->getQualNameSymbol();
541 }
542
543 GCModuleInfo *MI = getAnalysisIfAvailable();
544 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
547 MP->beginAssembly(M, *MI, *this);
548
549
550 if (!M.getModuleInlineAsm().empty()) {
551 OutStreamer->AddComment("Start of file scope inline assembly");
553 emitInlineAsm(
557 OutStreamer->AddComment("End of file scope inline assembly");
559 }
560
562 bool EmitCodeView = M.getCodeViewFlag();
564 Handlers.push_back(std::make_unique(this));
565 if (!EmitCodeView || M.getDwarfVersion()) {
568 Handlers.push_back(std::unique_ptr(DD));
569 }
570 }
571 }
572
574 PP = std::make_unique(this);
575
578
579 [[fallthrough]];
583 for (auto &F : M.getFunctionList()) {
586
587
589 break;
590 }
593 break;
594 default:
595 break;
596 }
597
602 break;
603 [[fallthrough]];
608 break;
611 break;
614 default: llvm_unreachable("unsupported unwinding information encoding");
616 break;
620 break;
621 }
622 break;
625 break;
628 break;
629 }
630 if (ES)
631 Handlers.push_back(std::unique_ptr(ES));
632
633
634 if (mdconst::extract_or_null(M.getModuleFlag("cfguard")))
635 EHHandlers.push_back(std::make_unique(this));
636
637 for (auto &Handler : Handlers)
638 Handler->beginModule(&M);
640 Handler->beginModule(&M);
641
642 return false;
643}
644
647 return false;
648
650}
651
654 switch (Linkage) {
661
663
665
667 else
670
672
673 } else {
674
676 }
677 return;
680 return;
683 return;
688 }
690}
691
695}
696
699}
700
702
703
704
705
706
707
708
714 }
716}
717
718
722 "No emulated TLS variables in the common section");
723
724
725
726 if (IsEmuTLSVar)
727 return;
728
730
732 return;
733
734
735
737 return;
738
740
741
743 false, GV->getParent());
745 }
746 }
747
749 MCSymbol *EmittedSym = GVSym;
750
751
752
753
755
758
761 "tagged symbols (-fsanitize=memtag-globals) are "
762 "only supported on AArch64 Android");
764 }
765
766 if (!GV->hasInitializer())
767 return;
768
772 "' is already defined");
773
776
778
781
782
783
784
786
787 for (auto &Handler : Handlers)
788 Handler->setSymbolSize(GVSym, Size);
789
790
793
795 return;
796 }
797
798
800
801
802
804 if (Size == 0)
805 Size = 1;
807
808 OutStreamer->emitZerofill(TheSection, GVSym, Size, Alignment);
809 return;
810 }
811
812
813
816 if (Size == 0)
817 Size = 1;
818
819
820
821
822
823
824
826
827 OutStreamer->emitLocalCommonSymbol(GVSym, Size, Alignment);
828 return;
829 }
830
831
833
835 return;
836 }
837
838
839
840
841
842
843
844
845
846
847
849
852
855 OutStreamer->emitTBSSSymbol(TheSection, MangSym, Size, Alignment);
858
861
864 }
865
867
868
870
872
875
876
877
878
879
880 unsigned PtrSize = DL.getPointerTypeSize(GV->getType());
882 PtrSize);
884 OutStreamer->emitSymbolValue(MangSym, PtrSize);
885
887 return;
888 }
889
890 MCSymbol *EmittedInitSym = GVSym;
891
893
896
899 if (LocalAlias != EmittedInitSym)
901
903
905
908
910}
911
912
913
914
915
918}
919
920void AsmPrinter::emitFunctionHeaderComment() {}
921
925 for (auto &C : Prefix)
927 return;
928 }
929
930
931
932
934
935 for (auto &C : Prefix) {
937 }
938
939
941}
942
943
944
945void AsmPrinter::emitFunctionHeader() {
947
950 << "-- Begin function "
952
953
955
956
957
958
961 else
964
967 else
969
973
976
977 if (F.hasFnAttribute(Attribute::Cold))
979
980
981 if (F.hasPrefixData())
982 emitFunctionPrefix({F.getPrefixData()});
983
984
986
987
988
989 unsigned PatchableFunctionPrefix = 0;
990 unsigned PatchableFunctionEntry = 0;
991 (void)F.getFnAttribute("patchable-function-prefix")
992 .getValueAsString()
993 .getAsInteger(10, PatchableFunctionPrefix);
994 (void)F.getFnAttribute("patchable-function-entry")
995 .getValueAsString()
996 .getAsInteger(10, PatchableFunctionEntry);
997 if (PatchableFunctionPrefix) {
1001 emitNops(PatchableFunctionPrefix);
1002 } else if (PatchableFunctionEntry) {
1003
1004
1006 }
1007
1008
1009 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_func_sanitize)) {
1010 assert(MD->getNumOperands() == 2);
1011
1012 auto *PrologueSig = mdconst::extract(MD->getOperand(0));
1013 auto *TypeHash = mdconst::extract(MD->getOperand(1));
1014 emitFunctionPrefix({PrologueSig, TypeHash});
1015 }
1016
1018 F.printAsOperand(OutStreamer->getCommentOS(),
1019 false, F.getParent());
1020 emitFunctionHeaderComment();
1022 }
1023
1024
1025
1026
1027
1030
1031
1032
1034
1035
1036
1037
1038 std::vector<MCSymbol*> DeadBlockSyms;
1040 for (MCSymbol *DeadBlockSym : DeadBlockSyms) {
1041 OutStreamer->AddComment("Address taken block that was later removed");
1043 }
1044
1051 } else {
1053 }
1054 }
1055
1056
1057 for (auto &Handler : Handlers) {
1058 Handler->beginFunction(MF);
1059 Handler->beginBasicBlockSection(MF->front());
1060 }
1062 Handler->beginFunction(MF);
1063 Handler->beginBasicBlockSection(MF->front());
1064 }
1065
1066
1067 if (F.hasPrologueData())
1069}
1070
1071
1072
1075
1076
1077
1080 "' is a protected alias");
1081
1083
1092 }
1093 }
1094}
1095
1096
1101
1102
1103
1104
1105
1106 std::optional Size;
1107 if ((Size = MI.getRestoreSize(TII))) {
1108 CommentOS << Size->getValue() << "-byte Reload\n";
1109 } else if ((Size = MI.getFoldedRestoreSize(TII))) {
1110 if (->hasValue())
1111 CommentOS << "Unknown-size Folded Reload\n";
1112 else if (Size->getValue())
1113 CommentOS << Size->getValue() << "-byte Folded Reload\n";
1114 } else if ((Size = MI.getSpillSize(TII))) {
1115 CommentOS << Size->getValue() << "-byte Spill\n";
1116 } else if ((Size = MI.getFoldedSpillSize(TII))) {
1117 if (->hasValue())
1118 CommentOS << "Unknown-size Folded Spill\n";
1119 else if (Size->getValue())
1120 CommentOS << Size->getValue() << "-byte Folded Spill\n";
1121 }
1122
1123
1125 CommentOS << " Reload Reuse\n";
1126
1133
1135 CommentOS << " Latency: " << Latency << "\n";
1136 }
1137}
1138
1139
1140
1142 Register RegNo = MI->getOperand(0).getReg();
1143
1146 OS << "implicit-def: "
1148
1151}
1152
1154 std::string Str;
1156 OS << "kill:";
1158 assert(Op.isReg() && "KILL instruction must have only register operands");
1159 OS << ' ' << (Op.isDef() ? "def " : "killed ")
1161 }
1164}
1165
1167 std::string Str;
1169 OS << "fake_use:";
1171
1172
1173 if (.isReg())
1174 continue;
1176 }
1179}
1180
1181
1182
1183
1185
1186 if (MI->isNonListDebugValue() && MI->getNumOperands() != 4)
1187 return false;
1188
1191 OS << "DEBUG_VALUE: ";
1192
1194 if (auto *SP = dyn_cast(V->getScope())) {
1196 if (.empty())
1198 }
1199 OS << V->getName();
1200 OS << " <- ";
1201
1202 const DIExpression *Expr = MI->getDebugExpression();
1203
1204
1206 Expr = *NonVariadicExpr;
1207
1209 OS << '[';
1210 ListSeparator LS;
1213 for (unsigned I = 0; I < Op.getNumArgs(); ++I)
1214 OS << ' ' << Op.getArg(I);
1215 }
1216 OS << "] ";
1217 }
1218
1219
1221 if (&Op != MI->debug_operands().begin())
1222 OS << ", ";
1223 switch (Op.getType()) {
1226 Type *ImmTy = Op.getFPImm()->getType();
1230 } else {
1231
1232
1237 }
1238 break;
1239 }
1242 break;
1243 }
1245 Op.getCImm()->getValue().print(OS, false );
1246 break;
1247 }
1249 OS << "!target-index(" << Op.getIndex() << "," << Op.getOffset() << ")";
1250 break;
1251 }
1255 std::optional Offset;
1256 if (Op.isReg()) {
1257 Reg = Op.getReg();
1258 } else {
1262 }
1263 if (!Reg) {
1264
1265 OS << "undef";
1266 break;
1267 }
1268
1269 if (MI->isIndirectDebugValue())
1272 OS << '[';
1275 OS << '+' << Offset->getFixed() << ']';
1276 break;
1277 }
1278 default:
1280 }
1281 }
1282
1283
1285 return true;
1286}
1287
1288
1289
1290
1292 if (MI->getNumOperands() != 1)
1293 return false;
1294
1297 OS << "DEBUG_LABEL: ";
1298
1299 const DILabel *V = MI->getDebugLabel();
1300 if (auto *SP = dyn_cast(
1301 V->getScope()->getNonLexicalBlockFileScope())) {
1303 if (.empty())
1305 }
1306 OS << V->getName();
1307
1308
1310 return true;
1311}
1312
1315
1316 if (F.isDeclarationForLinker())
1318
1320 F.needsUnwindTableEntry())
1322
1325
1328
1330}
1331
1335}
1336
1339}
1340
1343}
1344
1350 return;
1351
1353 return;
1354
1355
1356
1357 auto *MBB = MI.getParent();
1358 auto I = std::next(MI.getIterator());
1359 while (I != MBB->end() && I->isTransient())
1360 ++I;
1363 return;
1364
1366 unsigned CFIIndex = MI.getOperand(0).getCFIIndex();
1369}
1370
1372
1373 MCSymbol *FrameAllocSym = MI.getOperand(0).getMCSymbol();
1374 int FrameOffset = MI.getOperand(1).getImm();
1375
1376
1377 OutStreamer->emitAssignment(FrameAllocSym,
1379}
1380
1381
1382
1383
1390 .encode();
1391}
1392
1395
1396
1401 "-pgo-anaylsis-map can accept only all or none with no additional "
1402 "values.");
1403 }
1404
1407 bool FuncEntryCountEnabled =
1409 PGOMapFeaturesEnum::FuncEntryCount));
1410 bool BBFreqEnabled =
1413 bool BrProbEnabled =
1416
1419 "BB entries info is required for BBFreq and BrProb "
1420 "features");
1421 }
1422 return {FuncEntryCountEnabled, BBFreqEnabled, BrProbEnabled,
1425}
1426
1430 assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
1431
1433
1435 OutStreamer->switchSection(BBAddrMapSection);
1437 uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
1438 OutStreamer->emitInt8(BBAddrMapVersion);
1441 OutStreamer->emitInt8(Features.encode());
1442
1443 if (Features.MultiBBRange) {
1444 OutStreamer->AddComment("number of basic block ranges");
1446 }
1447
1449 const MCSymbol *PrevMBBEndSymbol = nullptr;
1450 if (!Features.MultiBBRange) {
1451 OutStreamer->AddComment("function address");
1453 OutStreamer->AddComment("number of basic blocks");
1455 PrevMBBEndSymbol = FunctionSymbol;
1456 } else {
1457 unsigned BBCount = 0;
1459 BBCount++;
1461
1463
1464 BBCount = 0;
1465 }
1466 }
1467 }
1468
1472 bool IsBeginSection =
1474 if (IsBeginSection) {
1475 OutStreamer->AddComment("base address");
1477 OutStreamer->AddComment("number of basic blocks");
1479 PrevMBBEndSymbol = MBBSymbol;
1480 }
1481
1482 if (!Features.OmitBBEntries) {
1483
1484 if (BBAddrMapVersion > 1) {
1486
1487
1488
1489
1490
1492 }
1493
1494
1496
1497
1499
1501 }
1502
1504 }
1505
1506 if (Features.hasPGOAnalysis()) {
1507 assert(BBAddrMapVersion >= 2 &&
1508 "PGOAnalysisMap only supports version 2 or later");
1509
1510 if (Features.FuncEntryCount) {
1511 OutStreamer->AddComment("function entry count");
1514 MaybeEntryCount ? MaybeEntryCount->getCount() : 0);
1515 }
1517 Features.BBFreq
1518 ? &getAnalysis().getBFI()
1519 : nullptr;
1521 Features.BrProb
1522 ? &getAnalysis().getMBPI()
1523 : nullptr;
1524
1525 if (Features.BBFreq || Features.BrProb) {
1527 if (Features.BBFreq) {
1528 OutStreamer->AddComment("basic block frequency");
1531 }
1532 if (Features.BrProb) {
1534 OutStreamer->AddComment("basic block successor count");
1535 OutStreamer->emitULEB128IntValue(SuccCount);
1537 OutStreamer->AddComment("successor BB ID");
1538 OutStreamer->emitULEB128IntValue(SuccMBB->getBBID()->BaseID);
1539 OutStreamer->AddComment("successor branch probability");
1542 }
1543 }
1544 }
1545 }
1546 }
1547
1549}
1550
1555 if (!Section)
1556 return;
1557
1560
1563 OutStreamer->emitAbsoluteSymbolDiff(Symbol, Loc, 4);
1564
1566}
1567
1570 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_kcfi_type))
1572 mdconst::extract(MD->getOperand(0)));
1573}
1574
1576 if (PP) {
1577 auto GUID = MI.getOperand(0).getImm();
1578 auto Index = MI.getOperand(1).getImm();
1579 auto Type = MI.getOperand(2).getImm();
1580 auto Attr = MI.getOperand(3).getImm();
1582 PP->emitPseudoProbe(GUID, Index, Type, Attr, DebugLoc);
1583 }
1584}
1585
1588 return;
1589
1592 if (!StackSizeSection)
1593 return;
1594
1596
1598 return;
1599
1601 OutStreamer->switchSection(StackSizeSection);
1602
1607 OutStreamer->emitULEB128IntValue(StackSize);
1608
1610}
1611
1614
1615
1617 return;
1618
1622
1623 if (StackUsageStream == nullptr) {
1624 std::error_code EC;
1625 StackUsageStream =
1627 if (EC) {
1628 errs() << "Could not open file: " << EC.message();
1629 return;
1630 }
1631 }
1632
1634 *StackUsageStream << DSP->getFilename() << ':' << DSP->getLine();
1635 else
1637
1638 *StackUsageStream << ':' << MF.getName() << '\t' << StackSize << '\t';
1640 *StackUsageStream << "dynamic\n";
1641 else
1642 *StackUsageStream << "static\n";
1643}
1644
1649 PCSectionsSymbols[&MD].emplace_back(S);
1650}
1651
1654 if (PCSectionsSymbols.empty() && .hasMetadata(LLVMContext::MD_pcsections))
1655 return;
1656
1658 const unsigned RelativeRelocSize =
1660 : 4;
1661
1662
1663
1664 auto SwitchSection = [&, Prev = StringRef()](const StringRef &Sec) mutable {
1665 if (Sec == Prev)
1666 return;
1668 assert(S && "PC section is not initialized");
1670 Prev = Sec;
1671 };
1672
1674 bool Deltas) {
1675
1676
1677
1678 assert(isa(MD.getOperand(0)) && "first operand not a string");
1679 bool ConstULEB128 = false;
1681 if (auto *S = dyn_cast(MDO)) {
1682
1683
1684
1685 const StringRef SecWithOpt = S->getString();
1686 const size_t OptStart = SecWithOpt.find('!');
1688 const StringRef Opts = SecWithOpt.substr(OptStart);
1689 ConstULEB128 = Opts.contains('C');
1690#ifndef NDEBUG
1691 for (char O : Opts)
1692 assert((O == '!' || O == 'C') && "Invalid !pcsections options");
1693#endif
1694 SwitchSection(Sec);
1695 const MCSymbol *Prev = Syms.front();
1697 if (Sym == Prev || !Deltas) {
1698
1701
1702
1703
1705 } else {
1706
1707 if (ConstULEB128)
1709 else
1711 }
1712 Prev = Sym;
1713 }
1714 } else {
1715
1716 assert(isa(MDO) && "expecting either string or tuple");
1717 const auto *AuxMDs = cast(MDO);
1718 for (const MDOperand &AuxMDO : AuxMDs->operands()) {
1719 assert(isa(AuxMDO) && "expecting a constant");
1720 const Constant *C = cast(AuxMDO)->getValue();
1722 const uint64_t Size = DL.getTypeStoreSize(C->getType());
1723
1724 if (auto *CI = dyn_cast(C);
1725 CI && ConstULEB128 && Size > 1 && Size <= 8) {
1727 } else {
1729 }
1730 }
1731 }
1732 }
1733 };
1734
1736
1737 if (const MDNode *MD = F.getMetadata(LLVMContext::MD_pcsections))
1739
1740 for (const auto &MS : PCSectionsSymbols)
1741 EmitForMD(*MS.first, MS.second, false);
1743 PCSectionsSymbols.clear();
1744}
1745
1746
1748 if (Asm.hasDebugInfo() || !MF.getLandingPads().empty() ||
1751 return true;
1752
1753
1754
1756 return false;
1759}
1760
1761
1762
1765 MI.getParent()->getParent()->getSubtarget().getInstrInfo();
1769 return Name;
1771 assert(.empty() && "Missing mnemonic and name for opcode");
1772 return Name;
1773}
1774
1775
1776
1778 emitFunctionHeader();
1779
1780
1782
1784
1785 auto MDTWrapper = getAnalysisIfAvailable();
1786 MDT = MDTWrapper ? &MDTWrapper->getDomTree() : nullptr;
1787 if () {
1788 OwnedMDT = std::make_unique();
1789 OwnedMDT->recalculate(*MF);
1790 MDT = OwnedMDT.get();
1791 }
1792
1793
1794 auto *MLIWrapper = getAnalysisIfAvailable();
1795 MLI = MLIWrapper ? &MLIWrapper->getLI() : nullptr;
1796 if () {
1797 OwnedMLI = std::make_unique();
1798 OwnedMLI->analyze(*MDT);
1799 MLI = OwnedMLI.get();
1800 }
1801 }
1802
1803
1804 bool HasAnyRealCode = false;
1805 int NumInstsInFunction = 0;
1807
1809 if (this->MF)
1811 else
1813
1815
1816
1820
1822
1826
1827 if (.isPosition() &&
.isImplicitDef() &&
.isKill() &&
1828 .isDebugInstr()) {
1829 HasAnyRealCode = true;
1830 }
1831
1832
1833 if (MCSymbol *S = MI.getPreInstrSymbol())
1835
1836 if (MDNode *MD = MI.getPCSections())
1838
1839 for (auto &Handler : Handlers)
1840 Handler->beginInstruction(&MI);
1841
1844
1845 switch (MI.getOpcode()) {
1846 case TargetOpcode::CFI_INSTRUCTION:
1848 break;
1849 case TargetOpcode::LOCAL_ESCAPE:
1851 break;
1852 case TargetOpcode::ANNOTATION_LABEL:
1853 case TargetOpcode::GC_LABEL:
1854 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1855 break;
1856 case TargetOpcode::EH_LABEL:
1857 OutStreamer->emitLabel(MI.getOperand(0).getMCSymbol());
1858
1859
1860
1861
1862
1863
1864
1865 {
1866 auto MI2 = std::next(MI.getIterator());
1867 if (IsEHa && MI2 != MBB.end() &&
1868 (MI2->mayLoadOrStore() || MI2->mayRaiseFPException()))
1870 }
1871 break;
1872 case TargetOpcode::INLINEASM:
1873 case TargetOpcode::INLINEASM_BR:
1874 emitInlineAsm(&MI);
1875 break;
1876 case TargetOpcode::DBG_VALUE:
1877 case TargetOpcode::DBG_VALUE_LIST:
1881 }
1882 break;
1883 case TargetOpcode::DBG_INSTR_REF:
1884
1885
1886
1887 break;
1888 case TargetOpcode::DBG_PHI:
1889
1890
1891 break;
1892 case TargetOpcode::DBG_LABEL:
1896 }
1897 break;
1898 case TargetOpcode::IMPLICIT_DEF:
1900 break;
1901 case TargetOpcode::KILL:
1903 break;
1904 case TargetOpcode::FAKE_USE:
1907 break;
1908 case TargetOpcode::PSEUDO_PROBE:
1910 break;
1911 case TargetOpcode::ARITH_FENCE:
1913 OutStreamer->emitRawComment("ARITH_FENCE");
1914 break;
1915 case TargetOpcode::MEMBARRIER:
1916 OutStreamer->emitRawComment("MEMBARRIER");
1917 break;
1918 case TargetOpcode::JUMP_TABLE_DEBUG_INFO:
1919
1920
1921 break;
1922 case TargetOpcode::INIT_UNDEF:
1923
1924
1925 break;
1926 default:
1928
1929 auto CountInstruction = [&](const MachineInstr &MI) {
1930
1931 if (MI.isMetaInstruction())
1932 return;
1933 ++NumInstsInFunction;
1934 if (CanDoExtraAnalysis) {
1936 ++MnemonicCounts[Name];
1937 }
1938 };
1939 if (.isBundle()) {
1940 CountInstruction(MI);
1941 break;
1942 }
1943
1944 for (auto It = std::next(MI.getIterator());
1945 It != MBB.end() && It->isInsideBundle(); ++It) {
1946 CountInstruction(*It);
1947 }
1948 break;
1949 }
1950
1951
1952 if (MCSymbol *S = MI.getPostInstrSymbol())
1954
1955 for (auto &Handler : Handlers)
1956 Handler->endInstruction();
1957 }
1958
1959
1960
1961
1965
1967
1968
1971
1976 OutStreamer->emitELFSize(CurrentSectionBeginSym, SizeExp);
1977 }
1979 "Overwrite section range");
1982 }
1983 }
1985
1986 if (CanDoExtraAnalysis) {
1987
1989 continue;
1990
1993
1994
1995
1997 for (auto &KV : MnemonicCounts)
1998 MnemonicVec.emplace_back(KV.first, KV.second);
1999
2000 sort(MnemonicVec, [](const std::pair<StringRef, unsigned> &A,
2001 const std::pair<StringRef, unsigned> &B) {
2003 return true;
2004 if (A.second == B.second)
2006 return false;
2007 });
2008 R << "BasicBlock: " << ore::NV("BasicBlock", MBB.getName()) << "\n";
2009 for (auto &KV : MnemonicVec) {
2010 auto Name = (Twine("INST_") + getToken(KV.first.trim()).first).str();
2011 R << KV.first << ": " << ore::NV(Name, KV.second) << "\n";
2012 }
2014 }
2015 }
2016
2017 EmittedInsts += NumInstsInFunction;
2021 R << ore::NV("NumInstructions", NumInstsInFunction)
2022 << " instructions in function";
2024
2025
2026
2027
2028
2029
2030
2031
2032
2035 (TT.isOSWindows() && TT.isOSBinFormatCOFF()))) {
2037
2038
2039
2041 OutStreamer->AddComment("avoids zero-length function");
2043 }
2044 }
2045
2046
2048
2050 for (const auto &BB : F) {
2051 if (!BB.hasAddressTaken())
2052 continue;
2054 if (Sym->isDefined())
2055 continue;
2056 OutStreamer->AddComment("Address of block that was removed by CodeGen");
2058 }
2059
2060
2062
2063
2064
2066
2067
2068
2071
2074 }
2075
2076
2077
2078 if (EmitFunctionSize) {
2079
2080
2087 }
2088
2089
2090
2092 for (auto &Handler : Handlers)
2093 Handler->endBasicBlockSection(MF->back());
2095 Handler->endBasicBlockSection(MF->back());
2096 }
2097 for (auto &Handler : Handlers)
2098 Handler->markFunctionEnd();
2100 Handler->markFunctionEnd();
2101
2103
2104
2106
2107
2108 for (auto &Handler : Handlers)
2109 Handler->endFunction(MF);
2111 Handler->endFunction(MF);
2112
2113
2114
2115 if (HasAnyRealCode) {
2120 SMLoc(), "pgo-analysis-map is enabled for function " + MF->getName() +
2121 " but it does not have labels");
2122 }
2123
2124
2126
2127
2129
2130
2132
2134
2136 OutStreamer->getCommentOS() << "-- End function\n";
2137
2139}
2140
2141
2143 if ()
2144 return 0;
2145
2146 if (isa(C))
2147 return 1;
2148
2149 unsigned NumUses = 0;
2150 for (const auto *CU : C->users())
2152
2153 return NumUses;
2154}
2155
2156
2157
2158
2159
2160
2162 unsigned &NumGOTEquivUsers) {
2163
2164
2165
2168 !isa(GV->getOperand(0)))
2169 return false;
2170
2171
2172
2173 for (const auto *U : GV->users())
2175
2176 return NumGOTEquivUsers > 0;
2177}
2178
2179
2180
2181
2182
2183
2184
2185
2188 return;
2189
2190 for (const auto &G : M.globals()) {
2191 unsigned NumGOTEquivUsers = 0;
2193 continue;
2194
2196 GlobalGOTEquivs[GOTEquivSym] = std::make_pair(&G, NumGOTEquivUsers);
2197 }
2198}
2199
2200
2201
2202
2205 return;
2206
2210 unsigned Cnt = I.second.second;
2211 if (Cnt)
2213 }
2215
2216 for (const auto *GV : FailedCandidates)
2218}
2219
2223
2224
2225 if (!IsFunction)
2227
2228
2229
2230
2231
2233
2235 return;
2236
2238
2239
2240 if (IsFunction)
2243 return;
2244 }
2245
2250 else
2252
2253
2254
2255 if (IsFunction) {
2259 OutStreamer->emitCOFFSymbolStorageClass(
2265 }
2266 }
2267
2269
2271
2272 if (MAI->isMachO() && isa(Expr))
2274
2275
2278 if (LocalAlias != Name)
2279 OutStreamer->emitAssignment(LocalAlias, Expr);
2280
2281
2282
2283
2284
2285
2292 }
2293}
2294
2295void AsmPrinter::emitGlobalIFunc(Module &M, const GlobalIFunc &GI) {
2297 "IFunc is not supported on AIX.");
2298
2304 else
2306 };
2307
2310 EmitLinkage(Name);
2313
2314
2318 if (LocalAlias != Name)
2319 OutStreamer->emitAssignment(LocalAlias, Expr);
2320
2321 return;
2322 }
2323
2326
2327
2328
2329
2330
2331
2332
2333
2334
2335
2336
2337
2338
2339
2340
2341
2342
2346
2348
2354
2356
2361
2363 EmitLinkage(Stub);
2368
2373}
2374
2377 return;
2378
2380
2381 std::optional<SmallString<128>> Filename;
2382 if (std::optional FilenameRef = RS.getFilename()) {
2383 Filename = *FilenameRef;
2385 assert(!Filename->empty() && "The filename can't be empty.");
2386 }
2387
2388 std::string Buf;
2390 std::unique_ptrremarks::MetaSerializer MetaSerializer =
2391 Filename ? RemarkSerializer.metaSerializer(OS, Filename->str())
2393 MetaSerializer->emit();
2394
2395
2398 OutStreamer->switchSection(RemarksSection);
2399
2401}
2402
2404 Constant *Initializer = G->getInitializer();
2406 M.getDataLayout().getTypeAllocSize(Initializer->getType());
2407
2409 if (SizeInBytes != NewSize) {
2410
2415 M, Initializer->getType(), G->isConstant(), G->getLinkage(),
2416 Initializer, "", G, G->getThreadLocalMode(), G->getAddressSpace());
2417 NewGV->copyAttributesFrom(G);
2418 NewGV->setComdat(G->getComdat());
2419 NewGV->copyMetadata(G, 0);
2420
2421 NewGV->takeName(G);
2422 G->replaceAllUsesWith(NewGV);
2423 G->eraseFromParent();
2424 G = NewGV;
2425 }
2426
2427 if (G->getAlign().valueOrOne() < 16)
2428 G->setAlignment(Align(16));
2429
2430
2431
2433}
2434
2436
2437
2438
2439 MF = nullptr;
2440
2441 std::vector<GlobalVariable *> GlobalsToTag;
2443 if (G.isDeclaration() || .isTagged())
2444 continue;
2446 }
2449
2450
2451
2452
2453
2455
2456
2457 for (const auto &G : M.globals())
2459
2460
2462
2464
2465
2467 if (.isDeclarationForLinker())
2468 continue;
2469
2471
2472
2476 continue;
2477
2479 continue;
2480 }
2481
2482 if (F.isIntrinsic())
2483 continue;
2484
2485
2486
2487
2489
2491
2492
2493
2494 if (F.hasAddressTaken())
2496 }
2497
2498
2499
2500
2503
2505
2508
2509
2511 if (!Stubs.empty()) {
2514
2516 for (const auto &Stub : Stubs) {
2518 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2519 DL.getPointerSize());
2520 }
2521 }
2522 }
2523
2527
2528
2530 if (!Stubs.empty()) {
2532
2533 for (const auto &Stub : Stubs) {
2544 OutStreamer->emitSymbolValue(Stub.second.getPointer(),
2545 DL.getPointerSize());
2546 }
2547 }
2548 }
2549
2550
2551
2552 if (auto *TS = OutStreamer->getTargetStreamer())
2553 TS->emitConstantPools();
2554
2555
2556
2557
2558
2560
2561
2562
2563
2564
2567 for (const auto &Alias : M.aliases()) {
2568 if (Alias.hasAvailableExternallyLinkage())
2569 continue;
2570 for (const GlobalAlias *Cur = &Alias; Cur;
2571 Cur = dyn_cast(Cur->getAliasee())) {
2572 if (!AliasVisited.insert(Cur).second)
2573 break;
2575 }
2578 AliasStack.clear();
2579 }
2580
2581
2582
2583
2584 for (const auto &IFunc : M.ifuncs())
2585 emitGlobalIFunc(M, IFunc);
2586
2587
2588 for (auto &Handler : Handlers)
2589 Handler->endModule();
2591 Handler->endModule();
2592
2593
2594
2595
2598 DD = nullptr;
2599
2600
2602
2603
2604
2605
2606
2607
2608 for (const auto &GO : M.global_objects()) {
2609 if (!GO.hasExternalWeakLinkage())
2610 continue;
2612 }
2614 auto SymbolName = "swift_async_extendedFramePointerFlags";
2615 auto Global = M.getGlobalVariable(SymbolName);
2620 SymbolName);
2622 }
2623 }
2624 }
2625
2626 GCModuleInfo *MI = getAnalysisIfAvailable();
2627 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
2630 MP->finishAssembly(M, *MI, *this);
2631
2632
2633 emitModuleIdents(M);
2634
2635
2636
2638 emitModuleCommandLines(M);
2639
2640
2641
2645 if (HasNoSplitStack)
2648 }
2649
2650
2651
2652 Function *InitTrampolineIntrinsic = M.getFunction("llvm.init.trampoline");
2653 if (!InitTrampolineIntrinsic || InitTrampolineIntrinsic->use_empty())
2656
2658
2660 for (const GlobalValue &GV : M.global_values()) {
2661 if (!GV.use_empty() && !GV.isThreadLocal() &&
2662 !GV.hasDLLImportStorageClass() &&
2663 !GV.getName().starts_with("llvm.") &&
2664 !GV.hasAtLeastLocalUnnamedAddr())
2666 }
2667 }
2668
2669
2671 unsigned UniqueID = 0;
2672 for (const GlobalValue &GV : M.global_values()) {
2673 if (!GV.hasPartition() || GV.isDeclarationForLinker() ||
2675 continue;
2676
2679 "", false, ++UniqueID, nullptr));
2680 OutStreamer->emitBytes(GV.getPartition());
2685 }
2686 }
2687
2688
2689
2691
2692 MMI = nullptr;
2693 AddrLabelSymbols = nullptr;
2694
2697 OwnedMLI.reset();
2698 OwnedMDT.reset();
2699
2700 return false;
2701}
2702
2704 auto Res = MBBSectionExceptionSyms.try_emplace(MBB.getSectionID());
2705 if (Res.second)
2707 return Res.first->second;
2708}
2709
2711 this->MF = &MF;
2713
2714
2715
2717 HasSplitStack = true;
2718
2720 HasNoSplitStack = true;
2721 } else
2722 HasNoSplitStack = true;
2723
2724
2727 } else {
2729 "Only AIX uses the function descriptor hooks.");
2730
2731
2732
2734 " initalized first.");
2735
2736
2738 }
2739
2743 CurrentSectionBeginSym = nullptr;
2745 MBBSectionExceptionSyms.clear();
2747 if (F.hasFnAttribute("patchable-function-entry") ||
2748 F.hasFnAttribute("function-instrument") ||
2749 F.hasFnAttribute("xray-instruction-threshold") ||
2754 if (NeedsLocalForSize)
2756 }
2757
2758 ORE = &getAnalysis().getORE();
2759}
2760
2761namespace {
2762
2763
2764 struct SectionCPs {
2766 Align Alignment;
2768
2769 SectionCPs(MCSection *s, Align a) : S(s), Alignment(a) {}
2770 };
2771
2772}
2773
2774
2775
2776
2777
2780 const std::vector &CP = MCP->getConstants();
2781 if (CP.empty()) return;
2782
2783
2784
2786 for (unsigned i = 0, e = CP.size(); i != e; ++i) {
2789
2791
2795
2798
2799
2800
2801 bool Found = false;
2802 unsigned SecIdx = CPSections.size();
2803 while (SecIdx != 0) {
2804 if (CPSections[--SecIdx].S == S) {
2805 Found = true;
2806 break;
2807 }
2808 }
2809 if (!Found) {
2810 SecIdx = CPSections.size();
2811 CPSections.push_back(SectionCPs(S, Alignment));
2812 }
2813
2814 if (Alignment > CPSections[SecIdx].Alignment)
2815 CPSections[SecIdx].Alignment = Alignment;
2816 CPSections[SecIdx].CPEs.push_back(i);
2817 }
2818
2819
2820 const MCSection *CurSection = nullptr;
2821 unsigned Offset = 0;
2822 for (unsigned i = 0, e = CPSections.size(); i != e; ++i) {
2823 for (unsigned j = 0, ee = CPSections[i].CPEs.size(); j != ee; ++j) {
2824 unsigned CPI = CPSections[i].CPEs[j];
2826 if (->isUndefined())
2827 continue;
2828
2829 if (CurSection != CPSections[i].S) {
2830 OutStreamer->switchSection(CPSections[i].S);
2832 CurSection = CPSections[i].S;
2834 }
2835
2837
2838
2841
2843
2847 else
2849 }
2850 }
2851}
2852
2853
2854
2858 if (!MJTI) return;
2860 const std::vector &JT = MJTI->getJumpTables();
2861 if (JT.empty()) return;
2862
2863
2864
2870 F);
2871 if (JTInDiffSection) {
2872
2874 OutStreamer->switchSection(ReadOnlySection);
2875 }
2876
2878
2879
2880
2881 if (!JTInDiffSection)
2883
2884 for (unsigned JTI = 0, e = JT.size(); JTI != e; ++JTI) {
2885 const std::vector<MachineBasicBlock*> &JTBBs = JT[JTI].MBBs;
2886
2887
2888 if (JTBBs.empty()) continue;
2889
2890
2891
2898 if (!EmittedSets.insert(MBB).second)
2899 continue;
2900
2901
2907 }
2908 }
2909
2910
2911
2912
2913
2914 if (JTInDiffSection && DL.hasLinkerPrivateGlobalPrefix())
2915
2916
2917
2919
2922
2923
2924
2926 emitJumpTableEntry(*MJTI, MBB, JTI);
2927 }
2928
2930 emitJumpTableSizesSection(*MJTI, F);
2931
2932 if (!JTInDiffSection)
2934}
2935
2938 const std::vector &JT = MJTI.getJumpTables();
2939
2940 if (JT.empty())
2941 return;
2942
2943 StringRef GroupName = F.hasComdat() ? F.getComdat()->getName() : "";
2944 MCSection *JumpTableSizesSection = nullptr;
2945 StringRef sectionName = ".llvm_jump_table_sizes";
2946
2949
2950 if (!isCoff && !isElf)
2951 return;
2952
2953 if (isElf) {
2955 int Flags = F.hasComdat() ? static_cast<int>(ELF::SHF_GROUP) : 0;
2956
2960 } else if (isCoff) {
2961 if (F.hasComdat()) {
2963 sectionName,
2967 } else {
2972 }
2973 }
2974
2975 OutStreamer->switchSection(JumpTableSizesSection);
2976
2977 for (unsigned JTI = 0, E = JT.size(); JTI != E; ++JTI) {
2978 const std::vector<MachineBasicBlock *> &JTBBs = JT[JTI].MBBs;
2981 }
2982}
2983
2984
2985
2988 unsigned UID) const {
2997 break;
2999
3000
3002 break;
3004
3005
3006
3009 return;
3010 }
3011
3013
3014
3015
3018 return;
3019 }
3020
3023
3024
3025
3026
3027
3028
3029
3034 break;
3035 }
3040 break;
3041 }
3042 }
3043
3045
3048}
3049
3050
3051
3052
3054 if (GV->getName() == "llvm.used") {
3056 emitLLVMUsedList(cast(GV->getInitializer()));
3057 return true;
3058 }
3059
3060
3061 if (GV->getSection() == "llvm.metadata" ||
3063 return true;
3064
3065 if (GV->getName() == "llvm.arm64ec.symbolmap") {
3066
3067
3068
3071 auto *Arr = cast(GV->getInitializer());
3072 for (auto &U : Arr->operands()) {
3073 auto *C = cast(U);
3074 auto *Src = cast(C->getOperand(0)->stripPointerCasts());
3075 auto *Dst = cast(C->getOperand(1)->stripPointerCasts());
3076 int Kind = cast(C->getOperand(2))->getZExtValue();
3077
3078 if (Src->hasDLLImportStorageClass()) {
3079
3080
3085 } else {
3086
3087
3088
3089
3093 }
3094 }
3095 return true;
3096 }
3097
3099
3101
3102 if (GV->getName() == "llvm.global_ctors") {
3104 true);
3105
3106 return true;
3107 }
3108
3109 if (GV->getName() == "llvm.global_dtors") {
3111 false);
3112
3113 return true;
3114 }
3115
3116 report_fatal_error("unknown special variable with appending linkage");
3117}
3118
3119
3120
3121void AsmPrinter::emitLLVMUsedList(const ConstantArray *InitList) {
3122
3123 for (unsigned i = 0, e = InitList->getNumOperands(); i != e; ++i) {
3126 if (GV)
3128 }
3129}
3130
3134
3135
3136 if (!isa(List))
3137 return;
3138
3139
3140 for (Value *O : cast(List)->operands()) {
3141 auto *CS = cast(O);
3142 if (CS->getOperand(1)->isNullValue())
3143 break;
3144 ConstantInt *Priority = dyn_cast(CS->getOperand(0));
3145 if (!Priority)
3146 continue;
3151 if (!CS->getOperand(2)->isNullValue()) {
3154 "associated data of XXStructor list is not yet supported on AIX");
3156 dyn_cast(CS->getOperand(2)->stripPointerCasts());
3157 }
3158 }
3159
3160
3162 return L.Priority < R.Priority;
3163 });
3164}
3165
3166
3167
3169 bool IsCtor) {
3172 if (Structors.empty())
3173 return;
3174
3175
3176
3178 std::reverse(Structors.begin(), Structors.end());
3179
3180 const Align Align = DL.getPointerPrefAlignment();
3181 for (Structor &S : Structors) {
3183 const MCSymbol *KeySym = nullptr;
3186
3187
3188
3189
3190
3191 continue;
3192
3194 }
3195
3199 OutStreamer->switchSection(OutputSection);
3203 }
3204}
3205
3206void AsmPrinter::emitModuleIdents(Module &M) {
3208 return;
3209
3210 if (const NamedMDNode *NMD = M.getNamedMetadata("llvm.ident")) {
3211 for (const MDNode *N : NMD->operands()) {
3212 assert(N->getNumOperands() == 1 &&
3213 "llvm.ident metadata entry can have only one operand");
3214 const MDString *S = cast(N->getOperand(0));
3216 }
3217 }
3218}
3219
3220void AsmPrinter::emitModuleCommandLines(Module &M) {
3222 if (!CommandLine)
3223 return;
3224
3225 const NamedMDNode *NMD = M.getNamedMetadata("llvm.commandline");
3227 return;
3228
3230 OutStreamer->switchSection(CommandLine);
3233 assert(N->getNumOperands() == 1 &&
3234 "llvm.commandline metadata entry can have only one operand");
3235 const MDString *S = cast(N->getOperand(0));
3238 }
3240}
3241
3242
3243
3244
3245
3246
3247
3249
3250
3252
3253
3255
3256
3260
3262}
3263
3265 unsigned PadTo) const {
3268
3270}
3271
3272
3275}
3276
3277
3278
3279
3281 unsigned Size) const {
3283}
3284
3285
3289}
3290
3291
3292
3293
3295 unsigned Size,
3296 bool IsSectionRelative) const {
3299 if (Size > 4)
3301 return;
3302 }
3303
3304
3309
3311}
3312
3313
3314
3315
3316
3317
3318
3320 unsigned MaxBytesToEmit) const {
3321 if (GV)
3323
3324 if (Alignment == Align(1))
3325 return;
3326
3329 if (this->MF)
3331 else
3333 OutStreamer->emitCodeAlignment(Alignment, STI, MaxBytesToEmit);
3334 } else
3335 OutStreamer->emitValueToAlignment(Alignment, 0, 1, MaxBytesToEmit);
3336}
3337
3338
3339
3340
3341
3344
3345 if (CV->isNullValue() || isa(CV))
3347
3348 if (const ConstantInt *CI = dyn_cast(CV))
3350
3351 if (const ConstantPtrAuth *CPA = dyn_cast(CV))
3353
3354 if (const GlobalValue *GV = dyn_cast(CV))
3356
3357 if (const BlockAddress *BA = dyn_cast(CV))
3359
3360 if (const auto *Equiv = dyn_cast(CV))
3362
3363 if (const NoCFIValue *NC = dyn_cast(CV))
3365
3366 const ConstantExpr *CE = dyn_cast(CV);
3367 if (!CE) {
3369 }
3370
3371
3372
3373
3374 switch (CE->getOpcode()) {
3375 default:
3376 break;
3377 case Instruction::AddrSpaceCast: {
3378 const Constant *Op = CE->getOperand(0);
3379 unsigned DstAS = CE->getType()->getPointerAddressSpace();
3380 unsigned SrcAS = Op->getType()->getPointerAddressSpace();
3383
3384 break;
3385 }
3386 case Instruction::GetElementPtr: {
3387
3388 APInt OffsetAI(getDataLayout().getPointerTypeSizeInBits(CE->getType()), 0);
3389 cast(CE)->accumulateConstantOffset(getDataLayout(), OffsetAI);
3390
3392 if (!OffsetAI)
3393 return Base;
3394
3397 Ctx);
3398 }
3399
3400 case Instruction::Trunc:
3401
3402
3403
3404
3405 [[fallthrough]];
3406 case Instruction::BitCast:
3408
3409 case Instruction::IntToPtr: {
3411
3412
3413
3416 false, DL);
3417 if (Op)
3419
3420 break;
3421 }
3422
3423 case Instruction::PtrToInt: {
3425
3426
3427
3429 Type *Ty = CE->getType();
3430
3432
3433
3434
3435
3436
3437
3438 if (DL.getTypeAllocSize(Ty).getFixedValue() <=
3439 DL.getTypeAllocSize(Op->getType()).getFixedValue())
3440 return OpExpr;
3441
3442 break;
3443 }
3444
3445 case Instruction::Sub: {
3447 APInt LHSOffset;
3452 APInt RHSOffset;
3455 const MCExpr *RelocExpr =
3457 if (!RelocExpr) {
3458 const MCExpr *LHSExpr =
3460 if (DSOEquiv &&
3462 LHSExpr =
3466 }
3467 int64_t Addend = (LHSOffset - RHSOffset).getSExtValue();
3468 if (Addend != 0)
3471 return RelocExpr;
3472 }
3473 }
3474
3478 break;
3479 }
3480
3481 case Instruction::Add: {
3485 }
3486 }
3487
3488
3489
3490
3492 if (C != CE)
3494
3495
3496 std::string S;
3498 OS << "Unsupported expression in static initializer: ";
3499 CE->printAsOperand(OS, false,
3502}
3503
3506 const Constant *BaseCV = nullptr,
3509
3512
3513
3514
3515
3518 assert(.empty() && "Empty aggregates should be CAZ node");
3520 for (unsigned i = 1, e = Data.size(); i != e; ++i)
3521 if (Data[i] != C) return -1;
3522 return static_cast<uint8_t>(C);
3523}
3524
3525
3526
3527
3529 if (const ConstantInt *CI = dyn_cast(V)) {
3530 uint64_t Size = DL.getTypeAllocSizeInBits(V->getType());
3532
3533
3535 if (.isSplat(8))
3536 return -1;
3537
3538 return Value.zextOrTrunc(8).getZExtValue();
3539 }
3540 if (const ConstantArray *CA = dyn_cast(V)) {
3541
3542
3543 assert(CA->getNumOperands() != 0 && "Should be a CAZ");
3546 if (Byte == -1)
3547 return -1;
3548
3549
3550 for (unsigned i = 1, e = CA->getNumOperands(); i != e; ++i)
3551 if (CA->getOperand(i) != Op0)
3552 return -1;
3553 return Byte;
3554 }
3555
3558
3559 return -1;
3560}
3561
3564 if (AliasList) {
3565 auto AliasIt = AliasList->find(Offset);
3566 if (AliasIt != AliasList->end()) {
3567 for (const GlobalAlias *GA : AliasIt->second)
3570 }
3571 }
3572}
3573
3577
3579 if (Value != -1) {
3581
3582 if (Bytes > 1)
3584 }
3585
3586
3589
3590
3599 ElementByteSize);
3600 }
3601 } else {
3606 }
3607 }
3608
3609 unsigned Size = DL.getTypeAllocSize(CDS->getType());
3610 unsigned EmittedSize =
3612 assert(EmittedSize <= Size && "Size cannot be less than EmittedSize!");
3613 if (unsigned Padding = Size - EmittedSize)
3615}
3616
3621
3622
3624
3625 if (Value != -1) {
3628 } else {
3631 AliasList);
3633 }
3634 }
3635}
3636
3638
3642 auto *VTy = cast(CV->getType());
3643 Type *ElementType = VTy->getElementType();
3644 uint64_t ElementSizeInBits = DL.getTypeSizeInBits(ElementType);
3645 uint64_t ElementAllocSizeInBits = DL.getTypeAllocSizeInBits(ElementType);
3647 if (ElementSizeInBits != ElementAllocSizeInBits) {
3648
3649
3650
3651
3652
3653 Type *IntT =
3657 if (!CI) {
3659 "Cannot lower vector global with unusual element type");
3660 }
3663 EmittedSize = DL.getTypeStoreSize(CV->getType());
3664 } else {
3665 for (unsigned I = 0, E = VTy->getNumElements(); I != E; ++I) {
3668 }
3669 EmittedSize = DL.getTypeAllocSize(ElementType) * VTy->getNumElements();
3670 }
3671
3672 unsigned Size = DL.getTypeAllocSize(CV->getType());
3673 if (unsigned Padding = Size - EmittedSize)
3675}
3676
3681
3687
3688
3690 AliasList);
3691
3692
3693 uint64_t FieldSize = DL.getTypeAllocSize(Field->getType());
3696 FieldSize;
3697 SizeSoFar += FieldSize + PadSize;
3698
3699
3700
3701
3703 }
3705 "Layout of constant struct may be incorrect!");
3706}
3707
3709 assert(ET && "Unknown float type");
3711
3712
3713
3718 AP.OutStreamer->getCommentOS() << ' ' << StrVal << '\n';
3719 }
3720
3721
3722
3723
3724 unsigned NumBytes = API.getBitWidth() / 8;
3725 unsigned TrailingBytes = NumBytes % sizeof(uint64_t);
3727
3728
3729
3732
3733 if (TrailingBytes)
3734 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk--], TrailingBytes);
3735
3736 for (; Chunk >= 0; --Chunk)
3737 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3738 } else {
3739 unsigned Chunk;
3740 for (Chunk = 0; Chunk < NumBytes / sizeof(uint64_t); ++Chunk)
3741 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], sizeof(uint64_t));
3742
3743 if (TrailingBytes)
3744 AP.OutStreamer->emitIntValueInHexWithPadding(p[Chunk], TrailingBytes);
3745 }
3746
3747
3749 AP.OutStreamer->emitZeros(DL.getTypeAllocSize(ET) - DL.getTypeStoreSize(ET));
3750}
3751
3754}
3755
3759
3760
3761
3764 unsigned ExtraBitsSize = BitWidth & 63;
3765
3766 if (ExtraBitsSize) {
3767
3768
3769
3770
3771
3772
3773
3774 if (DL.isBigEndian()) {
3775
3776
3777
3778
3779
3780
3781
3782
3783 ExtraBitsSize = alignTo(ExtraBitsSize, 8);
3784 ExtraBits = Realigned.getRawData()[0] &
3785 (((uint64_t)-1) >> (64 - ExtraBitsSize));
3788 } else
3790 }
3791
3792
3793
3794
3796 for (unsigned i = 0, e = BitWidth / 64; i != e; ++i) {
3797 uint64_t Val = DL.isBigEndian() ? RawData[e - i - 1] : RawData[i];
3799 }
3800
3801 if (ExtraBitsSize) {
3802
3803
3804
3808 (ExtraBits & (((uint64_t)-1) >> (64 - ExtraBitsSize)))
3809 == ExtraBits && "Directive too small for extra bits.");
3811 }
3812}
3813
3814
3815
3816
3820
3821
3822
3823
3824
3825
3826
3827
3828
3829
3830
3831
3832
3833
3834
3835
3836
3837
3838
3839
3841 if (!(*ME)->evaluateAsRelocatable(MV, nullptr, nullptr) || MV.isAbsolute())
3842 return;
3844 if (!SymA)
3845 return;
3846
3847
3850 return;
3851
3852 const GlobalValue *BaseGV = dyn_cast_or_null(BaseCst);
3853 if (!BaseGV)
3854 return;
3855
3856
3859
3860 if (!SymB || BaseSym != &SymB->getSymbol())
3861 return;
3862
3863
3864
3865
3866
3869 return;
3870
3871
3872
3873
3874
3875
3876
3877
3878
3879
3880
3881
3882
3883
3884
3885
3888 int NumUses = (int)Result.second;
3893
3894
3895 --NumUses;
3896 if (NumUses >= 0)
3897 AP.GlobalGOTEquivs[GOTEquivSym] = std::make_pair(GV, NumUses);
3898}
3899
3905 "AliasList only expected for XCOFF");
3908
3909
3910
3911
3913 BaseCV = dyn_cast(CV->user_back());
3914
3915 if (isa(CV)) {
3917 if (AliasList && (structType = llvm::dyn_cast(CV->getType()))) {
3918 unsigned numElements = {structType->getNumElements()};
3919 if (numElements != 0) {
3920
3921 const StructLayout *Layout = DL.getStructLayout(structType);
3923 for (unsigned int i = 0; i < numElements - 1; ++i) {
3926 SizeSoFar += GapToNext;
3928 }
3930 return;
3931 }
3932 }
3934 }
3935
3936 if (isa(CV))
3938
3939 if (const ConstantInt *CI = dyn_cast(CV)) {
3940 if (isa(CV->getType()))
3942
3944 if (StoreSize <= 8) {
3947 << format("0x%" PRIx64 "\n", CI->getZExtValue());
3948 AP.OutStreamer->emitIntValue(CI->getZExtValue(), StoreSize);
3949 } else {
3951 }
3952
3953
3954 if (Size != StoreSize)
3956
3957 return;
3958 }
3959
3960 if (const ConstantFP *CFP = dyn_cast(CV)) {
3961 if (isa(CV->getType()))
3963 else
3965 }
3966
3967 if (isa(CV)) {
3969 return;
3970 }
3971
3974
3975 if (const ConstantArray *CVA = dyn_cast(CV))
3977
3978 if (const ConstantStruct *CVS = dyn_cast(CV))
3980
3981 if (const ConstantExpr *CE = dyn_cast(CV)) {
3982
3983
3984 if (CE->getOpcode() == Instruction::BitCast)
3986
3987 if (Size > 8) {
3988
3989
3990
3992 if (New != CE)
3994 }
3995 }
3996
3997 if (isa(CV))
3999
4000
4001
4003
4004
4005
4006
4009
4011}
4012
4013
4020
4021
4023 }
4024 if (!AliasList)
4025 return;
4026
4027
4028 for (auto &AliasPair : *AliasList) {
4029 for (const GlobalAlias *GA : AliasPair.second)
4031 }
4032}
4033
4035
4036 llvm_unreachable("Target does not support EmitMachineConstantPoolValue");
4037}
4038
4042 else if (Offset < 0)
4044}
4045
4050}
4051
4052
4053
4054
4055
4058}
4059
4063}
4064
4067}
4068
4071}
4072
4073
4075 if (getSubtargetInfo().getTargetTriple().isWindowsMSVCEnvironment()) {
4083 if (const MCSectionCOFF *S = dyn_cast(
4085 Alignment))) {
4086 if (MCSymbol *Sym = S->getCOMDATSymbol()) {
4087 if (Sym->isUndefined())
4089 return Sym;
4090 }
4091 }
4092 }
4093 }
4094
4099}
4100
4101
4104}
4105
4106
4107
4112 Twine(UID) + "_set_" + Twine(MBBID));
4113}
4114
4118}
4119
4120
4125}
4126
4127
4129 unsigned FunctionNumber) {
4130 if () return;
4133 << "Parent Loop BB" << FunctionNumber << "_"
4136}
4137
4138
4139
4141 unsigned FunctionNumber) {
4142
4144 OS.indent(CL->getLoopDepth()*2)
4145 << "Child Loop BB" << FunctionNumber << "_"
4146 << CL->getHeader()->getNumber() << " Depth " << CL->getLoopDepth()
4147 << '\n';
4149 }
4150}
4151
4152
4156
4158 if () return;
4159
4161 assert(Header && "No header for loop");
4162
4163
4164
4165 if (Header != &MBB) {
4166 AP.OutStreamer->AddComment(" in Loop: Header=BB" +
4170 return;
4171 }
4172
4173
4174
4176
4178
4179 OS << "=>";
4181
4182 OS << "This ";
4184 OS << "Inner ";
4186
4188}
4189
4190
4191
4192
4194
4196 for (auto &Handler : Handlers) {
4197 Handler->endFunclet();
4198 Handler->beginFunclet(MBB);
4199 }
4201 Handler->endFunclet();
4202 Handler->beginFunclet(MBB);
4203 }
4204 }
4205
4206
4207
4208
4214 }
4215
4216 for (auto &Handler : Handlers)
4217 Handler->beginCodeAlignment(MBB);
4218
4219
4221 if (Alignment != Align(1))
4223
4224
4225
4226
4227
4230 OutStreamer->AddComment("Block address taken");
4231
4237 OutStreamer->AddComment("Block address taken");
4238 }
4239
4240
4243 if (BB->hasName()) {
4244 BB->printAsOperand(OutStreamer->getCommentOS(),
4245 false, BB->getModule());
4247 }
4248 }
4249
4250 assert(MLI != nullptr && "MachineLoopInfo should has been computed");
4252 }
4253
4254
4255 if (shouldEmitLabelForBasicBlock(MBB)) {
4257 OutStreamer->AddComment("Label of block must be emitted");
4259 } else {
4261
4263 false);
4264 }
4265 }
4266
4270 }
4271
4272
4273
4274
4276 for (auto &Handler : Handlers)
4277 Handler->beginBasicBlockSection(MBB);
4279 Handler->beginBasicBlockSection(MBB);
4280 }
4281}
4282
4284
4285
4287 for (auto &Handler : Handlers)
4288 Handler->endBasicBlockSection(MBB);
4290 Handler->endBasicBlockSection(MBB);
4291 }
4292}
4293
4295 bool IsDefinition) const {
4297
4298 switch (Visibility) {
4299 default: break;
4301 if (IsDefinition)
4303 else
4305 break;
4308 break;
4309 }
4310
4313}
4314
4315bool AsmPrinter::shouldEmitLabelForBasicBlock(
4317
4318
4319
4322 return true;
4323
4324
4325
4329}
4330
4331
4332
4333
4336
4337
4339 return false;
4340
4341
4343 return false;
4344
4345
4348 return false;
4349
4350
4351 if (Pred->empty())
4352 return true;
4353
4354
4356
4357 if (.isBranch() || MI.isIndirectBranch())
4358 return false;
4359
4360
4361
4362
4364 if (OP->isJTI())
4365 return false;
4366 if (OP->isMBB() && OP->getMBB() == MBB)
4367 return false;
4368 }
4369 }
4370
4371 return true;
4372}
4373
4376 return nullptr;
4377
4378 auto [GCPI, Inserted] = GCMetadataPrinters.insert({&S, nullptr});
4379 if (!Inserted)
4380 return GCPI->second.get();
4381
4383
4386 if (Name == GCMetaPrinter.getName()) {
4387 std::unique_ptr GMP = GCMetaPrinter.instantiate();
4388 GMP->S = &S;
4389 GCPI->second = std::move(GMP);
4390 return GCPI->second.get();
4391 }
4392
4394}
4395
4397 GCModuleInfo *MI = getAnalysisIfAvailable();
4398 assert(MI && "AsmPrinter didn't require GCModuleInfo?");
4399 bool NeedsDefault = false;
4400 if (MI->begin() == MI->end())
4401
4402 NeedsDefault = true;
4403 else
4404 for (const auto &I : *MI) {
4406 if (MP->emitStackMaps(SM, *this))
4407 continue;
4408
4409
4410 NeedsDefault = true;
4411 }
4412
4413 if (NeedsDefault)
4415}
4416
4418 std::unique_ptr Handler) {
4421}
4422
4423
4425
4427
4428
4429
4430
4432 auto Kind8 = static_cast<uint8_t>(Kind);
4437 auto Padding = (4 * Bytes) - ((2 * Bytes) + 3);
4438 assert(Padding >= 0 && "Instrumentation map entry > 4 * Word Size");
4440}
4441
4443 if (Sleds.empty())
4444 return;
4445
4446 auto PrevSection = OutStreamer->getCurrentSectionOnly();
4449 MCSection *FnSledIndex = nullptr;
4451
4452 if (TT.isOSBinFormatELF()) {
4453 auto LinkedToSym = cast(CurrentFnSym);
4456 if (F.hasComdat()) {
4458 GroupName = F.getComdat()->getName();
4459 }
4461 Flags, 0, GroupName, F.hasComdat(),
4463
4466 "xray_fn_idx", ELF::SHT_PROGBITS, Flags, 0, GroupName, F.hasComdat(),
4476 } else {
4478 }
4479
4481
4482
4483
4484
4490 for (const auto &Sled : Sleds) {
4491 MCSymbol *Dot = Ctx.createTempSymbol();
4496 WordSizeBytes);
4502 Ctx),
4503 Ctx),
4504 WordSizeBytes);
4505 Sled.emit(WordSizeBytes, OutStreamer.get());
4506 }
4509
4510
4511
4512
4513
4514 if (FnSledIndex) {
4515 OutStreamer->switchSection(FnSledIndex);
4518
4519
4520
4521 MCSymbol *Dot = Ctx.createLinkerPrivateSymbol("xray_fn_idx");
4526 WordSizeBytes);
4528 WordSizeBytes);
4529 OutStreamer->switchSection(PrevSection);
4530 }
4532}
4533
4536 const Function &F = MI.getMF()->getFunction();
4537 auto Attr = F.getFnAttribute("function-instrument");
4538 bool LogArgs = F.hasFnAttribute("xray-log-args");
4539 bool AlwaysInstrument =
4540 Attr.isStringAttribute() && Attr.getValueAsString() == "xray-always";
4544 AlwaysInstrument, &F, Version});
4545}
4546
4549 unsigned PatchableFunctionPrefix = 0, PatchableFunctionEntry = 0;
4550 (void)F.getFnAttribute("patchable-function-prefix")
4551 .getValueAsString()
4552 .getAsInteger(10, PatchableFunctionPrefix);
4553 (void)F.getFnAttribute("patchable-function-entry")
4554 .getValueAsString()
4555 .getAsInteger(10, PatchableFunctionEntry);
4556 if (!PatchableFunctionPrefix && !PatchableFunctionEntry)
4557 return;
4561 const MCSymbolELF *LinkedToSym = nullptr;
4563
4564
4565
4568 if (F.hasComdat()) {
4570 GroupName = F.getComdat()->getName();
4571 }
4572 LinkedToSym = cast(CurrentFnSym);
4573 }
4575 "__patchable_function_entries", ELF::SHT_PROGBITS, Flags, 0, GroupName,
4579 }
4580}
4581
4583 return OutStreamer->getContext().getDwarfVersion();
4584}
4585
4588}
4589
4592}
4593
4596 OutStreamer->getContext().getDwarfFormat());
4597}
4598
4601 OutStreamer->getContext().getDwarfFormat(),
4603}
4604
4607 OutStreamer->getContext().getDwarfFormat());
4608}
4609
4613 const MCSymbol *BranchLabel) const {
4615 const auto BaseExpr =
4617 const auto Base = &cast(BaseExpr)->getSymbol();
4618
4619
4620
4621 return std::make_tuple(Base, 0, BranchLabel,
4623}
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
static bool emitDebugValueComment(const MachineInstr *MI, AsmPrinter &AP)
emitDebugValueComment - This method handles the target-independent form of DBG_VALUE,...
static llvm::object::BBAddrMap::Features getBBAddrMapFeature(const MachineFunction &MF, int NumMBBSectionRanges)
static uint32_t getBBAddrMapMetadata(const MachineBasicBlock &MBB)
Returns the BB metadata to be emitted in the SHT_LLVM_BB_ADDR_MAP section for a given basic block.
static cl::opt< bool > BBAddrMapSkipEmitBBEntries("basic-block-address-map-skip-bb-entries", cl::desc("Skip emitting basic block entries in the SHT_LLVM_BB_ADDR_MAP " "section. It's used to save binary size when BB entries are " "unnecessary for some PGOAnalysisMap features."), cl::Hidden, cl::init(false))
static void emitGlobalConstantFP(const ConstantFP *CFP, AsmPrinter &AP)
static bool isGOTEquivalentCandidate(const GlobalVariable *GV, unsigned &NumGOTEquivUsers)
Only consider global GOT equivalents if at least one user is a cstexpr inside an initializer of anoth...
static void emitFakeUse(const MachineInstr *MI, AsmPrinter &AP)
static unsigned getNumGlobalVariableUses(const Constant *C)
Compute the number of Global Variables that uses a Constant.
static void tagGlobalDefinition(Module &M, GlobalVariable *G)
static void emitBasicBlockLoopComments(const MachineBasicBlock &MBB, const MachineLoopInfo *LI, const AsmPrinter &AP)
emitBasicBlockLoopComments - Pretty-print comments for basic blocks.
static void handleIndirectSymViaGOTPCRel(AsmPrinter &AP, const MCExpr **ME, const Constant *BaseCst, uint64_t Offset)
Transform a not absolute MCExpr containing a reference to a GOT equivalent global,...
static int isRepeatedByteSequence(const ConstantDataSequential *V)
isRepeatedByteSequence - Determine whether the given value is composed of a repeated sequence of iden...
static void emitGlobalAliasInline(AsmPrinter &AP, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
static bool needFuncLabels(const MachineFunction &MF, const AsmPrinter &Asm)
Returns true if function begin and end labels should be emitted.
static cl::bits< PGOMapFeaturesEnum > PgoAnalysisMapFeatures("pgo-analysis-map", cl::Hidden, cl::CommaSeparated, cl::values(clEnumValN(PGOMapFeaturesEnum::None, "none", "Disable all options"), clEnumValN(PGOMapFeaturesEnum::FuncEntryCount, "func-entry-count", "Function Entry Count"), clEnumValN(PGOMapFeaturesEnum::BBFreq, "bb-freq", "Basic Block Frequency"), clEnumValN(PGOMapFeaturesEnum::BrProb, "br-prob", "Branch Probability"), clEnumValN(PGOMapFeaturesEnum::All, "all", "Enable all options")), cl::desc("Enable extended information within the SHT_LLVM_BB_ADDR_MAP that is " "extracted from PGO related analysis."))
static void PrintChildLoopComment(raw_ostream &OS, const MachineLoop *Loop, unsigned FunctionNumber)
PrintChildLoopComment - Print comments about child loops within the loop for this basic block,...
static StringRef getMIMnemonic(const MachineInstr &MI, MCStreamer &Streamer)
static void emitComments(const MachineInstr &MI, const MCSubtargetInfo *STI, raw_ostream &CommentOS)
emitComments - Pretty-print comments for instructions.
static void PrintParentLoopComment(raw_ostream &OS, const MachineLoop *Loop, unsigned FunctionNumber)
PrintParentLoopComment - Print comments about parent loops of this one.
static void emitGlobalConstantStruct(const DataLayout &DL, const ConstantStruct *CS, AsmPrinter &AP, const Constant *BaseCV, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
static void emitGlobalConstantDataSequential(const DataLayout &DL, const ConstantDataSequential *CDS, AsmPrinter &AP, AsmPrinter::AliasMapTy *AliasList)
static void emitKill(const MachineInstr *MI, AsmPrinter &AP)
static void emitGlobalConstantImpl(const DataLayout &DL, const Constant *C, AsmPrinter &AP, const Constant *BaseCV=nullptr, uint64_t Offset=0, AsmPrinter::AliasMapTy *AliasList=nullptr)
static cl::opt< bool > PrintLatency("asm-print-latency", cl::desc("Print instruction latencies as verbose asm comments"), cl::Hidden, cl::init(false))
static bool emitDebugLabelComment(const MachineInstr *MI, AsmPrinter &AP)
This method handles the target-independent form of DBG_LABEL, returning true if it was able to do so.
static bool canBeHidden(const GlobalValue *GV, const MCAsmInfo &MAI)
static void emitGlobalConstantVector(const DataLayout &DL, const Constant *CV, AsmPrinter &AP, AsmPrinter::AliasMapTy *AliasList)
static cl::opt< bool > EmitJumpTableSizesSection("emit-jump-table-sizes-section", cl::desc("Emit a section containing jump table addresses and sizes"), cl::Hidden, cl::init(false))
static void emitGlobalConstantArray(const DataLayout &DL, const ConstantArray *CA, AsmPrinter &AP, const Constant *BaseCV, uint64_t Offset, AsmPrinter::AliasMapTy *AliasList)
static void emitGlobalConstantLargeInt(const ConstantInt *CI, AsmPrinter &AP)
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define clEnumValN(ENUMVAL, FLAGNAME, DESC)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Looks at all the uses of the given value Returns the Liveness deduced from the uses of this value Adds all uses that cause the result to be MaybeLive to MaybeLiveRetUses If the result is MaybeLiveUses might be modified but its content should be ignored(since it might not be complete). DeadArgumentEliminationPass
This file defines the DenseMap class.
This file contains constants used for implementing Dwarf debug support.
This file contains the declaration of the GlobalIFunc class, which represents a single indirect funct...
const HexagonInstrInfo * TII
Module.h This file contains the declarations for the Module class.
===- LazyMachineBlockFrequencyInfo.h - Lazy Block Frequency -*- C++ -*–===//
const FeatureInfo AllFeatures[]
This file declares the MachineConstantPool class which is an abstract constant pool to keep track of ...
static cl::opt< std::string > OutputFilename("o", cl::desc("Output filename"), cl::value_desc("filename"), cl::init("-"))
This file provides utility analysis objects describing memory locations.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
This file describes how to lower LLVM code to machine code.
opStatus convert(const fltSemantics &ToSemantics, roundingMode RM, bool *losesInfo)
double convertToDouble() const
Converts this APFloat to host double value.
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
APInt bitcastToAPInt() const
Class for arbitrary precision integers.
unsigned getBitWidth() const
Return the number of bits in the APInt.
unsigned getNumWords() const
Get the number of words.
const uint64_t * getRawData() const
This function returns a pointer to the internal storage of the APInt.
int64_t getSExtValue() const
Get sign extended value.
void lshrInPlace(unsigned ShiftAmt)
Logical right-shift this APInt by ShiftAmt in place.
AddrLabelMap(MCContext &context)
void UpdateForRAUWBlock(BasicBlock *Old, BasicBlock *New)
void takeDeletedSymbolsForFunction(Function *F, std::vector< MCSymbol * > &Result)
If we have any deleted symbols for F, return them.
void UpdateForDeletedBlock(BasicBlock *BB)
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(BasicBlock *BB)
Represent the analysis usage information of a pass.
AnalysisUsage & addRequired()
void setPreservesAll()
Set by analyses that do not transform their input at all.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
virtual ~AsmPrinterHandler()
Pin vtables to this file.
virtual void markFunctionEnd()
This class is intended to be used as a driving class for all asm writers.
virtual void emitInstruction(const MachineInstr *)
Targets should implement this to emit instructions.
const TargetLoweringObjectFile & getObjFileLowering() const
Return information about object file lowering.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
MCSymbol * getSymbol(const GlobalValue *GV) const
void emitULEB128(uint64_t Value, const char *Desc=nullptr, unsigned PadTo=0) const
Emit the specified unsigned leb128 value.
SmallVector< XRayFunctionEntry, 4 > Sleds
MapVector< MBBSectionID, MBBSectionRange > MBBSectionRanges
void emitNops(unsigned N)
Emit N NOP instructions.
MCSymbol * CurrentFnBegin
MachineLoopInfo * MLI
This is a pointer to the current MachineLoopInfo.
virtual void emitDebugValue(const MCExpr *Value, unsigned Size) const
Emit the directive and value for debug thread local expression.
void EmitToStreamer(MCStreamer &S, const MCInst &Inst)
virtual void emitConstantPool()
Print to the current output stream assembly representations of the constants in the constant pool MCP...
virtual void emitGlobalVariable(const GlobalVariable *GV)
Emit the specified global variable to the .s file.
virtual const MCExpr * lowerConstantPtrAuth(const ConstantPtrAuth &CPA)
unsigned int getUnitLengthFieldByteSize() const
Returns 4 for DWARF32 and 12 for DWARF64.
void emitLabelPlusOffset(const MCSymbol *Label, uint64_t Offset, unsigned Size, bool IsSectionRelative=false) const
Emit something like ".long Label+Offset" where the size in bytes of the directive is specified by Siz...
TargetMachine & TM
Target machine description.
void emitXRayTable()
Emit a table with all XRay instrumentation points.
virtual void emitGlobalAlias(const Module &M, const GlobalAlias &GA)
virtual void emitBasicBlockEnd(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the end of a basic block.
MCSymbol * CurrentFnDescSym
The symbol for the current function descriptor on AIX.
MCSymbol * CurrentFnBeginLocal
For dso_local functions, the current $local alias for the function.
MapVector< const MCSymbol *, GOTEquivUsePair > GlobalGOTEquivs
virtual MCSymbol * GetCPISymbol(unsigned CPID) const
Return the symbol for the specified constant pool entry.
void emitGlobalGOTEquivs()
Constant expressions using GOT equivalent globals may not be eligible for PC relative GOT entry conve...
MCSymbol * getFunctionBegin() const
void emitLabelDifference(const MCSymbol *Hi, const MCSymbol *Lo, unsigned Size) const
Emit something like ".long Hi-Lo" where the size in bytes of the directive is specified by Size and H...
void emitKCFITrapEntry(const MachineFunction &MF, const MCSymbol *Symbol)
virtual void emitMachOIFuncStubHelperBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
MCSymbol * getMBBExceptionSym(const MachineBasicBlock &MBB)
MCSymbol * getAddrLabelSymbol(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
const MCAsmInfo * MAI
Target Asm Printer information.
SmallVector< std::unique_ptr< AsmPrinterHandler >, 2 > Handlers
bool emitSpecialLLVMGlobal(const GlobalVariable *GV)
Check to see if the specified global is a special global used by LLVM.
MachineFunction * MF
The current machine function.
virtual void emitJumpTableInfo()
Print assembly representations of the jump tables used by the current function to the current output ...
void computeGlobalGOTEquivs(Module &M)
Unnamed constant global variables solely contaning a pointer to another globals variable act like a g...
static Align getGVAlignment(const GlobalObject *GV, const DataLayout &DL, Align InAlign=Align(1))
Return the alignment for the specified GV.
void emitInt8(int Value) const
Emit a byte directive and value.
CFISection getFunctionCFISectionType(const Function &F) const
Get the CFISection type for a function.
virtual void SetupMachineFunction(MachineFunction &MF)
This should be called when a new MachineFunction is being processed from runOnMachineFunction.
void emitFunctionBody()
This method emits the body and trailer for a function.
virtual bool isBlockOnlyReachableByFallthrough(const MachineBasicBlock *MBB) const
Return true if the basic block has exactly one predecessor and the control transfer mechanism between...
void emitBBAddrMapSection(const MachineFunction &MF)
void emitPCSections(const MachineFunction &MF)
Emits the PC sections collected from instructions.
MachineDominatorTree * MDT
This is a pointer to the current MachineDominatorTree.
virtual void emitStartOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the start of their fi...
MCSymbol * GetJTISymbol(unsigned JTID, bool isLinkerPrivate=false) const
Return the symbol for the specified jump table entry.
virtual void emitMachineConstantPoolValue(MachineConstantPoolValue *MCPV)
void emitStackMaps()
Emit the stack maps.
bool hasDebugInfo() const
Returns true if valid debug info is present.
virtual void emitFunctionBodyStart()
Targets can override this to emit stuff before the first basic block in the function.
std::pair< const GlobalVariable *, unsigned > GOTEquivUsePair
Map global GOT equivalent MCSymbols to GlobalVariables and keep track of its number of uses by other ...
void emitPatchableFunctionEntries()
void recordSled(MCSymbol *Sled, const MachineInstr &MI, SledKind Kind, uint8_t Version=0)
virtual void emitEndOfAsmFile(Module &)
This virtual method can be overridden by targets that want to emit something at the end of their file...
bool doInitialization(Module &M) override
Set up the AsmPrinter when we are working on a new module.
MCSymbol * GetJTSetSymbol(unsigned UID, unsigned MBBID) const
Return the symbol for the specified jump table .set FIXME: privatize to AsmPrinter.
virtual void emitMachOIFuncStubBody(Module &M, const GlobalIFunc &GI, MCSymbol *LazyPointer)
virtual void emitImplicitDef(const MachineInstr *MI) const
Targets can override this to customize the output of IMPLICIT_DEF instructions in verbose mode.
virtual void emitLinkage(const GlobalValue *GV, MCSymbol *GVSym) const
This emits linkage information about GVSym based on GV, if this is supported by the target.
void getAnalysisUsage(AnalysisUsage &AU) const override
Record analysis usage.
unsigned getFunctionNumber() const
Return a unique ID for the current function.
MachineOptimizationRemarkEmitter * ORE
Optimization remark emitter.
virtual bool shouldEmitWeakSwiftAsyncExtendedFramePointerFlags() const
void printOffset(int64_t Offset, raw_ostream &OS) const
This is just convenient handler for printing offsets.
void emitGlobalConstant(const DataLayout &DL, const Constant *CV, AliasMapTy *AliasList=nullptr)
EmitGlobalConstant - Print a general LLVM constant to the .s file.
void emitFrameAlloc(const MachineInstr &MI)
void emitStackSizeSection(const MachineFunction &MF)
MCSymbol * getSymbolPreferLocal(const GlobalValue &GV) const
Similar to getSymbol() but preferred for references.
MCSymbol * CurrentFnSym
The symbol for the current function.
MachineModuleInfo * MMI
This is a pointer to the current MachineModuleInfo.
void emitSLEB128(int64_t Value, const char *Desc=nullptr) const
Emit the specified signed leb128 value.
void emitAlignment(Align Alignment, const GlobalObject *GV=nullptr, unsigned MaxBytesToEmit=0) const
Emit an alignment directive to the specified power of two boundary.
MCContext & OutContext
This is the context for the output file that we are streaming.
void emitCFIInstruction(const MachineInstr &MI)
MCSymbol * createTempSymbol(const Twine &Name) const
bool doFinalization(Module &M) override
Shut down the asmprinter.
MCSymbol * GetExternalSymbolSymbol(Twine Sym) const
Return the MCSymbol for the specified ExternalSymbol.
virtual const MCSubtargetInfo * getIFuncMCSubtargetInfo() const
getSubtargetInfo() cannot be used where this is needed because we don't have a MachineFunction when w...
void emitStackUsage(const MachineFunction &MF)
virtual void emitKCFITypeId(const MachineFunction &MF)
bool isPositionIndependent() const
virtual void emitXXStructorList(const DataLayout &DL, const Constant *List, bool IsCtor)
This method emits llvm.global_ctors or llvm.global_dtors list.
void emitPCSectionsLabel(const MachineFunction &MF, const MDNode &MD)
Emits a label as reference for PC sections.
MCSymbol * CurrentPatchableFunctionEntrySym
The symbol for the entry in __patchable_function_entires.
virtual void emitBasicBlockStart(const MachineBasicBlock &MBB)
Targets can override this to emit stuff at the start of a basic block.
void takeDeletedSymbolsForFunction(const Function *F, std::vector< MCSymbol * > &Result)
If the specified function has had any references to address-taken blocks generated,...
void emitVisibility(MCSymbol *Sym, unsigned Visibility, bool IsDefinition=true) const
This emits visibility information about symbol, if this is supported by the target.
void emitInt32(int Value) const
Emit a long directive and value.
std::unique_ptr< MCStreamer > OutStreamer
This is the MCStreamer object for the file we are generating.
virtual const MCExpr * lowerConstant(const Constant *CV)
Lower the specified LLVM Constant to an MCExpr.
virtual void emitFunctionDescriptor()
const MCSection * getCurrentSection() const
Return the current section we are emitting to.
unsigned int getDwarfOffsetByteSize() const
Returns 4 for DWARF32 and 8 for DWARF64.
MCSymbol * CurrentFnSymForSize
The symbol used to represent the start of the current function for the purpose of calculating its siz...
bool isVerbose() const
Return true if assembly output should contain comments.
MCSymbol * getFunctionEnd() const
virtual void emitXXStructor(const DataLayout &DL, const Constant *CV)
Targets can override this to change how global constants that are part of a C++ static/global constru...
void preprocessXXStructorList(const DataLayout &DL, const Constant *List, SmallVector< Structor, 8 > &Structors)
This method gathers an array of Structors and then sorts them out by Priority.
void emitInt16(int Value) const
Emit a short directive and value.
void setDwarfVersion(uint16_t Version)
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV) const
SmallVector< std::unique_ptr< AsmPrinterHandler >, 1 > EHHandlers
A handle to the EH info emitter (if present).
void emitPseudoProbe(const MachineInstr &MI)
unsigned getPointerSize() const
Return the pointer size from the TargetMachine.
void emitRemarksSection(remarks::RemarkStreamer &RS)
MCSymbol * GetBlockAddressSymbol(const BlockAddress *BA) const
Return the MCSymbol used to satisfy BlockAddress uses of the specified basic block.
ArrayRef< MCSymbol * > getAddrLabelSymbolToEmit(const BasicBlock *BB)
Return the symbol to be used for the specified basic block when its address is taken.
virtual void emitFunctionBodyEnd()
Targets can override this to emit stuff after the last basic block in the function.
const DataLayout & getDataLayout() const
Return information about data layout.
virtual void emitFunctionEntryLabel()
EmitFunctionEntryLabel - Emit the label that is the entrypoint for the function.
void emitInitialRawDwarfLocDirective(const MachineFunction &MF)
Emits inital debug location directive.
void emitInt64(uint64_t Value) const
Emit a long long directive and value.
uint16_t getDwarfVersion() const
dwarf::FormParams getDwarfFormParams() const
Returns information about the byte size of DW_FORM values.
const MCSubtargetInfo & getSubtargetInfo() const
Return information about subtarget.
bool usesCFIWithoutEH() const
Since emitting CFI unwind information is entangled with supporting the exceptions,...
bool doesDwarfUseRelocationsAcrossSections() const
@ None
Do not emit either .eh_frame or .debug_frame.
@ Debug
Emit .debug_frame.
void addAsmPrinterHandler(std::unique_ptr< AsmPrinterHandler > Handler)
virtual std::tuple< const MCSymbol *, uint64_t, const MCSymbol *, codeview::JumpTableEntrySize > getCodeViewJumpTableInfo(int JTI, const MachineInstr *BranchInstr, const MCSymbol *BranchLabel) const
Gets information required to create a CodeView debug symbol for a jump table.
void emitLabelDifferenceAsULEB128(const MCSymbol *Hi, const MCSymbol *Lo) const
Emit something like ".uleb128 Hi-Lo".
AsmPrinter(TargetMachine &TM, std::unique_ptr< MCStreamer > Streamer)
virtual const MCExpr * lowerBlockAddressConstant(const BlockAddress &BA)
Lower the specified BlockAddress to an MCExpr.
LLVM Basic Block Representation.
unsigned getNumber() const
bool hasAddressTaken() const
Returns true if there are any uses of this basic block other than direct branches,...
const Function * getParent() const
Return the enclosing method, or null if none.
The address of a basic block.
BasicBlock * getBasicBlock() const
uint64_t getFrequency() const
Returns the frequency as a fixpoint number scaled by the entry frequency.
uint32_t getNumerator() const
Value handle with callbacks on RAUW and destruction.
virtual void allUsesReplacedWith(Value *)
Callback for Value RAUW.
virtual void deleted()
Callback for Value destruction.
ConstMIBundleOperands - Iterate over all operands in a const bundle of machine instructions.
ConstantArray - Constant Array Declarations.
ArrayType * getType() const
Specialize the getType() method to always return an ArrayType, which reduces the amount of casting ne...
static Constant * get(LLVMContext &Context, ArrayRef< ElementTy > Elts)
get() constructor - Return a constant with array type with an element count and element type matching...
ConstantDataSequential - A vector or array constant whose element type is a simple 1/2/4/8-byte integ...
StringRef getAsString() const
If this array is isString(), then this method returns the array as a StringRef.
uint64_t getElementByteSize() const
Return the size (in bytes) of each element in the array/vector.
bool isString(unsigned CharSize=8) const
This method returns true if this is an array of CharSize integers.
uint64_t getElementAsInteger(unsigned i) const
If this is a sequential container of integers (of any size), return the specified element in the low ...
unsigned getNumElements() const
Return the number of elements in the array or vector.
Type * getElementType() const
Return the element type of the array/vector.
APFloat getElementAsAPFloat(unsigned i) const
If this is a sequential container of floating point type, return the specified element as an APFloat.
A constant value that is initialized with an expression using other constant values.
static Constant * getBitCast(Constant *C, Type *Ty, bool OnlyIfReduced=false)
ConstantFP - Floating Point Values [float, double].
const APFloat & getValueAPF() const
This is the shared class of boolean and integer constants.
uint64_t getLimitedValue(uint64_t Limit=~0ULL) const
getLimitedValue - If the value is smaller than the specified limit, return it, otherwise return the l...
unsigned getBitWidth() const
getBitWidth - Return the scalar bitwidth of this constant.
const APInt & getValue() const
Return the constant as an APInt value reference.
A signed pointer, in the ptrauth sense.
StructType * getType() const
Specialization - reduce amount of casting.
static Constant * getAnon(ArrayRef< Constant * > V, bool Packed=false)
Return an anonymous struct that has the specified elements.
This is an important base class in LLVM.
const Constant * stripPointerCasts() const
Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
bool isNullValue() const
Return true if this is the value that would be returned by getNullValue.
iterator_range< expr_op_iterator > expr_ops() const
unsigned getNumElements() const
static std::optional< const DIExpression * > convertToNonVariadicExpression(const DIExpression *Expr)
If Expr is a valid single-location expression, i.e.
Wrapper for a function that represents a value that functionally represents the original function.
This class represents an Operation in the Expression.
bool print(raw_ostream &OS, DIDumpOptions DumpOpts, const DWARFExpression *Expr, DWARFUnit *U) const
A parsed version of the target data layout string in and methods for querying it.
TypeSize getTypeStoreSize(Type *Ty) const
Returns the maximum number of bytes that may be overwritten by storing the specified type.
iterator find(const_arg_type_t< KeyT > Val)
bool erase(const KeyT &Val)
Collects and handles dwarf debug information.
const MachineInstr * emitInitialLocDirective(const MachineFunction &MF, unsigned CUID)
Emits inital debug location directive.
Emits exception handling directives.
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool hasPersonalityFn() const
Check whether this function has a personality function.
Constant * getPersonalityFn() const
Get the personality function associated with this function.
LLVMContext & getContext() const
getContext - Return a reference to the LLVMContext associated with this function.
std::optional< ProfileCount > getEntryCount(bool AllowSynthetic=false) const
Get the entry count for this function.
bool needsUnwindTableEntry() const
True if this function needs an unwind table.
An analysis pass which caches information about the entire Module.
GCStrategy describes a garbage collector algorithm's code generation requirements,...
bool usesMetadata() const
If set, appropriate metadata tables must be emitted by the back-end (assembler, JIT,...
const std::string & getName() const
Return the name of the GC strategy.
const GlobalObject * getAliaseeObject() const
const Constant * getAliasee() const
const Function * getResolverFunction() const
const Constant * getResolver() const
StringRef getSection() const
Get the custom section of this global if it has one.
MaybeAlign getAlign() const
Returns the alignment of the given variable or function.
bool hasMetadata() const
Return true if this value has any metadata attached to it.
bool hasSection() const
Check if this global has a custom object file section.
bool hasLinkOnceLinkage() const
bool hasExternalLinkage() const
bool isThreadLocal() const
If the value is "Thread Local", its value isn't shared by the threads.
VisibilityTypes getVisibility() const
bool isDeclaration() const
Return true if the primary definition of this global value is outside of the current translation unit...
LinkageTypes getLinkage() const
bool hasLocalLinkage() const
static StringRef dropLLVMManglingEscape(StringRef Name)
If the given string begins with the GlobalValue name mangling escape character '\1',...
bool hasPrivateLinkage() const
bool isDeclarationForLinker() const
Module * getParent()
Get the module that this global value is contained inside of...
PointerType * getType() const
Global values are always pointers.
VisibilityTypes
An enumeration for the kinds of visibility of global values.
@ DefaultVisibility
The GV is visible.
@ HiddenVisibility
The GV is hidden.
@ ProtectedVisibility
The GV is protected.
const DataLayout & getDataLayout() const
Get the data layout of the module this global belongs to.
bool canBenefitFromLocalAlias() const
bool hasWeakLinkage() const
bool hasCommonLinkage() const
bool hasGlobalUnnamedAddr() const
bool hasAppendingLinkage() const
static bool isDiscardableIfUnused(LinkageTypes Linkage)
Whether the definition of this global may be discarded if it is not used in its compilation unit.
bool canBeOmittedFromSymbolTable() const
True if GV can be left out of the object symbol table.
bool hasAvailableExternallyLinkage() const
LinkageTypes
An enumeration for the kinds of linkage for global values.
@ PrivateLinkage
Like Internal, but omit from symbol table.
@ CommonLinkage
Tentative definitions.
@ InternalLinkage
Rename collisions when linking (static functions).
@ LinkOnceAnyLinkage
Keep one copy of function when linking (inline)
@ WeakODRLinkage
Same, but only replaced by something equivalent.
@ ExternalLinkage
Externally visible function.
@ WeakAnyLinkage
Keep one copy of named function when linking (weak)
@ AppendingLinkage
Special purpose, only applies to global arrays.
@ AvailableExternallyLinkage
Available for inspection, not emission.
@ ExternalWeakLinkage
ExternalWeak linkage description.
@ LinkOnceODRLinkage
Same, but only replaced by something equivalent.
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool hasInitializer() const
Definitions have initializers, declarations don't.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
bool isTailCall(const MachineInstr &MI) const override
Itinerary data supplied by a subtarget to be used by a target.
static IntegerType * get(LLVMContext &C, unsigned NumBits)
This static method is the primary way of constructing an IntegerType.
void emitError(const Instruction *I, const Twine &ErrorStr)
emitError - Emit an error message to the currently installed error handler with optional location inf...
This is an alternative analysis pass to MachineBlockFrequencyInfo.
bool isInnermost() const
Return true if the loop does not contain any (natural) loops.
BlockT * getHeader() const
unsigned getLoopDepth() const
Return the nesting level of this loop.
LoopT * getParentLoop() const
Return the parent loop if it exists or nullptr for top level loops.
LoopT * getLoopFor(const BlockT *BB) const
Return the inner most loop that BB lives in.
Represents a single loop in the control flow graph.
This class is intended to be used as a base class for asm properties and features specific to the tar...
bool hasDotTypeDotSizeDirective() const
bool useIntegratedAssembler() const
Return true if assembly (inline or otherwise) should be parsed.
MCSymbolAttr getProtectedVisibilityAttr() const
unsigned getAssemblerDialect() const
bool useAssignmentForEHBegin() const
bool usesCFIWithoutEH() const
bool avoidWeakIfComdat() const
MCSymbolAttr getHiddenDeclarationVisibilityAttr() const
bool hasWeakDefCanBeHiddenDirective() const
LCOMM::LCOMMType getLCOMMDirectiveAlignmentType() const
bool needsDwarfSectionOffsetDirective() const
bool doesSupportDebugInformation() const
bool doesSetDirectiveSuppressReloc() const
WinEH::EncodingType getWinEHEncodingType() const
bool doesDwarfUseRelocationsAcrossSections() const
MCSymbolAttr getMemtagAttr() const
bool hasSubsectionsViaSymbols() const
bool usesWindowsCFI() const
bool binutilsIsAtLeast(int Major, int Minor) const
MCSymbolAttr getHiddenVisibilityAttr() const
bool hasSingleParameterDotFile() const
const char * getWeakRefDirective() const
bool hasNoDeadStrip() const
virtual MCSection * getNonexecutableStackSection(MCContext &Ctx) const
Targets can implement this method to specify a section to switch to if the translation unit doesn't h...
ExceptionHandling getExceptionHandlingType() const
bool needsLocalForSize() const
bool hasFunctionAlignment() const
bool hasIdentDirective() const
unsigned getCodePointerSize() const
Get the code pointer size in bytes.
static const MCBinaryExpr * createAdd(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCBinaryExpr * createSub(const MCExpr *LHS, const MCExpr *RHS, MCContext &Ctx)
static const MCConstantExpr * create(int64_t Value, MCContext &Ctx, bool PrintInHex=false, unsigned SizeInBytes=0)
Context object for machine code objects.
const MCObjectFileInfo * getObjectFileInfo() const
MCSectionMachO * getMachOSection(StringRef Segment, StringRef Section, unsigned TypeAndAttributes, unsigned Reserved2, SectionKind K, const char *BeginSymName=nullptr)
Return the MCSection for the specified mach-o section.
MCSymbol * createTempSymbol()
Create a temporary symbol with a unique name.
MCSymbol * createLinkerPrivateTempSymbol()
Create a new linker temporary symbol with the specified prefix (Name) or "tmp".
MCSectionELF * getELFSection(const Twine &Section, unsigned Type, unsigned Flags)
MCSectionCOFF * getCOFFSection(StringRef Section, unsigned Characteristics, StringRef COMDATSymName, int Selection, unsigned UniqueID=GenericSectionID)
void reportWarning(SMLoc L, const Twine &Msg)
void reportError(SMLoc L, const Twine &Msg)
MCSymbol * getOrCreateSymbol(const Twine &Name)
Lookup the symbol inside with the specified Name.
MCSymbol * createLinkerPrivateSymbol(const Twine &Name)
MCSymbol * createNamedTempSymbol()
Create a temporary symbol with a unique name whose name cannot be omitted in the symbol table.
Base class for the full range of assembler expressions which are needed for parsing.
Instances of this class represent a single low-level machine instruction.
unsigned getOpcode() const
void setOpcode(unsigned Op)
Interface to description of machine instruction set.
MCSection * getTLSBSSSection() const
MCSection * getStackSizesSection(const MCSection &TextSec) const
MCSection * getBBAddrMapSection(const MCSection &TextSec) const
MCSection * getRemarksSection() const
MCSection * getTLSExtraDataSection() const
MCSection * getKCFITrapSection(const MCSection &TextSec) const
MCSection * getPCSection(StringRef Name, const MCSection *TextSec) const
MCSection * getTextSection() const
MCSection * getDataSection() const
This represents a section on Windows.
Instances of this class represent a uniqued identifier for a section in the current translation unit.
static constexpr unsigned NonUniqueID
bool isVirtualSection() const
Check whether this section is "virtual", that is has no actual object file contents.
Streaming machine code generation interface.
virtual void emitBinaryData(StringRef Data)
Functionally identical to EmitBytes.
virtual void emitInstruction(const MCInst &Inst, const MCSubtargetInfo &STI)
Emit the given Instruction into the current section.
virtual StringRef getMnemonic(const MCInst &MI) const
Returns the mnemonic for MI, if the streamer has access to a instruction printer and returns an empty...
void emitZeros(uint64_t NumBytes)
Emit NumBytes worth of zeros.
Generic base class for all target subtargets.
const Triple & getTargetTriple() const
const MCSchedModel & getSchedModel() const
Get the machine model for this subtarget's CPU.
Represent a reference to a symbol from inside an expression.
const MCSymbol & getSymbol() const
static const MCSymbolRefExpr * create(const MCSymbol *Symbol, MCContext &Ctx)
StringRef getSymbolTableName() const
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
bool isDefined() const
isDefined - Check if this symbol is defined (i.e., it has an address).
StringRef getName() const
getName - Get the symbol name.
bool isVariable() const
isVariable - Check if this is a variable symbol.
void redefineIfPossible()
Prepare this symbol to be redefined.
This represents an "assembler immediate".
int64_t getConstant() const
const MCSymbolRefExpr * getSymB() const
const MCSymbolRefExpr * getSymA() const
bool isAbsolute() const
Is this an absolute (as opposed to relocatable) value.
const MDOperand & getOperand(unsigned I) const
ArrayRef< MDOperand > operands() const
Tracking metadata reference owned by Metadata.
StringRef getString() const
unsigned pred_size() const
bool isEHPad() const
Returns true if the block is a landing pad.
MCSymbol * getSymbol() const
Return the MCSymbol for this basic block.
MCSymbol * getEHCatchretSymbol() const
Return the EHCatchret Symbol for this basic block.
bool hasLabelMustBeEmitted() const
Test whether this block must have its label emitted.
int getNumber() const
MachineBasicBlocks are uniquely numbered at the function level, unless they're not in a MachineFuncti...
std::optional< UniqueBBID > getBBID() const
const BasicBlock * getBasicBlock() const
Return the LLVM basic block that this instance corresponded to originally.
unsigned getMaxBytesForAlignment() const
Return the maximum amount of padding allowed for aligning the basic block.
bool isIRBlockAddressTaken() const
Test whether this block is the target of an IR BlockAddress.
MCSymbol * getEndSymbol() const
Returns the MCSymbol marking the end of this basic block.
bool isEHFuncletEntry() const
Returns true if this is the entry block of an EH funclet.
bool sameSection(const MachineBasicBlock *MBB) const
Returns true if this and MBB belong to the same section.
unsigned succ_size() const
bool isReturnBlock() const
Convenience function that returns true if the block ends in a return instruction.
MBBSectionID getSectionID() const
Returns the section ID of this basic block.
bool isEntryBlock() const
Returns true if this is the entry block of the function.
BasicBlock * getAddressTakenIRBlock() const
Retrieves the BasicBlock which corresponds to this MachineBasicBlock.
bool isEHCatchretTarget() const
Returns true if this is a target block of a catchret.
pred_iterator pred_begin()
bool isLayoutSuccessor(const MachineBasicBlock *MBB) const
Return true if the specified MBB will be emitted immediately after this block, such that if this bloc...
instr_iterator instr_end()
const MachineFunction * getParent() const
Return the MachineFunction containing this basic block.
bool isBeginSection() const
Returns true if this block begins any section.
iterator_range< iterator > terminators()
iterator_range< succ_iterator > successors()
reverse_iterator rbegin()
bool isMachineBlockAddressTaken() const
Test whether this block is used as something other than the target of a terminator,...
bool isEndSection() const
Returns true if this block ends any section.
Align getAlignment() const
Return alignment of the basic block.
StringRef getName() const
Return the name of the corresponding LLVM basic block, or an empty string.
MachineBlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate machine basic b...
BlockFrequency getBlockFreq(const MachineBasicBlock *MBB) const
getblockFreq - Return block frequency.
BranchProbability getEdgeProbability(const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const
This class is a data container for one entry in a MachineConstantPool.
bool isMachineConstantPoolEntry() const
isMachineConstantPoolEntry - Return true if the MachineConstantPoolEntry is indeed a target specific ...
union llvm::MachineConstantPoolEntry::@204 Val
The constant itself.
MachineConstantPoolValue * MachineCPVal
Align Alignment
The required alignment for this entry.
unsigned getSizeInBytes(const DataLayout &DL) const
SectionKind getSectionKind(const DataLayout *DL) const
const Constant * ConstVal
Abstract base class for all machine specific constantpool value subclasses.
The MachineConstantPool class keeps track of constants referenced by a function which must be spilled...
const std::vector< MachineConstantPoolEntry > & getConstants() const
The MachineFrameInfo class represents an abstract stack frame until prolog/epilog code is inserted.
bool needsSplitStackProlog() const
Return true if this function requires a split stack prolog, even if it uses no stack space.
bool hasVarSizedObjects() const
This method may be called any time after instruction selection is complete to determine if the stack ...
uint64_t getStackSize() const
Return the number of bytes that must be allocated to hold all of the fixed size frame objects.
uint64_t getUnsafeStackSize() const
MachineFunctionPass - This class adapts the FunctionPass interface to allow convenient creation of pa...
void getAnalysisUsage(AnalysisUsage &AU) const override
getAnalysisUsage - Subclasses that override getAnalysisUsage must call this.
unsigned getFunctionNumber() const
getFunctionNumber - Return a unique ID for the current function.
const TargetSubtargetInfo & getSubtarget() const
getSubtarget - Return the subtarget for which this machine code is being compiled.
const std::vector< MCCFIInstruction > & getFrameInstructions() const
Returns a reference to a list of cfi instructions in the function's prologue.
StringRef getName() const
getName - Return the name of the corresponding LLVM function.
MachineFrameInfo & getFrameInfo()
getFrameInfo - Return the frame info object for the current function.
void setSection(MCSection *S)
Indicates the Section this function belongs to.
MCSymbol * getJTISymbol(unsigned JTI, MCContext &Ctx, bool isLinkerPrivate=false) const
getJTISymbol - Return the MCSymbol for the specified non-empty jump table.
void push_back(MachineBasicBlock *MBB)
reverse_iterator rbegin()
bool hasBBSections() const
Returns true if this function has basic block sections enabled.
MCContext & getContext() const
const DataLayout & getDataLayout() const
Return the DataLayout attached to the Module associated to this MF.
Align getAlignment() const
getAlignment - Return the alignment of the function.
Function & getFunction()
Return the LLVM function that this machine code represents.
const std::vector< LandingPadInfo > & getLandingPads() const
Return a reference to the landing pad info for the current function.
MCSection * getSection() const
Returns the Section this function belongs to.
const MachineBasicBlock & back() const
bool shouldSplitStack() const
Should we be emitting segmented stack stuff for the function.
MachineConstantPool * getConstantPool()
getConstantPool - Return the constant pool object for the current function.
const MachineBasicBlock & front() const
bool hasEHFunclets() const
const MachineJumpTableInfo * getJumpTableInfo() const
getJumpTableInfo - Return the jump table info object for the current function.
const TargetMachine & getTarget() const
getTarget - Return the target machine this machine code is compiled with
Representation of each machine instruction.
unsigned getEntrySize(const DataLayout &TD) const
getEntrySize - Return the size of each entry in the jump table.
@ EK_GPRel32BlockAddress
EK_GPRel32BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
@ EK_Inline
EK_Inline - Jump table entries are emitted inline at their point of use.
@ EK_LabelDifference32
EK_LabelDifference32 - Each entry is the address of the block minus the address of the jump table.
@ EK_Custom32
EK_Custom32 - Each entry is a 32-bit value that is custom lowered by the TargetLowering::LowerCustomJ...
@ EK_LabelDifference64
EK_LabelDifference64 - Each entry is the address of the block minus the address of the jump table.
@ EK_BlockAddress
EK_BlockAddress - Each entry is a plain address of block, e.g.: .word LBB123.
@ EK_GPRel64BlockAddress
EK_GPRel64BlockAddress - Each entry is an address of block, encoded with a relocation as gp-relative,...
unsigned getEntryAlignment(const DataLayout &TD) const
getEntryAlignment - Return the alignment of each entry in the jump table.
JTEntryKind getEntryKind() const
const std::vector< MachineJumpTableEntry > & getJumpTables() const
MachineModuleInfoCOFF - This is a MachineModuleInfoImpl implementation for COFF targets.
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
MachineModuleInfoELF - This is a MachineModuleInfoImpl implementation for ELF targets.
SymbolListTy GetGVStubList()
Accessor methods to return the set of stubs in sorted order.
std::vector< std::pair< MCSymbol *, StubValueTy > > SymbolListTy
const MCContext & getContext() const
const Module * getModule() const
Ty & getObjFileInfo()
Keep track of various per-module pieces of information for backends that would like to do so.
MachineOperand class - Representation of each machine instruction operand.
@ MO_Immediate
Immediate operand.
@ MO_CImmediate
Immediate >64bit operand.
@ MO_FrameIndex
Abstract Stack Frame Index.
@ MO_Register
Register operand.
@ MO_TargetIndex
Target-dependent index+offset operand.
@ MO_FPImmediate
Floating-point immediate operand.
void getNameWithPrefix(raw_ostream &OS, const GlobalValue *GV, bool CannotUsePrivateLabel) const
Print the appropriate prefix and the specified global variable's name.
This class implements a map that also provides access to all stored values in a deterministic order.
A Module instance is used to store all the information related to an LLVM module.
StringRef getName() const
Get a short "name" for the module.
const DataLayout & getDataLayout() const
Get the data layout for the module's target platform.
Metadata * getModuleFlag(StringRef Key) const
Return the corresponding value if Key appears in module flags, otherwise return null.
unsigned getNumOperands() const
iterator_range< op_iterator > operands()
Wrapper for a value that won't be replaced with a CFI jump table pointer in LowerTypeTestsModule.
static PointerType * getUnqual(Type *ElementType)
This constructs a pointer to an object of the specified type in the default address space (address sp...
Wrapper class representing virtual and physical registers.
static iterator_range< iterator > entries()
SimpleRegistryEntry< T > entry
Represents a location in source code.
SectionKind - This is a simple POD value that classifies the properties of a section.
static SectionKind getReadOnlyWithRel()
bool isThreadLocal() const
bool isThreadData() const
static SectionKind getReadOnly()
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
reference emplace_back(ArgTypes &&... Args)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
void serializeToStackMapSection()
If there is any stack map data, create a stack map section and serialize the map info into it.
int64_t getFixed() const
Returns the fixed component of the stack.
StringRef - Represent a constant reference to a string, i.e.
constexpr StringRef substr(size_t Start, size_t N=npos) const
Return a reference to the substring from [Start, Start + N).
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
size_t find(char C, size_t From=0) const
Search for the first character C in the string.
Used to lazily calculate structure layout information for a target machine, based on the DataLayout s...
TypeSize getSizeInBytes() const
TypeSize getElementOffset(unsigned Idx) const
Class to represent struct types.
unsigned getNumElements() const
Random access to the elements.
Information about stack frame layout on the target.
virtual StackOffset getFrameIndexReference(const MachineFunction &MF, int FI, Register &FrameReg) const
getFrameIndexReference - This method should return the base register and offset used to reference a f...
TargetInstrInfo - Interface to description of machine instruction set.
virtual MCInst getNop() const
Return the noop instruction to use for a noop.
Align getMinFunctionAlignment() const
Return the minimum function alignment.
virtual MCSection * getSectionForCommandLines() const
If supported, return the section to use for the llvm.commandline metadata.
static SectionKind getKindForGlobal(const GlobalObject *GO, const TargetMachine &TM)
Classify the specified global variable into a set of target independent categories embodied in Sectio...
virtual MCSection * getSectionForJumpTable(const Function &F, const TargetMachine &TM) const
virtual MCSection * getStaticDtorSection(unsigned Priority, const MCSymbol *KeySym) const
virtual bool shouldPutJumpTableInFunctionSection(bool UsesLabelDifference, const Function &F) const
virtual const MCExpr * getIndirectSymViaGOTPCRel(const GlobalValue *GV, const MCSymbol *Sym, const MCValue &MV, int64_t Offset, MachineModuleInfo *MMI, MCStreamer &Streamer) const
Get the target specific PC relative GOT entry relocation.
virtual void emitModuleMetadata(MCStreamer &Streamer, Module &M) const
Emit the module-level metadata that the platform cares about.
virtual MCSection * getSectionForConstant(const DataLayout &DL, SectionKind Kind, const Constant *C, Align &Alignment) const
Given a constant with the SectionKind, return a section that it should be placed in.
MCSymbol * getSymbolWithGlobalValueBase(const GlobalValue *GV, StringRef Suffix, const TargetMachine &TM) const
Return the MCSymbol for a private symbol with global value name as its base, with the specified suffi...
virtual MCSection * getStaticCtorSection(unsigned Priority, const MCSymbol *KeySym) const
virtual const MCExpr * lowerDSOLocalEquivalent(const DSOLocalEquivalent *Equiv, const TargetMachine &TM) const
bool supportGOTPCRelWithOffset() const
Target GOT "PC"-relative relocation supports encoding an additional binary expression with an offset?
bool supportIndirectSymViaGOTPCRel() const
Target supports replacing a data "PC"-relative access to a symbol through another symbol,...
virtual MCSymbol * getFunctionEntryPointSymbol(const GlobalValue *Func, const TargetMachine &TM) const
If supported, return the function entry point symbol.
virtual const MCExpr * lowerRelativeReference(const GlobalValue *LHS, const GlobalValue *RHS, const TargetMachine &TM) const
MCSection * SectionForGlobal(const GlobalObject *GO, SectionKind Kind, const TargetMachine &TM) const
This method computes the appropriate section to emit the specified global variable or function defini...
This class defines information used to lower LLVM code to legal SelectionDAG operators that the targe...
virtual const MCExpr * getPICJumpTableRelocBaseExpr(const MachineFunction *MF, unsigned JTI, MCContext &Ctx) const
This returns the relocation base for the given PIC jumptable, the same as getPICJumpTableRelocBase,...
virtual const MCExpr * LowerCustomJumpTableEntry(const MachineJumpTableInfo *, const MachineBasicBlock *, unsigned, MCContext &) const
Primary interface to the complete machine description for the target machine.
bool isPositionIndependent() const
virtual bool isNoopAddrSpaceCast(unsigned SrcAS, unsigned DestAS) const
Returns true if a cast between SrcAS and DestAS is a noop.
const Triple & getTargetTriple() const
const MCSubtargetInfo * getMCSubtargetInfo() const
bool useEmulatedTLS() const
Returns true if this target uses emulated TLS.
unsigned getPointerSize(unsigned AS) const
Get the pointer size for this target.
virtual TargetLoweringObjectFile * getObjFileLowering() const
Reloc::Model getRelocationModel() const
Returns the code generation relocation model.
virtual const TargetSubtargetInfo * getSubtargetImpl(const Function &) const
Virtual method implemented by subclasses that returns a reference to that target's TargetSubtargetInf...
MCSymbol * getSymbol(const GlobalValue *GV) const
unsigned getProgramPointerSize() const
CodeModel::Model getCodeModel() const
Returns the code model.
void getNameWithPrefix(SmallVectorImpl< char > &Name, const GlobalValue *GV, Mangler &Mang, bool MayAlwaysUsePrivate=false) const
const MCAsmInfo * getMCAsmInfo() const
Return target specific asm information.
unsigned EmitStackSizeSection
Emit section containing metadata on function stack sizes.
unsigned EmitAddrsig
Emit address-significance table.
unsigned UseInitArray
UseInitArray - Use .init_array instead of .ctors for static constructors.
MCTargetOptions MCOptions
Machine level options.
unsigned ForceDwarfFrameSection
Emit DWARF debug frame section.
std::string StackUsageOutput
Name of the stack usage file (i.e., .su file) if user passes -fstack-usage.
unsigned XRayFunctionIndex
Emit XRay Function Index section.
TargetSubtargetInfo - Generic base class for all target subtargets.
virtual const TargetRegisterInfo * getRegisterInfo() const
getRegisterInfo - If register information is available, return it.
virtual const TargetFrameLowering * getFrameLowering() const
virtual const TargetInstrInfo * getInstrInfo() const
virtual const TargetLowering * getTargetLowering() const
Target - Wrapper for Target specific information.
TinyPtrVector - This class is specialized for cases where there are normally 0 or 1 element in a vect...
Triple - Helper class for working with autoconf configuration names.
bool isOSBinFormatMachO() const
Tests whether the environment is MachO.
bool isOSBinFormatCOFF() const
Tests whether the OS uses the COFF binary format.
bool isOSWindows() const
Tests whether the OS is Windows.
bool isOSBinFormatXCOFF() const
Tests whether the OS uses the XCOFF binary format.
bool isOSAIX() const
Tests whether the OS is AIX.
bool isOSBinFormatELF() const
Tests whether the OS uses the ELF binary format.
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.
bool isFloatTy() const
Return true if this is 'float', a 32-bit IEEE fp type.
bool isBFloatTy() const
Return true if this is 'bfloat', a 16-bit bfloat type.
void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
bool isPPC_FP128Ty() const
Return true if this is powerpc long double.
bool isSized(SmallPtrSetImpl< Type * > *Visited=nullptr) const
Return true if it makes sense to take the size of this type.
bool isHalfTy() const
Return true if this is 'half', a 16-bit IEEE fp type.
bool isDoubleTy() const
Return true if this is 'double', a 64-bit IEEE fp type.
bool isFunctionTy() const
True if this is an instance of FunctionType.
Value * getOperand(unsigned i) const
unsigned getNumOperands() const
Value * operator=(Value *RHS)
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
bool hasOneUse() const
Return true if there is exactly one use of this value.
iterator_range< user_iterator > users()
void printAsOperand(raw_ostream &O, bool PrintType=true, const Module *M=nullptr) const
Print the name of this Value out to the specified raw_ostream.
const Value * stripPointerCasts() const
Strip off pointer casts, all-zero GEPs and address space casts.
LLVMContext & getContext() const
All values hold a context through their type.
StringRef getName() const
Return a constant reference to the value's name.
reverse_self_iterator getReverseIterator()
This class implements an extremely fast bulk output stream that can only output to a stream.
raw_ostream & indent(unsigned NumSpaces)
indent - Insert 'NumSpaces' spaces.
A raw_ostream that writes to an std::string.
A raw_ostream that writes to an SmallVector or SmallString.
StringRef OperationEncodingString(unsigned Encoding)
This file contains the declaration of the Comdat class, which represents a single COMDAT in LLVM.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
@ IMAGE_SCN_MEM_DISCARDABLE
@ IMAGE_SCN_CNT_INITIALIZED_DATA
@ IMAGE_SYM_CLASS_EXTERNAL
External symbol.
@ IMAGE_SYM_CLASS_STATIC
Static.
@ IMAGE_COMDAT_SELECT_ASSOCIATIVE
@ IMAGE_COMDAT_SELECT_ANY
@ IMAGE_SYM_DTYPE_FUNCTION
A function that returns a base type.
@ SCT_COMPLEX_TYPE_SHIFT
Type is formed as (base + (derived << SCT_COMPLEX_TYPE_SHIFT))
@ C
The default llvm calling convention, compatible with C.
@ S_ATTR_LIVE_SUPPORT
S_ATTR_LIVE_SUPPORT - Blocks are live if they reference live blocks.
@ Itanium
Windows CE ARM, PowerPC, SH3, SH4.
@ X86
Windows x64, Windows Itanium (IA-64)
ValuesClass values(OptsTy... Options)
Helper to build a ValuesClass by forwarding a variable number of arguments as an initializer list to ...
initializer< Ty > init(const Ty &Val)
uint8_t getUnitLengthFieldByteSize(DwarfFormat Format)
Get the byte size of the unit length field depending on the DWARF format.
uint8_t getDwarfOffsetByteSize(DwarfFormat Format)
The size of a reference determined by the DWARF 32/64-bit format.
DiagnosticInfoOptimizationBase::Argument NV
void make_absolute(const Twine ¤t_directory, SmallVectorImpl< char > &path)
Make path an absolute path.
@ OF_Text
The file should be opened in text mode on platforms like z/OS that make this distinction.
StringRef filename(StringRef path LLVM_LIFETIME_BOUND, Style style=Style::native)
Get filename.
This is an optimization pass for GlobalISel generic memory operations.
void stable_sort(R &&Range)
int popcount(T Value) noexcept
Count the number of set bits in a value.
@ SjLj
setjmp/longjmp based exceptions
@ ZOS
z/OS MVS Exception Handling.
@ None
No exception support.
@ AIX
AIX Exception Handling.
@ DwarfCFI
DWARF-like instruction based exceptions.
@ WinEH
Windows Exception Handling.
@ Wasm
WebAssembly Exception Handling.
bool IsConstantOffsetFromGlobal(Constant *C, GlobalValue *&GV, APInt &Offset, const DataLayout &DL, DSOLocalEquivalent **DSOEquiv=nullptr)
If this constant is a constant offset from a global, return the global and the constant.
void append_range(Container &C, Range &&R)
Wrapper function to append range R to container C.
@ MCDR_DataRegionEnd
.end_data_region
@ MCDR_DataRegionJT32
.data_region jt32
bool isNoOpWithoutInvoke(EHPersonality Pers)
Return true if this personality may be safely removed if there are no invoke instructions remaining i...
Constant * ConstantFoldConstant(const Constant *C, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr)
ConstantFoldConstant - Fold the constant using the specified DataLayout.
auto reverse(ContainerTy &&C)
void sort(IteratorTy Start, IteratorTy End)
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
EHPersonality classifyEHPersonality(const Value *Pers)
See if the given exception handling personality function is one that we understand.
format_object< Ts... > format(const char *Fmt, const Ts &... Vals)
These are helper functions used to produce formatted output.
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
@ Global
Append to llvm.global_dtors.
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Constant * ConstantFoldIntegerCast(Constant *C, Type *DestTy, bool IsSigned, const DataLayout &DL)
Constant fold a zext, sext or trunc, depending on IsSigned and whether the DestTy is wider or narrowe...
Printable printReg(Register Reg, const TargetRegisterInfo *TRI=nullptr, unsigned SubIdx=0, const MachineRegisterInfo *MRI=nullptr)
Prints virtual and physical registers with or without a TRI instance.
@ MCSA_WeakDefAutoPrivate
.weak_def_can_be_hidden (MachO)
@ MCSA_WeakReference
.weak_reference (MachO)
@ MCSA_AltEntry
.alt_entry (MachO)
@ MCSA_ELF_TypeIndFunction
.type _foo, STT_GNU_IFUNC
@ MCSA_WeakDefinition
.weak_definition (MachO)
@ MCSA_Global
.type _foo, @gnu_unique_object
@ MCSA_ELF_TypeObject
.type _foo, STT_OBJECT # aka @object
@ MCSA_ELF_TypeFunction
.type _foo, STT_FUNC # aka @function
@ MCSA_Invalid
Not a valid directive.
@ MCSA_NoDeadStrip
.no_dead_strip (MachO)
constexpr const char * PseudoProbeDescMetadataName
Implement std::hash so that hash_code can be used in STL containers.
void swap(llvm::BitVector &LHS, llvm::BitVector &RHS)
Implement std::swap in terms of BitVector swap.
static constexpr roundingMode rmNearestTiesToEven
static const fltSemantics & IEEEdouble() LLVM_READNONE
This struct is a compact representation of a valid (non-zero power of two) alignment.
Map a basic block section ID to the begin and end symbols of that section which determine the section...
llvm.global_ctors and llvm.global_dtors are arrays of Structor structs.
void emit(int, MCStreamer *) const
Description of the encoding of one expression Op.
Machine model for scheduling, bundling, and heuristics.
static int computeInstrLatency(const MCSubtargetInfo &STI, const MCSchedClassDesc &SCDesc)
Returns the latency value for the scheduling class.
This struct is a compact representation of a valid (power of two) or undefined (0) alignment.
A helper struct providing information about the byte size of DW_FORM values that vary in size dependi...