65#define DEBUG_TYPE "bitcode-reader"
67STATISTIC(NumMDStringLoaded,
"Number of MDStrings loaded");
68STATISTIC(NumMDNodeTemporary,
"Number of MDNode::Temporary created");
69STATISTIC(NumMDRecordLoaded,
"Number of Metadata records loaded");
75 cl::desc(
"Import full type definitions for ThinLTO."));
79 cl::desc(
"Force disable the lazy-loading on-demand of metadata when "
80 "loading bitcode for importing."));
84class BitcodeReaderMetadataList {
107 LLVMContext &Context;
111 unsigned RefsUpperBound;
114 BitcodeReaderMetadataList(LLVMContext &
C,
size_t RefsUpperBound)
116 RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::
max(),
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(); }
128 Metadata *operator[](
unsigned i)
const {
return MetadataPtrs[i]; }
131 if (
I < MetadataPtrs.size())
132 return MetadataPtrs[
I];
136 void shrinkTo(
unsigned N) {
137 assert(
N <=
size() &&
"Invalid shrinkTo request!");
138 assert(ForwardReference.empty() &&
"Unexpected forward refs");
139 assert(UnresolvedNodes.empty() &&
"Unexpected unresolved node");
140 MetadataPtrs.resize(
N);
145 Metadata *getMetadataFwdRef(
unsigned Idx);
151 Metadata *getMetadataIfResolved(
unsigned Idx);
153 MDNode *getMDNodeFwdRefOrNull(
unsigned Idx);
154 void assignValue(
Metadata *MD,
unsigned Idx);
155 void tryToResolveCycles();
156 bool hasFwdRefs()
const {
return !ForwardReference.empty(); }
157 int getNextFwdRef() {
159 return *ForwardReference.begin();
163 void addTypeRef(MDString &
UUID, DICompositeType &CT);
178void BitcodeReaderMetadataList::assignValue(
Metadata *MD,
unsigned Idx) {
180 if (!MDN->isResolved())
181 UnresolvedNodes.
insert(Idx);
191 TrackingMDRef &OldMD = MetadataPtrs[Idx];
199 PrevMD->replaceAllUsesWith(MD);
203Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(
unsigned Idx) {
205 if (Idx >= RefsUpperBound)
211 if (
Metadata *MD = MetadataPtrs[Idx])
218 ++NumMDNodeTemporary;
220 MetadataPtrs[Idx].reset(MD);
224Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(
unsigned Idx) {
227 if (!
N->isResolved())
232MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(
unsigned Idx) {
236void BitcodeReaderMetadataList::tryToResolveCycles() {
242 for (
const auto &
Ref : OldTypeRefs.FwdDecls)
243 OldTypeRefs.Final.insert(
Ref);
244 OldTypeRefs.FwdDecls.clear();
248 for (
const auto &Array : OldTypeRefs.Arrays)
249 Array.second->replaceAllUsesWith(resolveTypeRefArray(
Array.first.get()));
250 OldTypeRefs.Arrays.clear();
255 for (
const auto &
Ref : OldTypeRefs.Unknown) {
256 if (DICompositeType *CT = OldTypeRefs.Final.lookup(
Ref.first))
257 Ref.second->replaceAllUsesWith(CT);
259 Ref.second->replaceAllUsesWith(
Ref.first);
261 OldTypeRefs.Unknown.clear();
263 if (UnresolvedNodes.
empty())
268 for (
unsigned I : UnresolvedNodes) {
269 auto &MD = MetadataPtrs[
I];
274 assert(!
N->isTemporary() &&
"Unexpected forward reference");
279 UnresolvedNodes.clear();
282void BitcodeReaderMetadataList::addTypeRef(MDString &
UUID,
283 DICompositeType &CT) {
286 OldTypeRefs.FwdDecls.insert(std::make_pair(&
UUID, &CT));
288 OldTypeRefs.Final.insert(std::make_pair(&
UUID, &CT));
296 if (
auto *CT = OldTypeRefs.Final.lookup(
UUID))
299 auto &
Ref = OldTypeRefs.Unknown[
UUID];
305Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(
Metadata *MaybeTuple) {
307 if (!Tuple || Tuple->isDistinct())
311 if (!Tuple->isTemporary())
312 return resolveTypeRefArray(Tuple);
316 OldTypeRefs.Arrays.emplace_back(
317 std::piecewise_construct, std::forward_as_tuple(Tuple),
319 return OldTypeRefs.Arrays.back().second.get();
322Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(
Metadata *MaybeTuple) {
324 if (!Tuple || Tuple->isDistinct())
329 Ops.reserve(Tuple->getNumOperands());
330 for (
Metadata *MD : Tuple->operands())
331 Ops.push_back(upgradeTypeRef(MD));
338class PlaceholderQueue {
341 std::deque<DistinctMDOperandPlaceholder> PHs;
344 ~PlaceholderQueue() {
346 "PlaceholderQueue hasn't been flushed before being destroyed");
348 bool empty()
const {
return PHs.empty(); }
349 DistinctMDOperandPlaceholder &getPlaceholderOp(
unsigned ID);
350 void flush(BitcodeReaderMetadataList &MetadataList);
354 void getTemporaries(BitcodeReaderMetadataList &MetadataList,
355 DenseSet<unsigned> &Temporaries) {
356 for (
auto &PH : PHs) {
357 auto ID = PH.getID();
358 auto *MD = MetadataList.lookup(
ID);
364 if (
N &&
N->isTemporary())
372DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(
unsigned ID) {
373 PHs.emplace_back(
ID);
377void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
378 while (!PHs.empty()) {
379 auto *MD = MetadataList.lookup(PHs.front().getID());
380 assert(MD &&
"Flushing placeholder on unassigned MD");
383 assert(MDN->isResolved() &&
384 "Flushing Placeholder while cycles aren't resolved");
386 PHs.front().replaceUseWith(MD);
397 BitcodeReaderMetadataList MetadataList;
410 std::vector<StringRef> MDStringRef;
414 MDString *lazyLoadOneMDString(
unsigned Idx);
417 std::vector<uint64_t> GlobalMetadataBitPosIndex;
422 uint64_t GlobalDeclAttachmentPos = 0;
427 unsigned NumGlobalDeclAttachSkipped = 0;
428 unsigned NumGlobalDeclAttachParsed = 0;
441 void lazyLoadOneMetadata(
unsigned Idx, PlaceholderQueue &Placeholders);
445 std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
454 bool StripTBAA =
false;
455 bool HasSeenOldLoopTags =
false;
456 bool NeedUpgradeToDIGlobalVariableExpression =
false;
457 bool NeedDeclareExpressionUpgrade =
false;
463 bool IsImporting =
false;
466 PlaceholderQueue &Placeholders,
StringRef Blob,
467 unsigned &NextMetadataNo);
474 void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
477 void upgradeCUSubprograms() {
478 for (
auto CU_SP : CUSubprograms)
480 for (
auto &
Op : SPs->operands())
482 SP->replaceUnit(CU_SP.first);
483 CUSubprograms.clear();
487 void upgradeCUVariables() {
488 if (!NeedUpgradeToDIGlobalVariableExpression)
492 if (
NamedMDNode *CUNodes = TheModule.getNamedMetadata(
"llvm.dbg.cu"))
493 for (
unsigned I = 0, E = CUNodes->getNumOperands();
I != E; ++
I) {
496 for (
unsigned I = 0;
I < GVs->getNumOperands();
I++)
501 GVs->replaceOperandWith(
I, DGVE);
506 for (
auto &GV : TheModule.globals()) {
508 GV.getMetadata(LLVMContext::MD_dbg, MDs);
509 GV.eraseMetadata(LLVMContext::MD_dbg);
514 GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
516 GV.addMetadata(LLVMContext::MD_dbg, *MD);
523 if (
auto *SP = ParentSubprogram[S]) {
531 if (!Visited.
insert(S).second)
535 return ParentSubprogram[InitialScope] =
541 void upgradeCULocals() {
542 if (
NamedMDNode *CUNodes = TheModule.getNamedMetadata(
"llvm.dbg.cu")) {
543 for (
MDNode *
N : CUNodes->operands()) {
548 if (
CU->getRawImportedEntities()) {
551 for (
Metadata *
Op :
CU->getImportedEntities()->operands()) {
554 EntitiesToRemove.
insert(IE);
558 if (!EntitiesToRemove.
empty()) {
561 for (
Metadata *
Op :
CU->getImportedEntities()->operands()) {
568 std::map<DISubprogram *, SmallVector<Metadata *>> SPToEntities;
569 for (
auto *
I : EntitiesToRemove) {
571 if (
auto *SP = findEnclosingSubprogram(
573 SPToEntities[SP].push_back(Entity);
578 for (
auto I = SPToEntities.begin();
I != SPToEntities.end(); ++
I) {
580 auto RetainedNodes = SP->getRetainedNodes();
582 RetainedNodes.end());
584 SP->replaceRetainedNodes(
MDNode::get(Context, MDs));
594 ParentSubprogram.clear();
599 void upgradeDeclareExpressions(
Function &
F) {
600 if (!NeedDeclareExpressionUpgrade)
603 auto UpdateDeclareIfNeeded = [&](
auto *Declare) {
604 auto *DIExpr = Declare->getExpression();
605 if (!DIExpr || !DIExpr->startsWithDeref() ||
609 Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end());
616 if (DVR.isDbgDeclare())
617 UpdateDeclareIfNeeded(&DVR);
620 UpdateDeclareIfNeeded(DDI);
628 auto N = Expr.
size();
629 switch (FromVersion) {
631 return error(
"Invalid record");
633 if (
N >= 3 && Expr[
N - 3] == dwarf::DW_OP_bit_piece)
638 if (
N && Expr[0] == dwarf::DW_OP_deref) {
639 auto End = Expr.
end();
640 if (Expr.
size() >= 3 &&
642 End = std::prev(End, 3);
643 std::move(std::next(Expr.
begin()), End, Expr.
begin());
644 *std::prev(End) = dwarf::DW_OP_deref;
646 NeedDeclareExpressionUpgrade =
true;
652 while (!SubExpr.empty()) {
657 switch (SubExpr.front()) {
661 case dwarf::DW_OP_constu:
662 case dwarf::DW_OP_minus:
663 case dwarf::DW_OP_plus:
673 HistoricSize = std::min(SubExpr.size(), HistoricSize);
676 switch (SubExpr.front()) {
677 case dwarf::DW_OP_plus:
678 Buffer.
push_back(dwarf::DW_OP_plus_uconst);
679 Buffer.
append(Args.begin(), Args.end());
681 case dwarf::DW_OP_minus:
683 Buffer.
append(Args.begin(), Args.end());
688 Buffer.
append(Args.begin(), Args.end());
693 SubExpr = SubExpr.slice(HistoricSize);
706 void upgradeDebugInfo(
bool ModuleLevel) {
707 upgradeCUSubprograms();
708 upgradeCUVariables();
713 void callMDTypeCallback(
Metadata **Val,
unsigned TypeID);
719 : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
720 ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
721 TheModule(TheModule), Callbacks(
std::
move(Callbacks)),
722 IsImporting(IsImporting) {}
726 bool hasFwdRefs()
const {
return MetadataList.hasFwdRefs(); }
729 if (
ID < MDStringRef.size())
730 return lazyLoadOneMDString(
ID);
731 if (
auto *MD = MetadataList.lookup(
ID))
735 if (
ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
736 PlaceholderQueue Placeholders;
737 lazyLoadOneMetadata(
ID, Placeholders);
738 resolveForwardRefsAndPlaceholders(Placeholders);
739 return MetadataList.lookup(
ID);
741 return MetadataList.getMetadataFwdRef(
ID);
745 return FunctionsWithSPs.lookup(
F);
758 unsigned size()
const {
return MetadataList.size(); }
764MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
765 IndexCursor = Stream;
767 GlobalDeclAttachmentPos = 0;
770 uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
778 switch (Entry.Kind) {
781 return error(
"Malformed block");
788 uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
790 if (
Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
795 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
796 return std::move(Err);
800 IndexCursor.readRecord(Entry.ID,
Record, &Blob))
803 return MaybeRecord.takeError();
804 unsigned NumStrings =
Record[0];
805 MDStringRef.reserve(NumStrings);
806 auto IndexNextMDString = [&](
StringRef Str) {
807 MDStringRef.push_back(Str);
809 if (
auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
810 return std::move(Err);
816 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
817 return std::move(Err);
819 if (Expected<unsigned> MaybeRecord =
820 IndexCursor.readRecord(
Entry.ID, Record))
823 return MaybeRecord.takeError();
824 if (Record.
size() != 2)
825 return error(
"Invalid record");
826 auto Offset = Record[0] + (Record[1] << 32);
827 auto BeginPos = IndexCursor.GetCurrentBitNo();
828 if (
Error Err = IndexCursor.JumpToBit(BeginPos +
Offset))
829 return std::move(Err);
830 Expected<BitstreamEntry> MaybeEntry =
831 IndexCursor.advanceSkippingSubblocks(
837 "Corrupted bitcode: Expected `Record` when trying to find the "
840 if (Expected<unsigned> MaybeCode =
841 IndexCursor.readRecord(
Entry.ID, Record))
843 "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
844 "find the Metadata index");
846 return MaybeCode.takeError();
848 auto CurrentValue = BeginPos;
849 GlobalMetadataBitPosIndex.reserve(Record.
size());
850 for (
auto &Elt : Record) {
852 GlobalMetadataBitPosIndex.push_back(CurrentValue);
859 return error(
"Corrupted Metadata block");
862 if (
Error Err = IndexCursor.JumpToBit(CurrentPos))
863 return std::move(Err);
867 if (Expected<unsigned> MaybeCode =
868 IndexCursor.readRecord(
Entry.ID, Record)) {
869 Code = MaybeCode.get();
872 return MaybeCode.takeError();
875 SmallString<8>
Name(Record.begin(), Record.end());
876 if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
877 Code = MaybeCode.get();
879 return MaybeCode.takeError();
884 if (Expected<unsigned> MaybeNextBitCode =
885 IndexCursor.readRecord(Code, Record))
888 return MaybeNextBitCode.takeError();
891 unsigned Size = Record.size();
892 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
893 for (
unsigned i = 0; i !=
Size; ++i) {
898 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
899 assert(MD &&
"Invalid metadata: expect fwd ref to MDNode");
905 if (!GlobalDeclAttachmentPos)
906 GlobalDeclAttachmentPos = SavedPos;
908 NumGlobalDeclAttachSkipped++;
952 GlobalMetadataBitPosIndex.clear();
966Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
968 if (!GlobalDeclAttachmentPos)
972 BitstreamCursor TempCursor = Stream;
973 SmallVector<uint64_t, 64> Record;
977 return std::move(Err);
979 BitstreamEntry
Entry;
986 switch (
Entry.Kind) {
989 return error(
"Malformed block");
992 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1004 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1008 NumGlobalDeclAttachParsed++;
1013 return std::move(Err);
1015 if (Expected<unsigned> MaybeRecord =
1019 return MaybeRecord.takeError();
1020 if (Record.
size() % 2 == 0)
1021 return error(
"Invalid record");
1022 unsigned ValueID = Record[0];
1023 if (ValueID >= ValueList.size())
1024 return error(
"Invalid record");
1030 if (
Error Err = parseGlobalObjectAttachment(
1031 *GO, ArrayRef<uint64_t>(Record).slice(1)))
1032 return std::move(Err);
1034 return std::move(Err);
1039void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(
Metadata **Val,
1041 if (Callbacks.MDType) {
1042 (*Callbacks.MDType)(Val,
TypeID, Callbacks.GetTypeByID,
1043 Callbacks.GetContainedTypeID);
1051 if (!ModuleLevel && MetadataList.hasFwdRefs())
1052 return error(
"Invalid metadata: fwd refs into function blocks");
1056 auto EntryPos = Stream.GetCurrentBitNo();
1062 PlaceholderQueue Placeholders;
1066 if (ModuleLevel && IsImporting && MetadataList.empty() &&
1068 auto SuccessOrErr = lazyLoadModuleMetadataBlock();
1070 return SuccessOrErr.takeError();
1071 if (SuccessOrErr.get()) {
1074 MetadataList.resize(MDStringRef.size() +
1075 GlobalMetadataBitPosIndex.size());
1080 SuccessOrErr = loadGlobalDeclAttachments();
1082 return SuccessOrErr.takeError();
1083 assert(SuccessOrErr.get());
1087 resolveForwardRefsAndPlaceholders(Placeholders);
1088 upgradeDebugInfo(ModuleLevel);
1091 Stream.ReadBlockEnd();
1092 if (
Error Err = IndexCursor.JumpToBit(EntryPos))
1094 if (
Error Err = Stream.SkipBlock()) {
1105 unsigned NextMetadataNo = MetadataList.size();
1110 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1113 switch (Entry.Kind) {
1116 return error(
"Malformed block");
1118 resolveForwardRefsAndPlaceholders(Placeholders);
1119 upgradeDebugInfo(ModuleLevel);
1129 ++NumMDRecordLoaded;
1131 Stream.readRecord(Entry.ID,
Record, &Blob)) {
1132 if (
Error Err = parseOneMetadata(
Record, MaybeCode.
get(), Placeholders,
1133 Blob, NextMetadataNo))
1140MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(
unsigned ID) {
1141 ++NumMDStringLoaded;
1145 MetadataList.assignValue(MDS,
ID);
1149void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
1150 unsigned ID, PlaceholderQueue &Placeholders) {
1151 assert(
ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
1152 assert(
ID >= MDStringRef.size() &&
"Unexpected lazy-loading of MDString");
1154 if (
auto *MD = MetadataList.lookup(
ID)) {
1158 if (!
N || !
N->isTemporary())
1163 if (
Error Err = IndexCursor.JumpToBit(
1164 GlobalMetadataBitPosIndex[
ID - MDStringRef.size()]))
1168 if (
Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
1172 ++NumMDRecordLoaded;
1174 IndexCursor.readRecord(Entry.ID,
Record, &Blob)) {
1176 parseOneMetadata(
Record, MaybeCode.
get(), Placeholders, Blob,
ID))
1186void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
1187 PlaceholderQueue &Placeholders) {
1188 DenseSet<unsigned> Temporaries;
1191 Placeholders.getTemporaries(MetadataList, Temporaries);
1194 if (Temporaries.
empty() && !MetadataList.hasFwdRefs())
1199 for (
auto ID : Temporaries)
1200 lazyLoadOneMetadata(
ID, Placeholders);
1201 Temporaries.clear();
1205 while (MetadataList.hasFwdRefs())
1206 lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
1211 MetadataList.tryToResolveCycles();
1215 Placeholders.flush(MetadataList);
1219 Type *Ty,
unsigned TyID) {
1231 if (Idx < ValueList.
size() && ValueList[Idx] &&
1232 ValueList[Idx]->getType() == Ty)
1238Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
1239 SmallVectorImpl<uint64_t> &Record,
unsigned Code,
1240 PlaceholderQueue &Placeholders, StringRef Blob,
unsigned &NextMetadataNo) {
1242 bool IsDistinct =
false;
1243 auto getMD = [&](
unsigned ID) ->
Metadata * {
1244 if (
ID < MDStringRef.size())
1245 return lazyLoadOneMDString(
ID);
1247 if (
auto *MD = MetadataList.lookup(
ID))
1251 if (
ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
1255 MetadataList.getMetadataFwdRef(NextMetadataNo);
1256 lazyLoadOneMetadata(
ID, Placeholders);
1257 return MetadataList.lookup(
ID);
1260 return MetadataList.getMetadataFwdRef(
ID);
1262 if (
auto *MD = MetadataList.getMetadataIfResolved(
ID))
1264 return &Placeholders.getPlaceholderOp(
ID);
1266 auto getMDOrNull = [&](
unsigned ID) ->
Metadata * {
1268 return getMD(
ID - 1);
1271 auto getMDOrNullWithoutPlaceholders = [&](
unsigned ID) ->
Metadata * {
1273 return MetadataList.getMetadataFwdRef(
ID - 1);
1276 auto getMDString = [&](
unsigned ID) -> MDString * {
1279 auto MDS = getMDOrNull(
ID);
1284 auto getDITypeRefOrNull = [&](
unsigned ID) {
1285 return MetadataList.upgradeTypeRef(getMDOrNull(
ID));
1288 auto getMetadataOrConstant = [&](
bool IsMetadata,
1291 return getMDOrNull(Entry);
1293 ConstantInt::get(Type::getInt64Ty(
Context), Entry));
1296#define GET_OR_DISTINCT(CLASS, ARGS) \
1297 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1306 if (
Error E = Stream.ReadCode().moveInto(Code))
1309 ++NumMDRecordLoaded;
1310 if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
1312 return error(
"METADATA_NAME not followed by METADATA_NAMED_NODE");
1314 return MaybeNextBitCode.takeError();
1318 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1319 for (
unsigned i = 0; i !=
Size; ++i) {
1320 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1322 return error(
"Invalid named metadata: expect fwd ref to MDNode");
1331 if (Record.
size() % 2 == 1)
1332 return error(
"Invalid record");
1336 auto dropRecord = [&] {
1340 if (Record.
size() != 2) {
1345 unsigned TyID = Record[0];
1346 Type *Ty = Callbacks.GetTypeByID(TyID);
1352 Value *
V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
1355 return error(
"Invalid value reference from old fn metadata");
1363 if (Record.
size() % 2 == 1)
1364 return error(
"Invalid record");
1368 for (
unsigned i = 0; i !=
Size; i += 2) {
1369 unsigned TyID = Record[i];
1370 Type *Ty = Callbacks.GetTypeByID(TyID);
1372 return error(
"Invalid record");
1378 return error(
"Invalid value reference from old metadata");
1381 "Expected non-function-local metadata");
1382 callMDTypeCallback(&MD, TyID);
1392 if (Record.
size() != 2)
1393 return error(
"Invalid record");
1395 unsigned TyID = Record[0];
1396 Type *Ty = Callbacks.GetTypeByID(TyID);
1398 return error(
"Invalid record");
1402 return error(
"Invalid value reference from metadata");
1405 callMDTypeCallback(&MD, TyID);
1406 MetadataList.assignValue(MD, NextMetadataNo);
1416 for (
unsigned ID : Record)
1426 if (Record.size() != 5 && Record.size() != 6 && Record.size() != 8)
1427 return error(
"Invalid record");
1429 IsDistinct = Record[0];
1430 unsigned Line = Record[1];
1431 unsigned Column = Record[2];
1433 Metadata *InlinedAt = getMDOrNull(Record[4]);
1434 bool ImplicitCode = Record.size() >= 6 && Record[5];
1435 uint64_t AtomGroup = Record.size() == 8 ? Record[6] : 0;
1436 uint8_t AtomRank = Record.size() == 8 ? Record[7] : 0;
1437 MetadataList.assignValue(
1439 ImplicitCode, AtomGroup, AtomRank)),
1445 if (Record.size() < 4)
1446 return error(
"Invalid record");
1448 IsDistinct = Record[0];
1449 unsigned Tag = Record[1];
1453 return error(
"Invalid record");
1455 auto *Header = getMDString(Record[3]);
1457 for (
unsigned I = 4,
E = Record.size();
I !=
E; ++
I)
1459 MetadataList.assignValue(
1475 switch (Record[0] >> 1) {
1486 DISubrange, (
Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1487 getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1490 return error(
"Invalid record: Unsupported version of DISubrange");
1493 MetadataList.assignValue(Val, NextMetadataNo);
1494 IsDistinct = Record[0] & 1;
1501 (
Context, getMDOrNull(Record[1]),
1502 getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1503 getMDOrNull(Record[4])));
1505 MetadataList.assignValue(Val, NextMetadataNo);
1506 IsDistinct = Record[0] & 1;
1511 if (Record.size() < 3)
1512 return error(
"Invalid record");
1514 IsDistinct = Record[0] & 1;
1515 bool IsUnsigned = Record[0] & 2;
1516 bool IsBigInt = Record[0] & 4;
1520 const uint64_t
BitWidth = Record[1];
1521 const size_t NumWords = Record.size() - 3;
1526 MetadataList.assignValue(
1534 if (Record.size() < 6 || Record.size() > 8)
1535 return error(
"Invalid record");
1537 IsDistinct = Record[0] & 1;
1538 bool SizeIsMetadata = Record[0] & 2;
1542 uint32_t NumExtraInhabitants = (Record.size() > 7) ? Record[7] : 0;
1544 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1546 MetadataList.assignValue(
1548 (
Context, Record[1], getMDString(Record[2]), SizeInBits,
1549 Record[4], Record[5], NumExtraInhabitants, Flags)),
1555 if (Record.size() < 11)
1556 return error(
"Invalid record");
1558 IsDistinct = Record[0] & 1;
1559 bool SizeIsMetadata = Record[0] & 2;
1562 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1566 auto ReadWideInt = [&]() {
1568 unsigned NumWords =
Encoded >> 32;
1575 APInt Numerator = ReadWideInt();
1576 APInt Denominator = ReadWideInt();
1578 if (
Offset != Record.size())
1579 return error(
"Invalid record");
1581 MetadataList.assignValue(
1583 (
Context, Record[1], getMDString(Record[2]), SizeInBits,
1584 Record[4], Record[5], Flags, Record[7], Record[8],
1585 Numerator, Denominator)),
1591 if (Record.size() > 9 || Record.size() < 8)
1592 return error(
"Invalid record");
1594 IsDistinct = Record[0] & 1;
1595 bool SizeIsMetadata = Record[0] & 2;
1596 bool SizeIs8 = Record.size() == 8;
1599 Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
1600 unsigned Offset = SizeIs8 ? 5 : 6;
1602 getMetadataOrConstant(SizeIsMetadata, Record[
Offset]);
1604 MetadataList.assignValue(
1606 (
Context, Record[1], getMDString(Record[2]),
1607 getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1608 StringLocationExp, SizeInBits, Record[
Offset + 1],
1615 if (Record.size() < 12 || Record.size() > 15)
1616 return error(
"Invalid record");
1620 std::optional<unsigned> DWARFAddressSpace;
1621 if (Record.size() > 12 && Record[12])
1622 DWARFAddressSpace = Record[12] - 1;
1625 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
1630 if (Record.size() > 14) {
1632 Annotations = getMDOrNull(Record[13]);
1634 PtrAuthData.emplace(Record[14]);
1637 IsDistinct = Record[0] & 1;
1638 bool SizeIsMetadata = Record[0] & 2;
1641 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1642 Metadata *OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1644 MetadataList.assignValue(
1646 (
Context, Record[1], getMDString(Record[2]),
1647 getMDOrNull(Record[3]), Record[4],
1648 getDITypeRefOrNull(Record[5]),
1649 getDITypeRefOrNull(Record[6]), SizeInBits, Record[8],
1650 OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags,
1651 getDITypeRefOrNull(Record[11]), Annotations)),
1657 if (Record.size() != 13)
1658 return error(
"Invalid record");
1660 IsDistinct = Record[0] & 1;
1661 bool SizeIsMetadata = Record[0] & 2;
1664 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[5]);
1666 MetadataList.assignValue(
1668 (
Context, getMDString(Record[1]),
1669 getMDOrNull(Record[2]), Record[3],
1670 getMDOrNull(Record[4]), SizeInBits, Record[6], Flags,
1671 getDITypeRefOrNull(Record[8]), getMDOrNull(Record[9]),
1672 getMDOrNull(Record[10]), getMDOrNull(Record[11]),
1673 getMDOrNull(Record[12]))),
1679 if (Record.size() < 16 || Record.size() > 26)
1680 return error(
"Invalid record");
1684 IsDistinct = Record[0] & 0x1;
1685 bool IsNotUsedInTypeRef = Record[0] & 2;
1686 bool SizeIsMetadata = Record[0] & 4;
1687 unsigned Tag = Record[1];
1688 MDString *
Name = getMDString(Record[2]);
1690 unsigned Line = Record[4];
1693 if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1694 return error(
"Alignment value is too large");
1695 uint32_t AlignInBits = Record[8];
1697 uint32_t NumExtraInhabitants = (Record.size() > 22) ? Record[22] : 0;
1700 unsigned RuntimeLang = Record[12];
1701 std::optional<uint32_t> EnumKind;
1704 Metadata *TemplateParams =
nullptr;
1729 (
Tag == dwarf::DW_TAG_enumeration_type ||
1730 Tag == dwarf::DW_TAG_class_type ||
1731 Tag == dwarf::DW_TAG_structure_type ||
1732 Tag == dwarf::DW_TAG_union_type)) {
1738 StringRef NameStr =
Name->getString();
1740 TemplateParams = getMDOrNull(Record[14]);
1742 BaseType = getDITypeRefOrNull(Record[6]);
1744 OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1746 Elements = getMDOrNull(Record[11]);
1747 VTableHolder = getDITypeRefOrNull(Record[13]);
1748 TemplateParams = getMDOrNull(Record[14]);
1749 if (Record.size() > 16)
1751 if (Record.size() > 17)
1752 DataLocation = getMDOrNull(Record[17]);
1753 if (Record.size() > 19) {
1754 Associated = getMDOrNull(Record[18]);
1755 Allocated = getMDOrNull(Record[19]);
1757 if (Record.size() > 20) {
1758 Rank = getMDOrNull(Record[20]);
1760 if (Record.size() > 21) {
1761 Annotations = getMDOrNull(Record[21]);
1763 if (Record.size() > 23) {
1764 Specification = getMDOrNull(Record[23]);
1766 if (Record.size() > 25)
1767 BitStride = getMDOrNull(Record[25]);
1771 EnumKind = Record[24];
1773 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1775 DICompositeType *CT =
nullptr;
1779 SizeInBits, AlignInBits, OffsetInBits, Specification,
1780 NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind,
1781 VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
1782 Allocated, Rank, Annotations, BitStride);
1789 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, EnumKind,
1790 VTableHolder, TemplateParams, Identifier, Discriminator,
1791 DataLocation, Associated, Allocated, Rank, Annotations,
1792 Specification, NumExtraInhabitants, BitStride));
1793 if (!IsNotUsedInTypeRef && Identifier)
1796 MetadataList.assignValue(CT, NextMetadataNo);
1801 if (Record.size() < 3 || Record.size() > 4)
1802 return error(
"Invalid record");
1803 bool IsOldTypeRefArray = Record[0] < 2;
1804 unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1806 IsDistinct = Record[0] & 0x1;
1810 Types = MetadataList.upgradeTypeRefArray(Types);
1812 MetadataList.assignValue(
1820 if (Record.size() < 5 || Record.size() > 9)
1821 return error(
"Invalid record");
1823 unsigned Offset = Record.size() >= 8 ? 2 : 1;
1824 IsDistinct = Record[0];
1825 MetadataList.assignValue(
1828 (
Context, Record.size() >= 8 ? getMDOrNull(Record[1]) :
nullptr,
1829 getMDOrNull(Record[0 +
Offset]), getMDString(Record[1 +
Offset]),
1830 getMDString(Record[2 +
Offset]), getMDString(Record[3 +
Offset]),
1831 getMDString(Record[4 +
Offset]),
1832 Record.size() <= 7 ? 0 : Record[7],
1833 Record.size() <= 8 ?
false : Record[8])),
1840 if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1841 return error(
"Invalid record");
1843 IsDistinct = Record[0];
1844 std::optional<DIFile::ChecksumInfo<MDString *>> Checksum;
1850 if (Record.size() > 4 && Record[3] && Record[4])
1852 getMDString(Record[4]));
1853 MetadataList.assignValue(
1855 (
Context, getMDString(Record[1]),
1856 getMDString(Record[2]), Checksum,
1857 Record.size() > 5 ? getMDString(Record[5]) :
nullptr)),
1863 if (Record.size() < 14 || Record.size() > 22)
1864 return error(
"Invalid record");
1869 auto *CU = DICompileUnit::getDistinct(
1870 Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1871 Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1872 Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1873 getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1874 Record.size() <= 15 ?
nullptr : getMDOrNull(Record[15]),
1875 Record.size() <= 14 ? 0 : Record[14],
1876 Record.size() <= 16 ?
true : Record[16],
1877 Record.size() <= 17 ?
false : Record[17],
1878 Record.size() <= 18 ? 0 : Record[18],
1879 Record.size() <= 19 ?
false : Record[19],
1880 Record.size() <= 20 ?
nullptr : getMDString(Record[20]),
1881 Record.size() <= 21 ?
nullptr : getMDString(Record[21]));
1883 MetadataList.assignValue(CU, NextMetadataNo);
1887 if (
Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1888 CUSubprograms.push_back({CU, SPs});
1892 if (Record.size() < 18 || Record.size() > 22)
1893 return error(
"Invalid record");
1895 bool HasSPFlags = Record[0] & 4;
1908 const unsigned DIFlagMainSubprogram = 1 << 21;
1909 bool HasOldMainSubprogramFlag =
Flags & DIFlagMainSubprogram;
1910 if (HasOldMainSubprogramFlag)
1914 Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
1916 if (HasOldMainSubprogramFlag && HasSPFlags)
1917 SPFlags |= DISubprogram::SPFlagMainSubprogram;
1918 else if (!HasSPFlags)
1920 Record[7], Record[8],
1921 Record[14], Record[11],
1922 HasOldMainSubprogramFlag);
1925 IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1931 bool HasUnit = Record[0] & 2;
1932 if (!HasSPFlags && HasUnit && Record.size() < 19)
1933 return error(
"Invalid record");
1934 if (HasSPFlags && !HasUnit)
1935 return error(
"Invalid record");
1938 bool HasThisAdj =
true;
1939 bool HasThrownTypes =
true;
1940 bool HasAnnotations =
false;
1941 bool HasTargetFuncName =
false;
1942 unsigned OffsetA = 0;
1943 unsigned OffsetB = 0;
1946 bool UsesKeyInstructions =
false;
1950 if (Record.size() >= 19) {
1954 HasThisAdj = Record.size() >= 20;
1955 HasThrownTypes = Record.size() >= 21;
1957 HasAnnotations = Record.size() >= 19;
1958 HasTargetFuncName = Record.size() >= 20;
1959 UsesKeyInstructions = Record.size() >= 21 ? Record[20] : 0;
1962 Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1966 getDITypeRefOrNull(Record[1]),
1967 getMDString(Record[2]),
1968 getMDString(Record[3]),
1969 getMDOrNull(Record[4]),
1971 getMDOrNull(Record[6]),
1972 Record[7 + OffsetA],
1973 getDITypeRefOrNull(Record[8 + OffsetA]),
1974 Record[10 + OffsetA],
1975 HasThisAdj ? Record[16 + OffsetB] : 0,
1978 HasUnit ? CUorFn :
nullptr,
1979 getMDOrNull(Record[13 + OffsetB]),
1980 getMDOrNull(Record[14 + OffsetB]),
1981 getMDOrNull(Record[15 + OffsetB]),
1982 HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1984 HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1986 HasTargetFuncName ? getMDString(Record[19 + OffsetB])
1988 UsesKeyInstructions));
1989 MetadataList.assignValue(SP, NextMetadataNo);
1996 if (
F->isMaterializable())
1999 FunctionsWithSPs[
F] =
SP;
2000 else if (!
F->empty())
2001 F->setSubprogram(SP);
2007 if (Record.size() != 5)
2008 return error(
"Invalid record");
2010 IsDistinct = Record[0];
2011 MetadataList.assignValue(
2013 (
Context, getMDOrNull(Record[1]),
2014 getMDOrNull(Record[2]), Record[3], Record[4])),
2020 if (Record.size() != 4)
2021 return error(
"Invalid record");
2023 IsDistinct = Record[0];
2024 MetadataList.assignValue(
2026 (
Context, getMDOrNull(Record[1]),
2027 getMDOrNull(Record[2]), Record[3])),
2033 IsDistinct = Record[0] & 1;
2034 MetadataList.assignValue(
2036 (
Context, getMDOrNull(Record[1]),
2037 getMDOrNull(Record[2]), getMDString(Record[3]),
2038 getMDOrNull(Record[4]), Record[5])),
2046 if (Record.size() == 3)
2047 Name = getMDString(Record[2]);
2048 else if (Record.size() == 5)
2049 Name = getMDString(Record[3]);
2051 return error(
"Invalid record");
2053 IsDistinct = Record[0] & 1;
2054 bool ExportSymbols = Record[0] & 2;
2055 MetadataList.assignValue(
2057 (
Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
2063 if (Record.size() != 5)
2064 return error(
"Invalid record");
2066 IsDistinct = Record[0];
2067 MetadataList.assignValue(
2069 (
Context, Record[1], Record[2], getMDString(Record[3]),
2070 getMDString(Record[4]))),
2076 if (Record.size() != 5)
2077 return error(
"Invalid record");
2079 IsDistinct = Record[0];
2080 MetadataList.assignValue(
2082 (
Context, Record[1], Record[2], getMDOrNull(Record[3]),
2083 getMDOrNull(Record[4]))),
2089 if (Record.size() < 3 || Record.size() > 4)
2090 return error(
"Invalid record");
2092 IsDistinct = Record[0];
2093 MetadataList.assignValue(
2095 (
Context, getMDString(Record[1]),
2096 getDITypeRefOrNull(Record[2]),
2097 (Record.size() == 4) ? getMDOrNull(Record[3])
2098 : getMDOrNull(
false))),
2104 if (Record.size() < 5 || Record.size() > 6)
2105 return error(
"Invalid record");
2107 IsDistinct = Record[0];
2109 MetadataList.assignValue(
2111 DITemplateValueParameter,
2112 (
Context, Record[1], getMDString(Record[2]),
2113 getDITypeRefOrNull(Record[3]),
2114 (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(
false),
2115 (Record.size() == 6) ? getMDOrNull(Record[5])
2116 : getMDOrNull(Record[4]))),
2122 if (Record.size() < 11 || Record.size() > 13)
2123 return error(
"Invalid record");
2125 IsDistinct = Record[0] & 1;
2126 unsigned Version = Record[0] >> 1;
2130 if (Record.size() > 12)
2131 Annotations = getMDOrNull(Record[12]);
2133 MetadataList.assignValue(
2135 (
Context, getMDOrNull(Record[1]),
2136 getMDString(Record[2]), getMDString(Record[3]),
2137 getMDOrNull(Record[4]), Record[5],
2138 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2139 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2140 Record[11], Annotations)),
2147 MetadataList.assignValue(
2150 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2151 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2152 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2153 getMDOrNull(Record[10]),
nullptr, Record[11],
nullptr)),
2160 NeedUpgradeToDIGlobalVariableExpression =
true;
2161 Metadata *Expr = getMDOrNull(Record[9]);
2162 uint32_t AlignInBits = 0;
2163 if (Record.size() > 11) {
2164 if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
2165 return error(
"Alignment value is too large");
2166 AlignInBits = Record[11];
2168 GlobalVariable *Attach =
nullptr;
2174 Expr = DIExpression::get(
Context,
2175 {dwarf::DW_OP_constu, CI->getZExtValue(),
2176 dwarf::DW_OP_stack_value});
2183 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2184 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2185 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2186 getMDOrNull(Record[10]),
nullptr, AlignInBits,
nullptr));
2188 DIGlobalVariableExpression *DGVE =
nullptr;
2190 DGVE = DIGlobalVariableExpression::getDistinct(
2196 MetadataList.assignValue(MDNode, NextMetadataNo);
2199 return error(
"Invalid record");
2204 if (Record.size() != 1)
2205 return error(
"Invalid DIAssignID record.");
2207 IsDistinct = Record[0] & 1;
2209 return error(
"Invalid DIAssignID record. Must be distinct");
2217 if (Record.size() < 8 || Record.size() > 10)
2218 return error(
"Invalid record");
2220 IsDistinct = Record[0] & 1;
2221 bool HasAlignment = Record[0] & 2;
2225 bool HasTag = !HasAlignment && Record.size() > 8;
2227 uint32_t AlignInBits = 0;
2230 if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
2231 return error(
"Alignment value is too large");
2232 AlignInBits = Record[8];
2233 if (Record.size() > 9)
2234 Annotations = getMDOrNull(Record[9]);
2237 MetadataList.assignValue(
2239 (
Context, getMDOrNull(Record[1 + HasTag]),
2240 getMDString(Record[2 + HasTag]),
2241 getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
2242 getDITypeRefOrNull(Record[5 + HasTag]),
2243 Record[6 + HasTag], Flags, AlignInBits, Annotations)),
2249 if (Record.size() < 5 || Record.size() > 7)
2250 return error(
"Invalid record");
2252 IsDistinct = Record[0] & 1;
2253 uint64_t
Line = Record[4];
2254 uint64_t Column = Record.size() > 5 ? Record[5] : 0;
2255 bool IsArtificial = Record[0] & 2;
2256 std::optional<unsigned> CoroSuspendIdx;
2257 if (Record.size() > 6) {
2258 uint64_t RawSuspendIdx = Record[6];
2259 if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) {
2260 if (RawSuspendIdx > (uint64_t)std::numeric_limits<unsigned>::max())
2261 return error(
"CoroSuspendIdx value is too large");
2262 CoroSuspendIdx = RawSuspendIdx;
2266 MetadataList.assignValue(
2268 (
Context, getMDOrNull(Record[1]),
2269 getMDString(Record[2]), getMDOrNull(Record[3]), Line,
2270 Column, IsArtificial, CoroSuspendIdx)),
2276 if (Record.size() < 1)
2277 return error(
"Invalid record");
2279 IsDistinct = Record[0] & 1;
2280 uint64_t
Version = Record[0] >> 1;
2281 auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
2284 if (
Error Err = upgradeDIExpression(
Version, Elts, Buffer))
2293 if (Record.size() != 3)
2294 return error(
"Invalid record");
2296 IsDistinct = Record[0];
2297 Metadata *Expr = getMDOrNull(Record[2]);
2299 Expr = DIExpression::get(
Context, {});
2300 MetadataList.assignValue(
2302 (
Context, getMDOrNull(Record[1]), Expr)),
2308 if (Record.size() != 8)
2309 return error(
"Invalid record");
2311 IsDistinct = Record[0];
2312 MetadataList.assignValue(
2314 (
Context, getMDString(Record[1]),
2315 getMDOrNull(Record[2]), Record[3],
2316 getMDString(Record[4]), getMDString(Record[5]),
2317 Record[6], getDITypeRefOrNull(Record[7]))),
2323 if (Record.size() < 6 || Record.size() > 8)
2324 return error(
"Invalid DIImportedEntity record");
2326 IsDistinct = Record[0];
2327 bool HasFile = (Record.size() >= 7);
2328 bool HasElements = (Record.size() >= 8);
2329 MetadataList.assignValue(
2331 (
Context, Record[1], getMDOrNull(Record[2]),
2332 getDITypeRefOrNull(Record[3]),
2333 HasFile ? getMDOrNull(Record[6]) :
nullptr,
2334 HasFile ? Record[4] : 0, getMDString(Record[5]),
2335 HasElements ? getMDOrNull(Record[7]) :
nullptr)),
2341 std::string
String(Record.begin(), Record.end());
2345 ++NumMDStringLoaded;
2347 MetadataList.assignValue(MD, NextMetadataNo);
2352 auto CreateNextMDString = [&](StringRef Str) {
2353 ++NumMDStringLoaded;
2357 if (
Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2362 if (Record.size() % 2 == 0)
2363 return error(
"Invalid record");
2364 unsigned ValueID = Record[0];
2365 if (ValueID >= ValueList.size())
2366 return error(
"Invalid record");
2368 if (
Error Err = parseGlobalObjectAttachment(
2369 *GO, ArrayRef<uint64_t>(Record).slice(1)))
2376 if (
Error Err = parseMetadataKindRecord(Record))
2383 for (uint64_t Elt : Record) {
2387 "Invalid record: DIArgList should not contain forward refs");
2389 return error(
"Invalid record");
2399#undef GET_OR_DISTINCT
2402Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
2403 ArrayRef<uint64_t> Record, StringRef Blob,
2404 function_ref<
void(StringRef)> CallBack) {
2408 if (Record.
size() != 2)
2409 return error(
"Invalid record: metadata strings layout");
2411 unsigned NumStrings = Record[0];
2412 unsigned StringsOffset = Record[1];
2414 return error(
"Invalid record: metadata strings with no strings");
2415 if (StringsOffset > Blob.
size())
2416 return error(
"Invalid record: metadata strings corrupt offset");
2418 StringRef Lengths = Blob.
slice(0, StringsOffset);
2419 SimpleBitstreamCursor
R(Lengths);
2421 StringRef Strings = Blob.
drop_front(StringsOffset);
2423 if (
R.AtEndOfStream())
2424 return error(
"Invalid record: metadata strings bad length");
2430 return error(
"Invalid record: metadata strings truncated chars");
2434 }
while (--NumStrings);
2439Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2440 GlobalObject &GO, ArrayRef<uint64_t> Record) {
2442 for (
unsigned I = 0,
E = Record.
size();
I !=
E;
I += 2) {
2443 auto K = MDKindMap.find(Record[
I]);
2444 if (K == MDKindMap.end())
2445 return error(
"Invalid ID");
2449 return error(
"Invalid metadata attachment: expect fwd ref to MDNode");
2462 PlaceholderQueue Placeholders;
2466 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2469 switch (Entry.Kind) {
2472 return error(
"Malformed block");
2474 resolveForwardRefsAndPlaceholders(Placeholders);
2483 ++NumMDRecordLoaded;
2487 switch (MaybeRecord.
get()) {
2491 unsigned RecordLength =
Record.size();
2493 return error(
"Invalid record");
2494 if (RecordLength % 2 == 0) {
2496 if (
Error Err = parseGlobalObjectAttachment(
F,
Record))
2503 for (
unsigned i = 1; i != RecordLength; i = i + 2) {
2504 unsigned Kind =
Record[i];
2506 if (
I == MDKindMap.end())
2507 return error(
"Invalid ID");
2508 if (
I->second == LLVMContext::MD_tbaa && StripTBAA)
2511 auto Idx =
Record[i + 1];
2512 if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2513 !MetadataList.lookup(Idx)) {
2516 lazyLoadOneMetadata(Idx, Placeholders);
2517 resolveForwardRefsAndPlaceholders(Placeholders);
2527 return error(
"Invalid metadata attachment");
2529 if (HasSeenOldLoopTags &&
I->second == LLVMContext::MD_loop)
2532 if (
I->second == LLVMContext::MD_tbaa) {
2545Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2548 return error(
"Invalid record");
2550 unsigned Kind =
Record[0];
2553 unsigned NewKind = TheModule.getMDKindID(Name.str());
2554 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2555 return error(
"Conflicting METADATA_KIND records");
2569 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2572 switch (Entry.Kind) {
2575 return error(
"Malformed block");
2585 ++NumMDRecordLoaded;
2589 switch (MaybeCode.
get()) {
2602 Pimpl = std::move(RHS.Pimpl);
2606 : Pimpl(
std::
move(RHS.Pimpl)) {}
2614 Stream, TheModule, ValueList,
std::
move(Callbacks), IsImporting)) {}
2616Error MetadataLoader::parseMetadata(
bool ModuleLevel) {
2617 return Pimpl->parseMetadata(ModuleLevel);
2625 return Pimpl->getMetadataFwdRefOrLoad(Idx);
2629 return Pimpl->lookupSubprogramForFunction(
F);
2634 return Pimpl->parseMetadataAttachment(
F, InstructionList);
2638 return Pimpl->parseMetadataKinds();
2642 return Pimpl->setStripTBAA(StripTBAA);
2651 return Pimpl->upgradeDebugIntrinsics(
F);
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< 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, DataExtractor &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)
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 implements a set that has insertion order iteration characteristics.
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
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - 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 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.
LLVM_ABI DIScope * getScope() const
Subprogram description. Uses SubclassData1.
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....
DenseMapIterator< KeyT, ValueT, KeyInfoT, BucketT > iterator
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.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
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.
MutableArrayRef - Represent a mutable reference to an array (0 or more elements consecutively in memo...
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
A vector that has set insertion semantics.
bool empty() const
Determine if the SetVector is empty or not.
bool insert(const value_type &X)
Insert a new element into the SetVector.
bool contains(const key_type &key) const
Check if the SetVector contains the given key.
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.
StringRef - 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
size - 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.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
@ C
The default llvm calling convention, compatible with C.
@ 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_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...
NodeAddr< CodeNode * > Code
LLVM_ABI Instruction & back() const
This is an optimization pass for GlobalISel generic memory operations.
GCNRegPressure max(const GCNRegPressure &P1, const GCNRegPressure &P2)
FunctionAddr VTableAddr Value
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.
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)
auto dyn_cast_or_null(const Y &Val)
FunctionAddr VTableAddr uintptr_t uintptr_t Version
bool mayBeOldLoopAttachmentTag(StringRef Name)
Check whether a string looks like an old loop attachment tag.
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...
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...
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.
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...