xref: /freebsd-src/contrib/llvm-project/llvm/lib/Bitcode/Reader/MetadataLoader.cpp (revision 0fca6ea1d4eea4c934cfff25ac9ee8ad6fe95583)
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