10b57cec5SDimitry Andric //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===// 20b57cec5SDimitry Andric // 30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric // 70b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric 90b57cec5SDimitry Andric #include "MetadataLoader.h" 100b57cec5SDimitry Andric #include "ValueList.h" 110b57cec5SDimitry Andric 120b57cec5SDimitry Andric #include "llvm/ADT/APInt.h" 130b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 1481ad6265SDimitry Andric #include "llvm/ADT/BitmaskEnum.h" 150b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h" 160b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h" 1781ad6265SDimitry Andric #include "llvm/ADT/STLFunctionalExtras.h" 1806c3fb27SDimitry Andric #include "llvm/ADT/SetVector.h" 190b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h" 2081ad6265SDimitry Andric #include "llvm/ADT/SmallVector.h" 210b57cec5SDimitry Andric #include "llvm/ADT/Statistic.h" 220b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 230b57cec5SDimitry Andric #include "llvm/ADT/Twine.h" 2481ad6265SDimitry Andric #include "llvm/ADT/ilist_iterator.h" 2581ad6265SDimitry Andric #include "llvm/BinaryFormat/Dwarf.h" 260b57cec5SDimitry Andric #include "llvm/Bitcode/BitcodeReader.h" 270b57cec5SDimitry Andric #include "llvm/Bitcode/LLVMBitCodes.h" 28349cc55cSDimitry Andric #include "llvm/Bitstream/BitstreamReader.h" 290b57cec5SDimitry Andric #include "llvm/IR/AutoUpgrade.h" 300b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h" 310b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 320b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 330b57cec5SDimitry Andric #include "llvm/IR/Function.h" 340b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h" 350b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 360b57cec5SDimitry Andric #include "llvm/IR/Instruction.h" 370b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h" 380b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 3981ad6265SDimitry Andric #include "llvm/IR/Metadata.h" 400b57cec5SDimitry Andric #include "llvm/IR/Module.h" 410b57cec5SDimitry Andric #include "llvm/IR/TrackingMDRef.h" 420b57cec5SDimitry Andric #include "llvm/IR/Type.h" 430b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 440b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h" 450b57cec5SDimitry Andric #include "llvm/Support/Compiler.h" 460b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 4781ad6265SDimitry Andric #include "llvm/Support/type_traits.h" 4881ad6265SDimitry Andric 490b57cec5SDimitry Andric #include <algorithm> 500b57cec5SDimitry Andric #include <cassert> 510b57cec5SDimitry Andric #include <cstddef> 520b57cec5SDimitry Andric #include <cstdint> 530b57cec5SDimitry Andric #include <deque> 5481ad6265SDimitry Andric #include <iterator> 550b57cec5SDimitry Andric #include <limits> 5606c3fb27SDimitry Andric #include <map> 57bdd1243dSDimitry Andric #include <optional> 580b57cec5SDimitry Andric #include <string> 590b57cec5SDimitry Andric #include <tuple> 6081ad6265SDimitry Andric #include <type_traits> 610b57cec5SDimitry Andric #include <utility> 620b57cec5SDimitry Andric #include <vector> 6381ad6265SDimitry Andric namespace llvm { 6481ad6265SDimitry Andric class Argument; 6581ad6265SDimitry Andric } 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric using namespace llvm; 680b57cec5SDimitry Andric 690b57cec5SDimitry Andric #define DEBUG_TYPE "bitcode-reader" 700b57cec5SDimitry Andric 710b57cec5SDimitry Andric STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded"); 720b57cec5SDimitry Andric STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created"); 730b57cec5SDimitry Andric STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded"); 740b57cec5SDimitry Andric 750b57cec5SDimitry Andric /// Flag whether we need to import full type definitions for ThinLTO. 760b57cec5SDimitry Andric /// Currently needed for Darwin and LLDB. 770b57cec5SDimitry Andric static cl::opt<bool> ImportFullTypeDefinitions( 780b57cec5SDimitry Andric "import-full-type-definitions", cl::init(false), cl::Hidden, 790b57cec5SDimitry Andric cl::desc("Import full type definitions for ThinLTO.")); 800b57cec5SDimitry Andric 810b57cec5SDimitry Andric static cl::opt<bool> DisableLazyLoading( 820b57cec5SDimitry Andric "disable-ondemand-mds-loading", cl::init(false), cl::Hidden, 830b57cec5SDimitry Andric cl::desc("Force disable the lazy-loading on-demand of metadata when " 840b57cec5SDimitry Andric "loading bitcode for importing.")); 850b57cec5SDimitry Andric 860b57cec5SDimitry Andric namespace { 870b57cec5SDimitry Andric 880b57cec5SDimitry Andric static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; } 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric class BitcodeReaderMetadataList { 910b57cec5SDimitry Andric /// Array of metadata references. 920b57cec5SDimitry Andric /// 930b57cec5SDimitry Andric /// Don't use std::vector here. Some versions of libc++ copy (instead of 940b57cec5SDimitry Andric /// move) on resize, and TrackingMDRef is very expensive to copy. 950b57cec5SDimitry Andric SmallVector<TrackingMDRef, 1> MetadataPtrs; 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric /// The set of indices in MetadataPtrs above of forward references that were 980b57cec5SDimitry Andric /// generated. 990b57cec5SDimitry Andric SmallDenseSet<unsigned, 1> ForwardReference; 1000b57cec5SDimitry Andric 1010b57cec5SDimitry Andric /// The set of indices in MetadataPtrs above of Metadata that need to be 1020b57cec5SDimitry Andric /// resolved. 1030b57cec5SDimitry Andric SmallDenseSet<unsigned, 1> UnresolvedNodes; 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric /// Structures for resolving old type refs. 1060b57cec5SDimitry Andric struct { 1070b57cec5SDimitry Andric SmallDenseMap<MDString *, TempMDTuple, 1> Unknown; 1080b57cec5SDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> Final; 1090b57cec5SDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls; 1100b57cec5SDimitry Andric SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays; 1110b57cec5SDimitry Andric } OldTypeRefs; 1120b57cec5SDimitry Andric 1130b57cec5SDimitry Andric LLVMContext &Context; 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric /// Maximum number of valid references. Forward references exceeding the 1160b57cec5SDimitry Andric /// maximum must be invalid. 1170b57cec5SDimitry Andric unsigned RefsUpperBound; 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric public: 1200b57cec5SDimitry Andric BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound) 1210b57cec5SDimitry Andric : Context(C), 1220b57cec5SDimitry Andric RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(), 1230b57cec5SDimitry Andric RefsUpperBound)) {} 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric // vector compatibility methods 1260b57cec5SDimitry Andric unsigned size() const { return MetadataPtrs.size(); } 1270b57cec5SDimitry Andric void resize(unsigned N) { MetadataPtrs.resize(N); } 1280b57cec5SDimitry Andric void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); } 1290b57cec5SDimitry Andric void clear() { MetadataPtrs.clear(); } 1300b57cec5SDimitry Andric Metadata *back() const { return MetadataPtrs.back(); } 1310b57cec5SDimitry Andric void pop_back() { MetadataPtrs.pop_back(); } 1320b57cec5SDimitry Andric bool empty() const { return MetadataPtrs.empty(); } 1330b57cec5SDimitry Andric 1340b57cec5SDimitry Andric Metadata *operator[](unsigned i) const { 1350b57cec5SDimitry Andric assert(i < MetadataPtrs.size()); 1360b57cec5SDimitry Andric return MetadataPtrs[i]; 1370b57cec5SDimitry Andric } 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric Metadata *lookup(unsigned I) const { 1400b57cec5SDimitry Andric if (I < MetadataPtrs.size()) 1410b57cec5SDimitry Andric return MetadataPtrs[I]; 1420b57cec5SDimitry Andric return nullptr; 1430b57cec5SDimitry Andric } 1440b57cec5SDimitry Andric 1450b57cec5SDimitry Andric void shrinkTo(unsigned N) { 1460b57cec5SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!"); 1470b57cec5SDimitry Andric assert(ForwardReference.empty() && "Unexpected forward refs"); 1480b57cec5SDimitry Andric assert(UnresolvedNodes.empty() && "Unexpected unresolved node"); 1490b57cec5SDimitry Andric MetadataPtrs.resize(N); 1500b57cec5SDimitry Andric } 1510b57cec5SDimitry Andric 1520b57cec5SDimitry Andric /// Return the given metadata, creating a replaceable forward reference if 1530b57cec5SDimitry Andric /// necessary. 1540b57cec5SDimitry Andric Metadata *getMetadataFwdRef(unsigned Idx); 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric /// Return the given metadata only if it is fully resolved. 1570b57cec5SDimitry Andric /// 1580b57cec5SDimitry Andric /// Gives the same result as \a lookup(), unless \a MDNode::isResolved() 1590b57cec5SDimitry Andric /// would give \c false. 1600b57cec5SDimitry Andric Metadata *getMetadataIfResolved(unsigned Idx); 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric MDNode *getMDNodeFwdRefOrNull(unsigned Idx); 1630b57cec5SDimitry Andric void assignValue(Metadata *MD, unsigned Idx); 1640b57cec5SDimitry Andric void tryToResolveCycles(); 1650b57cec5SDimitry Andric bool hasFwdRefs() const { return !ForwardReference.empty(); } 1660b57cec5SDimitry Andric int getNextFwdRef() { 1670b57cec5SDimitry Andric assert(hasFwdRefs()); 1680b57cec5SDimitry Andric return *ForwardReference.begin(); 1690b57cec5SDimitry Andric } 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric /// Upgrade a type that had an MDString reference. 1720b57cec5SDimitry Andric void addTypeRef(MDString &UUID, DICompositeType &CT); 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric /// Upgrade a type that had an MDString reference. 1750b57cec5SDimitry Andric Metadata *upgradeTypeRef(Metadata *MaybeUUID); 1760b57cec5SDimitry Andric 1770b57cec5SDimitry Andric /// Upgrade a type ref array that may have MDString references. 1780b57cec5SDimitry Andric Metadata *upgradeTypeRefArray(Metadata *MaybeTuple); 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric private: 1810b57cec5SDimitry Andric Metadata *resolveTypeRefArray(Metadata *MaybeTuple); 1820b57cec5SDimitry Andric }; 1830b57cec5SDimitry Andric 1840b57cec5SDimitry Andric void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) { 1850b57cec5SDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD)) 1860b57cec5SDimitry Andric if (!MDN->isResolved()) 1870b57cec5SDimitry Andric UnresolvedNodes.insert(Idx); 1880b57cec5SDimitry Andric 1890b57cec5SDimitry Andric if (Idx == size()) { 1900b57cec5SDimitry Andric push_back(MD); 1910b57cec5SDimitry Andric return; 1920b57cec5SDimitry Andric } 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric if (Idx >= size()) 1950b57cec5SDimitry Andric resize(Idx + 1); 1960b57cec5SDimitry Andric 1970b57cec5SDimitry Andric TrackingMDRef &OldMD = MetadataPtrs[Idx]; 1980b57cec5SDimitry Andric if (!OldMD) { 1990b57cec5SDimitry Andric OldMD.reset(MD); 2000b57cec5SDimitry Andric return; 2010b57cec5SDimitry Andric } 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andric // If there was a forward reference to this value, replace it. 2040b57cec5SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 2050b57cec5SDimitry Andric PrevMD->replaceAllUsesWith(MD); 2060b57cec5SDimitry Andric ForwardReference.erase(Idx); 2070b57cec5SDimitry Andric } 2080b57cec5SDimitry Andric 2090b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) { 2100b57cec5SDimitry Andric // Bail out for a clearly invalid value. 2110b57cec5SDimitry Andric if (Idx >= RefsUpperBound) 2120b57cec5SDimitry Andric return nullptr; 2130b57cec5SDimitry Andric 2140b57cec5SDimitry Andric if (Idx >= size()) 2150b57cec5SDimitry Andric resize(Idx + 1); 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric if (Metadata *MD = MetadataPtrs[Idx]) 2180b57cec5SDimitry Andric return MD; 2190b57cec5SDimitry Andric 2200b57cec5SDimitry Andric // Track forward refs to be resolved later. 2210b57cec5SDimitry Andric ForwardReference.insert(Idx); 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric // Create and return a placeholder, which will later be RAUW'd. 2240b57cec5SDimitry Andric ++NumMDNodeTemporary; 225bdd1243dSDimitry Andric Metadata *MD = MDNode::getTemporary(Context, std::nullopt).release(); 2260b57cec5SDimitry Andric MetadataPtrs[Idx].reset(MD); 2270b57cec5SDimitry Andric return MD; 2280b57cec5SDimitry Andric } 2290b57cec5SDimitry Andric 2300b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) { 2310b57cec5SDimitry Andric Metadata *MD = lookup(Idx); 2320b57cec5SDimitry Andric if (auto *N = dyn_cast_or_null<MDNode>(MD)) 2330b57cec5SDimitry Andric if (!N->isResolved()) 2340b57cec5SDimitry Andric return nullptr; 2350b57cec5SDimitry Andric return MD; 2360b57cec5SDimitry Andric } 2370b57cec5SDimitry Andric 2380b57cec5SDimitry Andric MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) { 2390b57cec5SDimitry Andric return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx)); 2400b57cec5SDimitry Andric } 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric void BitcodeReaderMetadataList::tryToResolveCycles() { 2430b57cec5SDimitry Andric if (!ForwardReference.empty()) 2440b57cec5SDimitry Andric // Still forward references... can't resolve cycles. 2450b57cec5SDimitry Andric return; 2460b57cec5SDimitry Andric 2470b57cec5SDimitry Andric // Give up on finding a full definition for any forward decls that remain. 2480b57cec5SDimitry Andric for (const auto &Ref : OldTypeRefs.FwdDecls) 2490b57cec5SDimitry Andric OldTypeRefs.Final.insert(Ref); 2500b57cec5SDimitry Andric OldTypeRefs.FwdDecls.clear(); 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric // Upgrade from old type ref arrays. In strange cases, this could add to 2530b57cec5SDimitry Andric // OldTypeRefs.Unknown. 2540b57cec5SDimitry Andric for (const auto &Array : OldTypeRefs.Arrays) 2550b57cec5SDimitry Andric Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get())); 2560b57cec5SDimitry Andric OldTypeRefs.Arrays.clear(); 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric // Replace old string-based type refs with the resolved node, if possible. 2590b57cec5SDimitry Andric // If we haven't seen the node, leave it to the verifier to complain about 2600b57cec5SDimitry Andric // the invalid string reference. 2610b57cec5SDimitry Andric for (const auto &Ref : OldTypeRefs.Unknown) { 2620b57cec5SDimitry Andric if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first)) 2630b57cec5SDimitry Andric Ref.second->replaceAllUsesWith(CT); 2640b57cec5SDimitry Andric else 2650b57cec5SDimitry Andric Ref.second->replaceAllUsesWith(Ref.first); 2660b57cec5SDimitry Andric } 2670b57cec5SDimitry Andric OldTypeRefs.Unknown.clear(); 2680b57cec5SDimitry Andric 2690b57cec5SDimitry Andric if (UnresolvedNodes.empty()) 2700b57cec5SDimitry Andric // Nothing to do. 2710b57cec5SDimitry Andric return; 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric // Resolve any cycles. 2740b57cec5SDimitry Andric for (unsigned I : UnresolvedNodes) { 2750b57cec5SDimitry Andric auto &MD = MetadataPtrs[I]; 2760b57cec5SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 2770b57cec5SDimitry Andric if (!N) 2780b57cec5SDimitry Andric continue; 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference"); 2810b57cec5SDimitry Andric N->resolveCycles(); 2820b57cec5SDimitry Andric } 2830b57cec5SDimitry Andric 2840b57cec5SDimitry Andric // Make sure we return early again until there's another unresolved ref. 2850b57cec5SDimitry Andric UnresolvedNodes.clear(); 2860b57cec5SDimitry Andric } 2870b57cec5SDimitry Andric 2880b57cec5SDimitry Andric void BitcodeReaderMetadataList::addTypeRef(MDString &UUID, 2890b57cec5SDimitry Andric DICompositeType &CT) { 2900b57cec5SDimitry Andric assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID"); 2910b57cec5SDimitry Andric if (CT.isForwardDecl()) 2920b57cec5SDimitry Andric OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT)); 2930b57cec5SDimitry Andric else 2940b57cec5SDimitry Andric OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT)); 2950b57cec5SDimitry Andric } 2960b57cec5SDimitry Andric 2970b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) { 2980b57cec5SDimitry Andric auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID); 2990b57cec5SDimitry Andric if (LLVM_LIKELY(!UUID)) 3000b57cec5SDimitry Andric return MaybeUUID; 3010b57cec5SDimitry Andric 3020b57cec5SDimitry Andric if (auto *CT = OldTypeRefs.Final.lookup(UUID)) 3030b57cec5SDimitry Andric return CT; 3040b57cec5SDimitry Andric 3050b57cec5SDimitry Andric auto &Ref = OldTypeRefs.Unknown[UUID]; 3060b57cec5SDimitry Andric if (!Ref) 307bdd1243dSDimitry Andric Ref = MDNode::getTemporary(Context, std::nullopt); 3080b57cec5SDimitry Andric return Ref.get(); 3090b57cec5SDimitry Andric } 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) { 3120b57cec5SDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 3130b57cec5SDimitry Andric if (!Tuple || Tuple->isDistinct()) 3140b57cec5SDimitry Andric return MaybeTuple; 3150b57cec5SDimitry Andric 3160b57cec5SDimitry Andric // Look through the array immediately if possible. 3170b57cec5SDimitry Andric if (!Tuple->isTemporary()) 3180b57cec5SDimitry Andric return resolveTypeRefArray(Tuple); 3190b57cec5SDimitry Andric 3200b57cec5SDimitry Andric // Create and return a placeholder to use for now. Eventually 3210b57cec5SDimitry Andric // resolveTypeRefArrays() will be resolve this forward reference. 3220b57cec5SDimitry Andric OldTypeRefs.Arrays.emplace_back( 3230b57cec5SDimitry Andric std::piecewise_construct, std::forward_as_tuple(Tuple), 324bdd1243dSDimitry Andric std::forward_as_tuple(MDTuple::getTemporary(Context, std::nullopt))); 3250b57cec5SDimitry Andric return OldTypeRefs.Arrays.back().second.get(); 3260b57cec5SDimitry Andric } 3270b57cec5SDimitry Andric 3280b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) { 3290b57cec5SDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 3300b57cec5SDimitry Andric if (!Tuple || Tuple->isDistinct()) 3310b57cec5SDimitry Andric return MaybeTuple; 3320b57cec5SDimitry Andric 3330b57cec5SDimitry Andric // Look through the DITypeRefArray, upgrading each DIType *. 3340b57cec5SDimitry Andric SmallVector<Metadata *, 32> Ops; 3350b57cec5SDimitry Andric Ops.reserve(Tuple->getNumOperands()); 3360b57cec5SDimitry Andric for (Metadata *MD : Tuple->operands()) 3370b57cec5SDimitry Andric Ops.push_back(upgradeTypeRef(MD)); 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric return MDTuple::get(Context, Ops); 3400b57cec5SDimitry Andric } 3410b57cec5SDimitry Andric 3420b57cec5SDimitry Andric namespace { 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andric class PlaceholderQueue { 3450b57cec5SDimitry Andric // Placeholders would thrash around when moved, so store in a std::deque 3460b57cec5SDimitry Andric // instead of some sort of vector. 3470b57cec5SDimitry Andric std::deque<DistinctMDOperandPlaceholder> PHs; 3480b57cec5SDimitry Andric 3490b57cec5SDimitry Andric public: 3500b57cec5SDimitry Andric ~PlaceholderQueue() { 351349cc55cSDimitry Andric assert(empty() && 352349cc55cSDimitry Andric "PlaceholderQueue hasn't been flushed before being destroyed"); 3530b57cec5SDimitry Andric } 354e8d8bef9SDimitry Andric bool empty() const { return PHs.empty(); } 3550b57cec5SDimitry Andric DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID); 3560b57cec5SDimitry Andric void flush(BitcodeReaderMetadataList &MetadataList); 3570b57cec5SDimitry Andric 3580b57cec5SDimitry Andric /// Return the list of temporaries nodes in the queue, these need to be 3590b57cec5SDimitry Andric /// loaded before we can flush the queue. 3600b57cec5SDimitry Andric void getTemporaries(BitcodeReaderMetadataList &MetadataList, 3610b57cec5SDimitry Andric DenseSet<unsigned> &Temporaries) { 3620b57cec5SDimitry Andric for (auto &PH : PHs) { 3630b57cec5SDimitry Andric auto ID = PH.getID(); 3640b57cec5SDimitry Andric auto *MD = MetadataList.lookup(ID); 3650b57cec5SDimitry Andric if (!MD) { 3660b57cec5SDimitry Andric Temporaries.insert(ID); 3670b57cec5SDimitry Andric continue; 3680b57cec5SDimitry Andric } 3690b57cec5SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD); 3700b57cec5SDimitry Andric if (N && N->isTemporary()) 3710b57cec5SDimitry Andric Temporaries.insert(ID); 3720b57cec5SDimitry Andric } 3730b57cec5SDimitry Andric } 3740b57cec5SDimitry Andric }; 3750b57cec5SDimitry Andric 3760b57cec5SDimitry Andric } // end anonymous namespace 3770b57cec5SDimitry Andric 3780b57cec5SDimitry Andric DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) { 3790b57cec5SDimitry Andric PHs.emplace_back(ID); 3800b57cec5SDimitry Andric return PHs.back(); 3810b57cec5SDimitry Andric } 3820b57cec5SDimitry Andric 3830b57cec5SDimitry Andric void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) { 3840b57cec5SDimitry Andric while (!PHs.empty()) { 3850b57cec5SDimitry Andric auto *MD = MetadataList.lookup(PHs.front().getID()); 3860b57cec5SDimitry Andric assert(MD && "Flushing placeholder on unassigned MD"); 3870b57cec5SDimitry Andric #ifndef NDEBUG 3880b57cec5SDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD)) 3890b57cec5SDimitry Andric assert(MDN->isResolved() && 3900b57cec5SDimitry Andric "Flushing Placeholder while cycles aren't resolved"); 3910b57cec5SDimitry Andric #endif 3920b57cec5SDimitry Andric PHs.front().replaceUseWith(MD); 3930b57cec5SDimitry Andric PHs.pop_front(); 3940b57cec5SDimitry Andric } 3950b57cec5SDimitry Andric } 3960b57cec5SDimitry Andric 397480093f4SDimitry Andric } // anonymous namespace 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric static Error error(const Twine &Message) { 4000b57cec5SDimitry Andric return make_error<StringError>( 4010b57cec5SDimitry Andric Message, make_error_code(BitcodeError::CorruptedBitcode)); 4020b57cec5SDimitry Andric } 4030b57cec5SDimitry Andric 4040b57cec5SDimitry Andric class MetadataLoader::MetadataLoaderImpl { 4050b57cec5SDimitry Andric BitcodeReaderMetadataList MetadataList; 4060b57cec5SDimitry Andric BitcodeReaderValueList &ValueList; 4070b57cec5SDimitry Andric BitstreamCursor &Stream; 4080b57cec5SDimitry Andric LLVMContext &Context; 4090b57cec5SDimitry Andric Module &TheModule; 410bdd1243dSDimitry Andric MetadataLoaderCallbacks Callbacks; 4110b57cec5SDimitry Andric 4120b57cec5SDimitry Andric /// Cursor associated with the lazy-loading of Metadata. This is the easy way 4130b57cec5SDimitry Andric /// to keep around the right "context" (Abbrev list) to be able to jump in 4140b57cec5SDimitry Andric /// the middle of the metadata block and load any record. 4150b57cec5SDimitry Andric BitstreamCursor IndexCursor; 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric /// Index that keeps track of MDString values. 4180b57cec5SDimitry Andric std::vector<StringRef> MDStringRef; 4190b57cec5SDimitry Andric 4200b57cec5SDimitry Andric /// On-demand loading of a single MDString. Requires the index above to be 4210b57cec5SDimitry Andric /// populated. 4220b57cec5SDimitry Andric MDString *lazyLoadOneMDString(unsigned Idx); 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andric /// Index that keeps track of where to find a metadata record in the stream. 4250b57cec5SDimitry Andric std::vector<uint64_t> GlobalMetadataBitPosIndex; 4260b57cec5SDimitry Andric 427e8d8bef9SDimitry Andric /// Cursor position of the start of the global decl attachments, to enable 428e8d8bef9SDimitry Andric /// loading using the index built for lazy loading, instead of forward 429e8d8bef9SDimitry Andric /// references. 430e8d8bef9SDimitry Andric uint64_t GlobalDeclAttachmentPos = 0; 431e8d8bef9SDimitry Andric 432e8d8bef9SDimitry Andric #ifndef NDEBUG 4334824e7fdSDimitry Andric /// Baisic correctness check that we end up parsing all of the global decl 4344824e7fdSDimitry Andric /// attachments. 435e8d8bef9SDimitry Andric unsigned NumGlobalDeclAttachSkipped = 0; 436e8d8bef9SDimitry Andric unsigned NumGlobalDeclAttachParsed = 0; 437e8d8bef9SDimitry Andric #endif 438e8d8bef9SDimitry Andric 439e8d8bef9SDimitry Andric /// Load the global decl attachments, using the index built for lazy loading. 440e8d8bef9SDimitry Andric Expected<bool> loadGlobalDeclAttachments(); 441e8d8bef9SDimitry Andric 4420b57cec5SDimitry Andric /// Populate the index above to enable lazily loading of metadata, and load 4430b57cec5SDimitry Andric /// the named metadata as well as the transitively referenced global 4440b57cec5SDimitry Andric /// Metadata. 4450b57cec5SDimitry Andric Expected<bool> lazyLoadModuleMetadataBlock(); 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andric /// On-demand loading of a single metadata. Requires the index above to be 4480b57cec5SDimitry Andric /// populated. 4490b57cec5SDimitry Andric void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders); 4500b57cec5SDimitry Andric 4510b57cec5SDimitry Andric // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to 4520b57cec5SDimitry Andric // point from SP to CU after a block is completly parsed. 4530b57cec5SDimitry Andric std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms; 4540b57cec5SDimitry Andric 4550b57cec5SDimitry Andric /// Functions that need to be matched with subprograms when upgrading old 4560b57cec5SDimitry Andric /// metadata. 4570b57cec5SDimitry Andric SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs; 4580b57cec5SDimitry Andric 4590b57cec5SDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 4600b57cec5SDimitry Andric DenseMap<unsigned, unsigned> MDKindMap; 4610b57cec5SDimitry Andric 4620b57cec5SDimitry Andric bool StripTBAA = false; 4630b57cec5SDimitry Andric bool HasSeenOldLoopTags = false; 4640b57cec5SDimitry Andric bool NeedUpgradeToDIGlobalVariableExpression = false; 4650b57cec5SDimitry Andric bool NeedDeclareExpressionUpgrade = false; 4660b57cec5SDimitry Andric 46706c3fb27SDimitry Andric /// Map DILocalScope to the enclosing DISubprogram, if any. 46806c3fb27SDimitry Andric DenseMap<DILocalScope *, DISubprogram *> ParentSubprogram; 46906c3fb27SDimitry Andric 4700b57cec5SDimitry Andric /// True if metadata is being parsed for a module being ThinLTO imported. 4710b57cec5SDimitry Andric bool IsImporting = false; 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code, 4740b57cec5SDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob, 4750b57cec5SDimitry Andric unsigned &NextMetadataNo); 4760b57cec5SDimitry Andric Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob, 4770b57cec5SDimitry Andric function_ref<void(StringRef)> CallBack); 4780b57cec5SDimitry Andric Error parseGlobalObjectAttachment(GlobalObject &GO, 4790b57cec5SDimitry Andric ArrayRef<uint64_t> Record); 4800b57cec5SDimitry Andric Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record); 4810b57cec5SDimitry Andric 4820b57cec5SDimitry Andric void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders); 4830b57cec5SDimitry Andric 4840b57cec5SDimitry Andric /// Upgrade old-style CU <-> SP pointers to point from SP to CU. 4850b57cec5SDimitry Andric void upgradeCUSubprograms() { 4860b57cec5SDimitry Andric for (auto CU_SP : CUSubprograms) 4870b57cec5SDimitry Andric if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second)) 4880b57cec5SDimitry Andric for (auto &Op : SPs->operands()) 4890b57cec5SDimitry Andric if (auto *SP = dyn_cast_or_null<DISubprogram>(Op)) 4900b57cec5SDimitry Andric SP->replaceUnit(CU_SP.first); 4910b57cec5SDimitry Andric CUSubprograms.clear(); 4920b57cec5SDimitry Andric } 4930b57cec5SDimitry Andric 4940b57cec5SDimitry Andric /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions. 4950b57cec5SDimitry Andric void upgradeCUVariables() { 4960b57cec5SDimitry Andric if (!NeedUpgradeToDIGlobalVariableExpression) 4970b57cec5SDimitry Andric return; 4980b57cec5SDimitry Andric 4990b57cec5SDimitry Andric // Upgrade list of variables attached to the CUs. 5000b57cec5SDimitry Andric if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) 5010b57cec5SDimitry Andric for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) { 5020b57cec5SDimitry Andric auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I)); 5030b57cec5SDimitry Andric if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables())) 5040b57cec5SDimitry Andric for (unsigned I = 0; I < GVs->getNumOperands(); I++) 5050b57cec5SDimitry Andric if (auto *GV = 5060b57cec5SDimitry Andric dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) { 5070b57cec5SDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct( 5080b57cec5SDimitry Andric Context, GV, DIExpression::get(Context, {})); 5090b57cec5SDimitry Andric GVs->replaceOperandWith(I, DGVE); 5100b57cec5SDimitry Andric } 5110b57cec5SDimitry Andric } 5120b57cec5SDimitry Andric 5130b57cec5SDimitry Andric // Upgrade variables attached to globals. 5140b57cec5SDimitry Andric for (auto &GV : TheModule.globals()) { 5150b57cec5SDimitry Andric SmallVector<MDNode *, 1> MDs; 5160b57cec5SDimitry Andric GV.getMetadata(LLVMContext::MD_dbg, MDs); 5170b57cec5SDimitry Andric GV.eraseMetadata(LLVMContext::MD_dbg); 5180b57cec5SDimitry Andric for (auto *MD : MDs) 5198bcb0991SDimitry Andric if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) { 5200b57cec5SDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct( 5210b57cec5SDimitry Andric Context, DGV, DIExpression::get(Context, {})); 5220b57cec5SDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *DGVE); 5230b57cec5SDimitry Andric } else 5240b57cec5SDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *MD); 5250b57cec5SDimitry Andric } 5260b57cec5SDimitry Andric } 5270b57cec5SDimitry Andric 52806c3fb27SDimitry Andric DISubprogram *findEnclosingSubprogram(DILocalScope *S) { 52906c3fb27SDimitry Andric if (!S) 53006c3fb27SDimitry Andric return nullptr; 53106c3fb27SDimitry Andric if (auto *SP = ParentSubprogram[S]) { 53206c3fb27SDimitry Andric return SP; 53306c3fb27SDimitry Andric } 53406c3fb27SDimitry Andric 53506c3fb27SDimitry Andric DILocalScope *InitialScope = S; 53606c3fb27SDimitry Andric DenseSet<DILocalScope *> Visited; 53706c3fb27SDimitry Andric while (S && !isa<DISubprogram>(S)) { 53806c3fb27SDimitry Andric S = dyn_cast_or_null<DILocalScope>(S->getScope()); 53906c3fb27SDimitry Andric if (Visited.contains(S)) 54006c3fb27SDimitry Andric break; 54106c3fb27SDimitry Andric Visited.insert(S); 54206c3fb27SDimitry Andric } 54306c3fb27SDimitry Andric ParentSubprogram[InitialScope] = llvm::dyn_cast_or_null<DISubprogram>(S); 54406c3fb27SDimitry Andric 54506c3fb27SDimitry Andric return ParentSubprogram[InitialScope]; 54606c3fb27SDimitry Andric } 54706c3fb27SDimitry Andric 54806c3fb27SDimitry Andric /// Move local imports from DICompileUnit's 'imports' field to 54906c3fb27SDimitry Andric /// DISubprogram's retainedNodes. 55006c3fb27SDimitry Andric void upgradeCULocals() { 55106c3fb27SDimitry Andric if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) { 552*0fca6ea1SDimitry Andric for (MDNode *N : CUNodes->operands()) { 553*0fca6ea1SDimitry Andric auto *CU = dyn_cast<DICompileUnit>(N); 55406c3fb27SDimitry Andric if (!CU) 55506c3fb27SDimitry Andric continue; 55606c3fb27SDimitry Andric 5575f757f3fSDimitry Andric if (CU->getRawImportedEntities()) { 55806c3fb27SDimitry Andric // Collect a set of imported entities to be moved. 55906c3fb27SDimitry Andric SetVector<Metadata *> EntitiesToRemove; 56006c3fb27SDimitry Andric for (Metadata *Op : CU->getImportedEntities()->operands()) { 56106c3fb27SDimitry Andric auto *IE = cast<DIImportedEntity>(Op); 5625f757f3fSDimitry Andric if (dyn_cast_or_null<DILocalScope>(IE->getScope())) { 56306c3fb27SDimitry Andric EntitiesToRemove.insert(IE); 56406c3fb27SDimitry Andric } 56506c3fb27SDimitry Andric } 56606c3fb27SDimitry Andric 56706c3fb27SDimitry Andric if (!EntitiesToRemove.empty()) { 56806c3fb27SDimitry Andric // Make a new list of CU's 'imports'. 56906c3fb27SDimitry Andric SmallVector<Metadata *> NewImports; 57006c3fb27SDimitry Andric for (Metadata *Op : CU->getImportedEntities()->operands()) { 57106c3fb27SDimitry Andric if (!EntitiesToRemove.contains(cast<DIImportedEntity>(Op))) { 57206c3fb27SDimitry Andric NewImports.push_back(Op); 57306c3fb27SDimitry Andric } 57406c3fb27SDimitry Andric } 57506c3fb27SDimitry Andric 57606c3fb27SDimitry Andric // Find DISubprogram corresponding to each entity. 57706c3fb27SDimitry Andric std::map<DISubprogram *, SmallVector<Metadata *>> SPToEntities; 57806c3fb27SDimitry Andric for (auto *I : EntitiesToRemove) { 57906c3fb27SDimitry Andric auto *Entity = cast<DIImportedEntity>(I); 58006c3fb27SDimitry Andric if (auto *SP = findEnclosingSubprogram( 58106c3fb27SDimitry Andric cast<DILocalScope>(Entity->getScope()))) { 58206c3fb27SDimitry Andric SPToEntities[SP].push_back(Entity); 58306c3fb27SDimitry Andric } 58406c3fb27SDimitry Andric } 58506c3fb27SDimitry Andric 58606c3fb27SDimitry Andric // Update DISubprograms' retainedNodes. 58706c3fb27SDimitry Andric for (auto I = SPToEntities.begin(); I != SPToEntities.end(); ++I) { 58806c3fb27SDimitry Andric auto *SP = I->first; 58906c3fb27SDimitry Andric auto RetainedNodes = SP->getRetainedNodes(); 59006c3fb27SDimitry Andric SmallVector<Metadata *> MDs(RetainedNodes.begin(), 59106c3fb27SDimitry Andric RetainedNodes.end()); 59206c3fb27SDimitry Andric MDs.append(I->second); 59306c3fb27SDimitry Andric SP->replaceRetainedNodes(MDNode::get(Context, MDs)); 59406c3fb27SDimitry Andric } 59506c3fb27SDimitry Andric 59606c3fb27SDimitry Andric // Remove entities with local scope from CU. 59706c3fb27SDimitry Andric CU->replaceImportedEntities(MDTuple::get(Context, NewImports)); 59806c3fb27SDimitry Andric } 59906c3fb27SDimitry Andric } 60006c3fb27SDimitry Andric } 60106c3fb27SDimitry Andric } 60206c3fb27SDimitry Andric 60306c3fb27SDimitry Andric ParentSubprogram.clear(); 60406c3fb27SDimitry Andric } 60506c3fb27SDimitry Andric 6060b57cec5SDimitry Andric /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that 6070b57cec5SDimitry Andric /// describes a function argument. 6080b57cec5SDimitry Andric void upgradeDeclareExpressions(Function &F) { 6090b57cec5SDimitry Andric if (!NeedDeclareExpressionUpgrade) 6100b57cec5SDimitry Andric return; 6110b57cec5SDimitry Andric 612*0fca6ea1SDimitry Andric auto UpdateDeclareIfNeeded = [&](auto *Declare) { 613*0fca6ea1SDimitry Andric auto *DIExpr = Declare->getExpression(); 614*0fca6ea1SDimitry Andric if (!DIExpr || !DIExpr->startsWithDeref() || 615*0fca6ea1SDimitry Andric !isa_and_nonnull<Argument>(Declare->getAddress())) 616*0fca6ea1SDimitry Andric return; 6170b57cec5SDimitry Andric SmallVector<uint64_t, 8> Ops; 618*0fca6ea1SDimitry Andric Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end()); 619*0fca6ea1SDimitry Andric Declare->setExpression(DIExpression::get(Context, Ops)); 620*0fca6ea1SDimitry Andric }; 621*0fca6ea1SDimitry Andric 622*0fca6ea1SDimitry Andric for (auto &BB : F) 623*0fca6ea1SDimitry Andric for (auto &I : BB) { 624*0fca6ea1SDimitry Andric for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) { 625*0fca6ea1SDimitry Andric if (DVR.isDbgDeclare()) 626*0fca6ea1SDimitry Andric UpdateDeclareIfNeeded(&DVR); 627*0fca6ea1SDimitry Andric } 628*0fca6ea1SDimitry Andric if (auto *DDI = dyn_cast<DbgDeclareInst>(&I)) 629*0fca6ea1SDimitry Andric UpdateDeclareIfNeeded(DDI); 6300b57cec5SDimitry Andric } 6310b57cec5SDimitry Andric } 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric /// Upgrade the expression from previous versions. 6340b57cec5SDimitry Andric Error upgradeDIExpression(uint64_t FromVersion, 6350b57cec5SDimitry Andric MutableArrayRef<uint64_t> &Expr, 6360b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Buffer) { 6370b57cec5SDimitry Andric auto N = Expr.size(); 6380b57cec5SDimitry Andric switch (FromVersion) { 6390b57cec5SDimitry Andric default: 6400b57cec5SDimitry Andric return error("Invalid record"); 6410b57cec5SDimitry Andric case 0: 6420b57cec5SDimitry Andric if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece) 6430b57cec5SDimitry Andric Expr[N - 3] = dwarf::DW_OP_LLVM_fragment; 644bdd1243dSDimitry Andric [[fallthrough]]; 6450b57cec5SDimitry Andric case 1: 6460b57cec5SDimitry Andric // Move DW_OP_deref to the end. 6470b57cec5SDimitry Andric if (N && Expr[0] == dwarf::DW_OP_deref) { 6480b57cec5SDimitry Andric auto End = Expr.end(); 6490b57cec5SDimitry Andric if (Expr.size() >= 3 && 6500b57cec5SDimitry Andric *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment) 6510b57cec5SDimitry Andric End = std::prev(End, 3); 6520b57cec5SDimitry Andric std::move(std::next(Expr.begin()), End, Expr.begin()); 6530b57cec5SDimitry Andric *std::prev(End) = dwarf::DW_OP_deref; 6540b57cec5SDimitry Andric } 6550b57cec5SDimitry Andric NeedDeclareExpressionUpgrade = true; 656bdd1243dSDimitry Andric [[fallthrough]]; 6570b57cec5SDimitry Andric case 2: { 6580b57cec5SDimitry Andric // Change DW_OP_plus to DW_OP_plus_uconst. 6590b57cec5SDimitry Andric // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus 6600b57cec5SDimitry Andric auto SubExpr = ArrayRef<uint64_t>(Expr); 6610b57cec5SDimitry Andric while (!SubExpr.empty()) { 6620b57cec5SDimitry Andric // Skip past other operators with their operands 6630b57cec5SDimitry Andric // for this version of the IR, obtained from 6640b57cec5SDimitry Andric // from historic DIExpression::ExprOperand::getSize(). 6650b57cec5SDimitry Andric size_t HistoricSize; 6660b57cec5SDimitry Andric switch (SubExpr.front()) { 6670b57cec5SDimitry Andric default: 6680b57cec5SDimitry Andric HistoricSize = 1; 6690b57cec5SDimitry Andric break; 6700b57cec5SDimitry Andric case dwarf::DW_OP_constu: 6710b57cec5SDimitry Andric case dwarf::DW_OP_minus: 6720b57cec5SDimitry Andric case dwarf::DW_OP_plus: 6730b57cec5SDimitry Andric HistoricSize = 2; 6740b57cec5SDimitry Andric break; 6750b57cec5SDimitry Andric case dwarf::DW_OP_LLVM_fragment: 6760b57cec5SDimitry Andric HistoricSize = 3; 6770b57cec5SDimitry Andric break; 6780b57cec5SDimitry Andric } 6790b57cec5SDimitry Andric 6800b57cec5SDimitry Andric // If the expression is malformed, make sure we don't 6810b57cec5SDimitry Andric // copy more elements than we should. 6820b57cec5SDimitry Andric HistoricSize = std::min(SubExpr.size(), HistoricSize); 6830b57cec5SDimitry Andric ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1); 6840b57cec5SDimitry Andric 6850b57cec5SDimitry Andric switch (SubExpr.front()) { 6860b57cec5SDimitry Andric case dwarf::DW_OP_plus: 6870b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_plus_uconst); 6880b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end()); 6890b57cec5SDimitry Andric break; 6900b57cec5SDimitry Andric case dwarf::DW_OP_minus: 6910b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_constu); 6920b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end()); 6930b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_minus); 6940b57cec5SDimitry Andric break; 6950b57cec5SDimitry Andric default: 6960b57cec5SDimitry Andric Buffer.push_back(*SubExpr.begin()); 6970b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end()); 6980b57cec5SDimitry Andric break; 6990b57cec5SDimitry Andric } 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andric // Continue with remaining elements. 7020b57cec5SDimitry Andric SubExpr = SubExpr.slice(HistoricSize); 7030b57cec5SDimitry Andric } 7040b57cec5SDimitry Andric Expr = MutableArrayRef<uint64_t>(Buffer); 705bdd1243dSDimitry Andric [[fallthrough]]; 7060b57cec5SDimitry Andric } 7070b57cec5SDimitry Andric case 3: 7080b57cec5SDimitry Andric // Up-to-date! 7090b57cec5SDimitry Andric break; 7100b57cec5SDimitry Andric } 7110b57cec5SDimitry Andric 7120b57cec5SDimitry Andric return Error::success(); 7130b57cec5SDimitry Andric } 7140b57cec5SDimitry Andric 7155f757f3fSDimitry Andric void upgradeDebugInfo(bool ModuleLevel) { 7160b57cec5SDimitry Andric upgradeCUSubprograms(); 7170b57cec5SDimitry Andric upgradeCUVariables(); 7185f757f3fSDimitry Andric if (ModuleLevel) 71906c3fb27SDimitry Andric upgradeCULocals(); 7200b57cec5SDimitry Andric } 7210b57cec5SDimitry Andric 722bdd1243dSDimitry Andric void callMDTypeCallback(Metadata **Val, unsigned TypeID); 723bdd1243dSDimitry Andric 7240b57cec5SDimitry Andric public: 7250b57cec5SDimitry Andric MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule, 7260b57cec5SDimitry Andric BitcodeReaderValueList &ValueList, 727bdd1243dSDimitry Andric MetadataLoaderCallbacks Callbacks, bool IsImporting) 7280b57cec5SDimitry Andric : MetadataList(TheModule.getContext(), Stream.SizeInBytes()), 7290b57cec5SDimitry Andric ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()), 730bdd1243dSDimitry Andric TheModule(TheModule), Callbacks(std::move(Callbacks)), 7310b57cec5SDimitry Andric IsImporting(IsImporting) {} 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andric Error parseMetadata(bool ModuleLevel); 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andric bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); } 7360b57cec5SDimitry Andric 7370b57cec5SDimitry Andric Metadata *getMetadataFwdRefOrLoad(unsigned ID) { 7380b57cec5SDimitry Andric if (ID < MDStringRef.size()) 7390b57cec5SDimitry Andric return lazyLoadOneMDString(ID); 7400b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID)) 7410b57cec5SDimitry Andric return MD; 7420b57cec5SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand 7430b57cec5SDimitry Andric // instead of creating a temporary. 7440b57cec5SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 7450b57cec5SDimitry Andric PlaceholderQueue Placeholders; 7460b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders); 7470b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders); 7480b57cec5SDimitry Andric return MetadataList.lookup(ID); 7490b57cec5SDimitry Andric } 7500b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID); 7510b57cec5SDimitry Andric } 7520b57cec5SDimitry Andric 7530b57cec5SDimitry Andric DISubprogram *lookupSubprogramForFunction(Function *F) { 7540b57cec5SDimitry Andric return FunctionsWithSPs.lookup(F); 7550b57cec5SDimitry Andric } 7560b57cec5SDimitry Andric 757e8d8bef9SDimitry Andric bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; } 7580b57cec5SDimitry Andric 75981ad6265SDimitry Andric Error parseMetadataAttachment(Function &F, 76081ad6265SDimitry Andric ArrayRef<Instruction *> InstructionList); 7610b57cec5SDimitry Andric 7620b57cec5SDimitry Andric Error parseMetadataKinds(); 7630b57cec5SDimitry Andric 7640b57cec5SDimitry Andric void setStripTBAA(bool Value) { StripTBAA = Value; } 765e8d8bef9SDimitry Andric bool isStrippingTBAA() const { return StripTBAA; } 7660b57cec5SDimitry Andric 7670b57cec5SDimitry Andric unsigned size() const { return MetadataList.size(); } 7680b57cec5SDimitry Andric void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); } 7690b57cec5SDimitry Andric void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); } 7700b57cec5SDimitry Andric }; 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andric Expected<bool> 7730b57cec5SDimitry Andric MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { 7740b57cec5SDimitry Andric IndexCursor = Stream; 7750b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record; 776e8d8bef9SDimitry Andric GlobalDeclAttachmentPos = 0; 7770b57cec5SDimitry Andric // Get the abbrevs, and preload record positions to make them lazy-loadable. 7780b57cec5SDimitry Andric while (true) { 779e8d8bef9SDimitry Andric uint64_t SavedPos = IndexCursor.GetCurrentBitNo(); 780349cc55cSDimitry Andric BitstreamEntry Entry; 781349cc55cSDimitry Andric if (Error E = 782349cc55cSDimitry Andric IndexCursor 783349cc55cSDimitry Andric .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) 784349cc55cSDimitry Andric .moveInto(Entry)) 785349cc55cSDimitry Andric return std::move(E); 7860b57cec5SDimitry Andric 7870b57cec5SDimitry Andric switch (Entry.Kind) { 7880b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 7890b57cec5SDimitry Andric case BitstreamEntry::Error: 7900b57cec5SDimitry Andric return error("Malformed block"); 7910b57cec5SDimitry Andric case BitstreamEntry::EndBlock: { 7920b57cec5SDimitry Andric return true; 7930b57cec5SDimitry Andric } 7940b57cec5SDimitry Andric case BitstreamEntry::Record: { 7950b57cec5SDimitry Andric // The interesting case. 7960b57cec5SDimitry Andric ++NumMDRecordLoaded; 7970b57cec5SDimitry Andric uint64_t CurrentPos = IndexCursor.GetCurrentBitNo(); 798349cc55cSDimitry Andric unsigned Code; 799349cc55cSDimitry Andric if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code)) 800349cc55cSDimitry Andric return std::move(E); 8010b57cec5SDimitry Andric switch (Code) { 8020b57cec5SDimitry Andric case bitc::METADATA_STRINGS: { 8030b57cec5SDimitry Andric // Rewind and parse the strings. 8040b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 8050b57cec5SDimitry Andric return std::move(Err); 8060b57cec5SDimitry Andric StringRef Blob; 8070b57cec5SDimitry Andric Record.clear(); 8080b57cec5SDimitry Andric if (Expected<unsigned> MaybeRecord = 8090b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record, &Blob)) 8100b57cec5SDimitry Andric ; 8110b57cec5SDimitry Andric else 8120b57cec5SDimitry Andric return MaybeRecord.takeError(); 8130b57cec5SDimitry Andric unsigned NumStrings = Record[0]; 8140b57cec5SDimitry Andric MDStringRef.reserve(NumStrings); 8150b57cec5SDimitry Andric auto IndexNextMDString = [&](StringRef Str) { 8160b57cec5SDimitry Andric MDStringRef.push_back(Str); 8170b57cec5SDimitry Andric }; 8180b57cec5SDimitry Andric if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString)) 8190b57cec5SDimitry Andric return std::move(Err); 8200b57cec5SDimitry Andric break; 8210b57cec5SDimitry Andric } 8220b57cec5SDimitry Andric case bitc::METADATA_INDEX_OFFSET: { 8230b57cec5SDimitry Andric // This is the offset to the index, when we see this we skip all the 8240b57cec5SDimitry Andric // records and load only an index to these. 8250b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 8260b57cec5SDimitry Andric return std::move(Err); 8270b57cec5SDimitry Andric Record.clear(); 8280b57cec5SDimitry Andric if (Expected<unsigned> MaybeRecord = 8290b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record)) 8300b57cec5SDimitry Andric ; 8310b57cec5SDimitry Andric else 8320b57cec5SDimitry Andric return MaybeRecord.takeError(); 8330b57cec5SDimitry Andric if (Record.size() != 2) 8340b57cec5SDimitry Andric return error("Invalid record"); 8350b57cec5SDimitry Andric auto Offset = Record[0] + (Record[1] << 32); 8360b57cec5SDimitry Andric auto BeginPos = IndexCursor.GetCurrentBitNo(); 8370b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset)) 8380b57cec5SDimitry Andric return std::move(Err); 8390b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = 8400b57cec5SDimitry Andric IndexCursor.advanceSkippingSubblocks( 8410b57cec5SDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd); 8420b57cec5SDimitry Andric if (!MaybeEntry) 8430b57cec5SDimitry Andric return MaybeEntry.takeError(); 8440b57cec5SDimitry Andric Entry = MaybeEntry.get(); 8450b57cec5SDimitry Andric assert(Entry.Kind == BitstreamEntry::Record && 8460b57cec5SDimitry Andric "Corrupted bitcode: Expected `Record` when trying to find the " 8470b57cec5SDimitry Andric "Metadata index"); 8480b57cec5SDimitry Andric Record.clear(); 8490b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = 8500b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record)) 8510b57cec5SDimitry Andric assert(MaybeCode.get() == bitc::METADATA_INDEX && 8520b57cec5SDimitry Andric "Corrupted bitcode: Expected `METADATA_INDEX` when trying to " 8530b57cec5SDimitry Andric "find the Metadata index"); 8540b57cec5SDimitry Andric else 8550b57cec5SDimitry Andric return MaybeCode.takeError(); 8560b57cec5SDimitry Andric // Delta unpack 8570b57cec5SDimitry Andric auto CurrentValue = BeginPos; 8580b57cec5SDimitry Andric GlobalMetadataBitPosIndex.reserve(Record.size()); 8590b57cec5SDimitry Andric for (auto &Elt : Record) { 8600b57cec5SDimitry Andric CurrentValue += Elt; 8610b57cec5SDimitry Andric GlobalMetadataBitPosIndex.push_back(CurrentValue); 8620b57cec5SDimitry Andric } 8630b57cec5SDimitry Andric break; 8640b57cec5SDimitry Andric } 8650b57cec5SDimitry Andric case bitc::METADATA_INDEX: 8660b57cec5SDimitry Andric // We don't expect to get there, the Index is loaded when we encounter 8670b57cec5SDimitry Andric // the offset. 8680b57cec5SDimitry Andric return error("Corrupted Metadata block"); 8690b57cec5SDimitry Andric case bitc::METADATA_NAME: { 8700b57cec5SDimitry Andric // Named metadata need to be materialized now and aren't deferred. 8710b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 8720b57cec5SDimitry Andric return std::move(Err); 8730b57cec5SDimitry Andric Record.clear(); 8740b57cec5SDimitry Andric 8750b57cec5SDimitry Andric unsigned Code; 8760b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = 8770b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record)) { 8780b57cec5SDimitry Andric Code = MaybeCode.get(); 8790b57cec5SDimitry Andric assert(Code == bitc::METADATA_NAME); 8800b57cec5SDimitry Andric } else 8810b57cec5SDimitry Andric return MaybeCode.takeError(); 8820b57cec5SDimitry Andric 8830b57cec5SDimitry Andric // Read name of the named metadata. 8840b57cec5SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 8850b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode()) 8860b57cec5SDimitry Andric Code = MaybeCode.get(); 8870b57cec5SDimitry Andric else 8880b57cec5SDimitry Andric return MaybeCode.takeError(); 8890b57cec5SDimitry Andric 8900b57cec5SDimitry Andric // Named Metadata comes in two parts, we expect the name to be followed 8910b57cec5SDimitry Andric // by the node 8920b57cec5SDimitry Andric Record.clear(); 8930b57cec5SDimitry Andric if (Expected<unsigned> MaybeNextBitCode = 8940b57cec5SDimitry Andric IndexCursor.readRecord(Code, Record)) 8950b57cec5SDimitry Andric assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE); 8960b57cec5SDimitry Andric else 8970b57cec5SDimitry Andric return MaybeNextBitCode.takeError(); 8980b57cec5SDimitry Andric 8990b57cec5SDimitry Andric // Read named metadata elements. 9000b57cec5SDimitry Andric unsigned Size = Record.size(); 9010b57cec5SDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 9020b57cec5SDimitry Andric for (unsigned i = 0; i != Size; ++i) { 9030b57cec5SDimitry Andric // FIXME: We could use a placeholder here, however NamedMDNode are 9040b57cec5SDimitry Andric // taking MDNode as operand and not using the Metadata infrastructure. 9050b57cec5SDimitry Andric // It is acknowledged by 'TODO: Inherit from Metadata' in the 9060b57cec5SDimitry Andric // NamedMDNode class definition. 9070b57cec5SDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 9080b57cec5SDimitry Andric assert(MD && "Invalid metadata: expect fwd ref to MDNode"); 9090b57cec5SDimitry Andric NMD->addOperand(MD); 9100b57cec5SDimitry Andric } 9110b57cec5SDimitry Andric break; 9120b57cec5SDimitry Andric } 9130b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 914e8d8bef9SDimitry Andric if (!GlobalDeclAttachmentPos) 915e8d8bef9SDimitry Andric GlobalDeclAttachmentPos = SavedPos; 916e8d8bef9SDimitry Andric #ifndef NDEBUG 917e8d8bef9SDimitry Andric NumGlobalDeclAttachSkipped++; 918e8d8bef9SDimitry Andric #endif 9190b57cec5SDimitry Andric break; 9200b57cec5SDimitry Andric } 9210b57cec5SDimitry Andric case bitc::METADATA_KIND: 9220b57cec5SDimitry Andric case bitc::METADATA_STRING_OLD: 9230b57cec5SDimitry Andric case bitc::METADATA_OLD_FN_NODE: 9240b57cec5SDimitry Andric case bitc::METADATA_OLD_NODE: 9250b57cec5SDimitry Andric case bitc::METADATA_VALUE: 9260b57cec5SDimitry Andric case bitc::METADATA_DISTINCT_NODE: 9270b57cec5SDimitry Andric case bitc::METADATA_NODE: 9280b57cec5SDimitry Andric case bitc::METADATA_LOCATION: 9290b57cec5SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: 9300b57cec5SDimitry Andric case bitc::METADATA_SUBRANGE: 9310b57cec5SDimitry Andric case bitc::METADATA_ENUMERATOR: 9320b57cec5SDimitry Andric case bitc::METADATA_BASIC_TYPE: 933e8d8bef9SDimitry Andric case bitc::METADATA_STRING_TYPE: 9340b57cec5SDimitry Andric case bitc::METADATA_DERIVED_TYPE: 9350b57cec5SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: 9360b57cec5SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: 9370b57cec5SDimitry Andric case bitc::METADATA_MODULE: 9380b57cec5SDimitry Andric case bitc::METADATA_FILE: 9390b57cec5SDimitry Andric case bitc::METADATA_COMPILE_UNIT: 9400b57cec5SDimitry Andric case bitc::METADATA_SUBPROGRAM: 9410b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: 9420b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: 9430b57cec5SDimitry Andric case bitc::METADATA_NAMESPACE: 9440b57cec5SDimitry Andric case bitc::METADATA_COMMON_BLOCK: 9450b57cec5SDimitry Andric case bitc::METADATA_MACRO: 9460b57cec5SDimitry Andric case bitc::METADATA_MACRO_FILE: 9470b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: 9480b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: 9490b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR: 9500b57cec5SDimitry Andric case bitc::METADATA_LOCAL_VAR: 951bdd1243dSDimitry Andric case bitc::METADATA_ASSIGN_ID: 9520b57cec5SDimitry Andric case bitc::METADATA_LABEL: 9530b57cec5SDimitry Andric case bitc::METADATA_EXPRESSION: 9540b57cec5SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: 9550b57cec5SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: 9560b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR: 957e8d8bef9SDimitry Andric case bitc::METADATA_GENERIC_SUBRANGE: 9580b57cec5SDimitry Andric // We don't expect to see any of these, if we see one, give up on 9590b57cec5SDimitry Andric // lazy-loading and fallback. 9600b57cec5SDimitry Andric MDStringRef.clear(); 9610b57cec5SDimitry Andric GlobalMetadataBitPosIndex.clear(); 9620b57cec5SDimitry Andric return false; 9630b57cec5SDimitry Andric } 9640b57cec5SDimitry Andric break; 9650b57cec5SDimitry Andric } 9660b57cec5SDimitry Andric } 9670b57cec5SDimitry Andric } 9680b57cec5SDimitry Andric } 9690b57cec5SDimitry Andric 970e8d8bef9SDimitry Andric // Load the global decl attachments after building the lazy loading index. 971e8d8bef9SDimitry Andric // We don't load them "lazily" - all global decl attachments must be 972e8d8bef9SDimitry Andric // parsed since they aren't materialized on demand. However, by delaying 973e8d8bef9SDimitry Andric // their parsing until after the index is created, we can use the index 974e8d8bef9SDimitry Andric // instead of creating temporaries. 975e8d8bef9SDimitry Andric Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() { 976e8d8bef9SDimitry Andric // Nothing to do if we didn't find any of these metadata records. 977e8d8bef9SDimitry Andric if (!GlobalDeclAttachmentPos) 978e8d8bef9SDimitry Andric return true; 979e8d8bef9SDimitry Andric // Use a temporary cursor so that we don't mess up the main Stream cursor or 980e8d8bef9SDimitry Andric // the lazy loading IndexCursor (which holds the necessary abbrev ids). 981e8d8bef9SDimitry Andric BitstreamCursor TempCursor = Stream; 982e8d8bef9SDimitry Andric SmallVector<uint64_t, 64> Record; 983e8d8bef9SDimitry Andric // Jump to the position before the first global decl attachment, so we can 984e8d8bef9SDimitry Andric // scan for the first BitstreamEntry record. 985e8d8bef9SDimitry Andric if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos)) 986e8d8bef9SDimitry Andric return std::move(Err); 987e8d8bef9SDimitry Andric while (true) { 988349cc55cSDimitry Andric BitstreamEntry Entry; 989349cc55cSDimitry Andric if (Error E = 990349cc55cSDimitry Andric TempCursor 991349cc55cSDimitry Andric .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) 992349cc55cSDimitry Andric .moveInto(Entry)) 993349cc55cSDimitry Andric return std::move(E); 994e8d8bef9SDimitry Andric 995e8d8bef9SDimitry Andric switch (Entry.Kind) { 996e8d8bef9SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 997e8d8bef9SDimitry Andric case BitstreamEntry::Error: 998e8d8bef9SDimitry Andric return error("Malformed block"); 999e8d8bef9SDimitry Andric case BitstreamEntry::EndBlock: 10004824e7fdSDimitry Andric // Check that we parsed them all. 1001e8d8bef9SDimitry Andric assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 1002e8d8bef9SDimitry Andric return true; 1003e8d8bef9SDimitry Andric case BitstreamEntry::Record: 1004e8d8bef9SDimitry Andric break; 1005e8d8bef9SDimitry Andric } 1006e8d8bef9SDimitry Andric uint64_t CurrentPos = TempCursor.GetCurrentBitNo(); 1007e8d8bef9SDimitry Andric Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID); 1008e8d8bef9SDimitry Andric if (!MaybeCode) 1009e8d8bef9SDimitry Andric return MaybeCode.takeError(); 1010e8d8bef9SDimitry Andric if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) { 1011e8d8bef9SDimitry Andric // Anything other than a global decl attachment signals the end of 10124824e7fdSDimitry Andric // these records. Check that we parsed them all. 1013e8d8bef9SDimitry Andric assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 1014e8d8bef9SDimitry Andric return true; 1015e8d8bef9SDimitry Andric } 1016e8d8bef9SDimitry Andric #ifndef NDEBUG 1017e8d8bef9SDimitry Andric NumGlobalDeclAttachParsed++; 1018e8d8bef9SDimitry Andric #endif 1019e8d8bef9SDimitry Andric // FIXME: we need to do this early because we don't materialize global 1020e8d8bef9SDimitry Andric // value explicitly. 1021e8d8bef9SDimitry Andric if (Error Err = TempCursor.JumpToBit(CurrentPos)) 1022e8d8bef9SDimitry Andric return std::move(Err); 1023e8d8bef9SDimitry Andric Record.clear(); 1024e8d8bef9SDimitry Andric if (Expected<unsigned> MaybeRecord = 1025e8d8bef9SDimitry Andric TempCursor.readRecord(Entry.ID, Record)) 1026e8d8bef9SDimitry Andric ; 1027e8d8bef9SDimitry Andric else 1028e8d8bef9SDimitry Andric return MaybeRecord.takeError(); 1029e8d8bef9SDimitry Andric if (Record.size() % 2 == 0) 1030e8d8bef9SDimitry Andric return error("Invalid record"); 1031e8d8bef9SDimitry Andric unsigned ValueID = Record[0]; 1032e8d8bef9SDimitry Andric if (ValueID >= ValueList.size()) 1033e8d8bef9SDimitry Andric return error("Invalid record"); 1034e8d8bef9SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) { 1035e8d8bef9SDimitry Andric // Need to save and restore the current position since 1036e8d8bef9SDimitry Andric // parseGlobalObjectAttachment will resolve all forward references which 1037e8d8bef9SDimitry Andric // would require parsing from locations stored in the index. 1038e8d8bef9SDimitry Andric CurrentPos = TempCursor.GetCurrentBitNo(); 1039e8d8bef9SDimitry Andric if (Error Err = parseGlobalObjectAttachment( 1040e8d8bef9SDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1))) 1041e8d8bef9SDimitry Andric return std::move(Err); 1042e8d8bef9SDimitry Andric if (Error Err = TempCursor.JumpToBit(CurrentPos)) 1043e8d8bef9SDimitry Andric return std::move(Err); 1044e8d8bef9SDimitry Andric } 1045e8d8bef9SDimitry Andric } 1046e8d8bef9SDimitry Andric } 1047e8d8bef9SDimitry Andric 1048bdd1243dSDimitry Andric void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(Metadata **Val, 1049bdd1243dSDimitry Andric unsigned TypeID) { 1050bdd1243dSDimitry Andric if (Callbacks.MDType) { 1051bdd1243dSDimitry Andric (*Callbacks.MDType)(Val, TypeID, Callbacks.GetTypeByID, 1052bdd1243dSDimitry Andric Callbacks.GetContainedTypeID); 1053bdd1243dSDimitry Andric } 1054bdd1243dSDimitry Andric } 1055bdd1243dSDimitry Andric 10560b57cec5SDimitry Andric /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing 10570b57cec5SDimitry Andric /// module level metadata. 10580b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) { 10590b57cec5SDimitry Andric if (!ModuleLevel && MetadataList.hasFwdRefs()) 10600b57cec5SDimitry Andric return error("Invalid metadata: fwd refs into function blocks"); 10610b57cec5SDimitry Andric 10620b57cec5SDimitry Andric // Record the entry position so that we can jump back here and efficiently 10630b57cec5SDimitry Andric // skip the whole block in case we lazy-load. 10640b57cec5SDimitry Andric auto EntryPos = Stream.GetCurrentBitNo(); 10650b57cec5SDimitry Andric 10660b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 10670b57cec5SDimitry Andric return Err; 10680b57cec5SDimitry Andric 10690b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record; 10700b57cec5SDimitry Andric PlaceholderQueue Placeholders; 10710b57cec5SDimitry Andric 10720b57cec5SDimitry Andric // We lazy-load module-level metadata: we build an index for each record, and 10730b57cec5SDimitry Andric // then load individual record as needed, starting with the named metadata. 10740b57cec5SDimitry Andric if (ModuleLevel && IsImporting && MetadataList.empty() && 10750b57cec5SDimitry Andric !DisableLazyLoading) { 10760b57cec5SDimitry Andric auto SuccessOrErr = lazyLoadModuleMetadataBlock(); 10770b57cec5SDimitry Andric if (!SuccessOrErr) 10780b57cec5SDimitry Andric return SuccessOrErr.takeError(); 10790b57cec5SDimitry Andric if (SuccessOrErr.get()) { 10800b57cec5SDimitry Andric // An index was successfully created and we will be able to load metadata 10810b57cec5SDimitry Andric // on-demand. 10820b57cec5SDimitry Andric MetadataList.resize(MDStringRef.size() + 10830b57cec5SDimitry Andric GlobalMetadataBitPosIndex.size()); 10840b57cec5SDimitry Andric 1085e8d8bef9SDimitry Andric // Now that we have built the index, load the global decl attachments 1086e8d8bef9SDimitry Andric // that were deferred during that process. This avoids creating 1087e8d8bef9SDimitry Andric // temporaries. 1088e8d8bef9SDimitry Andric SuccessOrErr = loadGlobalDeclAttachments(); 1089e8d8bef9SDimitry Andric if (!SuccessOrErr) 1090e8d8bef9SDimitry Andric return SuccessOrErr.takeError(); 1091e8d8bef9SDimitry Andric assert(SuccessOrErr.get()); 1092e8d8bef9SDimitry Andric 10930b57cec5SDimitry Andric // Reading the named metadata created forward references and/or 10940b57cec5SDimitry Andric // placeholders, that we flush here. 10950b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders); 10965f757f3fSDimitry Andric upgradeDebugInfo(ModuleLevel); 10970b57cec5SDimitry Andric // Return at the beginning of the block, since it is easy to skip it 10980b57cec5SDimitry Andric // entirely from there. 10990b57cec5SDimitry Andric Stream.ReadBlockEnd(); // Pop the abbrev block context. 11000b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(EntryPos)) 11010b57cec5SDimitry Andric return Err; 11020b57cec5SDimitry Andric if (Error Err = Stream.SkipBlock()) { 11030b57cec5SDimitry Andric // FIXME this drops the error on the floor, which 11040b57cec5SDimitry Andric // ThinLTO/X86/debuginfo-cu-import.ll relies on. 11050b57cec5SDimitry Andric consumeError(std::move(Err)); 11060b57cec5SDimitry Andric return Error::success(); 11070b57cec5SDimitry Andric } 11080b57cec5SDimitry Andric return Error::success(); 11090b57cec5SDimitry Andric } 11100b57cec5SDimitry Andric // Couldn't load an index, fallback to loading all the block "old-style". 11110b57cec5SDimitry Andric } 11120b57cec5SDimitry Andric 11130b57cec5SDimitry Andric unsigned NextMetadataNo = MetadataList.size(); 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andric // Read all the records. 11160b57cec5SDimitry Andric while (true) { 1117349cc55cSDimitry Andric BitstreamEntry Entry; 1118349cc55cSDimitry Andric if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 1119349cc55cSDimitry Andric return E; 11200b57cec5SDimitry Andric 11210b57cec5SDimitry Andric switch (Entry.Kind) { 11220b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 11230b57cec5SDimitry Andric case BitstreamEntry::Error: 11240b57cec5SDimitry Andric return error("Malformed block"); 11250b57cec5SDimitry Andric case BitstreamEntry::EndBlock: 11260b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders); 11275f757f3fSDimitry Andric upgradeDebugInfo(ModuleLevel); 11280b57cec5SDimitry Andric return Error::success(); 11290b57cec5SDimitry Andric case BitstreamEntry::Record: 11300b57cec5SDimitry Andric // The interesting case. 11310b57cec5SDimitry Andric break; 11320b57cec5SDimitry Andric } 11330b57cec5SDimitry Andric 11340b57cec5SDimitry Andric // Read a record. 11350b57cec5SDimitry Andric Record.clear(); 11360b57cec5SDimitry Andric StringRef Blob; 11370b57cec5SDimitry Andric ++NumMDRecordLoaded; 11380b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = 11390b57cec5SDimitry Andric Stream.readRecord(Entry.ID, Record, &Blob)) { 11400b57cec5SDimitry Andric if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders, 11410b57cec5SDimitry Andric Blob, NextMetadataNo)) 11420b57cec5SDimitry Andric return Err; 11430b57cec5SDimitry Andric } else 11440b57cec5SDimitry Andric return MaybeCode.takeError(); 11450b57cec5SDimitry Andric } 11460b57cec5SDimitry Andric } 11470b57cec5SDimitry Andric 11480b57cec5SDimitry Andric MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) { 11490b57cec5SDimitry Andric ++NumMDStringLoaded; 11500b57cec5SDimitry Andric if (Metadata *MD = MetadataList.lookup(ID)) 11510b57cec5SDimitry Andric return cast<MDString>(MD); 11520b57cec5SDimitry Andric auto MDS = MDString::get(Context, MDStringRef[ID]); 11530b57cec5SDimitry Andric MetadataList.assignValue(MDS, ID); 11540b57cec5SDimitry Andric return MDS; 11550b57cec5SDimitry Andric } 11560b57cec5SDimitry Andric 11570b57cec5SDimitry Andric void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata( 11580b57cec5SDimitry Andric unsigned ID, PlaceholderQueue &Placeholders) { 11590b57cec5SDimitry Andric assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size()); 11600b57cec5SDimitry Andric assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString"); 11610b57cec5SDimitry Andric // Lookup first if the metadata hasn't already been loaded. 11620b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID)) { 11638bcb0991SDimitry Andric auto *N = cast<MDNode>(MD); 11640b57cec5SDimitry Andric if (!N->isTemporary()) 11650b57cec5SDimitry Andric return; 11660b57cec5SDimitry Andric } 11670b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record; 11680b57cec5SDimitry Andric StringRef Blob; 11690b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit( 11700b57cec5SDimitry Andric GlobalMetadataBitPosIndex[ID - MDStringRef.size()])) 11710b57cec5SDimitry Andric report_fatal_error("lazyLoadOneMetadata failed jumping: " + 1172349cc55cSDimitry Andric Twine(toString(std::move(Err)))); 1173349cc55cSDimitry Andric BitstreamEntry Entry; 1174349cc55cSDimitry Andric if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry)) 11750b57cec5SDimitry Andric // FIXME this drops the error on the floor. 11760b57cec5SDimitry Andric report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " + 1177349cc55cSDimitry Andric Twine(toString(std::move(E)))); 11780b57cec5SDimitry Andric ++NumMDRecordLoaded; 11790b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = 11800b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record, &Blob)) { 11810b57cec5SDimitry Andric if (Error Err = 11820b57cec5SDimitry Andric parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID)) 11830b57cec5SDimitry Andric report_fatal_error("Can't lazyload MD, parseOneMetadata: " + 1184349cc55cSDimitry Andric Twine(toString(std::move(Err)))); 11850b57cec5SDimitry Andric } else 1186349cc55cSDimitry Andric report_fatal_error("Can't lazyload MD: " + 1187349cc55cSDimitry Andric Twine(toString(MaybeCode.takeError()))); 11880b57cec5SDimitry Andric } 11890b57cec5SDimitry Andric 11900b57cec5SDimitry Andric /// Ensure that all forward-references and placeholders are resolved. 11910b57cec5SDimitry Andric /// Iteratively lazy-loading metadata on-demand if needed. 11920b57cec5SDimitry Andric void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders( 11930b57cec5SDimitry Andric PlaceholderQueue &Placeholders) { 11940b57cec5SDimitry Andric DenseSet<unsigned> Temporaries; 119504eeddc0SDimitry Andric while (true) { 11960b57cec5SDimitry Andric // Populate Temporaries with the placeholders that haven't been loaded yet. 11970b57cec5SDimitry Andric Placeholders.getTemporaries(MetadataList, Temporaries); 11980b57cec5SDimitry Andric 11990b57cec5SDimitry Andric // If we don't have any temporary, or FwdReference, we're done! 12000b57cec5SDimitry Andric if (Temporaries.empty() && !MetadataList.hasFwdRefs()) 12010b57cec5SDimitry Andric break; 12020b57cec5SDimitry Andric 12030b57cec5SDimitry Andric // First, load all the temporaries. This can add new placeholders or 12040b57cec5SDimitry Andric // forward references. 12050b57cec5SDimitry Andric for (auto ID : Temporaries) 12060b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders); 12070b57cec5SDimitry Andric Temporaries.clear(); 12080b57cec5SDimitry Andric 12090b57cec5SDimitry Andric // Second, load the forward-references. This can also add new placeholders 12100b57cec5SDimitry Andric // or forward references. 12110b57cec5SDimitry Andric while (MetadataList.hasFwdRefs()) 12120b57cec5SDimitry Andric lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders); 12130b57cec5SDimitry Andric } 12140b57cec5SDimitry Andric // At this point we don't have any forward reference remaining, or temporary 12150b57cec5SDimitry Andric // that haven't been loaded. We can safely drop RAUW support and mark cycles 12160b57cec5SDimitry Andric // as resolved. 12170b57cec5SDimitry Andric MetadataList.tryToResolveCycles(); 12180b57cec5SDimitry Andric 12190b57cec5SDimitry Andric // Finally, everything is in place, we can replace the placeholders operands 12200b57cec5SDimitry Andric // with the final node they refer to. 12210b57cec5SDimitry Andric Placeholders.flush(MetadataList); 12220b57cec5SDimitry Andric } 12230b57cec5SDimitry Andric 12245f757f3fSDimitry Andric static Value *getValueFwdRef(BitcodeReaderValueList &ValueList, unsigned Idx, 12255f757f3fSDimitry Andric Type *Ty, unsigned TyID) { 12265f757f3fSDimitry Andric Value *V = ValueList.getValueFwdRef(Idx, Ty, TyID, 12275f757f3fSDimitry Andric /*ConstExprInsertBB*/ nullptr); 12285f757f3fSDimitry Andric if (V) 12295f757f3fSDimitry Andric return V; 12305f757f3fSDimitry Andric 12315f757f3fSDimitry Andric // This is a reference to a no longer supported constant expression. 12325f757f3fSDimitry Andric // Pretend that the constant was deleted, which will replace metadata 12335f757f3fSDimitry Andric // references with undef. 12345f757f3fSDimitry Andric // TODO: This is a rather indirect check. It would be more elegant to use 12355f757f3fSDimitry Andric // a separate ErrorInfo for constant materialization failure and thread 12365f757f3fSDimitry Andric // the error reporting through getValueFwdRef(). 12375f757f3fSDimitry Andric if (Idx < ValueList.size() && ValueList[Idx] && 12385f757f3fSDimitry Andric ValueList[Idx]->getType() == Ty) 12395f757f3fSDimitry Andric return UndefValue::get(Ty); 12405f757f3fSDimitry Andric 12415f757f3fSDimitry Andric return nullptr; 12425f757f3fSDimitry Andric } 12435f757f3fSDimitry Andric 12440b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( 12450b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Code, 12460b57cec5SDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) { 12470b57cec5SDimitry Andric 12480b57cec5SDimitry Andric bool IsDistinct = false; 12490b57cec5SDimitry Andric auto getMD = [&](unsigned ID) -> Metadata * { 12500b57cec5SDimitry Andric if (ID < MDStringRef.size()) 12510b57cec5SDimitry Andric return lazyLoadOneMDString(ID); 12520b57cec5SDimitry Andric if (!IsDistinct) { 12530b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID)) 12540b57cec5SDimitry Andric return MD; 12550b57cec5SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand 12560b57cec5SDimitry Andric // instead of creating a temporary. 12570b57cec5SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 12580b57cec5SDimitry Andric // Create a temporary for the node that is referencing the operand we 12590b57cec5SDimitry Andric // will lazy-load. It is needed before recursing in case there are 12600b57cec5SDimitry Andric // uniquing cycles. 12610b57cec5SDimitry Andric MetadataList.getMetadataFwdRef(NextMetadataNo); 12620b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders); 12630b57cec5SDimitry Andric return MetadataList.lookup(ID); 12640b57cec5SDimitry Andric } 12650b57cec5SDimitry Andric // Return a temporary. 12660b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID); 12670b57cec5SDimitry Andric } 12680b57cec5SDimitry Andric if (auto *MD = MetadataList.getMetadataIfResolved(ID)) 12690b57cec5SDimitry Andric return MD; 12700b57cec5SDimitry Andric return &Placeholders.getPlaceholderOp(ID); 12710b57cec5SDimitry Andric }; 12720b57cec5SDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata * { 12730b57cec5SDimitry Andric if (ID) 12740b57cec5SDimitry Andric return getMD(ID - 1); 12750b57cec5SDimitry Andric return nullptr; 12760b57cec5SDimitry Andric }; 12770b57cec5SDimitry Andric auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * { 12780b57cec5SDimitry Andric if (ID) 12790b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID - 1); 12800b57cec5SDimitry Andric return nullptr; 12810b57cec5SDimitry Andric }; 12820b57cec5SDimitry Andric auto getMDString = [&](unsigned ID) -> MDString * { 12830b57cec5SDimitry Andric // This requires that the ID is not really a forward reference. In 12840b57cec5SDimitry Andric // particular, the MDString must already have been resolved. 12850b57cec5SDimitry Andric auto MDS = getMDOrNull(ID); 12860b57cec5SDimitry Andric return cast_or_null<MDString>(MDS); 12870b57cec5SDimitry Andric }; 12880b57cec5SDimitry Andric 12890b57cec5SDimitry Andric // Support for old type refs. 12900b57cec5SDimitry Andric auto getDITypeRefOrNull = [&](unsigned ID) { 12910b57cec5SDimitry Andric return MetadataList.upgradeTypeRef(getMDOrNull(ID)); 12920b57cec5SDimitry Andric }; 12930b57cec5SDimitry Andric 12940b57cec5SDimitry Andric #define GET_OR_DISTINCT(CLASS, ARGS) \ 12950b57cec5SDimitry Andric (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS) 12960b57cec5SDimitry Andric 12970b57cec5SDimitry Andric switch (Code) { 12980b57cec5SDimitry Andric default: // Default behavior: ignore. 12990b57cec5SDimitry Andric break; 13000b57cec5SDimitry Andric case bitc::METADATA_NAME: { 13010b57cec5SDimitry Andric // Read name of the named metadata. 13020b57cec5SDimitry Andric SmallString<8> Name(Record.begin(), Record.end()); 13030b57cec5SDimitry Andric Record.clear(); 1304349cc55cSDimitry Andric if (Error E = Stream.ReadCode().moveInto(Code)) 1305349cc55cSDimitry Andric return E; 13060b57cec5SDimitry Andric 13070b57cec5SDimitry Andric ++NumMDRecordLoaded; 13080b57cec5SDimitry Andric if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) { 13090b57cec5SDimitry Andric if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE) 13100b57cec5SDimitry Andric return error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 13110b57cec5SDimitry Andric } else 13120b57cec5SDimitry Andric return MaybeNextBitCode.takeError(); 13130b57cec5SDimitry Andric 13140b57cec5SDimitry Andric // Read named metadata elements. 13150b57cec5SDimitry Andric unsigned Size = Record.size(); 13160b57cec5SDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 13170b57cec5SDimitry Andric for (unsigned i = 0; i != Size; ++i) { 13180b57cec5SDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 13190b57cec5SDimitry Andric if (!MD) 13200b57cec5SDimitry Andric return error("Invalid named metadata: expect fwd ref to MDNode"); 13210b57cec5SDimitry Andric NMD->addOperand(MD); 13220b57cec5SDimitry Andric } 13230b57cec5SDimitry Andric break; 13240b57cec5SDimitry Andric } 13250b57cec5SDimitry Andric case bitc::METADATA_OLD_FN_NODE: { 13265ffd83dbSDimitry Andric // Deprecated, but still needed to read old bitcode files. 13270b57cec5SDimitry Andric // This is a LocalAsMetadata record, the only type of function-local 13280b57cec5SDimitry Andric // metadata. 13290b57cec5SDimitry Andric if (Record.size() % 2 == 1) 13300b57cec5SDimitry Andric return error("Invalid record"); 13310b57cec5SDimitry Andric 13320b57cec5SDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used 13330b57cec5SDimitry Andric // to be legal, but there's no upgrade path. 13340b57cec5SDimitry Andric auto dropRecord = [&] { 1335bdd1243dSDimitry Andric MetadataList.assignValue(MDNode::get(Context, std::nullopt), 1336bdd1243dSDimitry Andric NextMetadataNo); 13370b57cec5SDimitry Andric NextMetadataNo++; 13380b57cec5SDimitry Andric }; 13390b57cec5SDimitry Andric if (Record.size() != 2) { 13400b57cec5SDimitry Andric dropRecord(); 13410b57cec5SDimitry Andric break; 13420b57cec5SDimitry Andric } 13430b57cec5SDimitry Andric 134481ad6265SDimitry Andric unsigned TyID = Record[0]; 1345bdd1243dSDimitry Andric Type *Ty = Callbacks.GetTypeByID(TyID); 13465f757f3fSDimitry Andric if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy()) { 13470b57cec5SDimitry Andric dropRecord(); 13480b57cec5SDimitry Andric break; 13490b57cec5SDimitry Andric } 13500b57cec5SDimitry Andric 1351fcaf7f86SDimitry Andric Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID, 1352fcaf7f86SDimitry Andric /*ConstExprInsertBB*/ nullptr); 1353fcaf7f86SDimitry Andric if (!V) 1354fcaf7f86SDimitry Andric return error("Invalid value reference from old fn metadata"); 1355fcaf7f86SDimitry Andric 1356fcaf7f86SDimitry Andric MetadataList.assignValue(LocalAsMetadata::get(V), NextMetadataNo); 13570b57cec5SDimitry Andric NextMetadataNo++; 13580b57cec5SDimitry Andric break; 13590b57cec5SDimitry Andric } 13600b57cec5SDimitry Andric case bitc::METADATA_OLD_NODE: { 13615ffd83dbSDimitry Andric // Deprecated, but still needed to read old bitcode files. 13620b57cec5SDimitry Andric if (Record.size() % 2 == 1) 13630b57cec5SDimitry Andric return error("Invalid record"); 13640b57cec5SDimitry Andric 13650b57cec5SDimitry Andric unsigned Size = Record.size(); 13660b57cec5SDimitry Andric SmallVector<Metadata *, 8> Elts; 13670b57cec5SDimitry Andric for (unsigned i = 0; i != Size; i += 2) { 136881ad6265SDimitry Andric unsigned TyID = Record[i]; 1369bdd1243dSDimitry Andric Type *Ty = Callbacks.GetTypeByID(TyID); 13700b57cec5SDimitry Andric if (!Ty) 13710b57cec5SDimitry Andric return error("Invalid record"); 13720b57cec5SDimitry Andric if (Ty->isMetadataTy()) 13730b57cec5SDimitry Andric Elts.push_back(getMD(Record[i + 1])); 13740b57cec5SDimitry Andric else if (!Ty->isVoidTy()) { 13755f757f3fSDimitry Andric Value *V = getValueFwdRef(ValueList, Record[i + 1], Ty, TyID); 1376fcaf7f86SDimitry Andric if (!V) 1377fcaf7f86SDimitry Andric return error("Invalid value reference from old metadata"); 1378bdd1243dSDimitry Andric Metadata *MD = ValueAsMetadata::get(V); 13790b57cec5SDimitry Andric assert(isa<ConstantAsMetadata>(MD) && 13800b57cec5SDimitry Andric "Expected non-function-local metadata"); 1381bdd1243dSDimitry Andric callMDTypeCallback(&MD, TyID); 13820b57cec5SDimitry Andric Elts.push_back(MD); 13830b57cec5SDimitry Andric } else 13840b57cec5SDimitry Andric Elts.push_back(nullptr); 13850b57cec5SDimitry Andric } 13860b57cec5SDimitry Andric MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo); 13870b57cec5SDimitry Andric NextMetadataNo++; 13880b57cec5SDimitry Andric break; 13890b57cec5SDimitry Andric } 13900b57cec5SDimitry Andric case bitc::METADATA_VALUE: { 13910b57cec5SDimitry Andric if (Record.size() != 2) 13920b57cec5SDimitry Andric return error("Invalid record"); 13930b57cec5SDimitry Andric 139481ad6265SDimitry Andric unsigned TyID = Record[0]; 1395bdd1243dSDimitry Andric Type *Ty = Callbacks.GetTypeByID(TyID); 13965f757f3fSDimitry Andric if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy()) 13970b57cec5SDimitry Andric return error("Invalid record"); 13980b57cec5SDimitry Andric 13995f757f3fSDimitry Andric Value *V = getValueFwdRef(ValueList, Record[1], Ty, TyID); 1400fcaf7f86SDimitry Andric if (!V) 1401fcaf7f86SDimitry Andric return error("Invalid value reference from metadata"); 1402fcaf7f86SDimitry Andric 1403bdd1243dSDimitry Andric Metadata *MD = ValueAsMetadata::get(V); 1404bdd1243dSDimitry Andric callMDTypeCallback(&MD, TyID); 1405bdd1243dSDimitry Andric MetadataList.assignValue(MD, NextMetadataNo); 14060b57cec5SDimitry Andric NextMetadataNo++; 14070b57cec5SDimitry Andric break; 14080b57cec5SDimitry Andric } 14090b57cec5SDimitry Andric case bitc::METADATA_DISTINCT_NODE: 14100b57cec5SDimitry Andric IsDistinct = true; 1411bdd1243dSDimitry Andric [[fallthrough]]; 14120b57cec5SDimitry Andric case bitc::METADATA_NODE: { 14130b57cec5SDimitry Andric SmallVector<Metadata *, 8> Elts; 14140b57cec5SDimitry Andric Elts.reserve(Record.size()); 14150b57cec5SDimitry Andric for (unsigned ID : Record) 14160b57cec5SDimitry Andric Elts.push_back(getMDOrNull(ID)); 14170b57cec5SDimitry Andric MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 14180b57cec5SDimitry Andric : MDNode::get(Context, Elts), 14190b57cec5SDimitry Andric NextMetadataNo); 14200b57cec5SDimitry Andric NextMetadataNo++; 14210b57cec5SDimitry Andric break; 14220b57cec5SDimitry Andric } 14230b57cec5SDimitry Andric case bitc::METADATA_LOCATION: { 14240b57cec5SDimitry Andric if (Record.size() != 5 && Record.size() != 6) 14250b57cec5SDimitry Andric return error("Invalid record"); 14260b57cec5SDimitry Andric 14270b57cec5SDimitry Andric IsDistinct = Record[0]; 14280b57cec5SDimitry Andric unsigned Line = Record[1]; 14290b57cec5SDimitry Andric unsigned Column = Record[2]; 14300b57cec5SDimitry Andric Metadata *Scope = getMD(Record[3]); 14310b57cec5SDimitry Andric Metadata *InlinedAt = getMDOrNull(Record[4]); 14320b57cec5SDimitry Andric bool ImplicitCode = Record.size() == 6 && Record[5]; 14330b57cec5SDimitry Andric MetadataList.assignValue( 14340b57cec5SDimitry Andric GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt, 14350b57cec5SDimitry Andric ImplicitCode)), 14360b57cec5SDimitry Andric NextMetadataNo); 14370b57cec5SDimitry Andric NextMetadataNo++; 14380b57cec5SDimitry Andric break; 14390b57cec5SDimitry Andric } 14400b57cec5SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: { 14410b57cec5SDimitry Andric if (Record.size() < 4) 14420b57cec5SDimitry Andric return error("Invalid record"); 14430b57cec5SDimitry Andric 14440b57cec5SDimitry Andric IsDistinct = Record[0]; 14450b57cec5SDimitry Andric unsigned Tag = Record[1]; 14460b57cec5SDimitry Andric unsigned Version = Record[2]; 14470b57cec5SDimitry Andric 14480b57cec5SDimitry Andric if (Tag >= 1u << 16 || Version != 0) 14490b57cec5SDimitry Andric return error("Invalid record"); 14500b57cec5SDimitry Andric 14510b57cec5SDimitry Andric auto *Header = getMDString(Record[3]); 14520b57cec5SDimitry Andric SmallVector<Metadata *, 8> DwarfOps; 14530b57cec5SDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I) 14540b57cec5SDimitry Andric DwarfOps.push_back(getMDOrNull(Record[I])); 14550b57cec5SDimitry Andric MetadataList.assignValue( 14560b57cec5SDimitry Andric GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)), 14570b57cec5SDimitry Andric NextMetadataNo); 14580b57cec5SDimitry Andric NextMetadataNo++; 14590b57cec5SDimitry Andric break; 14600b57cec5SDimitry Andric } 14610b57cec5SDimitry Andric case bitc::METADATA_SUBRANGE: { 14620b57cec5SDimitry Andric Metadata *Val = nullptr; 14630b57cec5SDimitry Andric // Operand 'count' is interpreted as: 14640b57cec5SDimitry Andric // - Signed integer (version 0) 14650b57cec5SDimitry Andric // - Metadata node (version 1) 14665ffd83dbSDimitry Andric // Operand 'lowerBound' is interpreted as: 14675ffd83dbSDimitry Andric // - Signed integer (version 0 and 1) 14685ffd83dbSDimitry Andric // - Metadata node (version 2) 14695ffd83dbSDimitry Andric // Operands 'upperBound' and 'stride' are interpreted as: 14705ffd83dbSDimitry Andric // - Metadata node (version 2) 14710b57cec5SDimitry Andric switch (Record[0] >> 1) { 14720b57cec5SDimitry Andric case 0: 14730b57cec5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange, 14745ffd83dbSDimitry Andric (Context, Record[1], unrotateSign(Record[2]))); 14750b57cec5SDimitry Andric break; 14760b57cec5SDimitry Andric case 1: 14770b57cec5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]), 14785ffd83dbSDimitry Andric unrotateSign(Record[2]))); 14795ffd83dbSDimitry Andric break; 14805ffd83dbSDimitry Andric case 2: 14815ffd83dbSDimitry Andric Val = GET_OR_DISTINCT( 14825ffd83dbSDimitry Andric DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]), 14835ffd83dbSDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]))); 14840b57cec5SDimitry Andric break; 14850b57cec5SDimitry Andric default: 14860b57cec5SDimitry Andric return error("Invalid record: Unsupported version of DISubrange"); 14870b57cec5SDimitry Andric } 14880b57cec5SDimitry Andric 14890b57cec5SDimitry Andric MetadataList.assignValue(Val, NextMetadataNo); 14900b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 14910b57cec5SDimitry Andric NextMetadataNo++; 14920b57cec5SDimitry Andric break; 14930b57cec5SDimitry Andric } 1494e8d8bef9SDimitry Andric case bitc::METADATA_GENERIC_SUBRANGE: { 1495e8d8bef9SDimitry Andric Metadata *Val = nullptr; 1496e8d8bef9SDimitry Andric Val = GET_OR_DISTINCT(DIGenericSubrange, 1497e8d8bef9SDimitry Andric (Context, getMDOrNull(Record[1]), 1498e8d8bef9SDimitry Andric getMDOrNull(Record[2]), getMDOrNull(Record[3]), 1499e8d8bef9SDimitry Andric getMDOrNull(Record[4]))); 1500e8d8bef9SDimitry Andric 1501e8d8bef9SDimitry Andric MetadataList.assignValue(Val, NextMetadataNo); 1502e8d8bef9SDimitry Andric IsDistinct = Record[0] & 1; 1503e8d8bef9SDimitry Andric NextMetadataNo++; 1504e8d8bef9SDimitry Andric break; 1505e8d8bef9SDimitry Andric } 15060b57cec5SDimitry Andric case bitc::METADATA_ENUMERATOR: { 15075ffd83dbSDimitry Andric if (Record.size() < 3) 15080b57cec5SDimitry Andric return error("Invalid record"); 15090b57cec5SDimitry Andric 15100b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 15110b57cec5SDimitry Andric bool IsUnsigned = Record[0] & 2; 15125ffd83dbSDimitry Andric bool IsBigInt = Record[0] & 4; 15135ffd83dbSDimitry Andric APInt Value; 15145ffd83dbSDimitry Andric 15155ffd83dbSDimitry Andric if (IsBigInt) { 15165ffd83dbSDimitry Andric const uint64_t BitWidth = Record[1]; 15175ffd83dbSDimitry Andric const size_t NumWords = Record.size() - 3; 1518bdd1243dSDimitry Andric Value = readWideAPInt(ArrayRef(&Record[3], NumWords), BitWidth); 15195ffd83dbSDimitry Andric } else 15205ffd83dbSDimitry Andric Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned); 15215ffd83dbSDimitry Andric 15220b57cec5SDimitry Andric MetadataList.assignValue( 15235ffd83dbSDimitry Andric GET_OR_DISTINCT(DIEnumerator, 15245ffd83dbSDimitry Andric (Context, Value, IsUnsigned, getMDString(Record[2]))), 15250b57cec5SDimitry Andric NextMetadataNo); 15260b57cec5SDimitry Andric NextMetadataNo++; 15270b57cec5SDimitry Andric break; 15280b57cec5SDimitry Andric } 15290b57cec5SDimitry Andric case bitc::METADATA_BASIC_TYPE: { 15300b57cec5SDimitry Andric if (Record.size() < 6 || Record.size() > 7) 15310b57cec5SDimitry Andric return error("Invalid record"); 15320b57cec5SDimitry Andric 15330b57cec5SDimitry Andric IsDistinct = Record[0]; 1534349cc55cSDimitry Andric DINode::DIFlags Flags = (Record.size() > 6) 1535349cc55cSDimitry Andric ? static_cast<DINode::DIFlags>(Record[6]) 1536349cc55cSDimitry Andric : DINode::FlagZero; 15370b57cec5SDimitry Andric 15380b57cec5SDimitry Andric MetadataList.assignValue( 15390b57cec5SDimitry Andric GET_OR_DISTINCT(DIBasicType, 15400b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]), Record[3], 15410b57cec5SDimitry Andric Record[4], Record[5], Flags)), 15420b57cec5SDimitry Andric NextMetadataNo); 15430b57cec5SDimitry Andric NextMetadataNo++; 15440b57cec5SDimitry Andric break; 15450b57cec5SDimitry Andric } 1546e8d8bef9SDimitry Andric case bitc::METADATA_STRING_TYPE: { 154704eeddc0SDimitry Andric if (Record.size() > 9 || Record.size() < 8) 1548e8d8bef9SDimitry Andric return error("Invalid record"); 1549e8d8bef9SDimitry Andric 1550e8d8bef9SDimitry Andric IsDistinct = Record[0]; 155104eeddc0SDimitry Andric bool SizeIs8 = Record.size() == 8; 155204eeddc0SDimitry Andric // StringLocationExp (i.e. Record[5]) is added at a later time 155304eeddc0SDimitry Andric // than the other fields. The code here enables backward compatibility. 155404eeddc0SDimitry Andric Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]); 155504eeddc0SDimitry Andric unsigned Offset = SizeIs8 ? 5 : 6; 1556e8d8bef9SDimitry Andric MetadataList.assignValue( 1557e8d8bef9SDimitry Andric GET_OR_DISTINCT(DIStringType, 1558e8d8bef9SDimitry Andric (Context, Record[1], getMDString(Record[2]), 1559e8d8bef9SDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]), 156004eeddc0SDimitry Andric StringLocationExp, Record[Offset], Record[Offset + 1], 156104eeddc0SDimitry Andric Record[Offset + 2])), 1562e8d8bef9SDimitry Andric NextMetadataNo); 1563e8d8bef9SDimitry Andric NextMetadataNo++; 1564e8d8bef9SDimitry Andric break; 1565e8d8bef9SDimitry Andric } 15660b57cec5SDimitry Andric case bitc::METADATA_DERIVED_TYPE: { 1567*0fca6ea1SDimitry Andric if (Record.size() < 12 || Record.size() > 15) 15680b57cec5SDimitry Andric return error("Invalid record"); 15690b57cec5SDimitry Andric 15700b57cec5SDimitry Andric // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means 15710b57cec5SDimitry Andric // that there is no DWARF address space associated with DIDerivedType. 1572bdd1243dSDimitry Andric std::optional<unsigned> DWARFAddressSpace; 15730b57cec5SDimitry Andric if (Record.size() > 12 && Record[12]) 15740b57cec5SDimitry Andric DWARFAddressSpace = Record[12] - 1; 15750b57cec5SDimitry Andric 1576349cc55cSDimitry Andric Metadata *Annotations = nullptr; 1577*0fca6ea1SDimitry Andric std::optional<DIDerivedType::PtrAuthData> PtrAuthData; 1578*0fca6ea1SDimitry Andric 1579*0fca6ea1SDimitry Andric // Only look for annotations/ptrauth if both are allocated. 1580*0fca6ea1SDimitry Andric // If not, we can't tell which was intended to be embedded, as both ptrauth 1581*0fca6ea1SDimitry Andric // and annotations have been expected at Record[13] at various times. 1582*0fca6ea1SDimitry Andric if (Record.size() > 14) { 1583*0fca6ea1SDimitry Andric if (Record[13]) 1584349cc55cSDimitry Andric Annotations = getMDOrNull(Record[13]); 1585*0fca6ea1SDimitry Andric if (Record[14]) 1586*0fca6ea1SDimitry Andric PtrAuthData.emplace(Record[14]); 1587*0fca6ea1SDimitry Andric } 1588349cc55cSDimitry Andric 15890b57cec5SDimitry Andric IsDistinct = Record[0]; 15900b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 15910b57cec5SDimitry Andric MetadataList.assignValue( 15920b57cec5SDimitry Andric GET_OR_DISTINCT(DIDerivedType, 15930b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]), 15940b57cec5SDimitry Andric getMDOrNull(Record[3]), Record[4], 15950b57cec5SDimitry Andric getDITypeRefOrNull(Record[5]), 15960b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1597*0fca6ea1SDimitry Andric Record[9], DWARFAddressSpace, PtrAuthData, Flags, 1598349cc55cSDimitry Andric getDITypeRefOrNull(Record[11]), Annotations)), 15990b57cec5SDimitry Andric NextMetadataNo); 16000b57cec5SDimitry Andric NextMetadataNo++; 16010b57cec5SDimitry Andric break; 16020b57cec5SDimitry Andric } 16030b57cec5SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: { 1604349cc55cSDimitry Andric if (Record.size() < 16 || Record.size() > 22) 16050b57cec5SDimitry Andric return error("Invalid record"); 16060b57cec5SDimitry Andric 16070b57cec5SDimitry Andric // If we have a UUID and this is not a forward declaration, lookup the 16080b57cec5SDimitry Andric // mapping. 16090b57cec5SDimitry Andric IsDistinct = Record[0] & 0x1; 16100b57cec5SDimitry Andric bool IsNotUsedInTypeRef = Record[0] >= 2; 16110b57cec5SDimitry Andric unsigned Tag = Record[1]; 16120b57cec5SDimitry Andric MDString *Name = getMDString(Record[2]); 16130b57cec5SDimitry Andric Metadata *File = getMDOrNull(Record[3]); 16140b57cec5SDimitry Andric unsigned Line = Record[4]; 16150b57cec5SDimitry Andric Metadata *Scope = getDITypeRefOrNull(Record[5]); 16160b57cec5SDimitry Andric Metadata *BaseType = nullptr; 16170b57cec5SDimitry Andric uint64_t SizeInBits = Record[7]; 16180b57cec5SDimitry Andric if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) 16190b57cec5SDimitry Andric return error("Alignment value is too large"); 16200b57cec5SDimitry Andric uint32_t AlignInBits = Record[8]; 16210b57cec5SDimitry Andric uint64_t OffsetInBits = 0; 16220b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 16230b57cec5SDimitry Andric Metadata *Elements = nullptr; 16240b57cec5SDimitry Andric unsigned RuntimeLang = Record[12]; 16250b57cec5SDimitry Andric Metadata *VTableHolder = nullptr; 16260b57cec5SDimitry Andric Metadata *TemplateParams = nullptr; 16270b57cec5SDimitry Andric Metadata *Discriminator = nullptr; 16285ffd83dbSDimitry Andric Metadata *DataLocation = nullptr; 1629e8d8bef9SDimitry Andric Metadata *Associated = nullptr; 1630e8d8bef9SDimitry Andric Metadata *Allocated = nullptr; 1631e8d8bef9SDimitry Andric Metadata *Rank = nullptr; 1632349cc55cSDimitry Andric Metadata *Annotations = nullptr; 16330b57cec5SDimitry Andric auto *Identifier = getMDString(Record[15]); 16340b57cec5SDimitry Andric // If this module is being parsed so that it can be ThinLTO imported 16357a6dacacSDimitry Andric // into another module, composite types only need to be imported as 16367a6dacacSDimitry Andric // type declarations (unless full type definitions are requested). 16377a6dacacSDimitry Andric // Create type declarations up front to save memory. This is only 16387a6dacacSDimitry Andric // done for types which have an Identifier, and are therefore 16397a6dacacSDimitry Andric // subject to the ODR. 16407a6dacacSDimitry Andric // 16417a6dacacSDimitry Andric // buildODRType handles the case where this is type ODRed with a 16427a6dacacSDimitry Andric // definition needed by the importing module, in which case the 16437a6dacacSDimitry Andric // existing definition is used. 16447a6dacacSDimitry Andric // 16457a6dacacSDimitry Andric // We always import full definitions for anonymous composite types, 16467a6dacacSDimitry Andric // as without a name, debuggers cannot easily resolve a declaration 16477a6dacacSDimitry Andric // to its definition. 16487a6dacacSDimitry Andric if (IsImporting && !ImportFullTypeDefinitions && Identifier && Name && 16490b57cec5SDimitry Andric (Tag == dwarf::DW_TAG_enumeration_type || 16500b57cec5SDimitry Andric Tag == dwarf::DW_TAG_class_type || 16510b57cec5SDimitry Andric Tag == dwarf::DW_TAG_structure_type || 16520b57cec5SDimitry Andric Tag == dwarf::DW_TAG_union_type)) { 16530b57cec5SDimitry Andric Flags = Flags | DINode::FlagFwdDecl; 165481ad6265SDimitry Andric // This is a hack around preserving template parameters for simplified 165581ad6265SDimitry Andric // template names - it should probably be replaced with a 165681ad6265SDimitry Andric // DICompositeType flag specifying whether template parameters are 165781ad6265SDimitry Andric // required on declarations of this type. 165881ad6265SDimitry Andric StringRef NameStr = Name->getString(); 16595f757f3fSDimitry Andric if (!NameStr.contains('<') || NameStr.starts_with("_STN|")) 166081ad6265SDimitry Andric TemplateParams = getMDOrNull(Record[14]); 16610b57cec5SDimitry Andric } else { 16620b57cec5SDimitry Andric BaseType = getDITypeRefOrNull(Record[6]); 16630b57cec5SDimitry Andric OffsetInBits = Record[9]; 16640b57cec5SDimitry Andric Elements = getMDOrNull(Record[11]); 16650b57cec5SDimitry Andric VTableHolder = getDITypeRefOrNull(Record[13]); 16660b57cec5SDimitry Andric TemplateParams = getMDOrNull(Record[14]); 16670b57cec5SDimitry Andric if (Record.size() > 16) 16680b57cec5SDimitry Andric Discriminator = getMDOrNull(Record[16]); 16695ffd83dbSDimitry Andric if (Record.size() > 17) 16705ffd83dbSDimitry Andric DataLocation = getMDOrNull(Record[17]); 1671e8d8bef9SDimitry Andric if (Record.size() > 19) { 1672e8d8bef9SDimitry Andric Associated = getMDOrNull(Record[18]); 1673e8d8bef9SDimitry Andric Allocated = getMDOrNull(Record[19]); 1674e8d8bef9SDimitry Andric } 1675e8d8bef9SDimitry Andric if (Record.size() > 20) { 1676e8d8bef9SDimitry Andric Rank = getMDOrNull(Record[20]); 1677e8d8bef9SDimitry Andric } 1678349cc55cSDimitry Andric if (Record.size() > 21) { 1679349cc55cSDimitry Andric Annotations = getMDOrNull(Record[21]); 1680349cc55cSDimitry Andric } 16810b57cec5SDimitry Andric } 16820b57cec5SDimitry Andric DICompositeType *CT = nullptr; 16830b57cec5SDimitry Andric if (Identifier) 16840b57cec5SDimitry Andric CT = DICompositeType::buildODRType( 16850b57cec5SDimitry Andric Context, *Identifier, Tag, Name, File, Line, Scope, BaseType, 16860b57cec5SDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 1687e8d8bef9SDimitry Andric VTableHolder, TemplateParams, Discriminator, DataLocation, Associated, 1688349cc55cSDimitry Andric Allocated, Rank, Annotations); 16890b57cec5SDimitry Andric 16900b57cec5SDimitry Andric // Create a node if we didn't get a lazy ODR type. 16910b57cec5SDimitry Andric if (!CT) 16920b57cec5SDimitry Andric CT = GET_OR_DISTINCT(DICompositeType, 16930b57cec5SDimitry Andric (Context, Tag, Name, File, Line, Scope, BaseType, 16940b57cec5SDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags, 16950b57cec5SDimitry Andric Elements, RuntimeLang, VTableHolder, TemplateParams, 1696e8d8bef9SDimitry Andric Identifier, Discriminator, DataLocation, Associated, 1697349cc55cSDimitry Andric Allocated, Rank, Annotations)); 16980b57cec5SDimitry Andric if (!IsNotUsedInTypeRef && Identifier) 16990b57cec5SDimitry Andric MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT)); 17000b57cec5SDimitry Andric 17010b57cec5SDimitry Andric MetadataList.assignValue(CT, NextMetadataNo); 17020b57cec5SDimitry Andric NextMetadataNo++; 17030b57cec5SDimitry Andric break; 17040b57cec5SDimitry Andric } 17050b57cec5SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: { 17060b57cec5SDimitry Andric if (Record.size() < 3 || Record.size() > 4) 17070b57cec5SDimitry Andric return error("Invalid record"); 17080b57cec5SDimitry Andric bool IsOldTypeRefArray = Record[0] < 2; 17090b57cec5SDimitry Andric unsigned CC = (Record.size() > 3) ? Record[3] : 0; 17100b57cec5SDimitry Andric 17110b57cec5SDimitry Andric IsDistinct = Record[0] & 0x1; 17120b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]); 17130b57cec5SDimitry Andric Metadata *Types = getMDOrNull(Record[2]); 17140b57cec5SDimitry Andric if (LLVM_UNLIKELY(IsOldTypeRefArray)) 17150b57cec5SDimitry Andric Types = MetadataList.upgradeTypeRefArray(Types); 17160b57cec5SDimitry Andric 17170b57cec5SDimitry Andric MetadataList.assignValue( 17180b57cec5SDimitry Andric GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)), 17190b57cec5SDimitry Andric NextMetadataNo); 17200b57cec5SDimitry Andric NextMetadataNo++; 17210b57cec5SDimitry Andric break; 17220b57cec5SDimitry Andric } 17230b57cec5SDimitry Andric 17240b57cec5SDimitry Andric case bitc::METADATA_MODULE: { 1725e8d8bef9SDimitry Andric if (Record.size() < 5 || Record.size() > 9) 17260b57cec5SDimitry Andric return error("Invalid record"); 17270b57cec5SDimitry Andric 1728e8d8bef9SDimitry Andric unsigned Offset = Record.size() >= 8 ? 2 : 1; 17290b57cec5SDimitry Andric IsDistinct = Record[0]; 17300b57cec5SDimitry Andric MetadataList.assignValue( 17315ffd83dbSDimitry Andric GET_OR_DISTINCT( 17325ffd83dbSDimitry Andric DIModule, 1733e8d8bef9SDimitry Andric (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr, 17345ffd83dbSDimitry Andric getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]), 17355ffd83dbSDimitry Andric getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]), 17365ffd83dbSDimitry Andric getMDString(Record[4 + Offset]), 1737e8d8bef9SDimitry Andric Record.size() <= 7 ? 0 : Record[7], 1738e8d8bef9SDimitry Andric Record.size() <= 8 ? false : Record[8])), 17390b57cec5SDimitry Andric NextMetadataNo); 17400b57cec5SDimitry Andric NextMetadataNo++; 17410b57cec5SDimitry Andric break; 17420b57cec5SDimitry Andric } 17430b57cec5SDimitry Andric 17440b57cec5SDimitry Andric case bitc::METADATA_FILE: { 17450b57cec5SDimitry Andric if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6) 17460b57cec5SDimitry Andric return error("Invalid record"); 17470b57cec5SDimitry Andric 17480b57cec5SDimitry Andric IsDistinct = Record[0]; 1749bdd1243dSDimitry Andric std::optional<DIFile::ChecksumInfo<MDString *>> Checksum; 17500b57cec5SDimitry Andric // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum 17510b57cec5SDimitry Andric // is not present. This matches up with the old internal representation, 17520b57cec5SDimitry Andric // and the old encoding for CSK_None in the ChecksumKind. The new 17530b57cec5SDimitry Andric // representation reserves the value 0 in the ChecksumKind to continue to 17540b57cec5SDimitry Andric // encode None in a backwards-compatible way. 17550b57cec5SDimitry Andric if (Record.size() > 4 && Record[3] && Record[4]) 17560b57cec5SDimitry Andric Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]), 17570b57cec5SDimitry Andric getMDString(Record[4])); 17580b57cec5SDimitry Andric MetadataList.assignValue( 1759bdd1243dSDimitry Andric GET_OR_DISTINCT(DIFile, 1760bdd1243dSDimitry Andric (Context, getMDString(Record[1]), 1761bdd1243dSDimitry Andric getMDString(Record[2]), Checksum, 1762bdd1243dSDimitry Andric Record.size() > 5 ? getMDString(Record[5]) : nullptr)), 17630b57cec5SDimitry Andric NextMetadataNo); 17640b57cec5SDimitry Andric NextMetadataNo++; 17650b57cec5SDimitry Andric break; 17660b57cec5SDimitry Andric } 17670b57cec5SDimitry Andric case bitc::METADATA_COMPILE_UNIT: { 17685ffd83dbSDimitry Andric if (Record.size() < 14 || Record.size() > 22) 17690b57cec5SDimitry Andric return error("Invalid record"); 17700b57cec5SDimitry Andric 17710b57cec5SDimitry Andric // Ignore Record[0], which indicates whether this compile unit is 17720b57cec5SDimitry Andric // distinct. It's always distinct. 17730b57cec5SDimitry Andric IsDistinct = true; 17740b57cec5SDimitry Andric auto *CU = DICompileUnit::getDistinct( 17750b57cec5SDimitry Andric Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]), 17760b57cec5SDimitry Andric Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]), 17770b57cec5SDimitry Andric Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]), 17780b57cec5SDimitry Andric getMDOrNull(Record[12]), getMDOrNull(Record[13]), 17790b57cec5SDimitry Andric Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]), 17800b57cec5SDimitry Andric Record.size() <= 14 ? 0 : Record[14], 17810b57cec5SDimitry Andric Record.size() <= 16 ? true : Record[16], 17820b57cec5SDimitry Andric Record.size() <= 17 ? false : Record[17], 17830b57cec5SDimitry Andric Record.size() <= 18 ? 0 : Record[18], 178404eeddc0SDimitry Andric Record.size() <= 19 ? false : Record[19], 17855ffd83dbSDimitry Andric Record.size() <= 20 ? nullptr : getMDString(Record[20]), 17865ffd83dbSDimitry Andric Record.size() <= 21 ? nullptr : getMDString(Record[21])); 17870b57cec5SDimitry Andric 17880b57cec5SDimitry Andric MetadataList.assignValue(CU, NextMetadataNo); 17890b57cec5SDimitry Andric NextMetadataNo++; 17900b57cec5SDimitry Andric 17910b57cec5SDimitry Andric // Move the Upgrade the list of subprograms. 17920b57cec5SDimitry Andric if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11])) 17930b57cec5SDimitry Andric CUSubprograms.push_back({CU, SPs}); 17940b57cec5SDimitry Andric break; 17950b57cec5SDimitry Andric } 17960b57cec5SDimitry Andric case bitc::METADATA_SUBPROGRAM: { 17970b57cec5SDimitry Andric if (Record.size() < 18 || Record.size() > 21) 17980b57cec5SDimitry Andric return error("Invalid record"); 17990b57cec5SDimitry Andric 18000b57cec5SDimitry Andric bool HasSPFlags = Record[0] & 4; 18010b57cec5SDimitry Andric 18020b57cec5SDimitry Andric DINode::DIFlags Flags; 18030b57cec5SDimitry Andric DISubprogram::DISPFlags SPFlags; 18040b57cec5SDimitry Andric if (!HasSPFlags) 18050b57cec5SDimitry Andric Flags = static_cast<DINode::DIFlags>(Record[11 + 2]); 18060b57cec5SDimitry Andric else { 18070b57cec5SDimitry Andric Flags = static_cast<DINode::DIFlags>(Record[11]); 18080b57cec5SDimitry Andric SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]); 18090b57cec5SDimitry Andric } 18100b57cec5SDimitry Andric 18110b57cec5SDimitry Andric // Support for old metadata when 18120b57cec5SDimitry Andric // subprogram specific flags are placed in DIFlags. 18130b57cec5SDimitry Andric const unsigned DIFlagMainSubprogram = 1 << 21; 18140b57cec5SDimitry Andric bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram; 18150b57cec5SDimitry Andric if (HasOldMainSubprogramFlag) 18160b57cec5SDimitry Andric // Remove old DIFlagMainSubprogram from DIFlags. 18170b57cec5SDimitry Andric // Note: This assumes that any future use of bit 21 defaults to it 18180b57cec5SDimitry Andric // being 0. 18190b57cec5SDimitry Andric Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram); 18200b57cec5SDimitry Andric 18210b57cec5SDimitry Andric if (HasOldMainSubprogramFlag && HasSPFlags) 18220b57cec5SDimitry Andric SPFlags |= DISubprogram::SPFlagMainSubprogram; 18230b57cec5SDimitry Andric else if (!HasSPFlags) 18240b57cec5SDimitry Andric SPFlags = DISubprogram::toSPFlags( 18250b57cec5SDimitry Andric /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], 18260b57cec5SDimitry Andric /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], 182704eeddc0SDimitry Andric /*IsMainSubprogram=*/HasOldMainSubprogramFlag); 18280b57cec5SDimitry Andric 18290b57cec5SDimitry Andric // All definitions should be distinct. 18300b57cec5SDimitry Andric IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition); 18310b57cec5SDimitry Andric // Version 1 has a Function as Record[15]. 18320b57cec5SDimitry Andric // Version 2 has removed Record[15]. 18330b57cec5SDimitry Andric // Version 3 has the Unit as Record[15]. 18340b57cec5SDimitry Andric // Version 4 added thisAdjustment. 18350b57cec5SDimitry Andric // Version 5 repacked flags into DISPFlags, changing many element numbers. 18360b57cec5SDimitry Andric bool HasUnit = Record[0] & 2; 18370b57cec5SDimitry Andric if (!HasSPFlags && HasUnit && Record.size() < 19) 18380b57cec5SDimitry Andric return error("Invalid record"); 18390b57cec5SDimitry Andric if (HasSPFlags && !HasUnit) 18400b57cec5SDimitry Andric return error("Invalid record"); 18410b57cec5SDimitry Andric // Accommodate older formats. 18420b57cec5SDimitry Andric bool HasFn = false; 18430b57cec5SDimitry Andric bool HasThisAdj = true; 18440b57cec5SDimitry Andric bool HasThrownTypes = true; 1845349cc55cSDimitry Andric bool HasAnnotations = false; 184681ad6265SDimitry Andric bool HasTargetFuncName = false; 18470b57cec5SDimitry Andric unsigned OffsetA = 0; 18480b57cec5SDimitry Andric unsigned OffsetB = 0; 18490b57cec5SDimitry Andric if (!HasSPFlags) { 18500b57cec5SDimitry Andric OffsetA = 2; 18510b57cec5SDimitry Andric OffsetB = 2; 18520b57cec5SDimitry Andric if (Record.size() >= 19) { 18530b57cec5SDimitry Andric HasFn = !HasUnit; 18540b57cec5SDimitry Andric OffsetB++; 18550b57cec5SDimitry Andric } 18560b57cec5SDimitry Andric HasThisAdj = Record.size() >= 20; 18570b57cec5SDimitry Andric HasThrownTypes = Record.size() >= 21; 1858349cc55cSDimitry Andric } else { 1859349cc55cSDimitry Andric HasAnnotations = Record.size() >= 19; 186081ad6265SDimitry Andric HasTargetFuncName = Record.size() >= 20; 18610b57cec5SDimitry Andric } 18620b57cec5SDimitry Andric Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]); 18630b57cec5SDimitry Andric DISubprogram *SP = GET_OR_DISTINCT( 18640b57cec5SDimitry Andric DISubprogram, 18650b57cec5SDimitry Andric (Context, 18660b57cec5SDimitry Andric getDITypeRefOrNull(Record[1]), // scope 18670b57cec5SDimitry Andric getMDString(Record[2]), // name 18680b57cec5SDimitry Andric getMDString(Record[3]), // linkageName 18690b57cec5SDimitry Andric getMDOrNull(Record[4]), // file 18700b57cec5SDimitry Andric Record[5], // line 18710b57cec5SDimitry Andric getMDOrNull(Record[6]), // type 18720b57cec5SDimitry Andric Record[7 + OffsetA], // scopeLine 18730b57cec5SDimitry Andric getDITypeRefOrNull(Record[8 + OffsetA]), // containingType 18740b57cec5SDimitry Andric Record[10 + OffsetA], // virtualIndex 18750b57cec5SDimitry Andric HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment 18760b57cec5SDimitry Andric Flags, // flags 18770b57cec5SDimitry Andric SPFlags, // SPFlags 18780b57cec5SDimitry Andric HasUnit ? CUorFn : nullptr, // unit 18790b57cec5SDimitry Andric getMDOrNull(Record[13 + OffsetB]), // templateParams 18800b57cec5SDimitry Andric getMDOrNull(Record[14 + OffsetB]), // declaration 18810b57cec5SDimitry Andric getMDOrNull(Record[15 + OffsetB]), // retainedNodes 18820b57cec5SDimitry Andric HasThrownTypes ? getMDOrNull(Record[17 + OffsetB]) 1883349cc55cSDimitry Andric : nullptr, // thrownTypes 1884349cc55cSDimitry Andric HasAnnotations ? getMDOrNull(Record[18 + OffsetB]) 188581ad6265SDimitry Andric : nullptr, // annotations 188681ad6265SDimitry Andric HasTargetFuncName ? getMDString(Record[19 + OffsetB]) 188781ad6265SDimitry Andric : nullptr // targetFuncName 18880b57cec5SDimitry Andric )); 18890b57cec5SDimitry Andric MetadataList.assignValue(SP, NextMetadataNo); 18900b57cec5SDimitry Andric NextMetadataNo++; 18910b57cec5SDimitry Andric 18920b57cec5SDimitry Andric // Upgrade sp->function mapping to function->sp mapping. 18930b57cec5SDimitry Andric if (HasFn) { 18940b57cec5SDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn)) 18950b57cec5SDimitry Andric if (auto *F = dyn_cast<Function>(CMD->getValue())) { 18960b57cec5SDimitry Andric if (F->isMaterializable()) 18970b57cec5SDimitry Andric // Defer until materialized; unmaterialized functions may not have 18980b57cec5SDimitry Andric // metadata. 18990b57cec5SDimitry Andric FunctionsWithSPs[F] = SP; 19000b57cec5SDimitry Andric else if (!F->empty()) 19010b57cec5SDimitry Andric F->setSubprogram(SP); 19020b57cec5SDimitry Andric } 19030b57cec5SDimitry Andric } 19040b57cec5SDimitry Andric break; 19050b57cec5SDimitry Andric } 19060b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: { 19070b57cec5SDimitry Andric if (Record.size() != 5) 19080b57cec5SDimitry Andric return error("Invalid record"); 19090b57cec5SDimitry Andric 19100b57cec5SDimitry Andric IsDistinct = Record[0]; 19110b57cec5SDimitry Andric MetadataList.assignValue( 19120b57cec5SDimitry Andric GET_OR_DISTINCT(DILexicalBlock, 19130b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), 19140b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])), 19150b57cec5SDimitry Andric NextMetadataNo); 19160b57cec5SDimitry Andric NextMetadataNo++; 19170b57cec5SDimitry Andric break; 19180b57cec5SDimitry Andric } 19190b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: { 19200b57cec5SDimitry Andric if (Record.size() != 4) 19210b57cec5SDimitry Andric return error("Invalid record"); 19220b57cec5SDimitry Andric 19230b57cec5SDimitry Andric IsDistinct = Record[0]; 19240b57cec5SDimitry Andric MetadataList.assignValue( 19250b57cec5SDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile, 19260b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), 19270b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3])), 19280b57cec5SDimitry Andric NextMetadataNo); 19290b57cec5SDimitry Andric NextMetadataNo++; 19300b57cec5SDimitry Andric break; 19310b57cec5SDimitry Andric } 19320b57cec5SDimitry Andric case bitc::METADATA_COMMON_BLOCK: { 19330b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 19340b57cec5SDimitry Andric MetadataList.assignValue( 19350b57cec5SDimitry Andric GET_OR_DISTINCT(DICommonBlock, 19360b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), 19370b57cec5SDimitry Andric getMDOrNull(Record[2]), getMDString(Record[3]), 19380b57cec5SDimitry Andric getMDOrNull(Record[4]), Record[5])), 19390b57cec5SDimitry Andric NextMetadataNo); 19400b57cec5SDimitry Andric NextMetadataNo++; 19410b57cec5SDimitry Andric break; 19420b57cec5SDimitry Andric } 19430b57cec5SDimitry Andric case bitc::METADATA_NAMESPACE: { 19440b57cec5SDimitry Andric // Newer versions of DINamespace dropped file and line. 19450b57cec5SDimitry Andric MDString *Name; 19460b57cec5SDimitry Andric if (Record.size() == 3) 19470b57cec5SDimitry Andric Name = getMDString(Record[2]); 19480b57cec5SDimitry Andric else if (Record.size() == 5) 19490b57cec5SDimitry Andric Name = getMDString(Record[3]); 19500b57cec5SDimitry Andric else 19510b57cec5SDimitry Andric return error("Invalid record"); 19520b57cec5SDimitry Andric 19530b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 19540b57cec5SDimitry Andric bool ExportSymbols = Record[0] & 2; 19550b57cec5SDimitry Andric MetadataList.assignValue( 19560b57cec5SDimitry Andric GET_OR_DISTINCT(DINamespace, 19570b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), Name, ExportSymbols)), 19580b57cec5SDimitry Andric NextMetadataNo); 19590b57cec5SDimitry Andric NextMetadataNo++; 19600b57cec5SDimitry Andric break; 19610b57cec5SDimitry Andric } 19620b57cec5SDimitry Andric case bitc::METADATA_MACRO: { 19630b57cec5SDimitry Andric if (Record.size() != 5) 19640b57cec5SDimitry Andric return error("Invalid record"); 19650b57cec5SDimitry Andric 19660b57cec5SDimitry Andric IsDistinct = Record[0]; 19670b57cec5SDimitry Andric MetadataList.assignValue( 19680b57cec5SDimitry Andric GET_OR_DISTINCT(DIMacro, 19690b57cec5SDimitry Andric (Context, Record[1], Record[2], getMDString(Record[3]), 19700b57cec5SDimitry Andric getMDString(Record[4]))), 19710b57cec5SDimitry Andric NextMetadataNo); 19720b57cec5SDimitry Andric NextMetadataNo++; 19730b57cec5SDimitry Andric break; 19740b57cec5SDimitry Andric } 19750b57cec5SDimitry Andric case bitc::METADATA_MACRO_FILE: { 19760b57cec5SDimitry Andric if (Record.size() != 5) 19770b57cec5SDimitry Andric return error("Invalid record"); 19780b57cec5SDimitry Andric 19790b57cec5SDimitry Andric IsDistinct = Record[0]; 19800b57cec5SDimitry Andric MetadataList.assignValue( 19810b57cec5SDimitry Andric GET_OR_DISTINCT(DIMacroFile, 19820b57cec5SDimitry Andric (Context, Record[1], Record[2], getMDOrNull(Record[3]), 19830b57cec5SDimitry Andric getMDOrNull(Record[4]))), 19840b57cec5SDimitry Andric NextMetadataNo); 19850b57cec5SDimitry Andric NextMetadataNo++; 19860b57cec5SDimitry Andric break; 19870b57cec5SDimitry Andric } 19880b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: { 19895ffd83dbSDimitry Andric if (Record.size() < 3 || Record.size() > 4) 19900b57cec5SDimitry Andric return error("Invalid record"); 19910b57cec5SDimitry Andric 19920b57cec5SDimitry Andric IsDistinct = Record[0]; 19935ffd83dbSDimitry Andric MetadataList.assignValue( 19945ffd83dbSDimitry Andric GET_OR_DISTINCT(DITemplateTypeParameter, 19950b57cec5SDimitry Andric (Context, getMDString(Record[1]), 19965ffd83dbSDimitry Andric getDITypeRefOrNull(Record[2]), 19975ffd83dbSDimitry Andric (Record.size() == 4) ? getMDOrNull(Record[3]) 19985ffd83dbSDimitry Andric : getMDOrNull(false))), 19990b57cec5SDimitry Andric NextMetadataNo); 20000b57cec5SDimitry Andric NextMetadataNo++; 20010b57cec5SDimitry Andric break; 20020b57cec5SDimitry Andric } 20030b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: { 20045ffd83dbSDimitry Andric if (Record.size() < 5 || Record.size() > 6) 20050b57cec5SDimitry Andric return error("Invalid record"); 20060b57cec5SDimitry Andric 20070b57cec5SDimitry Andric IsDistinct = Record[0]; 20085ffd83dbSDimitry Andric 20090b57cec5SDimitry Andric MetadataList.assignValue( 20105ffd83dbSDimitry Andric GET_OR_DISTINCT( 20115ffd83dbSDimitry Andric DITemplateValueParameter, 20120b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]), 20130b57cec5SDimitry Andric getDITypeRefOrNull(Record[3]), 20145ffd83dbSDimitry Andric (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false), 20155ffd83dbSDimitry Andric (Record.size() == 6) ? getMDOrNull(Record[5]) 20165ffd83dbSDimitry Andric : getMDOrNull(Record[4]))), 20170b57cec5SDimitry Andric NextMetadataNo); 20180b57cec5SDimitry Andric NextMetadataNo++; 20190b57cec5SDimitry Andric break; 20200b57cec5SDimitry Andric } 20210b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR: { 20220b57cec5SDimitry Andric if (Record.size() < 11 || Record.size() > 13) 20230b57cec5SDimitry Andric return error("Invalid record"); 20240b57cec5SDimitry Andric 20250b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 20260b57cec5SDimitry Andric unsigned Version = Record[0] >> 1; 20270b57cec5SDimitry Andric 20280b57cec5SDimitry Andric if (Version == 2) { 2029349cc55cSDimitry Andric Metadata *Annotations = nullptr; 2030349cc55cSDimitry Andric if (Record.size() > 12) 2031349cc55cSDimitry Andric Annotations = getMDOrNull(Record[12]); 2032349cc55cSDimitry Andric 20330b57cec5SDimitry Andric MetadataList.assignValue( 2034349cc55cSDimitry Andric GET_OR_DISTINCT(DIGlobalVariable, 2035349cc55cSDimitry Andric (Context, getMDOrNull(Record[1]), 2036349cc55cSDimitry Andric getMDString(Record[2]), getMDString(Record[3]), 2037349cc55cSDimitry Andric getMDOrNull(Record[4]), Record[5], 20380b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8], 2039349cc55cSDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), 2040349cc55cSDimitry Andric Record[11], Annotations)), 20410b57cec5SDimitry Andric NextMetadataNo); 20420b57cec5SDimitry Andric 20430b57cec5SDimitry Andric NextMetadataNo++; 20440b57cec5SDimitry Andric } else if (Version == 1) { 20450b57cec5SDimitry Andric // No upgrade necessary. A null field will be introduced to indicate 20460b57cec5SDimitry Andric // that no parameter information is available. 20470b57cec5SDimitry Andric MetadataList.assignValue( 2048349cc55cSDimitry Andric GET_OR_DISTINCT( 2049349cc55cSDimitry Andric DIGlobalVariable, 2050349cc55cSDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 2051349cc55cSDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 20520b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8], 2053349cc55cSDimitry Andric getMDOrNull(Record[10]), nullptr, Record[11], nullptr)), 20540b57cec5SDimitry Andric NextMetadataNo); 20550b57cec5SDimitry Andric 20560b57cec5SDimitry Andric NextMetadataNo++; 20570b57cec5SDimitry Andric } else if (Version == 0) { 20580b57cec5SDimitry Andric // Upgrade old metadata, which stored a global variable reference or a 20590b57cec5SDimitry Andric // ConstantInt here. 20600b57cec5SDimitry Andric NeedUpgradeToDIGlobalVariableExpression = true; 20610b57cec5SDimitry Andric Metadata *Expr = getMDOrNull(Record[9]); 20620b57cec5SDimitry Andric uint32_t AlignInBits = 0; 20630b57cec5SDimitry Andric if (Record.size() > 11) { 20640b57cec5SDimitry Andric if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max()) 20650b57cec5SDimitry Andric return error("Alignment value is too large"); 20660b57cec5SDimitry Andric AlignInBits = Record[11]; 20670b57cec5SDimitry Andric } 20680b57cec5SDimitry Andric GlobalVariable *Attach = nullptr; 20690b57cec5SDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) { 20700b57cec5SDimitry Andric if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) { 20710b57cec5SDimitry Andric Attach = GV; 20720b57cec5SDimitry Andric Expr = nullptr; 20730b57cec5SDimitry Andric } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) { 20740b57cec5SDimitry Andric Expr = DIExpression::get(Context, 20750b57cec5SDimitry Andric {dwarf::DW_OP_constu, CI->getZExtValue(), 20760b57cec5SDimitry Andric dwarf::DW_OP_stack_value}); 20770b57cec5SDimitry Andric } else { 20780b57cec5SDimitry Andric Expr = nullptr; 20790b57cec5SDimitry Andric } 20800b57cec5SDimitry Andric } 20810b57cec5SDimitry Andric DIGlobalVariable *DGV = GET_OR_DISTINCT( 20820b57cec5SDimitry Andric DIGlobalVariable, 20830b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 20840b57cec5SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 20850b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8], 2086349cc55cSDimitry Andric getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr)); 20870b57cec5SDimitry Andric 20880b57cec5SDimitry Andric DIGlobalVariableExpression *DGVE = nullptr; 20890b57cec5SDimitry Andric if (Attach || Expr) 20900b57cec5SDimitry Andric DGVE = DIGlobalVariableExpression::getDistinct( 20910b57cec5SDimitry Andric Context, DGV, Expr ? Expr : DIExpression::get(Context, {})); 20920b57cec5SDimitry Andric if (Attach) 20930b57cec5SDimitry Andric Attach->addDebugInfo(DGVE); 20940b57cec5SDimitry Andric 20950b57cec5SDimitry Andric auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV); 20960b57cec5SDimitry Andric MetadataList.assignValue(MDNode, NextMetadataNo); 20970b57cec5SDimitry Andric NextMetadataNo++; 20980b57cec5SDimitry Andric } else 20990b57cec5SDimitry Andric return error("Invalid record"); 21000b57cec5SDimitry Andric 21010b57cec5SDimitry Andric break; 21020b57cec5SDimitry Andric } 2103bdd1243dSDimitry Andric case bitc::METADATA_ASSIGN_ID: { 2104bdd1243dSDimitry Andric if (Record.size() != 1) 2105bdd1243dSDimitry Andric return error("Invalid DIAssignID record."); 2106bdd1243dSDimitry Andric 2107bdd1243dSDimitry Andric IsDistinct = Record[0] & 1; 2108bdd1243dSDimitry Andric if (!IsDistinct) 2109bdd1243dSDimitry Andric return error("Invalid DIAssignID record. Must be distinct"); 2110bdd1243dSDimitry Andric 2111bdd1243dSDimitry Andric MetadataList.assignValue(DIAssignID::getDistinct(Context), NextMetadataNo); 2112bdd1243dSDimitry Andric NextMetadataNo++; 2113bdd1243dSDimitry Andric break; 2114bdd1243dSDimitry Andric } 21150b57cec5SDimitry Andric case bitc::METADATA_LOCAL_VAR: { 21160b57cec5SDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field. 21170b57cec5SDimitry Andric if (Record.size() < 8 || Record.size() > 10) 21180b57cec5SDimitry Andric return error("Invalid record"); 21190b57cec5SDimitry Andric 21200b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 21210b57cec5SDimitry Andric bool HasAlignment = Record[0] & 2; 21220b57cec5SDimitry Andric // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or 21230b57cec5SDimitry Andric // DW_TAG_arg_variable, if we have alignment flag encoded it means, that 21240b57cec5SDimitry Andric // this is newer version of record which doesn't have artificial tag. 21250b57cec5SDimitry Andric bool HasTag = !HasAlignment && Record.size() > 8; 21260b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]); 21270b57cec5SDimitry Andric uint32_t AlignInBits = 0; 2128349cc55cSDimitry Andric Metadata *Annotations = nullptr; 21290b57cec5SDimitry Andric if (HasAlignment) { 2130349cc55cSDimitry Andric if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) 21310b57cec5SDimitry Andric return error("Alignment value is too large"); 2132349cc55cSDimitry Andric AlignInBits = Record[8]; 2133349cc55cSDimitry Andric if (Record.size() > 9) 2134349cc55cSDimitry Andric Annotations = getMDOrNull(Record[9]); 21350b57cec5SDimitry Andric } 2136349cc55cSDimitry Andric 21370b57cec5SDimitry Andric MetadataList.assignValue( 21380b57cec5SDimitry Andric GET_OR_DISTINCT(DILocalVariable, 21390b57cec5SDimitry Andric (Context, getMDOrNull(Record[1 + HasTag]), 21400b57cec5SDimitry Andric getMDString(Record[2 + HasTag]), 21410b57cec5SDimitry Andric getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag], 21420b57cec5SDimitry Andric getDITypeRefOrNull(Record[5 + HasTag]), 2143349cc55cSDimitry Andric Record[6 + HasTag], Flags, AlignInBits, Annotations)), 21440b57cec5SDimitry Andric NextMetadataNo); 21450b57cec5SDimitry Andric NextMetadataNo++; 21460b57cec5SDimitry Andric break; 21470b57cec5SDimitry Andric } 21480b57cec5SDimitry Andric case bitc::METADATA_LABEL: { 21490b57cec5SDimitry Andric if (Record.size() != 5) 21500b57cec5SDimitry Andric return error("Invalid record"); 21510b57cec5SDimitry Andric 21520b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 21530b57cec5SDimitry Andric MetadataList.assignValue( 2154349cc55cSDimitry Andric GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]), 21550b57cec5SDimitry Andric getMDString(Record[2]), 21560b57cec5SDimitry Andric getMDOrNull(Record[3]), Record[4])), 21570b57cec5SDimitry Andric NextMetadataNo); 21580b57cec5SDimitry Andric NextMetadataNo++; 21590b57cec5SDimitry Andric break; 21600b57cec5SDimitry Andric } 21610b57cec5SDimitry Andric case bitc::METADATA_EXPRESSION: { 21620b57cec5SDimitry Andric if (Record.size() < 1) 21630b57cec5SDimitry Andric return error("Invalid record"); 21640b57cec5SDimitry Andric 21650b57cec5SDimitry Andric IsDistinct = Record[0] & 1; 21660b57cec5SDimitry Andric uint64_t Version = Record[0] >> 1; 21670b57cec5SDimitry Andric auto Elts = MutableArrayRef<uint64_t>(Record).slice(1); 21680b57cec5SDimitry Andric 21690b57cec5SDimitry Andric SmallVector<uint64_t, 6> Buffer; 21700b57cec5SDimitry Andric if (Error Err = upgradeDIExpression(Version, Elts, Buffer)) 21710b57cec5SDimitry Andric return Err; 21720b57cec5SDimitry Andric 2173349cc55cSDimitry Andric MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)), 2174349cc55cSDimitry Andric NextMetadataNo); 21750b57cec5SDimitry Andric NextMetadataNo++; 21760b57cec5SDimitry Andric break; 21770b57cec5SDimitry Andric } 21780b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR: { 21790b57cec5SDimitry Andric if (Record.size() != 3) 21800b57cec5SDimitry Andric return error("Invalid record"); 21810b57cec5SDimitry Andric 21820b57cec5SDimitry Andric IsDistinct = Record[0]; 21830b57cec5SDimitry Andric Metadata *Expr = getMDOrNull(Record[2]); 21840b57cec5SDimitry Andric if (!Expr) 21850b57cec5SDimitry Andric Expr = DIExpression::get(Context, {}); 21860b57cec5SDimitry Andric MetadataList.assignValue( 21870b57cec5SDimitry Andric GET_OR_DISTINCT(DIGlobalVariableExpression, 21880b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), Expr)), 21890b57cec5SDimitry Andric NextMetadataNo); 21900b57cec5SDimitry Andric NextMetadataNo++; 21910b57cec5SDimitry Andric break; 21920b57cec5SDimitry Andric } 21930b57cec5SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: { 21940b57cec5SDimitry Andric if (Record.size() != 8) 21950b57cec5SDimitry Andric return error("Invalid record"); 21960b57cec5SDimitry Andric 21970b57cec5SDimitry Andric IsDistinct = Record[0]; 21980b57cec5SDimitry Andric MetadataList.assignValue( 21990b57cec5SDimitry Andric GET_OR_DISTINCT(DIObjCProperty, 22000b57cec5SDimitry Andric (Context, getMDString(Record[1]), 22010b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3], 22020b57cec5SDimitry Andric getMDString(Record[4]), getMDString(Record[5]), 22030b57cec5SDimitry Andric Record[6], getDITypeRefOrNull(Record[7]))), 22040b57cec5SDimitry Andric NextMetadataNo); 22050b57cec5SDimitry Andric NextMetadataNo++; 22060b57cec5SDimitry Andric break; 22070b57cec5SDimitry Andric } 22080b57cec5SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: { 220981ad6265SDimitry Andric if (Record.size() < 6 || Record.size() > 8) 221081ad6265SDimitry Andric return error("Invalid DIImportedEntity record"); 22110b57cec5SDimitry Andric 22120b57cec5SDimitry Andric IsDistinct = Record[0]; 2213349cc55cSDimitry Andric bool HasFile = (Record.size() >= 7); 2214349cc55cSDimitry Andric bool HasElements = (Record.size() >= 8); 22150b57cec5SDimitry Andric MetadataList.assignValue( 22160b57cec5SDimitry Andric GET_OR_DISTINCT(DIImportedEntity, 22170b57cec5SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]), 22180b57cec5SDimitry Andric getDITypeRefOrNull(Record[3]), 22190b57cec5SDimitry Andric HasFile ? getMDOrNull(Record[6]) : nullptr, 2220349cc55cSDimitry Andric HasFile ? Record[4] : 0, getMDString(Record[5]), 2221349cc55cSDimitry Andric HasElements ? getMDOrNull(Record[7]) : nullptr)), 22220b57cec5SDimitry Andric NextMetadataNo); 22230b57cec5SDimitry Andric NextMetadataNo++; 22240b57cec5SDimitry Andric break; 22250b57cec5SDimitry Andric } 22260b57cec5SDimitry Andric case bitc::METADATA_STRING_OLD: { 22270b57cec5SDimitry Andric std::string String(Record.begin(), Record.end()); 22280b57cec5SDimitry Andric 22290b57cec5SDimitry Andric // Test for upgrading !llvm.loop. 22300b57cec5SDimitry Andric HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String); 22310b57cec5SDimitry Andric ++NumMDStringLoaded; 22320b57cec5SDimitry Andric Metadata *MD = MDString::get(Context, String); 22330b57cec5SDimitry Andric MetadataList.assignValue(MD, NextMetadataNo); 22340b57cec5SDimitry Andric NextMetadataNo++; 22350b57cec5SDimitry Andric break; 22360b57cec5SDimitry Andric } 22370b57cec5SDimitry Andric case bitc::METADATA_STRINGS: { 22380b57cec5SDimitry Andric auto CreateNextMDString = [&](StringRef Str) { 22390b57cec5SDimitry Andric ++NumMDStringLoaded; 22400b57cec5SDimitry Andric MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo); 22410b57cec5SDimitry Andric NextMetadataNo++; 22420b57cec5SDimitry Andric }; 22430b57cec5SDimitry Andric if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString)) 22440b57cec5SDimitry Andric return Err; 22450b57cec5SDimitry Andric break; 22460b57cec5SDimitry Andric } 22470b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 22480b57cec5SDimitry Andric if (Record.size() % 2 == 0) 22490b57cec5SDimitry Andric return error("Invalid record"); 22500b57cec5SDimitry Andric unsigned ValueID = Record[0]; 22510b57cec5SDimitry Andric if (ValueID >= ValueList.size()) 22520b57cec5SDimitry Andric return error("Invalid record"); 22530b57cec5SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) 22540b57cec5SDimitry Andric if (Error Err = parseGlobalObjectAttachment( 22550b57cec5SDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1))) 22560b57cec5SDimitry Andric return Err; 22570b57cec5SDimitry Andric break; 22580b57cec5SDimitry Andric } 22590b57cec5SDimitry Andric case bitc::METADATA_KIND: { 22600b57cec5SDimitry Andric // Support older bitcode files that had METADATA_KIND records in a 22610b57cec5SDimitry Andric // block with METADATA_BLOCK_ID. 22620b57cec5SDimitry Andric if (Error Err = parseMetadataKindRecord(Record)) 22630b57cec5SDimitry Andric return Err; 22640b57cec5SDimitry Andric break; 22650b57cec5SDimitry Andric } 2266fe6060f1SDimitry Andric case bitc::METADATA_ARG_LIST: { 2267fe6060f1SDimitry Andric SmallVector<ValueAsMetadata *, 4> Elts; 2268fe6060f1SDimitry Andric Elts.reserve(Record.size()); 2269fe6060f1SDimitry Andric for (uint64_t Elt : Record) { 2270fe6060f1SDimitry Andric Metadata *MD = getMD(Elt); 2271fe6060f1SDimitry Andric if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary()) 2272fe6060f1SDimitry Andric return error( 2273fe6060f1SDimitry Andric "Invalid record: DIArgList should not contain forward refs"); 2274fe6060f1SDimitry Andric if (!isa<ValueAsMetadata>(MD)) 2275fe6060f1SDimitry Andric return error("Invalid record"); 2276fe6060f1SDimitry Andric Elts.push_back(cast<ValueAsMetadata>(MD)); 2277fe6060f1SDimitry Andric } 2278fe6060f1SDimitry Andric 2279fe6060f1SDimitry Andric MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo); 2280fe6060f1SDimitry Andric NextMetadataNo++; 2281fe6060f1SDimitry Andric break; 2282fe6060f1SDimitry Andric } 22830b57cec5SDimitry Andric } 22840b57cec5SDimitry Andric return Error::success(); 22850b57cec5SDimitry Andric #undef GET_OR_DISTINCT 22860b57cec5SDimitry Andric } 22870b57cec5SDimitry Andric 22880b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings( 22890b57cec5SDimitry Andric ArrayRef<uint64_t> Record, StringRef Blob, 22900b57cec5SDimitry Andric function_ref<void(StringRef)> CallBack) { 22910b57cec5SDimitry Andric // All the MDStrings in the block are emitted together in a single 22920b57cec5SDimitry Andric // record. The strings are concatenated and stored in a blob along with 22930b57cec5SDimitry Andric // their sizes. 22940b57cec5SDimitry Andric if (Record.size() != 2) 22950b57cec5SDimitry Andric return error("Invalid record: metadata strings layout"); 22960b57cec5SDimitry Andric 22970b57cec5SDimitry Andric unsigned NumStrings = Record[0]; 22980b57cec5SDimitry Andric unsigned StringsOffset = Record[1]; 22990b57cec5SDimitry Andric if (!NumStrings) 23000b57cec5SDimitry Andric return error("Invalid record: metadata strings with no strings"); 23010b57cec5SDimitry Andric if (StringsOffset > Blob.size()) 23020b57cec5SDimitry Andric return error("Invalid record: metadata strings corrupt offset"); 23030b57cec5SDimitry Andric 23040b57cec5SDimitry Andric StringRef Lengths = Blob.slice(0, StringsOffset); 23050b57cec5SDimitry Andric SimpleBitstreamCursor R(Lengths); 23060b57cec5SDimitry Andric 23070b57cec5SDimitry Andric StringRef Strings = Blob.drop_front(StringsOffset); 23080b57cec5SDimitry Andric do { 23090b57cec5SDimitry Andric if (R.AtEndOfStream()) 23100b57cec5SDimitry Andric return error("Invalid record: metadata strings bad length"); 23110b57cec5SDimitry Andric 2312349cc55cSDimitry Andric uint32_t Size; 2313349cc55cSDimitry Andric if (Error E = R.ReadVBR(6).moveInto(Size)) 2314349cc55cSDimitry Andric return E; 23150b57cec5SDimitry Andric if (Strings.size() < Size) 23160b57cec5SDimitry Andric return error("Invalid record: metadata strings truncated chars"); 23170b57cec5SDimitry Andric 23180b57cec5SDimitry Andric CallBack(Strings.slice(0, Size)); 23190b57cec5SDimitry Andric Strings = Strings.drop_front(Size); 23200b57cec5SDimitry Andric } while (--NumStrings); 23210b57cec5SDimitry Andric 23220b57cec5SDimitry Andric return Error::success(); 23230b57cec5SDimitry Andric } 23240b57cec5SDimitry Andric 23250b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment( 23260b57cec5SDimitry Andric GlobalObject &GO, ArrayRef<uint64_t> Record) { 23270b57cec5SDimitry Andric assert(Record.size() % 2 == 0); 23280b57cec5SDimitry Andric for (unsigned I = 0, E = Record.size(); I != E; I += 2) { 23290b57cec5SDimitry Andric auto K = MDKindMap.find(Record[I]); 23300b57cec5SDimitry Andric if (K == MDKindMap.end()) 23310b57cec5SDimitry Andric return error("Invalid ID"); 2332e8d8bef9SDimitry Andric MDNode *MD = 2333e8d8bef9SDimitry Andric dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1])); 23340b57cec5SDimitry Andric if (!MD) 23350b57cec5SDimitry Andric return error("Invalid metadata attachment: expect fwd ref to MDNode"); 23360b57cec5SDimitry Andric GO.addMetadata(K->second, *MD); 23370b57cec5SDimitry Andric } 23380b57cec5SDimitry Andric return Error::success(); 23390b57cec5SDimitry Andric } 23400b57cec5SDimitry Andric 23410b57cec5SDimitry Andric /// Parse metadata attachments. 23420b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment( 234381ad6265SDimitry Andric Function &F, ArrayRef<Instruction *> InstructionList) { 23440b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 23450b57cec5SDimitry Andric return Err; 23460b57cec5SDimitry Andric 23470b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record; 23480b57cec5SDimitry Andric PlaceholderQueue Placeholders; 23490b57cec5SDimitry Andric 23500b57cec5SDimitry Andric while (true) { 2351349cc55cSDimitry Andric BitstreamEntry Entry; 2352349cc55cSDimitry Andric if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 2353349cc55cSDimitry Andric return E; 23540b57cec5SDimitry Andric 23550b57cec5SDimitry Andric switch (Entry.Kind) { 23560b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 23570b57cec5SDimitry Andric case BitstreamEntry::Error: 23580b57cec5SDimitry Andric return error("Malformed block"); 23590b57cec5SDimitry Andric case BitstreamEntry::EndBlock: 23600b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders); 23610b57cec5SDimitry Andric return Error::success(); 23620b57cec5SDimitry Andric case BitstreamEntry::Record: 23630b57cec5SDimitry Andric // The interesting case. 23640b57cec5SDimitry Andric break; 23650b57cec5SDimitry Andric } 23660b57cec5SDimitry Andric 23670b57cec5SDimitry Andric // Read a metadata attachment record. 23680b57cec5SDimitry Andric Record.clear(); 23690b57cec5SDimitry Andric ++NumMDRecordLoaded; 23700b57cec5SDimitry Andric Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record); 23710b57cec5SDimitry Andric if (!MaybeRecord) 23720b57cec5SDimitry Andric return MaybeRecord.takeError(); 23730b57cec5SDimitry Andric switch (MaybeRecord.get()) { 23740b57cec5SDimitry Andric default: // Default behavior: ignore. 23750b57cec5SDimitry Andric break; 23760b57cec5SDimitry Andric case bitc::METADATA_ATTACHMENT: { 23770b57cec5SDimitry Andric unsigned RecordLength = Record.size(); 23780b57cec5SDimitry Andric if (Record.empty()) 23790b57cec5SDimitry Andric return error("Invalid record"); 23800b57cec5SDimitry Andric if (RecordLength % 2 == 0) { 23810b57cec5SDimitry Andric // A function attachment. 23820b57cec5SDimitry Andric if (Error Err = parseGlobalObjectAttachment(F, Record)) 23830b57cec5SDimitry Andric return Err; 23840b57cec5SDimitry Andric continue; 23850b57cec5SDimitry Andric } 23860b57cec5SDimitry Andric 23870b57cec5SDimitry Andric // An instruction attachment. 23880b57cec5SDimitry Andric Instruction *Inst = InstructionList[Record[0]]; 23890b57cec5SDimitry Andric for (unsigned i = 1; i != RecordLength; i = i + 2) { 23900b57cec5SDimitry Andric unsigned Kind = Record[i]; 23910b57cec5SDimitry Andric DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind); 23920b57cec5SDimitry Andric if (I == MDKindMap.end()) 23930b57cec5SDimitry Andric return error("Invalid ID"); 23940b57cec5SDimitry Andric if (I->second == LLVMContext::MD_tbaa && StripTBAA) 23950b57cec5SDimitry Andric continue; 23960b57cec5SDimitry Andric 23970b57cec5SDimitry Andric auto Idx = Record[i + 1]; 23980b57cec5SDimitry Andric if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) && 23990b57cec5SDimitry Andric !MetadataList.lookup(Idx)) { 24000b57cec5SDimitry Andric // Load the attachment if it is in the lazy-loadable range and hasn't 24010b57cec5SDimitry Andric // been loaded yet. 24020b57cec5SDimitry Andric lazyLoadOneMetadata(Idx, Placeholders); 24030b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders); 24040b57cec5SDimitry Andric } 24050b57cec5SDimitry Andric 24060b57cec5SDimitry Andric Metadata *Node = MetadataList.getMetadataFwdRef(Idx); 24070b57cec5SDimitry Andric if (isa<LocalAsMetadata>(Node)) 24080b57cec5SDimitry Andric // Drop the attachment. This used to be legal, but there's no 24090b57cec5SDimitry Andric // upgrade path. 24100b57cec5SDimitry Andric break; 24110b57cec5SDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(Node); 24120b57cec5SDimitry Andric if (!MD) 24130b57cec5SDimitry Andric return error("Invalid metadata attachment"); 24140b57cec5SDimitry Andric 24150b57cec5SDimitry Andric if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop) 24160b57cec5SDimitry Andric MD = upgradeInstructionLoopAttachment(*MD); 24170b57cec5SDimitry Andric 24180b57cec5SDimitry Andric if (I->second == LLVMContext::MD_tbaa) { 24190b57cec5SDimitry Andric assert(!MD->isTemporary() && "should load MDs before attachments"); 24200b57cec5SDimitry Andric MD = UpgradeTBAANode(*MD); 24210b57cec5SDimitry Andric } 24220b57cec5SDimitry Andric Inst->setMetadata(I->second, MD); 24230b57cec5SDimitry Andric } 24240b57cec5SDimitry Andric break; 24250b57cec5SDimitry Andric } 24260b57cec5SDimitry Andric } 24270b57cec5SDimitry Andric } 24280b57cec5SDimitry Andric } 24290b57cec5SDimitry Andric 24300b57cec5SDimitry Andric /// Parse a single METADATA_KIND record, inserting result in MDKindMap. 24310b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord( 24320b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Record) { 24330b57cec5SDimitry Andric if (Record.size() < 2) 24340b57cec5SDimitry Andric return error("Invalid record"); 24350b57cec5SDimitry Andric 24360b57cec5SDimitry Andric unsigned Kind = Record[0]; 24370b57cec5SDimitry Andric SmallString<8> Name(Record.begin() + 1, Record.end()); 24380b57cec5SDimitry Andric 24390b57cec5SDimitry Andric unsigned NewKind = TheModule.getMDKindID(Name.str()); 24400b57cec5SDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 24410b57cec5SDimitry Andric return error("Conflicting METADATA_KIND records"); 24420b57cec5SDimitry Andric return Error::success(); 24430b57cec5SDimitry Andric } 24440b57cec5SDimitry Andric 24450b57cec5SDimitry Andric /// Parse the metadata kinds out of the METADATA_KIND_BLOCK. 24460b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() { 24470b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID)) 24480b57cec5SDimitry Andric return Err; 24490b57cec5SDimitry Andric 24500b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record; 24510b57cec5SDimitry Andric 24520b57cec5SDimitry Andric // Read all the records. 24530b57cec5SDimitry Andric while (true) { 2454349cc55cSDimitry Andric BitstreamEntry Entry; 2455349cc55cSDimitry Andric if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 2456349cc55cSDimitry Andric return E; 24570b57cec5SDimitry Andric 24580b57cec5SDimitry Andric switch (Entry.Kind) { 24590b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already. 24600b57cec5SDimitry Andric case BitstreamEntry::Error: 24610b57cec5SDimitry Andric return error("Malformed block"); 24620b57cec5SDimitry Andric case BitstreamEntry::EndBlock: 24630b57cec5SDimitry Andric return Error::success(); 24640b57cec5SDimitry Andric case BitstreamEntry::Record: 24650b57cec5SDimitry Andric // The interesting case. 24660b57cec5SDimitry Andric break; 24670b57cec5SDimitry Andric } 24680b57cec5SDimitry Andric 24690b57cec5SDimitry Andric // Read a record. 24700b57cec5SDimitry Andric Record.clear(); 24710b57cec5SDimitry Andric ++NumMDRecordLoaded; 24720b57cec5SDimitry Andric Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record); 24730b57cec5SDimitry Andric if (!MaybeCode) 24740b57cec5SDimitry Andric return MaybeCode.takeError(); 24750b57cec5SDimitry Andric switch (MaybeCode.get()) { 24760b57cec5SDimitry Andric default: // Default behavior: ignore. 24770b57cec5SDimitry Andric break; 24780b57cec5SDimitry Andric case bitc::METADATA_KIND: { 24790b57cec5SDimitry Andric if (Error Err = parseMetadataKindRecord(Record)) 24800b57cec5SDimitry Andric return Err; 24810b57cec5SDimitry Andric break; 24820b57cec5SDimitry Andric } 24830b57cec5SDimitry Andric } 24840b57cec5SDimitry Andric } 24850b57cec5SDimitry Andric } 24860b57cec5SDimitry Andric 24870b57cec5SDimitry Andric MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) { 24880b57cec5SDimitry Andric Pimpl = std::move(RHS.Pimpl); 24890b57cec5SDimitry Andric return *this; 24900b57cec5SDimitry Andric } 24910b57cec5SDimitry Andric MetadataLoader::MetadataLoader(MetadataLoader &&RHS) 24920b57cec5SDimitry Andric : Pimpl(std::move(RHS.Pimpl)) {} 24930b57cec5SDimitry Andric 24940b57cec5SDimitry Andric MetadataLoader::~MetadataLoader() = default; 24950b57cec5SDimitry Andric MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 24960b57cec5SDimitry Andric BitcodeReaderValueList &ValueList, 24970b57cec5SDimitry Andric bool IsImporting, 2498bdd1243dSDimitry Andric MetadataLoaderCallbacks Callbacks) 24998bcb0991SDimitry Andric : Pimpl(std::make_unique<MetadataLoaderImpl>( 2500bdd1243dSDimitry Andric Stream, TheModule, ValueList, std::move(Callbacks), IsImporting)) {} 25010b57cec5SDimitry Andric 25020b57cec5SDimitry Andric Error MetadataLoader::parseMetadata(bool ModuleLevel) { 25030b57cec5SDimitry Andric return Pimpl->parseMetadata(ModuleLevel); 25040b57cec5SDimitry Andric } 25050b57cec5SDimitry Andric 25060b57cec5SDimitry Andric bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); } 25070b57cec5SDimitry Andric 25080b57cec5SDimitry Andric /// Return the given metadata, creating a replaceable forward reference if 25090b57cec5SDimitry Andric /// necessary. 25100b57cec5SDimitry Andric Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) { 25110b57cec5SDimitry Andric return Pimpl->getMetadataFwdRefOrLoad(Idx); 25120b57cec5SDimitry Andric } 25130b57cec5SDimitry Andric 25140b57cec5SDimitry Andric DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) { 25150b57cec5SDimitry Andric return Pimpl->lookupSubprogramForFunction(F); 25160b57cec5SDimitry Andric } 25170b57cec5SDimitry Andric 25180b57cec5SDimitry Andric Error MetadataLoader::parseMetadataAttachment( 251981ad6265SDimitry Andric Function &F, ArrayRef<Instruction *> InstructionList) { 25200b57cec5SDimitry Andric return Pimpl->parseMetadataAttachment(F, InstructionList); 25210b57cec5SDimitry Andric } 25220b57cec5SDimitry Andric 25230b57cec5SDimitry Andric Error MetadataLoader::parseMetadataKinds() { 25240b57cec5SDimitry Andric return Pimpl->parseMetadataKinds(); 25250b57cec5SDimitry Andric } 25260b57cec5SDimitry Andric 25270b57cec5SDimitry Andric void MetadataLoader::setStripTBAA(bool StripTBAA) { 25280b57cec5SDimitry Andric return Pimpl->setStripTBAA(StripTBAA); 25290b57cec5SDimitry Andric } 25300b57cec5SDimitry Andric 25310b57cec5SDimitry Andric bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); } 25320b57cec5SDimitry Andric 25330b57cec5SDimitry Andric unsigned MetadataLoader::size() const { return Pimpl->size(); } 25340b57cec5SDimitry Andric void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); } 25350b57cec5SDimitry Andric 25360b57cec5SDimitry Andric void MetadataLoader::upgradeDebugIntrinsics(Function &F) { 25370b57cec5SDimitry Andric return Pimpl->upgradeDebugIntrinsics(F); 25380b57cec5SDimitry Andric } 2539