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/APFloat.h"
130b57cec5SDimitry Andric #include "llvm/ADT/APInt.h"
140b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
150b57cec5SDimitry Andric #include "llvm/ADT/DenseMap.h"
160b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h"
170b57cec5SDimitry Andric #include "llvm/ADT/None.h"
180b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
190b57cec5SDimitry Andric #include "llvm/ADT/SmallString.h"
200b57cec5SDimitry Andric #include "llvm/ADT/Statistic.h"
210b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
220b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
230b57cec5SDimitry Andric #include "llvm/Bitcode/BitcodeReader.h"
240b57cec5SDimitry Andric #include "llvm/Bitstream/BitstreamReader.h"
250b57cec5SDimitry Andric #include "llvm/Bitcode/LLVMBitCodes.h"
260b57cec5SDimitry Andric #include "llvm/IR/Argument.h"
270b57cec5SDimitry Andric #include "llvm/IR/Attributes.h"
280b57cec5SDimitry Andric #include "llvm/IR/AutoUpgrade.h"
290b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h"
300b57cec5SDimitry Andric #include "llvm/IR/CallingConv.h"
310b57cec5SDimitry Andric #include "llvm/IR/Comdat.h"
320b57cec5SDimitry Andric #include "llvm/IR/Constant.h"
330b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
340b57cec5SDimitry Andric #include "llvm/IR/DebugInfo.h"
350b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
360b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h"
370b57cec5SDimitry Andric #include "llvm/IR/DerivedTypes.h"
380b57cec5SDimitry Andric #include "llvm/IR/DiagnosticPrinter.h"
390b57cec5SDimitry Andric #include "llvm/IR/Function.h"
400b57cec5SDimitry Andric #include "llvm/IR/GVMaterializer.h"
410b57cec5SDimitry Andric #include "llvm/IR/GlobalAlias.h"
420b57cec5SDimitry Andric #include "llvm/IR/GlobalIFunc.h"
430b57cec5SDimitry Andric #include "llvm/IR/GlobalIndirectSymbol.h"
440b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h"
450b57cec5SDimitry Andric #include "llvm/IR/GlobalValue.h"
460b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
470b57cec5SDimitry Andric #include "llvm/IR/InlineAsm.h"
480b57cec5SDimitry Andric #include "llvm/IR/InstrTypes.h"
490b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
500b57cec5SDimitry Andric #include "llvm/IR/Instructions.h"
510b57cec5SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
520b57cec5SDimitry Andric #include "llvm/IR/Intrinsics.h"
530b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h"
540b57cec5SDimitry Andric #include "llvm/IR/Module.h"
550b57cec5SDimitry Andric #include "llvm/IR/ModuleSummaryIndex.h"
560b57cec5SDimitry Andric #include "llvm/IR/OperandTraits.h"
570b57cec5SDimitry Andric #include "llvm/IR/TrackingMDRef.h"
580b57cec5SDimitry Andric #include "llvm/IR/Type.h"
590b57cec5SDimitry Andric #include "llvm/IR/ValueHandle.h"
600b57cec5SDimitry Andric #include "llvm/Support/AtomicOrdering.h"
610b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
620b57cec5SDimitry Andric #include "llvm/Support/CommandLine.h"
630b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
640b57cec5SDimitry Andric #include "llvm/Support/Debug.h"
650b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
660b57cec5SDimitry Andric #include "llvm/Support/ManagedStatic.h"
670b57cec5SDimitry Andric #include "llvm/Support/MemoryBuffer.h"
680b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
690b57cec5SDimitry Andric #include <algorithm>
700b57cec5SDimitry Andric #include <cassert>
710b57cec5SDimitry Andric #include <cstddef>
720b57cec5SDimitry Andric #include <cstdint>
730b57cec5SDimitry Andric #include <deque>
740b57cec5SDimitry Andric #include <limits>
750b57cec5SDimitry Andric #include <map>
760b57cec5SDimitry Andric #include <string>
770b57cec5SDimitry Andric #include <system_error>
780b57cec5SDimitry Andric #include <tuple>
790b57cec5SDimitry Andric #include <utility>
800b57cec5SDimitry Andric #include <vector>
810b57cec5SDimitry Andric
820b57cec5SDimitry Andric using namespace llvm;
830b57cec5SDimitry Andric
840b57cec5SDimitry Andric #define DEBUG_TYPE "bitcode-reader"
850b57cec5SDimitry Andric
860b57cec5SDimitry Andric STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
870b57cec5SDimitry Andric STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
880b57cec5SDimitry Andric STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
890b57cec5SDimitry Andric
900b57cec5SDimitry Andric /// Flag whether we need to import full type definitions for ThinLTO.
910b57cec5SDimitry Andric /// Currently needed for Darwin and LLDB.
920b57cec5SDimitry Andric static cl::opt<bool> ImportFullTypeDefinitions(
930b57cec5SDimitry Andric "import-full-type-definitions", cl::init(false), cl::Hidden,
940b57cec5SDimitry Andric cl::desc("Import full type definitions for ThinLTO."));
950b57cec5SDimitry Andric
960b57cec5SDimitry Andric static cl::opt<bool> DisableLazyLoading(
970b57cec5SDimitry Andric "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
980b57cec5SDimitry Andric cl::desc("Force disable the lazy-loading on-demand of metadata when "
990b57cec5SDimitry Andric "loading bitcode for importing."));
1000b57cec5SDimitry Andric
1010b57cec5SDimitry Andric namespace {
1020b57cec5SDimitry Andric
unrotateSign(uint64_t U)1030b57cec5SDimitry Andric static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
1040b57cec5SDimitry Andric
1050b57cec5SDimitry Andric class BitcodeReaderMetadataList {
1060b57cec5SDimitry Andric /// Array of metadata references.
1070b57cec5SDimitry Andric ///
1080b57cec5SDimitry Andric /// Don't use std::vector here. Some versions of libc++ copy (instead of
1090b57cec5SDimitry Andric /// move) on resize, and TrackingMDRef is very expensive to copy.
1100b57cec5SDimitry Andric SmallVector<TrackingMDRef, 1> MetadataPtrs;
1110b57cec5SDimitry Andric
1120b57cec5SDimitry Andric /// The set of indices in MetadataPtrs above of forward references that were
1130b57cec5SDimitry Andric /// generated.
1140b57cec5SDimitry Andric SmallDenseSet<unsigned, 1> ForwardReference;
1150b57cec5SDimitry Andric
1160b57cec5SDimitry Andric /// The set of indices in MetadataPtrs above of Metadata that need to be
1170b57cec5SDimitry Andric /// resolved.
1180b57cec5SDimitry Andric SmallDenseSet<unsigned, 1> UnresolvedNodes;
1190b57cec5SDimitry Andric
1200b57cec5SDimitry Andric /// Structures for resolving old type refs.
1210b57cec5SDimitry Andric struct {
1220b57cec5SDimitry Andric SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
1230b57cec5SDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> Final;
1240b57cec5SDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
1250b57cec5SDimitry Andric SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
1260b57cec5SDimitry Andric } OldTypeRefs;
1270b57cec5SDimitry Andric
1280b57cec5SDimitry Andric LLVMContext &Context;
1290b57cec5SDimitry Andric
1300b57cec5SDimitry Andric /// Maximum number of valid references. Forward references exceeding the
1310b57cec5SDimitry Andric /// maximum must be invalid.
1320b57cec5SDimitry Andric unsigned RefsUpperBound;
1330b57cec5SDimitry Andric
1340b57cec5SDimitry Andric public:
BitcodeReaderMetadataList(LLVMContext & C,size_t RefsUpperBound)1350b57cec5SDimitry Andric BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
1360b57cec5SDimitry Andric : Context(C),
1370b57cec5SDimitry Andric RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
1380b57cec5SDimitry Andric RefsUpperBound)) {}
1390b57cec5SDimitry Andric
1400b57cec5SDimitry Andric // vector compatibility methods
size() const1410b57cec5SDimitry Andric unsigned size() const { return MetadataPtrs.size(); }
resize(unsigned N)1420b57cec5SDimitry Andric void resize(unsigned N) { MetadataPtrs.resize(N); }
push_back(Metadata * MD)1430b57cec5SDimitry Andric void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
clear()1440b57cec5SDimitry Andric void clear() { MetadataPtrs.clear(); }
back() const1450b57cec5SDimitry Andric Metadata *back() const { return MetadataPtrs.back(); }
pop_back()1460b57cec5SDimitry Andric void pop_back() { MetadataPtrs.pop_back(); }
empty() const1470b57cec5SDimitry Andric bool empty() const { return MetadataPtrs.empty(); }
1480b57cec5SDimitry Andric
operator [](unsigned i) const1490b57cec5SDimitry Andric Metadata *operator[](unsigned i) const {
1500b57cec5SDimitry Andric assert(i < MetadataPtrs.size());
1510b57cec5SDimitry Andric return MetadataPtrs[i];
1520b57cec5SDimitry Andric }
1530b57cec5SDimitry Andric
lookup(unsigned I) const1540b57cec5SDimitry Andric Metadata *lookup(unsigned I) const {
1550b57cec5SDimitry Andric if (I < MetadataPtrs.size())
1560b57cec5SDimitry Andric return MetadataPtrs[I];
1570b57cec5SDimitry Andric return nullptr;
1580b57cec5SDimitry Andric }
1590b57cec5SDimitry Andric
shrinkTo(unsigned N)1600b57cec5SDimitry Andric void shrinkTo(unsigned N) {
1610b57cec5SDimitry Andric assert(N <= size() && "Invalid shrinkTo request!");
1620b57cec5SDimitry Andric assert(ForwardReference.empty() && "Unexpected forward refs");
1630b57cec5SDimitry Andric assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
1640b57cec5SDimitry Andric MetadataPtrs.resize(N);
1650b57cec5SDimitry Andric }
1660b57cec5SDimitry Andric
1670b57cec5SDimitry Andric /// Return the given metadata, creating a replaceable forward reference if
1680b57cec5SDimitry Andric /// necessary.
1690b57cec5SDimitry Andric Metadata *getMetadataFwdRef(unsigned Idx);
1700b57cec5SDimitry Andric
1710b57cec5SDimitry Andric /// Return the given metadata only if it is fully resolved.
1720b57cec5SDimitry Andric ///
1730b57cec5SDimitry Andric /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
1740b57cec5SDimitry Andric /// would give \c false.
1750b57cec5SDimitry Andric Metadata *getMetadataIfResolved(unsigned Idx);
1760b57cec5SDimitry Andric
1770b57cec5SDimitry Andric MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
1780b57cec5SDimitry Andric void assignValue(Metadata *MD, unsigned Idx);
1790b57cec5SDimitry Andric void tryToResolveCycles();
hasFwdRefs() const1800b57cec5SDimitry Andric bool hasFwdRefs() const { return !ForwardReference.empty(); }
getNextFwdRef()1810b57cec5SDimitry Andric int getNextFwdRef() {
1820b57cec5SDimitry Andric assert(hasFwdRefs());
1830b57cec5SDimitry Andric return *ForwardReference.begin();
1840b57cec5SDimitry Andric }
1850b57cec5SDimitry Andric
1860b57cec5SDimitry Andric /// Upgrade a type that had an MDString reference.
1870b57cec5SDimitry Andric void addTypeRef(MDString &UUID, DICompositeType &CT);
1880b57cec5SDimitry Andric
1890b57cec5SDimitry Andric /// Upgrade a type that had an MDString reference.
1900b57cec5SDimitry Andric Metadata *upgradeTypeRef(Metadata *MaybeUUID);
1910b57cec5SDimitry Andric
1920b57cec5SDimitry Andric /// Upgrade a type ref array that may have MDString references.
1930b57cec5SDimitry Andric Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
1940b57cec5SDimitry Andric
1950b57cec5SDimitry Andric private:
1960b57cec5SDimitry Andric Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
1970b57cec5SDimitry Andric };
1980b57cec5SDimitry Andric
assignValue(Metadata * MD,unsigned Idx)1990b57cec5SDimitry Andric void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
2000b57cec5SDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD))
2010b57cec5SDimitry Andric if (!MDN->isResolved())
2020b57cec5SDimitry Andric UnresolvedNodes.insert(Idx);
2030b57cec5SDimitry Andric
2040b57cec5SDimitry Andric if (Idx == size()) {
2050b57cec5SDimitry Andric push_back(MD);
2060b57cec5SDimitry Andric return;
2070b57cec5SDimitry Andric }
2080b57cec5SDimitry Andric
2090b57cec5SDimitry Andric if (Idx >= size())
2100b57cec5SDimitry Andric resize(Idx + 1);
2110b57cec5SDimitry Andric
2120b57cec5SDimitry Andric TrackingMDRef &OldMD = MetadataPtrs[Idx];
2130b57cec5SDimitry Andric if (!OldMD) {
2140b57cec5SDimitry Andric OldMD.reset(MD);
2150b57cec5SDimitry Andric return;
2160b57cec5SDimitry Andric }
2170b57cec5SDimitry Andric
2180b57cec5SDimitry Andric // If there was a forward reference to this value, replace it.
2190b57cec5SDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
2200b57cec5SDimitry Andric PrevMD->replaceAllUsesWith(MD);
2210b57cec5SDimitry Andric ForwardReference.erase(Idx);
2220b57cec5SDimitry Andric }
2230b57cec5SDimitry Andric
getMetadataFwdRef(unsigned Idx)2240b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
2250b57cec5SDimitry Andric // Bail out for a clearly invalid value.
2260b57cec5SDimitry Andric if (Idx >= RefsUpperBound)
2270b57cec5SDimitry Andric return nullptr;
2280b57cec5SDimitry Andric
2290b57cec5SDimitry Andric if (Idx >= size())
2300b57cec5SDimitry Andric resize(Idx + 1);
2310b57cec5SDimitry Andric
2320b57cec5SDimitry Andric if (Metadata *MD = MetadataPtrs[Idx])
2330b57cec5SDimitry Andric return MD;
2340b57cec5SDimitry Andric
2350b57cec5SDimitry Andric // Track forward refs to be resolved later.
2360b57cec5SDimitry Andric ForwardReference.insert(Idx);
2370b57cec5SDimitry Andric
2380b57cec5SDimitry Andric // Create and return a placeholder, which will later be RAUW'd.
2390b57cec5SDimitry Andric ++NumMDNodeTemporary;
2400b57cec5SDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release();
2410b57cec5SDimitry Andric MetadataPtrs[Idx].reset(MD);
2420b57cec5SDimitry Andric return MD;
2430b57cec5SDimitry Andric }
2440b57cec5SDimitry Andric
getMetadataIfResolved(unsigned Idx)2450b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
2460b57cec5SDimitry Andric Metadata *MD = lookup(Idx);
2470b57cec5SDimitry Andric if (auto *N = dyn_cast_or_null<MDNode>(MD))
2480b57cec5SDimitry Andric if (!N->isResolved())
2490b57cec5SDimitry Andric return nullptr;
2500b57cec5SDimitry Andric return MD;
2510b57cec5SDimitry Andric }
2520b57cec5SDimitry Andric
getMDNodeFwdRefOrNull(unsigned Idx)2530b57cec5SDimitry Andric MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
2540b57cec5SDimitry Andric return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
2550b57cec5SDimitry Andric }
2560b57cec5SDimitry Andric
tryToResolveCycles()2570b57cec5SDimitry Andric void BitcodeReaderMetadataList::tryToResolveCycles() {
2580b57cec5SDimitry Andric if (!ForwardReference.empty())
2590b57cec5SDimitry Andric // Still forward references... can't resolve cycles.
2600b57cec5SDimitry Andric return;
2610b57cec5SDimitry Andric
2620b57cec5SDimitry Andric // Give up on finding a full definition for any forward decls that remain.
2630b57cec5SDimitry Andric for (const auto &Ref : OldTypeRefs.FwdDecls)
2640b57cec5SDimitry Andric OldTypeRefs.Final.insert(Ref);
2650b57cec5SDimitry Andric OldTypeRefs.FwdDecls.clear();
2660b57cec5SDimitry Andric
2670b57cec5SDimitry Andric // Upgrade from old type ref arrays. In strange cases, this could add to
2680b57cec5SDimitry Andric // OldTypeRefs.Unknown.
2690b57cec5SDimitry Andric for (const auto &Array : OldTypeRefs.Arrays)
2700b57cec5SDimitry Andric Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
2710b57cec5SDimitry Andric OldTypeRefs.Arrays.clear();
2720b57cec5SDimitry Andric
2730b57cec5SDimitry Andric // Replace old string-based type refs with the resolved node, if possible.
2740b57cec5SDimitry Andric // If we haven't seen the node, leave it to the verifier to complain about
2750b57cec5SDimitry Andric // the invalid string reference.
2760b57cec5SDimitry Andric for (const auto &Ref : OldTypeRefs.Unknown) {
2770b57cec5SDimitry Andric if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
2780b57cec5SDimitry Andric Ref.second->replaceAllUsesWith(CT);
2790b57cec5SDimitry Andric else
2800b57cec5SDimitry Andric Ref.second->replaceAllUsesWith(Ref.first);
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric OldTypeRefs.Unknown.clear();
2830b57cec5SDimitry Andric
2840b57cec5SDimitry Andric if (UnresolvedNodes.empty())
2850b57cec5SDimitry Andric // Nothing to do.
2860b57cec5SDimitry Andric return;
2870b57cec5SDimitry Andric
2880b57cec5SDimitry Andric // Resolve any cycles.
2890b57cec5SDimitry Andric for (unsigned I : UnresolvedNodes) {
2900b57cec5SDimitry Andric auto &MD = MetadataPtrs[I];
2910b57cec5SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD);
2920b57cec5SDimitry Andric if (!N)
2930b57cec5SDimitry Andric continue;
2940b57cec5SDimitry Andric
2950b57cec5SDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference");
2960b57cec5SDimitry Andric N->resolveCycles();
2970b57cec5SDimitry Andric }
2980b57cec5SDimitry Andric
2990b57cec5SDimitry Andric // Make sure we return early again until there's another unresolved ref.
3000b57cec5SDimitry Andric UnresolvedNodes.clear();
3010b57cec5SDimitry Andric }
3020b57cec5SDimitry Andric
addTypeRef(MDString & UUID,DICompositeType & CT)3030b57cec5SDimitry Andric void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
3040b57cec5SDimitry Andric DICompositeType &CT) {
3050b57cec5SDimitry Andric assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
3060b57cec5SDimitry Andric if (CT.isForwardDecl())
3070b57cec5SDimitry Andric OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
3080b57cec5SDimitry Andric else
3090b57cec5SDimitry Andric OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
3100b57cec5SDimitry Andric }
3110b57cec5SDimitry Andric
upgradeTypeRef(Metadata * MaybeUUID)3120b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
3130b57cec5SDimitry Andric auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
3140b57cec5SDimitry Andric if (LLVM_LIKELY(!UUID))
3150b57cec5SDimitry Andric return MaybeUUID;
3160b57cec5SDimitry Andric
3170b57cec5SDimitry Andric if (auto *CT = OldTypeRefs.Final.lookup(UUID))
3180b57cec5SDimitry Andric return CT;
3190b57cec5SDimitry Andric
3200b57cec5SDimitry Andric auto &Ref = OldTypeRefs.Unknown[UUID];
3210b57cec5SDimitry Andric if (!Ref)
3220b57cec5SDimitry Andric Ref = MDNode::getTemporary(Context, None);
3230b57cec5SDimitry Andric return Ref.get();
3240b57cec5SDimitry Andric }
3250b57cec5SDimitry Andric
upgradeTypeRefArray(Metadata * MaybeTuple)3260b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
3270b57cec5SDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
3280b57cec5SDimitry Andric if (!Tuple || Tuple->isDistinct())
3290b57cec5SDimitry Andric return MaybeTuple;
3300b57cec5SDimitry Andric
3310b57cec5SDimitry Andric // Look through the array immediately if possible.
3320b57cec5SDimitry Andric if (!Tuple->isTemporary())
3330b57cec5SDimitry Andric return resolveTypeRefArray(Tuple);
3340b57cec5SDimitry Andric
3350b57cec5SDimitry Andric // Create and return a placeholder to use for now. Eventually
3360b57cec5SDimitry Andric // resolveTypeRefArrays() will be resolve this forward reference.
3370b57cec5SDimitry Andric OldTypeRefs.Arrays.emplace_back(
3380b57cec5SDimitry Andric std::piecewise_construct, std::forward_as_tuple(Tuple),
3390b57cec5SDimitry Andric std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
3400b57cec5SDimitry Andric return OldTypeRefs.Arrays.back().second.get();
3410b57cec5SDimitry Andric }
3420b57cec5SDimitry Andric
resolveTypeRefArray(Metadata * MaybeTuple)3430b57cec5SDimitry Andric Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
3440b57cec5SDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
3450b57cec5SDimitry Andric if (!Tuple || Tuple->isDistinct())
3460b57cec5SDimitry Andric return MaybeTuple;
3470b57cec5SDimitry Andric
3480b57cec5SDimitry Andric // Look through the DITypeRefArray, upgrading each DIType *.
3490b57cec5SDimitry Andric SmallVector<Metadata *, 32> Ops;
3500b57cec5SDimitry Andric Ops.reserve(Tuple->getNumOperands());
3510b57cec5SDimitry Andric for (Metadata *MD : Tuple->operands())
3520b57cec5SDimitry Andric Ops.push_back(upgradeTypeRef(MD));
3530b57cec5SDimitry Andric
3540b57cec5SDimitry Andric return MDTuple::get(Context, Ops);
3550b57cec5SDimitry Andric }
3560b57cec5SDimitry Andric
3570b57cec5SDimitry Andric namespace {
3580b57cec5SDimitry Andric
3590b57cec5SDimitry Andric class PlaceholderQueue {
3600b57cec5SDimitry Andric // Placeholders would thrash around when moved, so store in a std::deque
3610b57cec5SDimitry Andric // instead of some sort of vector.
3620b57cec5SDimitry Andric std::deque<DistinctMDOperandPlaceholder> PHs;
3630b57cec5SDimitry Andric
3640b57cec5SDimitry Andric public:
~PlaceholderQueue()3650b57cec5SDimitry Andric ~PlaceholderQueue() {
3660b57cec5SDimitry Andric assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed");
3670b57cec5SDimitry Andric }
empty() const368af732203SDimitry Andric bool empty() const { return PHs.empty(); }
3690b57cec5SDimitry Andric DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
3700b57cec5SDimitry Andric void flush(BitcodeReaderMetadataList &MetadataList);
3710b57cec5SDimitry Andric
3720b57cec5SDimitry Andric /// Return the list of temporaries nodes in the queue, these need to be
3730b57cec5SDimitry Andric /// loaded before we can flush the queue.
getTemporaries(BitcodeReaderMetadataList & MetadataList,DenseSet<unsigned> & Temporaries)3740b57cec5SDimitry Andric void getTemporaries(BitcodeReaderMetadataList &MetadataList,
3750b57cec5SDimitry Andric DenseSet<unsigned> &Temporaries) {
3760b57cec5SDimitry Andric for (auto &PH : PHs) {
3770b57cec5SDimitry Andric auto ID = PH.getID();
3780b57cec5SDimitry Andric auto *MD = MetadataList.lookup(ID);
3790b57cec5SDimitry Andric if (!MD) {
3800b57cec5SDimitry Andric Temporaries.insert(ID);
3810b57cec5SDimitry Andric continue;
3820b57cec5SDimitry Andric }
3830b57cec5SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD);
3840b57cec5SDimitry Andric if (N && N->isTemporary())
3850b57cec5SDimitry Andric Temporaries.insert(ID);
3860b57cec5SDimitry Andric }
3870b57cec5SDimitry Andric }
3880b57cec5SDimitry Andric };
3890b57cec5SDimitry Andric
3900b57cec5SDimitry Andric } // end anonymous namespace
3910b57cec5SDimitry Andric
getPlaceholderOp(unsigned ID)3920b57cec5SDimitry Andric DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
3930b57cec5SDimitry Andric PHs.emplace_back(ID);
3940b57cec5SDimitry Andric return PHs.back();
3950b57cec5SDimitry Andric }
3960b57cec5SDimitry Andric
flush(BitcodeReaderMetadataList & MetadataList)3970b57cec5SDimitry Andric void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
3980b57cec5SDimitry Andric while (!PHs.empty()) {
3990b57cec5SDimitry Andric auto *MD = MetadataList.lookup(PHs.front().getID());
4000b57cec5SDimitry Andric assert(MD && "Flushing placeholder on unassigned MD");
4010b57cec5SDimitry Andric #ifndef NDEBUG
4020b57cec5SDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD))
4030b57cec5SDimitry Andric assert(MDN->isResolved() &&
4040b57cec5SDimitry Andric "Flushing Placeholder while cycles aren't resolved");
4050b57cec5SDimitry Andric #endif
4060b57cec5SDimitry Andric PHs.front().replaceUseWith(MD);
4070b57cec5SDimitry Andric PHs.pop_front();
4080b57cec5SDimitry Andric }
4090b57cec5SDimitry Andric }
4100b57cec5SDimitry Andric
411480093f4SDimitry Andric } // anonymous namespace
4120b57cec5SDimitry Andric
error(const Twine & Message)4130b57cec5SDimitry Andric static Error error(const Twine &Message) {
4140b57cec5SDimitry Andric return make_error<StringError>(
4150b57cec5SDimitry Andric Message, make_error_code(BitcodeError::CorruptedBitcode));
4160b57cec5SDimitry Andric }
4170b57cec5SDimitry Andric
4180b57cec5SDimitry Andric class MetadataLoader::MetadataLoaderImpl {
4190b57cec5SDimitry Andric BitcodeReaderMetadataList MetadataList;
4200b57cec5SDimitry Andric BitcodeReaderValueList &ValueList;
4210b57cec5SDimitry Andric BitstreamCursor &Stream;
4220b57cec5SDimitry Andric LLVMContext &Context;
4230b57cec5SDimitry Andric Module &TheModule;
4240b57cec5SDimitry Andric std::function<Type *(unsigned)> getTypeByID;
4250b57cec5SDimitry Andric
4260b57cec5SDimitry Andric /// Cursor associated with the lazy-loading of Metadata. This is the easy way
4270b57cec5SDimitry Andric /// to keep around the right "context" (Abbrev list) to be able to jump in
4280b57cec5SDimitry Andric /// the middle of the metadata block and load any record.
4290b57cec5SDimitry Andric BitstreamCursor IndexCursor;
4300b57cec5SDimitry Andric
4310b57cec5SDimitry Andric /// Index that keeps track of MDString values.
4320b57cec5SDimitry Andric std::vector<StringRef> MDStringRef;
4330b57cec5SDimitry Andric
4340b57cec5SDimitry Andric /// On-demand loading of a single MDString. Requires the index above to be
4350b57cec5SDimitry Andric /// populated.
4360b57cec5SDimitry Andric MDString *lazyLoadOneMDString(unsigned Idx);
4370b57cec5SDimitry Andric
4380b57cec5SDimitry Andric /// Index that keeps track of where to find a metadata record in the stream.
4390b57cec5SDimitry Andric std::vector<uint64_t> GlobalMetadataBitPosIndex;
4400b57cec5SDimitry Andric
441af732203SDimitry Andric /// Cursor position of the start of the global decl attachments, to enable
442af732203SDimitry Andric /// loading using the index built for lazy loading, instead of forward
443af732203SDimitry Andric /// references.
444af732203SDimitry Andric uint64_t GlobalDeclAttachmentPos = 0;
445af732203SDimitry Andric
446af732203SDimitry Andric #ifndef NDEBUG
447af732203SDimitry Andric /// Sanity check that we end up parsing all of the global decl attachments.
448af732203SDimitry Andric unsigned NumGlobalDeclAttachSkipped = 0;
449af732203SDimitry Andric unsigned NumGlobalDeclAttachParsed = 0;
450af732203SDimitry Andric #endif
451af732203SDimitry Andric
452af732203SDimitry Andric /// Load the global decl attachments, using the index built for lazy loading.
453af732203SDimitry Andric Expected<bool> loadGlobalDeclAttachments();
454af732203SDimitry Andric
4550b57cec5SDimitry Andric /// Populate the index above to enable lazily loading of metadata, and load
4560b57cec5SDimitry Andric /// the named metadata as well as the transitively referenced global
4570b57cec5SDimitry Andric /// Metadata.
4580b57cec5SDimitry Andric Expected<bool> lazyLoadModuleMetadataBlock();
4590b57cec5SDimitry Andric
4600b57cec5SDimitry Andric /// On-demand loading of a single metadata. Requires the index above to be
4610b57cec5SDimitry Andric /// populated.
4620b57cec5SDimitry Andric void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
4630b57cec5SDimitry Andric
4640b57cec5SDimitry Andric // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4650b57cec5SDimitry Andric // point from SP to CU after a block is completly parsed.
4660b57cec5SDimitry Andric std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4670b57cec5SDimitry Andric
4680b57cec5SDimitry Andric /// Functions that need to be matched with subprograms when upgrading old
4690b57cec5SDimitry Andric /// metadata.
4700b57cec5SDimitry Andric SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
4710b57cec5SDimitry Andric
4720b57cec5SDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
4730b57cec5SDimitry Andric DenseMap<unsigned, unsigned> MDKindMap;
4740b57cec5SDimitry Andric
4750b57cec5SDimitry Andric bool StripTBAA = false;
4760b57cec5SDimitry Andric bool HasSeenOldLoopTags = false;
4770b57cec5SDimitry Andric bool NeedUpgradeToDIGlobalVariableExpression = false;
4780b57cec5SDimitry Andric bool NeedDeclareExpressionUpgrade = false;
4790b57cec5SDimitry Andric
4800b57cec5SDimitry Andric /// True if metadata is being parsed for a module being ThinLTO imported.
4810b57cec5SDimitry Andric bool IsImporting = false;
4820b57cec5SDimitry Andric
4830b57cec5SDimitry Andric Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4840b57cec5SDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob,
4850b57cec5SDimitry Andric unsigned &NextMetadataNo);
4860b57cec5SDimitry Andric Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
4870b57cec5SDimitry Andric function_ref<void(StringRef)> CallBack);
4880b57cec5SDimitry Andric Error parseGlobalObjectAttachment(GlobalObject &GO,
4890b57cec5SDimitry Andric ArrayRef<uint64_t> Record);
4900b57cec5SDimitry Andric Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
4910b57cec5SDimitry Andric
4920b57cec5SDimitry Andric void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
4930b57cec5SDimitry Andric
4940b57cec5SDimitry Andric /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
upgradeCUSubprograms()4950b57cec5SDimitry Andric void upgradeCUSubprograms() {
4960b57cec5SDimitry Andric for (auto CU_SP : CUSubprograms)
4970b57cec5SDimitry Andric if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
4980b57cec5SDimitry Andric for (auto &Op : SPs->operands())
4990b57cec5SDimitry Andric if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
5000b57cec5SDimitry Andric SP->replaceUnit(CU_SP.first);
5010b57cec5SDimitry Andric CUSubprograms.clear();
5020b57cec5SDimitry Andric }
5030b57cec5SDimitry Andric
5040b57cec5SDimitry Andric /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
upgradeCUVariables()5050b57cec5SDimitry Andric void upgradeCUVariables() {
5060b57cec5SDimitry Andric if (!NeedUpgradeToDIGlobalVariableExpression)
5070b57cec5SDimitry Andric return;
5080b57cec5SDimitry Andric
5090b57cec5SDimitry Andric // Upgrade list of variables attached to the CUs.
5100b57cec5SDimitry Andric if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
5110b57cec5SDimitry Andric for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
5120b57cec5SDimitry Andric auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
5130b57cec5SDimitry Andric if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
5140b57cec5SDimitry Andric for (unsigned I = 0; I < GVs->getNumOperands(); I++)
5150b57cec5SDimitry Andric if (auto *GV =
5160b57cec5SDimitry Andric dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
5170b57cec5SDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct(
5180b57cec5SDimitry Andric Context, GV, DIExpression::get(Context, {}));
5190b57cec5SDimitry Andric GVs->replaceOperandWith(I, DGVE);
5200b57cec5SDimitry Andric }
5210b57cec5SDimitry Andric }
5220b57cec5SDimitry Andric
5230b57cec5SDimitry Andric // Upgrade variables attached to globals.
5240b57cec5SDimitry Andric for (auto &GV : TheModule.globals()) {
5250b57cec5SDimitry Andric SmallVector<MDNode *, 1> MDs;
5260b57cec5SDimitry Andric GV.getMetadata(LLVMContext::MD_dbg, MDs);
5270b57cec5SDimitry Andric GV.eraseMetadata(LLVMContext::MD_dbg);
5280b57cec5SDimitry Andric for (auto *MD : MDs)
5298bcb0991SDimitry Andric if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
5300b57cec5SDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct(
5310b57cec5SDimitry Andric Context, DGV, DIExpression::get(Context, {}));
5320b57cec5SDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
5330b57cec5SDimitry Andric } else
5340b57cec5SDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *MD);
5350b57cec5SDimitry Andric }
5360b57cec5SDimitry Andric }
5370b57cec5SDimitry Andric
5380b57cec5SDimitry Andric /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5390b57cec5SDimitry Andric /// describes a function argument.
upgradeDeclareExpressions(Function & F)5400b57cec5SDimitry Andric void upgradeDeclareExpressions(Function &F) {
5410b57cec5SDimitry Andric if (!NeedDeclareExpressionUpgrade)
5420b57cec5SDimitry Andric return;
5430b57cec5SDimitry Andric
5440b57cec5SDimitry Andric for (auto &BB : F)
5450b57cec5SDimitry Andric for (auto &I : BB)
5460b57cec5SDimitry Andric if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5470b57cec5SDimitry Andric if (auto *DIExpr = DDI->getExpression())
5480b57cec5SDimitry Andric if (DIExpr->startsWithDeref() &&
5490b57cec5SDimitry Andric dyn_cast_or_null<Argument>(DDI->getAddress())) {
5500b57cec5SDimitry Andric SmallVector<uint64_t, 8> Ops;
5510b57cec5SDimitry Andric Ops.append(std::next(DIExpr->elements_begin()),
5520b57cec5SDimitry Andric DIExpr->elements_end());
553*5f7ddb14SDimitry Andric DDI->setExpression(DIExpression::get(Context, Ops));
5540b57cec5SDimitry Andric }
5550b57cec5SDimitry Andric }
5560b57cec5SDimitry Andric
5570b57cec5SDimitry Andric /// Upgrade the expression from previous versions.
upgradeDIExpression(uint64_t FromVersion,MutableArrayRef<uint64_t> & Expr,SmallVectorImpl<uint64_t> & Buffer)5580b57cec5SDimitry Andric Error upgradeDIExpression(uint64_t FromVersion,
5590b57cec5SDimitry Andric MutableArrayRef<uint64_t> &Expr,
5600b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Buffer) {
5610b57cec5SDimitry Andric auto N = Expr.size();
5620b57cec5SDimitry Andric switch (FromVersion) {
5630b57cec5SDimitry Andric default:
5640b57cec5SDimitry Andric return error("Invalid record");
5650b57cec5SDimitry Andric case 0:
5660b57cec5SDimitry Andric if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
5670b57cec5SDimitry Andric Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
5680b57cec5SDimitry Andric LLVM_FALLTHROUGH;
5690b57cec5SDimitry Andric case 1:
5700b57cec5SDimitry Andric // Move DW_OP_deref to the end.
5710b57cec5SDimitry Andric if (N && Expr[0] == dwarf::DW_OP_deref) {
5720b57cec5SDimitry Andric auto End = Expr.end();
5730b57cec5SDimitry Andric if (Expr.size() >= 3 &&
5740b57cec5SDimitry Andric *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
5750b57cec5SDimitry Andric End = std::prev(End, 3);
5760b57cec5SDimitry Andric std::move(std::next(Expr.begin()), End, Expr.begin());
5770b57cec5SDimitry Andric *std::prev(End) = dwarf::DW_OP_deref;
5780b57cec5SDimitry Andric }
5790b57cec5SDimitry Andric NeedDeclareExpressionUpgrade = true;
5800b57cec5SDimitry Andric LLVM_FALLTHROUGH;
5810b57cec5SDimitry Andric case 2: {
5820b57cec5SDimitry Andric // Change DW_OP_plus to DW_OP_plus_uconst.
5830b57cec5SDimitry Andric // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
5840b57cec5SDimitry Andric auto SubExpr = ArrayRef<uint64_t>(Expr);
5850b57cec5SDimitry Andric while (!SubExpr.empty()) {
5860b57cec5SDimitry Andric // Skip past other operators with their operands
5870b57cec5SDimitry Andric // for this version of the IR, obtained from
5880b57cec5SDimitry Andric // from historic DIExpression::ExprOperand::getSize().
5890b57cec5SDimitry Andric size_t HistoricSize;
5900b57cec5SDimitry Andric switch (SubExpr.front()) {
5910b57cec5SDimitry Andric default:
5920b57cec5SDimitry Andric HistoricSize = 1;
5930b57cec5SDimitry Andric break;
5940b57cec5SDimitry Andric case dwarf::DW_OP_constu:
5950b57cec5SDimitry Andric case dwarf::DW_OP_minus:
5960b57cec5SDimitry Andric case dwarf::DW_OP_plus:
5970b57cec5SDimitry Andric HistoricSize = 2;
5980b57cec5SDimitry Andric break;
5990b57cec5SDimitry Andric case dwarf::DW_OP_LLVM_fragment:
6000b57cec5SDimitry Andric HistoricSize = 3;
6010b57cec5SDimitry Andric break;
6020b57cec5SDimitry Andric }
6030b57cec5SDimitry Andric
6040b57cec5SDimitry Andric // If the expression is malformed, make sure we don't
6050b57cec5SDimitry Andric // copy more elements than we should.
6060b57cec5SDimitry Andric HistoricSize = std::min(SubExpr.size(), HistoricSize);
6070b57cec5SDimitry Andric ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1);
6080b57cec5SDimitry Andric
6090b57cec5SDimitry Andric switch (SubExpr.front()) {
6100b57cec5SDimitry Andric case dwarf::DW_OP_plus:
6110b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_plus_uconst);
6120b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end());
6130b57cec5SDimitry Andric break;
6140b57cec5SDimitry Andric case dwarf::DW_OP_minus:
6150b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_constu);
6160b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end());
6170b57cec5SDimitry Andric Buffer.push_back(dwarf::DW_OP_minus);
6180b57cec5SDimitry Andric break;
6190b57cec5SDimitry Andric default:
6200b57cec5SDimitry Andric Buffer.push_back(*SubExpr.begin());
6210b57cec5SDimitry Andric Buffer.append(Args.begin(), Args.end());
6220b57cec5SDimitry Andric break;
6230b57cec5SDimitry Andric }
6240b57cec5SDimitry Andric
6250b57cec5SDimitry Andric // Continue with remaining elements.
6260b57cec5SDimitry Andric SubExpr = SubExpr.slice(HistoricSize);
6270b57cec5SDimitry Andric }
6280b57cec5SDimitry Andric Expr = MutableArrayRef<uint64_t>(Buffer);
6290b57cec5SDimitry Andric LLVM_FALLTHROUGH;
6300b57cec5SDimitry Andric }
6310b57cec5SDimitry Andric case 3:
6320b57cec5SDimitry Andric // Up-to-date!
6330b57cec5SDimitry Andric break;
6340b57cec5SDimitry Andric }
6350b57cec5SDimitry Andric
6360b57cec5SDimitry Andric return Error::success();
6370b57cec5SDimitry Andric }
6380b57cec5SDimitry Andric
upgradeDebugInfo()6390b57cec5SDimitry Andric void upgradeDebugInfo() {
6400b57cec5SDimitry Andric upgradeCUSubprograms();
6410b57cec5SDimitry Andric upgradeCUVariables();
6420b57cec5SDimitry Andric }
6430b57cec5SDimitry Andric
6440b57cec5SDimitry Andric public:
MetadataLoaderImpl(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,std::function<Type * (unsigned)> getTypeByID,bool IsImporting)6450b57cec5SDimitry Andric MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
6460b57cec5SDimitry Andric BitcodeReaderValueList &ValueList,
6470b57cec5SDimitry Andric std::function<Type *(unsigned)> getTypeByID,
6480b57cec5SDimitry Andric bool IsImporting)
6490b57cec5SDimitry Andric : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
6500b57cec5SDimitry Andric ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
6510b57cec5SDimitry Andric TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
6520b57cec5SDimitry Andric IsImporting(IsImporting) {}
6530b57cec5SDimitry Andric
6540b57cec5SDimitry Andric Error parseMetadata(bool ModuleLevel);
6550b57cec5SDimitry Andric
hasFwdRefs() const6560b57cec5SDimitry Andric bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6570b57cec5SDimitry Andric
getMetadataFwdRefOrLoad(unsigned ID)6580b57cec5SDimitry Andric Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6590b57cec5SDimitry Andric if (ID < MDStringRef.size())
6600b57cec5SDimitry Andric return lazyLoadOneMDString(ID);
6610b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID))
6620b57cec5SDimitry Andric return MD;
6630b57cec5SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand
6640b57cec5SDimitry Andric // instead of creating a temporary.
6650b57cec5SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6660b57cec5SDimitry Andric PlaceholderQueue Placeholders;
6670b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
6680b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
6690b57cec5SDimitry Andric return MetadataList.lookup(ID);
6700b57cec5SDimitry Andric }
6710b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID);
6720b57cec5SDimitry Andric }
6730b57cec5SDimitry Andric
lookupSubprogramForFunction(Function * F)6740b57cec5SDimitry Andric DISubprogram *lookupSubprogramForFunction(Function *F) {
6750b57cec5SDimitry Andric return FunctionsWithSPs.lookup(F);
6760b57cec5SDimitry Andric }
6770b57cec5SDimitry Andric
hasSeenOldLoopTags() const678af732203SDimitry Andric bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
6790b57cec5SDimitry Andric
6800b57cec5SDimitry Andric Error parseMetadataAttachment(
6810b57cec5SDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
6820b57cec5SDimitry Andric
6830b57cec5SDimitry Andric Error parseMetadataKinds();
6840b57cec5SDimitry Andric
setStripTBAA(bool Value)6850b57cec5SDimitry Andric void setStripTBAA(bool Value) { StripTBAA = Value; }
isStrippingTBAA() const686af732203SDimitry Andric bool isStrippingTBAA() const { return StripTBAA; }
6870b57cec5SDimitry Andric
size() const6880b57cec5SDimitry Andric unsigned size() const { return MetadataList.size(); }
shrinkTo(unsigned N)6890b57cec5SDimitry Andric void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
upgradeDebugIntrinsics(Function & F)6900b57cec5SDimitry Andric void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
6910b57cec5SDimitry Andric };
6920b57cec5SDimitry Andric
6930b57cec5SDimitry Andric Expected<bool>
lazyLoadModuleMetadataBlock()6940b57cec5SDimitry Andric MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
6950b57cec5SDimitry Andric IndexCursor = Stream;
6960b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record;
697af732203SDimitry Andric GlobalDeclAttachmentPos = 0;
6980b57cec5SDimitry Andric // Get the abbrevs, and preload record positions to make them lazy-loadable.
6990b57cec5SDimitry Andric while (true) {
700af732203SDimitry Andric uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
7010b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks(
7020b57cec5SDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd);
7030b57cec5SDimitry Andric if (!MaybeEntry)
7040b57cec5SDimitry Andric return MaybeEntry.takeError();
7050b57cec5SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
7060b57cec5SDimitry Andric
7070b57cec5SDimitry Andric switch (Entry.Kind) {
7080b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
7090b57cec5SDimitry Andric case BitstreamEntry::Error:
7100b57cec5SDimitry Andric return error("Malformed block");
7110b57cec5SDimitry Andric case BitstreamEntry::EndBlock: {
7120b57cec5SDimitry Andric return true;
7130b57cec5SDimitry Andric }
7140b57cec5SDimitry Andric case BitstreamEntry::Record: {
7150b57cec5SDimitry Andric // The interesting case.
7160b57cec5SDimitry Andric ++NumMDRecordLoaded;
7170b57cec5SDimitry Andric uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
7180b57cec5SDimitry Andric Expected<unsigned> MaybeCode = IndexCursor.skipRecord(Entry.ID);
7190b57cec5SDimitry Andric if (!MaybeCode)
7200b57cec5SDimitry Andric return MaybeCode.takeError();
7210b57cec5SDimitry Andric unsigned Code = MaybeCode.get();
7220b57cec5SDimitry Andric switch (Code) {
7230b57cec5SDimitry Andric case bitc::METADATA_STRINGS: {
7240b57cec5SDimitry Andric // Rewind and parse the strings.
7250b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos))
7260b57cec5SDimitry Andric return std::move(Err);
7270b57cec5SDimitry Andric StringRef Blob;
7280b57cec5SDimitry Andric Record.clear();
7290b57cec5SDimitry Andric if (Expected<unsigned> MaybeRecord =
7300b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record, &Blob))
7310b57cec5SDimitry Andric ;
7320b57cec5SDimitry Andric else
7330b57cec5SDimitry Andric return MaybeRecord.takeError();
7340b57cec5SDimitry Andric unsigned NumStrings = Record[0];
7350b57cec5SDimitry Andric MDStringRef.reserve(NumStrings);
7360b57cec5SDimitry Andric auto IndexNextMDString = [&](StringRef Str) {
7370b57cec5SDimitry Andric MDStringRef.push_back(Str);
7380b57cec5SDimitry Andric };
7390b57cec5SDimitry Andric if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
7400b57cec5SDimitry Andric return std::move(Err);
7410b57cec5SDimitry Andric break;
7420b57cec5SDimitry Andric }
7430b57cec5SDimitry Andric case bitc::METADATA_INDEX_OFFSET: {
7440b57cec5SDimitry Andric // This is the offset to the index, when we see this we skip all the
7450b57cec5SDimitry Andric // records and load only an index to these.
7460b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos))
7470b57cec5SDimitry Andric return std::move(Err);
7480b57cec5SDimitry Andric Record.clear();
7490b57cec5SDimitry Andric if (Expected<unsigned> MaybeRecord =
7500b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record))
7510b57cec5SDimitry Andric ;
7520b57cec5SDimitry Andric else
7530b57cec5SDimitry Andric return MaybeRecord.takeError();
7540b57cec5SDimitry Andric if (Record.size() != 2)
7550b57cec5SDimitry Andric return error("Invalid record");
7560b57cec5SDimitry Andric auto Offset = Record[0] + (Record[1] << 32);
7570b57cec5SDimitry Andric auto BeginPos = IndexCursor.GetCurrentBitNo();
7580b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
7590b57cec5SDimitry Andric return std::move(Err);
7600b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry =
7610b57cec5SDimitry Andric IndexCursor.advanceSkippingSubblocks(
7620b57cec5SDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd);
7630b57cec5SDimitry Andric if (!MaybeEntry)
7640b57cec5SDimitry Andric return MaybeEntry.takeError();
7650b57cec5SDimitry Andric Entry = MaybeEntry.get();
7660b57cec5SDimitry Andric assert(Entry.Kind == BitstreamEntry::Record &&
7670b57cec5SDimitry Andric "Corrupted bitcode: Expected `Record` when trying to find the "
7680b57cec5SDimitry Andric "Metadata index");
7690b57cec5SDimitry Andric Record.clear();
7700b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode =
7710b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record))
7720b57cec5SDimitry Andric assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7730b57cec5SDimitry Andric "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7740b57cec5SDimitry Andric "find the Metadata index");
7750b57cec5SDimitry Andric else
7760b57cec5SDimitry Andric return MaybeCode.takeError();
7770b57cec5SDimitry Andric // Delta unpack
7780b57cec5SDimitry Andric auto CurrentValue = BeginPos;
7790b57cec5SDimitry Andric GlobalMetadataBitPosIndex.reserve(Record.size());
7800b57cec5SDimitry Andric for (auto &Elt : Record) {
7810b57cec5SDimitry Andric CurrentValue += Elt;
7820b57cec5SDimitry Andric GlobalMetadataBitPosIndex.push_back(CurrentValue);
7830b57cec5SDimitry Andric }
7840b57cec5SDimitry Andric break;
7850b57cec5SDimitry Andric }
7860b57cec5SDimitry Andric case bitc::METADATA_INDEX:
7870b57cec5SDimitry Andric // We don't expect to get there, the Index is loaded when we encounter
7880b57cec5SDimitry Andric // the offset.
7890b57cec5SDimitry Andric return error("Corrupted Metadata block");
7900b57cec5SDimitry Andric case bitc::METADATA_NAME: {
7910b57cec5SDimitry Andric // Named metadata need to be materialized now and aren't deferred.
7920b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(CurrentPos))
7930b57cec5SDimitry Andric return std::move(Err);
7940b57cec5SDimitry Andric Record.clear();
7950b57cec5SDimitry Andric
7960b57cec5SDimitry Andric unsigned Code;
7970b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode =
7980b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record)) {
7990b57cec5SDimitry Andric Code = MaybeCode.get();
8000b57cec5SDimitry Andric assert(Code == bitc::METADATA_NAME);
8010b57cec5SDimitry Andric } else
8020b57cec5SDimitry Andric return MaybeCode.takeError();
8030b57cec5SDimitry Andric
8040b57cec5SDimitry Andric // Read name of the named metadata.
8050b57cec5SDimitry Andric SmallString<8> Name(Record.begin(), Record.end());
8060b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
8070b57cec5SDimitry Andric Code = MaybeCode.get();
8080b57cec5SDimitry Andric else
8090b57cec5SDimitry Andric return MaybeCode.takeError();
8100b57cec5SDimitry Andric
8110b57cec5SDimitry Andric // Named Metadata comes in two parts, we expect the name to be followed
8120b57cec5SDimitry Andric // by the node
8130b57cec5SDimitry Andric Record.clear();
8140b57cec5SDimitry Andric if (Expected<unsigned> MaybeNextBitCode =
8150b57cec5SDimitry Andric IndexCursor.readRecord(Code, Record))
8160b57cec5SDimitry Andric assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8170b57cec5SDimitry Andric else
8180b57cec5SDimitry Andric return MaybeNextBitCode.takeError();
8190b57cec5SDimitry Andric
8200b57cec5SDimitry Andric // Read named metadata elements.
8210b57cec5SDimitry Andric unsigned Size = Record.size();
8220b57cec5SDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
8230b57cec5SDimitry Andric for (unsigned i = 0; i != Size; ++i) {
8240b57cec5SDimitry Andric // FIXME: We could use a placeholder here, however NamedMDNode are
8250b57cec5SDimitry Andric // taking MDNode as operand and not using the Metadata infrastructure.
8260b57cec5SDimitry Andric // It is acknowledged by 'TODO: Inherit from Metadata' in the
8270b57cec5SDimitry Andric // NamedMDNode class definition.
8280b57cec5SDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
8290b57cec5SDimitry Andric assert(MD && "Invalid metadata: expect fwd ref to MDNode");
8300b57cec5SDimitry Andric NMD->addOperand(MD);
8310b57cec5SDimitry Andric }
8320b57cec5SDimitry Andric break;
8330b57cec5SDimitry Andric }
8340b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
835af732203SDimitry Andric if (!GlobalDeclAttachmentPos)
836af732203SDimitry Andric GlobalDeclAttachmentPos = SavedPos;
837af732203SDimitry Andric #ifndef NDEBUG
838af732203SDimitry Andric NumGlobalDeclAttachSkipped++;
839af732203SDimitry Andric #endif
8400b57cec5SDimitry Andric break;
8410b57cec5SDimitry Andric }
8420b57cec5SDimitry Andric case bitc::METADATA_KIND:
8430b57cec5SDimitry Andric case bitc::METADATA_STRING_OLD:
8440b57cec5SDimitry Andric case bitc::METADATA_OLD_FN_NODE:
8450b57cec5SDimitry Andric case bitc::METADATA_OLD_NODE:
8460b57cec5SDimitry Andric case bitc::METADATA_VALUE:
8470b57cec5SDimitry Andric case bitc::METADATA_DISTINCT_NODE:
8480b57cec5SDimitry Andric case bitc::METADATA_NODE:
8490b57cec5SDimitry Andric case bitc::METADATA_LOCATION:
8500b57cec5SDimitry Andric case bitc::METADATA_GENERIC_DEBUG:
8510b57cec5SDimitry Andric case bitc::METADATA_SUBRANGE:
8520b57cec5SDimitry Andric case bitc::METADATA_ENUMERATOR:
8530b57cec5SDimitry Andric case bitc::METADATA_BASIC_TYPE:
854af732203SDimitry Andric case bitc::METADATA_STRING_TYPE:
8550b57cec5SDimitry Andric case bitc::METADATA_DERIVED_TYPE:
8560b57cec5SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE:
8570b57cec5SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE:
8580b57cec5SDimitry Andric case bitc::METADATA_MODULE:
8590b57cec5SDimitry Andric case bitc::METADATA_FILE:
8600b57cec5SDimitry Andric case bitc::METADATA_COMPILE_UNIT:
8610b57cec5SDimitry Andric case bitc::METADATA_SUBPROGRAM:
8620b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK:
8630b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE:
8640b57cec5SDimitry Andric case bitc::METADATA_NAMESPACE:
8650b57cec5SDimitry Andric case bitc::METADATA_COMMON_BLOCK:
8660b57cec5SDimitry Andric case bitc::METADATA_MACRO:
8670b57cec5SDimitry Andric case bitc::METADATA_MACRO_FILE:
8680b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE:
8690b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE:
8700b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR:
8710b57cec5SDimitry Andric case bitc::METADATA_LOCAL_VAR:
8720b57cec5SDimitry Andric case bitc::METADATA_LABEL:
8730b57cec5SDimitry Andric case bitc::METADATA_EXPRESSION:
8740b57cec5SDimitry Andric case bitc::METADATA_OBJC_PROPERTY:
8750b57cec5SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY:
8760b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR:
877af732203SDimitry Andric case bitc::METADATA_GENERIC_SUBRANGE:
8780b57cec5SDimitry Andric // We don't expect to see any of these, if we see one, give up on
8790b57cec5SDimitry Andric // lazy-loading and fallback.
8800b57cec5SDimitry Andric MDStringRef.clear();
8810b57cec5SDimitry Andric GlobalMetadataBitPosIndex.clear();
8820b57cec5SDimitry Andric return false;
8830b57cec5SDimitry Andric }
8840b57cec5SDimitry Andric break;
8850b57cec5SDimitry Andric }
8860b57cec5SDimitry Andric }
8870b57cec5SDimitry Andric }
8880b57cec5SDimitry Andric }
8890b57cec5SDimitry Andric
890af732203SDimitry Andric // Load the global decl attachments after building the lazy loading index.
891af732203SDimitry Andric // We don't load them "lazily" - all global decl attachments must be
892af732203SDimitry Andric // parsed since they aren't materialized on demand. However, by delaying
893af732203SDimitry Andric // their parsing until after the index is created, we can use the index
894af732203SDimitry Andric // instead of creating temporaries.
loadGlobalDeclAttachments()895af732203SDimitry Andric Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
896af732203SDimitry Andric // Nothing to do if we didn't find any of these metadata records.
897af732203SDimitry Andric if (!GlobalDeclAttachmentPos)
898af732203SDimitry Andric return true;
899af732203SDimitry Andric // Use a temporary cursor so that we don't mess up the main Stream cursor or
900af732203SDimitry Andric // the lazy loading IndexCursor (which holds the necessary abbrev ids).
901af732203SDimitry Andric BitstreamCursor TempCursor = Stream;
902af732203SDimitry Andric SmallVector<uint64_t, 64> Record;
903af732203SDimitry Andric // Jump to the position before the first global decl attachment, so we can
904af732203SDimitry Andric // scan for the first BitstreamEntry record.
905af732203SDimitry Andric if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
906af732203SDimitry Andric return std::move(Err);
907af732203SDimitry Andric while (true) {
908af732203SDimitry Andric Expected<BitstreamEntry> MaybeEntry = TempCursor.advanceSkippingSubblocks(
909af732203SDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd);
910af732203SDimitry Andric if (!MaybeEntry)
911af732203SDimitry Andric return MaybeEntry.takeError();
912af732203SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
913af732203SDimitry Andric
914af732203SDimitry Andric switch (Entry.Kind) {
915af732203SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
916af732203SDimitry Andric case BitstreamEntry::Error:
917af732203SDimitry Andric return error("Malformed block");
918af732203SDimitry Andric case BitstreamEntry::EndBlock:
919af732203SDimitry Andric // Sanity check that we parsed them all.
920af732203SDimitry Andric assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
921af732203SDimitry Andric return true;
922af732203SDimitry Andric case BitstreamEntry::Record:
923af732203SDimitry Andric break;
924af732203SDimitry Andric }
925af732203SDimitry Andric uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
926af732203SDimitry Andric Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
927af732203SDimitry Andric if (!MaybeCode)
928af732203SDimitry Andric return MaybeCode.takeError();
929af732203SDimitry Andric if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
930af732203SDimitry Andric // Anything other than a global decl attachment signals the end of
931af732203SDimitry Andric // these records. sanity check that we parsed them all.
932af732203SDimitry Andric assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
933af732203SDimitry Andric return true;
934af732203SDimitry Andric }
935af732203SDimitry Andric #ifndef NDEBUG
936af732203SDimitry Andric NumGlobalDeclAttachParsed++;
937af732203SDimitry Andric #endif
938af732203SDimitry Andric // FIXME: we need to do this early because we don't materialize global
939af732203SDimitry Andric // value explicitly.
940af732203SDimitry Andric if (Error Err = TempCursor.JumpToBit(CurrentPos))
941af732203SDimitry Andric return std::move(Err);
942af732203SDimitry Andric Record.clear();
943af732203SDimitry Andric if (Expected<unsigned> MaybeRecord =
944af732203SDimitry Andric TempCursor.readRecord(Entry.ID, Record))
945af732203SDimitry Andric ;
946af732203SDimitry Andric else
947af732203SDimitry Andric return MaybeRecord.takeError();
948af732203SDimitry Andric if (Record.size() % 2 == 0)
949af732203SDimitry Andric return error("Invalid record");
950af732203SDimitry Andric unsigned ValueID = Record[0];
951af732203SDimitry Andric if (ValueID >= ValueList.size())
952af732203SDimitry Andric return error("Invalid record");
953af732203SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
954af732203SDimitry Andric // Need to save and restore the current position since
955af732203SDimitry Andric // parseGlobalObjectAttachment will resolve all forward references which
956af732203SDimitry Andric // would require parsing from locations stored in the index.
957af732203SDimitry Andric CurrentPos = TempCursor.GetCurrentBitNo();
958af732203SDimitry Andric if (Error Err = parseGlobalObjectAttachment(
959af732203SDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1)))
960af732203SDimitry Andric return std::move(Err);
961af732203SDimitry Andric if (Error Err = TempCursor.JumpToBit(CurrentPos))
962af732203SDimitry Andric return std::move(Err);
963af732203SDimitry Andric }
964af732203SDimitry Andric }
965af732203SDimitry Andric }
966af732203SDimitry Andric
9670b57cec5SDimitry Andric /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
9680b57cec5SDimitry Andric /// module level metadata.
parseMetadata(bool ModuleLevel)9690b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
9700b57cec5SDimitry Andric if (!ModuleLevel && MetadataList.hasFwdRefs())
9710b57cec5SDimitry Andric return error("Invalid metadata: fwd refs into function blocks");
9720b57cec5SDimitry Andric
9730b57cec5SDimitry Andric // Record the entry position so that we can jump back here and efficiently
9740b57cec5SDimitry Andric // skip the whole block in case we lazy-load.
9750b57cec5SDimitry Andric auto EntryPos = Stream.GetCurrentBitNo();
9760b57cec5SDimitry Andric
9770b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9780b57cec5SDimitry Andric return Err;
9790b57cec5SDimitry Andric
9800b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record;
9810b57cec5SDimitry Andric PlaceholderQueue Placeholders;
9820b57cec5SDimitry Andric
9830b57cec5SDimitry Andric // We lazy-load module-level metadata: we build an index for each record, and
9840b57cec5SDimitry Andric // then load individual record as needed, starting with the named metadata.
9850b57cec5SDimitry Andric if (ModuleLevel && IsImporting && MetadataList.empty() &&
9860b57cec5SDimitry Andric !DisableLazyLoading) {
9870b57cec5SDimitry Andric auto SuccessOrErr = lazyLoadModuleMetadataBlock();
9880b57cec5SDimitry Andric if (!SuccessOrErr)
9890b57cec5SDimitry Andric return SuccessOrErr.takeError();
9900b57cec5SDimitry Andric if (SuccessOrErr.get()) {
9910b57cec5SDimitry Andric // An index was successfully created and we will be able to load metadata
9920b57cec5SDimitry Andric // on-demand.
9930b57cec5SDimitry Andric MetadataList.resize(MDStringRef.size() +
9940b57cec5SDimitry Andric GlobalMetadataBitPosIndex.size());
9950b57cec5SDimitry Andric
996af732203SDimitry Andric // Now that we have built the index, load the global decl attachments
997af732203SDimitry Andric // that were deferred during that process. This avoids creating
998af732203SDimitry Andric // temporaries.
999af732203SDimitry Andric SuccessOrErr = loadGlobalDeclAttachments();
1000af732203SDimitry Andric if (!SuccessOrErr)
1001af732203SDimitry Andric return SuccessOrErr.takeError();
1002af732203SDimitry Andric assert(SuccessOrErr.get());
1003af732203SDimitry Andric
10040b57cec5SDimitry Andric // Reading the named metadata created forward references and/or
10050b57cec5SDimitry Andric // placeholders, that we flush here.
10060b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
10070b57cec5SDimitry Andric upgradeDebugInfo();
10080b57cec5SDimitry Andric // Return at the beginning of the block, since it is easy to skip it
10090b57cec5SDimitry Andric // entirely from there.
10100b57cec5SDimitry Andric Stream.ReadBlockEnd(); // Pop the abbrev block context.
10110b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(EntryPos))
10120b57cec5SDimitry Andric return Err;
10130b57cec5SDimitry Andric if (Error Err = Stream.SkipBlock()) {
10140b57cec5SDimitry Andric // FIXME this drops the error on the floor, which
10150b57cec5SDimitry Andric // ThinLTO/X86/debuginfo-cu-import.ll relies on.
10160b57cec5SDimitry Andric consumeError(std::move(Err));
10170b57cec5SDimitry Andric return Error::success();
10180b57cec5SDimitry Andric }
10190b57cec5SDimitry Andric return Error::success();
10200b57cec5SDimitry Andric }
10210b57cec5SDimitry Andric // Couldn't load an index, fallback to loading all the block "old-style".
10220b57cec5SDimitry Andric }
10230b57cec5SDimitry Andric
10240b57cec5SDimitry Andric unsigned NextMetadataNo = MetadataList.size();
10250b57cec5SDimitry Andric
10260b57cec5SDimitry Andric // Read all the records.
10270b57cec5SDimitry Andric while (true) {
10280b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
10290b57cec5SDimitry Andric if (!MaybeEntry)
10300b57cec5SDimitry Andric return MaybeEntry.takeError();
10310b57cec5SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
10320b57cec5SDimitry Andric
10330b57cec5SDimitry Andric switch (Entry.Kind) {
10340b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
10350b57cec5SDimitry Andric case BitstreamEntry::Error:
10360b57cec5SDimitry Andric return error("Malformed block");
10370b57cec5SDimitry Andric case BitstreamEntry::EndBlock:
10380b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
10390b57cec5SDimitry Andric upgradeDebugInfo();
10400b57cec5SDimitry Andric return Error::success();
10410b57cec5SDimitry Andric case BitstreamEntry::Record:
10420b57cec5SDimitry Andric // The interesting case.
10430b57cec5SDimitry Andric break;
10440b57cec5SDimitry Andric }
10450b57cec5SDimitry Andric
10460b57cec5SDimitry Andric // Read a record.
10470b57cec5SDimitry Andric Record.clear();
10480b57cec5SDimitry Andric StringRef Blob;
10490b57cec5SDimitry Andric ++NumMDRecordLoaded;
10500b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode =
10510b57cec5SDimitry Andric Stream.readRecord(Entry.ID, Record, &Blob)) {
10520b57cec5SDimitry Andric if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
10530b57cec5SDimitry Andric Blob, NextMetadataNo))
10540b57cec5SDimitry Andric return Err;
10550b57cec5SDimitry Andric } else
10560b57cec5SDimitry Andric return MaybeCode.takeError();
10570b57cec5SDimitry Andric }
10580b57cec5SDimitry Andric }
10590b57cec5SDimitry Andric
lazyLoadOneMDString(unsigned ID)10600b57cec5SDimitry Andric MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
10610b57cec5SDimitry Andric ++NumMDStringLoaded;
10620b57cec5SDimitry Andric if (Metadata *MD = MetadataList.lookup(ID))
10630b57cec5SDimitry Andric return cast<MDString>(MD);
10640b57cec5SDimitry Andric auto MDS = MDString::get(Context, MDStringRef[ID]);
10650b57cec5SDimitry Andric MetadataList.assignValue(MDS, ID);
10660b57cec5SDimitry Andric return MDS;
10670b57cec5SDimitry Andric }
10680b57cec5SDimitry Andric
lazyLoadOneMetadata(unsigned ID,PlaceholderQueue & Placeholders)10690b57cec5SDimitry Andric void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
10700b57cec5SDimitry Andric unsigned ID, PlaceholderQueue &Placeholders) {
10710b57cec5SDimitry Andric assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
10720b57cec5SDimitry Andric assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
10730b57cec5SDimitry Andric // Lookup first if the metadata hasn't already been loaded.
10740b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID)) {
10758bcb0991SDimitry Andric auto *N = cast<MDNode>(MD);
10760b57cec5SDimitry Andric if (!N->isTemporary())
10770b57cec5SDimitry Andric return;
10780b57cec5SDimitry Andric }
10790b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record;
10800b57cec5SDimitry Andric StringRef Blob;
10810b57cec5SDimitry Andric if (Error Err = IndexCursor.JumpToBit(
10820b57cec5SDimitry Andric GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
10830b57cec5SDimitry Andric report_fatal_error("lazyLoadOneMetadata failed jumping: " +
10840b57cec5SDimitry Andric toString(std::move(Err)));
10850b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks();
10860b57cec5SDimitry Andric if (!MaybeEntry)
10870b57cec5SDimitry Andric // FIXME this drops the error on the floor.
10880b57cec5SDimitry Andric report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
10890b57cec5SDimitry Andric toString(MaybeEntry.takeError()));
10900b57cec5SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
10910b57cec5SDimitry Andric ++NumMDRecordLoaded;
10920b57cec5SDimitry Andric if (Expected<unsigned> MaybeCode =
10930b57cec5SDimitry Andric IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10940b57cec5SDimitry Andric if (Error Err =
10950b57cec5SDimitry Andric parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10960b57cec5SDimitry Andric report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
10970b57cec5SDimitry Andric toString(std::move(Err)));
10980b57cec5SDimitry Andric } else
10990b57cec5SDimitry Andric report_fatal_error("Can't lazyload MD: " + toString(MaybeCode.takeError()));
11000b57cec5SDimitry Andric }
11010b57cec5SDimitry Andric
11020b57cec5SDimitry Andric /// Ensure that all forward-references and placeholders are resolved.
11030b57cec5SDimitry Andric /// Iteratively lazy-loading metadata on-demand if needed.
resolveForwardRefsAndPlaceholders(PlaceholderQueue & Placeholders)11040b57cec5SDimitry Andric void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
11050b57cec5SDimitry Andric PlaceholderQueue &Placeholders) {
11060b57cec5SDimitry Andric DenseSet<unsigned> Temporaries;
11070b57cec5SDimitry Andric while (1) {
11080b57cec5SDimitry Andric // Populate Temporaries with the placeholders that haven't been loaded yet.
11090b57cec5SDimitry Andric Placeholders.getTemporaries(MetadataList, Temporaries);
11100b57cec5SDimitry Andric
11110b57cec5SDimitry Andric // If we don't have any temporary, or FwdReference, we're done!
11120b57cec5SDimitry Andric if (Temporaries.empty() && !MetadataList.hasFwdRefs())
11130b57cec5SDimitry Andric break;
11140b57cec5SDimitry Andric
11150b57cec5SDimitry Andric // First, load all the temporaries. This can add new placeholders or
11160b57cec5SDimitry Andric // forward references.
11170b57cec5SDimitry Andric for (auto ID : Temporaries)
11180b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
11190b57cec5SDimitry Andric Temporaries.clear();
11200b57cec5SDimitry Andric
11210b57cec5SDimitry Andric // Second, load the forward-references. This can also add new placeholders
11220b57cec5SDimitry Andric // or forward references.
11230b57cec5SDimitry Andric while (MetadataList.hasFwdRefs())
11240b57cec5SDimitry Andric lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
11250b57cec5SDimitry Andric }
11260b57cec5SDimitry Andric // At this point we don't have any forward reference remaining, or temporary
11270b57cec5SDimitry Andric // that haven't been loaded. We can safely drop RAUW support and mark cycles
11280b57cec5SDimitry Andric // as resolved.
11290b57cec5SDimitry Andric MetadataList.tryToResolveCycles();
11300b57cec5SDimitry Andric
11310b57cec5SDimitry Andric // Finally, everything is in place, we can replace the placeholders operands
11320b57cec5SDimitry Andric // with the final node they refer to.
11330b57cec5SDimitry Andric Placeholders.flush(MetadataList);
11340b57cec5SDimitry Andric }
11350b57cec5SDimitry Andric
parseOneMetadata(SmallVectorImpl<uint64_t> & Record,unsigned Code,PlaceholderQueue & Placeholders,StringRef Blob,unsigned & NextMetadataNo)11360b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
11370b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Code,
11380b57cec5SDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
11390b57cec5SDimitry Andric
11400b57cec5SDimitry Andric bool IsDistinct = false;
11410b57cec5SDimitry Andric auto getMD = [&](unsigned ID) -> Metadata * {
11420b57cec5SDimitry Andric if (ID < MDStringRef.size())
11430b57cec5SDimitry Andric return lazyLoadOneMDString(ID);
11440b57cec5SDimitry Andric if (!IsDistinct) {
11450b57cec5SDimitry Andric if (auto *MD = MetadataList.lookup(ID))
11460b57cec5SDimitry Andric return MD;
11470b57cec5SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand
11480b57cec5SDimitry Andric // instead of creating a temporary.
11490b57cec5SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
11500b57cec5SDimitry Andric // Create a temporary for the node that is referencing the operand we
11510b57cec5SDimitry Andric // will lazy-load. It is needed before recursing in case there are
11520b57cec5SDimitry Andric // uniquing cycles.
11530b57cec5SDimitry Andric MetadataList.getMetadataFwdRef(NextMetadataNo);
11540b57cec5SDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
11550b57cec5SDimitry Andric return MetadataList.lookup(ID);
11560b57cec5SDimitry Andric }
11570b57cec5SDimitry Andric // Return a temporary.
11580b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID);
11590b57cec5SDimitry Andric }
11600b57cec5SDimitry Andric if (auto *MD = MetadataList.getMetadataIfResolved(ID))
11610b57cec5SDimitry Andric return MD;
11620b57cec5SDimitry Andric return &Placeholders.getPlaceholderOp(ID);
11630b57cec5SDimitry Andric };
11640b57cec5SDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata * {
11650b57cec5SDimitry Andric if (ID)
11660b57cec5SDimitry Andric return getMD(ID - 1);
11670b57cec5SDimitry Andric return nullptr;
11680b57cec5SDimitry Andric };
11690b57cec5SDimitry Andric auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
11700b57cec5SDimitry Andric if (ID)
11710b57cec5SDimitry Andric return MetadataList.getMetadataFwdRef(ID - 1);
11720b57cec5SDimitry Andric return nullptr;
11730b57cec5SDimitry Andric };
11740b57cec5SDimitry Andric auto getMDString = [&](unsigned ID) -> MDString * {
11750b57cec5SDimitry Andric // This requires that the ID is not really a forward reference. In
11760b57cec5SDimitry Andric // particular, the MDString must already have been resolved.
11770b57cec5SDimitry Andric auto MDS = getMDOrNull(ID);
11780b57cec5SDimitry Andric return cast_or_null<MDString>(MDS);
11790b57cec5SDimitry Andric };
11800b57cec5SDimitry Andric
11810b57cec5SDimitry Andric // Support for old type refs.
11820b57cec5SDimitry Andric auto getDITypeRefOrNull = [&](unsigned ID) {
11830b57cec5SDimitry Andric return MetadataList.upgradeTypeRef(getMDOrNull(ID));
11840b57cec5SDimitry Andric };
11850b57cec5SDimitry Andric
11860b57cec5SDimitry Andric #define GET_OR_DISTINCT(CLASS, ARGS) \
11870b57cec5SDimitry Andric (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
11880b57cec5SDimitry Andric
11890b57cec5SDimitry Andric switch (Code) {
11900b57cec5SDimitry Andric default: // Default behavior: ignore.
11910b57cec5SDimitry Andric break;
11920b57cec5SDimitry Andric case bitc::METADATA_NAME: {
11930b57cec5SDimitry Andric // Read name of the named metadata.
11940b57cec5SDimitry Andric SmallString<8> Name(Record.begin(), Record.end());
11950b57cec5SDimitry Andric Record.clear();
11960b57cec5SDimitry Andric Expected<unsigned> MaybeCode = Stream.ReadCode();
11970b57cec5SDimitry Andric if (!MaybeCode)
11980b57cec5SDimitry Andric return MaybeCode.takeError();
11990b57cec5SDimitry Andric Code = MaybeCode.get();
12000b57cec5SDimitry Andric
12010b57cec5SDimitry Andric ++NumMDRecordLoaded;
12020b57cec5SDimitry Andric if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
12030b57cec5SDimitry Andric if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
12040b57cec5SDimitry Andric return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
12050b57cec5SDimitry Andric } else
12060b57cec5SDimitry Andric return MaybeNextBitCode.takeError();
12070b57cec5SDimitry Andric
12080b57cec5SDimitry Andric // Read named metadata elements.
12090b57cec5SDimitry Andric unsigned Size = Record.size();
12100b57cec5SDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
12110b57cec5SDimitry Andric for (unsigned i = 0; i != Size; ++i) {
12120b57cec5SDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
12130b57cec5SDimitry Andric if (!MD)
12140b57cec5SDimitry Andric return error("Invalid named metadata: expect fwd ref to MDNode");
12150b57cec5SDimitry Andric NMD->addOperand(MD);
12160b57cec5SDimitry Andric }
12170b57cec5SDimitry Andric break;
12180b57cec5SDimitry Andric }
12190b57cec5SDimitry Andric case bitc::METADATA_OLD_FN_NODE: {
12205ffd83dbSDimitry Andric // Deprecated, but still needed to read old bitcode files.
12210b57cec5SDimitry Andric // This is a LocalAsMetadata record, the only type of function-local
12220b57cec5SDimitry Andric // metadata.
12230b57cec5SDimitry Andric if (Record.size() % 2 == 1)
12240b57cec5SDimitry Andric return error("Invalid record");
12250b57cec5SDimitry Andric
12260b57cec5SDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used
12270b57cec5SDimitry Andric // to be legal, but there's no upgrade path.
12280b57cec5SDimitry Andric auto dropRecord = [&] {
12290b57cec5SDimitry Andric MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
12300b57cec5SDimitry Andric NextMetadataNo++;
12310b57cec5SDimitry Andric };
12320b57cec5SDimitry Andric if (Record.size() != 2) {
12330b57cec5SDimitry Andric dropRecord();
12340b57cec5SDimitry Andric break;
12350b57cec5SDimitry Andric }
12360b57cec5SDimitry Andric
12370b57cec5SDimitry Andric Type *Ty = getTypeByID(Record[0]);
12380b57cec5SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) {
12390b57cec5SDimitry Andric dropRecord();
12400b57cec5SDimitry Andric break;
12410b57cec5SDimitry Andric }
12420b57cec5SDimitry Andric
12430b57cec5SDimitry Andric MetadataList.assignValue(
12440b57cec5SDimitry Andric LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
12450b57cec5SDimitry Andric NextMetadataNo);
12460b57cec5SDimitry Andric NextMetadataNo++;
12470b57cec5SDimitry Andric break;
12480b57cec5SDimitry Andric }
12490b57cec5SDimitry Andric case bitc::METADATA_OLD_NODE: {
12505ffd83dbSDimitry Andric // Deprecated, but still needed to read old bitcode files.
12510b57cec5SDimitry Andric if (Record.size() % 2 == 1)
12520b57cec5SDimitry Andric return error("Invalid record");
12530b57cec5SDimitry Andric
12540b57cec5SDimitry Andric unsigned Size = Record.size();
12550b57cec5SDimitry Andric SmallVector<Metadata *, 8> Elts;
12560b57cec5SDimitry Andric for (unsigned i = 0; i != Size; i += 2) {
12570b57cec5SDimitry Andric Type *Ty = getTypeByID(Record[i]);
12580b57cec5SDimitry Andric if (!Ty)
12590b57cec5SDimitry Andric return error("Invalid record");
12600b57cec5SDimitry Andric if (Ty->isMetadataTy())
12610b57cec5SDimitry Andric Elts.push_back(getMD(Record[i + 1]));
12620b57cec5SDimitry Andric else if (!Ty->isVoidTy()) {
12630b57cec5SDimitry Andric auto *MD =
12640b57cec5SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
12650b57cec5SDimitry Andric assert(isa<ConstantAsMetadata>(MD) &&
12660b57cec5SDimitry Andric "Expected non-function-local metadata");
12670b57cec5SDimitry Andric Elts.push_back(MD);
12680b57cec5SDimitry Andric } else
12690b57cec5SDimitry Andric Elts.push_back(nullptr);
12700b57cec5SDimitry Andric }
12710b57cec5SDimitry Andric MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
12720b57cec5SDimitry Andric NextMetadataNo++;
12730b57cec5SDimitry Andric break;
12740b57cec5SDimitry Andric }
12750b57cec5SDimitry Andric case bitc::METADATA_VALUE: {
12760b57cec5SDimitry Andric if (Record.size() != 2)
12770b57cec5SDimitry Andric return error("Invalid record");
12780b57cec5SDimitry Andric
12790b57cec5SDimitry Andric Type *Ty = getTypeByID(Record[0]);
12800b57cec5SDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy())
12810b57cec5SDimitry Andric return error("Invalid record");
12820b57cec5SDimitry Andric
12830b57cec5SDimitry Andric MetadataList.assignValue(
12840b57cec5SDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
12850b57cec5SDimitry Andric NextMetadataNo);
12860b57cec5SDimitry Andric NextMetadataNo++;
12870b57cec5SDimitry Andric break;
12880b57cec5SDimitry Andric }
12890b57cec5SDimitry Andric case bitc::METADATA_DISTINCT_NODE:
12900b57cec5SDimitry Andric IsDistinct = true;
12910b57cec5SDimitry Andric LLVM_FALLTHROUGH;
12920b57cec5SDimitry Andric case bitc::METADATA_NODE: {
12930b57cec5SDimitry Andric SmallVector<Metadata *, 8> Elts;
12940b57cec5SDimitry Andric Elts.reserve(Record.size());
12950b57cec5SDimitry Andric for (unsigned ID : Record)
12960b57cec5SDimitry Andric Elts.push_back(getMDOrNull(ID));
12970b57cec5SDimitry Andric MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
12980b57cec5SDimitry Andric : MDNode::get(Context, Elts),
12990b57cec5SDimitry Andric NextMetadataNo);
13000b57cec5SDimitry Andric NextMetadataNo++;
13010b57cec5SDimitry Andric break;
13020b57cec5SDimitry Andric }
13030b57cec5SDimitry Andric case bitc::METADATA_LOCATION: {
13040b57cec5SDimitry Andric if (Record.size() != 5 && Record.size() != 6)
13050b57cec5SDimitry Andric return error("Invalid record");
13060b57cec5SDimitry Andric
13070b57cec5SDimitry Andric IsDistinct = Record[0];
13080b57cec5SDimitry Andric unsigned Line = Record[1];
13090b57cec5SDimitry Andric unsigned Column = Record[2];
13100b57cec5SDimitry Andric Metadata *Scope = getMD(Record[3]);
13110b57cec5SDimitry Andric Metadata *InlinedAt = getMDOrNull(Record[4]);
13120b57cec5SDimitry Andric bool ImplicitCode = Record.size() == 6 && Record[5];
13130b57cec5SDimitry Andric MetadataList.assignValue(
13140b57cec5SDimitry Andric GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
13150b57cec5SDimitry Andric ImplicitCode)),
13160b57cec5SDimitry Andric NextMetadataNo);
13170b57cec5SDimitry Andric NextMetadataNo++;
13180b57cec5SDimitry Andric break;
13190b57cec5SDimitry Andric }
13200b57cec5SDimitry Andric case bitc::METADATA_GENERIC_DEBUG: {
13210b57cec5SDimitry Andric if (Record.size() < 4)
13220b57cec5SDimitry Andric return error("Invalid record");
13230b57cec5SDimitry Andric
13240b57cec5SDimitry Andric IsDistinct = Record[0];
13250b57cec5SDimitry Andric unsigned Tag = Record[1];
13260b57cec5SDimitry Andric unsigned Version = Record[2];
13270b57cec5SDimitry Andric
13280b57cec5SDimitry Andric if (Tag >= 1u << 16 || Version != 0)
13290b57cec5SDimitry Andric return error("Invalid record");
13300b57cec5SDimitry Andric
13310b57cec5SDimitry Andric auto *Header = getMDString(Record[3]);
13320b57cec5SDimitry Andric SmallVector<Metadata *, 8> DwarfOps;
13330b57cec5SDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I)
13340b57cec5SDimitry Andric DwarfOps.push_back(getMDOrNull(Record[I]));
13350b57cec5SDimitry Andric MetadataList.assignValue(
13360b57cec5SDimitry Andric GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
13370b57cec5SDimitry Andric NextMetadataNo);
13380b57cec5SDimitry Andric NextMetadataNo++;
13390b57cec5SDimitry Andric break;
13400b57cec5SDimitry Andric }
13410b57cec5SDimitry Andric case bitc::METADATA_SUBRANGE: {
13420b57cec5SDimitry Andric Metadata *Val = nullptr;
13430b57cec5SDimitry Andric // Operand 'count' is interpreted as:
13440b57cec5SDimitry Andric // - Signed integer (version 0)
13450b57cec5SDimitry Andric // - Metadata node (version 1)
13465ffd83dbSDimitry Andric // Operand 'lowerBound' is interpreted as:
13475ffd83dbSDimitry Andric // - Signed integer (version 0 and 1)
13485ffd83dbSDimitry Andric // - Metadata node (version 2)
13495ffd83dbSDimitry Andric // Operands 'upperBound' and 'stride' are interpreted as:
13505ffd83dbSDimitry Andric // - Metadata node (version 2)
13510b57cec5SDimitry Andric switch (Record[0] >> 1) {
13520b57cec5SDimitry Andric case 0:
13530b57cec5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange,
13545ffd83dbSDimitry Andric (Context, Record[1], unrotateSign(Record[2])));
13550b57cec5SDimitry Andric break;
13560b57cec5SDimitry Andric case 1:
13570b57cec5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
13585ffd83dbSDimitry Andric unrotateSign(Record[2])));
13595ffd83dbSDimitry Andric break;
13605ffd83dbSDimitry Andric case 2:
13615ffd83dbSDimitry Andric Val = GET_OR_DISTINCT(
13625ffd83dbSDimitry Andric DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
13635ffd83dbSDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4])));
13640b57cec5SDimitry Andric break;
13650b57cec5SDimitry Andric default:
13660b57cec5SDimitry Andric return error("Invalid record: Unsupported version of DISubrange");
13670b57cec5SDimitry Andric }
13680b57cec5SDimitry Andric
13690b57cec5SDimitry Andric MetadataList.assignValue(Val, NextMetadataNo);
13700b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
13710b57cec5SDimitry Andric NextMetadataNo++;
13720b57cec5SDimitry Andric break;
13730b57cec5SDimitry Andric }
1374af732203SDimitry Andric case bitc::METADATA_GENERIC_SUBRANGE: {
1375af732203SDimitry Andric Metadata *Val = nullptr;
1376af732203SDimitry Andric Val = GET_OR_DISTINCT(DIGenericSubrange,
1377af732203SDimitry Andric (Context, getMDOrNull(Record[1]),
1378af732203SDimitry Andric getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1379af732203SDimitry Andric getMDOrNull(Record[4])));
1380af732203SDimitry Andric
1381af732203SDimitry Andric MetadataList.assignValue(Val, NextMetadataNo);
1382af732203SDimitry Andric IsDistinct = Record[0] & 1;
1383af732203SDimitry Andric NextMetadataNo++;
1384af732203SDimitry Andric break;
1385af732203SDimitry Andric }
13860b57cec5SDimitry Andric case bitc::METADATA_ENUMERATOR: {
13875ffd83dbSDimitry Andric if (Record.size() < 3)
13880b57cec5SDimitry Andric return error("Invalid record");
13890b57cec5SDimitry Andric
13900b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
13910b57cec5SDimitry Andric bool IsUnsigned = Record[0] & 2;
13925ffd83dbSDimitry Andric bool IsBigInt = Record[0] & 4;
13935ffd83dbSDimitry Andric APInt Value;
13945ffd83dbSDimitry Andric
13955ffd83dbSDimitry Andric if (IsBigInt) {
13965ffd83dbSDimitry Andric const uint64_t BitWidth = Record[1];
13975ffd83dbSDimitry Andric const size_t NumWords = Record.size() - 3;
13985ffd83dbSDimitry Andric Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
13995ffd83dbSDimitry Andric } else
14005ffd83dbSDimitry Andric Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
14015ffd83dbSDimitry Andric
14020b57cec5SDimitry Andric MetadataList.assignValue(
14035ffd83dbSDimitry Andric GET_OR_DISTINCT(DIEnumerator,
14045ffd83dbSDimitry Andric (Context, Value, IsUnsigned, getMDString(Record[2]))),
14050b57cec5SDimitry Andric NextMetadataNo);
14060b57cec5SDimitry Andric NextMetadataNo++;
14070b57cec5SDimitry Andric break;
14080b57cec5SDimitry Andric }
14090b57cec5SDimitry Andric case bitc::METADATA_BASIC_TYPE: {
14100b57cec5SDimitry Andric if (Record.size() < 6 || Record.size() > 7)
14110b57cec5SDimitry Andric return error("Invalid record");
14120b57cec5SDimitry Andric
14130b57cec5SDimitry Andric IsDistinct = Record[0];
14140b57cec5SDimitry Andric DINode::DIFlags Flags = (Record.size() > 6) ?
14150b57cec5SDimitry Andric static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero;
14160b57cec5SDimitry Andric
14170b57cec5SDimitry Andric MetadataList.assignValue(
14180b57cec5SDimitry Andric GET_OR_DISTINCT(DIBasicType,
14190b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]), Record[3],
14200b57cec5SDimitry Andric Record[4], Record[5], Flags)),
14210b57cec5SDimitry Andric NextMetadataNo);
14220b57cec5SDimitry Andric NextMetadataNo++;
14230b57cec5SDimitry Andric break;
14240b57cec5SDimitry Andric }
1425af732203SDimitry Andric case bitc::METADATA_STRING_TYPE: {
1426af732203SDimitry Andric if (Record.size() != 8)
1427af732203SDimitry Andric return error("Invalid record");
1428af732203SDimitry Andric
1429af732203SDimitry Andric IsDistinct = Record[0];
1430af732203SDimitry Andric MetadataList.assignValue(
1431af732203SDimitry Andric GET_OR_DISTINCT(DIStringType,
1432af732203SDimitry Andric (Context, Record[1], getMDString(Record[2]),
1433af732203SDimitry Andric getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1434af732203SDimitry Andric Record[5], Record[6], Record[7])),
1435af732203SDimitry Andric NextMetadataNo);
1436af732203SDimitry Andric NextMetadataNo++;
1437af732203SDimitry Andric break;
1438af732203SDimitry Andric }
14390b57cec5SDimitry Andric case bitc::METADATA_DERIVED_TYPE: {
14400b57cec5SDimitry Andric if (Record.size() < 12 || Record.size() > 13)
14410b57cec5SDimitry Andric return error("Invalid record");
14420b57cec5SDimitry Andric
14430b57cec5SDimitry Andric // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
14440b57cec5SDimitry Andric // that there is no DWARF address space associated with DIDerivedType.
14450b57cec5SDimitry Andric Optional<unsigned> DWARFAddressSpace;
14460b57cec5SDimitry Andric if (Record.size() > 12 && Record[12])
14470b57cec5SDimitry Andric DWARFAddressSpace = Record[12] - 1;
14480b57cec5SDimitry Andric
14490b57cec5SDimitry Andric IsDistinct = Record[0];
14500b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
14510b57cec5SDimitry Andric MetadataList.assignValue(
14520b57cec5SDimitry Andric GET_OR_DISTINCT(DIDerivedType,
14530b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]),
14540b57cec5SDimitry Andric getMDOrNull(Record[3]), Record[4],
14550b57cec5SDimitry Andric getDITypeRefOrNull(Record[5]),
14560b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
14570b57cec5SDimitry Andric Record[9], DWARFAddressSpace, Flags,
14580b57cec5SDimitry Andric getDITypeRefOrNull(Record[11]))),
14590b57cec5SDimitry Andric NextMetadataNo);
14600b57cec5SDimitry Andric NextMetadataNo++;
14610b57cec5SDimitry Andric break;
14620b57cec5SDimitry Andric }
14630b57cec5SDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: {
1464af732203SDimitry Andric if (Record.size() < 16 || Record.size() > 21)
14650b57cec5SDimitry Andric return error("Invalid record");
14660b57cec5SDimitry Andric
14670b57cec5SDimitry Andric // If we have a UUID and this is not a forward declaration, lookup the
14680b57cec5SDimitry Andric // mapping.
14690b57cec5SDimitry Andric IsDistinct = Record[0] & 0x1;
14700b57cec5SDimitry Andric bool IsNotUsedInTypeRef = Record[0] >= 2;
14710b57cec5SDimitry Andric unsigned Tag = Record[1];
14720b57cec5SDimitry Andric MDString *Name = getMDString(Record[2]);
14730b57cec5SDimitry Andric Metadata *File = getMDOrNull(Record[3]);
14740b57cec5SDimitry Andric unsigned Line = Record[4];
14750b57cec5SDimitry Andric Metadata *Scope = getDITypeRefOrNull(Record[5]);
14760b57cec5SDimitry Andric Metadata *BaseType = nullptr;
14770b57cec5SDimitry Andric uint64_t SizeInBits = Record[7];
14780b57cec5SDimitry Andric if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
14790b57cec5SDimitry Andric return error("Alignment value is too large");
14800b57cec5SDimitry Andric uint32_t AlignInBits = Record[8];
14810b57cec5SDimitry Andric uint64_t OffsetInBits = 0;
14820b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
14830b57cec5SDimitry Andric Metadata *Elements = nullptr;
14840b57cec5SDimitry Andric unsigned RuntimeLang = Record[12];
14850b57cec5SDimitry Andric Metadata *VTableHolder = nullptr;
14860b57cec5SDimitry Andric Metadata *TemplateParams = nullptr;
14870b57cec5SDimitry Andric Metadata *Discriminator = nullptr;
14885ffd83dbSDimitry Andric Metadata *DataLocation = nullptr;
1489af732203SDimitry Andric Metadata *Associated = nullptr;
1490af732203SDimitry Andric Metadata *Allocated = nullptr;
1491af732203SDimitry Andric Metadata *Rank = nullptr;
14920b57cec5SDimitry Andric auto *Identifier = getMDString(Record[15]);
14930b57cec5SDimitry Andric // If this module is being parsed so that it can be ThinLTO imported
14940b57cec5SDimitry Andric // into another module, composite types only need to be imported
14950b57cec5SDimitry Andric // as type declarations (unless full type definitions requested).
14960b57cec5SDimitry Andric // Create type declarations up front to save memory. Also, buildODRType
14970b57cec5SDimitry Andric // handles the case where this is type ODRed with a definition needed
14980b57cec5SDimitry Andric // by the importing module, in which case the existing definition is
14990b57cec5SDimitry Andric // used.
15000b57cec5SDimitry Andric if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
15010b57cec5SDimitry Andric (Tag == dwarf::DW_TAG_enumeration_type ||
15020b57cec5SDimitry Andric Tag == dwarf::DW_TAG_class_type ||
15030b57cec5SDimitry Andric Tag == dwarf::DW_TAG_structure_type ||
15040b57cec5SDimitry Andric Tag == dwarf::DW_TAG_union_type)) {
15050b57cec5SDimitry Andric Flags = Flags | DINode::FlagFwdDecl;
15060b57cec5SDimitry Andric } else {
15070b57cec5SDimitry Andric BaseType = getDITypeRefOrNull(Record[6]);
15080b57cec5SDimitry Andric OffsetInBits = Record[9];
15090b57cec5SDimitry Andric Elements = getMDOrNull(Record[11]);
15100b57cec5SDimitry Andric VTableHolder = getDITypeRefOrNull(Record[13]);
15110b57cec5SDimitry Andric TemplateParams = getMDOrNull(Record[14]);
15120b57cec5SDimitry Andric if (Record.size() > 16)
15130b57cec5SDimitry Andric Discriminator = getMDOrNull(Record[16]);
15145ffd83dbSDimitry Andric if (Record.size() > 17)
15155ffd83dbSDimitry Andric DataLocation = getMDOrNull(Record[17]);
1516af732203SDimitry Andric if (Record.size() > 19) {
1517af732203SDimitry Andric Associated = getMDOrNull(Record[18]);
1518af732203SDimitry Andric Allocated = getMDOrNull(Record[19]);
1519af732203SDimitry Andric }
1520af732203SDimitry Andric if (Record.size() > 20) {
1521af732203SDimitry Andric Rank = getMDOrNull(Record[20]);
1522af732203SDimitry Andric }
15230b57cec5SDimitry Andric }
15240b57cec5SDimitry Andric DICompositeType *CT = nullptr;
15250b57cec5SDimitry Andric if (Identifier)
15260b57cec5SDimitry Andric CT = DICompositeType::buildODRType(
15270b57cec5SDimitry Andric Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
15280b57cec5SDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
1529af732203SDimitry Andric VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
1530af732203SDimitry Andric Allocated, Rank);
15310b57cec5SDimitry Andric
15320b57cec5SDimitry Andric // Create a node if we didn't get a lazy ODR type.
15330b57cec5SDimitry Andric if (!CT)
15340b57cec5SDimitry Andric CT = GET_OR_DISTINCT(DICompositeType,
15350b57cec5SDimitry Andric (Context, Tag, Name, File, Line, Scope, BaseType,
15360b57cec5SDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags,
15370b57cec5SDimitry Andric Elements, RuntimeLang, VTableHolder, TemplateParams,
1538af732203SDimitry Andric Identifier, Discriminator, DataLocation, Associated,
1539af732203SDimitry Andric Allocated, Rank));
15400b57cec5SDimitry Andric if (!IsNotUsedInTypeRef && Identifier)
15410b57cec5SDimitry Andric MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
15420b57cec5SDimitry Andric
15430b57cec5SDimitry Andric MetadataList.assignValue(CT, NextMetadataNo);
15440b57cec5SDimitry Andric NextMetadataNo++;
15450b57cec5SDimitry Andric break;
15460b57cec5SDimitry Andric }
15470b57cec5SDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: {
15480b57cec5SDimitry Andric if (Record.size() < 3 || Record.size() > 4)
15490b57cec5SDimitry Andric return error("Invalid record");
15500b57cec5SDimitry Andric bool IsOldTypeRefArray = Record[0] < 2;
15510b57cec5SDimitry Andric unsigned CC = (Record.size() > 3) ? Record[3] : 0;
15520b57cec5SDimitry Andric
15530b57cec5SDimitry Andric IsDistinct = Record[0] & 0x1;
15540b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
15550b57cec5SDimitry Andric Metadata *Types = getMDOrNull(Record[2]);
15560b57cec5SDimitry Andric if (LLVM_UNLIKELY(IsOldTypeRefArray))
15570b57cec5SDimitry Andric Types = MetadataList.upgradeTypeRefArray(Types);
15580b57cec5SDimitry Andric
15590b57cec5SDimitry Andric MetadataList.assignValue(
15600b57cec5SDimitry Andric GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
15610b57cec5SDimitry Andric NextMetadataNo);
15620b57cec5SDimitry Andric NextMetadataNo++;
15630b57cec5SDimitry Andric break;
15640b57cec5SDimitry Andric }
15650b57cec5SDimitry Andric
15660b57cec5SDimitry Andric case bitc::METADATA_MODULE: {
1567af732203SDimitry Andric if (Record.size() < 5 || Record.size() > 9)
15680b57cec5SDimitry Andric return error("Invalid record");
15690b57cec5SDimitry Andric
1570af732203SDimitry Andric unsigned Offset = Record.size() >= 8 ? 2 : 1;
15710b57cec5SDimitry Andric IsDistinct = Record[0];
15720b57cec5SDimitry Andric MetadataList.assignValue(
15735ffd83dbSDimitry Andric GET_OR_DISTINCT(
15745ffd83dbSDimitry Andric DIModule,
1575af732203SDimitry Andric (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
15765ffd83dbSDimitry Andric getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
15775ffd83dbSDimitry Andric getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
15785ffd83dbSDimitry Andric getMDString(Record[4 + Offset]),
1579af732203SDimitry Andric Record.size() <= 7 ? 0 : Record[7],
1580af732203SDimitry Andric Record.size() <= 8 ? false : Record[8])),
15810b57cec5SDimitry Andric NextMetadataNo);
15820b57cec5SDimitry Andric NextMetadataNo++;
15830b57cec5SDimitry Andric break;
15840b57cec5SDimitry Andric }
15850b57cec5SDimitry Andric
15860b57cec5SDimitry Andric case bitc::METADATA_FILE: {
15870b57cec5SDimitry Andric if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
15880b57cec5SDimitry Andric return error("Invalid record");
15890b57cec5SDimitry Andric
15900b57cec5SDimitry Andric IsDistinct = Record[0];
15910b57cec5SDimitry Andric Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
15920b57cec5SDimitry Andric // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
15930b57cec5SDimitry Andric // is not present. This matches up with the old internal representation,
15940b57cec5SDimitry Andric // and the old encoding for CSK_None in the ChecksumKind. The new
15950b57cec5SDimitry Andric // representation reserves the value 0 in the ChecksumKind to continue to
15960b57cec5SDimitry Andric // encode None in a backwards-compatible way.
15970b57cec5SDimitry Andric if (Record.size() > 4 && Record[3] && Record[4])
15980b57cec5SDimitry Andric Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
15990b57cec5SDimitry Andric getMDString(Record[4]));
16000b57cec5SDimitry Andric MetadataList.assignValue(
16010b57cec5SDimitry Andric GET_OR_DISTINCT(
16020b57cec5SDimitry Andric DIFile,
16030b57cec5SDimitry Andric (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
16040b57cec5SDimitry Andric Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
16050b57cec5SDimitry Andric : None)),
16060b57cec5SDimitry Andric NextMetadataNo);
16070b57cec5SDimitry Andric NextMetadataNo++;
16080b57cec5SDimitry Andric break;
16090b57cec5SDimitry Andric }
16100b57cec5SDimitry Andric case bitc::METADATA_COMPILE_UNIT: {
16115ffd83dbSDimitry Andric if (Record.size() < 14 || Record.size() > 22)
16120b57cec5SDimitry Andric return error("Invalid record");
16130b57cec5SDimitry Andric
16140b57cec5SDimitry Andric // Ignore Record[0], which indicates whether this compile unit is
16150b57cec5SDimitry Andric // distinct. It's always distinct.
16160b57cec5SDimitry Andric IsDistinct = true;
16170b57cec5SDimitry Andric auto *CU = DICompileUnit::getDistinct(
16180b57cec5SDimitry Andric Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
16190b57cec5SDimitry Andric Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
16200b57cec5SDimitry Andric Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
16210b57cec5SDimitry Andric getMDOrNull(Record[12]), getMDOrNull(Record[13]),
16220b57cec5SDimitry Andric Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
16230b57cec5SDimitry Andric Record.size() <= 14 ? 0 : Record[14],
16240b57cec5SDimitry Andric Record.size() <= 16 ? true : Record[16],
16250b57cec5SDimitry Andric Record.size() <= 17 ? false : Record[17],
16260b57cec5SDimitry Andric Record.size() <= 18 ? 0 : Record[18],
16275ffd83dbSDimitry Andric Record.size() <= 19 ? 0 : Record[19],
16285ffd83dbSDimitry Andric Record.size() <= 20 ? nullptr : getMDString(Record[20]),
16295ffd83dbSDimitry Andric Record.size() <= 21 ? nullptr : getMDString(Record[21]));
16300b57cec5SDimitry Andric
16310b57cec5SDimitry Andric MetadataList.assignValue(CU, NextMetadataNo);
16320b57cec5SDimitry Andric NextMetadataNo++;
16330b57cec5SDimitry Andric
16340b57cec5SDimitry Andric // Move the Upgrade the list of subprograms.
16350b57cec5SDimitry Andric if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
16360b57cec5SDimitry Andric CUSubprograms.push_back({CU, SPs});
16370b57cec5SDimitry Andric break;
16380b57cec5SDimitry Andric }
16390b57cec5SDimitry Andric case bitc::METADATA_SUBPROGRAM: {
16400b57cec5SDimitry Andric if (Record.size() < 18 || Record.size() > 21)
16410b57cec5SDimitry Andric return error("Invalid record");
16420b57cec5SDimitry Andric
16430b57cec5SDimitry Andric bool HasSPFlags = Record[0] & 4;
16440b57cec5SDimitry Andric
16450b57cec5SDimitry Andric DINode::DIFlags Flags;
16460b57cec5SDimitry Andric DISubprogram::DISPFlags SPFlags;
16470b57cec5SDimitry Andric if (!HasSPFlags)
16480b57cec5SDimitry Andric Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
16490b57cec5SDimitry Andric else {
16500b57cec5SDimitry Andric Flags = static_cast<DINode::DIFlags>(Record[11]);
16510b57cec5SDimitry Andric SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
16520b57cec5SDimitry Andric }
16530b57cec5SDimitry Andric
16540b57cec5SDimitry Andric // Support for old metadata when
16550b57cec5SDimitry Andric // subprogram specific flags are placed in DIFlags.
16560b57cec5SDimitry Andric const unsigned DIFlagMainSubprogram = 1 << 21;
16570b57cec5SDimitry Andric bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
16580b57cec5SDimitry Andric if (HasOldMainSubprogramFlag)
16590b57cec5SDimitry Andric // Remove old DIFlagMainSubprogram from DIFlags.
16600b57cec5SDimitry Andric // Note: This assumes that any future use of bit 21 defaults to it
16610b57cec5SDimitry Andric // being 0.
16620b57cec5SDimitry Andric Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
16630b57cec5SDimitry Andric
16640b57cec5SDimitry Andric if (HasOldMainSubprogramFlag && HasSPFlags)
16650b57cec5SDimitry Andric SPFlags |= DISubprogram::SPFlagMainSubprogram;
16660b57cec5SDimitry Andric else if (!HasSPFlags)
16670b57cec5SDimitry Andric SPFlags = DISubprogram::toSPFlags(
16680b57cec5SDimitry Andric /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
16690b57cec5SDimitry Andric /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
16700b57cec5SDimitry Andric /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag);
16710b57cec5SDimitry Andric
16720b57cec5SDimitry Andric // All definitions should be distinct.
16730b57cec5SDimitry Andric IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
16740b57cec5SDimitry Andric // Version 1 has a Function as Record[15].
16750b57cec5SDimitry Andric // Version 2 has removed Record[15].
16760b57cec5SDimitry Andric // Version 3 has the Unit as Record[15].
16770b57cec5SDimitry Andric // Version 4 added thisAdjustment.
16780b57cec5SDimitry Andric // Version 5 repacked flags into DISPFlags, changing many element numbers.
16790b57cec5SDimitry Andric bool HasUnit = Record[0] & 2;
16800b57cec5SDimitry Andric if (!HasSPFlags && HasUnit && Record.size() < 19)
16810b57cec5SDimitry Andric return error("Invalid record");
16820b57cec5SDimitry Andric if (HasSPFlags && !HasUnit)
16830b57cec5SDimitry Andric return error("Invalid record");
16840b57cec5SDimitry Andric // Accommodate older formats.
16850b57cec5SDimitry Andric bool HasFn = false;
16860b57cec5SDimitry Andric bool HasThisAdj = true;
16870b57cec5SDimitry Andric bool HasThrownTypes = true;
16880b57cec5SDimitry Andric unsigned OffsetA = 0;
16890b57cec5SDimitry Andric unsigned OffsetB = 0;
16900b57cec5SDimitry Andric if (!HasSPFlags) {
16910b57cec5SDimitry Andric OffsetA = 2;
16920b57cec5SDimitry Andric OffsetB = 2;
16930b57cec5SDimitry Andric if (Record.size() >= 19) {
16940b57cec5SDimitry Andric HasFn = !HasUnit;
16950b57cec5SDimitry Andric OffsetB++;
16960b57cec5SDimitry Andric }
16970b57cec5SDimitry Andric HasThisAdj = Record.size() >= 20;
16980b57cec5SDimitry Andric HasThrownTypes = Record.size() >= 21;
16990b57cec5SDimitry Andric }
17000b57cec5SDimitry Andric Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
17010b57cec5SDimitry Andric DISubprogram *SP = GET_OR_DISTINCT(
17020b57cec5SDimitry Andric DISubprogram,
17030b57cec5SDimitry Andric (Context,
17040b57cec5SDimitry Andric getDITypeRefOrNull(Record[1]), // scope
17050b57cec5SDimitry Andric getMDString(Record[2]), // name
17060b57cec5SDimitry Andric getMDString(Record[3]), // linkageName
17070b57cec5SDimitry Andric getMDOrNull(Record[4]), // file
17080b57cec5SDimitry Andric Record[5], // line
17090b57cec5SDimitry Andric getMDOrNull(Record[6]), // type
17100b57cec5SDimitry Andric Record[7 + OffsetA], // scopeLine
17110b57cec5SDimitry Andric getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
17120b57cec5SDimitry Andric Record[10 + OffsetA], // virtualIndex
17130b57cec5SDimitry Andric HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
17140b57cec5SDimitry Andric Flags, // flags
17150b57cec5SDimitry Andric SPFlags, // SPFlags
17160b57cec5SDimitry Andric HasUnit ? CUorFn : nullptr, // unit
17170b57cec5SDimitry Andric getMDOrNull(Record[13 + OffsetB]), // templateParams
17180b57cec5SDimitry Andric getMDOrNull(Record[14 + OffsetB]), // declaration
17190b57cec5SDimitry Andric getMDOrNull(Record[15 + OffsetB]), // retainedNodes
17200b57cec5SDimitry Andric HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
17210b57cec5SDimitry Andric : nullptr // thrownTypes
17220b57cec5SDimitry Andric ));
17230b57cec5SDimitry Andric MetadataList.assignValue(SP, NextMetadataNo);
17240b57cec5SDimitry Andric NextMetadataNo++;
17250b57cec5SDimitry Andric
17260b57cec5SDimitry Andric // Upgrade sp->function mapping to function->sp mapping.
17270b57cec5SDimitry Andric if (HasFn) {
17280b57cec5SDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
17290b57cec5SDimitry Andric if (auto *F = dyn_cast<Function>(CMD->getValue())) {
17300b57cec5SDimitry Andric if (F->isMaterializable())
17310b57cec5SDimitry Andric // Defer until materialized; unmaterialized functions may not have
17320b57cec5SDimitry Andric // metadata.
17330b57cec5SDimitry Andric FunctionsWithSPs[F] = SP;
17340b57cec5SDimitry Andric else if (!F->empty())
17350b57cec5SDimitry Andric F->setSubprogram(SP);
17360b57cec5SDimitry Andric }
17370b57cec5SDimitry Andric }
17380b57cec5SDimitry Andric break;
17390b57cec5SDimitry Andric }
17400b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: {
17410b57cec5SDimitry Andric if (Record.size() != 5)
17420b57cec5SDimitry Andric return error("Invalid record");
17430b57cec5SDimitry Andric
17440b57cec5SDimitry Andric IsDistinct = Record[0];
17450b57cec5SDimitry Andric MetadataList.assignValue(
17460b57cec5SDimitry Andric GET_OR_DISTINCT(DILexicalBlock,
17470b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]),
17480b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])),
17490b57cec5SDimitry Andric NextMetadataNo);
17500b57cec5SDimitry Andric NextMetadataNo++;
17510b57cec5SDimitry Andric break;
17520b57cec5SDimitry Andric }
17530b57cec5SDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: {
17540b57cec5SDimitry Andric if (Record.size() != 4)
17550b57cec5SDimitry Andric return error("Invalid record");
17560b57cec5SDimitry Andric
17570b57cec5SDimitry Andric IsDistinct = Record[0];
17580b57cec5SDimitry Andric MetadataList.assignValue(
17590b57cec5SDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile,
17600b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]),
17610b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3])),
17620b57cec5SDimitry Andric NextMetadataNo);
17630b57cec5SDimitry Andric NextMetadataNo++;
17640b57cec5SDimitry Andric break;
17650b57cec5SDimitry Andric }
17660b57cec5SDimitry Andric case bitc::METADATA_COMMON_BLOCK: {
17670b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
17680b57cec5SDimitry Andric MetadataList.assignValue(
17690b57cec5SDimitry Andric GET_OR_DISTINCT(DICommonBlock,
17700b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]),
17710b57cec5SDimitry Andric getMDOrNull(Record[2]), getMDString(Record[3]),
17720b57cec5SDimitry Andric getMDOrNull(Record[4]), Record[5])),
17730b57cec5SDimitry Andric NextMetadataNo);
17740b57cec5SDimitry Andric NextMetadataNo++;
17750b57cec5SDimitry Andric break;
17760b57cec5SDimitry Andric }
17770b57cec5SDimitry Andric case bitc::METADATA_NAMESPACE: {
17780b57cec5SDimitry Andric // Newer versions of DINamespace dropped file and line.
17790b57cec5SDimitry Andric MDString *Name;
17800b57cec5SDimitry Andric if (Record.size() == 3)
17810b57cec5SDimitry Andric Name = getMDString(Record[2]);
17820b57cec5SDimitry Andric else if (Record.size() == 5)
17830b57cec5SDimitry Andric Name = getMDString(Record[3]);
17840b57cec5SDimitry Andric else
17850b57cec5SDimitry Andric return error("Invalid record");
17860b57cec5SDimitry Andric
17870b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
17880b57cec5SDimitry Andric bool ExportSymbols = Record[0] & 2;
17890b57cec5SDimitry Andric MetadataList.assignValue(
17900b57cec5SDimitry Andric GET_OR_DISTINCT(DINamespace,
17910b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
17920b57cec5SDimitry Andric NextMetadataNo);
17930b57cec5SDimitry Andric NextMetadataNo++;
17940b57cec5SDimitry Andric break;
17950b57cec5SDimitry Andric }
17960b57cec5SDimitry Andric case bitc::METADATA_MACRO: {
17970b57cec5SDimitry Andric if (Record.size() != 5)
17980b57cec5SDimitry Andric return error("Invalid record");
17990b57cec5SDimitry Andric
18000b57cec5SDimitry Andric IsDistinct = Record[0];
18010b57cec5SDimitry Andric MetadataList.assignValue(
18020b57cec5SDimitry Andric GET_OR_DISTINCT(DIMacro,
18030b57cec5SDimitry Andric (Context, Record[1], Record[2], getMDString(Record[3]),
18040b57cec5SDimitry Andric getMDString(Record[4]))),
18050b57cec5SDimitry Andric NextMetadataNo);
18060b57cec5SDimitry Andric NextMetadataNo++;
18070b57cec5SDimitry Andric break;
18080b57cec5SDimitry Andric }
18090b57cec5SDimitry Andric case bitc::METADATA_MACRO_FILE: {
18100b57cec5SDimitry Andric if (Record.size() != 5)
18110b57cec5SDimitry Andric return error("Invalid record");
18120b57cec5SDimitry Andric
18130b57cec5SDimitry Andric IsDistinct = Record[0];
18140b57cec5SDimitry Andric MetadataList.assignValue(
18150b57cec5SDimitry Andric GET_OR_DISTINCT(DIMacroFile,
18160b57cec5SDimitry Andric (Context, Record[1], Record[2], getMDOrNull(Record[3]),
18170b57cec5SDimitry Andric getMDOrNull(Record[4]))),
18180b57cec5SDimitry Andric NextMetadataNo);
18190b57cec5SDimitry Andric NextMetadataNo++;
18200b57cec5SDimitry Andric break;
18210b57cec5SDimitry Andric }
18220b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: {
18235ffd83dbSDimitry Andric if (Record.size() < 3 || Record.size() > 4)
18240b57cec5SDimitry Andric return error("Invalid record");
18250b57cec5SDimitry Andric
18260b57cec5SDimitry Andric IsDistinct = Record[0];
18275ffd83dbSDimitry Andric MetadataList.assignValue(
18285ffd83dbSDimitry Andric GET_OR_DISTINCT(DITemplateTypeParameter,
18290b57cec5SDimitry Andric (Context, getMDString(Record[1]),
18305ffd83dbSDimitry Andric getDITypeRefOrNull(Record[2]),
18315ffd83dbSDimitry Andric (Record.size() == 4) ? getMDOrNull(Record[3])
18325ffd83dbSDimitry Andric : getMDOrNull(false))),
18330b57cec5SDimitry Andric NextMetadataNo);
18340b57cec5SDimitry Andric NextMetadataNo++;
18350b57cec5SDimitry Andric break;
18360b57cec5SDimitry Andric }
18370b57cec5SDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: {
18385ffd83dbSDimitry Andric if (Record.size() < 5 || Record.size() > 6)
18390b57cec5SDimitry Andric return error("Invalid record");
18400b57cec5SDimitry Andric
18410b57cec5SDimitry Andric IsDistinct = Record[0];
18425ffd83dbSDimitry Andric
18430b57cec5SDimitry Andric MetadataList.assignValue(
18445ffd83dbSDimitry Andric GET_OR_DISTINCT(
18455ffd83dbSDimitry Andric DITemplateValueParameter,
18460b57cec5SDimitry Andric (Context, Record[1], getMDString(Record[2]),
18470b57cec5SDimitry Andric getDITypeRefOrNull(Record[3]),
18485ffd83dbSDimitry Andric (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
18495ffd83dbSDimitry Andric (Record.size() == 6) ? getMDOrNull(Record[5])
18505ffd83dbSDimitry Andric : getMDOrNull(Record[4]))),
18510b57cec5SDimitry Andric NextMetadataNo);
18520b57cec5SDimitry Andric NextMetadataNo++;
18530b57cec5SDimitry Andric break;
18540b57cec5SDimitry Andric }
18550b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR: {
18560b57cec5SDimitry Andric if (Record.size() < 11 || Record.size() > 13)
18570b57cec5SDimitry Andric return error("Invalid record");
18580b57cec5SDimitry Andric
18590b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
18600b57cec5SDimitry Andric unsigned Version = Record[0] >> 1;
18610b57cec5SDimitry Andric
18620b57cec5SDimitry Andric if (Version == 2) {
18630b57cec5SDimitry Andric MetadataList.assignValue(
18640b57cec5SDimitry Andric GET_OR_DISTINCT(
18650b57cec5SDimitry Andric DIGlobalVariable,
18660b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
18670b57cec5SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
18680b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
18690b57cec5SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])),
18700b57cec5SDimitry Andric NextMetadataNo);
18710b57cec5SDimitry Andric
18720b57cec5SDimitry Andric NextMetadataNo++;
18730b57cec5SDimitry Andric } else if (Version == 1) {
18740b57cec5SDimitry Andric // No upgrade necessary. A null field will be introduced to indicate
18750b57cec5SDimitry Andric // that no parameter information is available.
18760b57cec5SDimitry Andric MetadataList.assignValue(
18770b57cec5SDimitry Andric GET_OR_DISTINCT(DIGlobalVariable,
18780b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]),
18790b57cec5SDimitry Andric getMDString(Record[2]), getMDString(Record[3]),
18800b57cec5SDimitry Andric getMDOrNull(Record[4]), Record[5],
18810b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
18820b57cec5SDimitry Andric getMDOrNull(Record[10]), nullptr, Record[11])),
18830b57cec5SDimitry Andric NextMetadataNo);
18840b57cec5SDimitry Andric
18850b57cec5SDimitry Andric NextMetadataNo++;
18860b57cec5SDimitry Andric } else if (Version == 0) {
18870b57cec5SDimitry Andric // Upgrade old metadata, which stored a global variable reference or a
18880b57cec5SDimitry Andric // ConstantInt here.
18890b57cec5SDimitry Andric NeedUpgradeToDIGlobalVariableExpression = true;
18900b57cec5SDimitry Andric Metadata *Expr = getMDOrNull(Record[9]);
18910b57cec5SDimitry Andric uint32_t AlignInBits = 0;
18920b57cec5SDimitry Andric if (Record.size() > 11) {
18930b57cec5SDimitry Andric if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
18940b57cec5SDimitry Andric return error("Alignment value is too large");
18950b57cec5SDimitry Andric AlignInBits = Record[11];
18960b57cec5SDimitry Andric }
18970b57cec5SDimitry Andric GlobalVariable *Attach = nullptr;
18980b57cec5SDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
18990b57cec5SDimitry Andric if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
19000b57cec5SDimitry Andric Attach = GV;
19010b57cec5SDimitry Andric Expr = nullptr;
19020b57cec5SDimitry Andric } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
19030b57cec5SDimitry Andric Expr = DIExpression::get(Context,
19040b57cec5SDimitry Andric {dwarf::DW_OP_constu, CI->getZExtValue(),
19050b57cec5SDimitry Andric dwarf::DW_OP_stack_value});
19060b57cec5SDimitry Andric } else {
19070b57cec5SDimitry Andric Expr = nullptr;
19080b57cec5SDimitry Andric }
19090b57cec5SDimitry Andric }
19100b57cec5SDimitry Andric DIGlobalVariable *DGV = GET_OR_DISTINCT(
19110b57cec5SDimitry Andric DIGlobalVariable,
19120b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
19130b57cec5SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
19140b57cec5SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
19150b57cec5SDimitry Andric getMDOrNull(Record[10]), nullptr, AlignInBits));
19160b57cec5SDimitry Andric
19170b57cec5SDimitry Andric DIGlobalVariableExpression *DGVE = nullptr;
19180b57cec5SDimitry Andric if (Attach || Expr)
19190b57cec5SDimitry Andric DGVE = DIGlobalVariableExpression::getDistinct(
19200b57cec5SDimitry Andric Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
19210b57cec5SDimitry Andric if (Attach)
19220b57cec5SDimitry Andric Attach->addDebugInfo(DGVE);
19230b57cec5SDimitry Andric
19240b57cec5SDimitry Andric auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
19250b57cec5SDimitry Andric MetadataList.assignValue(MDNode, NextMetadataNo);
19260b57cec5SDimitry Andric NextMetadataNo++;
19270b57cec5SDimitry Andric } else
19280b57cec5SDimitry Andric return error("Invalid record");
19290b57cec5SDimitry Andric
19300b57cec5SDimitry Andric break;
19310b57cec5SDimitry Andric }
19320b57cec5SDimitry Andric case bitc::METADATA_LOCAL_VAR: {
19330b57cec5SDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field.
19340b57cec5SDimitry Andric if (Record.size() < 8 || Record.size() > 10)
19350b57cec5SDimitry Andric return error("Invalid record");
19360b57cec5SDimitry Andric
19370b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
19380b57cec5SDimitry Andric bool HasAlignment = Record[0] & 2;
19390b57cec5SDimitry Andric // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
19400b57cec5SDimitry Andric // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
19410b57cec5SDimitry Andric // this is newer version of record which doesn't have artificial tag.
19420b57cec5SDimitry Andric bool HasTag = !HasAlignment && Record.size() > 8;
19430b57cec5SDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
19440b57cec5SDimitry Andric uint32_t AlignInBits = 0;
19450b57cec5SDimitry Andric if (HasAlignment) {
19460b57cec5SDimitry Andric if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max())
19470b57cec5SDimitry Andric return error("Alignment value is too large");
19480b57cec5SDimitry Andric AlignInBits = Record[8 + HasTag];
19490b57cec5SDimitry Andric }
19500b57cec5SDimitry Andric MetadataList.assignValue(
19510b57cec5SDimitry Andric GET_OR_DISTINCT(DILocalVariable,
19520b57cec5SDimitry Andric (Context, getMDOrNull(Record[1 + HasTag]),
19530b57cec5SDimitry Andric getMDString(Record[2 + HasTag]),
19540b57cec5SDimitry Andric getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
19550b57cec5SDimitry Andric getDITypeRefOrNull(Record[5 + HasTag]),
19560b57cec5SDimitry Andric Record[6 + HasTag], Flags, AlignInBits)),
19570b57cec5SDimitry Andric NextMetadataNo);
19580b57cec5SDimitry Andric NextMetadataNo++;
19590b57cec5SDimitry Andric break;
19600b57cec5SDimitry Andric }
19610b57cec5SDimitry Andric case bitc::METADATA_LABEL: {
19620b57cec5SDimitry Andric if (Record.size() != 5)
19630b57cec5SDimitry Andric return error("Invalid record");
19640b57cec5SDimitry Andric
19650b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
19660b57cec5SDimitry Andric MetadataList.assignValue(
19670b57cec5SDimitry Andric GET_OR_DISTINCT(DILabel,
19680b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]),
19690b57cec5SDimitry Andric getMDString(Record[2]),
19700b57cec5SDimitry Andric getMDOrNull(Record[3]), Record[4])),
19710b57cec5SDimitry Andric NextMetadataNo);
19720b57cec5SDimitry Andric NextMetadataNo++;
19730b57cec5SDimitry Andric break;
19740b57cec5SDimitry Andric }
19750b57cec5SDimitry Andric case bitc::METADATA_EXPRESSION: {
19760b57cec5SDimitry Andric if (Record.size() < 1)
19770b57cec5SDimitry Andric return error("Invalid record");
19780b57cec5SDimitry Andric
19790b57cec5SDimitry Andric IsDistinct = Record[0] & 1;
19800b57cec5SDimitry Andric uint64_t Version = Record[0] >> 1;
19810b57cec5SDimitry Andric auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
19820b57cec5SDimitry Andric
19830b57cec5SDimitry Andric SmallVector<uint64_t, 6> Buffer;
19840b57cec5SDimitry Andric if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
19850b57cec5SDimitry Andric return Err;
19860b57cec5SDimitry Andric
19870b57cec5SDimitry Andric MetadataList.assignValue(
19880b57cec5SDimitry Andric GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo);
19890b57cec5SDimitry Andric NextMetadataNo++;
19900b57cec5SDimitry Andric break;
19910b57cec5SDimitry Andric }
19920b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR: {
19930b57cec5SDimitry Andric if (Record.size() != 3)
19940b57cec5SDimitry Andric return error("Invalid record");
19950b57cec5SDimitry Andric
19960b57cec5SDimitry Andric IsDistinct = Record[0];
19970b57cec5SDimitry Andric Metadata *Expr = getMDOrNull(Record[2]);
19980b57cec5SDimitry Andric if (!Expr)
19990b57cec5SDimitry Andric Expr = DIExpression::get(Context, {});
20000b57cec5SDimitry Andric MetadataList.assignValue(
20010b57cec5SDimitry Andric GET_OR_DISTINCT(DIGlobalVariableExpression,
20020b57cec5SDimitry Andric (Context, getMDOrNull(Record[1]), Expr)),
20030b57cec5SDimitry Andric NextMetadataNo);
20040b57cec5SDimitry Andric NextMetadataNo++;
20050b57cec5SDimitry Andric break;
20060b57cec5SDimitry Andric }
20070b57cec5SDimitry Andric case bitc::METADATA_OBJC_PROPERTY: {
20080b57cec5SDimitry Andric if (Record.size() != 8)
20090b57cec5SDimitry Andric return error("Invalid record");
20100b57cec5SDimitry Andric
20110b57cec5SDimitry Andric IsDistinct = Record[0];
20120b57cec5SDimitry Andric MetadataList.assignValue(
20130b57cec5SDimitry Andric GET_OR_DISTINCT(DIObjCProperty,
20140b57cec5SDimitry Andric (Context, getMDString(Record[1]),
20150b57cec5SDimitry Andric getMDOrNull(Record[2]), Record[3],
20160b57cec5SDimitry Andric getMDString(Record[4]), getMDString(Record[5]),
20170b57cec5SDimitry Andric Record[6], getDITypeRefOrNull(Record[7]))),
20180b57cec5SDimitry Andric NextMetadataNo);
20190b57cec5SDimitry Andric NextMetadataNo++;
20200b57cec5SDimitry Andric break;
20210b57cec5SDimitry Andric }
20220b57cec5SDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: {
20230b57cec5SDimitry Andric if (Record.size() != 6 && Record.size() != 7)
20240b57cec5SDimitry Andric return error("Invalid record");
20250b57cec5SDimitry Andric
20260b57cec5SDimitry Andric IsDistinct = Record[0];
20270b57cec5SDimitry Andric bool HasFile = (Record.size() == 7);
20280b57cec5SDimitry Andric MetadataList.assignValue(
20290b57cec5SDimitry Andric GET_OR_DISTINCT(DIImportedEntity,
20300b57cec5SDimitry Andric (Context, Record[1], getMDOrNull(Record[2]),
20310b57cec5SDimitry Andric getDITypeRefOrNull(Record[3]),
20320b57cec5SDimitry Andric HasFile ? getMDOrNull(Record[6]) : nullptr,
20330b57cec5SDimitry Andric HasFile ? Record[4] : 0, getMDString(Record[5]))),
20340b57cec5SDimitry Andric NextMetadataNo);
20350b57cec5SDimitry Andric NextMetadataNo++;
20360b57cec5SDimitry Andric break;
20370b57cec5SDimitry Andric }
20380b57cec5SDimitry Andric case bitc::METADATA_STRING_OLD: {
20390b57cec5SDimitry Andric std::string String(Record.begin(), Record.end());
20400b57cec5SDimitry Andric
20410b57cec5SDimitry Andric // Test for upgrading !llvm.loop.
20420b57cec5SDimitry Andric HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
20430b57cec5SDimitry Andric ++NumMDStringLoaded;
20440b57cec5SDimitry Andric Metadata *MD = MDString::get(Context, String);
20450b57cec5SDimitry Andric MetadataList.assignValue(MD, NextMetadataNo);
20460b57cec5SDimitry Andric NextMetadataNo++;
20470b57cec5SDimitry Andric break;
20480b57cec5SDimitry Andric }
20490b57cec5SDimitry Andric case bitc::METADATA_STRINGS: {
20500b57cec5SDimitry Andric auto CreateNextMDString = [&](StringRef Str) {
20510b57cec5SDimitry Andric ++NumMDStringLoaded;
20520b57cec5SDimitry Andric MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
20530b57cec5SDimitry Andric NextMetadataNo++;
20540b57cec5SDimitry Andric };
20550b57cec5SDimitry Andric if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
20560b57cec5SDimitry Andric return Err;
20570b57cec5SDimitry Andric break;
20580b57cec5SDimitry Andric }
20590b57cec5SDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
20600b57cec5SDimitry Andric if (Record.size() % 2 == 0)
20610b57cec5SDimitry Andric return error("Invalid record");
20620b57cec5SDimitry Andric unsigned ValueID = Record[0];
20630b57cec5SDimitry Andric if (ValueID >= ValueList.size())
20640b57cec5SDimitry Andric return error("Invalid record");
20650b57cec5SDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
20660b57cec5SDimitry Andric if (Error Err = parseGlobalObjectAttachment(
20670b57cec5SDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1)))
20680b57cec5SDimitry Andric return Err;
20690b57cec5SDimitry Andric break;
20700b57cec5SDimitry Andric }
20710b57cec5SDimitry Andric case bitc::METADATA_KIND: {
20720b57cec5SDimitry Andric // Support older bitcode files that had METADATA_KIND records in a
20730b57cec5SDimitry Andric // block with METADATA_BLOCK_ID.
20740b57cec5SDimitry Andric if (Error Err = parseMetadataKindRecord(Record))
20750b57cec5SDimitry Andric return Err;
20760b57cec5SDimitry Andric break;
20770b57cec5SDimitry Andric }
2078*5f7ddb14SDimitry Andric case bitc::METADATA_ARG_LIST: {
2079*5f7ddb14SDimitry Andric SmallVector<ValueAsMetadata *, 4> Elts;
2080*5f7ddb14SDimitry Andric Elts.reserve(Record.size());
2081*5f7ddb14SDimitry Andric for (uint64_t Elt : Record) {
2082*5f7ddb14SDimitry Andric Metadata *MD = getMD(Elt);
2083*5f7ddb14SDimitry Andric if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())
2084*5f7ddb14SDimitry Andric return error(
2085*5f7ddb14SDimitry Andric "Invalid record: DIArgList should not contain forward refs");
2086*5f7ddb14SDimitry Andric if (!isa<ValueAsMetadata>(MD))
2087*5f7ddb14SDimitry Andric return error("Invalid record");
2088*5f7ddb14SDimitry Andric Elts.push_back(cast<ValueAsMetadata>(MD));
2089*5f7ddb14SDimitry Andric }
2090*5f7ddb14SDimitry Andric
2091*5f7ddb14SDimitry Andric MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);
2092*5f7ddb14SDimitry Andric NextMetadataNo++;
2093*5f7ddb14SDimitry Andric break;
2094*5f7ddb14SDimitry Andric }
20950b57cec5SDimitry Andric }
20960b57cec5SDimitry Andric return Error::success();
20970b57cec5SDimitry Andric #undef GET_OR_DISTINCT
20980b57cec5SDimitry Andric }
20990b57cec5SDimitry Andric
parseMetadataStrings(ArrayRef<uint64_t> Record,StringRef Blob,function_ref<void (StringRef)> CallBack)21000b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
21010b57cec5SDimitry Andric ArrayRef<uint64_t> Record, StringRef Blob,
21020b57cec5SDimitry Andric function_ref<void(StringRef)> CallBack) {
21030b57cec5SDimitry Andric // All the MDStrings in the block are emitted together in a single
21040b57cec5SDimitry Andric // record. The strings are concatenated and stored in a blob along with
21050b57cec5SDimitry Andric // their sizes.
21060b57cec5SDimitry Andric if (Record.size() != 2)
21070b57cec5SDimitry Andric return error("Invalid record: metadata strings layout");
21080b57cec5SDimitry Andric
21090b57cec5SDimitry Andric unsigned NumStrings = Record[0];
21100b57cec5SDimitry Andric unsigned StringsOffset = Record[1];
21110b57cec5SDimitry Andric if (!NumStrings)
21120b57cec5SDimitry Andric return error("Invalid record: metadata strings with no strings");
21130b57cec5SDimitry Andric if (StringsOffset > Blob.size())
21140b57cec5SDimitry Andric return error("Invalid record: metadata strings corrupt offset");
21150b57cec5SDimitry Andric
21160b57cec5SDimitry Andric StringRef Lengths = Blob.slice(0, StringsOffset);
21170b57cec5SDimitry Andric SimpleBitstreamCursor R(Lengths);
21180b57cec5SDimitry Andric
21190b57cec5SDimitry Andric StringRef Strings = Blob.drop_front(StringsOffset);
21200b57cec5SDimitry Andric do {
21210b57cec5SDimitry Andric if (R.AtEndOfStream())
21220b57cec5SDimitry Andric return error("Invalid record: metadata strings bad length");
21230b57cec5SDimitry Andric
21240b57cec5SDimitry Andric Expected<uint32_t> MaybeSize = R.ReadVBR(6);
21250b57cec5SDimitry Andric if (!MaybeSize)
21260b57cec5SDimitry Andric return MaybeSize.takeError();
21270b57cec5SDimitry Andric uint32_t Size = MaybeSize.get();
21280b57cec5SDimitry Andric if (Strings.size() < Size)
21290b57cec5SDimitry Andric return error("Invalid record: metadata strings truncated chars");
21300b57cec5SDimitry Andric
21310b57cec5SDimitry Andric CallBack(Strings.slice(0, Size));
21320b57cec5SDimitry Andric Strings = Strings.drop_front(Size);
21330b57cec5SDimitry Andric } while (--NumStrings);
21340b57cec5SDimitry Andric
21350b57cec5SDimitry Andric return Error::success();
21360b57cec5SDimitry Andric }
21370b57cec5SDimitry Andric
parseGlobalObjectAttachment(GlobalObject & GO,ArrayRef<uint64_t> Record)21380b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
21390b57cec5SDimitry Andric GlobalObject &GO, ArrayRef<uint64_t> Record) {
21400b57cec5SDimitry Andric assert(Record.size() % 2 == 0);
21410b57cec5SDimitry Andric for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
21420b57cec5SDimitry Andric auto K = MDKindMap.find(Record[I]);
21430b57cec5SDimitry Andric if (K == MDKindMap.end())
21440b57cec5SDimitry Andric return error("Invalid ID");
2145af732203SDimitry Andric MDNode *MD =
2146af732203SDimitry Andric dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));
21470b57cec5SDimitry Andric if (!MD)
21480b57cec5SDimitry Andric return error("Invalid metadata attachment: expect fwd ref to MDNode");
21490b57cec5SDimitry Andric GO.addMetadata(K->second, *MD);
21500b57cec5SDimitry Andric }
21510b57cec5SDimitry Andric return Error::success();
21520b57cec5SDimitry Andric }
21530b57cec5SDimitry Andric
21540b57cec5SDimitry Andric /// Parse metadata attachments.
parseMetadataAttachment(Function & F,const SmallVectorImpl<Instruction * > & InstructionList)21550b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
21560b57cec5SDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
21570b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
21580b57cec5SDimitry Andric return Err;
21590b57cec5SDimitry Andric
21600b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record;
21610b57cec5SDimitry Andric PlaceholderQueue Placeholders;
21620b57cec5SDimitry Andric
21630b57cec5SDimitry Andric while (true) {
21640b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
21650b57cec5SDimitry Andric if (!MaybeEntry)
21660b57cec5SDimitry Andric return MaybeEntry.takeError();
21670b57cec5SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
21680b57cec5SDimitry Andric
21690b57cec5SDimitry Andric switch (Entry.Kind) {
21700b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
21710b57cec5SDimitry Andric case BitstreamEntry::Error:
21720b57cec5SDimitry Andric return error("Malformed block");
21730b57cec5SDimitry Andric case BitstreamEntry::EndBlock:
21740b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
21750b57cec5SDimitry Andric return Error::success();
21760b57cec5SDimitry Andric case BitstreamEntry::Record:
21770b57cec5SDimitry Andric // The interesting case.
21780b57cec5SDimitry Andric break;
21790b57cec5SDimitry Andric }
21800b57cec5SDimitry Andric
21810b57cec5SDimitry Andric // Read a metadata attachment record.
21820b57cec5SDimitry Andric Record.clear();
21830b57cec5SDimitry Andric ++NumMDRecordLoaded;
21840b57cec5SDimitry Andric Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
21850b57cec5SDimitry Andric if (!MaybeRecord)
21860b57cec5SDimitry Andric return MaybeRecord.takeError();
21870b57cec5SDimitry Andric switch (MaybeRecord.get()) {
21880b57cec5SDimitry Andric default: // Default behavior: ignore.
21890b57cec5SDimitry Andric break;
21900b57cec5SDimitry Andric case bitc::METADATA_ATTACHMENT: {
21910b57cec5SDimitry Andric unsigned RecordLength = Record.size();
21920b57cec5SDimitry Andric if (Record.empty())
21930b57cec5SDimitry Andric return error("Invalid record");
21940b57cec5SDimitry Andric if (RecordLength % 2 == 0) {
21950b57cec5SDimitry Andric // A function attachment.
21960b57cec5SDimitry Andric if (Error Err = parseGlobalObjectAttachment(F, Record))
21970b57cec5SDimitry Andric return Err;
21980b57cec5SDimitry Andric continue;
21990b57cec5SDimitry Andric }
22000b57cec5SDimitry Andric
22010b57cec5SDimitry Andric // An instruction attachment.
22020b57cec5SDimitry Andric Instruction *Inst = InstructionList[Record[0]];
22030b57cec5SDimitry Andric for (unsigned i = 1; i != RecordLength; i = i + 2) {
22040b57cec5SDimitry Andric unsigned Kind = Record[i];
22050b57cec5SDimitry Andric DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
22060b57cec5SDimitry Andric if (I == MDKindMap.end())
22070b57cec5SDimitry Andric return error("Invalid ID");
22080b57cec5SDimitry Andric if (I->second == LLVMContext::MD_tbaa && StripTBAA)
22090b57cec5SDimitry Andric continue;
22100b57cec5SDimitry Andric
22110b57cec5SDimitry Andric auto Idx = Record[i + 1];
22120b57cec5SDimitry Andric if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
22130b57cec5SDimitry Andric !MetadataList.lookup(Idx)) {
22140b57cec5SDimitry Andric // Load the attachment if it is in the lazy-loadable range and hasn't
22150b57cec5SDimitry Andric // been loaded yet.
22160b57cec5SDimitry Andric lazyLoadOneMetadata(Idx, Placeholders);
22170b57cec5SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
22180b57cec5SDimitry Andric }
22190b57cec5SDimitry Andric
22200b57cec5SDimitry Andric Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
22210b57cec5SDimitry Andric if (isa<LocalAsMetadata>(Node))
22220b57cec5SDimitry Andric // Drop the attachment. This used to be legal, but there's no
22230b57cec5SDimitry Andric // upgrade path.
22240b57cec5SDimitry Andric break;
22250b57cec5SDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(Node);
22260b57cec5SDimitry Andric if (!MD)
22270b57cec5SDimitry Andric return error("Invalid metadata attachment");
22280b57cec5SDimitry Andric
22290b57cec5SDimitry Andric if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
22300b57cec5SDimitry Andric MD = upgradeInstructionLoopAttachment(*MD);
22310b57cec5SDimitry Andric
22320b57cec5SDimitry Andric if (I->second == LLVMContext::MD_tbaa) {
22330b57cec5SDimitry Andric assert(!MD->isTemporary() && "should load MDs before attachments");
22340b57cec5SDimitry Andric MD = UpgradeTBAANode(*MD);
22350b57cec5SDimitry Andric }
22360b57cec5SDimitry Andric Inst->setMetadata(I->second, MD);
22370b57cec5SDimitry Andric }
22380b57cec5SDimitry Andric break;
22390b57cec5SDimitry Andric }
22400b57cec5SDimitry Andric }
22410b57cec5SDimitry Andric }
22420b57cec5SDimitry Andric }
22430b57cec5SDimitry Andric
22440b57cec5SDimitry Andric /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
parseMetadataKindRecord(SmallVectorImpl<uint64_t> & Record)22450b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
22460b57cec5SDimitry Andric SmallVectorImpl<uint64_t> &Record) {
22470b57cec5SDimitry Andric if (Record.size() < 2)
22480b57cec5SDimitry Andric return error("Invalid record");
22490b57cec5SDimitry Andric
22500b57cec5SDimitry Andric unsigned Kind = Record[0];
22510b57cec5SDimitry Andric SmallString<8> Name(Record.begin() + 1, Record.end());
22520b57cec5SDimitry Andric
22530b57cec5SDimitry Andric unsigned NewKind = TheModule.getMDKindID(Name.str());
22540b57cec5SDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
22550b57cec5SDimitry Andric return error("Conflicting METADATA_KIND records");
22560b57cec5SDimitry Andric return Error::success();
22570b57cec5SDimitry Andric }
22580b57cec5SDimitry Andric
22590b57cec5SDimitry Andric /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
parseMetadataKinds()22600b57cec5SDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
22610b57cec5SDimitry Andric if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
22620b57cec5SDimitry Andric return Err;
22630b57cec5SDimitry Andric
22640b57cec5SDimitry Andric SmallVector<uint64_t, 64> Record;
22650b57cec5SDimitry Andric
22660b57cec5SDimitry Andric // Read all the records.
22670b57cec5SDimitry Andric while (true) {
22680b57cec5SDimitry Andric Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
22690b57cec5SDimitry Andric if (!MaybeEntry)
22700b57cec5SDimitry Andric return MaybeEntry.takeError();
22710b57cec5SDimitry Andric BitstreamEntry Entry = MaybeEntry.get();
22720b57cec5SDimitry Andric
22730b57cec5SDimitry Andric switch (Entry.Kind) {
22740b57cec5SDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
22750b57cec5SDimitry Andric case BitstreamEntry::Error:
22760b57cec5SDimitry Andric return error("Malformed block");
22770b57cec5SDimitry Andric case BitstreamEntry::EndBlock:
22780b57cec5SDimitry Andric return Error::success();
22790b57cec5SDimitry Andric case BitstreamEntry::Record:
22800b57cec5SDimitry Andric // The interesting case.
22810b57cec5SDimitry Andric break;
22820b57cec5SDimitry Andric }
22830b57cec5SDimitry Andric
22840b57cec5SDimitry Andric // Read a record.
22850b57cec5SDimitry Andric Record.clear();
22860b57cec5SDimitry Andric ++NumMDRecordLoaded;
22870b57cec5SDimitry Andric Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
22880b57cec5SDimitry Andric if (!MaybeCode)
22890b57cec5SDimitry Andric return MaybeCode.takeError();
22900b57cec5SDimitry Andric switch (MaybeCode.get()) {
22910b57cec5SDimitry Andric default: // Default behavior: ignore.
22920b57cec5SDimitry Andric break;
22930b57cec5SDimitry Andric case bitc::METADATA_KIND: {
22940b57cec5SDimitry Andric if (Error Err = parseMetadataKindRecord(Record))
22950b57cec5SDimitry Andric return Err;
22960b57cec5SDimitry Andric break;
22970b57cec5SDimitry Andric }
22980b57cec5SDimitry Andric }
22990b57cec5SDimitry Andric }
23000b57cec5SDimitry Andric }
23010b57cec5SDimitry Andric
operator =(MetadataLoader && RHS)23020b57cec5SDimitry Andric MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
23030b57cec5SDimitry Andric Pimpl = std::move(RHS.Pimpl);
23040b57cec5SDimitry Andric return *this;
23050b57cec5SDimitry Andric }
MetadataLoader(MetadataLoader && RHS)23060b57cec5SDimitry Andric MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
23070b57cec5SDimitry Andric : Pimpl(std::move(RHS.Pimpl)) {}
23080b57cec5SDimitry Andric
23090b57cec5SDimitry Andric MetadataLoader::~MetadataLoader() = default;
MetadataLoader(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,bool IsImporting,std::function<Type * (unsigned)> getTypeByID)23100b57cec5SDimitry Andric MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
23110b57cec5SDimitry Andric BitcodeReaderValueList &ValueList,
23120b57cec5SDimitry Andric bool IsImporting,
23130b57cec5SDimitry Andric std::function<Type *(unsigned)> getTypeByID)
23148bcb0991SDimitry Andric : Pimpl(std::make_unique<MetadataLoaderImpl>(
23150b57cec5SDimitry Andric Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
23160b57cec5SDimitry Andric
parseMetadata(bool ModuleLevel)23170b57cec5SDimitry Andric Error MetadataLoader::parseMetadata(bool ModuleLevel) {
23180b57cec5SDimitry Andric return Pimpl->parseMetadata(ModuleLevel);
23190b57cec5SDimitry Andric }
23200b57cec5SDimitry Andric
hasFwdRefs() const23210b57cec5SDimitry Andric bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
23220b57cec5SDimitry Andric
23230b57cec5SDimitry Andric /// Return the given metadata, creating a replaceable forward reference if
23240b57cec5SDimitry Andric /// necessary.
getMetadataFwdRefOrLoad(unsigned Idx)23250b57cec5SDimitry Andric Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
23260b57cec5SDimitry Andric return Pimpl->getMetadataFwdRefOrLoad(Idx);
23270b57cec5SDimitry Andric }
23280b57cec5SDimitry Andric
lookupSubprogramForFunction(Function * F)23290b57cec5SDimitry Andric DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
23300b57cec5SDimitry Andric return Pimpl->lookupSubprogramForFunction(F);
23310b57cec5SDimitry Andric }
23320b57cec5SDimitry Andric
parseMetadataAttachment(Function & F,const SmallVectorImpl<Instruction * > & InstructionList)23330b57cec5SDimitry Andric Error MetadataLoader::parseMetadataAttachment(
23340b57cec5SDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
23350b57cec5SDimitry Andric return Pimpl->parseMetadataAttachment(F, InstructionList);
23360b57cec5SDimitry Andric }
23370b57cec5SDimitry Andric
parseMetadataKinds()23380b57cec5SDimitry Andric Error MetadataLoader::parseMetadataKinds() {
23390b57cec5SDimitry Andric return Pimpl->parseMetadataKinds();
23400b57cec5SDimitry Andric }
23410b57cec5SDimitry Andric
setStripTBAA(bool StripTBAA)23420b57cec5SDimitry Andric void MetadataLoader::setStripTBAA(bool StripTBAA) {
23430b57cec5SDimitry Andric return Pimpl->setStripTBAA(StripTBAA);
23440b57cec5SDimitry Andric }
23450b57cec5SDimitry Andric
isStrippingTBAA()23460b57cec5SDimitry Andric bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
23470b57cec5SDimitry Andric
size() const23480b57cec5SDimitry Andric unsigned MetadataLoader::size() const { return Pimpl->size(); }
shrinkTo(unsigned N)23490b57cec5SDimitry Andric void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
23500b57cec5SDimitry Andric
upgradeDebugIntrinsics(Function & F)23510b57cec5SDimitry Andric void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
23520b57cec5SDimitry Andric return Pimpl->upgradeDebugIntrinsics(F);
23530b57cec5SDimitry Andric }
2354