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 MetadataList.assignValue(
1574 ImplicitCode, AtomGroup, AtomRank)),
1581 return error(
"Invalid record");
1588 return error(
"Invalid record");
1590 auto *Header = getMDString(Record[3]);
1592 for (
unsigned I = 4,
E =
Record.size();
I !=
E; ++
I)
1594 MetadataList.assignValue(
1610 switch (Record[0] >> 1) {
1621 DISubrange, (
Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1622 getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1625 return error(
"Invalid record: Unsupported version of DISubrange");
1628 MetadataList.assignValue(Val, NextMetadataNo);
1629 IsDistinct =
Record[0] & 1;
1636 (
Context, getMDOrNull(Record[1]),
1637 getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1638 getMDOrNull(Record[4])));
1640 MetadataList.assignValue(Val, NextMetadataNo);
1641 IsDistinct =
Record[0] & 1;
1647 return error(
"Invalid record");
1649 IsDistinct =
Record[0] & 1;
1650 bool IsUnsigned =
Record[0] & 2;
1651 bool IsBigInt =
Record[0] & 4;
1656 const size_t NumWords =
Record.size() - 3;
1661 MetadataList.assignValue(
1670 return error(
"Invalid record");
1672 IsDistinct =
Record[0] & 1;
1673 bool SizeIsMetadata =
Record[0] & 2;
1677 uint32_t NumExtraInhabitants = (
Record.size() > 7) ?
Record[7] : 0;
1678 uint32_t DataSizeInBits = (
Record.size() > 8) ?
Record[8] : 0;
1679 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1681 unsigned LineNo = 0;
1684 File = getMDOrNull(Record[9]);
1686 Scope = getMDOrNull(Record[11]);
1688 MetadataList.assignValue(
1690 (
Context, Record[1], getMDString(Record[2]), File,
1691 LineNo, Scope, SizeInBits, Record[4], Record[5],
1692 NumExtraInhabitants, DataSizeInBits, Flags)),
1699 return error(
"Invalid record");
1701 IsDistinct =
Record[0] & 1;
1702 bool SizeIsMetadata =
Record[0] & 2;
1705 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1709 auto ReadWideInt = [&]() {
1711 unsigned NumWords =
Encoded >> 32;
1718 APInt Numerator = ReadWideInt();
1719 APInt Denominator = ReadWideInt();
1722 unsigned LineNo = 0;
1730 return error(
"Invalid record");
1732 MetadataList.assignValue(
1734 (
Context, Record[1], getMDString(Record[2]), File,
1735 LineNo, Scope, SizeInBits, Record[4], Record[5], Flags,
1736 Record[7], Record[8], Numerator, Denominator)),
1743 return error(
"Invalid record");
1745 IsDistinct =
Record[0] & 1;
1746 bool SizeIsMetadata =
Record[0] & 2;
1747 bool SizeIs8 =
Record.size() == 8;
1750 Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
1751 unsigned Offset = SizeIs8 ? 5 : 6;
1753 getMetadataOrConstant(SizeIsMetadata, Record[
Offset]);
1755 MetadataList.assignValue(
1757 (
Context, Record[1], getMDString(Record[2]),
1758 getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1759 StringLocationExp, SizeInBits, Record[
Offset + 1],
1767 return error(
"Invalid record");
1771 std::optional<unsigned> DWARFAddressSpace;
1772 if (
Record.size() > 12 && Record[12])
1773 DWARFAddressSpace =
Record[12] - 1;
1776 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
1781 if (
Record.size() > 14) {
1783 Annotations = getMDOrNull(Record[13]);
1785 PtrAuthData.emplace(Record[14]);
1788 IsDistinct =
Record[0] & 1;
1789 bool SizeIsMetadata =
Record[0] & 2;
1792 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1793 Metadata *OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1795 MetadataList.assignValue(
1797 (
Context, Record[1], getMDString(Record[2]),
1798 getMDOrNull(Record[3]), Record[4],
1799 getDITypeRefOrNull(Record[5]),
1800 getDITypeRefOrNull(Record[6]), SizeInBits, Record[8],
1801 OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags,
1802 getDITypeRefOrNull(Record[11]), Annotations)),
1809 return error(
"Invalid record");
1811 IsDistinct =
Record[0] & 1;
1812 bool SizeIsMetadata =
Record[0] & 2;
1815 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[5]);
1817 MetadataList.assignValue(
1819 (
Context, getMDString(Record[1]),
1820 getMDOrNull(Record[2]), Record[3],
1821 getMDOrNull(Record[4]), SizeInBits, Record[6], Flags,
1822 getDITypeRefOrNull(Record[8]), getMDOrNull(Record[9]),
1823 getMDOrNull(Record[10]), getMDOrNull(Record[11]),
1824 getMDOrNull(Record[12]))),
1831 return error(
"Invalid record");
1835 IsDistinct =
Record[0] & 0x1;
1836 bool IsNotUsedInTypeRef =
Record[0] & 2;
1837 bool SizeIsMetadata =
Record[0] & 4;
1839 MDString *
Name = getMDString(Record[2]);
1844 if (Record[8] > (
uint64_t)std::numeric_limits<uint32_t>::max())
1845 return error(
"Alignment value is too large");
1846 uint32_t AlignInBits =
Record[8];
1848 uint32_t NumExtraInhabitants = (
Record.size() > 22) ?
Record[22] : 0;
1851 unsigned RuntimeLang =
Record[12];
1852 std::optional<uint32_t> EnumKind;
1855 Metadata *TemplateParams =
nullptr;
1880 (
Tag == dwarf::DW_TAG_enumeration_type ||
1881 Tag == dwarf::DW_TAG_class_type ||
1882 Tag == dwarf::DW_TAG_structure_type ||
1883 Tag == dwarf::DW_TAG_union_type)) {
1889 StringRef NameStr =
Name->getString();
1891 TemplateParams = getMDOrNull(Record[14]);
1893 BaseType = getDITypeRefOrNull(Record[6]);
1895 OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1897 Elements = getMDOrNull(Record[11]);
1898 VTableHolder = getDITypeRefOrNull(Record[13]);
1899 TemplateParams = getMDOrNull(Record[14]);
1903 DataLocation = getMDOrNull(Record[17]);
1904 if (
Record.size() > 19) {
1905 Associated = getMDOrNull(Record[18]);
1906 Allocated = getMDOrNull(Record[19]);
1908 if (
Record.size() > 20) {
1909 Rank = getMDOrNull(Record[20]);
1911 if (
Record.size() > 21) {
1912 Annotations = getMDOrNull(Record[21]);
1914 if (
Record.size() > 23) {
1915 Specification = getMDOrNull(Record[23]);
1918 BitStride = getMDOrNull(Record[25]);
1924 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1926 DICompositeType *CT =
nullptr;
1930 SizeInBits, AlignInBits, OffsetInBits, Specification,
1931 NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind,
1932 VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
1933 Allocated, Rank, Annotations, BitStride);
1940 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, EnumKind,
1941 VTableHolder, TemplateParams, Identifier, Discriminator,
1942 DataLocation, Associated, Allocated, Rank, Annotations,
1943 Specification, NumExtraInhabitants, BitStride));
1944 if (!IsNotUsedInTypeRef && Identifier)
1947 MetadataList.assignValue(CT, NextMetadataNo);
1953 return error(
"Invalid record");
1954 bool IsOldTypeArray =
Record[0] < 2;
1957 IsDistinct =
Record[0] & 0x1;
1961 Types = MetadataList.upgradeTypeArray(Types);
1963 MetadataList.assignValue(
1972 return error(
"Invalid record");
1976 MetadataList.assignValue(
1979 (
Context,
Record.size() >= 8 ? getMDOrNull(Record[1]) :
nullptr,
1980 getMDOrNull(Record[0 +
Offset]), getMDString(Record[1 +
Offset]),
1981 getMDString(Record[2 +
Offset]), getMDString(Record[3 +
Offset]),
1982 getMDString(Record[4 +
Offset]),
1983 Record.size() <= 7 ? 0 : Record[7],
1984 Record.size() <= 8 ?
false : Record[8])),
1992 return error(
"Invalid record");
1995 std::optional<DIFile::ChecksumInfo<MDString *>> Checksum;
2001 if (
Record.size() > 4 && Record[3] && Record[4])
2003 getMDString(Record[4]));
2004 MetadataList.assignValue(
2006 (
Context, getMDString(Record[1]),
2007 getMDString(Record[2]), Checksum,
2008 Record.size() > 5 ? getMDString(Record[5]) :
nullptr)),
2015 return error(
"Invalid record");
2021 const auto LangVersionMask = (
uint64_t(1) << 63);
2022 const bool HasVersionedLanguage =
Record[1] & LangVersionMask;
2029 if (
Record.size() > 23 &&
2031 return error(
"Invalid DICompileUnit dialect value");
2032 const uint16_t Dialect =
2033 Record.size() > 23 ?
static_cast<uint16_t
>(
Record[23]) : uint16_t(0);
2035 auto *CU = DICompileUnit::getDistinct(
2037 HasVersionedLanguage
2038 ? DISourceLanguageName(Record[1] & ~LangVersionMask,
2039 LanguageVersion, Dialect)
2040 : DISourceLanguageName(Record[1], Dialect),
2041 getMDOrNull(Record[2]), getMDString(Record[3]), Record[4],
2042 getMDString(Record[5]), Record[6], getMDString(Record[7]), Record[8],
2043 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2044 getMDOrNull(Record[12]), getMDOrNull(Record[13]),
2045 Record.size() <= 15 ?
nullptr : getMDOrNull(Record[15]),
2046 Record.size() <= 14 ? 0 : Record[14],
2047 Record.size() <= 16 ?
true : Record[16],
2048 Record.size() <= 17 ?
false : Record[17],
2049 Record.size() <= 18 ? 0 : Record[18],
2050 Record.size() <= 19 ?
false : Record[19],
2055 Record.size() <= 20 ?
nullptr : getMDString(Record[20]),
2056 Record.size() <= 21 ?
nullptr : getMDString(Record[21]));
2058 MetadataList.assignValue(CU, NextMetadataNo);
2063 CUSubprograms.push_back({CU,
Record[11]});
2068 return error(
"Invalid record");
2070 bool HasSPFlags =
Record[0] & 4;
2083 const unsigned DIFlagMainSubprogram = 1 << 21;
2084 bool HasOldMainSubprogramFlag =
Flags & DIFlagMainSubprogram;
2085 if (HasOldMainSubprogramFlag)
2089 Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
2091 if (HasOldMainSubprogramFlag && HasSPFlags)
2092 SPFlags |= DISubprogram::SPFlagMainSubprogram;
2093 else if (!HasSPFlags)
2095 Record[7], Record[8],
2096 Record[14], Record[11],
2097 HasOldMainSubprogramFlag);
2100 IsDistinct = (
Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
2106 bool HasUnit =
Record[0] & 2;
2107 if (!HasSPFlags && HasUnit &&
Record.size() < 19)
2108 return error(
"Invalid record");
2109 if (HasSPFlags && !HasUnit)
2110 return error(
"Invalid record");
2113 bool HasThisAdj =
true;
2114 bool HasThrownTypes =
true;
2115 bool HasAnnotations =
false;
2116 bool HasTargetFuncName =
false;
2117 unsigned OffsetA = 0;
2118 unsigned OffsetB = 0;
2121 bool UsesKeyInstructions =
false;
2125 if (
Record.size() >= 19) {
2129 HasThisAdj =
Record.size() >= 20;
2130 HasThrownTypes =
Record.size() >= 21;
2132 HasAnnotations =
Record.size() >= 19;
2133 HasTargetFuncName =
Record.size() >= 20;
2134 UsesKeyInstructions =
Record.size() >= 21 ?
Record[20] : 0;
2137 Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
2141 getDITypeRefOrNull(Record[1]),
2142 getMDString(Record[2]),
2143 getMDString(Record[3]),
2144 getMDOrNull(Record[4]),
2146 getMDOrNull(Record[6]),
2147 Record[7 + OffsetA],
2148 getDITypeRefOrNull(Record[8 + OffsetA]),
2149 Record[10 + OffsetA],
2150 HasThisAdj ? Record[16 + OffsetB] : 0,
2153 HasUnit ? CUorFn :
nullptr,
2154 getMDOrNull(Record[13 + OffsetB]),
2155 getMDOrNull(Record[14 + OffsetB]),
2156 getMDOrNull(Record[15 + OffsetB]),
2157 HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
2159 HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
2161 HasTargetFuncName ? getMDString(Record[19 + OffsetB])
2163 UsesKeyInstructions));
2164 MetadataList.assignValue(SP, NextMetadataNo);
2168 NewDistinctSPs.push_back(SP);
2174 if (
F->isMaterializable())
2177 FunctionsWithSPs[
F] =
SP;
2178 else if (!
F->empty())
2179 F->setSubprogram(SP);
2186 return error(
"Invalid record");
2189 MetadataList.assignValue(
2191 (
Context, getMDOrNull(Record[1]),
2192 getMDOrNull(Record[2]), Record[3], Record[4])),
2199 return error(
"Invalid record");
2202 MetadataList.assignValue(
2204 (
Context, getMDOrNull(Record[1]),
2205 getMDOrNull(Record[2]), Record[3])),
2211 IsDistinct =
Record[0] & 1;
2212 MetadataList.assignValue(
2214 (
Context, getMDOrNull(Record[1]),
2215 getMDOrNull(Record[2]), getMDString(Record[3]),
2216 getMDOrNull(Record[4]), Record[5])),
2225 Name = getMDString(Record[2]);
2226 else if (
Record.size() == 5)
2227 Name = getMDString(Record[3]);
2229 return error(
"Invalid record");
2231 IsDistinct =
Record[0] & 1;
2232 bool ExportSymbols =
Record[0] & 2;
2233 MetadataList.assignValue(
2235 (
Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
2242 return error(
"Invalid record");
2245 MetadataList.assignValue(
2247 (
Context, Record[1], Record[2], getMDString(Record[3]),
2248 getMDString(Record[4]))),
2255 return error(
"Invalid record");
2258 MetadataList.assignValue(
2260 (
Context, Record[1], Record[2], getMDOrNull(Record[3]),
2261 getMDOrNull(Record[4]))),
2268 return error(
"Invalid record");
2271 MetadataList.assignValue(
2273 (
Context, getMDString(Record[1]),
2274 getDITypeRefOrNull(Record[2]),
2275 (
Record.size() == 4) ? getMDOrNull(Record[3])
2276 : getMDOrNull(
false))),
2283 return error(
"Invalid record");
2287 MetadataList.assignValue(
2289 DITemplateValueParameter,
2290 (
Context, Record[1], getMDString(Record[2]),
2291 getDITypeRefOrNull(Record[3]),
2292 (
Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(
false),
2293 (
Record.size() == 6) ? getMDOrNull(Record[5])
2294 : getMDOrNull(Record[4]))),
2301 return error(
"Invalid record");
2303 IsDistinct =
Record[0] & 1;
2309 Annotations = getMDOrNull(Record[12]);
2311 MetadataList.assignValue(
2313 (
Context, getMDOrNull(Record[1]),
2314 getMDString(Record[2]), getMDString(Record[3]),
2315 getMDOrNull(Record[4]), Record[5],
2316 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2317 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2318 Record[11], Annotations)),
2325 MetadataList.assignValue(
2328 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2329 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2330 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2331 getMDOrNull(Record[10]),
nullptr, Record[11],
nullptr)),
2338 NeedUpgradeToDIGlobalVariableExpression =
true;
2339 Metadata *Expr = getMDOrNull(Record[9]);
2340 uint32_t AlignInBits = 0;
2341 if (
Record.size() > 11) {
2342 if (Record[11] > (
uint64_t)std::numeric_limits<uint32_t>::max())
2343 return error(
"Alignment value is too large");
2344 AlignInBits =
Record[11];
2346 GlobalVariable *Attach =
nullptr;
2352 Expr = DIExpression::get(
Context,
2353 {dwarf::DW_OP_constu, CI->getZExtValue(),
2354 dwarf::DW_OP_stack_value});
2361 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2362 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2363 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2364 getMDOrNull(Record[10]),
nullptr, AlignInBits,
nullptr));
2366 DIGlobalVariableExpression *&DGVE = GlobalVariableExpression[DGV];
2367 if (Attach || Expr) {
2369 DGVE = DIGlobalVariableExpression::getDistinct(
2377 MetadataList.assignValue(MDNode, NextMetadataNo);
2380 return error(
"Invalid record");
2386 return error(
"Invalid DIAssignID record.");
2388 IsDistinct =
Record[0] & 1;
2390 return error(
"Invalid DIAssignID record. Must be distinct");
2399 return error(
"Invalid record");
2401 IsDistinct =
Record[0] & 1;
2402 bool HasAlignment =
Record[0] & 2;
2406 bool HasTag = !HasAlignment &&
Record.size() > 8;
2408 uint32_t AlignInBits = 0;
2411 if (Record[8] > (
uint64_t)std::numeric_limits<uint32_t>::max())
2412 return error(
"Alignment value is too large");
2415 Annotations = getMDOrNull(Record[9]);
2418 MetadataList.assignValue(
2420 (
Context, getMDOrNull(Record[1 + HasTag]),
2421 getMDString(Record[2 + HasTag]),
2422 getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
2423 getDITypeRefOrNull(Record[5 + HasTag]),
2424 Record[6 + HasTag], Flags, AlignInBits, Annotations)),
2431 return error(
"Invalid record");
2433 IsDistinct =
Record[0] & 1;
2436 bool IsArtificial =
Record[0] & 2;
2437 std::optional<unsigned> CoroSuspendIdx;
2440 if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) {
2441 if (RawSuspendIdx > (
uint64_t)std::numeric_limits<unsigned>::max())
2442 return error(
"CoroSuspendIdx value is too large");
2443 CoroSuspendIdx = RawSuspendIdx;
2447 MetadataList.assignValue(
2449 (
Context, getMDOrNull(Record[1]),
2450 getMDString(Record[2]), getMDOrNull(Record[3]), Line,
2451 Column, IsArtificial, CoroSuspendIdx)),
2458 return error(
"Invalid record");
2460 IsDistinct =
Record[0] & 1;
2465 if (
Error Err = upgradeDIExpression(
Version, Elts, Buffer))
2475 return error(
"Invalid record");
2478 Metadata *Expr = getMDOrNull(Record[2]);
2480 Expr = DIExpression::get(
Context, {});
2481 MetadataList.assignValue(
2483 (
Context, getMDOrNull(Record[1]), Expr)),
2490 return error(
"Invalid record");
2493 MetadataList.assignValue(
2495 (
Context, getMDString(Record[1]),
2496 getMDOrNull(Record[2]), Record[3],
2497 getMDString(Record[5]),
2498 getMDString(Record[4]), Record[6],
2499 getDITypeRefOrNull(Record[7]))),
2506 return error(
"Invalid record");
2509 MetadataList.assignValue(
2511 getMDOrNull(Record[2]), Record[3],
2512 getDITypeRefOrNull(Record[4]),
2513 getMDOrNull(Record[5]))),
2520 return error(
"Invalid DIImportedEntity record");
2523 bool HasFile = (
Record.size() >= 7);
2524 bool HasElements = (
Record.size() >= 8);
2525 MetadataList.assignValue(
2527 (
Context, Record[1], getMDOrNull(Record[2]),
2528 getDITypeRefOrNull(Record[3]),
2529 HasFile ? getMDOrNull(Record[6]) :
nullptr,
2530 HasFile ? Record[4] : 0, getMDString(Record[5]),
2531 HasElements ? getMDOrNull(Record[7]) :
nullptr)),
2541 ++NumMDStringLoaded;
2543 MetadataList.assignValue(MD, NextMetadataNo);
2548 auto CreateNextMDString = [&](StringRef Str) {
2552 ++NumMDStringLoaded;
2556 if (
Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2561 if (
Record.size() % 2 == 0)
2562 return error(
"Invalid record");
2563 unsigned ValueID =
Record[0];
2564 if (ValueID >= ValueList.size())
2565 return error(
"Invalid record");
2567 if (
Error Err = parseGlobalObjectAttachment(
2568 *GO, ArrayRef<uint64_t>(Record).slice(1)))
2575 if (
Error Err = parseMetadataKindRecord(Record))
2586 "Invalid record: DIArgList should not contain forward refs");
2588 return error(
"Invalid record");
2598#undef GET_OR_DISTINCT
2601Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
2602 ArrayRef<uint64_t> Record, StringRef Blob,
2603 function_ref<
void(StringRef)> CallBack) {
2608 return error(
"Invalid record: metadata strings layout");
2610 unsigned NumStrings =
Record[0];
2611 unsigned StringsOffset =
Record[1];
2613 return error(
"Invalid record: metadata strings with no strings");
2614 if (StringsOffset > Blob.
size())
2615 return error(
"Invalid record: metadata strings corrupt offset");
2617 StringRef Lengths = Blob.
slice(0, StringsOffset);
2618 SimpleBitstreamCursor
R(Lengths);
2620 StringRef Strings = Blob.
drop_front(StringsOffset);
2622 if (
R.AtEndOfStream())
2623 return error(
"Invalid record: metadata strings bad length");
2629 return error(
"Invalid record: metadata strings truncated chars");
2633 }
while (--NumStrings);
2638Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2639 GlobalObject &GO, ArrayRef<uint64_t> Record) {
2641 for (
unsigned I = 0,
E =
Record.size();
I !=
E;
I += 2) {
2642 auto K = MDKindMap.find(Record[
I]);
2643 if (K == MDKindMap.end())
2644 return error(
"Invalid ID");
2648 return error(
"Invalid metadata attachment: expect fwd ref to MDNode");
2661 PlaceholderQueue Placeholders;
2665 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2668 switch (Entry.Kind) {
2671 return error(
"Malformed block");
2674 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2683 ++NumMDRecordLoaded;
2687 switch (MaybeRecord.
get()) {
2691 unsigned RecordLength =
Record.size();
2693 return error(
"Invalid record");
2694 if (RecordLength % 2 == 0) {
2696 if (
Error Err = parseGlobalObjectAttachment(
F,
Record))
2703 for (
unsigned i = 1; i != RecordLength; i = i + 2) {
2704 unsigned Kind =
Record[i];
2705 auto I = MDKindMap.find(Kind);
2706 if (
I == MDKindMap.end())
2707 return error(
"Invalid ID");
2708 if (
I->second == LLVMContext::MD_tbaa && StripTBAA)
2711 auto Idx =
Record[i + 1];
2712 if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2713 !MetadataList.lookup(Idx)) {
2716 lazyLoadOneMetadata(Idx, Placeholders);
2718 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2728 return error(
"Invalid metadata attachment");
2730 if (HasSeenOldLoopTags &&
I->second == LLVMContext::MD_loop)
2733 if (
I->second == LLVMContext::MD_tbaa) {
2736 }
else if (
I->second == LLVMContext::MD_tbaa_struct) {
2741 if (
I->second == LLVMContext::MD_alias_scope ||
2742 I->second == LLVMContext::MD_noalias)
2754Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2757 return error(
"Invalid record");
2759 unsigned Kind =
Record[0];
2762 unsigned NewKind = TheModule.getMDKindID(Name.str());
2763 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2764 return error(
"Conflicting METADATA_KIND records");
2778 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2781 switch (Entry.Kind) {
2784 return error(
"Malformed block");
2794 ++NumMDRecordLoaded;
2798 switch (MaybeCode.
get()) {
2811 Pimpl = std::move(RHS.Pimpl);
2815 : Pimpl(
std::
move(RHS.Pimpl)) {}
2823 Stream, TheModule, ValueList,
std::
move(Callbacks), IsImporting)) {}
2825Error MetadataLoader::parseMetadata(
bool ModuleLevel) {
2826 return Pimpl->parseMetadata(ModuleLevel);
2834 return Pimpl->getMetadataFwdRefOrLoad(Idx);
2838 return Pimpl->lookupSubprogramForFunction(
F);
2843 return Pimpl->parseMetadataAttachment(
F, InstructionList);
2847 return Pimpl->parseMetadataKinds();
2851 return Pimpl->setStripTBAA(StripTBAA);
2860 return Pimpl->upgradeDebugIntrinsics(
F);
2864 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 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...