63#define DEBUG_TYPE "bitcode-reader"
65STATISTIC(NumMDStringLoaded,
"Number of MDStrings loaded");
66STATISTIC(NumMDNodeTemporary,
"Number of MDNode::Temporary created");
67STATISTIC(NumMDRecordLoaded,
"Number of Metadata records loaded");
73 cl::desc(
"Import full type definitions for ThinLTO."));
77 cl::desc(
"Force disable the lazy-loading on-demand of metadata when "
78 "loading bitcode for importing."));
82class BitcodeReaderMetadataList {
105 LLVMContext &Context;
109 unsigned RefsUpperBound;
112 BitcodeReaderMetadataList(LLVMContext &
C,
size_t RefsUpperBound)
114 RefsUpperBound(std::
min((size_t)std::numeric_limits<unsigned>::
max(),
117 using const_iterator = SmallVector<TrackingMDRef, 1>::const_iterator;
120 unsigned size()
const {
return MetadataPtrs.size(); }
121 void resize(
unsigned N) { MetadataPtrs.resize(
N); }
122 void push_back(
Metadata *MD) { MetadataPtrs.emplace_back(MD); }
123 void clear() { MetadataPtrs.clear(); }
125 void pop_back() { MetadataPtrs.pop_back(); }
126 bool empty()
const {
return MetadataPtrs.empty(); }
127 const_iterator
begin()
const {
return MetadataPtrs.begin(); }
128 const_iterator
end()
const {
return MetadataPtrs.end(); }
130 Metadata *operator[](
unsigned i)
const {
return MetadataPtrs[i]; }
133 if (
I < MetadataPtrs.size())
134 return MetadataPtrs[
I];
138 void shrinkTo(
unsigned N) {
139 assert(
N <=
size() &&
"Invalid shrinkTo request!");
140 assert(ForwardReference.empty() &&
"Unexpected forward refs");
141 assert(UnresolvedNodes.empty() &&
"Unexpected unresolved node");
142 MetadataPtrs.resize(
N);
147 Metadata *getMetadataFwdRef(
unsigned Idx);
153 Metadata *getMetadataIfResolved(
unsigned Idx);
155 MDNode *getMDNodeFwdRefOrNull(
unsigned Idx);
156 void assignValue(
Metadata *MD,
unsigned Idx);
157 void tryToResolveCycles();
158 bool hasFwdRefs()
const {
return !ForwardReference.empty(); }
159 int getNextFwdRef() {
161 return *ForwardReference.begin();
165 void addTypeRef(MDString &
UUID, DICompositeType &CT);
180void BitcodeReaderMetadataList::assignValue(
Metadata *MD,
unsigned Idx) {
182 if (!MDN->isResolved())
183 UnresolvedNodes.
insert(Idx);
193 TrackingMDRef &OldMD = MetadataPtrs[
Idx];
201 PrevMD->replaceAllUsesWith(MD);
205Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(
unsigned Idx) {
207 if (Idx >= RefsUpperBound)
213 if (
Metadata *MD = MetadataPtrs[Idx])
220 ++NumMDNodeTemporary;
222 MetadataPtrs[
Idx].reset(MD);
226Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(
unsigned Idx) {
229 if (!
N->isResolved())
234MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(
unsigned Idx) {
238void BitcodeReaderMetadataList::tryToResolveCycles() {
244 for (
const auto &[
UUID, CT] : OldTypeRefs.FwdDecls)
245 OldTypeRefs.Final.try_emplace(
UUID, CT);
246 OldTypeRefs.FwdDecls.clear();
250 for (
const auto &Array : OldTypeRefs.Arrays)
251 Array.second->replaceAllUsesWith(resolveTypeArray(
Array.first.get()));
252 OldTypeRefs.Arrays.clear();
257 for (
const auto &
Ref : OldTypeRefs.Unknown) {
258 if (DICompositeType *CT = OldTypeRefs.Final.lookup(
Ref.first))
259 Ref.second->replaceAllUsesWith(CT);
261 Ref.second->replaceAllUsesWith(
Ref.first);
263 OldTypeRefs.Unknown.clear();
265 if (UnresolvedNodes.
empty())
270 for (
unsigned I : UnresolvedNodes) {
271 auto &MD = MetadataPtrs[
I];
276 assert(!
N->isTemporary() &&
"Unexpected forward reference");
281 UnresolvedNodes.clear();
284void BitcodeReaderMetadataList::addTypeRef(MDString &
UUID,
285 DICompositeType &CT) {
288 OldTypeRefs.FwdDecls.insert(std::make_pair(&
UUID, &CT));
290 OldTypeRefs.Final.insert(std::make_pair(&
UUID, &CT));
298 if (
auto *CT = OldTypeRefs.Final.lookup(
UUID))
301 auto &
Ref = OldTypeRefs.Unknown[
UUID];
307Metadata *BitcodeReaderMetadataList::upgradeTypeArray(
Metadata *MaybeTuple) {
309 if (!Tuple ||
Tuple->isDistinct())
313 if (!
Tuple->isTemporary())
314 return resolveTypeArray(Tuple);
318 OldTypeRefs.Arrays.emplace_back(
319 std::piecewise_construct, std::forward_as_tuple(Tuple),
321 return OldTypeRefs.Arrays.back().second.get();
324Metadata *BitcodeReaderMetadataList::resolveTypeArray(
Metadata *MaybeTuple) {
326 if (!Tuple ||
Tuple->isDistinct())
331 Ops.reserve(
Tuple->getNumOperands());
333 Ops.push_back(upgradeTypeRef(MD));
351 New->replaceOperandWith(0, New);
357 unsigned NumOperands =
Domain->getNumOperands();
358 bool HadDescription = NumOperands == 2;
360 if (NumOperands == 0 || NumOperands > 2 ||
387 if (UpgradedDomain ==
Domain)
391 Ops[1] = UpgradedDomain;
393 Upgraded[Scope] = Upgrade;
399class PlaceholderQueue {
402 std::deque<DistinctMDOperandPlaceholder> PHs;
405 ~PlaceholderQueue() {
407 "PlaceholderQueue hasn't been flushed before being destroyed");
409 bool empty()
const {
return PHs.empty(); }
410 DistinctMDOperandPlaceholder &getPlaceholderOp(
unsigned ID);
411 void flush(BitcodeReaderMetadataList &MetadataList);
415 void getTemporaries(BitcodeReaderMetadataList &MetadataList,
416 DenseSet<unsigned> &Temporaries) {
417 for (
auto &PH : PHs) {
418 auto ID = PH.getID();
419 auto *MD = MetadataList.lookup(ID);
425 if (
N &&
N->isTemporary())
433DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(
unsigned ID) {
434 PHs.emplace_back(ID);
438void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
439 while (!PHs.empty()) {
440 auto *MD = MetadataList.lookup(PHs.front().getID());
441 assert(MD &&
"Flushing placeholder on unassigned MD");
444 assert(MDN->isResolved() &&
445 "Flushing Placeholder while cycles aren't resolved");
447 PHs.front().replaceUseWith(MD);
458 BitcodeReaderMetadataList MetadataList;
471 std::vector<StringRef> MDStringRef;
475 MDString *lazyLoadOneMDString(
unsigned Idx);
478 std::vector<uint64_t> GlobalMetadataBitPosIndex;
483 uint64_t GlobalDeclAttachmentPos = 0;
488 unsigned NumGlobalDeclAttachSkipped = 0;
489 unsigned NumGlobalDeclAttachParsed = 0;
502 void lazyLoadOneMetadata(
unsigned Idx, PlaceholderQueue &Placeholders);
506 std::vector<std::pair<DICompileUnit *, unsigned>> CUSubprograms;
520 bool StripTBAA =
false;
521 bool HasSeenOldLoopTags =
false;
526 bool NeedUpgradeToDIGlobalVariableExpression =
false;
527 bool NeedDeclareExpressionUpgrade =
false;
531 GlobalVariableExpression;
537 bool IsImporting =
false;
540 PlaceholderQueue &Placeholders,
StringRef Blob,
541 unsigned &NextMetadataNo);
548 void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
551 void upgradeCUSubprograms() {
552 for (
auto CU_SP : CUSubprograms)
555 for (
auto &
Op : SPs->operands())
557 SP->replaceUnit(CU_SP.first);
558 CUSubprograms.clear();
562 void upgradeCUVariables() {
563 if (!NeedUpgradeToDIGlobalVariableExpression)
567 if (
NamedMDNode *CUNodes = TheModule.getNamedMetadata(
"llvm.dbg.cu"))
568 for (
unsigned I = 0, E = CUNodes->getNumOperands();
I != E; ++
I) {
571 for (
unsigned I = 0;
I < GVs->getNumOperands();
I++)
584 for (
auto &GV : TheModule.globals()) {
586 GV.getMetadata(LLVMContext::MD_dbg, MDs);
587 GV.eraseMetadata(LLVMContext::MD_dbg);
595 GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
597 GV.addMetadata(LLVMContext::MD_dbg, *MD);
604 if (
auto *SP = ParentSubprogram[S]) {
612 if (!Visited.
insert(S).second)
616 return ParentSubprogram[InitialScope] =
622 using SPToEntitiesMap =
628 template <
typename NodeT>
629 void upgradeOneCULocalsList(SPToEntitiesMap &SPToEntities,
DICompileUnit *
CU,
630 unsigned ListIndex) {
636 return !isa_and_nonnull<DILocalScope>(getScope(cast<NodeT>(MD)));
646 else if (
auto *SP = findEnclosingSubprogram(LS))
647 SPToEntities[SP].push_back(MD);
655 void upgradeCULocals() {
656 NamedMDNode *CUNodes = TheModule.getNamedMetadata(
"llvm.dbg.cu");
660 SPToEntitiesMap SPToEntities;
667 upgradeOneCULocalsList<DIGlobalVariableExpression>(SPToEntities,
CU, 6);
669 upgradeOneCULocalsList<DIImportedEntity>(SPToEntities,
CU, 7);
671 upgradeOneCULocalsList<DICompositeType>(SPToEntities,
CU, 4);
675 for (
auto &[SP, Nodes] : SPToEntities)
676 SP->retainNodes(Nodes.begin(), Nodes.end());
677 SPToEntities.clear();
680 ParentSubprogram.clear();
685 void upgradeDeclareExpressions(
Function &
F) {
686 if (!NeedDeclareExpressionUpgrade)
689 auto UpdateDeclareIfNeeded = [&](
auto *Declare) {
690 auto *DIExpr = Declare->getExpression();
691 if (!DIExpr || !DIExpr->startsWithDeref() ||
695 Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end());
702 if (DVR.isDbgDeclare())
703 UpdateDeclareIfNeeded(&DVR);
706 UpdateDeclareIfNeeded(DDI);
711 Error upgradeDIExpression(uint64_t FromVersion,
714 auto N = Expr.
size();
715 switch (FromVersion) {
717 return error(
"Invalid record");
719 if (
N >= 3 && Expr[
N - 3] == dwarf::DW_OP_bit_piece)
724 if (
N && Expr[0] == dwarf::DW_OP_deref) {
725 auto End = Expr.
end();
726 if (Expr.
size() >= 3 &&
728 End = std::prev(End, 3);
729 std::move(std::next(Expr.
begin()), End, Expr.
begin());
730 *std::prev(End) = dwarf::DW_OP_deref;
732 NeedDeclareExpressionUpgrade =
true;
738 while (!SubExpr.empty()) {
743 switch (SubExpr.front()) {
747 case dwarf::DW_OP_constu:
748 case dwarf::DW_OP_minus:
749 case dwarf::DW_OP_plus:
759 HistoricSize = std::min(SubExpr.size(), HistoricSize);
762 switch (SubExpr.front()) {
763 case dwarf::DW_OP_plus:
764 Buffer.
push_back(dwarf::DW_OP_plus_uconst);
765 Buffer.
append(Args.begin(), Args.end());
767 case dwarf::DW_OP_minus:
769 Buffer.
append(Args.begin(), Args.end());
774 Buffer.
append(Args.begin(), Args.end());
779 SubExpr = SubExpr.slice(HistoricSize);
797 enum class DebugInfoUpgradeMode {
806 void upgradeDebugInfo(DebugInfoUpgradeMode Mode) {
807 if (Mode == DebugInfoUpgradeMode::None)
809 upgradeCUSubprograms();
810 upgradeCUVariables();
811 if (Mode == DebugInfoUpgradeMode::ModuleLevel)
816 void resolveLoadedMetadata(PlaceholderQueue &Placeholders,
817 DebugInfoUpgradeMode DIUpgradeMode) {
818 resolveForwardRefsAndPlaceholders(Placeholders);
819 upgradeDebugInfo(DIUpgradeMode);
822 << NewDistinctSPs.size() <<
" subprogram(s).\n");
823 NewDistinctSPs.clear();
826 void callMDTypeCallback(
Metadata **Val,
unsigned TypeID);
832 : MetadataList(TheModule.
getContext(), Stream.SizeInBytes()),
833 ValueList(ValueList), Stream(Stream), Context(TheModule.
getContext()),
834 TheModule(TheModule), Callbacks(
std::
move(Callbacks)),
835 IsImporting(IsImporting) {}
839 bool hasFwdRefs()
const {
return MetadataList.hasFwdRefs(); }
842 if (ID < MDStringRef.size())
843 return lazyLoadOneMDString(ID);
844 if (
auto *MD = MetadataList.lookup(ID))
848 if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
849 PlaceholderQueue Placeholders;
850 lazyLoadOneMetadata(ID, Placeholders);
852 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
853 return MetadataList.lookup(ID);
855 return MetadataList.getMetadataFwdRef(ID);
859 return FunctionsWithSPs.lookup(
F);
867 if (
MDNode *Upgrade = UpgradedAliasScopes.lookup(ScopeList))
877 Ops.push_back(Scope);
883 UpgradedAliasScopes[ScopeList] = Upgrade;
895 unsigned size()
const {
return MetadataList.size(); }
901MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
902 IndexCursor = Stream;
904 GlobalDeclAttachmentPos = 0;
907 uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
915 switch (Entry.Kind) {
918 return error(
"Malformed block");
925 uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
927 if (
Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
932 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
933 return std::move(Err);
937 IndexCursor.readRecord(Entry.ID,
Record, &Blob))
940 return MaybeRecord.takeError();
941 unsigned NumStrings =
Record[0];
942 MDStringRef.reserve(NumStrings);
943 auto IndexNextMDString = [&](
StringRef Str) {
944 MDStringRef.push_back(Str);
946 if (
auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
947 return std::move(Err);
953 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
954 return std::move(Err);
956 if (Expected<unsigned> MaybeRecord =
957 IndexCursor.readRecord(
Entry.ID, Record))
960 return MaybeRecord.takeError();
962 return error(
"Invalid record");
964 auto BeginPos = IndexCursor.GetCurrentBitNo();
965 if (
Error Err = IndexCursor.JumpToBit(BeginPos +
Offset))
966 return std::move(Err);
967 Expected<BitstreamEntry> MaybeEntry =
968 IndexCursor.advanceSkippingSubblocks(
974 "Corrupted bitcode: Expected `Record` when trying to find the "
977 if (Expected<unsigned> MaybeCode =
978 IndexCursor.readRecord(
Entry.ID, Record))
980 "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
981 "find the Metadata index");
983 return MaybeCode.takeError();
985 auto CurrentValue = BeginPos;
986 GlobalMetadataBitPosIndex.reserve(
Record.size());
987 for (
auto &Elt : Record) {
989 GlobalMetadataBitPosIndex.push_back(CurrentValue);
996 return error(
"Corrupted Metadata block");
999 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
1000 return std::move(Err);
1004 if (Expected<unsigned> MaybeCode =
1005 IndexCursor.readRecord(
Entry.ID, Record)) {
1006 Code = MaybeCode.get();
1009 return MaybeCode.takeError();
1013 if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
1014 Code = MaybeCode.get();
1016 return MaybeCode.takeError();
1021 if (Expected<unsigned> MaybeNextBitCode =
1022 IndexCursor.readRecord(Code, Record))
1025 return MaybeNextBitCode.takeError();
1029 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1030 for (
unsigned i = 0; i !=
Size; ++i) {
1035 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1036 assert(MD &&
"Invalid metadata: expect fwd ref to MDNode");
1042 if (!GlobalDeclAttachmentPos)
1043 GlobalDeclAttachmentPos = SavedPos;
1045 NumGlobalDeclAttachSkipped++;
1089 MDStringRef.clear();
1090 GlobalMetadataBitPosIndex.clear();
1104Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
1106 if (!GlobalDeclAttachmentPos)
1110 BitstreamCursor TempCursor = Stream;
1111 SmallVector<uint64_t, 64>
Record;
1115 return std::move(Err);
1117 BitstreamEntry
Entry;
1122 return std::move(
E);
1124 switch (
Entry.Kind) {
1127 return error(
"Malformed block");
1130 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1142 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1146 NumGlobalDeclAttachParsed++;
1151 return std::move(Err);
1153 if (Expected<unsigned> MaybeRecord =
1157 return MaybeRecord.takeError();
1158 if (
Record.size() % 2 == 0)
1159 return error(
"Invalid record");
1160 unsigned ValueID =
Record[0];
1161 if (ValueID >= ValueList.size())
1162 return error(
"Invalid record");
1168 if (
Error Err = parseGlobalObjectAttachment(
1169 *GO, ArrayRef<uint64_t>(Record).slice(1)))
1170 return std::move(Err);
1172 return std::move(Err);
1177void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(
Metadata **Val,
1179 if (Callbacks.MDType) {
1180 (*Callbacks.MDType)(Val,
TypeID, Callbacks.GetTypeByID,
1181 Callbacks.GetContainedTypeID);
1189 if (!ModuleLevel && MetadataList.hasFwdRefs())
1190 return error(
"Invalid metadata: fwd refs into function blocks");
1194 auto EntryPos = Stream.GetCurrentBitNo();
1200 PlaceholderQueue Placeholders;
1201 auto DIUpgradeMode = ModuleLevel ? DebugInfoUpgradeMode::ModuleLevel
1202 : DebugInfoUpgradeMode::Partial;
1206 if (ModuleLevel && IsImporting && MetadataList.empty() &&
1208 auto SuccessOrErr = lazyLoadModuleMetadataBlock();
1210 return SuccessOrErr.takeError();
1211 if (SuccessOrErr.get()) {
1214 MetadataList.resize(MDStringRef.size() +
1215 GlobalMetadataBitPosIndex.size());
1220 SuccessOrErr = loadGlobalDeclAttachments();
1222 return SuccessOrErr.takeError();
1223 assert(SuccessOrErr.get());
1228 resolveLoadedMetadata(Placeholders, DIUpgradeMode);
1231 Stream.ReadBlockEnd();
1232 if (
Error Err = IndexCursor.JumpToBit(EntryPos))
1234 if (
Error Err = Stream.SkipBlock()) {
1245 unsigned NextMetadataNo = MetadataList.size();
1250 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1253 switch (Entry.Kind) {
1256 return error(
"Malformed block");
1259 resolveLoadedMetadata(Placeholders, DIUpgradeMode);
1269 ++NumMDRecordLoaded;
1271 Stream.readRecord(Entry.ID,
Record, &Blob)) {
1272 if (
Error Err = parseOneMetadata(
Record, MaybeCode.
get(), Placeholders,
1273 Blob, NextMetadataNo))
1280MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(
unsigned ID) {
1281 ++NumMDStringLoaded;
1282 if (
Metadata *MD = MetadataList.lookup(ID))
1285 MetadataList.assignValue(MDS, ID);
1289void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
1290 unsigned ID, PlaceholderQueue &Placeholders) {
1291 assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
1292 assert(ID >= MDStringRef.size() &&
"Unexpected lazy-loading of MDString");
1294 if (
auto *MD = MetadataList.lookup(ID)) {
1298 if (!
N || !
N->isTemporary())
1303 if (
Error Err = IndexCursor.JumpToBit(
1304 GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
1308 if (
Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
1312 ++NumMDRecordLoaded;
1314 IndexCursor.readRecord(Entry.ID,
Record, &Blob)) {
1316 parseOneMetadata(
Record, MaybeCode.
get(), Placeholders, Blob, ID))
1326void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
1327 PlaceholderQueue &Placeholders) {
1328 DenseSet<unsigned> Temporaries;
1331 Placeholders.getTemporaries(MetadataList, Temporaries);
1334 if (Temporaries.
empty() && !MetadataList.hasFwdRefs())
1339 for (
auto ID : Temporaries)
1340 lazyLoadOneMetadata(ID, Placeholders);
1341 Temporaries.clear();
1345 while (MetadataList.hasFwdRefs())
1346 lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
1351 MetadataList.tryToResolveCycles();
1355 Placeholders.flush(MetadataList);
1359 Type *Ty,
unsigned TyID) {
1371 if (Idx < ValueList.
size() && ValueList[Idx] &&
1372 ValueList[Idx]->getType() == Ty)
1378Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
1379 SmallVectorImpl<uint64_t> &Record,
unsigned Code,
1380 PlaceholderQueue &Placeholders, StringRef Blob,
unsigned &NextMetadataNo) {
1382 bool IsDistinct =
false;
1383 auto getMD = [&](
unsigned ID) ->
Metadata * {
1384 if (ID < MDStringRef.size())
1385 return lazyLoadOneMDString(ID);
1387 if (
auto *MD = MetadataList.lookup(ID))
1391 if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
1395 MetadataList.getMetadataFwdRef(NextMetadataNo);
1396 lazyLoadOneMetadata(ID, Placeholders);
1397 return MetadataList.lookup(ID);
1400 return MetadataList.getMetadataFwdRef(ID);
1402 if (
auto *MD = MetadataList.getMetadataIfResolved(ID))
1404 return &Placeholders.getPlaceholderOp(ID);
1406 auto getMDOrNull = [&](
unsigned ID) ->
Metadata * {
1408 return getMD(ID - 1);
1411 auto getMDString = [&](
unsigned ID) -> MDString * {
1414 auto MDS = getMDOrNull(ID);
1419 auto getDITypeRefOrNull = [&](
unsigned ID) {
1420 return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1423 auto getMetadataOrConstant = [&](
bool IsMetadata,
1426 return getMDOrNull(Entry);
1428 ConstantInt::get(Type::getInt64Ty(
Context), Entry));
1431#define GET_OR_DISTINCT(CLASS, ARGS) \
1432 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1441 if (
Error E = Stream.ReadCode().moveInto(Code))
1444 ++NumMDRecordLoaded;
1445 if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
1447 return error(
"METADATA_NAME not followed by METADATA_NAMED_NODE");
1449 return MaybeNextBitCode.takeError();
1453 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1454 for (
unsigned i = 0; i !=
Size; ++i) {
1455 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1457 return error(
"Invalid named metadata: expect fwd ref to MDNode");
1466 if (
Record.size() % 2 == 1)
1467 return error(
"Invalid record");
1471 auto dropRecord = [&] {
1475 if (
Record.size() != 2) {
1480 unsigned TyID =
Record[0];
1481 Type *Ty = Callbacks.GetTypeByID(TyID);
1487 Value *
V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
1490 return error(
"Invalid value reference from old fn metadata");
1498 if (
Record.size() % 2 == 1)
1499 return error(
"Invalid record");
1503 for (
unsigned i = 0; i !=
Size; i += 2) {
1504 unsigned TyID =
Record[i];
1505 Type *Ty = Callbacks.GetTypeByID(TyID);
1507 return error(
"Invalid record");
1513 return error(
"Invalid value reference from old metadata");
1516 "Expected non-function-local metadata");
1517 callMDTypeCallback(&MD, TyID);
1528 return error(
"Invalid record");
1530 unsigned TyID =
Record[0];
1531 Type *Ty = Callbacks.GetTypeByID(TyID);
1533 return error(
"Invalid record");
1537 return error(
"Invalid value reference from metadata");
1540 callMDTypeCallback(&MD, TyID);
1541 MetadataList.assignValue(MD, NextMetadataNo);
1551 for (
unsigned ID : Record)
1562 return error(
"Invalid record");
1566 unsigned Column =
Record[2];
1568 Metadata *InlinedAt = getMDOrNull(Record[4]);
1572 Metadata *IRLayers =
Record.size() >= 9 ? getMDOrNull(Record[8]) : nullptr;
1573 MetadataList.assignValue(
1575 (
Context, Line, Column, Scope, InlinedAt, ImplicitCode,
1576 AtomGroup, AtomRank, IRLayers)),
1583 return error(
"Invalid record");
1587 unsigned Column =
Record[2];
1592 MetadataList.assignValue(
1600 return error(
"Invalid record");
1604 for (
unsigned I = 1,
E =
Record.size();
I !=
E; ++
I)
1613 return error(
"Invalid record");
1620 return error(
"Invalid record");
1622 auto *Header = getMDString(Record[3]);
1624 for (
unsigned I = 4,
E =
Record.size();
I !=
E; ++
I)
1626 MetadataList.assignValue(
1642 switch (Record[0] >> 1) {
1653 DISubrange, (
Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1654 getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1657 return error(
"Invalid record: Unsupported version of DISubrange");
1660 MetadataList.assignValue(Val, NextMetadataNo);
1661 IsDistinct =
Record[0] & 1;
1668 (
Context, getMDOrNull(Record[1]),
1669 getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1670 getMDOrNull(Record[4])));
1672 MetadataList.assignValue(Val, NextMetadataNo);
1673 IsDistinct =
Record[0] & 1;
1679 return error(
"Invalid record");
1681 IsDistinct =
Record[0] & 1;
1682 bool IsUnsigned =
Record[0] & 2;
1683 bool IsBigInt =
Record[0] & 4;
1688 const size_t NumWords =
Record.size() - 3;
1693 MetadataList.assignValue(
1702 return error(
"Invalid record");
1704 IsDistinct =
Record[0] & 1;
1705 bool SizeIsMetadata =
Record[0] & 2;
1709 uint32_t NumExtraInhabitants = (
Record.size() > 7) ?
Record[7] : 0;
1710 uint32_t DataSizeInBits = (
Record.size() > 8) ?
Record[8] : 0;
1711 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1713 unsigned LineNo = 0;
1716 File = getMDOrNull(Record[9]);
1718 Scope = getMDOrNull(Record[11]);
1720 MetadataList.assignValue(
1722 (
Context, Record[1], getMDString(Record[2]), File,
1723 LineNo, Scope, SizeInBits, Record[4], Record[5],
1724 NumExtraInhabitants, DataSizeInBits, Flags)),
1731 return error(
"Invalid record");
1733 IsDistinct =
Record[0] & 1;
1734 bool SizeIsMetadata =
Record[0] & 2;
1737 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1741 auto ReadWideInt = [&]() {
1743 unsigned NumWords =
Encoded >> 32;
1750 APInt Numerator = ReadWideInt();
1751 APInt Denominator = ReadWideInt();
1754 unsigned LineNo = 0;
1762 return error(
"Invalid record");
1764 MetadataList.assignValue(
1766 (
Context, Record[1], getMDString(Record[2]), File,
1767 LineNo, Scope, SizeInBits, Record[4], Record[5], Flags,
1768 Record[7], Record[8], Numerator, Denominator)),
1775 return error(
"Invalid record");
1777 IsDistinct =
Record[0] & 1;
1778 bool SizeIsMetadata =
Record[0] & 2;
1783 Metadata *StringLocationExp =
nullptr;
1786 bool StringLocPresent =
Record.size() > 8;
1787 size_t SizeOffset = StringLocPresent ? 6 : 5;
1790 getMetadataOrConstant(SizeIsMetadata, Record[SizeOffset]);
1791 if (StringLocPresent) {
1792 StringLocationExp = getMDOrNull(Record[5]);
1794 if (
Record.size() == 10) {
1795 CharType = getMDOrNull(Record[9]);
1798 MetadataList.assignValue(
1800 (
Context, Record[1], getMDString(Record[2]),
1801 getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1802 StringLocationExp, SizeInBits, Record[SizeOffset + 1],
1803 Record[SizeOffset + 2], CharType)),
1810 return error(
"Invalid record");
1814 std::optional<unsigned> DWARFAddressSpace;
1815 if (
Record.size() > 12 && Record[12])
1816 DWARFAddressSpace =
Record[12] - 1;
1819 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
1824 if (
Record.size() > 14) {
1826 Annotations = getMDOrNull(Record[13]);
1828 PtrAuthData.emplace(Record[14]);
1831 IsDistinct =
Record[0] & 1;
1832 bool SizeIsMetadata =
Record[0] & 2;
1835 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1836 Metadata *OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1838 MetadataList.assignValue(
1840 (
Context, Record[1], getMDString(Record[2]),
1841 getMDOrNull(Record[3]), Record[4],
1842 getDITypeRefOrNull(Record[5]),
1843 getDITypeRefOrNull(Record[6]), SizeInBits, Record[8],
1844 OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags,
1845 getDITypeRefOrNull(Record[11]), Annotations)),
1852 return error(
"Invalid record");
1854 IsDistinct =
Record[0] & 1;
1855 bool SizeIsMetadata =
Record[0] & 2;
1858 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[5]);
1860 MetadataList.assignValue(
1862 (
Context, getMDString(Record[1]),
1863 getMDOrNull(Record[2]), Record[3],
1864 getMDOrNull(Record[4]), SizeInBits, Record[6], Flags,
1865 getDITypeRefOrNull(Record[8]), getMDOrNull(Record[9]),
1866 getMDOrNull(Record[10]), getMDOrNull(Record[11]),
1867 getMDOrNull(Record[12]))),
1874 return error(
"Invalid record");
1878 IsDistinct =
Record[0] & 0x1;
1879 bool IsNotUsedInTypeRef =
Record[0] & 2;
1880 bool SizeIsMetadata =
Record[0] & 4;
1882 MDString *
Name = getMDString(Record[2]);
1887 if (Record[8] > (
uint64_t)std::numeric_limits<uint32_t>::max())
1888 return error(
"Alignment value is too large");
1889 uint32_t AlignInBits =
Record[8];
1891 uint32_t NumExtraInhabitants = (
Record.size() > 22) ?
Record[22] : 0;
1894 unsigned RuntimeLang =
Record[12];
1895 std::optional<uint32_t> EnumKind;
1898 Metadata *TemplateParams =
nullptr;
1923 (
Tag == dwarf::DW_TAG_enumeration_type ||
1924 Tag == dwarf::DW_TAG_class_type ||
1925 Tag == dwarf::DW_TAG_structure_type ||
1926 Tag == dwarf::DW_TAG_union_type)) {
1932 StringRef NameStr =
Name->getString();
1934 TemplateParams = getMDOrNull(Record[14]);
1936 BaseType = getDITypeRefOrNull(Record[6]);
1938 OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1940 Elements = getMDOrNull(Record[11]);
1941 VTableHolder = getDITypeRefOrNull(Record[13]);
1942 TemplateParams = getMDOrNull(Record[14]);
1946 DataLocation = getMDOrNull(Record[17]);
1947 if (
Record.size() > 19) {
1948 Associated = getMDOrNull(Record[18]);
1949 Allocated = getMDOrNull(Record[19]);
1951 if (
Record.size() > 20) {
1952 Rank = getMDOrNull(Record[20]);
1954 if (
Record.size() > 21) {
1955 Annotations = getMDOrNull(Record[21]);
1957 if (
Record.size() > 23) {
1958 Specification = getMDOrNull(Record[23]);
1961 BitStride = getMDOrNull(Record[25]);
1967 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1969 DICompositeType *CT =
nullptr;
1973 SizeInBits, AlignInBits, OffsetInBits, Specification,
1974 NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind,
1975 VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
1976 Allocated, Rank, Annotations, BitStride);
1983 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, EnumKind,
1984 VTableHolder, TemplateParams, Identifier, Discriminator,
1985 DataLocation, Associated, Allocated, Rank, Annotations,
1986 Specification, NumExtraInhabitants, BitStride));
1987 if (!IsNotUsedInTypeRef && Identifier)
1990 MetadataList.assignValue(CT, NextMetadataNo);
1996 return error(
"Invalid record");
1997 bool IsOldTypeArray =
Record[0] < 2;
2000 IsDistinct =
Record[0] & 0x1;
2004 Types = MetadataList.upgradeTypeArray(Types);
2006 MetadataList.assignValue(
2015 return error(
"Invalid record");
2019 MetadataList.assignValue(
2022 (
Context,
Record.size() >= 8 ? getMDOrNull(Record[1]) :
nullptr,
2023 getMDOrNull(Record[0 +
Offset]), getMDString(Record[1 +
Offset]),
2024 getMDString(Record[2 +
Offset]), getMDString(Record[3 +
Offset]),
2025 getMDString(Record[4 +
Offset]),
2026 Record.size() <= 7 ? 0 : Record[7],
2027 Record.size() <= 8 ?
false : Record[8])),
2035 return error(
"Invalid record");
2038 std::optional<DIFile::ChecksumInfo<MDString *>> Checksum;
2044 if (
Record.size() > 4 && Record[3] && Record[4])
2046 getMDString(Record[4]));
2047 MetadataList.assignValue(
2049 (
Context, getMDString(Record[1]),
2050 getMDString(Record[2]), Checksum,
2051 Record.size() > 5 ? getMDString(Record[5]) :
nullptr)),
2058 return error(
"Invalid record");
2064 const auto LangVersionMask = (
uint64_t(1) << 63);
2065 const bool HasVersionedLanguage =
Record[1] & LangVersionMask;
2072 if (
Record.size() > 23 &&
2074 return error(
"Invalid DICompileUnit dialect value");
2075 const uint16_t Dialect =
2076 Record.size() > 23 ?
static_cast<uint16_t
>(
Record[23]) : uint16_t(0);
2078 auto *CU = DICompileUnit::getDistinct(
2080 HasVersionedLanguage
2081 ? DISourceLanguageName(Record[1] & ~LangVersionMask,
2082 LanguageVersion, Dialect)
2083 : DISourceLanguageName(Record[1], Dialect),
2084 getMDOrNull(Record[2]), getMDString(Record[3]), Record[4],
2085 getMDString(Record[5]), Record[6], getMDString(Record[7]), Record[8],
2086 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2087 getMDOrNull(Record[12]), getMDOrNull(Record[13]),
2088 Record.size() <= 15 ?
nullptr : getMDOrNull(Record[15]),
2089 Record.size() <= 14 ? 0 : Record[14],
2090 Record.size() <= 16 ?
true : Record[16],
2091 Record.size() <= 17 ?
false : Record[17],
2092 Record.size() <= 18 ? 0 : Record[18],
2093 Record.size() <= 19 ?
false : Record[19],
2098 Record.size() <= 20 ?
nullptr : getMDString(Record[20]),
2099 Record.size() <= 21 ?
nullptr : getMDString(Record[21]));
2101 MetadataList.assignValue(CU, NextMetadataNo);
2106 CUSubprograms.push_back({CU,
Record[11]});
2111 return error(
"Invalid record");
2113 bool HasSPFlags =
Record[0] & 4;
2126 const unsigned DIFlagMainSubprogram = 1 << 21;
2127 bool HasOldMainSubprogramFlag =
Flags & DIFlagMainSubprogram;
2128 if (HasOldMainSubprogramFlag)
2132 Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
2134 if (HasOldMainSubprogramFlag && HasSPFlags)
2135 SPFlags |= DISubprogram::SPFlagMainSubprogram;
2136 else if (!HasSPFlags)
2138 Record[7], Record[8],
2139 Record[14], Record[11],
2140 HasOldMainSubprogramFlag);
2143 IsDistinct = (
Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
2149 bool HasUnit =
Record[0] & 2;
2150 if (!HasSPFlags && HasUnit &&
Record.size() < 19)
2151 return error(
"Invalid record");
2152 if (HasSPFlags && !HasUnit)
2153 return error(
"Invalid record");
2156 bool HasThisAdj =
true;
2157 bool HasThrownTypes =
true;
2158 bool HasAnnotations =
false;
2159 bool HasTargetFuncName =
false;
2160 unsigned OffsetA = 0;
2161 unsigned OffsetB = 0;
2164 bool UsesKeyInstructions =
false;
2168 if (
Record.size() >= 19) {
2172 HasThisAdj =
Record.size() >= 20;
2173 HasThrownTypes =
Record.size() >= 21;
2175 HasAnnotations =
Record.size() >= 19;
2176 HasTargetFuncName =
Record.size() >= 20;
2177 UsesKeyInstructions =
Record.size() >= 21 ?
Record[20] : 0;
2180 Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
2184 getDITypeRefOrNull(Record[1]),
2185 getMDString(Record[2]),
2186 getMDString(Record[3]),
2187 getMDOrNull(Record[4]),
2189 getMDOrNull(Record[6]),
2190 Record[7 + OffsetA],
2191 getDITypeRefOrNull(Record[8 + OffsetA]),
2192 Record[10 + OffsetA],
2193 HasThisAdj ? Record[16 + OffsetB] : 0,
2196 HasUnit ? CUorFn :
nullptr,
2197 getMDOrNull(Record[13 + OffsetB]),
2198 getMDOrNull(Record[14 + OffsetB]),
2199 getMDOrNull(Record[15 + OffsetB]),
2200 HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
2202 HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
2204 HasTargetFuncName ? getMDString(Record[19 + OffsetB])
2206 UsesKeyInstructions));
2207 MetadataList.assignValue(SP, NextMetadataNo);
2211 NewDistinctSPs.push_back(SP);
2217 if (
F->isMaterializable())
2220 FunctionsWithSPs[
F] =
SP;
2221 else if (!
F->empty())
2222 F->setSubprogram(SP);
2229 return error(
"Invalid record");
2232 MetadataList.assignValue(
2234 (
Context, getMDOrNull(Record[1]),
2235 getMDOrNull(Record[2]), Record[3], Record[4])),
2242 return error(
"Invalid record");
2245 MetadataList.assignValue(
2247 (
Context, getMDOrNull(Record[1]),
2248 getMDOrNull(Record[2]), Record[3])),
2254 IsDistinct =
Record[0] & 1;
2255 MetadataList.assignValue(
2257 (
Context, getMDOrNull(Record[1]),
2258 getMDOrNull(Record[2]), getMDString(Record[3]),
2259 getMDOrNull(Record[4]), Record[5])),
2268 Name = getMDString(Record[2]);
2269 else if (
Record.size() == 5)
2270 Name = getMDString(Record[3]);
2272 return error(
"Invalid record");
2274 IsDistinct =
Record[0] & 1;
2275 bool ExportSymbols =
Record[0] & 2;
2276 MetadataList.assignValue(
2278 (
Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
2285 return error(
"Invalid record");
2288 MetadataList.assignValue(
2290 (
Context, Record[1], Record[2], getMDString(Record[3]),
2291 getMDString(Record[4]))),
2298 return error(
"Invalid record");
2301 MetadataList.assignValue(
2303 (
Context, Record[1], Record[2], getMDOrNull(Record[3]),
2304 getMDOrNull(Record[4]))),
2311 return error(
"Invalid record");
2314 MetadataList.assignValue(
2316 (
Context, getMDString(Record[1]),
2317 getDITypeRefOrNull(Record[2]),
2318 (
Record.size() == 4) ? getMDOrNull(Record[3])
2319 : getMDOrNull(
false))),
2326 return error(
"Invalid record");
2330 MetadataList.assignValue(
2332 DITemplateValueParameter,
2333 (
Context, Record[1], getMDString(Record[2]),
2334 getDITypeRefOrNull(Record[3]),
2335 (
Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(
false),
2336 (
Record.size() == 6) ? getMDOrNull(Record[5])
2337 : getMDOrNull(Record[4]))),
2344 return error(
"Invalid record");
2346 IsDistinct =
Record[0] & 1;
2352 Annotations = getMDOrNull(Record[12]);
2354 MetadataList.assignValue(
2356 (
Context, getMDOrNull(Record[1]),
2357 getMDString(Record[2]), getMDString(Record[3]),
2358 getMDOrNull(Record[4]), Record[5],
2359 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2360 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2361 Record[11], Annotations)),
2368 MetadataList.assignValue(
2371 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2372 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2373 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2374 getMDOrNull(Record[10]),
nullptr, Record[11],
nullptr)),
2381 NeedUpgradeToDIGlobalVariableExpression =
true;
2382 Metadata *Expr = getMDOrNull(Record[9]);
2383 uint32_t AlignInBits = 0;
2384 if (
Record.size() > 11) {
2385 if (Record[11] > (
uint64_t)std::numeric_limits<uint32_t>::max())
2386 return error(
"Alignment value is too large");
2387 AlignInBits =
Record[11];
2389 GlobalVariable *Attach =
nullptr;
2395 Expr = DIExpression::get(
Context,
2396 {dwarf::DW_OP_constu, CI->getZExtValue(),
2397 dwarf::DW_OP_stack_value});
2404 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2405 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2406 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2407 getMDOrNull(Record[10]),
nullptr, AlignInBits,
nullptr));
2409 DIGlobalVariableExpression *&DGVE = GlobalVariableExpression[DGV];
2410 if (Attach || Expr) {
2412 DGVE = DIGlobalVariableExpression::getDistinct(
2420 MetadataList.assignValue(MDNode, NextMetadataNo);
2423 return error(
"Invalid record");
2429 return error(
"Invalid DIAssignID record.");
2431 IsDistinct =
Record[0] & 1;
2433 return error(
"Invalid DIAssignID record. Must be distinct");
2442 return error(
"Invalid record");
2444 IsDistinct =
Record[0] & 1;
2445 bool HasAlignment =
Record[0] & 2;
2449 bool HasTag = !HasAlignment &&
Record.size() > 8;
2451 uint32_t AlignInBits = 0;
2454 if (Record[8] > (
uint64_t)std::numeric_limits<uint32_t>::max())
2455 return error(
"Alignment value is too large");
2458 Annotations = getMDOrNull(Record[9]);
2461 MetadataList.assignValue(
2463 (
Context, getMDOrNull(Record[1 + HasTag]),
2464 getMDString(Record[2 + HasTag]),
2465 getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
2466 getDITypeRefOrNull(Record[5 + HasTag]),
2467 Record[6 + HasTag], Flags, AlignInBits, Annotations)),
2474 return error(
"Invalid record");
2476 IsDistinct =
Record[0] & 1;
2479 bool IsArtificial =
Record[0] & 2;
2480 std::optional<unsigned> CoroSuspendIdx;
2483 if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) {
2484 if (RawSuspendIdx > (
uint64_t)std::numeric_limits<unsigned>::max())
2485 return error(
"CoroSuspendIdx value is too large");
2486 CoroSuspendIdx = RawSuspendIdx;
2490 MetadataList.assignValue(
2492 (
Context, getMDOrNull(Record[1]),
2493 getMDString(Record[2]), getMDOrNull(Record[3]), Line,
2494 Column, IsArtificial, CoroSuspendIdx)),
2501 return error(
"Invalid record");
2503 IsDistinct =
Record[0] & 1;
2508 if (
Error Err = upgradeDIExpression(
Version, Elts, Buffer))
2518 return error(
"Invalid record");
2521 Metadata *Expr = getMDOrNull(Record[2]);
2523 Expr = DIExpression::get(
Context, {});
2524 MetadataList.assignValue(
2526 (
Context, getMDOrNull(Record[1]), Expr)),
2533 return error(
"Invalid record");
2536 MetadataList.assignValue(
2538 (
Context, getMDString(Record[1]),
2539 getMDOrNull(Record[2]), Record[3],
2540 getMDString(Record[5]),
2541 getMDString(Record[4]), Record[6],
2542 getDITypeRefOrNull(Record[7]))),
2549 return error(
"Invalid record");
2552 MetadataList.assignValue(
2554 getMDOrNull(Record[2]), Record[3],
2555 getDITypeRefOrNull(Record[4]),
2556 getMDOrNull(Record[5]))),
2563 return error(
"Invalid DIImportedEntity record");
2566 bool HasFile = (
Record.size() >= 7);
2567 bool HasElements = (
Record.size() >= 8);
2568 MetadataList.assignValue(
2570 (
Context, Record[1], getMDOrNull(Record[2]),
2571 getDITypeRefOrNull(Record[3]),
2572 HasFile ? getMDOrNull(Record[6]) :
nullptr,
2573 HasFile ? Record[4] : 0, getMDString(Record[5]),
2574 HasElements ? getMDOrNull(Record[7]) :
nullptr)),
2584 ++NumMDStringLoaded;
2586 MetadataList.assignValue(MD, NextMetadataNo);
2591 auto CreateNextMDString = [&](StringRef Str) {
2595 ++NumMDStringLoaded;
2599 if (
Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2604 if (
Record.size() % 2 == 0)
2605 return error(
"Invalid record");
2606 unsigned ValueID =
Record[0];
2607 if (ValueID >= ValueList.size())
2608 return error(
"Invalid record");
2610 if (
Error Err = parseGlobalObjectAttachment(
2611 *GO, ArrayRef<uint64_t>(Record).slice(1)))
2618 if (
Error Err = parseMetadataKindRecord(Record))
2629 "Invalid record: DIArgList should not contain forward refs");
2631 return error(
"Invalid record");
2641#undef GET_OR_DISTINCT
2644Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
2645 ArrayRef<uint64_t> Record, StringRef Blob,
2646 function_ref<
void(StringRef)> CallBack) {
2651 return error(
"Invalid record: metadata strings layout");
2653 unsigned NumStrings =
Record[0];
2654 unsigned StringsOffset =
Record[1];
2656 return error(
"Invalid record: metadata strings with no strings");
2657 if (StringsOffset > Blob.
size())
2658 return error(
"Invalid record: metadata strings corrupt offset");
2660 StringRef Lengths = Blob.
slice(0, StringsOffset);
2661 SimpleBitstreamCursor
R(Lengths);
2663 StringRef Strings = Blob.
drop_front(StringsOffset);
2665 if (
R.AtEndOfStream())
2666 return error(
"Invalid record: metadata strings bad length");
2672 return error(
"Invalid record: metadata strings truncated chars");
2676 }
while (--NumStrings);
2681Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2682 GlobalObject &GO, ArrayRef<uint64_t> Record) {
2684 for (
unsigned I = 0,
E =
Record.size();
I !=
E;
I += 2) {
2685 auto K = MDKindMap.find(Record[
I]);
2686 if (K == MDKindMap.end())
2687 return error(
"Invalid ID");
2691 return error(
"Invalid metadata attachment: expect fwd ref to MDNode");
2704 PlaceholderQueue Placeholders;
2708 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2711 switch (Entry.Kind) {
2714 return error(
"Malformed block");
2717 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2726 ++NumMDRecordLoaded;
2730 switch (MaybeRecord.
get()) {
2734 unsigned RecordLength =
Record.size();
2736 return error(
"Invalid record");
2737 if (RecordLength % 2 == 0) {
2739 if (
Error Err = parseGlobalObjectAttachment(
F,
Record))
2746 for (
unsigned i = 1; i != RecordLength; i = i + 2) {
2747 unsigned Kind =
Record[i];
2748 auto I = MDKindMap.find(Kind);
2749 if (
I == MDKindMap.end())
2750 return error(
"Invalid ID");
2751 if (
I->second == LLVMContext::MD_tbaa && StripTBAA)
2754 auto Idx =
Record[i + 1];
2755 if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2756 !MetadataList.lookup(Idx)) {
2759 lazyLoadOneMetadata(Idx, Placeholders);
2761 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2771 return error(
"Invalid metadata attachment");
2773 if (HasSeenOldLoopTags &&
I->second == LLVMContext::MD_loop)
2776 if (
I->second == LLVMContext::MD_tbaa) {
2779 }
else if (
I->second == LLVMContext::MD_tbaa_struct) {
2784 if (
I->second == LLVMContext::MD_alias_scope ||
2785 I->second == LLVMContext::MD_noalias)
2797Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2800 return error(
"Invalid record");
2802 unsigned Kind =
Record[0];
2805 unsigned NewKind = TheModule.getMDKindID(Name.str());
2806 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2807 return error(
"Conflicting METADATA_KIND records");
2821 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2824 switch (Entry.Kind) {
2827 return error(
"Malformed block");
2837 ++NumMDRecordLoaded;
2841 switch (MaybeCode.
get()) {
2854 Pimpl = std::move(RHS.Pimpl);
2858 : Pimpl(
std::
move(RHS.Pimpl)) {}
2866 Stream, TheModule, ValueList,
std::
move(Callbacks), IsImporting)) {}
2868Error MetadataLoader::parseMetadata(
bool ModuleLevel) {
2869 return Pimpl->parseMetadata(ModuleLevel);
2877 return Pimpl->getMetadataFwdRefOrLoad(Idx);
2881 return Pimpl->lookupSubprogramForFunction(
F);
2886 return Pimpl->parseMetadataAttachment(
F, InstructionList);
2890 return Pimpl->parseMetadataKinds();
2894 return Pimpl->setStripTBAA(StripTBAA);
2903 return Pimpl->upgradeDebugIntrinsics(
F);
2907 return Pimpl->upgradeAliasScopeList(ScopeList);
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_UNLIKELY(EXPR)
#define LLVM_LIKELY(EXPR)
This file contains the declarations for the subclasses of Constant, which represent the different fla...
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
static bool lookup(const GsymReader &GR, GsymDataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define GET_OR_DISTINCT(CLASS, ARGS)
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
static bool parseMetadata(const StringRef &Input, uint64_t &FunctionHash, uint32_t &Attributes)
Parse Input that contains metadata.
This file defines the SmallString class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
std::pair< llvm::MachO::Target, std::string > UUID
Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
Get the array size.
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
@ AF_DontPopBlockAtEnd
If this flag is used, the advance() method does not automatically pop the block scope when the end of...
static LLVM_ABI ConstantInt * getFalse(LLVMContext &Context)
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
MDString * getRawIdentifier() const
ChecksumKind
Which algorithm (e.g.
A pair of DIGlobalVariable and DIExpression.
LLVM_ABI DIScope * getScope() const
Subprogram description. Uses SubclassData1.
LLVM_ABI void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
DISPFlags
Debug info subprogram flags.
bool isForwardDecl() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
ValueT lookup(const_arg_type_t< KeyT > Val) const
Return the entry for the specified key, or a default constructed value if no such entry exists.
Implements a dense probed hash-table based set.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
reference get()
Returns a reference to the stored T value.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
This is an important class for using LLVM in a threaded context.
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
ArrayRef< MDOperand > operands() const
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
LLVMContext & getContext() const
Tracking metadata reference owned by Metadata.
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
A Module instance is used to store all the information related to an LLVM module.
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
iterator_range< op_iterator > operands()
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Implements a dense probed hash-table based set with some number of buckets stored inline.
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
constexpr size_t size() const
Get the string size.
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
The instances of the Type class are immutable: once they are created, they are never changed.
bool isVoidTy() const
Return true if this is 'void'.
bool isMetadataTy() const
Return true if this is 'metadata'.
LLVM Value Representation.
std::pair< iterator, bool > insert(const ValueT &V)
An efficient, type-erasing, non-owning reference to a callable.
constexpr char LanguageVersion[]
Key for Kernel::Metadata::mLanguageVersion.
@ METADATA_TEMPLATE_VALUE
@ METADATA_LEXICAL_BLOCK_FILE
@ METADATA_SUBROUTINE_TYPE
@ METADATA_GLOBAL_DECL_ATTACHMENT
@ METADATA_IMPORTED_ENTITY
@ METADATA_GENERIC_SUBRANGE
@ METADATA_COMPOSITE_TYPE
@ METADATA_FIXED_POINT_TYPE
@ METADATA_GLOBAL_VAR_EXPR
initializer< Ty > init(const Ty &Val)
@ DW_LLVM_LANG_DIALECT_max
@ DW_OP_LLVM_fragment
Only used in LLVM metadata.
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
Scope
Defines the scope in which this symbol should be visible: Default – Visible in the public interface o...
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
NodeAddr< CodeNode * > Code
LLVM_ABI Instruction & back() const
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
auto cast_if_present(const Y &Val)
cast_if_present<X> - Functionally identical to cast, except that a null value is accepted.
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
std::error_code make_error_code(BitcodeError E)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
constexpr NextUseDistance min(NextUseDistance A, NextUseDistance B)
LLVM_ABI MDNode * upgradeInstructionLoopAttachment(MDNode &N)
Upgrade the loop attachment metadata node.
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 ...
auto cast_or_null(const Y &Val)
bool isa_and_nonnull(const Y &Val)
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
static const DIScope * getScope(const NodeT *N)
auto dyn_cast_or_null(const Y &Val)
bool mayBeOldLoopAttachmentTag(StringRef Name)
Check whether a string looks like an old loop attachment tag.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
LLVM_ABI MDNode * UpgradeTBAAStructNode(MDNode &TBAAStructNode)
If the given !tbaa.struct node has old-style scalar field tags, return an equivalent node with each f...
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...
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
@ Ref
The access may reference the value stored in memory.
constexpr NextUseDistance max(NextUseDistance A, NextUseDistance B)
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)
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
void consumeError(Error Err)
Consume a Error without doing anything.
Implement std::hash so that hash_code can be used in STL containers.
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...