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() > 23)
1864 return error(
"Invalid record");
1870 const auto LangVersionMask = (uint64_t(1) << 63);
1871 const bool HasVersionedLanguage = Record[1] & LangVersionMask;
1874 auto *CU = DICompileUnit::getDistinct(
1876 HasVersionedLanguage
1877 ? DISourceLanguageName(Record[1] & ~LangVersionMask,
1879 : DISourceLanguageName(Record[1]),
1880 getMDOrNull(Record[2]), getMDString(Record[3]), Record[4],
1881 getMDString(Record[5]), Record[6], getMDString(Record[7]), Record[8],
1882 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1883 getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1884 Record.size() <= 15 ?
nullptr : getMDOrNull(Record[15]),
1885 Record.size() <= 14 ? 0 : Record[14],
1886 Record.size() <= 16 ?
true : Record[16],
1887 Record.size() <= 17 ?
false : Record[17],
1888 Record.size() <= 18 ? 0 : Record[18],
1889 Record.size() <= 19 ?
false : Record[19],
1890 Record.size() <= 20 ?
nullptr : getMDString(Record[20]),
1891 Record.size() <= 21 ?
nullptr : getMDString(Record[21]));
1893 MetadataList.assignValue(CU, NextMetadataNo);
1897 if (
Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1898 CUSubprograms.push_back({CU, SPs});
1902 if (Record.size() < 18 || Record.size() > 22)
1903 return error(
"Invalid record");
1905 bool HasSPFlags = Record[0] & 4;
1918 const unsigned DIFlagMainSubprogram = 1 << 21;
1919 bool HasOldMainSubprogramFlag =
Flags & DIFlagMainSubprogram;
1920 if (HasOldMainSubprogramFlag)
1924 Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
1926 if (HasOldMainSubprogramFlag && HasSPFlags)
1927 SPFlags |= DISubprogram::SPFlagMainSubprogram;
1928 else if (!HasSPFlags)
1930 Record[7], Record[8],
1931 Record[14], Record[11],
1932 HasOldMainSubprogramFlag);
1935 IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1941 bool HasUnit = Record[0] & 2;
1942 if (!HasSPFlags && HasUnit && Record.size() < 19)
1943 return error(
"Invalid record");
1944 if (HasSPFlags && !HasUnit)
1945 return error(
"Invalid record");
1948 bool HasThisAdj =
true;
1949 bool HasThrownTypes =
true;
1950 bool HasAnnotations =
false;
1951 bool HasTargetFuncName =
false;
1952 unsigned OffsetA = 0;
1953 unsigned OffsetB = 0;
1956 bool UsesKeyInstructions =
false;
1960 if (Record.size() >= 19) {
1964 HasThisAdj = Record.size() >= 20;
1965 HasThrownTypes = Record.size() >= 21;
1967 HasAnnotations = Record.size() >= 19;
1968 HasTargetFuncName = Record.size() >= 20;
1969 UsesKeyInstructions = Record.size() >= 21 ? Record[20] : 0;
1972 Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1976 getDITypeRefOrNull(Record[1]),
1977 getMDString(Record[2]),
1978 getMDString(Record[3]),
1979 getMDOrNull(Record[4]),
1981 getMDOrNull(Record[6]),
1982 Record[7 + OffsetA],
1983 getDITypeRefOrNull(Record[8 + OffsetA]),
1984 Record[10 + OffsetA],
1985 HasThisAdj ? Record[16 + OffsetB] : 0,
1988 HasUnit ? CUorFn :
nullptr,
1989 getMDOrNull(Record[13 + OffsetB]),
1990 getMDOrNull(Record[14 + OffsetB]),
1991 getMDOrNull(Record[15 + OffsetB]),
1992 HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1994 HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1996 HasTargetFuncName ? getMDString(Record[19 + OffsetB])
1998 UsesKeyInstructions));
1999 MetadataList.assignValue(SP, NextMetadataNo);
2006 if (
F->isMaterializable())
2009 FunctionsWithSPs[
F] =
SP;
2010 else if (!
F->empty())
2011 F->setSubprogram(SP);
2017 if (Record.size() != 5)
2018 return error(
"Invalid record");
2020 IsDistinct = Record[0];
2021 MetadataList.assignValue(
2023 (
Context, getMDOrNull(Record[1]),
2024 getMDOrNull(Record[2]), Record[3], Record[4])),
2030 if (Record.size() != 4)
2031 return error(
"Invalid record");
2033 IsDistinct = Record[0];
2034 MetadataList.assignValue(
2036 (
Context, getMDOrNull(Record[1]),
2037 getMDOrNull(Record[2]), Record[3])),
2043 IsDistinct = Record[0] & 1;
2044 MetadataList.assignValue(
2046 (
Context, getMDOrNull(Record[1]),
2047 getMDOrNull(Record[2]), getMDString(Record[3]),
2048 getMDOrNull(Record[4]), Record[5])),
2056 if (Record.size() == 3)
2057 Name = getMDString(Record[2]);
2058 else if (Record.size() == 5)
2059 Name = getMDString(Record[3]);
2061 return error(
"Invalid record");
2063 IsDistinct = Record[0] & 1;
2064 bool ExportSymbols = Record[0] & 2;
2065 MetadataList.assignValue(
2067 (
Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
2073 if (Record.size() != 5)
2074 return error(
"Invalid record");
2076 IsDistinct = Record[0];
2077 MetadataList.assignValue(
2079 (
Context, Record[1], Record[2], getMDString(Record[3]),
2080 getMDString(Record[4]))),
2086 if (Record.size() != 5)
2087 return error(
"Invalid record");
2089 IsDistinct = Record[0];
2090 MetadataList.assignValue(
2092 (
Context, Record[1], Record[2], getMDOrNull(Record[3]),
2093 getMDOrNull(Record[4]))),
2099 if (Record.size() < 3 || Record.size() > 4)
2100 return error(
"Invalid record");
2102 IsDistinct = Record[0];
2103 MetadataList.assignValue(
2105 (
Context, getMDString(Record[1]),
2106 getDITypeRefOrNull(Record[2]),
2107 (Record.size() == 4) ? getMDOrNull(Record[3])
2108 : getMDOrNull(
false))),
2114 if (Record.size() < 5 || Record.size() > 6)
2115 return error(
"Invalid record");
2117 IsDistinct = Record[0];
2119 MetadataList.assignValue(
2121 DITemplateValueParameter,
2122 (
Context, Record[1], getMDString(Record[2]),
2123 getDITypeRefOrNull(Record[3]),
2124 (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(
false),
2125 (Record.size() == 6) ? getMDOrNull(Record[5])
2126 : getMDOrNull(Record[4]))),
2132 if (Record.size() < 11 || Record.size() > 13)
2133 return error(
"Invalid record");
2135 IsDistinct = Record[0] & 1;
2136 unsigned Version = Record[0] >> 1;
2140 if (Record.size() > 12)
2141 Annotations = getMDOrNull(Record[12]);
2143 MetadataList.assignValue(
2145 (
Context, getMDOrNull(Record[1]),
2146 getMDString(Record[2]), getMDString(Record[3]),
2147 getMDOrNull(Record[4]), Record[5],
2148 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2149 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2150 Record[11], Annotations)),
2157 MetadataList.assignValue(
2160 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2161 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2162 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2163 getMDOrNull(Record[10]),
nullptr, Record[11],
nullptr)),
2170 NeedUpgradeToDIGlobalVariableExpression =
true;
2171 Metadata *Expr = getMDOrNull(Record[9]);
2172 uint32_t AlignInBits = 0;
2173 if (Record.size() > 11) {
2174 if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
2175 return error(
"Alignment value is too large");
2176 AlignInBits = Record[11];
2178 GlobalVariable *Attach =
nullptr;
2184 Expr = DIExpression::get(
Context,
2185 {dwarf::DW_OP_constu, CI->getZExtValue(),
2186 dwarf::DW_OP_stack_value});
2193 (
Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2194 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2195 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2196 getMDOrNull(Record[10]),
nullptr, AlignInBits,
nullptr));
2198 DIGlobalVariableExpression *DGVE =
nullptr;
2200 DGVE = DIGlobalVariableExpression::getDistinct(
2206 MetadataList.assignValue(MDNode, NextMetadataNo);
2209 return error(
"Invalid record");
2214 if (Record.size() != 1)
2215 return error(
"Invalid DIAssignID record.");
2217 IsDistinct = Record[0] & 1;
2219 return error(
"Invalid DIAssignID record. Must be distinct");
2227 if (Record.size() < 8 || Record.size() > 10)
2228 return error(
"Invalid record");
2230 IsDistinct = Record[0] & 1;
2231 bool HasAlignment = Record[0] & 2;
2235 bool HasTag = !HasAlignment && Record.size() > 8;
2237 uint32_t AlignInBits = 0;
2240 if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
2241 return error(
"Alignment value is too large");
2242 AlignInBits = Record[8];
2243 if (Record.size() > 9)
2244 Annotations = getMDOrNull(Record[9]);
2247 MetadataList.assignValue(
2249 (
Context, getMDOrNull(Record[1 + HasTag]),
2250 getMDString(Record[2 + HasTag]),
2251 getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
2252 getDITypeRefOrNull(Record[5 + HasTag]),
2253 Record[6 + HasTag], Flags, AlignInBits, Annotations)),
2259 if (Record.size() < 5 || Record.size() > 7)
2260 return error(
"Invalid record");
2262 IsDistinct = Record[0] & 1;
2263 uint64_t
Line = Record[4];
2264 uint64_t Column = Record.size() > 5 ? Record[5] : 0;
2265 bool IsArtificial = Record[0] & 2;
2266 std::optional<unsigned> CoroSuspendIdx;
2267 if (Record.size() > 6) {
2268 uint64_t RawSuspendIdx = Record[6];
2269 if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) {
2270 if (RawSuspendIdx > (uint64_t)std::numeric_limits<unsigned>::max())
2271 return error(
"CoroSuspendIdx value is too large");
2272 CoroSuspendIdx = RawSuspendIdx;
2276 MetadataList.assignValue(
2278 (
Context, getMDOrNull(Record[1]),
2279 getMDString(Record[2]), getMDOrNull(Record[3]), Line,
2280 Column, IsArtificial, CoroSuspendIdx)),
2286 if (Record.size() < 1)
2287 return error(
"Invalid record");
2289 IsDistinct = Record[0] & 1;
2290 uint64_t
Version = Record[0] >> 1;
2291 auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
2294 if (
Error Err = upgradeDIExpression(
Version, Elts, Buffer))
2303 if (Record.size() != 3)
2304 return error(
"Invalid record");
2306 IsDistinct = Record[0];
2307 Metadata *Expr = getMDOrNull(Record[2]);
2309 Expr = DIExpression::get(
Context, {});
2310 MetadataList.assignValue(
2312 (
Context, getMDOrNull(Record[1]), Expr)),
2318 if (Record.size() != 8)
2319 return error(
"Invalid record");
2321 IsDistinct = Record[0];
2322 MetadataList.assignValue(
2324 (
Context, getMDString(Record[1]),
2325 getMDOrNull(Record[2]), Record[3],
2326 getMDString(Record[4]), getMDString(Record[5]),
2327 Record[6], getDITypeRefOrNull(Record[7]))),
2333 if (Record.size() < 6 || Record.size() > 8)
2334 return error(
"Invalid DIImportedEntity record");
2336 IsDistinct = Record[0];
2337 bool HasFile = (Record.size() >= 7);
2338 bool HasElements = (Record.size() >= 8);
2339 MetadataList.assignValue(
2341 (
Context, Record[1], getMDOrNull(Record[2]),
2342 getDITypeRefOrNull(Record[3]),
2343 HasFile ? getMDOrNull(Record[6]) :
nullptr,
2344 HasFile ? Record[4] : 0, getMDString(Record[5]),
2345 HasElements ? getMDOrNull(Record[7]) :
nullptr)),
2351 std::string
String(Record.begin(), Record.end());
2355 ++NumMDStringLoaded;
2357 MetadataList.assignValue(MD, NextMetadataNo);
2362 auto CreateNextMDString = [&](StringRef Str) {
2363 ++NumMDStringLoaded;
2367 if (
Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2372 if (Record.size() % 2 == 0)
2373 return error(
"Invalid record");
2374 unsigned ValueID = Record[0];
2375 if (ValueID >= ValueList.size())
2376 return error(
"Invalid record");
2378 if (
Error Err = parseGlobalObjectAttachment(
2379 *GO, ArrayRef<uint64_t>(Record).slice(1)))
2386 if (
Error Err = parseMetadataKindRecord(Record))
2393 for (uint64_t Elt : Record) {
2397 "Invalid record: DIArgList should not contain forward refs");
2399 return error(
"Invalid record");
2409#undef GET_OR_DISTINCT
2412Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
2413 ArrayRef<uint64_t> Record, StringRef Blob,
2414 function_ref<
void(StringRef)> CallBack) {
2418 if (Record.
size() != 2)
2419 return error(
"Invalid record: metadata strings layout");
2421 unsigned NumStrings = Record[0];
2422 unsigned StringsOffset = Record[1];
2424 return error(
"Invalid record: metadata strings with no strings");
2425 if (StringsOffset > Blob.
size())
2426 return error(
"Invalid record: metadata strings corrupt offset");
2428 StringRef Lengths = Blob.
slice(0, StringsOffset);
2429 SimpleBitstreamCursor
R(Lengths);
2431 StringRef Strings = Blob.
drop_front(StringsOffset);
2433 if (
R.AtEndOfStream())
2434 return error(
"Invalid record: metadata strings bad length");
2440 return error(
"Invalid record: metadata strings truncated chars");
2444 }
while (--NumStrings);
2449Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2450 GlobalObject &GO, ArrayRef<uint64_t> Record) {
2452 for (
unsigned I = 0,
E = Record.
size();
I !=
E;
I += 2) {
2453 auto K = MDKindMap.find(Record[
I]);
2454 if (K == MDKindMap.end())
2455 return error(
"Invalid ID");
2459 return error(
"Invalid metadata attachment: expect fwd ref to MDNode");
2472 PlaceholderQueue Placeholders;
2476 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2479 switch (Entry.Kind) {
2482 return error(
"Malformed block");
2484 resolveForwardRefsAndPlaceholders(Placeholders);
2493 ++NumMDRecordLoaded;
2497 switch (MaybeRecord.
get()) {
2501 unsigned RecordLength =
Record.size();
2503 return error(
"Invalid record");
2504 if (RecordLength % 2 == 0) {
2506 if (
Error Err = parseGlobalObjectAttachment(
F,
Record))
2513 for (
unsigned i = 1; i != RecordLength; i = i + 2) {
2514 unsigned Kind =
Record[i];
2516 if (
I == MDKindMap.end())
2517 return error(
"Invalid ID");
2518 if (
I->second == LLVMContext::MD_tbaa && StripTBAA)
2521 auto Idx =
Record[i + 1];
2522 if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2523 !MetadataList.lookup(Idx)) {
2526 lazyLoadOneMetadata(Idx, Placeholders);
2527 resolveForwardRefsAndPlaceholders(Placeholders);
2537 return error(
"Invalid metadata attachment");
2539 if (HasSeenOldLoopTags &&
I->second == LLVMContext::MD_loop)
2542 if (
I->second == LLVMContext::MD_tbaa) {
2555Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2558 return error(
"Invalid record");
2560 unsigned Kind =
Record[0];
2563 unsigned NewKind = TheModule.getMDKindID(Name.str());
2564 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2565 return error(
"Conflicting METADATA_KIND records");
2579 if (
Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2582 switch (Entry.Kind) {
2585 return error(
"Malformed block");
2595 ++NumMDRecordLoaded;
2599 switch (MaybeCode.
get()) {
2612 Pimpl = std::move(RHS.Pimpl);
2616 : Pimpl(
std::
move(RHS.Pimpl)) {}
2624 Stream, TheModule, ValueList,
std::
move(Callbacks), IsImporting)) {}
2626Error MetadataLoader::parseMetadata(
bool ModuleLevel) {
2627 return Pimpl->parseMetadata(ModuleLevel);
2635 return Pimpl->getMetadataFwdRefOrLoad(Idx);
2639 return Pimpl->lookupSubprogramForFunction(
F);
2644 return Pimpl->parseMetadataAttachment(
F, InstructionList);
2648 return Pimpl->parseMetadataKinds();
2652 return Pimpl->setStripTBAA(StripTBAA);
2661 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.
constexpr char LanguageVersion[]
Key for Kernel::Metadata::mLanguageVersion.
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...