Path: blob/main/contrib/llvm-project/llvm/lib/Bitcode/Reader/MetadataLoader.cpp
35291 views
//===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//78#include "MetadataLoader.h"9#include "ValueList.h"1011#include "llvm/ADT/APInt.h"12#include "llvm/ADT/ArrayRef.h"13#include "llvm/ADT/BitmaskEnum.h"14#include "llvm/ADT/DenseMap.h"15#include "llvm/ADT/DenseSet.h"16#include "llvm/ADT/STLFunctionalExtras.h"17#include "llvm/ADT/SetVector.h"18#include "llvm/ADT/SmallString.h"19#include "llvm/ADT/SmallVector.h"20#include "llvm/ADT/Statistic.h"21#include "llvm/ADT/StringRef.h"22#include "llvm/ADT/Twine.h"23#include "llvm/ADT/ilist_iterator.h"24#include "llvm/BinaryFormat/Dwarf.h"25#include "llvm/Bitcode/BitcodeReader.h"26#include "llvm/Bitcode/LLVMBitCodes.h"27#include "llvm/Bitstream/BitstreamReader.h"28#include "llvm/IR/AutoUpgrade.h"29#include "llvm/IR/BasicBlock.h"30#include "llvm/IR/Constants.h"31#include "llvm/IR/DebugInfoMetadata.h"32#include "llvm/IR/Function.h"33#include "llvm/IR/GlobalObject.h"34#include "llvm/IR/GlobalVariable.h"35#include "llvm/IR/Instruction.h"36#include "llvm/IR/IntrinsicInst.h"37#include "llvm/IR/LLVMContext.h"38#include "llvm/IR/Metadata.h"39#include "llvm/IR/Module.h"40#include "llvm/IR/TrackingMDRef.h"41#include "llvm/IR/Type.h"42#include "llvm/Support/Casting.h"43#include "llvm/Support/CommandLine.h"44#include "llvm/Support/Compiler.h"45#include "llvm/Support/ErrorHandling.h"46#include "llvm/Support/type_traits.h"4748#include <algorithm>49#include <cassert>50#include <cstddef>51#include <cstdint>52#include <deque>53#include <iterator>54#include <limits>55#include <map>56#include <optional>57#include <string>58#include <tuple>59#include <type_traits>60#include <utility>61#include <vector>62namespace llvm {63class Argument;64}6566using namespace llvm;6768#define DEBUG_TYPE "bitcode-reader"6970STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");71STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");72STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");7374/// Flag whether we need to import full type definitions for ThinLTO.75/// Currently needed for Darwin and LLDB.76static cl::opt<bool> ImportFullTypeDefinitions(77"import-full-type-definitions", cl::init(false), cl::Hidden,78cl::desc("Import full type definitions for ThinLTO."));7980static cl::opt<bool> DisableLazyLoading(81"disable-ondemand-mds-loading", cl::init(false), cl::Hidden,82cl::desc("Force disable the lazy-loading on-demand of metadata when "83"loading bitcode for importing."));8485namespace {8687static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }8889class BitcodeReaderMetadataList {90/// Array of metadata references.91///92/// Don't use std::vector here. Some versions of libc++ copy (instead of93/// move) on resize, and TrackingMDRef is very expensive to copy.94SmallVector<TrackingMDRef, 1> MetadataPtrs;9596/// The set of indices in MetadataPtrs above of forward references that were97/// generated.98SmallDenseSet<unsigned, 1> ForwardReference;99100/// The set of indices in MetadataPtrs above of Metadata that need to be101/// resolved.102SmallDenseSet<unsigned, 1> UnresolvedNodes;103104/// Structures for resolving old type refs.105struct {106SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;107SmallDenseMap<MDString *, DICompositeType *, 1> Final;108SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;109SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;110} OldTypeRefs;111112LLVMContext &Context;113114/// Maximum number of valid references. Forward references exceeding the115/// maximum must be invalid.116unsigned RefsUpperBound;117118public:119BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)120: Context(C),121RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),122RefsUpperBound)) {}123124// vector compatibility methods125unsigned size() const { return MetadataPtrs.size(); }126void resize(unsigned N) { MetadataPtrs.resize(N); }127void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }128void clear() { MetadataPtrs.clear(); }129Metadata *back() const { return MetadataPtrs.back(); }130void pop_back() { MetadataPtrs.pop_back(); }131bool empty() const { return MetadataPtrs.empty(); }132133Metadata *operator[](unsigned i) const {134assert(i < MetadataPtrs.size());135return MetadataPtrs[i];136}137138Metadata *lookup(unsigned I) const {139if (I < MetadataPtrs.size())140return MetadataPtrs[I];141return nullptr;142}143144void shrinkTo(unsigned N) {145assert(N <= size() && "Invalid shrinkTo request!");146assert(ForwardReference.empty() && "Unexpected forward refs");147assert(UnresolvedNodes.empty() && "Unexpected unresolved node");148MetadataPtrs.resize(N);149}150151/// Return the given metadata, creating a replaceable forward reference if152/// necessary.153Metadata *getMetadataFwdRef(unsigned Idx);154155/// Return the given metadata only if it is fully resolved.156///157/// Gives the same result as \a lookup(), unless \a MDNode::isResolved()158/// would give \c false.159Metadata *getMetadataIfResolved(unsigned Idx);160161MDNode *getMDNodeFwdRefOrNull(unsigned Idx);162void assignValue(Metadata *MD, unsigned Idx);163void tryToResolveCycles();164bool hasFwdRefs() const { return !ForwardReference.empty(); }165int getNextFwdRef() {166assert(hasFwdRefs());167return *ForwardReference.begin();168}169170/// Upgrade a type that had an MDString reference.171void addTypeRef(MDString &UUID, DICompositeType &CT);172173/// Upgrade a type that had an MDString reference.174Metadata *upgradeTypeRef(Metadata *MaybeUUID);175176/// Upgrade a type ref array that may have MDString references.177Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);178179private:180Metadata *resolveTypeRefArray(Metadata *MaybeTuple);181};182183void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {184if (auto *MDN = dyn_cast<MDNode>(MD))185if (!MDN->isResolved())186UnresolvedNodes.insert(Idx);187188if (Idx == size()) {189push_back(MD);190return;191}192193if (Idx >= size())194resize(Idx + 1);195196TrackingMDRef &OldMD = MetadataPtrs[Idx];197if (!OldMD) {198OldMD.reset(MD);199return;200}201202// If there was a forward reference to this value, replace it.203TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));204PrevMD->replaceAllUsesWith(MD);205ForwardReference.erase(Idx);206}207208Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {209// Bail out for a clearly invalid value.210if (Idx >= RefsUpperBound)211return nullptr;212213if (Idx >= size())214resize(Idx + 1);215216if (Metadata *MD = MetadataPtrs[Idx])217return MD;218219// Track forward refs to be resolved later.220ForwardReference.insert(Idx);221222// Create and return a placeholder, which will later be RAUW'd.223++NumMDNodeTemporary;224Metadata *MD = MDNode::getTemporary(Context, std::nullopt).release();225MetadataPtrs[Idx].reset(MD);226return MD;227}228229Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {230Metadata *MD = lookup(Idx);231if (auto *N = dyn_cast_or_null<MDNode>(MD))232if (!N->isResolved())233return nullptr;234return MD;235}236237MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {238return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));239}240241void BitcodeReaderMetadataList::tryToResolveCycles() {242if (!ForwardReference.empty())243// Still forward references... can't resolve cycles.244return;245246// Give up on finding a full definition for any forward decls that remain.247for (const auto &Ref : OldTypeRefs.FwdDecls)248OldTypeRefs.Final.insert(Ref);249OldTypeRefs.FwdDecls.clear();250251// Upgrade from old type ref arrays. In strange cases, this could add to252// OldTypeRefs.Unknown.253for (const auto &Array : OldTypeRefs.Arrays)254Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));255OldTypeRefs.Arrays.clear();256257// Replace old string-based type refs with the resolved node, if possible.258// If we haven't seen the node, leave it to the verifier to complain about259// the invalid string reference.260for (const auto &Ref : OldTypeRefs.Unknown) {261if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))262Ref.second->replaceAllUsesWith(CT);263else264Ref.second->replaceAllUsesWith(Ref.first);265}266OldTypeRefs.Unknown.clear();267268if (UnresolvedNodes.empty())269// Nothing to do.270return;271272// Resolve any cycles.273for (unsigned I : UnresolvedNodes) {274auto &MD = MetadataPtrs[I];275auto *N = dyn_cast_or_null<MDNode>(MD);276if (!N)277continue;278279assert(!N->isTemporary() && "Unexpected forward reference");280N->resolveCycles();281}282283// Make sure we return early again until there's another unresolved ref.284UnresolvedNodes.clear();285}286287void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,288DICompositeType &CT) {289assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");290if (CT.isForwardDecl())291OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));292else293OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));294}295296Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {297auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);298if (LLVM_LIKELY(!UUID))299return MaybeUUID;300301if (auto *CT = OldTypeRefs.Final.lookup(UUID))302return CT;303304auto &Ref = OldTypeRefs.Unknown[UUID];305if (!Ref)306Ref = MDNode::getTemporary(Context, std::nullopt);307return Ref.get();308}309310Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {311auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);312if (!Tuple || Tuple->isDistinct())313return MaybeTuple;314315// Look through the array immediately if possible.316if (!Tuple->isTemporary())317return resolveTypeRefArray(Tuple);318319// Create and return a placeholder to use for now. Eventually320// resolveTypeRefArrays() will be resolve this forward reference.321OldTypeRefs.Arrays.emplace_back(322std::piecewise_construct, std::forward_as_tuple(Tuple),323std::forward_as_tuple(MDTuple::getTemporary(Context, std::nullopt)));324return OldTypeRefs.Arrays.back().second.get();325}326327Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {328auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);329if (!Tuple || Tuple->isDistinct())330return MaybeTuple;331332// Look through the DITypeRefArray, upgrading each DIType *.333SmallVector<Metadata *, 32> Ops;334Ops.reserve(Tuple->getNumOperands());335for (Metadata *MD : Tuple->operands())336Ops.push_back(upgradeTypeRef(MD));337338return MDTuple::get(Context, Ops);339}340341namespace {342343class PlaceholderQueue {344// Placeholders would thrash around when moved, so store in a std::deque345// instead of some sort of vector.346std::deque<DistinctMDOperandPlaceholder> PHs;347348public:349~PlaceholderQueue() {350assert(empty() &&351"PlaceholderQueue hasn't been flushed before being destroyed");352}353bool empty() const { return PHs.empty(); }354DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);355void flush(BitcodeReaderMetadataList &MetadataList);356357/// Return the list of temporaries nodes in the queue, these need to be358/// loaded before we can flush the queue.359void getTemporaries(BitcodeReaderMetadataList &MetadataList,360DenseSet<unsigned> &Temporaries) {361for (auto &PH : PHs) {362auto ID = PH.getID();363auto *MD = MetadataList.lookup(ID);364if (!MD) {365Temporaries.insert(ID);366continue;367}368auto *N = dyn_cast_or_null<MDNode>(MD);369if (N && N->isTemporary())370Temporaries.insert(ID);371}372}373};374375} // end anonymous namespace376377DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {378PHs.emplace_back(ID);379return PHs.back();380}381382void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {383while (!PHs.empty()) {384auto *MD = MetadataList.lookup(PHs.front().getID());385assert(MD && "Flushing placeholder on unassigned MD");386#ifndef NDEBUG387if (auto *MDN = dyn_cast<MDNode>(MD))388assert(MDN->isResolved() &&389"Flushing Placeholder while cycles aren't resolved");390#endif391PHs.front().replaceUseWith(MD);392PHs.pop_front();393}394}395396} // anonymous namespace397398static Error error(const Twine &Message) {399return make_error<StringError>(400Message, make_error_code(BitcodeError::CorruptedBitcode));401}402403class MetadataLoader::MetadataLoaderImpl {404BitcodeReaderMetadataList MetadataList;405BitcodeReaderValueList &ValueList;406BitstreamCursor &Stream;407LLVMContext &Context;408Module &TheModule;409MetadataLoaderCallbacks Callbacks;410411/// Cursor associated with the lazy-loading of Metadata. This is the easy way412/// to keep around the right "context" (Abbrev list) to be able to jump in413/// the middle of the metadata block and load any record.414BitstreamCursor IndexCursor;415416/// Index that keeps track of MDString values.417std::vector<StringRef> MDStringRef;418419/// On-demand loading of a single MDString. Requires the index above to be420/// populated.421MDString *lazyLoadOneMDString(unsigned Idx);422423/// Index that keeps track of where to find a metadata record in the stream.424std::vector<uint64_t> GlobalMetadataBitPosIndex;425426/// Cursor position of the start of the global decl attachments, to enable427/// loading using the index built for lazy loading, instead of forward428/// references.429uint64_t GlobalDeclAttachmentPos = 0;430431#ifndef NDEBUG432/// Baisic correctness check that we end up parsing all of the global decl433/// attachments.434unsigned NumGlobalDeclAttachSkipped = 0;435unsigned NumGlobalDeclAttachParsed = 0;436#endif437438/// Load the global decl attachments, using the index built for lazy loading.439Expected<bool> loadGlobalDeclAttachments();440441/// Populate the index above to enable lazily loading of metadata, and load442/// the named metadata as well as the transitively referenced global443/// Metadata.444Expected<bool> lazyLoadModuleMetadataBlock();445446/// On-demand loading of a single metadata. Requires the index above to be447/// populated.448void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);449450// Keep mapping of seens pair of old-style CU <-> SP, and update pointers to451// point from SP to CU after a block is completly parsed.452std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;453454/// Functions that need to be matched with subprograms when upgrading old455/// metadata.456SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;457458// Map the bitcode's custom MDKind ID to the Module's MDKind ID.459DenseMap<unsigned, unsigned> MDKindMap;460461bool StripTBAA = false;462bool HasSeenOldLoopTags = false;463bool NeedUpgradeToDIGlobalVariableExpression = false;464bool NeedDeclareExpressionUpgrade = false;465466/// Map DILocalScope to the enclosing DISubprogram, if any.467DenseMap<DILocalScope *, DISubprogram *> ParentSubprogram;468469/// True if metadata is being parsed for a module being ThinLTO imported.470bool IsImporting = false;471472Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,473PlaceholderQueue &Placeholders, StringRef Blob,474unsigned &NextMetadataNo);475Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,476function_ref<void(StringRef)> CallBack);477Error parseGlobalObjectAttachment(GlobalObject &GO,478ArrayRef<uint64_t> Record);479Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);480481void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);482483/// Upgrade old-style CU <-> SP pointers to point from SP to CU.484void upgradeCUSubprograms() {485for (auto CU_SP : CUSubprograms)486if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))487for (auto &Op : SPs->operands())488if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))489SP->replaceUnit(CU_SP.first);490CUSubprograms.clear();491}492493/// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.494void upgradeCUVariables() {495if (!NeedUpgradeToDIGlobalVariableExpression)496return;497498// Upgrade list of variables attached to the CUs.499if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))500for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {501auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));502if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))503for (unsigned I = 0; I < GVs->getNumOperands(); I++)504if (auto *GV =505dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {506auto *DGVE = DIGlobalVariableExpression::getDistinct(507Context, GV, DIExpression::get(Context, {}));508GVs->replaceOperandWith(I, DGVE);509}510}511512// Upgrade variables attached to globals.513for (auto &GV : TheModule.globals()) {514SmallVector<MDNode *, 1> MDs;515GV.getMetadata(LLVMContext::MD_dbg, MDs);516GV.eraseMetadata(LLVMContext::MD_dbg);517for (auto *MD : MDs)518if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {519auto *DGVE = DIGlobalVariableExpression::getDistinct(520Context, DGV, DIExpression::get(Context, {}));521GV.addMetadata(LLVMContext::MD_dbg, *DGVE);522} else523GV.addMetadata(LLVMContext::MD_dbg, *MD);524}525}526527DISubprogram *findEnclosingSubprogram(DILocalScope *S) {528if (!S)529return nullptr;530if (auto *SP = ParentSubprogram[S]) {531return SP;532}533534DILocalScope *InitialScope = S;535DenseSet<DILocalScope *> Visited;536while (S && !isa<DISubprogram>(S)) {537S = dyn_cast_or_null<DILocalScope>(S->getScope());538if (Visited.contains(S))539break;540Visited.insert(S);541}542ParentSubprogram[InitialScope] = llvm::dyn_cast_or_null<DISubprogram>(S);543544return ParentSubprogram[InitialScope];545}546547/// Move local imports from DICompileUnit's 'imports' field to548/// DISubprogram's retainedNodes.549void upgradeCULocals() {550if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) {551for (MDNode *N : CUNodes->operands()) {552auto *CU = dyn_cast<DICompileUnit>(N);553if (!CU)554continue;555556if (CU->getRawImportedEntities()) {557// Collect a set of imported entities to be moved.558SetVector<Metadata *> EntitiesToRemove;559for (Metadata *Op : CU->getImportedEntities()->operands()) {560auto *IE = cast<DIImportedEntity>(Op);561if (dyn_cast_or_null<DILocalScope>(IE->getScope())) {562EntitiesToRemove.insert(IE);563}564}565566if (!EntitiesToRemove.empty()) {567// Make a new list of CU's 'imports'.568SmallVector<Metadata *> NewImports;569for (Metadata *Op : CU->getImportedEntities()->operands()) {570if (!EntitiesToRemove.contains(cast<DIImportedEntity>(Op))) {571NewImports.push_back(Op);572}573}574575// Find DISubprogram corresponding to each entity.576std::map<DISubprogram *, SmallVector<Metadata *>> SPToEntities;577for (auto *I : EntitiesToRemove) {578auto *Entity = cast<DIImportedEntity>(I);579if (auto *SP = findEnclosingSubprogram(580cast<DILocalScope>(Entity->getScope()))) {581SPToEntities[SP].push_back(Entity);582}583}584585// Update DISubprograms' retainedNodes.586for (auto I = SPToEntities.begin(); I != SPToEntities.end(); ++I) {587auto *SP = I->first;588auto RetainedNodes = SP->getRetainedNodes();589SmallVector<Metadata *> MDs(RetainedNodes.begin(),590RetainedNodes.end());591MDs.append(I->second);592SP->replaceRetainedNodes(MDNode::get(Context, MDs));593}594595// Remove entities with local scope from CU.596CU->replaceImportedEntities(MDTuple::get(Context, NewImports));597}598}599}600}601602ParentSubprogram.clear();603}604605/// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that606/// describes a function argument.607void upgradeDeclareExpressions(Function &F) {608if (!NeedDeclareExpressionUpgrade)609return;610611auto UpdateDeclareIfNeeded = [&](auto *Declare) {612auto *DIExpr = Declare->getExpression();613if (!DIExpr || !DIExpr->startsWithDeref() ||614!isa_and_nonnull<Argument>(Declare->getAddress()))615return;616SmallVector<uint64_t, 8> Ops;617Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end());618Declare->setExpression(DIExpression::get(Context, Ops));619};620621for (auto &BB : F)622for (auto &I : BB) {623for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {624if (DVR.isDbgDeclare())625UpdateDeclareIfNeeded(&DVR);626}627if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))628UpdateDeclareIfNeeded(DDI);629}630}631632/// Upgrade the expression from previous versions.633Error upgradeDIExpression(uint64_t FromVersion,634MutableArrayRef<uint64_t> &Expr,635SmallVectorImpl<uint64_t> &Buffer) {636auto N = Expr.size();637switch (FromVersion) {638default:639return error("Invalid record");640case 0:641if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)642Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;643[[fallthrough]];644case 1:645// Move DW_OP_deref to the end.646if (N && Expr[0] == dwarf::DW_OP_deref) {647auto End = Expr.end();648if (Expr.size() >= 3 &&649*std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)650End = std::prev(End, 3);651std::move(std::next(Expr.begin()), End, Expr.begin());652*std::prev(End) = dwarf::DW_OP_deref;653}654NeedDeclareExpressionUpgrade = true;655[[fallthrough]];656case 2: {657// Change DW_OP_plus to DW_OP_plus_uconst.658// Change DW_OP_minus to DW_OP_uconst, DW_OP_minus659auto SubExpr = ArrayRef<uint64_t>(Expr);660while (!SubExpr.empty()) {661// Skip past other operators with their operands662// for this version of the IR, obtained from663// from historic DIExpression::ExprOperand::getSize().664size_t HistoricSize;665switch (SubExpr.front()) {666default:667HistoricSize = 1;668break;669case dwarf::DW_OP_constu:670case dwarf::DW_OP_minus:671case dwarf::DW_OP_plus:672HistoricSize = 2;673break;674case dwarf::DW_OP_LLVM_fragment:675HistoricSize = 3;676break;677}678679// If the expression is malformed, make sure we don't680// copy more elements than we should.681HistoricSize = std::min(SubExpr.size(), HistoricSize);682ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1);683684switch (SubExpr.front()) {685case dwarf::DW_OP_plus:686Buffer.push_back(dwarf::DW_OP_plus_uconst);687Buffer.append(Args.begin(), Args.end());688break;689case dwarf::DW_OP_minus:690Buffer.push_back(dwarf::DW_OP_constu);691Buffer.append(Args.begin(), Args.end());692Buffer.push_back(dwarf::DW_OP_minus);693break;694default:695Buffer.push_back(*SubExpr.begin());696Buffer.append(Args.begin(), Args.end());697break;698}699700// Continue with remaining elements.701SubExpr = SubExpr.slice(HistoricSize);702}703Expr = MutableArrayRef<uint64_t>(Buffer);704[[fallthrough]];705}706case 3:707// Up-to-date!708break;709}710711return Error::success();712}713714void upgradeDebugInfo(bool ModuleLevel) {715upgradeCUSubprograms();716upgradeCUVariables();717if (ModuleLevel)718upgradeCULocals();719}720721void callMDTypeCallback(Metadata **Val, unsigned TypeID);722723public:724MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,725BitcodeReaderValueList &ValueList,726MetadataLoaderCallbacks Callbacks, bool IsImporting)727: MetadataList(TheModule.getContext(), Stream.SizeInBytes()),728ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),729TheModule(TheModule), Callbacks(std::move(Callbacks)),730IsImporting(IsImporting) {}731732Error parseMetadata(bool ModuleLevel);733734bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }735736Metadata *getMetadataFwdRefOrLoad(unsigned ID) {737if (ID < MDStringRef.size())738return lazyLoadOneMDString(ID);739if (auto *MD = MetadataList.lookup(ID))740return MD;741// If lazy-loading is enabled, we try recursively to load the operand742// instead of creating a temporary.743if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {744PlaceholderQueue Placeholders;745lazyLoadOneMetadata(ID, Placeholders);746resolveForwardRefsAndPlaceholders(Placeholders);747return MetadataList.lookup(ID);748}749return MetadataList.getMetadataFwdRef(ID);750}751752DISubprogram *lookupSubprogramForFunction(Function *F) {753return FunctionsWithSPs.lookup(F);754}755756bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }757758Error parseMetadataAttachment(Function &F,759ArrayRef<Instruction *> InstructionList);760761Error parseMetadataKinds();762763void setStripTBAA(bool Value) { StripTBAA = Value; }764bool isStrippingTBAA() const { return StripTBAA; }765766unsigned size() const { return MetadataList.size(); }767void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }768void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }769};770771Expected<bool>772MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {773IndexCursor = Stream;774SmallVector<uint64_t, 64> Record;775GlobalDeclAttachmentPos = 0;776// Get the abbrevs, and preload record positions to make them lazy-loadable.777while (true) {778uint64_t SavedPos = IndexCursor.GetCurrentBitNo();779BitstreamEntry Entry;780if (Error E =781IndexCursor782.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)783.moveInto(Entry))784return std::move(E);785786switch (Entry.Kind) {787case BitstreamEntry::SubBlock: // Handled for us already.788case BitstreamEntry::Error:789return error("Malformed block");790case BitstreamEntry::EndBlock: {791return true;792}793case BitstreamEntry::Record: {794// The interesting case.795++NumMDRecordLoaded;796uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();797unsigned Code;798if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))799return std::move(E);800switch (Code) {801case bitc::METADATA_STRINGS: {802// Rewind and parse the strings.803if (Error Err = IndexCursor.JumpToBit(CurrentPos))804return std::move(Err);805StringRef Blob;806Record.clear();807if (Expected<unsigned> MaybeRecord =808IndexCursor.readRecord(Entry.ID, Record, &Blob))809;810else811return MaybeRecord.takeError();812unsigned NumStrings = Record[0];813MDStringRef.reserve(NumStrings);814auto IndexNextMDString = [&](StringRef Str) {815MDStringRef.push_back(Str);816};817if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))818return std::move(Err);819break;820}821case bitc::METADATA_INDEX_OFFSET: {822// This is the offset to the index, when we see this we skip all the823// records and load only an index to these.824if (Error Err = IndexCursor.JumpToBit(CurrentPos))825return std::move(Err);826Record.clear();827if (Expected<unsigned> MaybeRecord =828IndexCursor.readRecord(Entry.ID, Record))829;830else831return MaybeRecord.takeError();832if (Record.size() != 2)833return error("Invalid record");834auto Offset = Record[0] + (Record[1] << 32);835auto BeginPos = IndexCursor.GetCurrentBitNo();836if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))837return std::move(Err);838Expected<BitstreamEntry> MaybeEntry =839IndexCursor.advanceSkippingSubblocks(840BitstreamCursor::AF_DontPopBlockAtEnd);841if (!MaybeEntry)842return MaybeEntry.takeError();843Entry = MaybeEntry.get();844assert(Entry.Kind == BitstreamEntry::Record &&845"Corrupted bitcode: Expected `Record` when trying to find the "846"Metadata index");847Record.clear();848if (Expected<unsigned> MaybeCode =849IndexCursor.readRecord(Entry.ID, Record))850assert(MaybeCode.get() == bitc::METADATA_INDEX &&851"Corrupted bitcode: Expected `METADATA_INDEX` when trying to "852"find the Metadata index");853else854return MaybeCode.takeError();855// Delta unpack856auto CurrentValue = BeginPos;857GlobalMetadataBitPosIndex.reserve(Record.size());858for (auto &Elt : Record) {859CurrentValue += Elt;860GlobalMetadataBitPosIndex.push_back(CurrentValue);861}862break;863}864case bitc::METADATA_INDEX:865// We don't expect to get there, the Index is loaded when we encounter866// the offset.867return error("Corrupted Metadata block");868case bitc::METADATA_NAME: {869// Named metadata need to be materialized now and aren't deferred.870if (Error Err = IndexCursor.JumpToBit(CurrentPos))871return std::move(Err);872Record.clear();873874unsigned Code;875if (Expected<unsigned> MaybeCode =876IndexCursor.readRecord(Entry.ID, Record)) {877Code = MaybeCode.get();878assert(Code == bitc::METADATA_NAME);879} else880return MaybeCode.takeError();881882// Read name of the named metadata.883SmallString<8> Name(Record.begin(), Record.end());884if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())885Code = MaybeCode.get();886else887return MaybeCode.takeError();888889// Named Metadata comes in two parts, we expect the name to be followed890// by the node891Record.clear();892if (Expected<unsigned> MaybeNextBitCode =893IndexCursor.readRecord(Code, Record))894assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);895else896return MaybeNextBitCode.takeError();897898// Read named metadata elements.899unsigned Size = Record.size();900NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);901for (unsigned i = 0; i != Size; ++i) {902// FIXME: We could use a placeholder here, however NamedMDNode are903// taking MDNode as operand and not using the Metadata infrastructure.904// It is acknowledged by 'TODO: Inherit from Metadata' in the905// NamedMDNode class definition.906MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);907assert(MD && "Invalid metadata: expect fwd ref to MDNode");908NMD->addOperand(MD);909}910break;911}912case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {913if (!GlobalDeclAttachmentPos)914GlobalDeclAttachmentPos = SavedPos;915#ifndef NDEBUG916NumGlobalDeclAttachSkipped++;917#endif918break;919}920case bitc::METADATA_KIND:921case bitc::METADATA_STRING_OLD:922case bitc::METADATA_OLD_FN_NODE:923case bitc::METADATA_OLD_NODE:924case bitc::METADATA_VALUE:925case bitc::METADATA_DISTINCT_NODE:926case bitc::METADATA_NODE:927case bitc::METADATA_LOCATION:928case bitc::METADATA_GENERIC_DEBUG:929case bitc::METADATA_SUBRANGE:930case bitc::METADATA_ENUMERATOR:931case bitc::METADATA_BASIC_TYPE:932case bitc::METADATA_STRING_TYPE:933case bitc::METADATA_DERIVED_TYPE:934case bitc::METADATA_COMPOSITE_TYPE:935case bitc::METADATA_SUBROUTINE_TYPE:936case bitc::METADATA_MODULE:937case bitc::METADATA_FILE:938case bitc::METADATA_COMPILE_UNIT:939case bitc::METADATA_SUBPROGRAM:940case bitc::METADATA_LEXICAL_BLOCK:941case bitc::METADATA_LEXICAL_BLOCK_FILE:942case bitc::METADATA_NAMESPACE:943case bitc::METADATA_COMMON_BLOCK:944case bitc::METADATA_MACRO:945case bitc::METADATA_MACRO_FILE:946case bitc::METADATA_TEMPLATE_TYPE:947case bitc::METADATA_TEMPLATE_VALUE:948case bitc::METADATA_GLOBAL_VAR:949case bitc::METADATA_LOCAL_VAR:950case bitc::METADATA_ASSIGN_ID:951case bitc::METADATA_LABEL:952case bitc::METADATA_EXPRESSION:953case bitc::METADATA_OBJC_PROPERTY:954case bitc::METADATA_IMPORTED_ENTITY:955case bitc::METADATA_GLOBAL_VAR_EXPR:956case bitc::METADATA_GENERIC_SUBRANGE:957// We don't expect to see any of these, if we see one, give up on958// lazy-loading and fallback.959MDStringRef.clear();960GlobalMetadataBitPosIndex.clear();961return false;962}963break;964}965}966}967}968969// Load the global decl attachments after building the lazy loading index.970// We don't load them "lazily" - all global decl attachments must be971// parsed since they aren't materialized on demand. However, by delaying972// their parsing until after the index is created, we can use the index973// instead of creating temporaries.974Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {975// Nothing to do if we didn't find any of these metadata records.976if (!GlobalDeclAttachmentPos)977return true;978// Use a temporary cursor so that we don't mess up the main Stream cursor or979// the lazy loading IndexCursor (which holds the necessary abbrev ids).980BitstreamCursor TempCursor = Stream;981SmallVector<uint64_t, 64> Record;982// Jump to the position before the first global decl attachment, so we can983// scan for the first BitstreamEntry record.984if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))985return std::move(Err);986while (true) {987BitstreamEntry Entry;988if (Error E =989TempCursor990.advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)991.moveInto(Entry))992return std::move(E);993994switch (Entry.Kind) {995case BitstreamEntry::SubBlock: // Handled for us already.996case BitstreamEntry::Error:997return error("Malformed block");998case BitstreamEntry::EndBlock:999// Check that we parsed them all.1000assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);1001return true;1002case BitstreamEntry::Record:1003break;1004}1005uint64_t CurrentPos = TempCursor.GetCurrentBitNo();1006Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);1007if (!MaybeCode)1008return MaybeCode.takeError();1009if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {1010// Anything other than a global decl attachment signals the end of1011// these records. Check that we parsed them all.1012assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);1013return true;1014}1015#ifndef NDEBUG1016NumGlobalDeclAttachParsed++;1017#endif1018// FIXME: we need to do this early because we don't materialize global1019// value explicitly.1020if (Error Err = TempCursor.JumpToBit(CurrentPos))1021return std::move(Err);1022Record.clear();1023if (Expected<unsigned> MaybeRecord =1024TempCursor.readRecord(Entry.ID, Record))1025;1026else1027return MaybeRecord.takeError();1028if (Record.size() % 2 == 0)1029return error("Invalid record");1030unsigned ValueID = Record[0];1031if (ValueID >= ValueList.size())1032return error("Invalid record");1033if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {1034// Need to save and restore the current position since1035// parseGlobalObjectAttachment will resolve all forward references which1036// would require parsing from locations stored in the index.1037CurrentPos = TempCursor.GetCurrentBitNo();1038if (Error Err = parseGlobalObjectAttachment(1039*GO, ArrayRef<uint64_t>(Record).slice(1)))1040return std::move(Err);1041if (Error Err = TempCursor.JumpToBit(CurrentPos))1042return std::move(Err);1043}1044}1045}10461047void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(Metadata **Val,1048unsigned TypeID) {1049if (Callbacks.MDType) {1050(*Callbacks.MDType)(Val, TypeID, Callbacks.GetTypeByID,1051Callbacks.GetContainedTypeID);1052}1053}10541055/// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing1056/// module level metadata.1057Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {1058if (!ModuleLevel && MetadataList.hasFwdRefs())1059return error("Invalid metadata: fwd refs into function blocks");10601061// Record the entry position so that we can jump back here and efficiently1062// skip the whole block in case we lazy-load.1063auto EntryPos = Stream.GetCurrentBitNo();10641065if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))1066return Err;10671068SmallVector<uint64_t, 64> Record;1069PlaceholderQueue Placeholders;10701071// We lazy-load module-level metadata: we build an index for each record, and1072// then load individual record as needed, starting with the named metadata.1073if (ModuleLevel && IsImporting && MetadataList.empty() &&1074!DisableLazyLoading) {1075auto SuccessOrErr = lazyLoadModuleMetadataBlock();1076if (!SuccessOrErr)1077return SuccessOrErr.takeError();1078if (SuccessOrErr.get()) {1079// An index was successfully created and we will be able to load metadata1080// on-demand.1081MetadataList.resize(MDStringRef.size() +1082GlobalMetadataBitPosIndex.size());10831084// Now that we have built the index, load the global decl attachments1085// that were deferred during that process. This avoids creating1086// temporaries.1087SuccessOrErr = loadGlobalDeclAttachments();1088if (!SuccessOrErr)1089return SuccessOrErr.takeError();1090assert(SuccessOrErr.get());10911092// Reading the named metadata created forward references and/or1093// placeholders, that we flush here.1094resolveForwardRefsAndPlaceholders(Placeholders);1095upgradeDebugInfo(ModuleLevel);1096// Return at the beginning of the block, since it is easy to skip it1097// entirely from there.1098Stream.ReadBlockEnd(); // Pop the abbrev block context.1099if (Error Err = IndexCursor.JumpToBit(EntryPos))1100return Err;1101if (Error Err = Stream.SkipBlock()) {1102// FIXME this drops the error on the floor, which1103// ThinLTO/X86/debuginfo-cu-import.ll relies on.1104consumeError(std::move(Err));1105return Error::success();1106}1107return Error::success();1108}1109// Couldn't load an index, fallback to loading all the block "old-style".1110}11111112unsigned NextMetadataNo = MetadataList.size();11131114// Read all the records.1115while (true) {1116BitstreamEntry Entry;1117if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))1118return E;11191120switch (Entry.Kind) {1121case BitstreamEntry::SubBlock: // Handled for us already.1122case BitstreamEntry::Error:1123return error("Malformed block");1124case BitstreamEntry::EndBlock:1125resolveForwardRefsAndPlaceholders(Placeholders);1126upgradeDebugInfo(ModuleLevel);1127return Error::success();1128case BitstreamEntry::Record:1129// The interesting case.1130break;1131}11321133// Read a record.1134Record.clear();1135StringRef Blob;1136++NumMDRecordLoaded;1137if (Expected<unsigned> MaybeCode =1138Stream.readRecord(Entry.ID, Record, &Blob)) {1139if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,1140Blob, NextMetadataNo))1141return Err;1142} else1143return MaybeCode.takeError();1144}1145}11461147MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {1148++NumMDStringLoaded;1149if (Metadata *MD = MetadataList.lookup(ID))1150return cast<MDString>(MD);1151auto MDS = MDString::get(Context, MDStringRef[ID]);1152MetadataList.assignValue(MDS, ID);1153return MDS;1154}11551156void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(1157unsigned ID, PlaceholderQueue &Placeholders) {1158assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());1159assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");1160// Lookup first if the metadata hasn't already been loaded.1161if (auto *MD = MetadataList.lookup(ID)) {1162auto *N = cast<MDNode>(MD);1163if (!N->isTemporary())1164return;1165}1166SmallVector<uint64_t, 64> Record;1167StringRef Blob;1168if (Error Err = IndexCursor.JumpToBit(1169GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))1170report_fatal_error("lazyLoadOneMetadata failed jumping: " +1171Twine(toString(std::move(Err))));1172BitstreamEntry Entry;1173if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))1174// FIXME this drops the error on the floor.1175report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +1176Twine(toString(std::move(E))));1177++NumMDRecordLoaded;1178if (Expected<unsigned> MaybeCode =1179IndexCursor.readRecord(Entry.ID, Record, &Blob)) {1180if (Error Err =1181parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))1182report_fatal_error("Can't lazyload MD, parseOneMetadata: " +1183Twine(toString(std::move(Err))));1184} else1185report_fatal_error("Can't lazyload MD: " +1186Twine(toString(MaybeCode.takeError())));1187}11881189/// Ensure that all forward-references and placeholders are resolved.1190/// Iteratively lazy-loading metadata on-demand if needed.1191void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(1192PlaceholderQueue &Placeholders) {1193DenseSet<unsigned> Temporaries;1194while (true) {1195// Populate Temporaries with the placeholders that haven't been loaded yet.1196Placeholders.getTemporaries(MetadataList, Temporaries);11971198// If we don't have any temporary, or FwdReference, we're done!1199if (Temporaries.empty() && !MetadataList.hasFwdRefs())1200break;12011202// First, load all the temporaries. This can add new placeholders or1203// forward references.1204for (auto ID : Temporaries)1205lazyLoadOneMetadata(ID, Placeholders);1206Temporaries.clear();12071208// Second, load the forward-references. This can also add new placeholders1209// or forward references.1210while (MetadataList.hasFwdRefs())1211lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);1212}1213// At this point we don't have any forward reference remaining, or temporary1214// that haven't been loaded. We can safely drop RAUW support and mark cycles1215// as resolved.1216MetadataList.tryToResolveCycles();12171218// Finally, everything is in place, we can replace the placeholders operands1219// with the final node they refer to.1220Placeholders.flush(MetadataList);1221}12221223static Value *getValueFwdRef(BitcodeReaderValueList &ValueList, unsigned Idx,1224Type *Ty, unsigned TyID) {1225Value *V = ValueList.getValueFwdRef(Idx, Ty, TyID,1226/*ConstExprInsertBB*/ nullptr);1227if (V)1228return V;12291230// This is a reference to a no longer supported constant expression.1231// Pretend that the constant was deleted, which will replace metadata1232// references with undef.1233// TODO: This is a rather indirect check. It would be more elegant to use1234// a separate ErrorInfo for constant materialization failure and thread1235// the error reporting through getValueFwdRef().1236if (Idx < ValueList.size() && ValueList[Idx] &&1237ValueList[Idx]->getType() == Ty)1238return UndefValue::get(Ty);12391240return nullptr;1241}12421243Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(1244SmallVectorImpl<uint64_t> &Record, unsigned Code,1245PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {12461247bool IsDistinct = false;1248auto getMD = [&](unsigned ID) -> Metadata * {1249if (ID < MDStringRef.size())1250return lazyLoadOneMDString(ID);1251if (!IsDistinct) {1252if (auto *MD = MetadataList.lookup(ID))1253return MD;1254// If lazy-loading is enabled, we try recursively to load the operand1255// instead of creating a temporary.1256if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {1257// Create a temporary for the node that is referencing the operand we1258// will lazy-load. It is needed before recursing in case there are1259// uniquing cycles.1260MetadataList.getMetadataFwdRef(NextMetadataNo);1261lazyLoadOneMetadata(ID, Placeholders);1262return MetadataList.lookup(ID);1263}1264// Return a temporary.1265return MetadataList.getMetadataFwdRef(ID);1266}1267if (auto *MD = MetadataList.getMetadataIfResolved(ID))1268return MD;1269return &Placeholders.getPlaceholderOp(ID);1270};1271auto getMDOrNull = [&](unsigned ID) -> Metadata * {1272if (ID)1273return getMD(ID - 1);1274return nullptr;1275};1276auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {1277if (ID)1278return MetadataList.getMetadataFwdRef(ID - 1);1279return nullptr;1280};1281auto getMDString = [&](unsigned ID) -> MDString * {1282// This requires that the ID is not really a forward reference. In1283// particular, the MDString must already have been resolved.1284auto MDS = getMDOrNull(ID);1285return cast_or_null<MDString>(MDS);1286};12871288// Support for old type refs.1289auto getDITypeRefOrNull = [&](unsigned ID) {1290return MetadataList.upgradeTypeRef(getMDOrNull(ID));1291};12921293#define GET_OR_DISTINCT(CLASS, ARGS) \1294(IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)12951296switch (Code) {1297default: // Default behavior: ignore.1298break;1299case bitc::METADATA_NAME: {1300// Read name of the named metadata.1301SmallString<8> Name(Record.begin(), Record.end());1302Record.clear();1303if (Error E = Stream.ReadCode().moveInto(Code))1304return E;13051306++NumMDRecordLoaded;1307if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {1308if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)1309return error("METADATA_NAME not followed by METADATA_NAMED_NODE");1310} else1311return MaybeNextBitCode.takeError();13121313// Read named metadata elements.1314unsigned Size = Record.size();1315NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);1316for (unsigned i = 0; i != Size; ++i) {1317MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);1318if (!MD)1319return error("Invalid named metadata: expect fwd ref to MDNode");1320NMD->addOperand(MD);1321}1322break;1323}1324case bitc::METADATA_OLD_FN_NODE: {1325// Deprecated, but still needed to read old bitcode files.1326// This is a LocalAsMetadata record, the only type of function-local1327// metadata.1328if (Record.size() % 2 == 1)1329return error("Invalid record");13301331// If this isn't a LocalAsMetadata record, we're dropping it. This used1332// to be legal, but there's no upgrade path.1333auto dropRecord = [&] {1334MetadataList.assignValue(MDNode::get(Context, std::nullopt),1335NextMetadataNo);1336NextMetadataNo++;1337};1338if (Record.size() != 2) {1339dropRecord();1340break;1341}13421343unsigned TyID = Record[0];1344Type *Ty = Callbacks.GetTypeByID(TyID);1345if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy()) {1346dropRecord();1347break;1348}13491350Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID,1351/*ConstExprInsertBB*/ nullptr);1352if (!V)1353return error("Invalid value reference from old fn metadata");13541355MetadataList.assignValue(LocalAsMetadata::get(V), NextMetadataNo);1356NextMetadataNo++;1357break;1358}1359case bitc::METADATA_OLD_NODE: {1360// Deprecated, but still needed to read old bitcode files.1361if (Record.size() % 2 == 1)1362return error("Invalid record");13631364unsigned Size = Record.size();1365SmallVector<Metadata *, 8> Elts;1366for (unsigned i = 0; i != Size; i += 2) {1367unsigned TyID = Record[i];1368Type *Ty = Callbacks.GetTypeByID(TyID);1369if (!Ty)1370return error("Invalid record");1371if (Ty->isMetadataTy())1372Elts.push_back(getMD(Record[i + 1]));1373else if (!Ty->isVoidTy()) {1374Value *V = getValueFwdRef(ValueList, Record[i + 1], Ty, TyID);1375if (!V)1376return error("Invalid value reference from old metadata");1377Metadata *MD = ValueAsMetadata::get(V);1378assert(isa<ConstantAsMetadata>(MD) &&1379"Expected non-function-local metadata");1380callMDTypeCallback(&MD, TyID);1381Elts.push_back(MD);1382} else1383Elts.push_back(nullptr);1384}1385MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);1386NextMetadataNo++;1387break;1388}1389case bitc::METADATA_VALUE: {1390if (Record.size() != 2)1391return error("Invalid record");13921393unsigned TyID = Record[0];1394Type *Ty = Callbacks.GetTypeByID(TyID);1395if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy())1396return error("Invalid record");13971398Value *V = getValueFwdRef(ValueList, Record[1], Ty, TyID);1399if (!V)1400return error("Invalid value reference from metadata");14011402Metadata *MD = ValueAsMetadata::get(V);1403callMDTypeCallback(&MD, TyID);1404MetadataList.assignValue(MD, NextMetadataNo);1405NextMetadataNo++;1406break;1407}1408case bitc::METADATA_DISTINCT_NODE:1409IsDistinct = true;1410[[fallthrough]];1411case bitc::METADATA_NODE: {1412SmallVector<Metadata *, 8> Elts;1413Elts.reserve(Record.size());1414for (unsigned ID : Record)1415Elts.push_back(getMDOrNull(ID));1416MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)1417: MDNode::get(Context, Elts),1418NextMetadataNo);1419NextMetadataNo++;1420break;1421}1422case bitc::METADATA_LOCATION: {1423if (Record.size() != 5 && Record.size() != 6)1424return error("Invalid record");14251426IsDistinct = Record[0];1427unsigned Line = Record[1];1428unsigned Column = Record[2];1429Metadata *Scope = getMD(Record[3]);1430Metadata *InlinedAt = getMDOrNull(Record[4]);1431bool ImplicitCode = Record.size() == 6 && Record[5];1432MetadataList.assignValue(1433GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,1434ImplicitCode)),1435NextMetadataNo);1436NextMetadataNo++;1437break;1438}1439case bitc::METADATA_GENERIC_DEBUG: {1440if (Record.size() < 4)1441return error("Invalid record");14421443IsDistinct = Record[0];1444unsigned Tag = Record[1];1445unsigned Version = Record[2];14461447if (Tag >= 1u << 16 || Version != 0)1448return error("Invalid record");14491450auto *Header = getMDString(Record[3]);1451SmallVector<Metadata *, 8> DwarfOps;1452for (unsigned I = 4, E = Record.size(); I != E; ++I)1453DwarfOps.push_back(getMDOrNull(Record[I]));1454MetadataList.assignValue(1455GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),1456NextMetadataNo);1457NextMetadataNo++;1458break;1459}1460case bitc::METADATA_SUBRANGE: {1461Metadata *Val = nullptr;1462// Operand 'count' is interpreted as:1463// - Signed integer (version 0)1464// - Metadata node (version 1)1465// Operand 'lowerBound' is interpreted as:1466// - Signed integer (version 0 and 1)1467// - Metadata node (version 2)1468// Operands 'upperBound' and 'stride' are interpreted as:1469// - Metadata node (version 2)1470switch (Record[0] >> 1) {1471case 0:1472Val = GET_OR_DISTINCT(DISubrange,1473(Context, Record[1], unrotateSign(Record[2])));1474break;1475case 1:1476Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),1477unrotateSign(Record[2])));1478break;1479case 2:1480Val = GET_OR_DISTINCT(1481DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),1482getMDOrNull(Record[3]), getMDOrNull(Record[4])));1483break;1484default:1485return error("Invalid record: Unsupported version of DISubrange");1486}14871488MetadataList.assignValue(Val, NextMetadataNo);1489IsDistinct = Record[0] & 1;1490NextMetadataNo++;1491break;1492}1493case bitc::METADATA_GENERIC_SUBRANGE: {1494Metadata *Val = nullptr;1495Val = GET_OR_DISTINCT(DIGenericSubrange,1496(Context, getMDOrNull(Record[1]),1497getMDOrNull(Record[2]), getMDOrNull(Record[3]),1498getMDOrNull(Record[4])));14991500MetadataList.assignValue(Val, NextMetadataNo);1501IsDistinct = Record[0] & 1;1502NextMetadataNo++;1503break;1504}1505case bitc::METADATA_ENUMERATOR: {1506if (Record.size() < 3)1507return error("Invalid record");15081509IsDistinct = Record[0] & 1;1510bool IsUnsigned = Record[0] & 2;1511bool IsBigInt = Record[0] & 4;1512APInt Value;15131514if (IsBigInt) {1515const uint64_t BitWidth = Record[1];1516const size_t NumWords = Record.size() - 3;1517Value = readWideAPInt(ArrayRef(&Record[3], NumWords), BitWidth);1518} else1519Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);15201521MetadataList.assignValue(1522GET_OR_DISTINCT(DIEnumerator,1523(Context, Value, IsUnsigned, getMDString(Record[2]))),1524NextMetadataNo);1525NextMetadataNo++;1526break;1527}1528case bitc::METADATA_BASIC_TYPE: {1529if (Record.size() < 6 || Record.size() > 7)1530return error("Invalid record");15311532IsDistinct = Record[0];1533DINode::DIFlags Flags = (Record.size() > 6)1534? static_cast<DINode::DIFlags>(Record[6])1535: DINode::FlagZero;15361537MetadataList.assignValue(1538GET_OR_DISTINCT(DIBasicType,1539(Context, Record[1], getMDString(Record[2]), Record[3],1540Record[4], Record[5], Flags)),1541NextMetadataNo);1542NextMetadataNo++;1543break;1544}1545case bitc::METADATA_STRING_TYPE: {1546if (Record.size() > 9 || Record.size() < 8)1547return error("Invalid record");15481549IsDistinct = Record[0];1550bool SizeIs8 = Record.size() == 8;1551// StringLocationExp (i.e. Record[5]) is added at a later time1552// than the other fields. The code here enables backward compatibility.1553Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);1554unsigned Offset = SizeIs8 ? 5 : 6;1555MetadataList.assignValue(1556GET_OR_DISTINCT(DIStringType,1557(Context, Record[1], getMDString(Record[2]),1558getMDOrNull(Record[3]), getMDOrNull(Record[4]),1559StringLocationExp, Record[Offset], Record[Offset + 1],1560Record[Offset + 2])),1561NextMetadataNo);1562NextMetadataNo++;1563break;1564}1565case bitc::METADATA_DERIVED_TYPE: {1566if (Record.size() < 12 || Record.size() > 15)1567return error("Invalid record");15681569// DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means1570// that there is no DWARF address space associated with DIDerivedType.1571std::optional<unsigned> DWARFAddressSpace;1572if (Record.size() > 12 && Record[12])1573DWARFAddressSpace = Record[12] - 1;15741575Metadata *Annotations = nullptr;1576std::optional<DIDerivedType::PtrAuthData> PtrAuthData;15771578// Only look for annotations/ptrauth if both are allocated.1579// If not, we can't tell which was intended to be embedded, as both ptrauth1580// and annotations have been expected at Record[13] at various times.1581if (Record.size() > 14) {1582if (Record[13])1583Annotations = getMDOrNull(Record[13]);1584if (Record[14])1585PtrAuthData.emplace(Record[14]);1586}15871588IsDistinct = Record[0];1589DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);1590MetadataList.assignValue(1591GET_OR_DISTINCT(DIDerivedType,1592(Context, Record[1], getMDString(Record[2]),1593getMDOrNull(Record[3]), Record[4],1594getDITypeRefOrNull(Record[5]),1595getDITypeRefOrNull(Record[6]), Record[7], Record[8],1596Record[9], DWARFAddressSpace, PtrAuthData, Flags,1597getDITypeRefOrNull(Record[11]), Annotations)),1598NextMetadataNo);1599NextMetadataNo++;1600break;1601}1602case bitc::METADATA_COMPOSITE_TYPE: {1603if (Record.size() < 16 || Record.size() > 22)1604return error("Invalid record");16051606// If we have a UUID and this is not a forward declaration, lookup the1607// mapping.1608IsDistinct = Record[0] & 0x1;1609bool IsNotUsedInTypeRef = Record[0] >= 2;1610unsigned Tag = Record[1];1611MDString *Name = getMDString(Record[2]);1612Metadata *File = getMDOrNull(Record[3]);1613unsigned Line = Record[4];1614Metadata *Scope = getDITypeRefOrNull(Record[5]);1615Metadata *BaseType = nullptr;1616uint64_t SizeInBits = Record[7];1617if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())1618return error("Alignment value is too large");1619uint32_t AlignInBits = Record[8];1620uint64_t OffsetInBits = 0;1621DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);1622Metadata *Elements = nullptr;1623unsigned RuntimeLang = Record[12];1624Metadata *VTableHolder = nullptr;1625Metadata *TemplateParams = nullptr;1626Metadata *Discriminator = nullptr;1627Metadata *DataLocation = nullptr;1628Metadata *Associated = nullptr;1629Metadata *Allocated = nullptr;1630Metadata *Rank = nullptr;1631Metadata *Annotations = nullptr;1632auto *Identifier = getMDString(Record[15]);1633// If this module is being parsed so that it can be ThinLTO imported1634// into another module, composite types only need to be imported as1635// type declarations (unless full type definitions are requested).1636// Create type declarations up front to save memory. This is only1637// done for types which have an Identifier, and are therefore1638// subject to the ODR.1639//1640// buildODRType handles the case where this is type ODRed with a1641// definition needed by the importing module, in which case the1642// existing definition is used.1643//1644// We always import full definitions for anonymous composite types,1645// as without a name, debuggers cannot easily resolve a declaration1646// to its definition.1647if (IsImporting && !ImportFullTypeDefinitions && Identifier && Name &&1648(Tag == dwarf::DW_TAG_enumeration_type ||1649Tag == dwarf::DW_TAG_class_type ||1650Tag == dwarf::DW_TAG_structure_type ||1651Tag == dwarf::DW_TAG_union_type)) {1652Flags = Flags | DINode::FlagFwdDecl;1653// This is a hack around preserving template parameters for simplified1654// template names - it should probably be replaced with a1655// DICompositeType flag specifying whether template parameters are1656// required on declarations of this type.1657StringRef NameStr = Name->getString();1658if (!NameStr.contains('<') || NameStr.starts_with("_STN|"))1659TemplateParams = getMDOrNull(Record[14]);1660} else {1661BaseType = getDITypeRefOrNull(Record[6]);1662OffsetInBits = Record[9];1663Elements = getMDOrNull(Record[11]);1664VTableHolder = getDITypeRefOrNull(Record[13]);1665TemplateParams = getMDOrNull(Record[14]);1666if (Record.size() > 16)1667Discriminator = getMDOrNull(Record[16]);1668if (Record.size() > 17)1669DataLocation = getMDOrNull(Record[17]);1670if (Record.size() > 19) {1671Associated = getMDOrNull(Record[18]);1672Allocated = getMDOrNull(Record[19]);1673}1674if (Record.size() > 20) {1675Rank = getMDOrNull(Record[20]);1676}1677if (Record.size() > 21) {1678Annotations = getMDOrNull(Record[21]);1679}1680}1681DICompositeType *CT = nullptr;1682if (Identifier)1683CT = DICompositeType::buildODRType(1684Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,1685SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,1686VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,1687Allocated, Rank, Annotations);16881689// Create a node if we didn't get a lazy ODR type.1690if (!CT)1691CT = GET_OR_DISTINCT(DICompositeType,1692(Context, Tag, Name, File, Line, Scope, BaseType,1693SizeInBits, AlignInBits, OffsetInBits, Flags,1694Elements, RuntimeLang, VTableHolder, TemplateParams,1695Identifier, Discriminator, DataLocation, Associated,1696Allocated, Rank, Annotations));1697if (!IsNotUsedInTypeRef && Identifier)1698MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));16991700MetadataList.assignValue(CT, NextMetadataNo);1701NextMetadataNo++;1702break;1703}1704case bitc::METADATA_SUBROUTINE_TYPE: {1705if (Record.size() < 3 || Record.size() > 4)1706return error("Invalid record");1707bool IsOldTypeRefArray = Record[0] < 2;1708unsigned CC = (Record.size() > 3) ? Record[3] : 0;17091710IsDistinct = Record[0] & 0x1;1711DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);1712Metadata *Types = getMDOrNull(Record[2]);1713if (LLVM_UNLIKELY(IsOldTypeRefArray))1714Types = MetadataList.upgradeTypeRefArray(Types);17151716MetadataList.assignValue(1717GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),1718NextMetadataNo);1719NextMetadataNo++;1720break;1721}17221723case bitc::METADATA_MODULE: {1724if (Record.size() < 5 || Record.size() > 9)1725return error("Invalid record");17261727unsigned Offset = Record.size() >= 8 ? 2 : 1;1728IsDistinct = Record[0];1729MetadataList.assignValue(1730GET_OR_DISTINCT(1731DIModule,1732(Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,1733getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),1734getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),1735getMDString(Record[4 + Offset]),1736Record.size() <= 7 ? 0 : Record[7],1737Record.size() <= 8 ? false : Record[8])),1738NextMetadataNo);1739NextMetadataNo++;1740break;1741}17421743case bitc::METADATA_FILE: {1744if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)1745return error("Invalid record");17461747IsDistinct = Record[0];1748std::optional<DIFile::ChecksumInfo<MDString *>> Checksum;1749// The BitcodeWriter writes null bytes into Record[3:4] when the Checksum1750// is not present. This matches up with the old internal representation,1751// and the old encoding for CSK_None in the ChecksumKind. The new1752// representation reserves the value 0 in the ChecksumKind to continue to1753// encode None in a backwards-compatible way.1754if (Record.size() > 4 && Record[3] && Record[4])1755Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),1756getMDString(Record[4]));1757MetadataList.assignValue(1758GET_OR_DISTINCT(DIFile,1759(Context, getMDString(Record[1]),1760getMDString(Record[2]), Checksum,1761Record.size() > 5 ? getMDString(Record[5]) : nullptr)),1762NextMetadataNo);1763NextMetadataNo++;1764break;1765}1766case bitc::METADATA_COMPILE_UNIT: {1767if (Record.size() < 14 || Record.size() > 22)1768return error("Invalid record");17691770// Ignore Record[0], which indicates whether this compile unit is1771// distinct. It's always distinct.1772IsDistinct = true;1773auto *CU = DICompileUnit::getDistinct(1774Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),1775Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),1776Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),1777getMDOrNull(Record[12]), getMDOrNull(Record[13]),1778Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),1779Record.size() <= 14 ? 0 : Record[14],1780Record.size() <= 16 ? true : Record[16],1781Record.size() <= 17 ? false : Record[17],1782Record.size() <= 18 ? 0 : Record[18],1783Record.size() <= 19 ? false : Record[19],1784Record.size() <= 20 ? nullptr : getMDString(Record[20]),1785Record.size() <= 21 ? nullptr : getMDString(Record[21]));17861787MetadataList.assignValue(CU, NextMetadataNo);1788NextMetadataNo++;17891790// Move the Upgrade the list of subprograms.1791if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))1792CUSubprograms.push_back({CU, SPs});1793break;1794}1795case bitc::METADATA_SUBPROGRAM: {1796if (Record.size() < 18 || Record.size() > 21)1797return error("Invalid record");17981799bool HasSPFlags = Record[0] & 4;18001801DINode::DIFlags Flags;1802DISubprogram::DISPFlags SPFlags;1803if (!HasSPFlags)1804Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);1805else {1806Flags = static_cast<DINode::DIFlags>(Record[11]);1807SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);1808}18091810// Support for old metadata when1811// subprogram specific flags are placed in DIFlags.1812const unsigned DIFlagMainSubprogram = 1 << 21;1813bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;1814if (HasOldMainSubprogramFlag)1815// Remove old DIFlagMainSubprogram from DIFlags.1816// Note: This assumes that any future use of bit 21 defaults to it1817// being 0.1818Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);18191820if (HasOldMainSubprogramFlag && HasSPFlags)1821SPFlags |= DISubprogram::SPFlagMainSubprogram;1822else if (!HasSPFlags)1823SPFlags = DISubprogram::toSPFlags(1824/*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],1825/*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],1826/*IsMainSubprogram=*/HasOldMainSubprogramFlag);18271828// All definitions should be distinct.1829IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);1830// Version 1 has a Function as Record[15].1831// Version 2 has removed Record[15].1832// Version 3 has the Unit as Record[15].1833// Version 4 added thisAdjustment.1834// Version 5 repacked flags into DISPFlags, changing many element numbers.1835bool HasUnit = Record[0] & 2;1836if (!HasSPFlags && HasUnit && Record.size() < 19)1837return error("Invalid record");1838if (HasSPFlags && !HasUnit)1839return error("Invalid record");1840// Accommodate older formats.1841bool HasFn = false;1842bool HasThisAdj = true;1843bool HasThrownTypes = true;1844bool HasAnnotations = false;1845bool HasTargetFuncName = false;1846unsigned OffsetA = 0;1847unsigned OffsetB = 0;1848if (!HasSPFlags) {1849OffsetA = 2;1850OffsetB = 2;1851if (Record.size() >= 19) {1852HasFn = !HasUnit;1853OffsetB++;1854}1855HasThisAdj = Record.size() >= 20;1856HasThrownTypes = Record.size() >= 21;1857} else {1858HasAnnotations = Record.size() >= 19;1859HasTargetFuncName = Record.size() >= 20;1860}1861Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);1862DISubprogram *SP = GET_OR_DISTINCT(1863DISubprogram,1864(Context,1865getDITypeRefOrNull(Record[1]), // scope1866getMDString(Record[2]), // name1867getMDString(Record[3]), // linkageName1868getMDOrNull(Record[4]), // file1869Record[5], // line1870getMDOrNull(Record[6]), // type1871Record[7 + OffsetA], // scopeLine1872getDITypeRefOrNull(Record[8 + OffsetA]), // containingType1873Record[10 + OffsetA], // virtualIndex1874HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment1875Flags, // flags1876SPFlags, // SPFlags1877HasUnit ? CUorFn : nullptr, // unit1878getMDOrNull(Record[13 + OffsetB]), // templateParams1879getMDOrNull(Record[14 + OffsetB]), // declaration1880getMDOrNull(Record[15 + OffsetB]), // retainedNodes1881HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])1882: nullptr, // thrownTypes1883HasAnnotations ? getMDOrNull(Record[18 + OffsetB])1884: nullptr, // annotations1885HasTargetFuncName ? getMDString(Record[19 + OffsetB])1886: nullptr // targetFuncName1887));1888MetadataList.assignValue(SP, NextMetadataNo);1889NextMetadataNo++;18901891// Upgrade sp->function mapping to function->sp mapping.1892if (HasFn) {1893if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))1894if (auto *F = dyn_cast<Function>(CMD->getValue())) {1895if (F->isMaterializable())1896// Defer until materialized; unmaterialized functions may not have1897// metadata.1898FunctionsWithSPs[F] = SP;1899else if (!F->empty())1900F->setSubprogram(SP);1901}1902}1903break;1904}1905case bitc::METADATA_LEXICAL_BLOCK: {1906if (Record.size() != 5)1907return error("Invalid record");19081909IsDistinct = Record[0];1910MetadataList.assignValue(1911GET_OR_DISTINCT(DILexicalBlock,1912(Context, getMDOrNull(Record[1]),1913getMDOrNull(Record[2]), Record[3], Record[4])),1914NextMetadataNo);1915NextMetadataNo++;1916break;1917}1918case bitc::METADATA_LEXICAL_BLOCK_FILE: {1919if (Record.size() != 4)1920return error("Invalid record");19211922IsDistinct = Record[0];1923MetadataList.assignValue(1924GET_OR_DISTINCT(DILexicalBlockFile,1925(Context, getMDOrNull(Record[1]),1926getMDOrNull(Record[2]), Record[3])),1927NextMetadataNo);1928NextMetadataNo++;1929break;1930}1931case bitc::METADATA_COMMON_BLOCK: {1932IsDistinct = Record[0] & 1;1933MetadataList.assignValue(1934GET_OR_DISTINCT(DICommonBlock,1935(Context, getMDOrNull(Record[1]),1936getMDOrNull(Record[2]), getMDString(Record[3]),1937getMDOrNull(Record[4]), Record[5])),1938NextMetadataNo);1939NextMetadataNo++;1940break;1941}1942case bitc::METADATA_NAMESPACE: {1943// Newer versions of DINamespace dropped file and line.1944MDString *Name;1945if (Record.size() == 3)1946Name = getMDString(Record[2]);1947else if (Record.size() == 5)1948Name = getMDString(Record[3]);1949else1950return error("Invalid record");19511952IsDistinct = Record[0] & 1;1953bool ExportSymbols = Record[0] & 2;1954MetadataList.assignValue(1955GET_OR_DISTINCT(DINamespace,1956(Context, getMDOrNull(Record[1]), Name, ExportSymbols)),1957NextMetadataNo);1958NextMetadataNo++;1959break;1960}1961case bitc::METADATA_MACRO: {1962if (Record.size() != 5)1963return error("Invalid record");19641965IsDistinct = Record[0];1966MetadataList.assignValue(1967GET_OR_DISTINCT(DIMacro,1968(Context, Record[1], Record[2], getMDString(Record[3]),1969getMDString(Record[4]))),1970NextMetadataNo);1971NextMetadataNo++;1972break;1973}1974case bitc::METADATA_MACRO_FILE: {1975if (Record.size() != 5)1976return error("Invalid record");19771978IsDistinct = Record[0];1979MetadataList.assignValue(1980GET_OR_DISTINCT(DIMacroFile,1981(Context, Record[1], Record[2], getMDOrNull(Record[3]),1982getMDOrNull(Record[4]))),1983NextMetadataNo);1984NextMetadataNo++;1985break;1986}1987case bitc::METADATA_TEMPLATE_TYPE: {1988if (Record.size() < 3 || Record.size() > 4)1989return error("Invalid record");19901991IsDistinct = Record[0];1992MetadataList.assignValue(1993GET_OR_DISTINCT(DITemplateTypeParameter,1994(Context, getMDString(Record[1]),1995getDITypeRefOrNull(Record[2]),1996(Record.size() == 4) ? getMDOrNull(Record[3])1997: getMDOrNull(false))),1998NextMetadataNo);1999NextMetadataNo++;2000break;2001}2002case bitc::METADATA_TEMPLATE_VALUE: {2003if (Record.size() < 5 || Record.size() > 6)2004return error("Invalid record");20052006IsDistinct = Record[0];20072008MetadataList.assignValue(2009GET_OR_DISTINCT(2010DITemplateValueParameter,2011(Context, Record[1], getMDString(Record[2]),2012getDITypeRefOrNull(Record[3]),2013(Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),2014(Record.size() == 6) ? getMDOrNull(Record[5])2015: getMDOrNull(Record[4]))),2016NextMetadataNo);2017NextMetadataNo++;2018break;2019}2020case bitc::METADATA_GLOBAL_VAR: {2021if (Record.size() < 11 || Record.size() > 13)2022return error("Invalid record");20232024IsDistinct = Record[0] & 1;2025unsigned Version = Record[0] >> 1;20262027if (Version == 2) {2028Metadata *Annotations = nullptr;2029if (Record.size() > 12)2030Annotations = getMDOrNull(Record[12]);20312032MetadataList.assignValue(2033GET_OR_DISTINCT(DIGlobalVariable,2034(Context, getMDOrNull(Record[1]),2035getMDString(Record[2]), getMDString(Record[3]),2036getMDOrNull(Record[4]), Record[5],2037getDITypeRefOrNull(Record[6]), Record[7], Record[8],2038getMDOrNull(Record[9]), getMDOrNull(Record[10]),2039Record[11], Annotations)),2040NextMetadataNo);20412042NextMetadataNo++;2043} else if (Version == 1) {2044// No upgrade necessary. A null field will be introduced to indicate2045// that no parameter information is available.2046MetadataList.assignValue(2047GET_OR_DISTINCT(2048DIGlobalVariable,2049(Context, getMDOrNull(Record[1]), getMDString(Record[2]),2050getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],2051getDITypeRefOrNull(Record[6]), Record[7], Record[8],2052getMDOrNull(Record[10]), nullptr, Record[11], nullptr)),2053NextMetadataNo);20542055NextMetadataNo++;2056} else if (Version == 0) {2057// Upgrade old metadata, which stored a global variable reference or a2058// ConstantInt here.2059NeedUpgradeToDIGlobalVariableExpression = true;2060Metadata *Expr = getMDOrNull(Record[9]);2061uint32_t AlignInBits = 0;2062if (Record.size() > 11) {2063if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())2064return error("Alignment value is too large");2065AlignInBits = Record[11];2066}2067GlobalVariable *Attach = nullptr;2068if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {2069if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {2070Attach = GV;2071Expr = nullptr;2072} else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {2073Expr = DIExpression::get(Context,2074{dwarf::DW_OP_constu, CI->getZExtValue(),2075dwarf::DW_OP_stack_value});2076} else {2077Expr = nullptr;2078}2079}2080DIGlobalVariable *DGV = GET_OR_DISTINCT(2081DIGlobalVariable,2082(Context, getMDOrNull(Record[1]), getMDString(Record[2]),2083getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],2084getDITypeRefOrNull(Record[6]), Record[7], Record[8],2085getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));20862087DIGlobalVariableExpression *DGVE = nullptr;2088if (Attach || Expr)2089DGVE = DIGlobalVariableExpression::getDistinct(2090Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));2091if (Attach)2092Attach->addDebugInfo(DGVE);20932094auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);2095MetadataList.assignValue(MDNode, NextMetadataNo);2096NextMetadataNo++;2097} else2098return error("Invalid record");20992100break;2101}2102case bitc::METADATA_ASSIGN_ID: {2103if (Record.size() != 1)2104return error("Invalid DIAssignID record.");21052106IsDistinct = Record[0] & 1;2107if (!IsDistinct)2108return error("Invalid DIAssignID record. Must be distinct");21092110MetadataList.assignValue(DIAssignID::getDistinct(Context), NextMetadataNo);2111NextMetadataNo++;2112break;2113}2114case bitc::METADATA_LOCAL_VAR: {2115// 10th field is for the obseleted 'inlinedAt:' field.2116if (Record.size() < 8 || Record.size() > 10)2117return error("Invalid record");21182119IsDistinct = Record[0] & 1;2120bool HasAlignment = Record[0] & 2;2121// 2nd field used to be an artificial tag, either DW_TAG_auto_variable or2122// DW_TAG_arg_variable, if we have alignment flag encoded it means, that2123// this is newer version of record which doesn't have artificial tag.2124bool HasTag = !HasAlignment && Record.size() > 8;2125DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);2126uint32_t AlignInBits = 0;2127Metadata *Annotations = nullptr;2128if (HasAlignment) {2129if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())2130return error("Alignment value is too large");2131AlignInBits = Record[8];2132if (Record.size() > 9)2133Annotations = getMDOrNull(Record[9]);2134}21352136MetadataList.assignValue(2137GET_OR_DISTINCT(DILocalVariable,2138(Context, getMDOrNull(Record[1 + HasTag]),2139getMDString(Record[2 + HasTag]),2140getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],2141getDITypeRefOrNull(Record[5 + HasTag]),2142Record[6 + HasTag], Flags, AlignInBits, Annotations)),2143NextMetadataNo);2144NextMetadataNo++;2145break;2146}2147case bitc::METADATA_LABEL: {2148if (Record.size() != 5)2149return error("Invalid record");21502151IsDistinct = Record[0] & 1;2152MetadataList.assignValue(2153GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]),2154getMDString(Record[2]),2155getMDOrNull(Record[3]), Record[4])),2156NextMetadataNo);2157NextMetadataNo++;2158break;2159}2160case bitc::METADATA_EXPRESSION: {2161if (Record.size() < 1)2162return error("Invalid record");21632164IsDistinct = Record[0] & 1;2165uint64_t Version = Record[0] >> 1;2166auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);21672168SmallVector<uint64_t, 6> Buffer;2169if (Error Err = upgradeDIExpression(Version, Elts, Buffer))2170return Err;21712172MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)),2173NextMetadataNo);2174NextMetadataNo++;2175break;2176}2177case bitc::METADATA_GLOBAL_VAR_EXPR: {2178if (Record.size() != 3)2179return error("Invalid record");21802181IsDistinct = Record[0];2182Metadata *Expr = getMDOrNull(Record[2]);2183if (!Expr)2184Expr = DIExpression::get(Context, {});2185MetadataList.assignValue(2186GET_OR_DISTINCT(DIGlobalVariableExpression,2187(Context, getMDOrNull(Record[1]), Expr)),2188NextMetadataNo);2189NextMetadataNo++;2190break;2191}2192case bitc::METADATA_OBJC_PROPERTY: {2193if (Record.size() != 8)2194return error("Invalid record");21952196IsDistinct = Record[0];2197MetadataList.assignValue(2198GET_OR_DISTINCT(DIObjCProperty,2199(Context, getMDString(Record[1]),2200getMDOrNull(Record[2]), Record[3],2201getMDString(Record[4]), getMDString(Record[5]),2202Record[6], getDITypeRefOrNull(Record[7]))),2203NextMetadataNo);2204NextMetadataNo++;2205break;2206}2207case bitc::METADATA_IMPORTED_ENTITY: {2208if (Record.size() < 6 || Record.size() > 8)2209return error("Invalid DIImportedEntity record");22102211IsDistinct = Record[0];2212bool HasFile = (Record.size() >= 7);2213bool HasElements = (Record.size() >= 8);2214MetadataList.assignValue(2215GET_OR_DISTINCT(DIImportedEntity,2216(Context, Record[1], getMDOrNull(Record[2]),2217getDITypeRefOrNull(Record[3]),2218HasFile ? getMDOrNull(Record[6]) : nullptr,2219HasFile ? Record[4] : 0, getMDString(Record[5]),2220HasElements ? getMDOrNull(Record[7]) : nullptr)),2221NextMetadataNo);2222NextMetadataNo++;2223break;2224}2225case bitc::METADATA_STRING_OLD: {2226std::string String(Record.begin(), Record.end());22272228// Test for upgrading !llvm.loop.2229HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);2230++NumMDStringLoaded;2231Metadata *MD = MDString::get(Context, String);2232MetadataList.assignValue(MD, NextMetadataNo);2233NextMetadataNo++;2234break;2235}2236case bitc::METADATA_STRINGS: {2237auto CreateNextMDString = [&](StringRef Str) {2238++NumMDStringLoaded;2239MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);2240NextMetadataNo++;2241};2242if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))2243return Err;2244break;2245}2246case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {2247if (Record.size() % 2 == 0)2248return error("Invalid record");2249unsigned ValueID = Record[0];2250if (ValueID >= ValueList.size())2251return error("Invalid record");2252if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))2253if (Error Err = parseGlobalObjectAttachment(2254*GO, ArrayRef<uint64_t>(Record).slice(1)))2255return Err;2256break;2257}2258case bitc::METADATA_KIND: {2259// Support older bitcode files that had METADATA_KIND records in a2260// block with METADATA_BLOCK_ID.2261if (Error Err = parseMetadataKindRecord(Record))2262return Err;2263break;2264}2265case bitc::METADATA_ARG_LIST: {2266SmallVector<ValueAsMetadata *, 4> Elts;2267Elts.reserve(Record.size());2268for (uint64_t Elt : Record) {2269Metadata *MD = getMD(Elt);2270if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())2271return error(2272"Invalid record: DIArgList should not contain forward refs");2273if (!isa<ValueAsMetadata>(MD))2274return error("Invalid record");2275Elts.push_back(cast<ValueAsMetadata>(MD));2276}22772278MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);2279NextMetadataNo++;2280break;2281}2282}2283return Error::success();2284#undef GET_OR_DISTINCT2285}22862287Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(2288ArrayRef<uint64_t> Record, StringRef Blob,2289function_ref<void(StringRef)> CallBack) {2290// All the MDStrings in the block are emitted together in a single2291// record. The strings are concatenated and stored in a blob along with2292// their sizes.2293if (Record.size() != 2)2294return error("Invalid record: metadata strings layout");22952296unsigned NumStrings = Record[0];2297unsigned StringsOffset = Record[1];2298if (!NumStrings)2299return error("Invalid record: metadata strings with no strings");2300if (StringsOffset > Blob.size())2301return error("Invalid record: metadata strings corrupt offset");23022303StringRef Lengths = Blob.slice(0, StringsOffset);2304SimpleBitstreamCursor R(Lengths);23052306StringRef Strings = Blob.drop_front(StringsOffset);2307do {2308if (R.AtEndOfStream())2309return error("Invalid record: metadata strings bad length");23102311uint32_t Size;2312if (Error E = R.ReadVBR(6).moveInto(Size))2313return E;2314if (Strings.size() < Size)2315return error("Invalid record: metadata strings truncated chars");23162317CallBack(Strings.slice(0, Size));2318Strings = Strings.drop_front(Size);2319} while (--NumStrings);23202321return Error::success();2322}23232324Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(2325GlobalObject &GO, ArrayRef<uint64_t> Record) {2326assert(Record.size() % 2 == 0);2327for (unsigned I = 0, E = Record.size(); I != E; I += 2) {2328auto K = MDKindMap.find(Record[I]);2329if (K == MDKindMap.end())2330return error("Invalid ID");2331MDNode *MD =2332dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));2333if (!MD)2334return error("Invalid metadata attachment: expect fwd ref to MDNode");2335GO.addMetadata(K->second, *MD);2336}2337return Error::success();2338}23392340/// Parse metadata attachments.2341Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(2342Function &F, ArrayRef<Instruction *> InstructionList) {2343if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))2344return Err;23452346SmallVector<uint64_t, 64> Record;2347PlaceholderQueue Placeholders;23482349while (true) {2350BitstreamEntry Entry;2351if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))2352return E;23532354switch (Entry.Kind) {2355case BitstreamEntry::SubBlock: // Handled for us already.2356case BitstreamEntry::Error:2357return error("Malformed block");2358case BitstreamEntry::EndBlock:2359resolveForwardRefsAndPlaceholders(Placeholders);2360return Error::success();2361case BitstreamEntry::Record:2362// The interesting case.2363break;2364}23652366// Read a metadata attachment record.2367Record.clear();2368++NumMDRecordLoaded;2369Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);2370if (!MaybeRecord)2371return MaybeRecord.takeError();2372switch (MaybeRecord.get()) {2373default: // Default behavior: ignore.2374break;2375case bitc::METADATA_ATTACHMENT: {2376unsigned RecordLength = Record.size();2377if (Record.empty())2378return error("Invalid record");2379if (RecordLength % 2 == 0) {2380// A function attachment.2381if (Error Err = parseGlobalObjectAttachment(F, Record))2382return Err;2383continue;2384}23852386// An instruction attachment.2387Instruction *Inst = InstructionList[Record[0]];2388for (unsigned i = 1; i != RecordLength; i = i + 2) {2389unsigned Kind = Record[i];2390DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);2391if (I == MDKindMap.end())2392return error("Invalid ID");2393if (I->second == LLVMContext::MD_tbaa && StripTBAA)2394continue;23952396auto Idx = Record[i + 1];2397if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&2398!MetadataList.lookup(Idx)) {2399// Load the attachment if it is in the lazy-loadable range and hasn't2400// been loaded yet.2401lazyLoadOneMetadata(Idx, Placeholders);2402resolveForwardRefsAndPlaceholders(Placeholders);2403}24042405Metadata *Node = MetadataList.getMetadataFwdRef(Idx);2406if (isa<LocalAsMetadata>(Node))2407// Drop the attachment. This used to be legal, but there's no2408// upgrade path.2409break;2410MDNode *MD = dyn_cast_or_null<MDNode>(Node);2411if (!MD)2412return error("Invalid metadata attachment");24132414if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)2415MD = upgradeInstructionLoopAttachment(*MD);24162417if (I->second == LLVMContext::MD_tbaa) {2418assert(!MD->isTemporary() && "should load MDs before attachments");2419MD = UpgradeTBAANode(*MD);2420}2421Inst->setMetadata(I->second, MD);2422}2423break;2424}2425}2426}2427}24282429/// Parse a single METADATA_KIND record, inserting result in MDKindMap.2430Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(2431SmallVectorImpl<uint64_t> &Record) {2432if (Record.size() < 2)2433return error("Invalid record");24342435unsigned Kind = Record[0];2436SmallString<8> Name(Record.begin() + 1, Record.end());24372438unsigned NewKind = TheModule.getMDKindID(Name.str());2439if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)2440return error("Conflicting METADATA_KIND records");2441return Error::success();2442}24432444/// Parse the metadata kinds out of the METADATA_KIND_BLOCK.2445Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {2446if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))2447return Err;24482449SmallVector<uint64_t, 64> Record;24502451// Read all the records.2452while (true) {2453BitstreamEntry Entry;2454if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))2455return E;24562457switch (Entry.Kind) {2458case BitstreamEntry::SubBlock: // Handled for us already.2459case BitstreamEntry::Error:2460return error("Malformed block");2461case BitstreamEntry::EndBlock:2462return Error::success();2463case BitstreamEntry::Record:2464// The interesting case.2465break;2466}24672468// Read a record.2469Record.clear();2470++NumMDRecordLoaded;2471Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);2472if (!MaybeCode)2473return MaybeCode.takeError();2474switch (MaybeCode.get()) {2475default: // Default behavior: ignore.2476break;2477case bitc::METADATA_KIND: {2478if (Error Err = parseMetadataKindRecord(Record))2479return Err;2480break;2481}2482}2483}2484}24852486MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {2487Pimpl = std::move(RHS.Pimpl);2488return *this;2489}2490MetadataLoader::MetadataLoader(MetadataLoader &&RHS)2491: Pimpl(std::move(RHS.Pimpl)) {}24922493MetadataLoader::~MetadataLoader() = default;2494MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,2495BitcodeReaderValueList &ValueList,2496bool IsImporting,2497MetadataLoaderCallbacks Callbacks)2498: Pimpl(std::make_unique<MetadataLoaderImpl>(2499Stream, TheModule, ValueList, std::move(Callbacks), IsImporting)) {}25002501Error MetadataLoader::parseMetadata(bool ModuleLevel) {2502return Pimpl->parseMetadata(ModuleLevel);2503}25042505bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }25062507/// Return the given metadata, creating a replaceable forward reference if2508/// necessary.2509Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {2510return Pimpl->getMetadataFwdRefOrLoad(Idx);2511}25122513DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {2514return Pimpl->lookupSubprogramForFunction(F);2515}25162517Error MetadataLoader::parseMetadataAttachment(2518Function &F, ArrayRef<Instruction *> InstructionList) {2519return Pimpl->parseMetadataAttachment(F, InstructionList);2520}25212522Error MetadataLoader::parseMetadataKinds() {2523return Pimpl->parseMetadataKinds();2524}25252526void MetadataLoader::setStripTBAA(bool StripTBAA) {2527return Pimpl->setStripTBAA(StripTBAA);2528}25292530bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }25312532unsigned MetadataLoader::size() const { return Pimpl->size(); }2533void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }25342535void MetadataLoader::upgradeDebugIntrinsics(Function &F) {2536return Pimpl->upgradeDebugIntrinsics(F);2537}253825392540