33#include "llvm/Config/llvm-config.h"
110 return VAM->getValue();
123 for (
const Value *
Op :
C->operands())
130 unsigned ID = OM.size() + 1;
137 auto OrderConstantValue = [&OM](
const Value *
V) {
142 auto OrderConstantFromMetadata = [&](
Metadata *MD) {
144 OrderConstantValue(VAM->getValue());
146 for (
const auto *VAM : AL->getArgs())
147 OrderConstantValue(VAM->getValue());
152 if (
G.hasInitializer())
168 for (
const Use &U :
F.operands())
174 if (
F.isDeclaration())
187 OrderConstantFromMetadata(DVR.getRawLocation());
188 if (DVR.isDbgAssign())
189 OrderConstantFromMetadata(DVR.getRawAddress());
192 for (
const Value *
Op :
I.operands()) {
205static std::vector<unsigned>
208 using Entry = std::pair<const Use *, unsigned>;
210 for (
const Use &U :
V->uses())
212 if (OM.lookup(U.getUser()))
213 List.
push_back(std::make_pair(&U, List.size()));
224 ID = OM.lookup(BA->getBasicBlock());
225 llvm::sort(List, [&](
const Entry &L,
const Entry &R) {
226 const Use *LU = L.first;
227 const Use *RU = R.first;
231 auto LID = OM.lookup(LU->getUser());
232 auto RID = OM.lookup(RU->getUser());
252 return LU->getOperandNo() < RU->getOperandNo();
253 return LU->getOperandNo() > RU->getOperandNo();
261 std::vector<unsigned> Shuffle(List.size());
262 for (
size_t I = 0,
E = List.size();
I !=
E; ++
I)
263 Shuffle[
I] = List[
I].second;
270 for (
const auto &Pair : OM) {
271 const Value *
V = Pair.first;
272 if (
V->use_empty() || std::next(
V->use_begin()) ==
V->use_end())
275 std::vector<unsigned> Shuffle =
282 F =
I->getFunction();
287 ULOM[
F][
V] = std::move(Shuffle);
294 return MA->getParent() ? MA->getParent()->getParent() :
nullptr;
297 return BB->getParent() ? BB->getParent()->getParent() :
nullptr;
300 const Function *M =
I->getParent() ?
I->getParent()->getParent() :
nullptr;
301 return M ? M->getParent() :
nullptr;
305 return GV->getParent();
330 default: Out <<
"cc" << cc;
break;
353 Out <<
"aarch64_sve_vector_pcs";
356 Out <<
"aarch64_sme_preservemost_from_x0";
359 Out <<
"aarch64_sme_preservemost_from_x1";
362 Out <<
"aarch64_sme_preservemost_from_x2";
390 Out <<
"amdgpu_cs_chain";
393 Out <<
"amdgpu_cs_chain_preserve";
398 Out <<
"amdgpu_gfx_whole_wave";
402 Out <<
"wasm_emscripten_invokecc";
405 Out <<
"riscv_vector_cc";
407#define CC_VLS_CASE(ABI_VLEN) \
408 case CallingConv::RISCV_VLSCall_##ABI_VLEN: \
409 Out << "riscv_vls_cc(" #ABI_VLEN ")"; \
425 Out <<
"cheriot_compartmentcallcc";
428 Out <<
"cheriot_compartmentcalleecc";
431 Out <<
"cheriot_librarycallcc";
445 assert(!Name.empty() &&
"Cannot get empty name!");
448 bool NeedsQuotes = isdigit(
static_cast<unsigned char>(Name[0]));
450 for (
unsigned char C : Name) {
455 if (!isalnum(
C) &&
C !=
'-' &&
C !=
'.' &&
C !=
'_') {
509 Out << Mask.size() <<
" x i32> ";
511 Out <<
"zeroinitializer";
517 for (
int Elt : Mask) {
532 TypePrinting(
const Module *M =
nullptr)
533 : M(M), TypesIncorporated(M == nullptr) {}
535 TypePrinting(
const TypePrinting &) =
delete;
536 TypePrinting &operator=(
const TypePrinting &) =
delete;
539 TypeFinder &getNamedTypes();
542 std::vector<StructType *> &getNumberedTypes();
548 void printStructBody(StructType *Ty, raw_ostream &OS);
551 void incorporateTypes();
555 bool TypesIncorporated;
557 TypeFinder NamedTypes;
560 DenseMap<StructType *, unsigned> Type2Number;
562 std::vector<StructType *> NumberedTypes;
572std::vector<StructType *> &TypePrinting::getNumberedTypes() {
578 if (NumberedTypes.size() == Type2Number.size())
579 return NumberedTypes;
581 NumberedTypes.resize(Type2Number.size());
582 for (
const auto &
P : Type2Number) {
583 assert(
P.second < NumberedTypes.size() &&
"Didn't get a dense numbering?");
584 assert(!NumberedTypes[
P.second] &&
"Didn't get a unique numbering?");
585 NumberedTypes[
P.second] =
P.first;
587 return NumberedTypes;
590bool TypePrinting::empty() {
592 return NamedTypes.
empty() && Type2Number.empty();
595void TypePrinting::incorporateTypes() {
596 if (TypesIncorporated)
599 NamedTypes.
run(*M,
false);
600 TypesIncorporated =
true;
604 unsigned NextNumber = 0;
606 std::vector<StructType *>::iterator NextToUse = NamedTypes.
begin();
607 for (StructType *STy : NamedTypes) {
609 if (STy->isLiteral())
612 if (STy->getName().empty())
613 Type2Number[STy] = NextNumber++;
618 NamedTypes.erase(NextToUse, NamedTypes.end());
623 bool ForcePrint =
false) {
624 if (AS == 0 && !ForcePrint)
626 OS << Prefix <<
"addrspace(";
628 ? M->getDataLayout().getAddressSpaceName(AS)
631 OS <<
"\"" << ASName <<
"\"";
639void TypePrinting::print(
Type *Ty, raw_ostream &OS) {
641 case Type::VoidTyID: OS <<
"void";
return;
642 case Type::HalfTyID: OS <<
"half";
return;
643 case Type::BFloatTyID: OS <<
"bfloat";
return;
644 case Type::FloatTyID: OS <<
"float";
return;
645 case Type::DoubleTyID: OS <<
"double";
return;
646 case Type::X86_FP80TyID: OS <<
"x86_fp80";
return;
647 case Type::FP128TyID: OS <<
"fp128";
return;
648 case Type::PPC_FP128TyID: OS <<
"ppc_fp128";
return;
649 case Type::LabelTyID: OS <<
"label";
return;
650 case Type::MetadataTyID:
653 case Type::X86_AMXTyID: OS <<
"x86_amx";
return;
654 case Type::TokenTyID: OS <<
"token";
return;
658 case Type::IntegerTyID:
659 OS << 'i' << cast<IntegerType>(Ty)->getBitWidth();
662 case Type::FunctionTyID: {
664 print(FTy->getReturnType(), OS);
667 for (
Type *Ty : FTy->params()) {
676 case Type::StructTyID: {
680 return printStructBody(STy, OS);
686 const auto I = Type2Number.find(STy);
687 if (
I != Type2Number.end())
688 OS <<
'%' <<
I->second;
690 OS <<
"%\"type " << STy <<
'\"';
693 case Type::PointerTyID: {
699 case Type::ArrayTyID: {
701 OS <<
'[' << ATy->getNumElements() <<
" x ";
702 print(ATy->getElementType(), OS);
706 case Type::FixedVectorTyID:
707 case Type::ScalableVectorTyID: {
709 ElementCount
EC = PTy->getElementCount();
713 OS <<
EC.getKnownMinValue() <<
" x ";
714 print(PTy->getElementType(), OS);
718 case Type::TypedPointerTyID: {
724 case Type::TargetExtTyID:
731 Inner->print(OS,
false,
true);
734 OS <<
", " << IntParam;
741void TypePrinting::printStructBody(StructType *STy, raw_ostream &OS) {
783 const Function* TheFunction =
nullptr;
784 bool FunctionProcessed =
false;
785 bool ShouldTrackMetadataDefinitions;
790 ProcessFunctionHookFn;
811 unsigned ModulePathNext = 0;
815 unsigned GUIDNext = 0;
819 unsigned TypeIdNext = 0;
824 unsigned TypeIdCompatibleVtableNext = 0;
830 bool ShouldTrackMetadataDefinitions =
false);
866 FunctionProcessed =
false;
874 void purgeFunction();
881 unsigned mdn_size()
const {
return mdnMap.size(); }
889 unsigned as_size()
const {
return asMap.size(); }
905 void CreateMetadataSlot(
const MDNode *
N);
908 void CreateFunctionSlot(
const Value *V);
913 inline void CreateModulePathSlot(
StringRef Path);
916 void CreateTypeIdCompatibleVtableSlot(
StringRef Id);
930 : M(M), F(F), Machine(&Machine) {}
933 : ShouldCreateStorage(M), M(M) {}
938 if (!ShouldCreateStorage)
941 ShouldCreateStorage =
false;
942 MachineStorage = std::make_unique<SlotTracker>(M);
943 Machine = MachineStorage.get();
944 if (ProcessModuleHookFn)
945 Machine->setProcessHook(ProcessModuleHookFn);
946 if (ProcessFunctionHookFn)
947 Machine->setProcessHook(ProcessFunctionHookFn);
960 Machine->purgeFunction();
961 Machine->incorporateFunction(&F);
966 assert(F &&
"No function incorporated");
967 return Machine->getLocalSlot(V);
972 ProcessModuleHookFn = std::move(Fn);
977 ProcessFunctionHookFn = std::move(Fn);
1007#define ST_DEBUG(X) dbgs() << X
1016 ShouldTrackMetadataDefinitions(ShouldTrackMetadataDefinitions) {}
1021 : TheModule(
F ?
F->
getParent() : nullptr), TheFunction(
F),
1022 ShouldTrackMetadataDefinitions(
false) {}
1025 : TheModule(nullptr), ShouldTrackMetadataDefinitions(
false),
1031 TheModule =
nullptr;
1034 if (TheFunction && !FunctionProcessed)
1041 int NumSlots = processIndex();
1048void SlotTracker::processModule() {
1049 ST_DEBUG(
"begin processModule!\n");
1054 CreateModuleSlot(&Var);
1055 auto Attrs = Var.getAttributes();
1056 if (Attrs.hasAttributes())
1057 CreateAttributeSetSlot(Attrs);
1062 CreateModuleSlot(&
A);
1065 for (
const GlobalIFunc &
I : TheModule->ifuncs()) {
1067 CreateModuleSlot(&
I);
1073 CreateModuleSlot(&
F);
1077 AttributeSet FnAttrs =
F.getAttributes().getFnAttrs();
1079 CreateAttributeSetSlot(FnAttrs);
1082 if (ProcessModuleHookFn)
1083 ProcessModuleHookFn(
this, TheModule);
1089void SlotTracker::processFunction() {
1090 ST_DEBUG(
"begin processFunction!\n");
1095 AE = TheFunction->arg_end(); AI != AE; ++AI)
1097 CreateFunctionSlot(&*AI);
1099 ST_DEBUG(
"Inserting Instructions:\n");
1102 for (
auto &BB : *TheFunction) {
1104 CreateFunctionSlot(&BB);
1106 for (
auto &
I : BB) {
1107 if (!
I.getType()->isVoidTy() && !
I.hasName())
1108 CreateFunctionSlot(&
I);
1115 if (
Attrs.hasAttributes())
1116 CreateAttributeSetSlot(Attrs);
1121 if (ProcessFunctionHookFn)
1122 ProcessFunctionHookFn(
this, TheFunction);
1124 FunctionProcessed =
true;
1126 ST_DEBUG(
"end processFunction!\n");
1130int SlotTracker::processIndex() {
1137 std::vector<StringRef> ModulePaths;
1138 for (
auto &[ModPath,
_] : TheIndex->modulePaths())
1139 ModulePaths.push_back(ModPath);
1141 for (
auto &ModPath : ModulePaths)
1142 CreateModulePathSlot(ModPath);
1145 GUIDNext = ModulePathNext;
1148 for (
const auto &GlobalList : TheIndex->sortedGlobalValueSummariesRange())
1149 CreateGUIDSlot(GlobalList.first);
1152 TypeIdCompatibleVtableNext = GUIDNext;
1153 for (
auto &TId : TheIndex->typeIdCompatibleVtableMap())
1154 CreateTypeIdCompatibleVtableSlot(TId.first);
1157 TypeIdNext = TypeIdCompatibleVtableNext;
1158 for (
const auto &TID : TheIndex->typeIds())
1159 CreateTypeIdSlot(TID.second.first);
1166class MetadataNodeVisitor {
1168 SmallPtrSet<const MDNode *, 32> VisitedMDNodes;
1169 function_ref<void(
const MDNode *)> Visit;
1171 void visit(
const MDNode *
N) {
1176 for (
const MDOperand &
Op :
N->operands())
1181 void visitGlobalObjectMetadata(
const GlobalObject &GO) {
1184 for (
auto &MD : MDs)
1188 void visitDbgRecordMetadata(
const DbgRecord &DR) {
1192 if (DVR->getRawVariable())
1193 visit(DVR->getRawVariable());
1194 if (DVR->isDbgAssign()) {
1195 if (
auto *AssignID = DVR->getRawAssignID())
1201 visit(DLR->getRawLabel());
1209 void visitInstructionMetadata(
const Instruction &
I) {
1211 if (
Function *
F = CI->getCalledFunction())
1212 if (
F->isIntrinsic())
1213 for (
auto &
Op :
I.operands())
1219 I.getAllMetadata(MDs);
1220 for (
auto &MD : MDs)
1224 void visitFunctionMetadata(
const Function &
F) {
1225 visitGlobalObjectMetadata(
F);
1226 for (
const BasicBlock &BB :
F)
1227 for (
const Instruction &
I : BB) {
1228 for (
const DbgRecord &DR :
I.getDbgRecordRange())
1229 visitDbgRecordMetadata(DR);
1230 visitInstructionMetadata(
I);
1235 MetadataNodeVisitor(function_ref<
void(
const MDNode *)> Visit)
1238 void visitModuleMetadata(
const Module &M) {
1239 for (
const GlobalVariable &Var :
M.globals())
1240 visitGlobalObjectMetadata(Var);
1241 for (
const GlobalIFunc &
I :
M.ifuncs())
1242 visitGlobalObjectMetadata(
I);
1243 for (
const NamedMDNode &NMD :
M.named_metadata())
1244 for (
const MDNode *
N : NMD.operands())
1247 visitFunctionMetadata(
F);
1258class MetadataIDRenumberer {
1259 uint32_t NextID = 0;
1265 bool IsAdditionalMetadata =
false;
1266 auto Renumber = [&](
const MDNode *
N) {
1267 N->getContext().pImpl->setMetadataPrintID(
const_cast<MDNode *
>(
N),
1269 if (IsAdditionalMetadata && AdditionalMetadataNodes)
1270 AdditionalMetadataNodes->emplace_back(
1271 N->getContext().pImpl->getMetadataPrintID(
N),
N);
1273 MetadataNodeVisitor Visitor(Renumber);
1275 Visitor.visitModuleMetadata(M);
1277 IsAdditionalMetadata =
true;
1278 Visitor.visitMetadata(AdditionalMetadata);
1282 M.getContext().pImpl->getAllMetadataNodes(RemainingNodes);
1284 return Visitor.contains(
N) ||
1285 M.getContext().pImpl->getMetadataPrintID(
N) >= NextID;
1288 return M.getContext().pImpl->getMetadataPrintID(
LHS) <
1289 M.getContext().pImpl->getMetadataPrintID(
RHS);
1291 for (MDNode *
N : RemainingNodes)
1292 M.getContext().pImpl->setMetadataPrintID(
1293 N,
M.getContext().pImpl->allocateMetadataPrintID());
1295 if (AdditionalMetadataNodes)
1302 MetadataIDRenumberer().run(*
this, {});
1308 assert(M &&
"metadata renumbering requires a module");
1309 MetadataIDRenumberer().run(*M, AdditionalMetadata, AdditionalMetadataNodes);
1315 assert(M &&
"metadata collection requires a module");
1316 bool IsAdditionalMetadata =
false;
1317 auto Collect = [&](
const MDNode *
N) {
1318 if (IsAdditionalMetadata)
1320 N->getContext().pImpl->getMetadataPrintID(
N),
N);
1322 MetadataNodeVisitor Visitor(Collect);
1323 Visitor.visitModuleMetadata(*M);
1324 IsAdditionalMetadata =
true;
1325 Visitor.visitMetadata(AdditionalMetadata);
1333 ST_DEBUG(
"begin purgeFunction!\n");
1335 TheFunction =
nullptr;
1336 FunctionProcessed =
false;
1347 return MI == mMap.end() ? -1 : (int)
MI->second;
1352 ProcessModuleHookFn = std::move(Fn);
1357 ProcessFunctionHookFn = std::move(Fn);
1370 if (ShouldTrackMetadataDefinitions)
1371 CreateMetadataSlot(
N);
1372 return N->getContext().pImpl->getMetadataPrintID(
N);
1383 return FI == fMap.end() ? -1 : (int)FI->second;
1392 return AI == asMap.end() ? -1 : (int)AI->second;
1400 auto I = ModulePathMap.find(Path);
1401 return I == ModulePathMap.end() ? -1 : (int)
I->second;
1410 return I == GUIDMap.end() ? -1 : (int)
I->second;
1418 auto I = TypeIdMap.find(Id);
1419 return I == TypeIdMap.end() ? -1 : (int)
I->second;
1427 auto I = TypeIdCompatibleVtableMap.find(Id);
1428 return I == TypeIdCompatibleVtableMap.end() ? -1 : (int)
I->second;
1432void SlotTracker::CreateModuleSlot(
const GlobalValue *V) {
1433 assert(V &&
"Can't insert a null Value into SlotTracker!");
1434 assert(!V->getType()->isVoidTy() &&
"Doesn't need a slot!");
1435 assert(!V->hasName() &&
"Doesn't need a slot!");
1437 unsigned DestSlot = mNext++;
1440 ST_DEBUG(
" Inserting value [" << V->getType() <<
"] = " << V <<
" slot=" <<
1450void SlotTracker::CreateFunctionSlot(
const Value *
V) {
1451 assert(!
V->getType()->isVoidTy() && !
V->hasName() &&
"Doesn't need a slot!");
1453 unsigned DestSlot = fNext++;
1457 ST_DEBUG(
" Inserting value [" <<
V->getType() <<
"] = " <<
V <<
" slot=" <<
1458 DestSlot <<
" [o]\n");
1462void SlotTracker::CreateMetadataSlot(
const MDNode *
N) {
1463 assert(
N &&
"Can't insert a null Value into SlotTracker!");
1468 unsigned ID =
N->getContext().pImpl->getMetadataPrintID(
N);
1469 if (!mdnMap.try_emplace(
N, ID).second)
1472 for (
const MDOperand &
Op :
N->operands())
1474 CreateMetadataSlot(OpNode);
1477void SlotTracker::CreateAttributeSetSlot(
AttributeSet AS) {
1480 if (asMap.try_emplace(AS, asNext).second)
1485void SlotTracker::CreateModulePathSlot(
StringRef Path) {
1486 ModulePathMap[
Path] = ModulePathNext++;
1491 GUIDMap[
GUID] = GUIDNext++;
1495void SlotTracker::CreateTypeIdSlot(
StringRef Id) {
1496 TypeIdMap[
Id] = TypeIdNext++;
1500void SlotTracker::CreateTypeIdCompatibleVtableSlot(
StringRef Id) {
1501 TypeIdCompatibleVtableMap[
Id] = TypeIdCompatibleVtableNext++;
1506struct AsmWriterContext {
1507 TypePrinting *TypePrinter =
nullptr;
1508 SlotTracker *
Machine =
nullptr;
1510 const ModuleSlotTracker *MST =
nullptr;
1512 AsmWriterContext(TypePrinting *TP, SlotTracker *ST,
const Module *M =
nullptr,
1513 const ModuleSlotTracker *MST =
nullptr)
1516 static AsmWriterContext &getEmpty() {
1517 static AsmWriterContext EmptyCtx(
nullptr,
nullptr);
1523 virtual void onWriteMetadataAsOperand(
const Metadata *) {}
1525 virtual ~AsmWriterContext() =
default;
1534 AsmWriterContext &WriterCtx,
1535 bool PrintType =
false);
1538 AsmWriterContext &WriterCtx,
1539 bool FromValue =
false);
1543 Out << FPO->getFastMathFlags();
1546 if (OBO->hasNoUnsignedWrap())
1548 if (OBO->hasNoSignedWrap())
1554 if (PDI->isDisjoint())
1557 if (
GEP->isInBounds())
1559 else if (
GEP->hasNoUnsignedSignedWrap())
1561 if (
GEP->hasNoUnsignedWrap())
1564 Out <<
" inrange(" <<
InRange->getLower() <<
", " <<
InRange->getUpper()
1568 if (NNI->hasNonNeg())
1571 if (TI->hasNoUnsignedWrap())
1573 if (TI->hasNoSignedWrap())
1576 if (ICmp->hasSameSign())
1579 if (ASC->hasNonNull())
1587 unsigned NumDigits = std::max((Val.
getBitWidth() + 3) / 4, 1U);
1589 for (
unsigned i = 0; i < NumDigits - Bits.size(); i++)
1595 bool ForceBitwiseOutput =
false;
1601 ForceBitwiseOutput = !HiWord.
isZero();
1604 if (!ForceBitwiseOutput) {
1607 Out << (APF.
isNegative() ?
'-' :
'+') <<
"inf";
1649 AsmWriterContext &WriterCtx) {
1651 Type *Ty = CI->getType();
1653 if (Ty->isVectorTy()) {
1655 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1659 if (Ty->getScalarType()->isIntegerTy(1))
1660 Out << (CI->getZExtValue() ?
"true" :
"false");
1662 Out << CI->getValue();
1664 if (Ty->isVectorTy())
1671 Type *Ty = CB->getType();
1673 if (Ty->isVectorTy()) {
1675 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1679 Out << CB->getValue();
1681 if (Ty->isVectorTy())
1688 Type *Ty = CFP->getType();
1690 if (Ty->isVectorTy()) {
1691 if (CFP->getValue().bitcastToAPInt().isZero()) {
1692 Out <<
"zeroinitializer";
1697 WriterCtx.TypePrinter->print(Ty->getScalarType(), Out);
1703 if (Ty->isVectorTy())
1710 Out <<
"zeroinitializer";
1715 Out <<
"blockaddress(";
1724 Out <<
"dso_local_equivalent ";
1739 unsigned NumOpsToWrite = 2;
1740 if (!CPA->getOperand(2)->isNullValue())
1748 for (
unsigned i = 0, e = NumOpsToWrite; i != e; ++i) {
1760 for (
const Value *
Op : CA->operands()) {
1771 if (CA->isString()) {
1780 for (
uint64_t i = 0, e = CA->getNumElements(); i != e; ++i) {
1790 if (CS->getType()->isPacked())
1793 if (CS->getNumOperands() != 0) {
1796 for (
const Value *
Op : CS->operands()) {
1803 if (CS->getType()->isPacked())
1828 for (
unsigned i = 0, e = CVVTy->getNumElements(); i != e; ++i) {
1872 if (CE->getOpcode() == Instruction::ShuffleVector) {
1873 if (
auto *SplatVal = CE->getSplatValue()) {
1884 Out << CE->getOpcodeName();
1889 WriterCtx.TypePrinter->print(
GEP->getSourceElementType(), Out);
1894 for (
const Value *
Op : CE->operands()) {
1901 WriterCtx.TypePrinter->print(CE->getType(), Out);
1904 if (CE->getOpcode() == Instruction::ShuffleVector)
1911 Out <<
"<placeholder or erroneous Constant>";
1915 AsmWriterContext &WriterCtx) {
1923 Value *
V = MDV->getValue();
1927 WriterCtx.onWriteMetadataAsOperand(MD);
1936struct MDFieldPrinter {
1939 AsmWriterContext &WriterCtx;
1941 explicit MDFieldPrinter(raw_ostream &Out)
1942 :
Out(
Out), WriterCtx(AsmWriterContext::getEmpty()) {}
1943 MDFieldPrinter(raw_ostream &Out, AsmWriterContext &Ctx)
1944 :
Out(
Out), WriterCtx(Ctx) {}
1946 void printTag(
const DINode *
N);
1947 void printMacinfoType(
const DIMacroNode *
N);
1948 void printChecksum(
const DIFile::ChecksumInfo<StringRef> &
N);
1949 void printString(StringRef Name, StringRef
Value,
1950 bool ShouldSkipEmpty =
true);
1951 void printMetadata(StringRef Name,
const Metadata *MD,
1952 bool ShouldSkipNull =
true);
1953 void printMetadataOrInt(StringRef Name,
const Metadata *MD,
bool IsUnsigned,
1954 bool ShouldSkipZero =
true);
1955 template <
class IntTy>
1956 void printInt(StringRef Name, IntTy
Int,
bool ShouldSkipZero =
true);
1957 void printAPInt(StringRef Name,
const APInt &
Int,
bool IsUnsigned,
1958 bool ShouldSkipZero);
1959 void printBool(StringRef Name,
bool Value,
1960 std::optional<bool>
Default = std::nullopt);
1963 template <
class IntTy,
class Stringifier>
1964 void printDwarfEnum(StringRef Name, IntTy
Value, Stringifier
toString,
1965 bool ShouldSkipZero =
true);
1967 void printNameTableKind(StringRef Name,
1974void MDFieldPrinter::printTag(
const DINode *
N) {
1975 Out <<
FS <<
"tag: ";
1983void MDFieldPrinter::printMacinfoType(
const DIMacroNode *
N) {
1984 Out <<
FS <<
"type: ";
1989 Out <<
N->getMacinfoType();
1992void MDFieldPrinter::printChecksum(
1995 printString(
"checksum", Checksum.
Value,
false);
1999 bool ShouldSkipEmpty) {
2000 if (ShouldSkipEmpty &&
Value.empty())
2009 AsmWriterContext &WriterCtx) {
2015 WriterCtx.onWriteMetadataAsOperand(MD);
2019 bool ShouldSkipNull) {
2020 if (ShouldSkipNull && !MD)
2028 bool IsUnsigned,
bool ShouldSkipZero) {
2035 printInt(Name, CV->getZExtValue(), ShouldSkipZero);
2037 printInt(Name, CV->getSExtValue(), ShouldSkipZero);
2039 printMetadata(Name, MD);
2042template <
class IntTy>
2043void MDFieldPrinter::printInt(
StringRef Name, IntTy
Int,
bool ShouldSkipZero) {
2044 if (ShouldSkipZero && !
Int)
2051 bool IsUnsigned,
bool ShouldSkipZero) {
2052 if (ShouldSkipZero &&
Int.isZero())
2056 Int.print(Out, !IsUnsigned);
2060 std::optional<bool>
Default) {
2076 for (
auto F : SplitFlags) {
2078 assert(!StringF.empty() &&
"Expected valid flag");
2079 Out << FlagsFS << StringF;
2081 if (Extra || SplitFlags.empty())
2082 Out << FlagsFS << Extra;
2085void MDFieldPrinter::printDISPFlags(
StringRef Name,
2100 for (
auto F : SplitFlags) {
2102 assert(!StringF.empty() &&
"Expected valid flag");
2103 Out << FlagsFS << StringF;
2105 if (Extra || SplitFlags.empty())
2106 Out << FlagsFS << Extra;
2109void MDFieldPrinter::printEmissionKind(
StringRef Name,
2114void MDFieldPrinter::printNameTableKind(
StringRef Name,
2121void MDFieldPrinter::printFixedPointKind(
StringRef Name,
2126template <
class IntTy,
class Stringifier>
2128 Stringifier
toString,
bool ShouldSkipZero) {
2129 if (ShouldSkipZero && !
Value)
2141 AsmWriterContext &WriterCtx) {
2142 Out <<
"!GenericDINode(";
2143 MDFieldPrinter
Printer(Out, WriterCtx);
2145 Printer.printString(
"header",
N->getHeader());
2146 if (
N->getNumDwarfOperands()) {
2147 Out <<
Printer.FS <<
"operands: {";
2149 for (
auto &
I :
N->dwarf_operands()) {
2159 AsmWriterContext &WriterCtx) {
2160 Out <<
"!DILocation(";
2161 MDFieldPrinter
Printer(Out, WriterCtx);
2163 Printer.printInt(
"line",
DL->getLine(),
false);
2164 Printer.printInt(
"column",
DL->getColumn());
2165 Printer.printMetadata(
"scope",
DL->getRawScope(),
false);
2166 Printer.printMetadata(
"inlinedAt",
DL->getRawInlinedAt());
2167 Printer.printBool(
"isImplicitCode",
DL->isImplicitCode(),
2169 Printer.printInt(
"atomGroup",
DL->getAtomGroup());
2170 Printer.printInt<
unsigned>(
"atomRank",
DL->getAtomRank());
2171 Printer.printMetadata(
"irlayers",
DL->getRawIRLayers());
2176 AsmWriterContext &WriterCtx) {
2177 Out <<
"!DILayerLoc(";
2178 MDFieldPrinter
Printer(Out, WriterCtx);
2179 Printer.printInt(
"line",
N->getLine(),
false);
2180 Printer.printInt(
"column",
N->getColumn());
2181 Printer.printMetadata(
"file",
N->getRawFile(),
false);
2182 Printer.printString(
"kind",
N->getKind(),
false);
2187 AsmWriterContext &WriterCtx) {
2188 Out <<
"!DILayerLocList(";
2198 AsmWriterContext &WriterCtx) {
2199 Out <<
"!DIAssignID()";
2200 MDFieldPrinter
Printer(Out, WriterCtx);
2204 AsmWriterContext &WriterCtx) {
2205 Out <<
"!DISubrange(";
2206 MDFieldPrinter
Printer(Out, WriterCtx);
2208 Printer.printMetadataOrInt(
"count",
N->getRawCountNode(),
2214 Printer.printMetadataOrInt(
"lowerBound",
N->getRawLowerBound(),
2217 Printer.printMetadataOrInt(
"upperBound",
N->getRawUpperBound(),
2220 Printer.printMetadataOrInt(
"stride",
N->getRawStride(),
2228 AsmWriterContext &WriterCtx) {
2229 Out <<
"!DIGenericSubrange(";
2230 MDFieldPrinter
Printer(Out, WriterCtx);
2232 auto GetConstant = [&](
Metadata *Bound) -> std::optional<int64_t> {
2235 return std::nullopt;
2236 if (BE->isConstant() &&
2238 *BE->isConstant()) {
2239 return static_cast<int64_t
>(BE->getElement(1));
2241 return std::nullopt;
2244 auto *
Count =
N->getRawCountNode();
2245 if (
auto ConstantCount = GetConstant(
Count))
2246 Printer.printInt(
"count", *ConstantCount,
2251 auto *LBound =
N->getRawLowerBound();
2252 if (
auto ConstantLBound = GetConstant(LBound))
2253 Printer.printInt(
"lowerBound", *ConstantLBound,
2256 Printer.printMetadata(
"lowerBound", LBound,
true);
2258 auto *UBound =
N->getRawUpperBound();
2259 if (
auto ConstantUBound = GetConstant(UBound))
2260 Printer.printInt(
"upperBound", *ConstantUBound,
2263 Printer.printMetadata(
"upperBound", UBound,
true);
2265 auto *Stride =
N->getRawStride();
2266 if (
auto ConstantStride = GetConstant(Stride))
2267 Printer.printInt(
"stride", *ConstantStride,
2270 Printer.printMetadata(
"stride", Stride,
true);
2276 AsmWriterContext &) {
2277 Out <<
"!DIEnumerator(";
2279 Printer.printString(
"name",
N->getName(),
false);
2280 Printer.printAPInt(
"value",
N->getValue(),
N->isUnsigned(),
2282 if (
N->isUnsigned())
2283 Printer.printBool(
"isUnsigned",
true);
2288 AsmWriterContext &WriterCtx) {
2289 Out <<
"!DIBasicType(";
2290 MDFieldPrinter
Printer(Out, WriterCtx);
2291 if (
N->getTag() != dwarf::DW_TAG_base_type)
2293 Printer.printString(
"name",
N->getName());
2294 Printer.printMetadata(
"scope",
N->getRawScope());
2295 Printer.printMetadata(
"file",
N->getRawFile());
2296 Printer.printInt(
"line",
N->getLine());
2297 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2298 Printer.printInt(
"align",
N->getAlignInBits());
2299 Printer.printInt(
"dataSize",
N->getDataSizeInBits());
2300 Printer.printDwarfEnum(
"encoding",
N->getEncoding(),
2302 Printer.printInt(
"num_extra_inhabitants",
N->getNumExtraInhabitants());
2303 Printer.printDIFlags(
"flags",
N->getFlags());
2308 AsmWriterContext &WriterCtx) {
2309 Out <<
"!DIFixedPointType(";
2310 MDFieldPrinter
Printer(Out, WriterCtx);
2311 if (
N->getTag() != dwarf::DW_TAG_base_type)
2313 Printer.printString(
"name",
N->getName());
2314 Printer.printMetadata(
"scope",
N->getRawScope());
2315 Printer.printMetadata(
"file",
N->getRawFile());
2316 Printer.printInt(
"line",
N->getLine());
2317 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2318 Printer.printInt(
"align",
N->getAlignInBits());
2319 Printer.printDwarfEnum(
"encoding",
N->getEncoding(),
2321 Printer.printDIFlags(
"flags",
N->getFlags());
2322 Printer.printFixedPointKind(
"kind",
N->getKind());
2323 if (
N->isRational()) {
2324 bool IsUnsigned = !
N->isSigned();
2325 Printer.printAPInt(
"numerator",
N->getNumerator(), IsUnsigned,
false);
2326 Printer.printAPInt(
"denominator",
N->getDenominator(), IsUnsigned,
false);
2328 Printer.printInt(
"factor",
N->getFactor());
2334 AsmWriterContext &WriterCtx) {
2335 Out <<
"!DIStringType(";
2336 MDFieldPrinter
Printer(Out, WriterCtx);
2337 if (
N->getTag() != dwarf::DW_TAG_string_type)
2339 Printer.printString(
"name",
N->getName());
2340 Printer.printMetadata(
"stringLength",
N->getRawStringLength());
2341 Printer.printMetadata(
"stringLengthExpression",
N->getRawStringLengthExp());
2342 Printer.printMetadata(
"stringLocationExpression",
2343 N->getRawStringLocationExp());
2344 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2345 Printer.printInt(
"align",
N->getAlignInBits());
2346 Printer.printDwarfEnum(
"encoding",
N->getEncoding(),
2348 Printer.printMetadata(
"charType",
N->getRawCharType());
2353 AsmWriterContext &WriterCtx) {
2354 Out <<
"!DIDerivedType(";
2355 MDFieldPrinter
Printer(Out, WriterCtx);
2357 Printer.printString(
"name",
N->getName());
2358 Printer.printMetadata(
"scope",
N->getRawScope());
2359 Printer.printMetadata(
"file",
N->getRawFile());
2360 Printer.printInt(
"line",
N->getLine());
2361 Printer.printMetadata(
"baseType",
N->getRawBaseType(),
2363 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2364 Printer.printInt(
"align",
N->getAlignInBits());
2365 Printer.printMetadataOrInt(
"offset",
N->getRawOffsetInBits(),
true);
2366 Printer.printDIFlags(
"flags",
N->getFlags());
2367 Printer.printMetadata(
"extraData",
N->getRawExtraData());
2368 if (
const auto &DWARFAddressSpace =
N->getDWARFAddressSpace())
2369 Printer.printInt(
"dwarfAddressSpace", *DWARFAddressSpace,
2371 Printer.printMetadata(
"annotations",
N->getRawAnnotations());
2372 if (
auto PtrAuthData =
N->getPtrAuthData()) {
2373 Printer.printInt(
"ptrAuthKey", PtrAuthData->key());
2374 Printer.printBool(
"ptrAuthIsAddressDiscriminated",
2375 PtrAuthData->isAddressDiscriminated());
2376 Printer.printInt(
"ptrAuthExtraDiscriminator",
2377 PtrAuthData->extraDiscriminator());
2378 Printer.printBool(
"ptrAuthIsaPointer", PtrAuthData->isaPointer());
2379 Printer.printBool(
"ptrAuthAuthenticatesNullValues",
2380 PtrAuthData->authenticatesNullValues());
2386 AsmWriterContext &WriterCtx) {
2387 Out <<
"!DISubrangeType(";
2388 MDFieldPrinter
Printer(Out, WriterCtx);
2389 Printer.printString(
"name",
N->getName());
2390 Printer.printMetadata(
"scope",
N->getRawScope());
2391 Printer.printMetadata(
"file",
N->getRawFile());
2392 Printer.printInt(
"line",
N->getLine());
2393 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2394 Printer.printInt(
"align",
N->getAlignInBits());
2395 Printer.printDIFlags(
"flags",
N->getFlags());
2396 Printer.printMetadata(
"baseType",
N->getRawBaseType(),
2398 Printer.printMetadata(
"lowerBound",
N->getRawLowerBound());
2399 Printer.printMetadata(
"upperBound",
N->getRawUpperBound());
2400 Printer.printMetadata(
"stride",
N->getRawStride());
2401 Printer.printMetadata(
"bias",
N->getRawBias());
2406 AsmWriterContext &WriterCtx) {
2407 Out <<
"!DICompositeType(";
2408 MDFieldPrinter
Printer(Out, WriterCtx);
2410 Printer.printString(
"name",
N->getName());
2411 Printer.printMetadata(
"scope",
N->getRawScope());
2412 Printer.printMetadata(
"file",
N->getRawFile());
2413 Printer.printInt(
"line",
N->getLine());
2414 Printer.printMetadata(
"baseType",
N->getRawBaseType());
2415 Printer.printMetadataOrInt(
"size",
N->getRawSizeInBits(),
true);
2416 Printer.printInt(
"align",
N->getAlignInBits());
2417 Printer.printMetadataOrInt(
"offset",
N->getRawOffsetInBits(),
true);
2418 Printer.printInt(
"num_extra_inhabitants",
N->getNumExtraInhabitants());
2419 Printer.printDIFlags(
"flags",
N->getFlags());
2420 Printer.printMetadata(
"elements",
N->getRawElements());
2421 Printer.printDwarfEnum(
"runtimeLang",
N->getRuntimeLang(),
2423 Printer.printMetadata(
"vtableHolder",
N->getRawVTableHolder());
2424 Printer.printMetadata(
"templateParams",
N->getRawTemplateParams());
2425 Printer.printString(
"identifier",
N->getIdentifier());
2426 Printer.printMetadata(
"discriminator",
N->getRawDiscriminator());
2427 Printer.printMetadata(
"dataLocation",
N->getRawDataLocation());
2428 Printer.printMetadata(
"associated",
N->getRawAssociated());
2429 Printer.printMetadata(
"allocated",
N->getRawAllocated());
2430 if (
auto *RankConst =
N->getRankConst())
2431 Printer.printInt(
"rank", RankConst->getSExtValue(),
2434 Printer.printMetadata(
"rank",
N->getRawRank(),
true);
2435 Printer.printMetadata(
"annotations",
N->getRawAnnotations());
2436 if (
auto *Specification =
N->getRawSpecification())
2437 Printer.printMetadata(
"specification", Specification);
2439 if (
auto EnumKind =
N->getEnumKind())
2443 Printer.printMetadata(
"bitStride",
N->getRawBitStride());
2448 AsmWriterContext &WriterCtx) {
2449 Out <<
"!DISubroutineType(";
2450 MDFieldPrinter
Printer(Out, WriterCtx);
2451 Printer.printDIFlags(
"flags",
N->getFlags());
2453 Printer.printMetadata(
"types",
N->getRawTypeArray(),
2461 Printer.printString(
"filename",
N->getFilename(),
2463 Printer.printString(
"directory",
N->getDirectory(),
2466 if (
N->getChecksum())
2467 Printer.printChecksum(*
N->getChecksum());
2469 Printer.printString(
"source", *
N->getSource(),
2475 AsmWriterContext &WriterCtx) {
2476 Out <<
"!DICompileUnit(";
2477 MDFieldPrinter
Printer(Out, WriterCtx);
2483 "sourceLanguageName",
2495 Printer.printMetadata(
"file",
N->getRawFile(),
false);
2496 Printer.printString(
"producer",
N->getProducer());
2497 Printer.printBool(
"isOptimized",
N->isOptimized());
2498 Printer.printString(
"flags",
N->getFlags());
2499 Printer.printInt(
"runtimeVersion",
N->getRuntimeVersion(),
2501 Printer.printString(
"splitDebugFilename",
N->getSplitDebugFilename());
2502 Printer.printEmissionKind(
"emissionKind",
N->getEmissionKind());
2503 Printer.printMetadata(
"enums",
N->getRawEnumTypes());
2504 Printer.printMetadata(
"retainedTypes",
N->getRawRetainedTypes());
2505 Printer.printMetadata(
"globals",
N->getRawGlobalVariables());
2506 Printer.printMetadata(
"imports",
N->getRawImportedEntities());
2507 Printer.printMetadata(
"macros",
N->getRawMacros());
2508 Printer.printInt(
"dwoId",
N->getDWOId());
2509 Printer.printBool(
"splitDebugInlining",
N->getSplitDebugInlining(),
true);
2510 Printer.printBool(
"debugInfoForProfiling",
N->getDebugInfoForProfiling(),
2512 Printer.printNameTableKind(
"nameTableKind",
N->getNameTableKind());
2513 Printer.printBool(
"rangesBaseAddress",
N->getRangesBaseAddress(),
false);
2514 Printer.printString(
"sysroot",
N->getSysRoot());
2515 Printer.printString(
"sdk",
N->getSDK());
2522 AsmWriterContext &WriterCtx) {
2523 Out <<
"!DISubprogram(";
2524 MDFieldPrinter
Printer(Out, WriterCtx);
2525 Printer.printString(
"name",
N->getName());
2526 Printer.printString(
"linkageName",
N->getLinkageName());
2527 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2528 Printer.printMetadata(
"file",
N->getRawFile());
2529 Printer.printInt(
"line",
N->getLine());
2530 Printer.printMetadata(
"type",
N->getRawType());
2531 Printer.printInt(
"scopeLine",
N->getScopeLine());
2532 Printer.printMetadata(
"containingType",
N->getRawContainingType());
2533 if (
N->getVirtuality() != dwarf::DW_VIRTUALITY_none ||
2534 N->getVirtualIndex() != 0)
2535 Printer.printInt(
"virtualIndex",
N->getVirtualIndex(),
false);
2536 Printer.printInt(
"thisAdjustment",
N->getThisAdjustment());
2537 Printer.printDIFlags(
"flags",
N->getFlags());
2538 Printer.printDISPFlags(
"spFlags",
N->getSPFlags());
2539 Printer.printMetadata(
"unit",
N->getRawUnit());
2540 Printer.printMetadata(
"templateParams",
N->getRawTemplateParams());
2541 Printer.printMetadata(
"declaration",
N->getRawDeclaration());
2542 Printer.printMetadata(
"retainedNodes",
N->getRawRetainedNodes());
2543 Printer.printMetadata(
"thrownTypes",
N->getRawThrownTypes());
2544 Printer.printMetadata(
"annotations",
N->getRawAnnotations());
2545 Printer.printString(
"targetFuncName",
N->getTargetFuncName());
2546 Printer.printBool(
"keyInstructions",
N->getKeyInstructionsEnabled(),
false);
2551 AsmWriterContext &WriterCtx) {
2552 Out <<
"!DILexicalBlock(";
2553 MDFieldPrinter
Printer(Out, WriterCtx);
2554 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2555 Printer.printMetadata(
"file",
N->getRawFile());
2556 Printer.printInt(
"line",
N->getLine());
2557 Printer.printInt(
"column",
N->getColumn());
2563 AsmWriterContext &WriterCtx) {
2564 Out <<
"!DILexicalBlockFile(";
2565 MDFieldPrinter
Printer(Out, WriterCtx);
2566 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2567 Printer.printMetadata(
"file",
N->getRawFile());
2568 Printer.printInt(
"discriminator",
N->getDiscriminator(),
2574 AsmWriterContext &WriterCtx) {
2575 Out <<
"!DINamespace(";
2576 MDFieldPrinter
Printer(Out, WriterCtx);
2577 Printer.printString(
"name",
N->getName());
2578 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2579 Printer.printBool(
"exportSymbols",
N->getExportSymbols(),
false);
2584 AsmWriterContext &WriterCtx) {
2585 Out <<
"!DICommonBlock(";
2586 MDFieldPrinter
Printer(Out, WriterCtx);
2587 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2588 Printer.printMetadata(
"declaration",
N->getRawDecl(),
false);
2589 Printer.printString(
"name",
N->getName());
2590 Printer.printMetadata(
"file",
N->getRawFile());
2591 Printer.printInt(
"line",
N->getLineNo());
2596 AsmWriterContext &WriterCtx) {
2598 MDFieldPrinter
Printer(Out, WriterCtx);
2600 Printer.printInt(
"line",
N->getLine());
2601 Printer.printString(
"name",
N->getName());
2602 Printer.printString(
"value",
N->getValue());
2607 AsmWriterContext &WriterCtx) {
2608 Out <<
"!DIMacroFile(";
2609 MDFieldPrinter
Printer(Out, WriterCtx);
2610 Printer.printInt(
"line",
N->getLine());
2611 Printer.printMetadata(
"file",
N->getRawFile(),
false);
2612 Printer.printMetadata(
"nodes",
N->getRawElements());
2617 AsmWriterContext &WriterCtx) {
2618 Out <<
"!DIModule(";
2619 MDFieldPrinter
Printer(Out, WriterCtx);
2620 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2621 Printer.printString(
"name",
N->getName());
2622 Printer.printString(
"configMacros",
N->getConfigurationMacros());
2623 Printer.printString(
"includePath",
N->getIncludePath());
2624 Printer.printString(
"apinotes",
N->getAPINotesFile());
2625 Printer.printMetadata(
"file",
N->getRawFile());
2626 Printer.printInt(
"line",
N->getLineNo());
2627 Printer.printBool(
"isDecl",
N->getIsDecl(),
false);
2633 AsmWriterContext &WriterCtx) {
2634 Out <<
"!DITemplateTypeParameter(";
2635 MDFieldPrinter
Printer(Out, WriterCtx);
2636 Printer.printString(
"name",
N->getName());
2637 Printer.printMetadata(
"type",
N->getRawType(),
false);
2638 Printer.printBool(
"defaulted",
N->isDefault(),
false);
2644 AsmWriterContext &WriterCtx) {
2645 Out <<
"!DITemplateValueParameter(";
2646 MDFieldPrinter
Printer(Out, WriterCtx);
2647 if (
N->getTag() != dwarf::DW_TAG_template_value_parameter)
2649 Printer.printString(
"name",
N->getName());
2650 Printer.printMetadata(
"type",
N->getRawType());
2651 Printer.printBool(
"defaulted",
N->isDefault(),
false);
2652 Printer.printMetadata(
"value",
N->getValue(),
false);
2657 AsmWriterContext &WriterCtx) {
2658 Out <<
"!DIGlobalVariable(";
2659 MDFieldPrinter
Printer(Out, WriterCtx);
2660 Printer.printString(
"name",
N->getName());
2661 Printer.printString(
"linkageName",
N->getLinkageName());
2662 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2663 Printer.printMetadata(
"file",
N->getRawFile());
2664 Printer.printInt(
"line",
N->getLine());
2665 Printer.printMetadata(
"type",
N->getRawType());
2666 Printer.printBool(
"isLocal",
N->isLocalToUnit());
2667 Printer.printBool(
"isDefinition",
N->isDefinition());
2668 Printer.printMetadata(
"declaration",
N->getRawStaticDataMemberDeclaration());
2669 Printer.printMetadata(
"templateParams",
N->getRawTemplateParams());
2670 Printer.printInt(
"align",
N->getAlignInBits());
2671 Printer.printMetadata(
"annotations",
N->getRawAnnotations());
2676 AsmWriterContext &WriterCtx) {
2677 Out <<
"!DILocalVariable(";
2678 MDFieldPrinter
Printer(Out, WriterCtx);
2679 Printer.printString(
"name",
N->getName());
2680 Printer.printInt(
"arg",
N->getArg());
2681 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2682 Printer.printMetadata(
"file",
N->getRawFile());
2683 Printer.printInt(
"line",
N->getLine());
2684 Printer.printMetadata(
"type",
N->getRawType());
2685 Printer.printDIFlags(
"flags",
N->getFlags());
2686 Printer.printInt(
"align",
N->getAlignInBits());
2687 Printer.printMetadata(
"annotations",
N->getRawAnnotations());
2692 AsmWriterContext &WriterCtx) {
2694 MDFieldPrinter
Printer(Out, WriterCtx);
2695 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2696 Printer.printString(
"name",
N->getName());
2697 Printer.printMetadata(
"file",
N->getRawFile());
2698 Printer.printInt(
"line",
N->getLine(),
false);
2699 Printer.printInt(
"column",
N->getColumn());
2700 Printer.printBool(
"isArtificial",
N->isArtificial(),
false);
2701 if (
N->getCoroSuspendIdx())
2702 Printer.printInt(
"coroSuspendIdx", *
N->getCoroSuspendIdx(),
2708 AsmWriterContext &WriterCtx) {
2709 Out <<
"!DIExpression(";
2714 assert(!OpStr.empty() &&
"Expected valid opcode");
2718 Out << FS << Convert.getBitSize();
2721 for (
unsigned A = 0, AE =
Op.getNumArgs();
A != AE; ++
A)
2722 Out << FS <<
Op.getArg(
A);
2726 for (
const auto &
I :
N->getElements())
2733 AsmWriterContext &WriterCtx,
2734 bool FromValue =
false) {
2736 "Unexpected DIArgList metadata outside of value argument");
2737 Out <<
"!DIArgList(";
2739 MDFieldPrinter
Printer(Out, WriterCtx);
2740 for (
const Metadata *Arg :
N->getArgs()) {
2749 AsmWriterContext &WriterCtx) {
2750 Out <<
"!DIGlobalVariableExpression(";
2751 MDFieldPrinter
Printer(Out, WriterCtx);
2752 Printer.printMetadata(
"var",
N->getVariable());
2753 Printer.printMetadata(
"expr",
N->getExpression());
2758 AsmWriterContext &WriterCtx) {
2759 Out <<
"!DIObjCProperty(";
2760 MDFieldPrinter
Printer(Out, WriterCtx);
2761 Printer.printString(
"name",
N->getName());
2762 Printer.printMetadata(
"file",
N->getRawFile());
2763 Printer.printInt(
"line",
N->getLine());
2764 Printer.printString(
"setter",
N->getSetterName());
2765 Printer.printString(
"getter",
N->getGetterName());
2766 Printer.printInt(
"attributes",
N->getAttributes());
2767 Printer.printMetadata(
"type",
N->getRawType());
2772 AsmWriterContext &WriterCtx) {
2773 Out <<
"!DIProperty(";
2774 MDFieldPrinter
Printer(Out, WriterCtx);
2775 Printer.printString(
"name",
N->getName());
2776 Printer.printMetadata(
"file",
N->getRawFile());
2777 Printer.printInt(
"line",
N->getLine());
2778 Printer.printMetadata(
"type",
N->getRawType());
2779 Printer.printMetadata(
"backing_storage",
N->getRawBackingStorage());
2784 AsmWriterContext &WriterCtx) {
2785 Out <<
"!DIImportedEntity(";
2786 MDFieldPrinter
Printer(Out, WriterCtx);
2788 Printer.printString(
"name",
N->getName());
2789 Printer.printMetadata(
"scope",
N->getRawScope(),
false);
2790 Printer.printMetadata(
"entity",
N->getRawEntity());
2791 Printer.printMetadata(
"file",
N->getRawFile());
2792 Printer.printInt(
"line",
N->getLine());
2793 Printer.printMetadata(
"elements",
N->getRawElements());
2798 AsmWriterContext &Ctx) {
2799 if (
Node->isDistinct())
2801 else if (
Node->isTemporary())
2802 Out <<
"<temporary!> ";
2804 switch (
Node->getMetadataID()) {
2807#define HANDLE_MDNODE_LEAF(CLASS) \
2808 case Metadata::CLASS##Kind: \
2809 write##CLASS(Out, cast<CLASS>(Node), Ctx); \
2811#include "llvm/IR/Metadata.def"
2818 AsmWriterContext &WriterCtx,
2821 WriterCtx.TypePrinter->print(
V->getType(), Out);
2832 assert(WriterCtx.TypePrinter &&
"Constants require TypePrinting!");
2839 if (IA->hasSideEffects())
2840 Out <<
"sideeffect ";
2841 if (IA->isAlignStack())
2842 Out <<
"alignstack ";
2845 Out <<
"inteldialect ";
2864 auto *
Machine = WriterCtx.Machine;
2868 Slot =
Machine->getGlobalSlot(GV);
2885 Slot =
Machine->getGlobalSlot(GV);
2897 Out << Prefix << Slot;
2903 AsmWriterContext &WriterCtx,
2918 Loc && WriterCtx.MST &&
2924 std::unique_ptr<SlotTracker> MachineStorage;
2926 if (!WriterCtx.Machine) {
2927 MachineStorage = std::make_unique<SlotTracker>(WriterCtx.Context);
2928 WriterCtx.Machine = MachineStorage.get();
2938 Out <<
"<" <<
N <<
">";
2952 assert(WriterCtx.TypePrinter &&
"TypePrinter required for metadata values");
2954 "Unexpected function-local metadata outside of value argument");
2961class AssemblyWriter {
2962 const IROptions &Opts;
2963 formatted_raw_ostream &
Out;
2964 const Module *TheModule =
nullptr;
2965 const ModuleSummaryIndex *TheIndex =
nullptr;
2966 std::unique_ptr<SlotTracker> SlotTrackerStorage;
2968 TypePrinting TypePrinter;
2969 AssemblyAnnotationWriter *AnnotationWriter =
nullptr;
2971 bool ShouldPreserveUseListOrder;
2976 DenseMap<const GlobalValueSummary *, GlobalValue::GUID> SummaryToGUIDMap;
2980 AssemblyWriter(
const IROptions &Opts, formatted_raw_ostream &o,
2981 SlotTracker &Mac,
const Module *M,
2982 AssemblyAnnotationWriter *AAW,
bool IsForDebug,
2983 bool ShouldPreserveUseListOrder =
false);
2985 AssemblyWriter(formatted_raw_ostream &o, SlotTracker &Mac,
2986 const ModuleSummaryIndex *Index,
bool IsForDebug);
2989 return AsmWriterContext(&TypePrinter, &
Machine, TheModule);
2992 void printMDNodeBody(
const MDNode *MD);
2993 void printNamedMDNode(
const NamedMDNode *NMD);
2995 void printModule(
const Module *M);
2997 void writeOperand(
const Value *
Op,
bool PrintType);
2998 void writeParamOperand(
const Value *Operand, AttributeSet Attrs);
2999 void writeOperandBundles(
const CallBase *
Call);
3000 void writeSyncScope(
const LLVMContext &
Context,
3002 void writeAtomic(
const LLVMContext &
Context,
3005 void writeAtomicCmpXchg(
const LLVMContext &
Context,
3010 void writeAllMDNodes();
3011 void writeMDNode(
unsigned Slot,
const MDNode *Node);
3012 void writeAttribute(
const Attribute &Attr,
bool InAttrGroup =
false);
3013 void writeAttributeSet(
const AttributeSet &AttrSet,
bool InAttrGroup =
false);
3014 void writeAllAttributeGroups();
3016 void printTypeIdentities();
3017 void printGlobal(
const GlobalVariable *GV);
3018 void printAlias(
const GlobalAlias *GA);
3019 void printIFunc(
const GlobalIFunc *GI);
3020 void printComdat(
const Comdat *
C);
3022 void printArgument(
const Argument *FA, AttributeSet Attrs);
3024 void printInstructionLine(
const Instruction &
I);
3025 void printInstruction(
const Instruction &
I);
3026 void printDbgMarker(
const DbgMarker &DPI);
3027 void printDbgVariableRecord(
const DbgVariableRecord &DVR);
3028 void printDbgLabelRecord(
const DbgLabelRecord &DLR);
3029 void printDbgRecord(
const DbgRecord &DR);
3030 void printDbgRecordLine(
const DbgRecord &DR);
3032 void printUseListOrder(
const Value *
V, ArrayRef<unsigned> Shuffle);
3035 void printModuleSummaryIndex();
3036 void printSummaryInfo(
unsigned Slot,
const ValueInfo &VI);
3037 void printSummary(
const GlobalValueSummary &Summary);
3038 void printAliasSummary(
const AliasSummary *AS);
3039 void printGlobalVarSummary(
const GlobalVarSummary *GS);
3040 void printFunctionSummary(
const FunctionSummary *FS);
3041 void printTypeIdSummary(
const TypeIdSummary &TIS);
3043 void printTypeTestResolution(
const TypeTestResolution &TTRes);
3044 void printArgs(ArrayRef<uint64_t> Args);
3045 void printWPDRes(
const WholeProgramDevirtResolution &WPDRes);
3046 void printTypeIdInfo(
const FunctionSummary::TypeIdInfo &TIDInfo);
3047 void printVFuncId(
const FunctionSummary::VFuncId VFId);
3055 void printMetadataAttachments(
3056 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
3057 StringRef Separator);
3061 void printInfoComment(
const Value &
V,
bool isMaterializable =
false);
3065 void printGCRelocateComment(
const GCRelocateInst &Relocate);
3081 bool ShouldPreserveUseListOrder)
3082 : Opts(Opts),
Out(
o), TheModule(
M),
Machine(Mac), TypePrinter(
M),
3083 AnnotationWriter(AAW), IsForDebug(IsForDebug),
3084 ShouldPreserveUseListOrder(
3085 valueOr(Opts.preserve_ll_uselistorder, ShouldPreserveUseListOrder)) {}
3090 TypePrinter(nullptr), IsForDebug(IsForDebug),
3091 ShouldPreserveUseListOrder(
false) {}
3093void AssemblyWriter::writeOperand(
const Value *Operand,
bool PrintType) {
3095 Out <<
"<null operand!>";
3102void AssemblyWriter::writeSyncScope(
const LLVMContext &
Context,
3110 Context.getSyncScopeNames(SSNs);
3112 Out <<
" syncscope(\"";
3120void AssemblyWriter::writeAtomic(
const LLVMContext &
Context,
3123 if (Ordering == AtomicOrdering::NotAtomic)
3126 writeSyncScope(
Context, SSID);
3130void AssemblyWriter::writeAtomicCmpXchg(
const LLVMContext &
Context,
3134 assert(SuccessOrdering != AtomicOrdering::NotAtomic &&
3135 FailureOrdering != AtomicOrdering::NotAtomic);
3137 writeSyncScope(
Context, SSID);
3142void AssemblyWriter::writeParamOperand(
const Value *Operand,
3143 AttributeSet Attrs) {
3145 Out <<
"<null operand!>";
3150 TypePrinter.print(Operand->
getType(), Out);
3152 if (
Attrs.hasAttributes()) {
3154 writeAttributeSet(Attrs);
3162void AssemblyWriter::writeOperandBundles(
const CallBase *
Call) {
3178 ListSeparator InnerLS;
3180 for (
const auto &Input : BU.
Inputs) {
3182 if (Input ==
nullptr)
3183 Out <<
"<null operand bundle!>";
3194void AssemblyWriter::printModule(
const Module *M) {
3197 if (ShouldPreserveUseListOrder)
3200 if (!
M->getModuleIdentifier().empty() &&
3203 M->getModuleIdentifier().find(
'\n') == std::string::npos)
3204 Out <<
"; ModuleID = '" <<
M->getModuleIdentifier() <<
"'\n";
3206 if (!
M->getSourceFileName().empty()) {
3207 Out <<
"source_filename = \"";
3212 const std::string &
DL =
M->getDataLayoutStr();
3214 Out <<
"target datalayout = \"" <<
DL <<
"\"\n";
3215 if (!
M->getTargetTriple().empty())
3216 Out <<
"target triple = \"" <<
M->getTargetTriple().str() <<
"\"\n";
3218 if (
M->hasModuleInlineAsm()) {
3221 for (
const Module::GlobalAsmFragment &Frag :
M->getModuleInlineAsm()) {
3222 Out <<
"module asm";
3224 Frag.Props.getAsStrings();
3225 if (!Props.
empty()) {
3230 Out <<
Key <<
": \"";
3238 StringRef
Asm = Frag.Asm;
3241 std::tie(Front, Asm) =
Asm.split(
'\n');
3248 }
while (!
Asm.empty());
3252 printTypeIdentities();
3256 SmallPtrSet<const Comdat *, 8> PrintedComdats;
3257 for (
const GlobalObject &GO :
M->global_objects()) {
3259 if (!
C || !PrintedComdats.
insert(
C).second)
3267 if (!
M->global_empty()) Out <<
'\n';
3268 for (
const GlobalVariable &GV :
M->globals()) {
3269 printGlobal(&GV); Out <<
'\n';
3273 if (!
M->alias_empty()) Out <<
"\n";
3274 for (
const GlobalAlias &GA :
M->aliases())
3278 if (!
M->ifunc_empty()) Out <<
"\n";
3279 for (
const GlobalIFunc &GI :
M->ifuncs())
3289 printUseLists(
nullptr);
3294 writeAllAttributeGroups();
3298 if (!
M->named_metadata_empty()) Out <<
'\n';
3300 for (
const NamedMDNode &Node :
M->named_metadata())
3301 printNamedMDNode(&Node);
3310void AssemblyWriter::printModuleSummaryIndex() {
3312 int NumSlots =
Machine.initializeIndexIfNeeded();
3318 std::vector<std::pair<std::string, ModuleHash>> moduleVec;
3319 std::string RegularLTOModuleName =
3322 for (
auto &[ModPath, ModHash] : TheIndex->
modulePaths())
3323 moduleVec[
Machine.getModulePathSlot(ModPath)] = std::make_pair(
3326 ModPath.empty() ? RegularLTOModuleName : std::string(ModPath), ModHash);
3329 for (
auto &ModPair : moduleVec) {
3330 Out <<
"^" << i++ <<
" = module: (";
3333 Out <<
"\", hash: (";
3335 for (
auto Hash : ModPair.second)
3345 for (
const auto &GlobalList : SortedGVS) {
3346 auto GUID = GlobalList.first;
3347 for (
auto &Summary : GlobalList.second.getSummaryList())
3352 for (
const auto &GlobalList : SortedGVS) {
3353 auto GUID = GlobalList.first;
3355 printSummaryInfo(
Machine.getGUIDSlot(GUID), VI);
3359 for (
const auto &TID : TheIndex->
typeIds()) {
3360 Out <<
"^" <<
Machine.getTypeIdSlot(TID.second.first)
3361 <<
" = typeid: (name: \"";
3364 printTypeIdSummary(TID.second.second);
3365 Out <<
") ; guid = " << TID.first <<
"\n";
3371 Out <<
"^" <<
Machine.getTypeIdCompatibleVtableSlot(TId.first)
3372 <<
" = typeidCompatibleVTable: (name: \"";
3375 printTypeIdCompatibleVtableSummary(TId.second);
3376 Out <<
") ; guid = " <<
GUID <<
"\n";
3381 auto PrintCfiFunctions = [&](
const CfiFunctionIndex &CfiIndex,
3382 StringRef EntryName) {
3383 if (CfiIndex.
empty())
3385 Out <<
"^" << NumSlots++ <<
" = " << EntryName <<
": (";
3388 Out <<
FS <<
"(guid: " <<
GUID <<
", name: \"";
3399 Out <<
"^" << NumSlots <<
" = flags: " << TheIndex->
getFlags() <<
"\n";
3403 Out <<
"^" << NumSlots <<
" = blockcount: " << TheIndex->
getBlockCount()
3413 return "singleImpl";
3415 return "branchFunnel";
3426 return "uniformRetVal";
3428 return "uniqueRetVal";
3430 return "virtualConstProp";
3453void AssemblyWriter::printTypeTestResolution(
const TypeTestResolution &TTRes) {
3460 Out <<
", alignLog2: " << TTRes.
AlignLog2;
3462 Out <<
", sizeM1: " << TTRes.
SizeM1;
3465 Out <<
", bitMask: " << (unsigned)TTRes.
BitMask;
3472void AssemblyWriter::printTypeIdSummary(
const TypeIdSummary &TIS) {
3473 Out <<
", summary: (";
3474 printTypeTestResolution(TIS.
TTRes);
3475 if (!TIS.
WPDRes.empty()) {
3476 Out <<
", wpdResolutions: (";
3478 for (
auto &WPDRes : TIS.
WPDRes) {
3480 Out <<
"(offset: " << WPDRes.first <<
", ";
3481 printWPDRes(WPDRes.second);
3489void AssemblyWriter::printTypeIdCompatibleVtableSummary(
3491 Out <<
", summary: (";
3493 for (
auto &
P : TI) {
3495 Out <<
"(offset: " <<
P.AddressPointOffset <<
", ";
3496 Out <<
"^" <<
Machine.getGUIDSlot(
P.VTableVI.getGUID());
3502void AssemblyWriter::printArgs(ArrayRef<uint64_t> Args) {
3506void AssemblyWriter::printWPDRes(
const WholeProgramDevirtResolution &WPDRes) {
3507 Out <<
"wpdRes: (kind: ";
3511 Out <<
", singleImplName: \"";
3517 Out <<
", resByArg: (";
3519 for (
auto &ResByArg : WPDRes.
ResByArg) {
3521 printArgs(ResByArg.first);
3522 Out <<
", byArg: (kind: ";
3524 if (ResByArg.second.TheKind ==
3526 ResByArg.second.TheKind ==
3528 Out <<
", info: " << ResByArg.second.Info;
3532 if (ResByArg.second.Byte || ResByArg.second.Bit)
3533 Out <<
", byte: " << ResByArg.second.Byte
3534 <<
", bit: " << ResByArg.second.Bit;
3555void AssemblyWriter::printAliasSummary(
const AliasSummary *AS) {
3556 Out <<
", aliasee: ";
3566void AssemblyWriter::printGlobalVarSummary(
const GlobalVarSummary *GS) {
3567 auto VTableFuncs =
GS->vTableFuncs();
3568 Out <<
", varFlags: (readonly: " <<
GS->VarFlags.MaybeReadOnly <<
", "
3569 <<
"writeonly: " <<
GS->VarFlags.MaybeWriteOnly <<
", "
3570 <<
"constant: " <<
GS->VarFlags.Constant;
3571 if (!VTableFuncs.empty())
3573 <<
"vcall_visibility: " <<
GS->VarFlags.VCallVisibility;
3576 if (!VTableFuncs.empty()) {
3577 Out <<
", vTableFuncs: (";
3579 for (
auto &
P : VTableFuncs) {
3581 Out <<
"(virtFunc: ^" <<
Machine.getGUIDSlot(
P.FuncVI.getGUID())
3582 <<
", offset: " <<
P.VTableOffset;
3600 return "linkonce_odr";
3610 return "extern_weak";
3612 return "available_externally";
3641 return "definition";
3643 return "declaration";
3648void AssemblyWriter::printFunctionSummary(
const FunctionSummary *FS) {
3649 Out <<
", insts: " <<
FS->instCount();
3650 if (
FS->fflags().anyFlagSet())
3651 Out <<
", " <<
FS->fflags();
3653 if (!
FS->calls().empty()) {
3654 Out <<
", calls: (";
3656 for (
auto &
Call :
FS->calls()) {
3658 Out <<
"(callee: ^" <<
Machine.getGUIDSlot(
Call.first.getGUID());
3659 if (
Call.second.getHotness() != CalleeInfo::HotnessType::Unknown)
3663 if (
Call.second.HasTailCall)
3665 if (
Call.second.HasIndirectCall)
3666 Out <<
", indirect: 1";
3672 if (
const auto *TIdInfo =
FS->getTypeIdInfo())
3673 printTypeIdInfo(*TIdInfo);
3677 auto AllocTypeName = [](uint8_t
Type) ->
const char * {
3679 case (uint8_t)AllocationType::None:
3681 case (uint8_t)AllocationType::NotCold:
3683 case (uint8_t)AllocationType::Cold:
3685 case (uint8_t)AllocationType::Hot:
3687 case (uint8_t)AllocationType::NotCold | (uint8_t)AllocationType::Cold:
3694 if (!
FS->allocs().empty()) {
3695 Out <<
", allocs: (";
3697 for (
auto &AI :
FS->allocs()) {
3699 Out <<
"(versions: (";
3701 for (
auto V : AI.Versions) {
3703 Out << AllocTypeName(
V);
3705 Out <<
"), memProf: (";
3706 ListSeparator MIBFS;
3707 for (
auto &MIB : AI.MIBs) {
3709 Out <<
"(type: " << AllocTypeName((uint8_t)MIB.AllocType);
3710 Out <<
", stackIds: (";
3711 ListSeparator SIDFS;
3712 for (
auto Id : MIB.StackIdIndices) {
3723 if (!
FS->callsites().empty()) {
3724 Out <<
", callsites: (";
3726 for (
auto &CI :
FS->callsites()) {
3729 Out <<
"(callee: ^" <<
Machine.getGUIDSlot(CI.Callee.getGUID());
3731 Out <<
"(callee: null";
3732 Out <<
", clones: (";
3734 for (
auto V : CI.Clones) {
3738 Out <<
"), stackIds: (";
3739 ListSeparator SIDFS;
3740 for (
auto Id : CI.StackIdIndices) {
3749 auto PrintRange = [&](
const ConstantRange &
Range) {
3753 if (!
FS->paramAccesses().empty()) {
3754 Out <<
", params: (";
3756 for (
auto &PS :
FS->paramAccesses()) {
3758 Out <<
"(param: " << PS.ParamNo;
3759 Out <<
", offset: ";
3761 if (!PS.Calls.empty()) {
3762 Out <<
", calls: (";
3764 for (
auto &
Call : PS.Calls) {
3766 Out <<
"(callee: ^" <<
Machine.getGUIDSlot(
Call.Callee.getGUID());
3767 Out <<
", param: " <<
Call.ParamNo;
3768 Out <<
", offset: ";
3769 PrintRange(
Call.Offsets);
3780void AssemblyWriter::printTypeIdInfo(
3781 const FunctionSummary::TypeIdInfo &TIDInfo) {
3782 Out <<
", typeIdInfo: (";
3783 ListSeparator TIDFS;
3786 Out <<
"typeTests: (";
3789 auto TidIter = TheIndex->
typeIds().equal_range(GUID);
3790 if (TidIter.first == TidIter.second) {
3796 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
3798 auto Slot =
Machine.getTypeIdSlot(TypeIdPair.first);
3816 "typeTestAssumeConstVCalls");
3821 "typeCheckedLoadConstVCalls");
3826void AssemblyWriter::printVFuncId(
const FunctionSummary::VFuncId VFId) {
3827 auto TidIter = TheIndex->
typeIds().equal_range(VFId.
GUID);
3828 if (TidIter.first == TidIter.second) {
3829 Out <<
"vFuncId: (";
3830 Out <<
"guid: " << VFId.
GUID;
3831 Out <<
", offset: " << VFId.
Offset;
3837 for (
const auto &[GUID, TypeIdPair] :
make_range(TidIter)) {
3839 Out <<
"vFuncId: (";
3840 auto Slot =
Machine.getTypeIdSlot(TypeIdPair.first);
3843 Out <<
", offset: " << VFId.
Offset;
3848void AssemblyWriter::printNonConstVCalls(
3850 Out <<
Tag <<
": (";
3852 for (
auto &VFuncId : VCallList) {
3854 printVFuncId(VFuncId);
3859void AssemblyWriter::printConstVCalls(
3861 Out <<
Tag <<
": (";
3863 for (
auto &ConstVCall : VCallList) {
3866 printVFuncId(ConstVCall.VFunc);
3867 if (!ConstVCall.Args.empty()) {
3869 printArgs(ConstVCall.Args);
3876void AssemblyWriter::printSummary(
const GlobalValueSummary &Summary) {
3877 GlobalValueSummary::GVFlags GVFlags =
Summary.flags();
3880 Out <<
"(module: ^" <<
Machine.getModulePathSlot(
Summary.modulePath())
3883 Out <<
", visibility: "
3886 Out <<
", live: " << GVFlags.
Live;
3887 Out <<
", dsoLocal: " << GVFlags.
DSOLocal;
3889 Out <<
", importType: "
3901 auto RefList =
Summary.refs();
3902 if (!RefList.empty()) {
3905 for (
auto &
Ref : RefList) {
3907 if (
Ref.isReadOnly())
3909 else if (
Ref.isWriteOnly())
3910 Out <<
"writeonly ";
3911 Out <<
"^" <<
Machine.getGUIDSlot(
Ref.getGUID());
3919void AssemblyWriter::printSummaryInfo(
unsigned Slot,
const ValueInfo &VI) {
3920 Out <<
"^" <<
Slot <<
" = gv: (";
3921 if (
VI.hasName() && !
VI.name().empty()) {
3926 Out <<
"guid: " <<
VI.getGUID();
3928 if (!
VI.getSummaryList().empty()) {
3929 Out <<
", summaries: (";
3931 for (
auto &Summary :
VI.getSummaryList()) {
3933 printSummary(*Summary);
3938 if (
VI.hasName() && !
VI.name().empty())
3939 Out <<
" ; guid = " <<
VI.getGUID();
3946 Out <<
"<empty name> ";
3948 unsigned char FirstC =
static_cast<unsigned char>(Name[0]);
3949 if (isalpha(FirstC) || FirstC ==
'-' || FirstC ==
'$' || FirstC ==
'.' ||
3954 for (
unsigned i = 1, e = Name.size(); i != e; ++i) {
3955 unsigned char C = Name[i];
3956 if (isalnum(
C) ||
C ==
'-' ||
C ==
'$' ||
C ==
'.' ||
C ==
'_')
3964void AssemblyWriter::printNamedMDNode(
const NamedMDNode *NMD) {
3999 Out <<
"dso_local ";
4017 Out <<
"thread_local ";
4020 Out <<
"thread_local(localdynamic) ";
4023 Out <<
"thread_local(initialexec) ";
4026 Out <<
"thread_local(localexec) ";
4036 return "local_unnamed_addr";
4038 return "unnamed_addr";
4061void AssemblyWriter::printGlobal(
const GlobalVariable *GV) {
4063 Out <<
"; Materializable\n";
4084 Out << (GV->
isConstant() ?
"constant " :
"global ");
4093 Out <<
", section \"";
4098 Out <<
", partition \"";
4103 Out <<
", code_model \"";
4128 Out <<
", no_sanitize_address";
4130 Out <<
", no_sanitize_hwaddress";
4132 Out <<
", sanitize_memtag";
4134 Out <<
", sanitize_address_dyninit";
4139 Out <<
", align " <<
A->value();
4143 printMetadataAttachments(MDs,
", ");
4146 if (
Attrs.hasAttributes())
4147 Out <<
" #" <<
Machine.getAttributeGroupSlot(Attrs);
4152void AssemblyWriter::printAlias(
const GlobalAlias *GA) {
4154 Out <<
"; Materializable\n";
4174 if (
const Constant *Aliasee = GA->
getAliasee()) {
4177 TypePrinter.print(GA->
getType(), Out);
4178 Out <<
" <<NULL ALIASEE>>";
4182 Out <<
", partition \"";
4191void AssemblyWriter::printIFunc(
const GlobalIFunc *GI) {
4193 Out <<
"; Materializable\n";
4208 if (
const Constant *Resolver = GI->
getResolver()) {
4211 TypePrinter.print(GI->
getType(), Out);
4212 Out <<
" <<NULL RESOLVER>>";
4216 Out <<
", partition \"";
4223 printMetadataAttachments(MDs,
", ");
4230void AssemblyWriter::printComdat(
const Comdat *
C) {
4234void AssemblyWriter::printTypeIdentities() {
4235 if (TypePrinter.empty())
4241 auto &NumberedTypes = TypePrinter.getNumberedTypes();
4242 for (
unsigned I = 0,
E = NumberedTypes.size();
I !=
E; ++
I) {
4243 Out <<
'%' <<
I <<
" = type ";
4247 TypePrinter.printStructBody(NumberedTypes[
I], Out);
4251 auto &NamedTypes = TypePrinter.getNamedTypes();
4252 for (StructType *NamedType : NamedTypes) {
4258 TypePrinter.printStructBody(NamedType, Out);
4264void AssemblyWriter::printFunction(
const Function *
F) {
4265 if (
F->isMaterializable())
4266 Out <<
"; Materializable\n";
4267 else if (AnnotationWriter)
4270 const AttributeList &
Attrs =
F->getAttributes();
4271 if (
Attrs.hasFnAttrs()) {
4272 AttributeSet AS =
Attrs.getFnAttrs();
4273 std::string AttrStr;
4276 if (!Attr.isStringAttribute()) {
4277 if (!AttrStr.empty()) AttrStr +=
' ';
4278 AttrStr += Attr.getAsString();
4282 if (!AttrStr.empty())
4283 Out <<
"; Function Attrs: " << AttrStr <<
'\n';
4287 Out <<
"; Unknown intrinsic\n";
4291 if (
F->isDeclaration()) {
4294 F->getAllMetadata(MDs);
4295 printMetadataAttachments(MDs,
" ");
4306 if (
F->getCallingConv() != CallingConv::C) {
4311 FunctionType *FT =
F->getFunctionType();
4312 if (
Attrs.hasRetAttrs())
4313 Out <<
Attrs.getAsString(AttributeList::ReturnIndex) <<
' ';
4314 TypePrinter.print(
F->getReturnType(), Out);
4321 if (
F->isDeclaration() && !IsForDebug) {
4324 for (
unsigned I = 0,
E = FT->getNumParams();
I !=
E; ++
I) {
4327 TypePrinter.print(FT->getParamType(
I), Out);
4329 AttributeSet ArgAttrs =
Attrs.getParamAttrs(
I);
4332 writeAttributeSet(ArgAttrs);
4338 for (
const Argument &Arg :
F->args()) {
4340 printArgument(&Arg,
Attrs.getParamAttrs(Arg.getArgNo()));
4345 if (FT->isVarArg()) {
4346 if (FT->getNumParams()) Out <<
", ";
4357 bool ForcePrintAddressSpace =
4358 !
Mod ||
Mod->getDataLayout().getProgramAddressSpace() != 0;
4360 "", ForcePrintAddressSpace);
4361 if (
Attrs.hasFnAttrs())
4362 Out <<
" #" <<
Machine.getAttributeGroupSlot(
Attrs.getFnAttrs());
4363 if (
F->hasSection()) {
4364 Out <<
" section \"";
4368 if (
F->hasPartition()) {
4369 Out <<
" partition \"";
4374 if (MaybeAlign
A =
F->getAlign())
4375 Out <<
" align " <<
A->value();
4376 if (MaybeAlign
A =
F->getPreferredAlignment())
4377 Out <<
" prefalign(" <<
A->value() <<
')';
4379 Out <<
" gc \"" <<
F->getGC() <<
'"';
4380 if (
F->hasPrefixData()) {
4382 writeOperand(
F->getPrefixData(),
true);
4384 if (
F->hasPrologueData()) {
4385 Out <<
" prologue ";
4386 writeOperand(
F->getPrologueData(),
true);
4388 if (
F->hasPersonalityFn()) {
4389 Out <<
" personality ";
4390 writeOperand(
F->getPersonalityFn(),
true);
4393 if (Opts.print_prof_data) {
4394 if (
auto *MDProf =
F->getMetadata(LLVMContext::MD_prof)) {
4396 MDProf->print(Out, TheModule,
true);
4400 if (
F->isDeclaration()) {
4404 F->getAllMetadata(MDs);
4405 printMetadataAttachments(MDs,
" ");
4409 for (
const BasicBlock &BB : *
F)
4423void AssemblyWriter::printArgument(
const Argument *Arg, AttributeSet Attrs) {
4425 TypePrinter.print(Arg->
getType(), Out);
4428 if (
Attrs.hasAttributes()) {
4430 writeAttributeSet(Attrs);
4439 assert(Slot != -1 &&
"expect argument in function here");
4440 Out <<
" %" <<
Slot;
4451 }
else if (!IsEntryBlock) {
4453 int Slot =
Machine.getLocalSlot(BB);
4460 if (!IsEntryBlock) {
4465 Out <<
" No predecessors!";
4471 writeOperand(Pred,
false);
4482 for (
const DbgRecord &DR :
I.getDbgRecordRange())
4483 printDbgRecordLine(DR);
4484 printInstructionLine(
I);
4491void AssemblyWriter::printInstructionLine(
const Instruction &
I) {
4492 printInstruction(
I);
4498void AssemblyWriter::printGCRelocateComment(
const GCRelocateInst &Relocate) {
4501 writeOperand(BasePtr,
false);
4506 writeOperand(DerivedPtr,
false);
4514void AssemblyWriter::printInfoComment(
const Value &
V,
bool isMaterializable) {
4516 printGCRelocateComment(*Relocate);
4518 if (AnnotationWriter && !isMaterializable)
4521 if (Opts.print_inst_debug_locs) {
4523 if (
I->getDebugLoc()) {
4525 I->getDebugLoc().print(Out);
4529 if (Opts.print_prof_data) {
4531 if (
auto *MD =
I->getMetadata(LLVMContext::MD_prof)) {
4533 MD->print(Out, TheModule,
true);
4538 if (Opts.print_inst_addrs)
4544 if (Operand ==
nullptr) {
4545 Out <<
" <cannot get addrspace!>";
4555 bool ForcePrintAddrSpace =
4556 !
Mod ||
Mod->getDataLayout().getProgramAddressSpace() != 0;
4558 ForcePrintAddrSpace);
4562void AssemblyWriter::printInstruction(
const Instruction &
I) {
4572 }
else if (!
I.getType()->isVoidTy()) {
4574 int SlotNum =
Machine.getLocalSlot(&
I);
4576 Out <<
"<badref> = ";
4578 Out <<
'%' << SlotNum <<
" = ";
4582 if (CI->isMustTailCall())
4584 else if (CI->isTailCall())
4586 else if (CI->isNoTailCall())
4591 Out <<
I.getOpcodeName();
4611 Out <<
" elementwise";
4618 Out <<
' ' << CI->getPredicate();
4622 if (RMWI->isElementwise())
4623 Out <<
" elementwise";
4628 const Value *Operand =
I.getNumOperands() ?
I.getOperand(0) :
nullptr;
4633 writeOperand(BI->getCondition(),
true);
4635 writeOperand(BI->getSuccessor(0),
true);
4637 writeOperand(BI->getSuccessor(1),
true);
4642 writeOperand(
SI.getCondition(),
true);
4644 writeOperand(
SI.getDefaultDest(),
true);
4646 for (
auto Case :
SI.cases()) {
4648 writeOperand(Case.getCaseValue(),
true);
4650 writeOperand(Case.getCaseSuccessor(),
true);
4656 writeOperand(Operand,
true);
4660 for (
unsigned i = 1, e =
I.getNumOperands(); i != e; ++i) {
4662 writeOperand(
I.getOperand(i),
true);
4667 TypePrinter.print(
I.getType(), Out);
4671 for (
const auto &[
V,
Block] :
4672 zip_equal(PN->incoming_values(), PN->blocks())) {
4674 writeOperand(
V,
false);
4676 writeOperand(
Block,
false);
4681 writeOperand(
I.getOperand(0),
true);
4686 writeOperand(
I.getOperand(0),
true); Out <<
", ";
4687 writeOperand(
I.getOperand(1),
true);
4692 TypePrinter.print(
I.getType(), Out);
4693 if (LPI->isCleanup() || LPI->getNumClauses() != 0)
4696 if (LPI->isCleanup())
4699 for (
unsigned i = 0, e = LPI->getNumClauses(); i != e; ++i) {
4700 if (i != 0 || LPI->isCleanup()) Out <<
"\n";
4701 if (LPI->isCatch(i))
4706 writeOperand(LPI->getClause(i),
true);
4710 writeOperand(CatchSwitch->getParentPad(),
false);
4713 for (
const BasicBlock *PadBB : CatchSwitch->handlers()) {
4715 writeOperand(PadBB,
true);
4718 if (
const BasicBlock *UnwindDest = CatchSwitch->getUnwindDest())
4719 writeOperand(UnwindDest,
true);
4724 writeOperand(FPI->getParentPad(),
false);
4727 for (
const Value *
Op : FPI->arg_operands()) {
4729 writeOperand(
Op,
true);
4736 writeOperand(CRI->getOperand(0),
false);
4739 writeOperand(CRI->getOperand(1),
true);
4742 writeOperand(CRI->getOperand(0),
false);
4745 if (CRI->hasUnwindDest())
4746 writeOperand(CRI->getOperand(1),
true);
4751 if (CI->getCallingConv() != CallingConv::C) {
4756 Operand = CI->getCalledOperand();
4757 FunctionType *FTy = CI->getFunctionType();
4758 Type *RetTy = FTy->getReturnType();
4759 const AttributeList &PAL = CI->getAttributes();
4761 if (PAL.hasRetAttrs())
4762 Out <<
' ' << PAL.getAsString(AttributeList::ReturnIndex);
4771 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4773 writeOperand(Operand,
false);
4775 bool HasPrettyPrintedArgs =
4780 Function *CalledFunc = CI->getCalledFunction();
4781 auto PrintArgComment = [&](
unsigned ArgNo) {
4783 if (!ConstArg || !CalledFunc)
4785 std::string ArgComment;
4786 raw_string_ostream ArgCommentStream(ArgComment);
4789 if (ArgComment.empty())
4791 Out <<
"/* " << ArgComment <<
" */ ";
4793 if (HasPrettyPrintedArgs) {
4794 for (
unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4797 PrintArgComment(ArgNo);
4798 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4801 for (
unsigned ArgNo = 0, NumArgs = CI->arg_size(); ArgNo < NumArgs;
4804 writeParamOperand(CI->getArgOperand(ArgNo), PAL.getParamAttrs(ArgNo));
4809 if (CI->isMustTailCall() && CI->getParent() &&
4810 CI->getParent()->getParent() &&
4811 CI->getParent()->getParent()->isVarArg()) {
4812 if (CI->arg_size() > 0)
4818 if (PAL.hasFnAttrs())
4819 Out <<
" #" <<
Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4821 writeOperandBundles(CI);
4823 Operand =
II->getCalledOperand();
4824 FunctionType *FTy =
II->getFunctionType();
4825 Type *RetTy = FTy->getReturnType();
4826 const AttributeList &PAL =
II->getAttributes();
4829 if (
II->getCallingConv() != CallingConv::C) {
4834 if (PAL.hasRetAttrs())
4835 Out <<
' ' << PAL.getAsString(AttributeList::ReturnIndex);
4845 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4847 writeOperand(Operand,
false);
4850 for (
unsigned op = 0, Eop =
II->arg_size();
op < Eop; ++
op) {
4852 writeParamOperand(
II->getArgOperand(
op), PAL.getParamAttrs(
op));
4856 if (PAL.hasFnAttrs())
4857 Out <<
" #" <<
Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4859 writeOperandBundles(
II);
4862 writeOperand(
II->getNormalDest(),
true);
4864 writeOperand(
II->getUnwindDest(),
true);
4866 Operand = CBI->getCalledOperand();
4867 FunctionType *FTy = CBI->getFunctionType();
4868 Type *RetTy = FTy->getReturnType();
4869 const AttributeList &PAL = CBI->getAttributes();
4872 if (CBI->getCallingConv() != CallingConv::C) {
4877 if (PAL.hasRetAttrs())
4878 Out <<
' ' << PAL.getAsString(AttributeList::ReturnIndex);
4885 TypePrinter.print(FTy->isVarArg() ? FTy : RetTy, Out);
4887 writeOperand(Operand,
false);
4889 ListSeparator ArgLS;
4890 for (
unsigned op = 0, Eop = CBI->arg_size();
op < Eop; ++
op) {
4892 writeParamOperand(CBI->getArgOperand(
op), PAL.getParamAttrs(
op));
4896 if (PAL.hasFnAttrs())
4897 Out <<
" #" <<
Machine.getAttributeGroupSlot(PAL.getFnAttrs());
4899 writeOperandBundles(CBI);
4902 writeOperand(CBI->getDefaultDest(),
true);
4904 ListSeparator DestLS;
4905 for (
const BasicBlock *Dest : CBI->getIndirectDests()) {
4907 writeOperand(Dest,
true);
4912 if (AI->isUsedWithInAlloca())
4914 if (AI->isSwiftError())
4915 Out <<
"swifterror ";
4916 TypePrinter.print(AI->getAllocatedType(), Out);
4922 if (!AI->getArraySize() || AI->isArrayAllocation() ||
4923 !AI->getArraySize()->getType()->isIntegerTy(32)) {
4925 writeOperand(AI->getArraySize(),
true);
4927 if (MaybeAlign
A = AI->getAlign()) {
4928 Out <<
", align " <<
A->value();
4936 writeOperand(Operand,
true);
4939 TypePrinter.print(
I.getType(), Out);
4943 writeOperand(Operand,
true);
4946 TypePrinter.print(
I.getType(), Out);
4947 }
else if (Operand) {
4950 TypePrinter.print(
GEP->getSourceElementType(), Out);
4954 TypePrinter.print(
I.getType(), Out);
4961 bool PrintAllTypes =
false;
4969 PrintAllTypes =
true;
4971 for (
unsigned i = 1,
E =
I.getNumOperands(); i !=
E; ++i) {
4972 Operand =
I.getOperand(i);
4975 if (Operand && Operand->
getType() != TheType) {
4976 PrintAllTypes =
true;
4982 if (!PrintAllTypes) {
4984 TypePrinter.print(TheType, Out);
4989 for (
const Value *
Op :
I.operands()) {
4991 writeOperand(
Op, PrintAllTypes);
4998 writeAtomic(LI->getContext(), LI->getOrdering(), LI->getSyncScopeID());
4999 if (MaybeAlign
A = LI->getAlign())
5000 Out <<
", align " <<
A->value();
5003 writeAtomic(
SI->getContext(),
SI->getOrdering(),
SI->getSyncScopeID());
5004 if (MaybeAlign
A =
SI->getAlign())
5005 Out <<
", align " <<
A->value();
5007 writeAtomicCmpXchg(CXI->getContext(), CXI->getSuccessOrdering(),
5008 CXI->getFailureOrdering(), CXI->getSyncScopeID());
5009 Out <<
", align " << CXI->getAlign().value();
5011 writeAtomic(RMWI->getContext(), RMWI->getOrdering(),
5012 RMWI->getSyncScopeID());
5013 Out <<
", align " << RMWI->getAlign().value();
5015 writeAtomic(FI->getContext(), FI->getOrdering(), FI->getSyncScopeID());
5023 printMetadataAttachments(InstMD,
", ");
5026 printInfoComment(
I);
5029void AssemblyWriter::printDbgMarker(
const DbgMarker &Marker) {
5033 printDbgRecord(DPR);
5037 Out <<
" DbgMarker -> { ";
5042void AssemblyWriter::printDbgRecord(
const DbgRecord &DR) {
5044 printDbgVariableRecord(*DVR);
5046 printDbgLabelRecord(*DLR);
5051void AssemblyWriter::printDbgVariableRecord(
const DbgVariableRecord &DVR) {
5055 case DbgVariableRecord::LocationType::Value:
5058 case DbgVariableRecord::LocationType::Declare:
5061 case DbgVariableRecord::LocationType::DeclareValue:
5062 Out <<
"declare_value";
5064 case DbgVariableRecord::LocationType::Assign:
5069 "Tried to print a DbgVariableRecord with an invalid LocationType!");
5100void AssemblyWriter::printDbgRecordLine(
const DbgRecord &DR) {
5107void AssemblyWriter::printDbgLabelRecord(
const DbgLabelRecord &Label) {
5109 Out <<
"#dbg_label(";
5116void AssemblyWriter::printMetadataAttachments(
5117 const SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs,
5118 StringRef Separator) {
5122 if (MDNames.empty())
5123 MDs[0].second->getContext().getMDKindNames(MDNames);
5126 for (
const auto &
I : MDs) {
5127 unsigned Kind =
I.first;
5129 if (Kind < MDNames.size()) {
5133 Out <<
"!<unknown kind #" <<
Kind <<
">";
5139void AssemblyWriter::writeMDNode(
unsigned Slot,
const MDNode *Node) {
5140 if (AnnotationWriter)
5143 Out <<
'!' <<
Slot <<
" = ";
5144 printMDNodeBody(Node);
5148void AssemblyWriter::writeAllMDNodes() {
5155 for (
auto [Slot, Node] : Nodes)
5156 writeMDNode(Slot, Node);
5159void AssemblyWriter::printMDNodeBody(
const MDNode *Node) {
5164void AssemblyWriter::writeAttribute(
const Attribute &Attr,
bool InAttrGroup) {
5170 Out << Attribute::getNameFromAttrKind(Attr.
getKindAsEnum());
5173 TypePrinter.print(Ty, Out);
5178void AssemblyWriter::writeAttributeSet(
const AttributeSet &AttrSet,
5180 ListSeparator
LS(
" ");
5181 for (
const auto &Attr : AttrSet) {
5183 writeAttribute(Attr, InAttrGroup);
5187void AssemblyWriter::writeAllAttributeGroups() {
5188 std::vector<std::pair<AttributeSet, unsigned>> asVec;
5189 asVec.resize(
Machine.as_size());
5192 asVec[
I.second] =
I;
5194 for (
const auto &
I : asVec)
5195 Out <<
"attributes #" <<
I.second <<
" = { "
5196 <<
I.first.getAsString(
true) <<
" }\n";
5199void AssemblyWriter::printUseListOrder(
const Value *
V,
5200 ArrayRef<unsigned> Shuffle) {
5204 Out <<
"uselistorder ";
5205 writeOperand(
V,
true);
5207 assert(Shuffle.
size() >= 2 &&
"Shuffle too small");
5211void AssemblyWriter::printUseLists(
const Function *
F) {
5212 auto It = UseListOrders.find(
F);
5213 if (It == UseListOrders.end())
5216 Out <<
"\n; uselistorder directives\n";
5217 for (
const auto &Pair : It->second)
5218 printUseListOrder(Pair.first, Pair.second);
5226 bool ShouldPreserveUseListOrder,
bool IsForDebug)
const {
5230 AAW, IsForDebug, ShouldPreserveUseListOrder);
5231 W.printFunction(
this);
5235 bool ShouldPreserveUseListOrder,
5236 bool IsForDebug)
const {
5240 AAW, IsForDebug, ShouldPreserveUseListOrder);
5241 W.printBasicBlock(
this);
5245 bool ShouldPreserveUseListOrder,
bool IsForDebug)
const {
5249 IsForDebug, ShouldPreserveUseListOrder);
5250 W.printModule(
this);
5258 W.printNamedMDNode(
this);
5262 bool IsForDebug)
const {
5263 std::optional<SlotTracker> LocalST;
5269 SlotTable = &*LocalST;
5274 nullptr, IsForDebug);
5275 W.printNamedMDNode(
this);
5280 ROS <<
" = comdat ";
5287 ROS <<
"exactmatch";
5293 ROS <<
"nodeduplicate";
5305 TP.print(
const_cast<Type*
>(
this), OS);
5314 TP.printStructBody(STy, OS);
5321 print(ROS, MST, IsForDebug);
5327 print(ROS, MST, IsForDebug);
5331 bool IsForDebug)
const {
5340 AssemblyWriter W(
getOptions(M), OS, SlotTable, M,
nullptr, IsForDebug);
5341 W.printDbgMarker(*
this);
5347 print(ROS, MST, IsForDebug);
5351 bool IsForDebug)
const {
5357 ?
Marker->getParent()->getParent()
5362 AssemblyWriter W(
getOptions(M), OS, SlotTable, M,
nullptr, IsForDebug);
5363 W.printDbgVariableRecord(*
this);
5367 bool IsForDebug)
const {
5373 Marker->getParent() ?
Marker->getParent()->getParent() :
nullptr;
5378 AssemblyWriter W(
getOptions(M), OS, SlotTable, M,
nullptr, IsForDebug);
5379 W.printDbgLabelRecord(*
this);
5384 F->print(ROS,
nullptr,
false, IsForDebug);
5388 BB->print(ROS,
nullptr,
false, IsForDebug);
5393 print(ROS, MST, IsForDebug);
5397 bool IsForDebug)
const {
5402 auto IncorporateFunction = [&](
const Function *
F) {
5408 IncorporateFunction(
I->getParent() ?
I->getParent()->getParent() :
nullptr);
5411 W.printInstruction(*
I);
5413 IncorporateFunction(BB->getParent());
5416 W.printBasicBlock(BB);
5419 nullptr, IsForDebug);
5433 TypePrinting TypePrinter;
5434 TypePrinter.print(
C->getType(), OS);
5436 AsmWriterContext WriterCtx(&TypePrinter, MST.
getMachine());
5452 AsmWriterContext WriterCtx(
nullptr,
Machine, M);
5461 TypePrinting TypePrinter(MST.
getModule());
5491 AsmWriterContext &WriterCtx) {
5504struct MDTreeAsmWriterContext :
public AsmWriterContext {
5507 using EntryTy = std::pair<unsigned, std::string>;
5511 SmallPtrSet<const Metadata *, 4> Visited;
5513 raw_ostream &MainOS;
5515 MDTreeAsmWriterContext(TypePrinting *TP, SlotTracker *ST,
const Module *M,
5516 const ModuleSlotTracker *MST, raw_ostream &OS,
5518 : AsmWriterContext(TP,
ST,
M, MST),
Level(0
U), Visited({InitMD}),
5521 void onWriteMetadataAsOperand(
const Metadata *MD)
override {
5522 if (!Visited.
insert(MD).second)
5526 raw_string_ostream
SS(Str);
5531 unsigned InsertIdx = Buffer.
size() - 1;
5534 Buffer[InsertIdx].second = std::move(
SS.str());
5538 ~MDTreeAsmWriterContext()
override {
5539 for (
const auto &Entry : Buffer) {
5541 unsigned NumIndent =
Entry.first * 2U;
5550 bool OnlyAsOperand,
bool PrintAsTree =
false) {
5553 TypePrinting TypePrinter(M);
5555 std::unique_ptr<AsmWriterContext> WriterCtx;
5556 if (PrintAsTree && !OnlyAsOperand)
5557 WriterCtx = std::make_unique<MDTreeAsmWriterContext>(
5558 &TypePrinter, MST.
getMachine(), M, &MST, OS, &MD);
5560 WriterCtx = std::make_unique<AsmWriterContext>(&TypePrinter,
5590 const Module *M,
bool )
const {
5609 AssemblyWriter W(OS, SlotTable,
this, IsForDebug);
5610 W.printModuleSummaryIndex();
5619 L.push_back(std::make_pair(
I.second,
I.first));
5622#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
amdgpu next use AMDGPU Next Use Analysis Printer
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 void print(raw_ostream &Out, object::Archive::Kind Kind, T Val)
static void writeDIMacro(raw_ostream &Out, const DIMacro *N, AsmWriterContext &WriterCtx)
static void writeMetadataAsOperand(raw_ostream &Out, const Metadata *MD, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariableExpression(raw_ostream &Out, const DIGlobalVariableExpression *N, AsmWriterContext &WriterCtx)
static void writeDICompositeType(raw_ostream &Out, const DICompositeType *N, AsmWriterContext &WriterCtx)
static void writeDIFixedPointType(raw_ostream &Out, const DIFixedPointType *N, AsmWriterContext &WriterCtx)
static void printDSOLocation(const GlobalValue &GV, formatted_raw_ostream &Out)
static const char * getWholeProgDevirtResKindName(WholeProgramDevirtResolution::Kind K)
static void writeDISubrangeType(raw_ostream &Out, const DISubrangeType *N, AsmWriterContext &WriterCtx)
static void WriteFullHexAPInt(raw_ostream &Out, const APInt &Val)
static void writeAPFloatInternal(raw_ostream &Out, const APFloat &APF)
static void printMetadataImpl(raw_ostream &ROS, const Metadata &MD, ModuleSlotTracker &MST, const Module *M, bool OnlyAsOperand, bool PrintAsTree=false)
static void writeDIStringType(raw_ostream &Out, const DIStringType *N, AsmWriterContext &WriterCtx)
static std::string getLinkageNameWithSpace(GlobalValue::LinkageTypes LT)
static std::vector< unsigned > predictValueUseListOrder(const Value *V, unsigned ID, const OrderMap &OM)
static void writeDILayerLocList(raw_ostream &Out, const DILayerLocList *N, AsmWriterContext &WriterCtx)
static void writeDIGlobalVariable(raw_ostream &Out, const DIGlobalVariable *N, AsmWriterContext &WriterCtx)
static void orderValue(const Value *V, OrderMap &OM)
static void writeDIBasicType(raw_ostream &Out, const DIBasicType *N, AsmWriterContext &WriterCtx)
static StringRef getUnnamedAddrEncoding(GlobalVariable::UnnamedAddr UA)
static const char * getWholeProgDevirtResByArgKindName(WholeProgramDevirtResolution::ByArg::Kind K)
static void writeDILayerLoc(raw_ostream &Out, const DILayerLoc *N, AsmWriterContext &WriterCtx)
static void writeMDNodeBodyInternal(raw_ostream &Out, const MDNode *Node, AsmWriterContext &Ctx)
static void writeDIModule(raw_ostream &Out, const DIModule *N, AsmWriterContext &WriterCtx)
static void writeDIFile(raw_ostream &Out, const DIFile *N, AsmWriterContext &)
static void writeDISubroutineType(raw_ostream &Out, const DISubroutineType *N, AsmWriterContext &WriterCtx)
static void writeOptimizationInfo(raw_ostream &Out, const User *U)
#define CC_VLS_CASE(ABI_VLEN)
static void writeDILabel(raw_ostream &Out, const DILabel *N, AsmWriterContext &WriterCtx)
static void writeDIDerivedType(raw_ostream &Out, const DIDerivedType *N, AsmWriterContext &WriterCtx)
static void printMetadataIdentifier(StringRef Name, formatted_raw_ostream &Out)
static void printShuffleMask(raw_ostream &Out, Type *Ty, ArrayRef< int > Mask)
static void writeDIImportedEntity(raw_ostream &Out, const DIImportedEntity *N, AsmWriterContext &WriterCtx)
static const Module * getModuleFromDPI(const DbgMarker *Marker)
static void printAsOperandImpl(const Value &V, raw_ostream &O, bool PrintType, ModuleSlotTracker &MST)
static void writeDIObjCProperty(raw_ostream &Out, const DIObjCProperty *N, AsmWriterContext &WriterCtx)
static void writeDISubprogram(raw_ostream &Out, const DISubprogram *N, AsmWriterContext &WriterCtx)
static const char * getSummaryKindName(GlobalValueSummary::SummaryKind SK)
static OrderMap orderModule(const Module *M)
static const char * getVisibilityName(GlobalValue::VisibilityTypes Vis)
static void printCallingConv(unsigned cc, raw_ostream &Out)
static void printAddressSpace(const Module *M, unsigned AS, raw_ostream &OS, StringRef Prefix=" ", StringRef Suffix="", bool ForcePrint=false)
static void printMetadataImplRec(raw_ostream &ROS, const Metadata &MD, AsmWriterContext &WriterCtx)
Recursive version of printMetadataImpl.
static SlotTracker * createSlotTracker(const Value *V)
static void writeDILocation(raw_ostream &Out, const DILocation *DL, AsmWriterContext &WriterCtx)
static void writeDINamespace(raw_ostream &Out, const DINamespace *N, AsmWriterContext &WriterCtx)
DenseMap< const Function *, MapVector< const Value *, std::vector< unsigned > > > UseListOrderMap
static void writeDICommonBlock(raw_ostream &Out, const DICommonBlock *N, AsmWriterContext &WriterCtx)
static UseListOrderMap predictUseListOrder(const Module *M)
static void printThreadLocalModel(GlobalVariable::ThreadLocalMode TLM, formatted_raw_ostream &Out)
static std::string getLinkageName(GlobalValue::LinkageTypes LT)
static void writeGenericDINode(raw_ostream &Out, const GenericDINode *N, AsmWriterContext &WriterCtx)
static void writeDILocalVariable(raw_ostream &Out, const DILocalVariable *N, AsmWriterContext &WriterCtx)
static const char * getTTResKindName(TypeTestResolution::Kind K)
static void writeDITemplateTypeParameter(raw_ostream &Out, const DITemplateTypeParameter *N, AsmWriterContext &WriterCtx)
static const char * getImportTypeName(GlobalValueSummary::ImportKind IK)
static void writeDICompileUnit(raw_ostream &Out, const DICompileUnit *N, AsmWriterContext &WriterCtx)
static const IROptions & getOptions(const Module *M)
static const Module * getModuleFromVal(const Value *V)
static void printLLVMName(raw_ostream &OS, StringRef Name, PrefixType Prefix)
Turn the specified name into an 'LLVM name', which is either prefixed with % (if the string only cont...
static void maybePrintCallAddrSpace(const Value *Operand, const Instruction *I, raw_ostream &Out)
static void writeDIGenericSubrange(raw_ostream &Out, const DIGenericSubrange *N, AsmWriterContext &WriterCtx)
static void writeDISubrange(raw_ostream &Out, const DISubrange *N, AsmWriterContext &WriterCtx)
static void writeDIProperty(raw_ostream &Out, const DIProperty *N, AsmWriterContext &WriterCtx)
static void writeDILexicalBlockFile(raw_ostream &Out, const DILexicalBlockFile *N, AsmWriterContext &WriterCtx)
static void writeConstantInternal(raw_ostream &Out, const Constant *CV, AsmWriterContext &WriterCtx)
static void writeDIEnumerator(raw_ostream &Out, const DIEnumerator *N, AsmWriterContext &)
static void writeAsOperandInternal(raw_ostream &Out, const Value *V, AsmWriterContext &WriterCtx, bool PrintType=false)
static void printVisibility(GlobalValue::VisibilityTypes Vis, formatted_raw_ostream &Out)
constexpr IROptions DefaultOptions
static void writeMDTuple(raw_ostream &Out, const MDTuple *Node, AsmWriterContext &WriterCtx)
static void writeDIExpression(raw_ostream &Out, const DIExpression *N, AsmWriterContext &WriterCtx)
static void writeDIAssignID(raw_ostream &Out, const DIAssignID *DL, AsmWriterContext &WriterCtx)
static void writeDILexicalBlock(raw_ostream &Out, const DILexicalBlock *N, AsmWriterContext &WriterCtx)
static void maybePrintComdat(formatted_raw_ostream &Out, const GlobalObject &GO)
static void printDLLStorageClass(GlobalValue::DLLStorageClassTypes SCT, formatted_raw_ostream &Out)
static bool printWithoutType(const Value &V, raw_ostream &O, SlotTracker *Machine, const Module *M)
Print without a type, skipping the TypePrinting object.
static void writeDIArgList(raw_ostream &Out, const DIArgList *N, AsmWriterContext &WriterCtx, bool FromValue=false)
static void writeDITemplateValueParameter(raw_ostream &Out, const DITemplateValueParameter *N, AsmWriterContext &WriterCtx)
static const Value * skipMetadataWrapper(const Value *V)
Look for a value that might be wrapped as metadata, e.g.
static void writeDIMacroFile(raw_ostream &Out, const DIMacroFile *N, AsmWriterContext &WriterCtx)
Atomic ordering constants.
This file contains the simple types necessary to represent the attributes associated with functions a...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
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...
GlobalValue::SanitizerMetadata SanitizerMetadata
This file provides various utilities for inspecting and working with the control flow graph in LLVM I...
This file contains an interface for creating legacy passes to print out IR in various granularities.
Module.h This file contains the declarations for the Module class.
This defines the Use class.
static bool isAtomic(MachineBasicBlock::iterator I)
Machine Check Debug Module
static bool InRange(int64_t Value, unsigned short Shift, int LBound, int HBound)
ModuleSummaryIndex.h This file contains the declarations the classes that hold the module index and s...
static bool processModule(Module &M, NVPTXTargetMachine &TM)
static bool processFunction(Function &F, NVPTXTargetMachine &TM)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t IntrinsicInst * II
Function const char TargetMachine * Machine
if(auto Err=PB.parsePassPipeline(MPM, Passes)) return wrap(std MPM run * Mod
static StringRef getName(Value *V)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
static void visit(BasicBlock &Start, std::function< bool(BasicBlock *)> op)
static bool contains(SmallPtrSetImpl< ConstantExpr * > &Cache, ConstantExpr *Expr, Constant *C)
This file provides utility classes that use RAII to save and restore values.
This file defines the SmallPtrSet class.
This file defines the SmallString class.
This file defines the SmallVector class.
LocallyHashedType DenseMapInfo< LocallyHashedType >::Empty
static UseListOrderStack predictUseListOrder(const Module &M)
static const fltSemantics & PPCDoubleDouble()
void toString(SmallVectorImpl< char > &Str, unsigned FormatPrecision=0, unsigned FormatMaxPadding=3, bool TruncateZero=true) const
const fltSemantics & getSemantics() const
APInt bitcastToAPInt() const
APInt getNaNPayload() const
If the value is a NaN value, return an integer containing the payload of this value.
Class for arbitrary precision integers.
void clearBit(unsigned BitPosition)
Set a given bit to 0.
unsigned getActiveBits() const
Compute the number of active bits in the value.
LLVM_ABI APInt trunc(unsigned width) const
Truncate to new width.
void toStringUnsigned(SmallVectorImpl< char > &Str, unsigned Radix=10) const
Considers the APInt to be unsigned and converts it into a string in the radix given.
bool isZero() const
Determine if this value is zero, i.e. all bits are clear.
bool isSignMask() const
Check if the APInt's value is returned by getSignMask.
unsigned getBitWidth() const
Return the number of bits in the APInt.
APInt lshr(unsigned shiftAmt) const
Logical right-shift function.
Abstract interface of slot tracker storage.
virtual ~AbstractSlotTrackerStorage()
const GlobalValueSummary & getAliasee() const
This class represents an incoming formal argument to a Function.
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
virtual void emitMDNodeAnnot(const MDNode *, formatted_raw_ostream &)
emitMDNodeAnnot - This may be implemented to emit a string right before a metadata node is emitted.
virtual void emitBasicBlockStartAnnot(const BasicBlock *, formatted_raw_ostream &)
emitBasicBlockStartAnnot - This may be implemented to emit a string right after the basic block label...
virtual void emitBasicBlockEndAnnot(const BasicBlock *, formatted_raw_ostream &)
emitBasicBlockEndAnnot - This may be implemented to emit a string right after the basic block.
virtual void emitFunctionAnnot(const Function *, formatted_raw_ostream &)
emitFunctionAnnot - This may be implemented to emit a string right before the start of a function.
virtual void emitInstructionAnnot(const Instruction *, formatted_raw_ostream &)
emitInstructionAnnot - This may be implemented to emit a string right before an instruction is emitte...
virtual void printInfoComment(const Value &, formatted_raw_ostream &)
printInfoComment - This may be implemented to emit a comment to the right of an instruction or global...
virtual ~AssemblyAnnotationWriter()
static LLVM_ABI StringRef getOperationName(BinOp Op)
This class holds the attributes for a particular argument, parameter, function, or return value.
bool hasAttributes() const
Return true if attributes exists in this set.
LLVM_ABI std::string getAsString(bool InAttrGrp=false) const
The Attribute is converted to a string of equivalent mnemonic.
LLVM_ABI Attribute::AttrKind getKindAsEnum() const
Return the attribute's kind as an enum (Attribute::AttrKind).
LLVM_ABI bool isTypeAttribute() const
Return true if the attribute is a type attribute.
LLVM_ABI Type * getValueAsType() const
Return the attribute's value as a Type.
LLVM Basic Block Representation.
const Function * getParent() const
Return the enclosing method, or null if none.
LLVM_ABI void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW=nullptr, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the basic block to an output stream with an optional AssemblyAnnotationWriter.
LLVM_ABI bool isEntryBlock() const
Return true if this is the entry block of the containing function.
LLVM_ABI const Module * getModule() const
Return the module owning the function this basic block belongs to, or nullptr if the function does no...
OperandBundleUse getOperandBundleAt(unsigned Index) const
Return the operand bundle at a specific index.
unsigned getNumOperandBundles() const
Return the number of operand bundles associated with this User.
AttributeList getAttributes() const
Return the attributes for this call.
bool hasOperandBundles() const
Return true if this User has any operand bundles.
std::vector< std::pair< StringRef, GlobalValue::GUID > > getSortedSymbols() const
API used for serialization, e.g. YAML.
LLVM_ABI void print(raw_ostream &OS, bool IsForDebug=false) const
LLVM_ABI void dump() const
@ Largest
The linker will choose the largest COMDAT.
@ SameSize
The data referenced by the COMDAT must be the same size.
@ Any
The linker may choose any COMDAT.
@ NoDeduplicate
No deduplication is performed.
@ ExactMatch
The data referenced by the COMDAT must be the same.
SelectionKind getSelectionKind() const
static LLVM_ABI ConstantPointerNull * get(PointerType *T)
Static factory methods - Return objects of the specified value.
LLVM_ABI APInt getSignedMin() const
Return the smallest signed value contained in the ConstantRange.
LLVM_ABI APInt getSignedMax() const
Return the largest signed value contained in the ConstantRange.
This is an important base class in LLVM.
LLVM_ABI Constant * getSplatValue(bool AllowPoison=false) const
If all elements of the vector constant have the same value, return that value.
LLVM_ABI Constant * getAggregateElement(unsigned Elt) const
For aggregates (struct/array/vector) return the constant that corresponds to the specified element if...
List of ValueAsMetadata, to be used as an argument to a dbg.value intrinsic.
Basic type, like 'int' or 'float'.
static LLVM_ABI const char * nameTableKindString(DebugNameTableKind PK)
static LLVM_ABI const char * emissionKindString(DebugEmissionKind EK)
A lightweight wrapper around an expression operand.
static LLVM_ABI const char * fixedPointKindString(FixedPointKind)
A pair of DIGlobalVariable and DIExpression.
An imported module (C++ using directive or similar).
A sequence of DILayerLoc entries.
A single intermediate-IR layer location.
Macro Info DWARF-like metadata node.
Represents a module in the programming language, for example, a Clang module, or a Fortran module.
Tagged DWARF-like metadata node.
static LLVM_ABI DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
static LLVM_ABI StringRef getFlagString(DIFlags Flag)
A property of a class or structure.
Wrapper structure that holds source language identity metadata that includes language name,...
uint32_t getVersion() const
Returns language version. Only valid for versioned language names.
uint16_t getDialect() const
bool hasVersionedName() const
uint16_t getName() const
Returns a versioned or unversioned language name.
String type, Fortran CHARACTER(n)
Subprogram description. Uses SubclassData1.
static LLVM_ABI DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static LLVM_ABI StringRef getFlagString(DISPFlags Flag)
DISPFlags
Debug info subprogram flags.
Type array for a subprogram.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Per-instruction record of debug-info.
LLVM_ABI void dump() const
Instruction * MarkedInstr
Link back to the Instruction that owns this marker.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on DbgMarker.
LLVM_ABI const BasicBlock * getParent() const
simple_ilist< DbgRecord > StoredDbgRecords
List of DbgRecords, the non-instruction equivalent of llvm.dbg.
Base class for non-instruction debug metadata records that have positions within IR.
DebugLoc getDebugLoc() const
LLVM_ABI void dump() const
DbgMarker * Marker
Marker that this DbgRecord is linked into.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
LocationType getType() const
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
MDNode * getRawExpression() const
MDNode * getRawAddressExpression() const
Metadata * getRawAssignID() const
MDNode * getRawVariable() const
Metadata * getRawLocation() const
Returns the metadata operand for the first location description.
Metadata * getRawAddress() const
LLVM_ABI MDNode * getAsMDNode() const
Return this as a bar MDNode.
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
Intrinsic::ID getIntrinsicID() const LLVM_READONLY
getIntrinsicID - This method returns the ID number of the specified function, or Intrinsic::not_intri...
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW=nullptr, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the function to an output stream with an optional AssemblyAnnotationWriter.
const Function & getFunction() const
const Argument * const_arg_iterator
LLVM_ABI Value * getBasePtr() const
LLVM_ABI Value * getDerivedPtr() const
Generic tagged DWARF-like metadata node.
const Constant * getAliasee() const
const Constant * getResolver() const
StringRef getSection() const
Get the custom section of this global if it has one.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
const Comdat * getComdat() const
bool hasSection() const
Check if this global has a custom object file section.
SummaryKind
Sububclass discriminator (for dyn_cast<> et al.)
bool hasPartition() const
static LLVM_ABI GUID getGUIDAssumingExternalLinkage(StringRef GlobalName)
Return a 64-bit global unique ID constructed from the name of a global symbol.
LLVM_ABI const SanitizerMetadata & getSanitizerMetadata() const
bool hasExternalLinkage() const
VisibilityTypes getVisibility() const
bool isImplicitDSOLocal() const
LinkageTypes getLinkage() const
uint64_t GUID
Declare a type to represent a global unique identifier for a global value.
ThreadLocalMode getThreadLocalMode() const
DLLStorageClassTypes
Storage classes of global values for PE targets.
@ DLLExportStorageClass
Function to be accessible from DLL.
@ DLLImportStorageClass
Function to be imported from DLL.
bool hasSanitizerMetadata() const
LLVM_ABI StringRef getPartition() 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.
LLVM_ABI bool isMaterializable() const
If this function's Module is being lazily streamed in functions from disk or some other source,...
UnnamedAddr getUnnamedAddr() 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.
DLLStorageClassTypes getDLLStorageClass() const
Type * getValueType() const
const Constant * getInitializer() const
getInitializer - Return the initializer for this global variable.
bool isExternallyInitialized() const
bool hasInitializer() const
Definitions have initializers, declarations don't.
AttributeSet getAttributes() const
Return the attribute set for this global.
std::optional< CodeModel::Model > getCodeModel() const
Get the custom code model of this global if it has one.
MaybeAlign getAlign() const
Returns the alignment of the given variable.
bool isConstant() const
If the value is a global constant, its value is immutable throughout the runtime execution of the pro...
A helper class to return the specified delimiter string after the first invocation of operator String...
LLVM_ABI void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
LLVM_ABI void dumpTree() const
User-friendly dump in tree shape.
Tracking metadata reference owned by Metadata.
This class implements a map that also provides access to all stored values in a deterministic order.
Manage lifetime of a slot tracker for printing IR.
const Module * getModule() const
ModuleSlotTracker(SlotTracker &Machine, const Module *M, const Function *F=nullptr)
Wrap a preinitialized SlotTracker.
void renumberMetadataForAssembly(ArrayRef< const MDNode * > AdditionalMetadata, MachineMDNodeListType *AdditionalMetadataNodes=nullptr) const
Renumber module metadata and then additional metadata for canonical assembly output.
void collectMDNodes(MachineMDNodeListType &L) const
void setProcessHook(std::function< void(AbstractSlotTrackerStorage *, const Module *)>)
virtual ~ModuleSlotTracker()
Destructor to clean up storage.
void collectAdditionalMetadata(ArrayRef< const MDNode * > AdditionalMetadata, MachineMDNodeListType &AdditionalMetadataNodes) const
Collect metadata reachable from AdditionalMetadata but not from the module.
int getLocalSlot(const Value *V)
Return the slot number of the specified local value.
virtual bool shouldPrintDebugLocationInline(const DILocation *) const
Return whether a debug location should be printed inline instead of by ID.
SlotTracker * getMachine()
Lazily creates a slot tracker.
SmallVector< std::pair< unsigned, const MDNode * >, 0 > MachineMDNodeListType
void incorporateFunction(const Function &F)
Incorporate the given function.
Class to hold module path string table and global value map, and encapsulate methods for operating on...
uint64_t getBlockCount() const
const TypeIdSummaryMapTy & typeIds() const
CfiFunctionIndex & cfiFunctionDecls()
ValueInfo getValueInfo(const GlobalValueSummaryMapTy::value_type &R) const
Return a ValueInfo for the index value_type (convenient when iterating index).
static constexpr const char * getRegularLTOModuleName()
const auto & typeIdCompatibleVtableMap() const
const StringMap< ModuleHash > & modulePaths() const
Table of modules, containing module hash and id.
LLVM_ABI void dump() const
Dump to stderr (for debugging).
GlobalValueSummaryMapTy::SortedEntriesRange sortedGlobalValueSummariesRange() const
uint64_t getStackIdAtIndex(unsigned Index) const
LLVM_ABI void print(raw_ostream &OS, bool IsForDebug=false) const
Print to an output stream.
CfiFunctionIndex & cfiFunctionDefs()
LLVM_ABI uint64_t getFlags() const
A Module instance is used to store all the information related to an LLVM module.
void renumberMetadataForAssembly()
Renumber the IDs stored in metadata nodes into canonical assembly order.
iterator_range< alias_iterator > aliases()
iterator_range< global_iterator > globals()
void print(raw_ostream &OS, AssemblyAnnotationWriter *AAW, bool ShouldPreserveUseListOrder=false, bool IsForDebug=false) const
Print the module to an output stream with an optional AssemblyAnnotationWriter.
void dump() const
Dump the module to stderr (for debugging).
LLVM_ABI void dump() const
LLVM_ABI StringRef getName() const
LLVM_ABI void print(raw_ostream &ROS, bool IsForDebug=false) const
iterator_range< op_iterator > operands()
unsigned getAddressSpace() const
Return the address space of the Pointer type.
This class provides computation of slot numbers for LLVM Assembly writing.
DenseMap< const Value *, unsigned > ValueMap
ValueMap - A mapping of Values to slot numbers.
int getMetadataSlot(const MDNode *N) override
getMetadataSlot - Get the slot number of a MDNode.
~SlotTracker() override=default
int getTypeIdCompatibleVtableSlot(StringRef Id)
int getModulePathSlot(StringRef Path)
unsigned mdn_size() const
SlotTracker(const SlotTracker &)=delete
void purgeFunction()
After calling incorporateFunction, use this method to remove the most recently incorporated function ...
int getTypeIdSlot(StringRef Id)
void initializeIfNeeded()
These functions do the actual initialization.
int getGlobalSlot(const GlobalValue *V)
getGlobalSlot - Get the slot number of a global value.
SlotTracker(const Module *M, bool ShouldTrackMetadataDefinitions=false)
Construct from a module.
const Function * getFunction() const
DenseMap< GlobalValue::GUID, unsigned >::iterator guid_iterator
GUID map iterators.
void incorporateFunction(const Function *F)
If you'd like to deal with a function instead of just a module, use this method to get its data into ...
int getLocalSlot(const Value *V)
Return the slot number of the specified value in it's type plane.
int getAttributeGroupSlot(AttributeSet AS)
void setProcessHook(std::function< void(AbstractSlotTrackerStorage *, const Module *)>)
void createMetadataSlot(const MDNode *N) override
getMetadataSlot - Get the slot number of a MDNode.
DenseMap< const MDNode *, unsigned >::iterator mdn_iterator
MDNode map iterators.
SlotTracker & operator=(const SlotTracker &)=delete
int getGUIDSlot(GlobalValue::GUID GUID)
int initializeIndexIfNeeded()
DenseMap< AttributeSet, unsigned >::iterator as_iterator
AttributeSet map iterators.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
reference emplace_back(ArgTypes &&... Args)
void reserve(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringMap - This is an unconventional map that is specialized for handling keys that are "strings",...
Represent a constant reference to a string, i.e.
constexpr bool empty() const
Check if the string is empty.
ArrayRef< Type * > elements() const
unsigned getNumElements() const
Random access to the elements.
bool isLiteral() const
Return true if this type is uniqued by structural equivalence, false if it is a struct definition.
bool isOpaque() const
Return true if this is a type with an identity that has no body specified yet.
LLVM_ABI StringRef getName() const
Return the name for this struct type if it has an identity.
ArrayRef< Type * > type_params() const
Return the type parameters for this particular target extension type.
ArrayRef< unsigned > int_params() const
Return the integer parameters for this particular target extension type.
TypeFinder - Walk over a module, identifying all of the types that are used by the module.
LLVM_ABI void run(const Module &M, bool onlyNamed)
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM_ABI unsigned getPointerAddressSpace() const
Get the address space of this pointer or pointer vector type.
LLVM_ABI StringRef getTargetExtName() const
Type(LLVMContext &C, TypeID tid)
LLVM_ABI void dump() const
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false, bool NoDetails=false) const
Print the current type.
LLVM_ABI unsigned getByteBitWidth() const
TypeID getTypeID() const
Return the type id for the type.
Type * getElementType() const
unsigned getAddressSpace() const
Return the address space of the Pointer type.
A Use represents the edge between a Value definition and its users.
LLVM Value Representation.
Type * getType() const
All values are typed, get the type of this value.
LLVM_ABI void print(raw_ostream &O, bool IsForDebug=false) const
Implement operator<< on Value.
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
iterator_range< user_iterator > users()
LLVM_ABI 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.
LLVM_ABI StringRef getName() const
Return a constant reference to the value's name.
LLVM_ABI void dump() const
Support for debugging, callable in GDB: V->dump()
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.
LLVM_ABI StringRef LanguageDialectString(unsigned LanguageDialect)
LLVM_ABI StringRef SourceLanguageNameString(SourceLanguageName Lang)
LLVM_ABI StringRef EnumKindString(unsigned EnumKind)
LLVM_ABI StringRef LanguageString(unsigned Language)
LLVM_ABI StringRef AttributeEncodingString(unsigned Encoding)
LLVM_ABI StringRef ConventionString(unsigned Convention)
LLVM_ABI StringRef MacinfoString(unsigned Encoding)
LLVM_ABI StringRef OperationEncodingString(unsigned Encoding)
LLVM_ABI StringRef TagString(unsigned Tag)
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
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.
constexpr char Attrs[]
Key for Kernel::Metadata::mAttrs.
@ AArch64_VectorCall
Used between AArch64 Advanced SIMD functions.
@ X86_64_SysV
The C convention as specified in the x86-64 supplement to the System V ABI, used on most non-Windows ...
@ RISCV_VectorCall
Calling convention used for RISC-V V-extension.
@ AMDGPU_CS
Used for Mesa/AMDPAL compute shaders.
@ AMDGPU_VS
Used for Mesa vertex shaders, or AMDPAL last shader stage before rasterization (vertex shader if tess...
@ AVR_SIGNAL
Used for AVR signal routines.
@ Swift
Calling convention for Swift.
@ AMDGPU_KERNEL
Used for AMDGPU code object kernels.
@ AArch64_SVE_VectorCall
Used between AArch64 SVE functions.
@ ARM_APCS
ARM Procedure Calling Standard (obsolete, but still used on some targets).
@ CHERIoT_CompartmentCall
Calling convention used for CHERIoT when crossing a protection boundary.
@ CFGuard_Check
Special calling convention on Windows for calling the Control Guard Check ICall funtion.
@ AVR_INTR
Used for AVR interrupt routines.
@ PreserveMost
Used for runtime calls that preserves most registers.
@ AnyReg
OBSOLETED - Used for stack based JavaScript calls.
@ AMDGPU_Gfx
Used for AMD graphics targets.
@ DUMMY_HHVM
Placeholders for HHVM calling conventions (deprecated, removed).
@ AMDGPU_CS_ChainPreserve
Used on AMDGPUs to give the middle-end more control over argument placement.
@ AMDGPU_HS
Used for Mesa/AMDPAL hull shaders (= tessellation control shaders).
@ ARM_AAPCS
ARM Architecture Procedure Calling Standard calling convention (aka EABI).
@ CHERIoT_CompartmentCallee
Calling convention used for the callee of CHERIoT_CompartmentCall.
@ AMDGPU_GS
Used for Mesa/AMDPAL geometry shaders.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X2
Preserve X2-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ CHERIoT_LibraryCall
Calling convention used for CHERIoT for cross-library calls to a stateless compartment.
@ CXX_FAST_TLS
Used for access functions.
@ X86_INTR
x86 hardware interrupt context.
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X0
Preserve X0-X13, X19-X29, SP, Z0-Z31, P0-P15.
@ WASM_EmscriptenInvoke
For emscripten __invoke_* functions.
@ AMDGPU_CS_Chain
Used on AMDGPUs to give the middle-end more control over argument placement.
@ GHC
Used by the Glasgow Haskell Compiler (GHC).
@ AMDGPU_PS
Used for Mesa/AMDPAL pixel shaders.
@ Cold
Attempts to make code in the caller as efficient as possible under the assumption that the call is no...
@ AArch64_SME_ABI_Support_Routines_PreserveMost_From_X1
Preserve X1-X15, X19-X29, SP, Z0-Z31, P0-P15.
@ X86_ThisCall
Similar to X86_StdCall.
@ PTX_Device
Call to a PTX device function.
@ SPIR_KERNEL
Used for SPIR kernel functions.
@ PreserveAll
Used for runtime calls that preserves (almost) all registers.
@ X86_StdCall
stdcall is mostly used by the Win32 API.
@ SPIR_FUNC
Used for SPIR non-kernel device functions.
@ Fast
Attempts to make calls as fast as possible (e.g.
@ MSP430_INTR
Used for MSP430 interrupt routines.
@ X86_VectorCall
MSVC calling convention that passes vectors and vector aggregates in SSE registers.
@ Intel_OCL_BI
Used for Intel OpenCL built-ins.
@ PreserveNone
Used for runtime calls that preserves none general registers.
@ AMDGPU_ES
Used for AMDPAL shader stage before geometry shader if geometry is in use.
@ Tail
Attemps to make calls as fast as possible while guaranteeing that tail call optimization can always b...
@ Win64
The C convention as implemented on Windows/x86-64 and AArch64.
@ PTX_Kernel
Call to a PTX kernel. Passes all arguments in parameter space.
@ SwiftTail
This follows the Swift calling convention in how arguments are passed but guarantees tail calls will ...
@ GRAAL
Used by GraalVM. Two additional registers are reserved.
@ AMDGPU_LS
Used for AMDPAL vertex shader if tessellation is in use.
@ ARM_AAPCS_VFP
Same as ARM_AAPCS, but uses hard floating point ABI.
@ X86_RegCall
Register calling convention used for parameters transfer optimization.
@ M68k_RTD
Used for M68k rtd-based CC (similar to X86's stdcall).
@ X86_FastCall
'fast' analog of X86_StdCall.
LLVM_ABI void printImmArg(ID IID, unsigned ArgIdx, raw_ostream &OS, const Constant *ImmArgVal)
Print the argument info for the arguments with ArgInfo.
LLVM_ABI bool hasPrettyPrintedArgs(ID id)
Returns true if the intrinsic has pretty printed immediate arguments.
@ System
Synchronized with respect to all concurrently executing threads.
PointerTypeMap run(const Module &M)
Compute the PointerTypeMap for the module M.
bool isElementwise(const VPValue *V)
Return true if V is elementwise, i.e. none of the lanes are permuted.
This is an optimization pass for GlobalISel generic memory operations.
void dump(const SparseBitVector< ElementSize > &LHS, raw_ostream &out)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Printable print(const GCNRegPressure &RP, const GCNSubtarget *ST=nullptr, unsigned DynamicVGPRBlockSize=0)
detail::zippy< detail::zip_first, T, U, Args... > zip_equal(T &&t, U &&u, Args &&...args)
zip iterator that assumes that all iteratees have the same length.
InterleavedRange< Range > interleaved(const Range &R, StringRef Separator=", ", StringRef Prefix="", StringRef Suffix="")
Output range R as a sequence of interleaved elements.
const char * getHotnessName(CalleeInfo::HotnessType HT)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
LLVM_ABI void printEscapedString(StringRef Name, raw_ostream &Out)
Print each character of the specified string, escaping it if it is not printable or if it is an escap...
constexpr auto equal_to(T &&Arg)
Functor variant of std::equal_to that can be used as a UnaryPredicate in functional algorithms like a...
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
const char * toIRString(AtomicOrdering ao)
String used by LLVM IR to represent atomic ordering.
auto dyn_cast_or_null(const Y &Val)
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
char hexdigit(unsigned X, bool LowerCase=false)
hexdigit - Return the hexadecimal character for the given number X (which should be less than 16).
bool is_sorted(R &&Range, Compare C)
Wrapper function around std::is_sorted to check if elements in a range R are sorted with respect to a...
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
constexpr int PoisonMaskElem
AtomicOrdering
Atomic ordering for LLVM's memory model.
@ Ref
The access may reference the value stored in memory.
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Count
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
const IROptions & getIROptions(const LLVMContext &C)
LLVM_ABI Printable printBasicBlock(const BasicBlock *BB)
Print BasicBlock BB as an operand or print "<nullptr>" if BB is a nullptr.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
auto predecessors(const MachineBasicBlock *BB)
constexpr bool valueOr(BoolOrDefault X, bool Default)
bool pred_empty(const BasicBlock *BB)
std::vector< TypeIdOffsetVtableInfo > TypeIdCompatibleVtableInfo
List of vtable definitions decorated by a particular type identifier, and their corresponding offsets...
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
LLVM_ABI void printLLVMNameWithoutPrefix(raw_ostream &OS, StringRef Name)
Print out a name of an LLVM value without any prefixes.
A single checksum, represented by a Kind and a Value (a string).
T Value
The string value of the checksum.
StringRef getKindAsString() const
std::vector< ConstVCall > TypeCheckedLoadConstVCalls
std::vector< VFuncId > TypeCheckedLoadVCalls
std::vector< ConstVCall > TypeTestAssumeConstVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
std::vector< GlobalValue::GUID > TypeTests
List of type identifiers used by this function in llvm.type.test intrinsics referenced by something o...
std::vector< VFuncId > TypeTestAssumeVCalls
List of virtual calls made by this function using (respectively) llvm.assume(llvm....
unsigned NoRenameOnPromotion
This field is written by the ThinLTO prelink stage to decide whether a particular static global value...
unsigned DSOLocal
Indicates that the linker resolved the symbol to a definition from within the same linkage unit.
unsigned CanAutoHide
In the per-module summary, indicates that the global value is linkonce_odr and global unnamed addr (s...
unsigned ImportType
This field is written by the ThinLTO indexing step to postlink combined summary.
unsigned NotEligibleToImport
Indicate if the global value cannot be imported (e.g.
unsigned Linkage
The linkage type of the associated global value.
unsigned Visibility
Indicates the visibility.
unsigned Live
In per-module summary, indicate that the global value must be considered a live root for index-based ...
StringRef getTagName() const
Return the tag of this operand bundle as a string.
A utility class that uses RAII to save and restore the value of a variable.
std::map< uint64_t, WholeProgramDevirtResolution > WPDRes
Mapping from byte offset to whole-program devirt resolution for that (typeid, byte offset) pair.
Kind
Specifies which kind of type check we should emit for this byte array.
@ Unknown
Unknown (analysis not performed, don't lower)
@ Single
Single element (last example in "Short Inline Bit Vectors")
@ Inline
Inlined bit vector ("Short Inline Bit Vectors")
@ Unsat
Unsatisfiable type (i.e. no global has this type metadata)
@ AllOnes
All-ones bit vector ("Eliminating Bit Vector Checks for All-Ones Bit Vectors")
@ ByteArray
Test a byte array (first example)
unsigned SizeM1BitWidth
Range of size-1 expressed as a bit width.
enum llvm::TypeTestResolution::Kind TheKind
@ UniformRetVal
Uniform return value optimization.
@ VirtualConstProp
Virtual constant propagation.
@ UniqueRetVal
Unique return value optimization.
@ Indir
Just do a regular virtual call.
enum llvm::WholeProgramDevirtResolution::Kind TheKind
std::map< std::vector< uint64_t >, ByArg > ResByArg
Resolutions for calls with all constant integer arguments (excluding the first argument,...
std::string SingleImplName
@ SingleImpl
Single implementation devirtualization.
@ Indir
Just do a regular virtual call.
@ BranchFunnel
When retpoline mitigation is enabled, use a branch funnel that is defined in the merged module.
Function object to check whether the second component of a container supported by std::get (like std:...