1ef27db87SMehdi Amini //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===// 2ef27db87SMehdi Amini // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6ef27db87SMehdi Amini // 7ef27db87SMehdi Amini //===----------------------------------------------------------------------===// 8ef27db87SMehdi Amini 9ef27db87SMehdi Amini #include "MetadataLoader.h" 10ef27db87SMehdi Amini #include "ValueList.h" 11ef27db87SMehdi Amini 12ef27db87SMehdi Amini #include "llvm/ADT/APFloat.h" 13ef27db87SMehdi Amini #include "llvm/ADT/APInt.h" 14ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h" 15ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h" 1619ef4fadSMehdi Amini #include "llvm/ADT/DenseSet.h" 17ef27db87SMehdi Amini #include "llvm/ADT/None.h" 18ef27db87SMehdi Amini #include "llvm/ADT/STLExtras.h" 19ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h" 2019ef4fadSMehdi Amini #include "llvm/ADT/Statistic.h" 21ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h" 22ef27db87SMehdi Amini #include "llvm/ADT/Twine.h" 23ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h" 24e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h" 25ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h" 26ef27db87SMehdi Amini #include "llvm/IR/Argument.h" 27ef27db87SMehdi Amini #include "llvm/IR/Attributes.h" 28ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h" 29ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h" 30ef27db87SMehdi Amini #include "llvm/IR/CallingConv.h" 31ef27db87SMehdi Amini #include "llvm/IR/Comdat.h" 32ef27db87SMehdi Amini #include "llvm/IR/Constant.h" 33ef27db87SMehdi Amini #include "llvm/IR/Constants.h" 34ef27db87SMehdi Amini #include "llvm/IR/DebugInfo.h" 35ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h" 36ef27db87SMehdi Amini #include "llvm/IR/DebugLoc.h" 37ef27db87SMehdi Amini #include "llvm/IR/DerivedTypes.h" 38ef27db87SMehdi Amini #include "llvm/IR/DiagnosticPrinter.h" 39ef27db87SMehdi Amini #include "llvm/IR/Function.h" 40ef27db87SMehdi Amini #include "llvm/IR/GVMaterializer.h" 41ef27db87SMehdi Amini #include "llvm/IR/GlobalAlias.h" 42ef27db87SMehdi Amini #include "llvm/IR/GlobalIFunc.h" 43ef27db87SMehdi Amini #include "llvm/IR/GlobalIndirectSymbol.h" 44ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h" 45ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h" 46ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h" 47ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h" 48ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h" 49ef27db87SMehdi Amini #include "llvm/IR/Instruction.h" 50ef27db87SMehdi Amini #include "llvm/IR/Instructions.h" 516825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h" 526bda14b3SChandler Carruth #include "llvm/IR/Intrinsics.h" 53ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h" 54ef27db87SMehdi Amini #include "llvm/IR/Module.h" 55ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h" 56ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h" 57ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h" 58ef27db87SMehdi Amini #include "llvm/IR/Type.h" 59ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h" 60ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h" 61ef27db87SMehdi Amini #include "llvm/Support/Casting.h" 62ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h" 63ef27db87SMehdi Amini #include "llvm/Support/Compiler.h" 64ef27db87SMehdi Amini #include "llvm/Support/Debug.h" 65ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h" 66ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h" 67ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h" 68ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h" 69ef27db87SMehdi Amini #include <algorithm> 70ef27db87SMehdi Amini #include <cassert> 71ef27db87SMehdi Amini #include <cstddef> 72ef27db87SMehdi Amini #include <cstdint> 73ef27db87SMehdi Amini #include <deque> 74ef27db87SMehdi Amini #include <limits> 75ef27db87SMehdi Amini #include <map> 76ef27db87SMehdi Amini #include <string> 77ef27db87SMehdi Amini #include <system_error> 78ef27db87SMehdi Amini #include <tuple> 79ef27db87SMehdi Amini #include <utility> 80ef27db87SMehdi Amini #include <vector> 81ef27db87SMehdi Amini 82ef27db87SMehdi Amini using namespace llvm; 83ef27db87SMehdi Amini 8419ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader" 8519ef4fadSMehdi Amini 8619ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded"); 8719ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created"); 8819ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded"); 8919ef4fadSMehdi Amini 90a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO. 91a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB. 92a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions( 93a61f5e37STeresa Johnson "import-full-type-definitions", cl::init(false), cl::Hidden, 94a61f5e37STeresa Johnson cl::desc("Import full type definitions for ThinLTO.")); 95a61f5e37STeresa Johnson 9619ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading( 9719ef4fadSMehdi Amini "disable-ondemand-mds-loading", cl::init(false), cl::Hidden, 9819ef4fadSMehdi Amini cl::desc("Force disable the lazy-loading on-demand of metadata when " 9919ef4fadSMehdi Amini "loading bitcode for importing.")); 10019ef4fadSMehdi Amini 101ef27db87SMehdi Amini namespace { 102ef27db87SMehdi Amini 103aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; } 104ef27db87SMehdi Amini 105ef27db87SMehdi Amini class BitcodeReaderMetadataList { 106ef27db87SMehdi Amini /// Array of metadata references. 107ef27db87SMehdi Amini /// 108ef27db87SMehdi Amini /// Don't use std::vector here. Some versions of libc++ copy (instead of 109ef27db87SMehdi Amini /// move) on resize, and TrackingMDRef is very expensive to copy. 110ef27db87SMehdi Amini SmallVector<TrackingMDRef, 1> MetadataPtrs; 111ef27db87SMehdi Amini 112690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of forward references that were 113690952d1SMehdi Amini /// generated. 114690952d1SMehdi Amini SmallDenseSet<unsigned, 1> ForwardReference; 115690952d1SMehdi Amini 116690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of Metadata that need to be 117690952d1SMehdi Amini /// resolved. 118690952d1SMehdi Amini SmallDenseSet<unsigned, 1> UnresolvedNodes; 119690952d1SMehdi Amini 120ef27db87SMehdi Amini /// Structures for resolving old type refs. 121ef27db87SMehdi Amini struct { 122ef27db87SMehdi Amini SmallDenseMap<MDString *, TempMDTuple, 1> Unknown; 123ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> Final; 124ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls; 125ef27db87SMehdi Amini SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays; 126ef27db87SMehdi Amini } OldTypeRefs; 127ef27db87SMehdi Amini 128ef27db87SMehdi Amini LLVMContext &Context; 129ef27db87SMehdi Amini 130864474c9SFlorian Hahn /// Maximum number of valid references. Forward references exceeding the 131864474c9SFlorian Hahn /// maximum must be invalid. 132864474c9SFlorian Hahn unsigned RefsUpperBound; 133864474c9SFlorian Hahn 134ef27db87SMehdi Amini public: 135864474c9SFlorian Hahn BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound) 136864474c9SFlorian Hahn : Context(C), 137864474c9SFlorian Hahn RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(), 138864474c9SFlorian Hahn RefsUpperBound)) {} 139ef27db87SMehdi Amini 140ef27db87SMehdi Amini // vector compatibility methods 141ef27db87SMehdi Amini unsigned size() const { return MetadataPtrs.size(); } 142ef27db87SMehdi Amini void resize(unsigned N) { MetadataPtrs.resize(N); } 143ef27db87SMehdi Amini void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); } 144ef27db87SMehdi Amini void clear() { MetadataPtrs.clear(); } 145ef27db87SMehdi Amini Metadata *back() const { return MetadataPtrs.back(); } 146ef27db87SMehdi Amini void pop_back() { MetadataPtrs.pop_back(); } 147ef27db87SMehdi Amini bool empty() const { return MetadataPtrs.empty(); } 148ef27db87SMehdi Amini 149ef27db87SMehdi Amini Metadata *operator[](unsigned i) const { 150ef27db87SMehdi Amini assert(i < MetadataPtrs.size()); 151ef27db87SMehdi Amini return MetadataPtrs[i]; 152ef27db87SMehdi Amini } 153ef27db87SMehdi Amini 154ef27db87SMehdi Amini Metadata *lookup(unsigned I) const { 155ef27db87SMehdi Amini if (I < MetadataPtrs.size()) 156ef27db87SMehdi Amini return MetadataPtrs[I]; 157ef27db87SMehdi Amini return nullptr; 158ef27db87SMehdi Amini } 159ef27db87SMehdi Amini 160ef27db87SMehdi Amini void shrinkTo(unsigned N) { 161ef27db87SMehdi Amini assert(N <= size() && "Invalid shrinkTo request!"); 162690952d1SMehdi Amini assert(ForwardReference.empty() && "Unexpected forward refs"); 163690952d1SMehdi Amini assert(UnresolvedNodes.empty() && "Unexpected unresolved node"); 164ef27db87SMehdi Amini MetadataPtrs.resize(N); 165ef27db87SMehdi Amini } 166ef27db87SMehdi Amini 167ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 168ef27db87SMehdi Amini /// necessary. 169ef27db87SMehdi Amini Metadata *getMetadataFwdRef(unsigned Idx); 170ef27db87SMehdi Amini 1718f976ba0SHiroshi Inoue /// Return the given metadata only if it is fully resolved. 172ef27db87SMehdi Amini /// 173ef27db87SMehdi Amini /// Gives the same result as \a lookup(), unless \a MDNode::isResolved() 174ef27db87SMehdi Amini /// would give \c false. 175ef27db87SMehdi Amini Metadata *getMetadataIfResolved(unsigned Idx); 176ef27db87SMehdi Amini 177ef27db87SMehdi Amini MDNode *getMDNodeFwdRefOrNull(unsigned Idx); 178ef27db87SMehdi Amini void assignValue(Metadata *MD, unsigned Idx); 179ef27db87SMehdi Amini void tryToResolveCycles(); 180690952d1SMehdi Amini bool hasFwdRefs() const { return !ForwardReference.empty(); } 18119ef4fadSMehdi Amini int getNextFwdRef() { 18219ef4fadSMehdi Amini assert(hasFwdRefs()); 18319ef4fadSMehdi Amini return *ForwardReference.begin(); 18419ef4fadSMehdi Amini } 185ef27db87SMehdi Amini 186ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference. 187ef27db87SMehdi Amini void addTypeRef(MDString &UUID, DICompositeType &CT); 188ef27db87SMehdi Amini 189ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference. 190ef27db87SMehdi Amini Metadata *upgradeTypeRef(Metadata *MaybeUUID); 191ef27db87SMehdi Amini 192ef27db87SMehdi Amini /// Upgrade a type ref array that may have MDString references. 193ef27db87SMehdi Amini Metadata *upgradeTypeRefArray(Metadata *MaybeTuple); 194ef27db87SMehdi Amini 195ef27db87SMehdi Amini private: 196ef27db87SMehdi Amini Metadata *resolveTypeRefArray(Metadata *MaybeTuple); 197ef27db87SMehdi Amini }; 198ef27db87SMehdi Amini 199ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) { 200690952d1SMehdi Amini if (auto *MDN = dyn_cast<MDNode>(MD)) 201690952d1SMehdi Amini if (!MDN->isResolved()) 202690952d1SMehdi Amini UnresolvedNodes.insert(Idx); 203690952d1SMehdi Amini 204ef27db87SMehdi Amini if (Idx == size()) { 205ef27db87SMehdi Amini push_back(MD); 206ef27db87SMehdi Amini return; 207ef27db87SMehdi Amini } 208ef27db87SMehdi Amini 209ef27db87SMehdi Amini if (Idx >= size()) 210ef27db87SMehdi Amini resize(Idx + 1); 211ef27db87SMehdi Amini 212ef27db87SMehdi Amini TrackingMDRef &OldMD = MetadataPtrs[Idx]; 213ef27db87SMehdi Amini if (!OldMD) { 214ef27db87SMehdi Amini OldMD.reset(MD); 215ef27db87SMehdi Amini return; 216ef27db87SMehdi Amini } 217ef27db87SMehdi Amini 218ef27db87SMehdi Amini // If there was a forward reference to this value, replace it. 219ef27db87SMehdi Amini TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 220ef27db87SMehdi Amini PrevMD->replaceAllUsesWith(MD); 221690952d1SMehdi Amini ForwardReference.erase(Idx); 222ef27db87SMehdi Amini } 223ef27db87SMehdi Amini 224ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) { 225864474c9SFlorian Hahn // Bail out for a clearly invalid value. 226864474c9SFlorian Hahn if (Idx >= RefsUpperBound) 227864474c9SFlorian Hahn return nullptr; 228864474c9SFlorian Hahn 229ef27db87SMehdi Amini if (Idx >= size()) 230ef27db87SMehdi Amini resize(Idx + 1); 231ef27db87SMehdi Amini 232ef27db87SMehdi Amini if (Metadata *MD = MetadataPtrs[Idx]) 233ef27db87SMehdi Amini return MD; 234ef27db87SMehdi Amini 235ef27db87SMehdi Amini // Track forward refs to be resolved later. 236690952d1SMehdi Amini ForwardReference.insert(Idx); 237ef27db87SMehdi Amini 238ef27db87SMehdi Amini // Create and return a placeholder, which will later be RAUW'd. 23919ef4fadSMehdi Amini ++NumMDNodeTemporary; 240ef27db87SMehdi Amini Metadata *MD = MDNode::getTemporary(Context, None).release(); 241ef27db87SMehdi Amini MetadataPtrs[Idx].reset(MD); 242ef27db87SMehdi Amini return MD; 243ef27db87SMehdi Amini } 244ef27db87SMehdi Amini 245ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) { 246ef27db87SMehdi Amini Metadata *MD = lookup(Idx); 247ef27db87SMehdi Amini if (auto *N = dyn_cast_or_null<MDNode>(MD)) 248ef27db87SMehdi Amini if (!N->isResolved()) 249ef27db87SMehdi Amini return nullptr; 250ef27db87SMehdi Amini return MD; 251ef27db87SMehdi Amini } 252ef27db87SMehdi Amini 253ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) { 254ef27db87SMehdi Amini return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx)); 255ef27db87SMehdi Amini } 256ef27db87SMehdi Amini 257ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() { 258690952d1SMehdi Amini if (!ForwardReference.empty()) 259ef27db87SMehdi Amini // Still forward references... can't resolve cycles. 260ef27db87SMehdi Amini return; 261ef27db87SMehdi Amini 262ef27db87SMehdi Amini // Give up on finding a full definition for any forward decls that remain. 263ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.FwdDecls) 264ef27db87SMehdi Amini OldTypeRefs.Final.insert(Ref); 265ef27db87SMehdi Amini OldTypeRefs.FwdDecls.clear(); 266ef27db87SMehdi Amini 267ef27db87SMehdi Amini // Upgrade from old type ref arrays. In strange cases, this could add to 268ef27db87SMehdi Amini // OldTypeRefs.Unknown. 269690952d1SMehdi Amini for (const auto &Array : OldTypeRefs.Arrays) 270ef27db87SMehdi Amini Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get())); 271ef27db87SMehdi Amini OldTypeRefs.Arrays.clear(); 272ef27db87SMehdi Amini 273ef27db87SMehdi Amini // Replace old string-based type refs with the resolved node, if possible. 274ef27db87SMehdi Amini // If we haven't seen the node, leave it to the verifier to complain about 275ef27db87SMehdi Amini // the invalid string reference. 276ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.Unknown) { 277ef27db87SMehdi Amini if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first)) 278ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(CT); 279ef27db87SMehdi Amini else 280ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(Ref.first); 281ef27db87SMehdi Amini } 282ef27db87SMehdi Amini OldTypeRefs.Unknown.clear(); 283ef27db87SMehdi Amini 284690952d1SMehdi Amini if (UnresolvedNodes.empty()) 285ef27db87SMehdi Amini // Nothing to do. 286ef27db87SMehdi Amini return; 287ef27db87SMehdi Amini 288ef27db87SMehdi Amini // Resolve any cycles. 289690952d1SMehdi Amini for (unsigned I : UnresolvedNodes) { 290ef27db87SMehdi Amini auto &MD = MetadataPtrs[I]; 291ef27db87SMehdi Amini auto *N = dyn_cast_or_null<MDNode>(MD); 292ef27db87SMehdi Amini if (!N) 293ef27db87SMehdi Amini continue; 294ef27db87SMehdi Amini 295ef27db87SMehdi Amini assert(!N->isTemporary() && "Unexpected forward reference"); 296ef27db87SMehdi Amini N->resolveCycles(); 297ef27db87SMehdi Amini } 298ef27db87SMehdi Amini 299690952d1SMehdi Amini // Make sure we return early again until there's another unresolved ref. 300690952d1SMehdi Amini UnresolvedNodes.clear(); 301ef27db87SMehdi Amini } 302ef27db87SMehdi Amini 303ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID, 304ef27db87SMehdi Amini DICompositeType &CT) { 305ef27db87SMehdi Amini assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID"); 306ef27db87SMehdi Amini if (CT.isForwardDecl()) 307ef27db87SMehdi Amini OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT)); 308ef27db87SMehdi Amini else 309ef27db87SMehdi Amini OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT)); 310ef27db87SMehdi Amini } 311ef27db87SMehdi Amini 312ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) { 313ef27db87SMehdi Amini auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID); 314ef27db87SMehdi Amini if (LLVM_LIKELY(!UUID)) 315ef27db87SMehdi Amini return MaybeUUID; 316ef27db87SMehdi Amini 317ef27db87SMehdi Amini if (auto *CT = OldTypeRefs.Final.lookup(UUID)) 318ef27db87SMehdi Amini return CT; 319ef27db87SMehdi Amini 320ef27db87SMehdi Amini auto &Ref = OldTypeRefs.Unknown[UUID]; 321ef27db87SMehdi Amini if (!Ref) 322ef27db87SMehdi Amini Ref = MDNode::getTemporary(Context, None); 323ef27db87SMehdi Amini return Ref.get(); 324ef27db87SMehdi Amini } 325ef27db87SMehdi Amini 326ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) { 327ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 328ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct()) 329ef27db87SMehdi Amini return MaybeTuple; 330ef27db87SMehdi Amini 331ef27db87SMehdi Amini // Look through the array immediately if possible. 332ef27db87SMehdi Amini if (!Tuple->isTemporary()) 333ef27db87SMehdi Amini return resolveTypeRefArray(Tuple); 334ef27db87SMehdi Amini 335ef27db87SMehdi Amini // Create and return a placeholder to use for now. Eventually 336ef27db87SMehdi Amini // resolveTypeRefArrays() will be resolve this forward reference. 337ef27db87SMehdi Amini OldTypeRefs.Arrays.emplace_back( 338ef27db87SMehdi Amini std::piecewise_construct, std::forward_as_tuple(Tuple), 339ef27db87SMehdi Amini std::forward_as_tuple(MDTuple::getTemporary(Context, None))); 340ef27db87SMehdi Amini return OldTypeRefs.Arrays.back().second.get(); 341ef27db87SMehdi Amini } 342ef27db87SMehdi Amini 343ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) { 344ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 345ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct()) 346ef27db87SMehdi Amini return MaybeTuple; 347ef27db87SMehdi Amini 348da82ce99SFangrui Song // Look through the DITypeRefArray, upgrading each DIType *. 349ef27db87SMehdi Amini SmallVector<Metadata *, 32> Ops; 350ef27db87SMehdi Amini Ops.reserve(Tuple->getNumOperands()); 351ef27db87SMehdi Amini for (Metadata *MD : Tuple->operands()) 352ef27db87SMehdi Amini Ops.push_back(upgradeTypeRef(MD)); 353ef27db87SMehdi Amini 354ef27db87SMehdi Amini return MDTuple::get(Context, Ops); 355ef27db87SMehdi Amini } 356ef27db87SMehdi Amini 357ef27db87SMehdi Amini namespace { 358ef27db87SMehdi Amini 359ef27db87SMehdi Amini class PlaceholderQueue { 360ef27db87SMehdi Amini // Placeholders would thrash around when moved, so store in a std::deque 361ef27db87SMehdi Amini // instead of some sort of vector. 362ef27db87SMehdi Amini std::deque<DistinctMDOperandPlaceholder> PHs; 363ef27db87SMehdi Amini 364ef27db87SMehdi Amini public: 36527379892SMehdi Amini ~PlaceholderQueue() { 36627379892SMehdi Amini assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed"); 36727379892SMehdi Amini } 368bd76f372SSimon Pilgrim bool empty() const { return PHs.empty(); } 369ef27db87SMehdi Amini DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID); 370ef27db87SMehdi Amini void flush(BitcodeReaderMetadataList &MetadataList); 37119ef4fadSMehdi Amini 37219ef4fadSMehdi Amini /// Return the list of temporaries nodes in the queue, these need to be 37319ef4fadSMehdi Amini /// loaded before we can flush the queue. 37419ef4fadSMehdi Amini void getTemporaries(BitcodeReaderMetadataList &MetadataList, 37519ef4fadSMehdi Amini DenseSet<unsigned> &Temporaries) { 37619ef4fadSMehdi Amini for (auto &PH : PHs) { 37719ef4fadSMehdi Amini auto ID = PH.getID(); 37819ef4fadSMehdi Amini auto *MD = MetadataList.lookup(ID); 37919ef4fadSMehdi Amini if (!MD) { 38019ef4fadSMehdi Amini Temporaries.insert(ID); 38119ef4fadSMehdi Amini continue; 38219ef4fadSMehdi Amini } 38319ef4fadSMehdi Amini auto *N = dyn_cast_or_null<MDNode>(MD); 38419ef4fadSMehdi Amini if (N && N->isTemporary()) 38519ef4fadSMehdi Amini Temporaries.insert(ID); 38619ef4fadSMehdi Amini } 38719ef4fadSMehdi Amini } 388ef27db87SMehdi Amini }; 389ef27db87SMehdi Amini 390ef27db87SMehdi Amini } // end anonymous namespace 391ef27db87SMehdi Amini 392ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) { 393ef27db87SMehdi Amini PHs.emplace_back(ID); 394ef27db87SMehdi Amini return PHs.back(); 395ef27db87SMehdi Amini } 396ef27db87SMehdi Amini 397ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) { 398ef27db87SMehdi Amini while (!PHs.empty()) { 3994f90ee00SMehdi Amini auto *MD = MetadataList.lookup(PHs.front().getID()); 4004f90ee00SMehdi Amini assert(MD && "Flushing placeholder on unassigned MD"); 4015ae6170fSMehdi Amini #ifndef NDEBUG 4024f90ee00SMehdi Amini if (auto *MDN = dyn_cast<MDNode>(MD)) 4035ae6170fSMehdi Amini assert(MDN->isResolved() && 4045ae6170fSMehdi Amini "Flushing Placeholder while cycles aren't resolved"); 4055ae6170fSMehdi Amini #endif 4065ae6170fSMehdi Amini PHs.front().replaceUseWith(MD); 407ef27db87SMehdi Amini PHs.pop_front(); 408ef27db87SMehdi Amini } 409ef27db87SMehdi Amini } 410ef27db87SMehdi Amini 411d68904f9SJames Henderson } // anonymous namespace 412ef27db87SMehdi Amini 413ffc498dfSFlorian Hahn static Error error(const Twine &Message) { 414ffc498dfSFlorian Hahn return make_error<StringError>( 415ffc498dfSFlorian Hahn Message, make_error_code(BitcodeError::CorruptedBitcode)); 416ffc498dfSFlorian Hahn } 417ffc498dfSFlorian Hahn 418ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl { 419ef27db87SMehdi Amini BitcodeReaderMetadataList MetadataList; 420ef27db87SMehdi Amini BitcodeReaderValueList &ValueList; 421ef27db87SMehdi Amini BitstreamCursor &Stream; 422ef27db87SMehdi Amini LLVMContext &Context; 423ef27db87SMehdi Amini Module &TheModule; 424ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID; 425ef27db87SMehdi Amini 42619ef4fadSMehdi Amini /// Cursor associated with the lazy-loading of Metadata. This is the easy way 42719ef4fadSMehdi Amini /// to keep around the right "context" (Abbrev list) to be able to jump in 42819ef4fadSMehdi Amini /// the middle of the metadata block and load any record. 42919ef4fadSMehdi Amini BitstreamCursor IndexCursor; 43019ef4fadSMehdi Amini 43119ef4fadSMehdi Amini /// Index that keeps track of MDString values. 43219ef4fadSMehdi Amini std::vector<StringRef> MDStringRef; 43319ef4fadSMehdi Amini 43419ef4fadSMehdi Amini /// On-demand loading of a single MDString. Requires the index above to be 43519ef4fadSMehdi Amini /// populated. 43619ef4fadSMehdi Amini MDString *lazyLoadOneMDString(unsigned Idx); 43719ef4fadSMehdi Amini 43819ef4fadSMehdi Amini /// Index that keeps track of where to find a metadata record in the stream. 43919ef4fadSMehdi Amini std::vector<uint64_t> GlobalMetadataBitPosIndex; 44019ef4fadSMehdi Amini 441c27ab339STeresa Johnson /// Cursor position of the start of the global decl attachments, to enable 442c27ab339STeresa Johnson /// loading using the index built for lazy loading, instead of forward 443c27ab339STeresa Johnson /// references. 444c27ab339STeresa Johnson uint64_t GlobalDeclAttachmentPos = 0; 445c27ab339STeresa Johnson 446c27ab339STeresa Johnson #ifndef NDEBUG 447c27ab339STeresa Johnson /// Sanity check that we end up parsing all of the global decl attachments. 448c27ab339STeresa Johnson unsigned NumGlobalDeclAttachSkipped = 0; 449c27ab339STeresa Johnson unsigned NumGlobalDeclAttachParsed = 0; 450c27ab339STeresa Johnson #endif 451c27ab339STeresa Johnson 452c27ab339STeresa Johnson /// Load the global decl attachments, using the index built for lazy loading. 453c27ab339STeresa Johnson Expected<bool> loadGlobalDeclAttachments(); 454c27ab339STeresa Johnson 45519ef4fadSMehdi Amini /// Populate the index above to enable lazily loading of metadata, and load 45619ef4fadSMehdi Amini /// the named metadata as well as the transitively referenced global 45719ef4fadSMehdi Amini /// Metadata. 45842ef1990SMehdi Amini Expected<bool> lazyLoadModuleMetadataBlock(); 45919ef4fadSMehdi Amini 46019ef4fadSMehdi Amini /// On-demand loading of a single metadata. Requires the index above to be 46119ef4fadSMehdi Amini /// populated. 46219ef4fadSMehdi Amini void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders); 46319ef4fadSMehdi Amini 4649f926f70SMehdi Amini // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to 4659f926f70SMehdi Amini // point from SP to CU after a block is completly parsed. 4669f926f70SMehdi Amini std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms; 4679f926f70SMehdi Amini 468ef27db87SMehdi Amini /// Functions that need to be matched with subprograms when upgrading old 469ef27db87SMehdi Amini /// metadata. 470ef27db87SMehdi Amini SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs; 471ef27db87SMehdi Amini 472ef27db87SMehdi Amini // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 473ef27db87SMehdi Amini DenseMap<unsigned, unsigned> MDKindMap; 474ef27db87SMehdi Amini 4758662305bSMehdi Amini bool StripTBAA = false; 476ef27db87SMehdi Amini bool HasSeenOldLoopTags = false; 477e37d3144SAdrian Prantl bool NeedUpgradeToDIGlobalVariableExpression = false; 4786825fb64SAdrian Prantl bool NeedDeclareExpressionUpgrade = false; 479ef27db87SMehdi Amini 480ec68dd49SMehdi Amini /// True if metadata is being parsed for a module being ThinLTO imported. 481ec68dd49SMehdi Amini bool IsImporting = false; 482ec68dd49SMehdi Amini 4839f926f70SMehdi Amini Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code, 4849f926f70SMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob, 485ef27db87SMehdi Amini unsigned &NextMetadataNo); 48619ef4fadSMehdi Amini Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob, 487061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack); 488ef27db87SMehdi Amini Error parseGlobalObjectAttachment(GlobalObject &GO, 489ef27db87SMehdi Amini ArrayRef<uint64_t> Record); 490ef27db87SMehdi Amini Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record); 491ef27db87SMehdi Amini 49219ef4fadSMehdi Amini void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders); 49319ef4fadSMehdi Amini 49419ef4fadSMehdi Amini /// Upgrade old-style CU <-> SP pointers to point from SP to CU. 49519ef4fadSMehdi Amini void upgradeCUSubprograms() { 49619ef4fadSMehdi Amini for (auto CU_SP : CUSubprograms) 49719ef4fadSMehdi Amini if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second)) 49819ef4fadSMehdi Amini for (auto &Op : SPs->operands()) 4999d2f019fSAdrian Prantl if (auto *SP = dyn_cast_or_null<DISubprogram>(Op)) 5009d2f019fSAdrian Prantl SP->replaceUnit(CU_SP.first); 50119ef4fadSMehdi Amini CUSubprograms.clear(); 50219ef4fadSMehdi Amini } 50319ef4fadSMehdi Amini 504e37d3144SAdrian Prantl /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions. 505e37d3144SAdrian Prantl void upgradeCUVariables() { 506e37d3144SAdrian Prantl if (!NeedUpgradeToDIGlobalVariableExpression) 507e37d3144SAdrian Prantl return; 508e37d3144SAdrian Prantl 509e37d3144SAdrian Prantl // Upgrade list of variables attached to the CUs. 510e37d3144SAdrian Prantl if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) 511e37d3144SAdrian Prantl for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) { 512e37d3144SAdrian Prantl auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I)); 513e37d3144SAdrian Prantl if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables())) 514e37d3144SAdrian Prantl for (unsigned I = 0; I < GVs->getNumOperands(); I++) 515e37d3144SAdrian Prantl if (auto *GV = 516e37d3144SAdrian Prantl dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) { 51705782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct( 51805782218SAdrian Prantl Context, GV, DIExpression::get(Context, {})); 519e37d3144SAdrian Prantl GVs->replaceOperandWith(I, DGVE); 520e37d3144SAdrian Prantl } 521e37d3144SAdrian Prantl } 522e37d3144SAdrian Prantl 523e37d3144SAdrian Prantl // Upgrade variables attached to globals. 524e37d3144SAdrian Prantl for (auto &GV : TheModule.globals()) { 52556a08b40SDavide Italiano SmallVector<MDNode *, 1> MDs; 526e37d3144SAdrian Prantl GV.getMetadata(LLVMContext::MD_dbg, MDs); 527e37d3144SAdrian Prantl GV.eraseMetadata(LLVMContext::MD_dbg); 528e37d3144SAdrian Prantl for (auto *MD : MDs) 5292bb217b5SSimon Pilgrim if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) { 53005782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct( 53105782218SAdrian Prantl Context, DGV, DIExpression::get(Context, {})); 532e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *DGVE); 533e37d3144SAdrian Prantl } else 534e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *MD); 535e37d3144SAdrian Prantl } 536e37d3144SAdrian Prantl } 537e37d3144SAdrian Prantl 5386825fb64SAdrian Prantl /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that 5396825fb64SAdrian Prantl /// describes a function argument. 5406825fb64SAdrian Prantl void upgradeDeclareExpressions(Function &F) { 5416825fb64SAdrian Prantl if (!NeedDeclareExpressionUpgrade) 5426825fb64SAdrian Prantl return; 5436825fb64SAdrian Prantl 5446825fb64SAdrian Prantl for (auto &BB : F) 5456825fb64SAdrian Prantl for (auto &I : BB) 5466825fb64SAdrian Prantl if (auto *DDI = dyn_cast<DbgDeclareInst>(&I)) 5476825fb64SAdrian Prantl if (auto *DIExpr = DDI->getExpression()) 5486825fb64SAdrian Prantl if (DIExpr->startsWithDeref() && 5496825fb64SAdrian Prantl dyn_cast_or_null<Argument>(DDI->getAddress())) { 5506825fb64SAdrian Prantl SmallVector<uint64_t, 8> Ops; 5516825fb64SAdrian Prantl Ops.append(std::next(DIExpr->elements_begin()), 5526825fb64SAdrian Prantl DIExpr->elements_end()); 553e5d958c4Sgbtozers DDI->setExpression(DIExpression::get(Context, Ops)); 5546825fb64SAdrian Prantl } 5556825fb64SAdrian Prantl } 5566825fb64SAdrian Prantl 557ffc498dfSFlorian Hahn /// Upgrade the expression from previous versions. 558*52b5491aSJonas Devlieghere Error upgradeDIExpression(uint64_t FromVersion, 559ffc498dfSFlorian Hahn MutableArrayRef<uint64_t> &Expr, 560ffc498dfSFlorian Hahn SmallVectorImpl<uint64_t> &Buffer) { 561ffc498dfSFlorian Hahn auto N = Expr.size(); 562ffc498dfSFlorian Hahn switch (FromVersion) { 563ffc498dfSFlorian Hahn default: 564ffc498dfSFlorian Hahn return error("Invalid record"); 565ffc498dfSFlorian Hahn case 0: 566ffc498dfSFlorian Hahn if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece) 567ffc498dfSFlorian Hahn Expr[N - 3] = dwarf::DW_OP_LLVM_fragment; 568ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 569ffc498dfSFlorian Hahn case 1: 570ffc498dfSFlorian Hahn // Move DW_OP_deref to the end. 571ffc498dfSFlorian Hahn if (N && Expr[0] == dwarf::DW_OP_deref) { 572ffc498dfSFlorian Hahn auto End = Expr.end(); 573ffc498dfSFlorian Hahn if (Expr.size() >= 3 && 574ffc498dfSFlorian Hahn *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment) 575ffc498dfSFlorian Hahn End = std::prev(End, 3); 576ffc498dfSFlorian Hahn std::move(std::next(Expr.begin()), End, Expr.begin()); 577ffc498dfSFlorian Hahn *std::prev(End) = dwarf::DW_OP_deref; 578ffc498dfSFlorian Hahn } 579ffc498dfSFlorian Hahn NeedDeclareExpressionUpgrade = true; 580ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 581ffc498dfSFlorian Hahn case 2: { 582ffc498dfSFlorian Hahn // Change DW_OP_plus to DW_OP_plus_uconst. 583ffc498dfSFlorian Hahn // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus 584ffc498dfSFlorian Hahn auto SubExpr = ArrayRef<uint64_t>(Expr); 585ffc498dfSFlorian Hahn while (!SubExpr.empty()) { 586ffc498dfSFlorian Hahn // Skip past other operators with their operands 587ffc498dfSFlorian Hahn // for this version of the IR, obtained from 588ffc498dfSFlorian Hahn // from historic DIExpression::ExprOperand::getSize(). 589ffc498dfSFlorian Hahn size_t HistoricSize; 590ffc498dfSFlorian Hahn switch (SubExpr.front()) { 591ffc498dfSFlorian Hahn default: 592ffc498dfSFlorian Hahn HistoricSize = 1; 593ffc498dfSFlorian Hahn break; 594ffc498dfSFlorian Hahn case dwarf::DW_OP_constu: 595ffc498dfSFlorian Hahn case dwarf::DW_OP_minus: 596ffc498dfSFlorian Hahn case dwarf::DW_OP_plus: 597ffc498dfSFlorian Hahn HistoricSize = 2; 598ffc498dfSFlorian Hahn break; 599ffc498dfSFlorian Hahn case dwarf::DW_OP_LLVM_fragment: 600ffc498dfSFlorian Hahn HistoricSize = 3; 601ffc498dfSFlorian Hahn break; 602ffc498dfSFlorian Hahn } 603ffc498dfSFlorian Hahn 604ffc498dfSFlorian Hahn // If the expression is malformed, make sure we don't 605ffc498dfSFlorian Hahn // copy more elements than we should. 606ffc498dfSFlorian Hahn HistoricSize = std::min(SubExpr.size(), HistoricSize); 607ffc498dfSFlorian Hahn ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1); 608ffc498dfSFlorian Hahn 609ffc498dfSFlorian Hahn switch (SubExpr.front()) { 610ffc498dfSFlorian Hahn case dwarf::DW_OP_plus: 611ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_plus_uconst); 612ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 613ffc498dfSFlorian Hahn break; 614ffc498dfSFlorian Hahn case dwarf::DW_OP_minus: 615ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_constu); 616ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 617ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_minus); 618ffc498dfSFlorian Hahn break; 619ffc498dfSFlorian Hahn default: 620ffc498dfSFlorian Hahn Buffer.push_back(*SubExpr.begin()); 621ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 622ffc498dfSFlorian Hahn break; 623ffc498dfSFlorian Hahn } 624ffc498dfSFlorian Hahn 625ffc498dfSFlorian Hahn // Continue with remaining elements. 626ffc498dfSFlorian Hahn SubExpr = SubExpr.slice(HistoricSize); 627ffc498dfSFlorian Hahn } 628ffc498dfSFlorian Hahn Expr = MutableArrayRef<uint64_t>(Buffer); 629ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 630ffc498dfSFlorian Hahn } 631ffc498dfSFlorian Hahn case 3: 632ffc498dfSFlorian Hahn // Up-to-date! 633ffc498dfSFlorian Hahn break; 634ffc498dfSFlorian Hahn } 635ffc498dfSFlorian Hahn 636ffc498dfSFlorian Hahn return Error::success(); 637ffc498dfSFlorian Hahn } 638ffc498dfSFlorian Hahn 639e37d3144SAdrian Prantl void upgradeDebugInfo() { 640e37d3144SAdrian Prantl upgradeCUSubprograms(); 641e37d3144SAdrian Prantl upgradeCUVariables(); 642e37d3144SAdrian Prantl } 643e37d3144SAdrian Prantl 644ef27db87SMehdi Amini public: 645ef27db87SMehdi Amini MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule, 646ef27db87SMehdi Amini BitcodeReaderValueList &ValueList, 647ec68dd49SMehdi Amini std::function<Type *(unsigned)> getTypeByID, 648ec68dd49SMehdi Amini bool IsImporting) 649864474c9SFlorian Hahn : MetadataList(TheModule.getContext(), Stream.SizeInBytes()), 650864474c9SFlorian Hahn ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()), 651864474c9SFlorian Hahn TheModule(TheModule), getTypeByID(std::move(getTypeByID)), 652864474c9SFlorian Hahn IsImporting(IsImporting) {} 653ef27db87SMehdi Amini 654ec68dd49SMehdi Amini Error parseMetadata(bool ModuleLevel); 655ef27db87SMehdi Amini 656ef27db87SMehdi Amini bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); } 6573bb4d01dSMehdi Amini 6583bb4d01dSMehdi Amini Metadata *getMetadataFwdRefOrLoad(unsigned ID) { 6593bb4d01dSMehdi Amini if (ID < MDStringRef.size()) 6603bb4d01dSMehdi Amini return lazyLoadOneMDString(ID); 6613bb4d01dSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) 6623bb4d01dSMehdi Amini return MD; 6633bb4d01dSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand 6643bb4d01dSMehdi Amini // instead of creating a temporary. 6653bb4d01dSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 6663bb4d01dSMehdi Amini PlaceholderQueue Placeholders; 6673bb4d01dSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 6683bb4d01dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 6693bb4d01dSMehdi Amini return MetadataList.lookup(ID); 6703bb4d01dSMehdi Amini } 6713bb4d01dSMehdi Amini return MetadataList.getMetadataFwdRef(ID); 672ef27db87SMehdi Amini } 673ef27db87SMehdi Amini 674ef27db87SMehdi Amini DISubprogram *lookupSubprogramForFunction(Function *F) { 675ef27db87SMehdi Amini return FunctionsWithSPs.lookup(F); 676ef27db87SMehdi Amini } 677ef27db87SMehdi Amini 678bd76f372SSimon Pilgrim bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; } 679ef27db87SMehdi Amini 680ef27db87SMehdi Amini Error parseMetadataAttachment( 681ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList); 682ef27db87SMehdi Amini 683ef27db87SMehdi Amini Error parseMetadataKinds(); 684ef27db87SMehdi Amini 6858662305bSMehdi Amini void setStripTBAA(bool Value) { StripTBAA = Value; } 686bd76f372SSimon Pilgrim bool isStrippingTBAA() const { return StripTBAA; } 6878662305bSMehdi Amini 688ef27db87SMehdi Amini unsigned size() const { return MetadataList.size(); } 689ef27db87SMehdi Amini void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); } 6906825fb64SAdrian Prantl void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); } 691ef27db87SMehdi Amini }; 692ef27db87SMehdi Amini 69342ef1990SMehdi Amini Expected<bool> 69442ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { 69519ef4fadSMehdi Amini IndexCursor = Stream; 69619ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record; 697c27ab339STeresa Johnson GlobalDeclAttachmentPos = 0; 69819ef4fadSMehdi Amini // Get the abbrevs, and preload record positions to make them lazy-loadable. 69919ef4fadSMehdi Amini while (true) { 700c27ab339STeresa Johnson uint64_t SavedPos = IndexCursor.GetCurrentBitNo(); 7010e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks( 70219ef4fadSMehdi Amini BitstreamCursor::AF_DontPopBlockAtEnd); 7030e828958SJF Bastien if (!MaybeEntry) 7040e828958SJF Bastien return MaybeEntry.takeError(); 7050e828958SJF Bastien BitstreamEntry Entry = MaybeEntry.get(); 7060e828958SJF Bastien 70719ef4fadSMehdi Amini switch (Entry.Kind) { 70819ef4fadSMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 70919ef4fadSMehdi Amini case BitstreamEntry::Error: 71019ef4fadSMehdi Amini return error("Malformed block"); 71119ef4fadSMehdi Amini case BitstreamEntry::EndBlock: { 71219ef4fadSMehdi Amini return true; 71319ef4fadSMehdi Amini } 71419ef4fadSMehdi Amini case BitstreamEntry::Record: { 71519ef4fadSMehdi Amini // The interesting case. 71619ef4fadSMehdi Amini ++NumMDRecordLoaded; 71719ef4fadSMehdi Amini uint64_t CurrentPos = IndexCursor.GetCurrentBitNo(); 7180e828958SJF Bastien Expected<unsigned> MaybeCode = IndexCursor.skipRecord(Entry.ID); 7190e828958SJF Bastien if (!MaybeCode) 7200e828958SJF Bastien return MaybeCode.takeError(); 7210e828958SJF Bastien unsigned Code = MaybeCode.get(); 72219ef4fadSMehdi Amini switch (Code) { 72319ef4fadSMehdi Amini case bitc::METADATA_STRINGS: { 72419ef4fadSMehdi Amini // Rewind and parse the strings. 7250e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 726c55cf4afSBill Wendling return std::move(Err); 72719ef4fadSMehdi Amini StringRef Blob; 72819ef4fadSMehdi Amini Record.clear(); 7290e828958SJF Bastien if (Expected<unsigned> MaybeRecord = 7300e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record, &Blob)) 7310e828958SJF Bastien ; 7320e828958SJF Bastien else 7330e828958SJF Bastien return MaybeRecord.takeError(); 73419ef4fadSMehdi Amini unsigned NumStrings = Record[0]; 73519ef4fadSMehdi Amini MDStringRef.reserve(NumStrings); 73619ef4fadSMehdi Amini auto IndexNextMDString = [&](StringRef Str) { 73719ef4fadSMehdi Amini MDStringRef.push_back(Str); 73819ef4fadSMehdi Amini }; 73919ef4fadSMehdi Amini if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString)) 740c55cf4afSBill Wendling return std::move(Err); 74119ef4fadSMehdi Amini break; 74219ef4fadSMehdi Amini } 74319ef4fadSMehdi Amini case bitc::METADATA_INDEX_OFFSET: { 74419ef4fadSMehdi Amini // This is the offset to the index, when we see this we skip all the 74519ef4fadSMehdi Amini // records and load only an index to these. 7460e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 747c55cf4afSBill Wendling return std::move(Err); 74819ef4fadSMehdi Amini Record.clear(); 7490e828958SJF Bastien if (Expected<unsigned> MaybeRecord = 7500e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) 7510e828958SJF Bastien ; 7520e828958SJF Bastien else 7530e828958SJF Bastien return MaybeRecord.takeError(); 75419ef4fadSMehdi Amini if (Record.size() != 2) 75519ef4fadSMehdi Amini return error("Invalid record"); 75619ef4fadSMehdi Amini auto Offset = Record[0] + (Record[1] << 32); 75719ef4fadSMehdi Amini auto BeginPos = IndexCursor.GetCurrentBitNo(); 7580e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset)) 759c55cf4afSBill Wendling return std::move(Err); 7600e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = 7610e828958SJF Bastien IndexCursor.advanceSkippingSubblocks( 76219ef4fadSMehdi Amini BitstreamCursor::AF_DontPopBlockAtEnd); 7630e828958SJF Bastien if (!MaybeEntry) 7640e828958SJF Bastien return MaybeEntry.takeError(); 7650e828958SJF Bastien Entry = MaybeEntry.get(); 76619ef4fadSMehdi Amini assert(Entry.Kind == BitstreamEntry::Record && 76719ef4fadSMehdi Amini "Corrupted bitcode: Expected `Record` when trying to find the " 76819ef4fadSMehdi Amini "Metadata index"); 76919ef4fadSMehdi Amini Record.clear(); 7700e828958SJF Bastien if (Expected<unsigned> MaybeCode = 7710e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) 7720e828958SJF Bastien assert(MaybeCode.get() == bitc::METADATA_INDEX && 7730e828958SJF Bastien "Corrupted bitcode: Expected `METADATA_INDEX` when trying to " 7740e828958SJF Bastien "find the Metadata index"); 7750e828958SJF Bastien else 7760e828958SJF Bastien return MaybeCode.takeError(); 77719ef4fadSMehdi Amini // Delta unpack 77819ef4fadSMehdi Amini auto CurrentValue = BeginPos; 77919ef4fadSMehdi Amini GlobalMetadataBitPosIndex.reserve(Record.size()); 78019ef4fadSMehdi Amini for (auto &Elt : Record) { 78119ef4fadSMehdi Amini CurrentValue += Elt; 78219ef4fadSMehdi Amini GlobalMetadataBitPosIndex.push_back(CurrentValue); 78319ef4fadSMehdi Amini } 78419ef4fadSMehdi Amini break; 78519ef4fadSMehdi Amini } 78619ef4fadSMehdi Amini case bitc::METADATA_INDEX: 78719ef4fadSMehdi Amini // We don't expect to get there, the Index is loaded when we encounter 78819ef4fadSMehdi Amini // the offset. 78919ef4fadSMehdi Amini return error("Corrupted Metadata block"); 79019ef4fadSMehdi Amini case bitc::METADATA_NAME: { 79119ef4fadSMehdi Amini // Named metadata need to be materialized now and aren't deferred. 7920e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 793c55cf4afSBill Wendling return std::move(Err); 79419ef4fadSMehdi Amini Record.clear(); 7950e828958SJF Bastien 7960e828958SJF Bastien unsigned Code; 7970e828958SJF Bastien if (Expected<unsigned> MaybeCode = 7980e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) { 7990e828958SJF Bastien Code = MaybeCode.get(); 80019ef4fadSMehdi Amini assert(Code == bitc::METADATA_NAME); 8010e828958SJF Bastien } else 8020e828958SJF Bastien return MaybeCode.takeError(); 80319ef4fadSMehdi Amini 80419ef4fadSMehdi Amini // Read name of the named metadata. 80519ef4fadSMehdi Amini SmallString<8> Name(Record.begin(), Record.end()); 8060e828958SJF Bastien if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode()) 8070e828958SJF Bastien Code = MaybeCode.get(); 8080e828958SJF Bastien else 8090e828958SJF Bastien return MaybeCode.takeError(); 81019ef4fadSMehdi Amini 81119ef4fadSMehdi Amini // Named Metadata comes in two parts, we expect the name to be followed 81219ef4fadSMehdi Amini // by the node 81319ef4fadSMehdi Amini Record.clear(); 8140e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode = 8150e828958SJF Bastien IndexCursor.readRecord(Code, Record)) 8160e828958SJF Bastien assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE); 8170e828958SJF Bastien else 8180e828958SJF Bastien return MaybeNextBitCode.takeError(); 81919ef4fadSMehdi Amini 82019ef4fadSMehdi Amini // Read named metadata elements. 82119ef4fadSMehdi Amini unsigned Size = Record.size(); 82219ef4fadSMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 82319ef4fadSMehdi Amini for (unsigned i = 0; i != Size; ++i) { 82419ef4fadSMehdi Amini // FIXME: We could use a placeholder here, however NamedMDNode are 82519ef4fadSMehdi Amini // taking MDNode as operand and not using the Metadata infrastructure. 82619ef4fadSMehdi Amini // It is acknowledged by 'TODO: Inherit from Metadata' in the 82719ef4fadSMehdi Amini // NamedMDNode class definition. 82819ef4fadSMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 829f3d2453dSTeresa Johnson assert(MD && "Invalid metadata: expect fwd ref to MDNode"); 83019ef4fadSMehdi Amini NMD->addOperand(MD); 83119ef4fadSMehdi Amini } 83219ef4fadSMehdi Amini break; 83319ef4fadSMehdi Amini } 83419ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 835c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos) 836c27ab339STeresa Johnson GlobalDeclAttachmentPos = SavedPos; 837c27ab339STeresa Johnson #ifndef NDEBUG 838c27ab339STeresa Johnson NumGlobalDeclAttachSkipped++; 839c27ab339STeresa Johnson #endif 84019ef4fadSMehdi Amini break; 84119ef4fadSMehdi Amini } 84219ef4fadSMehdi Amini case bitc::METADATA_KIND: 84319ef4fadSMehdi Amini case bitc::METADATA_STRING_OLD: 84419ef4fadSMehdi Amini case bitc::METADATA_OLD_FN_NODE: 84519ef4fadSMehdi Amini case bitc::METADATA_OLD_NODE: 84619ef4fadSMehdi Amini case bitc::METADATA_VALUE: 84719ef4fadSMehdi Amini case bitc::METADATA_DISTINCT_NODE: 84819ef4fadSMehdi Amini case bitc::METADATA_NODE: 84919ef4fadSMehdi Amini case bitc::METADATA_LOCATION: 85019ef4fadSMehdi Amini case bitc::METADATA_GENERIC_DEBUG: 85119ef4fadSMehdi Amini case bitc::METADATA_SUBRANGE: 85219ef4fadSMehdi Amini case bitc::METADATA_ENUMERATOR: 85319ef4fadSMehdi Amini case bitc::METADATA_BASIC_TYPE: 854f91d18eaSSourabh Singh Tomar case bitc::METADATA_STRING_TYPE: 85519ef4fadSMehdi Amini case bitc::METADATA_DERIVED_TYPE: 85619ef4fadSMehdi Amini case bitc::METADATA_COMPOSITE_TYPE: 85719ef4fadSMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE: 85819ef4fadSMehdi Amini case bitc::METADATA_MODULE: 85919ef4fadSMehdi Amini case bitc::METADATA_FILE: 86019ef4fadSMehdi Amini case bitc::METADATA_COMPILE_UNIT: 86119ef4fadSMehdi Amini case bitc::METADATA_SUBPROGRAM: 86219ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK: 86319ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE: 86419ef4fadSMehdi Amini case bitc::METADATA_NAMESPACE: 8656ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK: 86619ef4fadSMehdi Amini case bitc::METADATA_MACRO: 86719ef4fadSMehdi Amini case bitc::METADATA_MACRO_FILE: 86819ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_TYPE: 86919ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_VALUE: 87019ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR: 87119ef4fadSMehdi Amini case bitc::METADATA_LOCAL_VAR: 8722c864551SShiva Chen case bitc::METADATA_LABEL: 87319ef4fadSMehdi Amini case bitc::METADATA_EXPRESSION: 87419ef4fadSMehdi Amini case bitc::METADATA_OBJC_PROPERTY: 87519ef4fadSMehdi Amini case bitc::METADATA_IMPORTED_ENTITY: 87619ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR_EXPR: 877a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE: 87819ef4fadSMehdi Amini // We don't expect to see any of these, if we see one, give up on 87919ef4fadSMehdi Amini // lazy-loading and fallback. 88019ef4fadSMehdi Amini MDStringRef.clear(); 88119ef4fadSMehdi Amini GlobalMetadataBitPosIndex.clear(); 88219ef4fadSMehdi Amini return false; 88319ef4fadSMehdi Amini } 88419ef4fadSMehdi Amini break; 88519ef4fadSMehdi Amini } 88619ef4fadSMehdi Amini } 88719ef4fadSMehdi Amini } 88819ef4fadSMehdi Amini } 88919ef4fadSMehdi Amini 890c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index. 891c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be 892c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying 893c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index 894c27ab339STeresa Johnson // instead of creating temporaries. 895c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() { 896c27ab339STeresa Johnson // Nothing to do if we didn't find any of these metadata records. 897c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos) 898c27ab339STeresa Johnson return true; 899c27ab339STeresa Johnson // Use a temporary cursor so that we don't mess up the main Stream cursor or 900c27ab339STeresa Johnson // the lazy loading IndexCursor (which holds the necessary abbrev ids). 901c27ab339STeresa Johnson BitstreamCursor TempCursor = Stream; 902c27ab339STeresa Johnson SmallVector<uint64_t, 64> Record; 903c27ab339STeresa Johnson // Jump to the position before the first global decl attachment, so we can 904c27ab339STeresa Johnson // scan for the first BitstreamEntry record. 905c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos)) 906c27ab339STeresa Johnson return std::move(Err); 907c27ab339STeresa Johnson while (true) { 908c27ab339STeresa Johnson Expected<BitstreamEntry> MaybeEntry = TempCursor.advanceSkippingSubblocks( 909c27ab339STeresa Johnson BitstreamCursor::AF_DontPopBlockAtEnd); 910c27ab339STeresa Johnson if (!MaybeEntry) 911c27ab339STeresa Johnson return MaybeEntry.takeError(); 912c27ab339STeresa Johnson BitstreamEntry Entry = MaybeEntry.get(); 913c27ab339STeresa Johnson 914c27ab339STeresa Johnson switch (Entry.Kind) { 915c27ab339STeresa Johnson case BitstreamEntry::SubBlock: // Handled for us already. 916c27ab339STeresa Johnson case BitstreamEntry::Error: 917c27ab339STeresa Johnson return error("Malformed block"); 918c27ab339STeresa Johnson case BitstreamEntry::EndBlock: 919c27ab339STeresa Johnson // Sanity check that we parsed them all. 920c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 921c27ab339STeresa Johnson return true; 922c27ab339STeresa Johnson case BitstreamEntry::Record: 923c27ab339STeresa Johnson break; 924c27ab339STeresa Johnson } 925c27ab339STeresa Johnson uint64_t CurrentPos = TempCursor.GetCurrentBitNo(); 926c27ab339STeresa Johnson Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID); 927c27ab339STeresa Johnson if (!MaybeCode) 928c27ab339STeresa Johnson return MaybeCode.takeError(); 929c27ab339STeresa Johnson if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) { 930c27ab339STeresa Johnson // Anything other than a global decl attachment signals the end of 931c27ab339STeresa Johnson // these records. sanity check that we parsed them all. 932c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 933c27ab339STeresa Johnson return true; 934c27ab339STeresa Johnson } 935c27ab339STeresa Johnson #ifndef NDEBUG 936c27ab339STeresa Johnson NumGlobalDeclAttachParsed++; 937c27ab339STeresa Johnson #endif 938c27ab339STeresa Johnson // FIXME: we need to do this early because we don't materialize global 939c27ab339STeresa Johnson // value explicitly. 940c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos)) 941c27ab339STeresa Johnson return std::move(Err); 942c27ab339STeresa Johnson Record.clear(); 943c27ab339STeresa Johnson if (Expected<unsigned> MaybeRecord = 944c27ab339STeresa Johnson TempCursor.readRecord(Entry.ID, Record)) 945c27ab339STeresa Johnson ; 946c27ab339STeresa Johnson else 947c27ab339STeresa Johnson return MaybeRecord.takeError(); 948c27ab339STeresa Johnson if (Record.size() % 2 == 0) 949c27ab339STeresa Johnson return error("Invalid record"); 950c27ab339STeresa Johnson unsigned ValueID = Record[0]; 951c27ab339STeresa Johnson if (ValueID >= ValueList.size()) 952c27ab339STeresa Johnson return error("Invalid record"); 953c27ab339STeresa Johnson if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) { 954c27ab339STeresa Johnson // Need to save and restore the current position since 955c27ab339STeresa Johnson // parseGlobalObjectAttachment will resolve all forward references which 956c27ab339STeresa Johnson // would require parsing from locations stored in the index. 957c27ab339STeresa Johnson CurrentPos = TempCursor.GetCurrentBitNo(); 958c27ab339STeresa Johnson if (Error Err = parseGlobalObjectAttachment( 959c27ab339STeresa Johnson *GO, ArrayRef<uint64_t>(Record).slice(1))) 960c27ab339STeresa Johnson return std::move(Err); 961c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos)) 962c27ab339STeresa Johnson return std::move(Err); 963c27ab339STeresa Johnson } 964c27ab339STeresa Johnson } 965c27ab339STeresa Johnson } 966c27ab339STeresa Johnson 967ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing 968ef27db87SMehdi Amini /// module level metadata. 969ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) { 970ef27db87SMehdi Amini if (!ModuleLevel && MetadataList.hasFwdRefs()) 971ef27db87SMehdi Amini return error("Invalid metadata: fwd refs into function blocks"); 972ef27db87SMehdi Amini 97319ef4fadSMehdi Amini // Record the entry position so that we can jump back here and efficiently 97419ef4fadSMehdi Amini // skip the whole block in case we lazy-load. 97519ef4fadSMehdi Amini auto EntryPos = Stream.GetCurrentBitNo(); 97619ef4fadSMehdi Amini 9770e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 9780e828958SJF Bastien return Err; 979ef27db87SMehdi Amini 980ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 981ef27db87SMehdi Amini PlaceholderQueue Placeholders; 9829f926f70SMehdi Amini 98319ef4fadSMehdi Amini // We lazy-load module-level metadata: we build an index for each record, and 98419ef4fadSMehdi Amini // then load individual record as needed, starting with the named metadata. 98519ef4fadSMehdi Amini if (ModuleLevel && IsImporting && MetadataList.empty() && 98619ef4fadSMehdi Amini !DisableLazyLoading) { 98742ef1990SMehdi Amini auto SuccessOrErr = lazyLoadModuleMetadataBlock(); 98819ef4fadSMehdi Amini if (!SuccessOrErr) 98919ef4fadSMehdi Amini return SuccessOrErr.takeError(); 99019ef4fadSMehdi Amini if (SuccessOrErr.get()) { 99119ef4fadSMehdi Amini // An index was successfully created and we will be able to load metadata 99219ef4fadSMehdi Amini // on-demand. 99319ef4fadSMehdi Amini MetadataList.resize(MDStringRef.size() + 99419ef4fadSMehdi Amini GlobalMetadataBitPosIndex.size()); 99519ef4fadSMehdi Amini 996c27ab339STeresa Johnson // Now that we have built the index, load the global decl attachments 997c27ab339STeresa Johnson // that were deferred during that process. This avoids creating 998c27ab339STeresa Johnson // temporaries. 999c27ab339STeresa Johnson SuccessOrErr = loadGlobalDeclAttachments(); 1000c27ab339STeresa Johnson if (!SuccessOrErr) 1001c27ab339STeresa Johnson return SuccessOrErr.takeError(); 1002c27ab339STeresa Johnson assert(SuccessOrErr.get()); 1003c27ab339STeresa Johnson 100419ef4fadSMehdi Amini // Reading the named metadata created forward references and/or 100519ef4fadSMehdi Amini // placeholders, that we flush here. 100619ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 1007e37d3144SAdrian Prantl upgradeDebugInfo(); 100819ef4fadSMehdi Amini // Return at the beginning of the block, since it is easy to skip it 100919ef4fadSMehdi Amini // entirely from there. 101019ef4fadSMehdi Amini Stream.ReadBlockEnd(); // Pop the abbrev block context. 10110e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(EntryPos)) 10120e828958SJF Bastien return Err; 10130e828958SJF Bastien if (Error Err = Stream.SkipBlock()) { 10140e828958SJF Bastien // FIXME this drops the error on the floor, which 10150e828958SJF Bastien // ThinLTO/X86/debuginfo-cu-import.ll relies on. 10160e828958SJF Bastien consumeError(std::move(Err)); 10170e828958SJF Bastien return Error::success(); 10180e828958SJF Bastien } 101919ef4fadSMehdi Amini return Error::success(); 102019ef4fadSMehdi Amini } 102119ef4fadSMehdi Amini // Couldn't load an index, fallback to loading all the block "old-style". 102219ef4fadSMehdi Amini } 102319ef4fadSMehdi Amini 102419ef4fadSMehdi Amini unsigned NextMetadataNo = MetadataList.size(); 102519ef4fadSMehdi Amini 10269f926f70SMehdi Amini // Read all the records. 10279f926f70SMehdi Amini while (true) { 10280e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); 10290e828958SJF Bastien if (!MaybeEntry) 10300e828958SJF Bastien return MaybeEntry.takeError(); 10310e828958SJF Bastien BitstreamEntry Entry = MaybeEntry.get(); 10329f926f70SMehdi Amini 10339f926f70SMehdi Amini switch (Entry.Kind) { 10349f926f70SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 10359f926f70SMehdi Amini case BitstreamEntry::Error: 10369f926f70SMehdi Amini return error("Malformed block"); 10379f926f70SMehdi Amini case BitstreamEntry::EndBlock: 103819ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 1039e37d3144SAdrian Prantl upgradeDebugInfo(); 10409f926f70SMehdi Amini return Error::success(); 10419f926f70SMehdi Amini case BitstreamEntry::Record: 10429f926f70SMehdi Amini // The interesting case. 10439f926f70SMehdi Amini break; 10449f926f70SMehdi Amini } 10459f926f70SMehdi Amini 10469f926f70SMehdi Amini // Read a record. 10479f926f70SMehdi Amini Record.clear(); 10489f926f70SMehdi Amini StringRef Blob; 104919ef4fadSMehdi Amini ++NumMDRecordLoaded; 10500e828958SJF Bastien if (Expected<unsigned> MaybeCode = 10510e828958SJF Bastien Stream.readRecord(Entry.ID, Record, &Blob)) { 10520e828958SJF Bastien if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders, 10530e828958SJF Bastien Blob, NextMetadataNo)) 10549f926f70SMehdi Amini return Err; 10550e828958SJF Bastien } else 10560e828958SJF Bastien return MaybeCode.takeError(); 10579f926f70SMehdi Amini } 10589f926f70SMehdi Amini } 10599f926f70SMehdi Amini 106019ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) { 106119ef4fadSMehdi Amini ++NumMDStringLoaded; 106219ef4fadSMehdi Amini if (Metadata *MD = MetadataList.lookup(ID)) 106319ef4fadSMehdi Amini return cast<MDString>(MD); 106419ef4fadSMehdi Amini auto MDS = MDString::get(Context, MDStringRef[ID]); 106519ef4fadSMehdi Amini MetadataList.assignValue(MDS, ID); 106619ef4fadSMehdi Amini return MDS; 106719ef4fadSMehdi Amini } 106819ef4fadSMehdi Amini 106919ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata( 107019ef4fadSMehdi Amini unsigned ID, PlaceholderQueue &Placeholders) { 107119ef4fadSMehdi Amini assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size()); 107219ef4fadSMehdi Amini assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString"); 107319ef4fadSMehdi Amini // Lookup first if the metadata hasn't already been loaded. 107419ef4fadSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) { 107587399997SSimon Pilgrim auto *N = cast<MDNode>(MD); 107667d2cc1fSMehdi Amini if (!N->isTemporary()) 107767d2cc1fSMehdi Amini return; 107819ef4fadSMehdi Amini } 107919ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record; 108019ef4fadSMehdi Amini StringRef Blob; 10810e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit( 10820e828958SJF Bastien GlobalMetadataBitPosIndex[ID - MDStringRef.size()])) 10830e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed jumping: " + 10840e828958SJF Bastien toString(std::move(Err))); 10850e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks(); 10860e828958SJF Bastien if (!MaybeEntry) 10870e828958SJF Bastien // FIXME this drops the error on the floor. 10880e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " + 10890e828958SJF Bastien toString(MaybeEntry.takeError())); 10900e828958SJF Bastien BitstreamEntry Entry = MaybeEntry.get(); 109119ef4fadSMehdi Amini ++NumMDRecordLoaded; 10920e828958SJF Bastien if (Expected<unsigned> MaybeCode = 10930e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record, &Blob)) { 10940e828958SJF Bastien if (Error Err = 10950e828958SJF Bastien parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID)) 10960e828958SJF Bastien report_fatal_error("Can't lazyload MD, parseOneMetadata: " + 10970e828958SJF Bastien toString(std::move(Err))); 10980e828958SJF Bastien } else 10990e828958SJF Bastien report_fatal_error("Can't lazyload MD: " + toString(MaybeCode.takeError())); 110019ef4fadSMehdi Amini } 110119ef4fadSMehdi Amini 110219ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved. 110319ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed. 110419ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders( 110519ef4fadSMehdi Amini PlaceholderQueue &Placeholders) { 110619ef4fadSMehdi Amini DenseSet<unsigned> Temporaries; 110719ef4fadSMehdi Amini while (1) { 110819ef4fadSMehdi Amini // Populate Temporaries with the placeholders that haven't been loaded yet. 110919ef4fadSMehdi Amini Placeholders.getTemporaries(MetadataList, Temporaries); 111019ef4fadSMehdi Amini 111119ef4fadSMehdi Amini // If we don't have any temporary, or FwdReference, we're done! 111219ef4fadSMehdi Amini if (Temporaries.empty() && !MetadataList.hasFwdRefs()) 111319ef4fadSMehdi Amini break; 111419ef4fadSMehdi Amini 111519ef4fadSMehdi Amini // First, load all the temporaries. This can add new placeholders or 111619ef4fadSMehdi Amini // forward references. 111719ef4fadSMehdi Amini for (auto ID : Temporaries) 111819ef4fadSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 111919ef4fadSMehdi Amini Temporaries.clear(); 112019ef4fadSMehdi Amini 112119ef4fadSMehdi Amini // Second, load the forward-references. This can also add new placeholders 112219ef4fadSMehdi Amini // or forward references. 112319ef4fadSMehdi Amini while (MetadataList.hasFwdRefs()) 112419ef4fadSMehdi Amini lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders); 112519ef4fadSMehdi Amini } 112619ef4fadSMehdi Amini // At this point we don't have any forward reference remaining, or temporary 112719ef4fadSMehdi Amini // that haven't been loaded. We can safely drop RAUW support and mark cycles 112819ef4fadSMehdi Amini // as resolved. 112919ef4fadSMehdi Amini MetadataList.tryToResolveCycles(); 113019ef4fadSMehdi Amini 113119ef4fadSMehdi Amini // Finally, everything is in place, we can replace the placeholders operands 113219ef4fadSMehdi Amini // with the final node they refer to. 113319ef4fadSMehdi Amini Placeholders.flush(MetadataList); 113419ef4fadSMehdi Amini } 113519ef4fadSMehdi Amini 11369f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( 11379f926f70SMehdi Amini SmallVectorImpl<uint64_t> &Record, unsigned Code, 113819ef4fadSMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) { 11399f926f70SMehdi Amini 11409f926f70SMehdi Amini bool IsDistinct = false; 1141ef27db87SMehdi Amini auto getMD = [&](unsigned ID) -> Metadata * { 114219ef4fadSMehdi Amini if (ID < MDStringRef.size()) 114319ef4fadSMehdi Amini return lazyLoadOneMDString(ID); 114467d2cc1fSMehdi Amini if (!IsDistinct) { 114567d2cc1fSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) 114667d2cc1fSMehdi Amini return MD; 114767d2cc1fSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand 114867d2cc1fSMehdi Amini // instead of creating a temporary. 114967d2cc1fSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 115067d2cc1fSMehdi Amini // Create a temporary for the node that is referencing the operand we 115167d2cc1fSMehdi Amini // will lazy-load. It is needed before recursing in case there are 115267d2cc1fSMehdi Amini // uniquing cycles. 115367d2cc1fSMehdi Amini MetadataList.getMetadataFwdRef(NextMetadataNo); 115467d2cc1fSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 115567d2cc1fSMehdi Amini return MetadataList.lookup(ID); 115667d2cc1fSMehdi Amini } 115767d2cc1fSMehdi Amini // Return a temporary. 1158ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID); 115967d2cc1fSMehdi Amini } 1160ef27db87SMehdi Amini if (auto *MD = MetadataList.getMetadataIfResolved(ID)) 1161ef27db87SMehdi Amini return MD; 1162ef27db87SMehdi Amini return &Placeholders.getPlaceholderOp(ID); 1163ef27db87SMehdi Amini }; 1164ef27db87SMehdi Amini auto getMDOrNull = [&](unsigned ID) -> Metadata * { 1165ef27db87SMehdi Amini if (ID) 1166ef27db87SMehdi Amini return getMD(ID - 1); 1167ef27db87SMehdi Amini return nullptr; 1168ef27db87SMehdi Amini }; 1169ef27db87SMehdi Amini auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * { 1170ef27db87SMehdi Amini if (ID) 1171ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID - 1); 1172ef27db87SMehdi Amini return nullptr; 1173ef27db87SMehdi Amini }; 1174ef27db87SMehdi Amini auto getMDString = [&](unsigned ID) -> MDString * { 1175ef27db87SMehdi Amini // This requires that the ID is not really a forward reference. In 1176ef27db87SMehdi Amini // particular, the MDString must already have been resolved. 117719ef4fadSMehdi Amini auto MDS = getMDOrNull(ID); 117819ef4fadSMehdi Amini return cast_or_null<MDString>(MDS); 1179ef27db87SMehdi Amini }; 1180ef27db87SMehdi Amini 1181ef27db87SMehdi Amini // Support for old type refs. 1182ef27db87SMehdi Amini auto getDITypeRefOrNull = [&](unsigned ID) { 1183ef27db87SMehdi Amini return MetadataList.upgradeTypeRef(getMDOrNull(ID)); 1184ef27db87SMehdi Amini }; 1185ef27db87SMehdi Amini 1186ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS) \ 1187ef27db87SMehdi Amini (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS) 1188ef27db87SMehdi Amini 1189ef27db87SMehdi Amini switch (Code) { 1190ef27db87SMehdi Amini default: // Default behavior: ignore. 1191ef27db87SMehdi Amini break; 1192ef27db87SMehdi Amini case bitc::METADATA_NAME: { 1193ef27db87SMehdi Amini // Read name of the named metadata. 1194ef27db87SMehdi Amini SmallString<8> Name(Record.begin(), Record.end()); 1195ef27db87SMehdi Amini Record.clear(); 11960e828958SJF Bastien Expected<unsigned> MaybeCode = Stream.ReadCode(); 11970e828958SJF Bastien if (!MaybeCode) 11980e828958SJF Bastien return MaybeCode.takeError(); 11990e828958SJF Bastien Code = MaybeCode.get(); 1200ef27db87SMehdi Amini 120119ef4fadSMehdi Amini ++NumMDRecordLoaded; 12020e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) { 12030e828958SJF Bastien if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE) 1204ef27db87SMehdi Amini return error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 12050e828958SJF Bastien } else 12060e828958SJF Bastien return MaybeNextBitCode.takeError(); 1207ef27db87SMehdi Amini 1208ef27db87SMehdi Amini // Read named metadata elements. 1209ef27db87SMehdi Amini unsigned Size = Record.size(); 1210ef27db87SMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 1211ef27db87SMehdi Amini for (unsigned i = 0; i != Size; ++i) { 1212ef27db87SMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 1213ef27db87SMehdi Amini if (!MD) 1214f3d2453dSTeresa Johnson return error("Invalid named metadata: expect fwd ref to MDNode"); 1215ef27db87SMehdi Amini NMD->addOperand(MD); 1216ef27db87SMehdi Amini } 1217ef27db87SMehdi Amini break; 1218ef27db87SMehdi Amini } 1219ef27db87SMehdi Amini case bitc::METADATA_OLD_FN_NODE: { 12204abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files. 1221ef27db87SMehdi Amini // This is a LocalAsMetadata record, the only type of function-local 1222ef27db87SMehdi Amini // metadata. 1223ef27db87SMehdi Amini if (Record.size() % 2 == 1) 1224ef27db87SMehdi Amini return error("Invalid record"); 1225ef27db87SMehdi Amini 1226ef27db87SMehdi Amini // If this isn't a LocalAsMetadata record, we're dropping it. This used 1227ef27db87SMehdi Amini // to be legal, but there's no upgrade path. 1228ef27db87SMehdi Amini auto dropRecord = [&] { 1229c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo); 1230c05c9db3SIvan Krasin NextMetadataNo++; 1231ef27db87SMehdi Amini }; 1232ef27db87SMehdi Amini if (Record.size() != 2) { 1233ef27db87SMehdi Amini dropRecord(); 1234ef27db87SMehdi Amini break; 1235ef27db87SMehdi Amini } 1236ef27db87SMehdi Amini 1237ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[0]); 1238ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy()) { 1239ef27db87SMehdi Amini dropRecord(); 1240ef27db87SMehdi Amini break; 1241ef27db87SMehdi Amini } 1242ef27db87SMehdi Amini 1243ef27db87SMehdi Amini MetadataList.assignValue( 1244ef27db87SMehdi Amini LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 1245c05c9db3SIvan Krasin NextMetadataNo); 1246c05c9db3SIvan Krasin NextMetadataNo++; 1247ef27db87SMehdi Amini break; 1248ef27db87SMehdi Amini } 1249ef27db87SMehdi Amini case bitc::METADATA_OLD_NODE: { 12504abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files. 1251ef27db87SMehdi Amini if (Record.size() % 2 == 1) 1252ef27db87SMehdi Amini return error("Invalid record"); 1253ef27db87SMehdi Amini 1254ef27db87SMehdi Amini unsigned Size = Record.size(); 1255ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts; 1256ef27db87SMehdi Amini for (unsigned i = 0; i != Size; i += 2) { 1257ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[i]); 1258ef27db87SMehdi Amini if (!Ty) 1259ef27db87SMehdi Amini return error("Invalid record"); 1260ef27db87SMehdi Amini if (Ty->isMetadataTy()) 1261ef27db87SMehdi Amini Elts.push_back(getMD(Record[i + 1])); 1262ef27db87SMehdi Amini else if (!Ty->isVoidTy()) { 1263ef27db87SMehdi Amini auto *MD = 1264ef27db87SMehdi Amini ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty)); 1265ef27db87SMehdi Amini assert(isa<ConstantAsMetadata>(MD) && 1266ef27db87SMehdi Amini "Expected non-function-local metadata"); 1267ef27db87SMehdi Amini Elts.push_back(MD); 1268ef27db87SMehdi Amini } else 1269ef27db87SMehdi Amini Elts.push_back(nullptr); 1270ef27db87SMehdi Amini } 1271c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo); 1272c05c9db3SIvan Krasin NextMetadataNo++; 1273ef27db87SMehdi Amini break; 1274ef27db87SMehdi Amini } 1275ef27db87SMehdi Amini case bitc::METADATA_VALUE: { 1276ef27db87SMehdi Amini if (Record.size() != 2) 1277ef27db87SMehdi Amini return error("Invalid record"); 1278ef27db87SMehdi Amini 1279ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[0]); 1280ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy()) 1281ef27db87SMehdi Amini return error("Invalid record"); 1282ef27db87SMehdi Amini 1283ef27db87SMehdi Amini MetadataList.assignValue( 1284ef27db87SMehdi Amini ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 1285c05c9db3SIvan Krasin NextMetadataNo); 1286c05c9db3SIvan Krasin NextMetadataNo++; 1287ef27db87SMehdi Amini break; 1288ef27db87SMehdi Amini } 1289ef27db87SMehdi Amini case bitc::METADATA_DISTINCT_NODE: 1290ef27db87SMehdi Amini IsDistinct = true; 1291ef27db87SMehdi Amini LLVM_FALLTHROUGH; 1292ef27db87SMehdi Amini case bitc::METADATA_NODE: { 1293ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts; 1294ef27db87SMehdi Amini Elts.reserve(Record.size()); 1295ef27db87SMehdi Amini for (unsigned ID : Record) 1296ef27db87SMehdi Amini Elts.push_back(getMDOrNull(ID)); 1297ef27db87SMehdi Amini MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 1298ef27db87SMehdi Amini : MDNode::get(Context, Elts), 1299c05c9db3SIvan Krasin NextMetadataNo); 1300c05c9db3SIvan Krasin NextMetadataNo++; 1301ef27db87SMehdi Amini break; 1302ef27db87SMehdi Amini } 1303ef27db87SMehdi Amini case bitc::METADATA_LOCATION: { 1304386ad01cSVedant Kumar if (Record.size() != 5 && Record.size() != 6) 1305ef27db87SMehdi Amini return error("Invalid record"); 1306ef27db87SMehdi Amini 1307ef27db87SMehdi Amini IsDistinct = Record[0]; 1308ef27db87SMehdi Amini unsigned Line = Record[1]; 1309ef27db87SMehdi Amini unsigned Column = Record[2]; 1310ef27db87SMehdi Amini Metadata *Scope = getMD(Record[3]); 1311ef27db87SMehdi Amini Metadata *InlinedAt = getMDOrNull(Record[4]); 1312386ad01cSVedant Kumar bool ImplicitCode = Record.size() == 6 && Record[5]; 1313ef27db87SMehdi Amini MetadataList.assignValue( 1314eb7f6020SCalixte Denizet GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt, 1315eb7f6020SCalixte Denizet ImplicitCode)), 1316c05c9db3SIvan Krasin NextMetadataNo); 1317c05c9db3SIvan Krasin NextMetadataNo++; 1318ef27db87SMehdi Amini break; 1319ef27db87SMehdi Amini } 1320ef27db87SMehdi Amini case bitc::METADATA_GENERIC_DEBUG: { 1321ef27db87SMehdi Amini if (Record.size() < 4) 1322ef27db87SMehdi Amini return error("Invalid record"); 1323ef27db87SMehdi Amini 1324ef27db87SMehdi Amini IsDistinct = Record[0]; 1325ef27db87SMehdi Amini unsigned Tag = Record[1]; 1326ef27db87SMehdi Amini unsigned Version = Record[2]; 1327ef27db87SMehdi Amini 1328ef27db87SMehdi Amini if (Tag >= 1u << 16 || Version != 0) 1329ef27db87SMehdi Amini return error("Invalid record"); 1330ef27db87SMehdi Amini 1331ef27db87SMehdi Amini auto *Header = getMDString(Record[3]); 1332ef27db87SMehdi Amini SmallVector<Metadata *, 8> DwarfOps; 1333ef27db87SMehdi Amini for (unsigned I = 4, E = Record.size(); I != E; ++I) 1334ef27db87SMehdi Amini DwarfOps.push_back(getMDOrNull(Record[I])); 1335ef27db87SMehdi Amini MetadataList.assignValue( 1336ef27db87SMehdi Amini GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)), 1337c05c9db3SIvan Krasin NextMetadataNo); 1338c05c9db3SIvan Krasin NextMetadataNo++; 1339ef27db87SMehdi Amini break; 1340ef27db87SMehdi Amini } 1341ef27db87SMehdi Amini case bitc::METADATA_SUBRANGE: { 1342fdf40917SSander de Smalen Metadata *Val = nullptr; 1343fdf40917SSander de Smalen // Operand 'count' is interpreted as: 1344fdf40917SSander de Smalen // - Signed integer (version 0) 1345fdf40917SSander de Smalen // - Metadata node (version 1) 1346d20bf5a7SAlok Kumar Sharma // Operand 'lowerBound' is interpreted as: 1347d20bf5a7SAlok Kumar Sharma // - Signed integer (version 0 and 1) 1348d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2) 1349d20bf5a7SAlok Kumar Sharma // Operands 'upperBound' and 'stride' are interpreted as: 1350d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2) 1351fdf40917SSander de Smalen switch (Record[0] >> 1) { 1352fdf40917SSander de Smalen case 0: 1353fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange, 1354d20bf5a7SAlok Kumar Sharma (Context, Record[1], unrotateSign(Record[2]))); 1355fdf40917SSander de Smalen break; 1356fdf40917SSander de Smalen case 1: 1357fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]), 1358d20bf5a7SAlok Kumar Sharma unrotateSign(Record[2]))); 1359d20bf5a7SAlok Kumar Sharma break; 1360d20bf5a7SAlok Kumar Sharma case 2: 1361d20bf5a7SAlok Kumar Sharma Val = GET_OR_DISTINCT( 1362d20bf5a7SAlok Kumar Sharma DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]), 1363d20bf5a7SAlok Kumar Sharma getMDOrNull(Record[3]), getMDOrNull(Record[4]))); 1364fdf40917SSander de Smalen break; 1365fdf40917SSander de Smalen default: 1366fdf40917SSander de Smalen return error("Invalid record: Unsupported version of DISubrange"); 1367fdf40917SSander de Smalen } 1368ef27db87SMehdi Amini 1369fdf40917SSander de Smalen MetadataList.assignValue(Val, NextMetadataNo); 1370fdf40917SSander de Smalen IsDistinct = Record[0] & 1; 1371c05c9db3SIvan Krasin NextMetadataNo++; 1372ef27db87SMehdi Amini break; 1373ef27db87SMehdi Amini } 1374a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE: { 1375a6dd01afSAlok Kumar Sharma Metadata *Val = nullptr; 1376a6dd01afSAlok Kumar Sharma Val = GET_OR_DISTINCT(DIGenericSubrange, 1377a6dd01afSAlok Kumar Sharma (Context, getMDOrNull(Record[1]), 1378a6dd01afSAlok Kumar Sharma getMDOrNull(Record[2]), getMDOrNull(Record[3]), 1379a6dd01afSAlok Kumar Sharma getMDOrNull(Record[4]))); 1380a6dd01afSAlok Kumar Sharma 1381a6dd01afSAlok Kumar Sharma MetadataList.assignValue(Val, NextMetadataNo); 1382a6dd01afSAlok Kumar Sharma IsDistinct = Record[0] & 1; 1383a6dd01afSAlok Kumar Sharma NextMetadataNo++; 1384a6dd01afSAlok Kumar Sharma break; 1385a6dd01afSAlok Kumar Sharma } 1386ef27db87SMehdi Amini case bitc::METADATA_ENUMERATOR: { 1387aad3d578SLemonBoy if (Record.size() < 3) 1388ef27db87SMehdi Amini return error("Invalid record"); 1389ef27db87SMehdi Amini 139008dc66efSMomchil Velikov IsDistinct = Record[0] & 1; 139108dc66efSMomchil Velikov bool IsUnsigned = Record[0] & 2; 1392aad3d578SLemonBoy bool IsBigInt = Record[0] & 4; 1393aad3d578SLemonBoy APInt Value; 1394aad3d578SLemonBoy 1395aad3d578SLemonBoy if (IsBigInt) { 1396aad3d578SLemonBoy const uint64_t BitWidth = Record[1]; 1397aad3d578SLemonBoy const size_t NumWords = Record.size() - 3; 1398aad3d578SLemonBoy Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth); 1399aad3d578SLemonBoy } else 1400aad3d578SLemonBoy Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned); 1401aad3d578SLemonBoy 1402ef27db87SMehdi Amini MetadataList.assignValue( 1403aad3d578SLemonBoy GET_OR_DISTINCT(DIEnumerator, 1404aad3d578SLemonBoy (Context, Value, IsUnsigned, getMDString(Record[2]))), 1405c05c9db3SIvan Krasin NextMetadataNo); 1406c05c9db3SIvan Krasin NextMetadataNo++; 1407ef27db87SMehdi Amini break; 1408ef27db87SMehdi Amini } 1409ef27db87SMehdi Amini case bitc::METADATA_BASIC_TYPE: { 141055f42629SAdrian Prantl if (Record.size() < 6 || Record.size() > 7) 1411ef27db87SMehdi Amini return error("Invalid record"); 1412ef27db87SMehdi Amini 1413ef27db87SMehdi Amini IsDistinct = Record[0]; 141455f42629SAdrian Prantl DINode::DIFlags Flags = (Record.size() > 6) ? 141555f42629SAdrian Prantl static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero; 141655f42629SAdrian Prantl 1417ef27db87SMehdi Amini MetadataList.assignValue( 1418ef27db87SMehdi Amini GET_OR_DISTINCT(DIBasicType, 14199f926f70SMehdi Amini (Context, Record[1], getMDString(Record[2]), Record[3], 142055f42629SAdrian Prantl Record[4], Record[5], Flags)), 1421c05c9db3SIvan Krasin NextMetadataNo); 1422c05c9db3SIvan Krasin NextMetadataNo++; 1423ef27db87SMehdi Amini break; 1424ef27db87SMehdi Amini } 1425f91d18eaSSourabh Singh Tomar case bitc::METADATA_STRING_TYPE: { 1426f91d18eaSSourabh Singh Tomar if (Record.size() != 8) 1427f91d18eaSSourabh Singh Tomar return error("Invalid record"); 1428f91d18eaSSourabh Singh Tomar 1429f91d18eaSSourabh Singh Tomar IsDistinct = Record[0]; 1430f91d18eaSSourabh Singh Tomar MetadataList.assignValue( 1431f91d18eaSSourabh Singh Tomar GET_OR_DISTINCT(DIStringType, 1432f91d18eaSSourabh Singh Tomar (Context, Record[1], getMDString(Record[2]), 1433f91d18eaSSourabh Singh Tomar getMDOrNull(Record[3]), getMDOrNull(Record[4]), 1434f91d18eaSSourabh Singh Tomar Record[5], Record[6], Record[7])), 1435f91d18eaSSourabh Singh Tomar NextMetadataNo); 1436f91d18eaSSourabh Singh Tomar NextMetadataNo++; 1437f91d18eaSSourabh Singh Tomar break; 1438f91d18eaSSourabh Singh Tomar } 1439ef27db87SMehdi Amini case bitc::METADATA_DERIVED_TYPE: { 1440d5561e0aSKonstantin Zhuravlyov if (Record.size() < 12 || Record.size() > 13) 1441ef27db87SMehdi Amini return error("Invalid record"); 1442ef27db87SMehdi Amini 1443d5561e0aSKonstantin Zhuravlyov // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means 1444d5561e0aSKonstantin Zhuravlyov // that there is no DWARF address space associated with DIDerivedType. 1445d5561e0aSKonstantin Zhuravlyov Optional<unsigned> DWARFAddressSpace; 1446d5561e0aSKonstantin Zhuravlyov if (Record.size() > 12 && Record[12]) 1447d5561e0aSKonstantin Zhuravlyov DWARFAddressSpace = Record[12] - 1; 1448d5561e0aSKonstantin Zhuravlyov 1449ef27db87SMehdi Amini IsDistinct = Record[0]; 1450ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 1451ef27db87SMehdi Amini MetadataList.assignValue( 1452ef27db87SMehdi Amini GET_OR_DISTINCT(DIDerivedType, 1453ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]), 1454ef27db87SMehdi Amini getMDOrNull(Record[3]), Record[4], 1455ef27db87SMehdi Amini getDITypeRefOrNull(Record[5]), 1456ef27db87SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1457d5561e0aSKonstantin Zhuravlyov Record[9], DWARFAddressSpace, Flags, 1458d5561e0aSKonstantin Zhuravlyov getDITypeRefOrNull(Record[11]))), 1459c05c9db3SIvan Krasin NextMetadataNo); 1460c05c9db3SIvan Krasin NextMetadataNo++; 1461ef27db87SMehdi Amini break; 1462ef27db87SMehdi Amini } 1463ef27db87SMehdi Amini case bitc::METADATA_COMPOSITE_TYPE: { 146496bd4d34SAlok Kumar Sharma if (Record.size() < 16 || Record.size() > 21) 1465ef27db87SMehdi Amini return error("Invalid record"); 1466ef27db87SMehdi Amini 1467ef27db87SMehdi Amini // If we have a UUID and this is not a forward declaration, lookup the 1468ef27db87SMehdi Amini // mapping. 1469ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1; 1470ef27db87SMehdi Amini bool IsNotUsedInTypeRef = Record[0] >= 2; 1471ef27db87SMehdi Amini unsigned Tag = Record[1]; 1472ef27db87SMehdi Amini MDString *Name = getMDString(Record[2]); 1473ef27db87SMehdi Amini Metadata *File = getMDOrNull(Record[3]); 1474ef27db87SMehdi Amini unsigned Line = Record[4]; 1475ef27db87SMehdi Amini Metadata *Scope = getDITypeRefOrNull(Record[5]); 1476a61f5e37STeresa Johnson Metadata *BaseType = nullptr; 1477ef27db87SMehdi Amini uint64_t SizeInBits = Record[7]; 1478ef27db87SMehdi Amini if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1479ef27db87SMehdi Amini return error("Alignment value is too large"); 1480ef27db87SMehdi Amini uint32_t AlignInBits = Record[8]; 1481a61f5e37STeresa Johnson uint64_t OffsetInBits = 0; 1482ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 1483a61f5e37STeresa Johnson Metadata *Elements = nullptr; 1484ef27db87SMehdi Amini unsigned RuntimeLang = Record[12]; 1485a61f5e37STeresa Johnson Metadata *VTableHolder = nullptr; 1486a61f5e37STeresa Johnson Metadata *TemplateParams = nullptr; 14878c59921cSAdrian Prantl Metadata *Discriminator = nullptr; 14884042ada1SAlok Kumar Sharma Metadata *DataLocation = nullptr; 14892d10258aSAlok Kumar Sharma Metadata *Associated = nullptr; 14902d10258aSAlok Kumar Sharma Metadata *Allocated = nullptr; 149196bd4d34SAlok Kumar Sharma Metadata *Rank = nullptr; 1492ef27db87SMehdi Amini auto *Identifier = getMDString(Record[15]); 1493a61f5e37STeresa Johnson // If this module is being parsed so that it can be ThinLTO imported 1494a61f5e37STeresa Johnson // into another module, composite types only need to be imported 1495a61f5e37STeresa Johnson // as type declarations (unless full type definitions requested). 1496a61f5e37STeresa Johnson // Create type declarations up front to save memory. Also, buildODRType 1497a61f5e37STeresa Johnson // handles the case where this is type ODRed with a definition needed 1498a61f5e37STeresa Johnson // by the importing module, in which case the existing definition is 1499a61f5e37STeresa Johnson // used. 15005a8dba5bSTeresa Johnson if (IsImporting && !ImportFullTypeDefinitions && Identifier && 1501a61f5e37STeresa Johnson (Tag == dwarf::DW_TAG_enumeration_type || 1502a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_class_type || 1503a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_structure_type || 1504a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_union_type)) { 1505a61f5e37STeresa Johnson Flags = Flags | DINode::FlagFwdDecl; 1506a61f5e37STeresa Johnson } else { 1507a61f5e37STeresa Johnson BaseType = getDITypeRefOrNull(Record[6]); 1508a61f5e37STeresa Johnson OffsetInBits = Record[9]; 1509a61f5e37STeresa Johnson Elements = getMDOrNull(Record[11]); 1510a61f5e37STeresa Johnson VTableHolder = getDITypeRefOrNull(Record[13]); 1511a61f5e37STeresa Johnson TemplateParams = getMDOrNull(Record[14]); 15128c59921cSAdrian Prantl if (Record.size() > 16) 15138c59921cSAdrian Prantl Discriminator = getMDOrNull(Record[16]); 15144042ada1SAlok Kumar Sharma if (Record.size() > 17) 15154042ada1SAlok Kumar Sharma DataLocation = getMDOrNull(Record[17]); 15162d10258aSAlok Kumar Sharma if (Record.size() > 19) { 15172d10258aSAlok Kumar Sharma Associated = getMDOrNull(Record[18]); 15182d10258aSAlok Kumar Sharma Allocated = getMDOrNull(Record[19]); 15192d10258aSAlok Kumar Sharma } 152096bd4d34SAlok Kumar Sharma if (Record.size() > 20) { 152196bd4d34SAlok Kumar Sharma Rank = getMDOrNull(Record[20]); 152296bd4d34SAlok Kumar Sharma } 1523a61f5e37STeresa Johnson } 1524ef27db87SMehdi Amini DICompositeType *CT = nullptr; 1525ef27db87SMehdi Amini if (Identifier) 1526ef27db87SMehdi Amini CT = DICompositeType::buildODRType( 1527ef27db87SMehdi Amini Context, *Identifier, Tag, Name, File, Line, Scope, BaseType, 1528ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 15292d10258aSAlok Kumar Sharma VTableHolder, TemplateParams, Discriminator, DataLocation, Associated, 153096bd4d34SAlok Kumar Sharma Allocated, Rank); 1531ef27db87SMehdi Amini 1532ef27db87SMehdi Amini // Create a node if we didn't get a lazy ODR type. 1533ef27db87SMehdi Amini if (!CT) 1534ef27db87SMehdi Amini CT = GET_OR_DISTINCT(DICompositeType, 1535ef27db87SMehdi Amini (Context, Tag, Name, File, Line, Scope, BaseType, 1536ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags, 15379f926f70SMehdi Amini Elements, RuntimeLang, VTableHolder, TemplateParams, 15382d10258aSAlok Kumar Sharma Identifier, Discriminator, DataLocation, Associated, 153996bd4d34SAlok Kumar Sharma Allocated, Rank)); 1540ef27db87SMehdi Amini if (!IsNotUsedInTypeRef && Identifier) 1541ef27db87SMehdi Amini MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT)); 1542ef27db87SMehdi Amini 1543c05c9db3SIvan Krasin MetadataList.assignValue(CT, NextMetadataNo); 1544c05c9db3SIvan Krasin NextMetadataNo++; 1545ef27db87SMehdi Amini break; 1546ef27db87SMehdi Amini } 1547ef27db87SMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE: { 1548ef27db87SMehdi Amini if (Record.size() < 3 || Record.size() > 4) 1549ef27db87SMehdi Amini return error("Invalid record"); 1550ef27db87SMehdi Amini bool IsOldTypeRefArray = Record[0] < 2; 1551ef27db87SMehdi Amini unsigned CC = (Record.size() > 3) ? Record[3] : 0; 1552ef27db87SMehdi Amini 1553ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1; 1554ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]); 1555ef27db87SMehdi Amini Metadata *Types = getMDOrNull(Record[2]); 1556ef27db87SMehdi Amini if (LLVM_UNLIKELY(IsOldTypeRefArray)) 1557ef27db87SMehdi Amini Types = MetadataList.upgradeTypeRefArray(Types); 1558ef27db87SMehdi Amini 1559ef27db87SMehdi Amini MetadataList.assignValue( 1560ef27db87SMehdi Amini GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)), 1561c05c9db3SIvan Krasin NextMetadataNo); 1562c05c9db3SIvan Krasin NextMetadataNo++; 1563ef27db87SMehdi Amini break; 1564ef27db87SMehdi Amini } 1565ef27db87SMehdi Amini 1566ef27db87SMehdi Amini case bitc::METADATA_MODULE: { 15675f75dcf5SChih-Ping Chen if (Record.size() < 5 || Record.size() > 9) 1568ef27db87SMehdi Amini return error("Invalid record"); 1569ef27db87SMehdi Amini 15705f75dcf5SChih-Ping Chen unsigned Offset = Record.size() >= 8 ? 2 : 1; 1571ef27db87SMehdi Amini IsDistinct = Record[0]; 1572ef27db87SMehdi Amini MetadataList.assignValue( 1573e59744fdSSourabh Singh Tomar GET_OR_DISTINCT( 1574e59744fdSSourabh Singh Tomar DIModule, 15755f75dcf5SChih-Ping Chen (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr, 1576e59744fdSSourabh Singh Tomar getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]), 1577e59744fdSSourabh Singh Tomar getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]), 1578e59744fdSSourabh Singh Tomar getMDString(Record[4 + Offset]), 15795f75dcf5SChih-Ping Chen Record.size() <= 7 ? 0 : Record[7], 15805f75dcf5SChih-Ping Chen Record.size() <= 8 ? false : Record[8])), 1581c05c9db3SIvan Krasin NextMetadataNo); 1582c05c9db3SIvan Krasin NextMetadataNo++; 1583ef27db87SMehdi Amini break; 1584ef27db87SMehdi Amini } 1585ef27db87SMehdi Amini 1586ef27db87SMehdi Amini case bitc::METADATA_FILE: { 158716c7bdafSScott Linder if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6) 1588ef27db87SMehdi Amini return error("Invalid record"); 1589ef27db87SMehdi Amini 1590ef27db87SMehdi Amini IsDistinct = Record[0]; 15917160384dSScott Linder Optional<DIFile::ChecksumInfo<MDString *>> Checksum; 15927160384dSScott Linder // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum 15937160384dSScott Linder // is not present. This matches up with the old internal representation, 15947160384dSScott Linder // and the old encoding for CSK_None in the ChecksumKind. The new 15957160384dSScott Linder // representation reserves the value 0 in the ChecksumKind to continue to 15967160384dSScott Linder // encode None in a backwards-compatible way. 159716c7bdafSScott Linder if (Record.size() > 4 && Record[3] && Record[4]) 15987160384dSScott Linder Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]), 15997160384dSScott Linder getMDString(Record[4])); 1600ef27db87SMehdi Amini MetadataList.assignValue( 16019f926f70SMehdi Amini GET_OR_DISTINCT( 16027faeecc8SAmjad Aboud DIFile, 160316c7bdafSScott Linder (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum, 160416c7bdafSScott Linder Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5])) 160516c7bdafSScott Linder : None)), 1606c05c9db3SIvan Krasin NextMetadataNo); 1607c05c9db3SIvan Krasin NextMetadataNo++; 1608ef27db87SMehdi Amini break; 1609ef27db87SMehdi Amini } 1610ef27db87SMehdi Amini case bitc::METADATA_COMPILE_UNIT: { 1611e4e7e447SAdrian Prantl if (Record.size() < 14 || Record.size() > 22) 1612ef27db87SMehdi Amini return error("Invalid record"); 1613ef27db87SMehdi Amini 1614ef27db87SMehdi Amini // Ignore Record[0], which indicates whether this compile unit is 1615ef27db87SMehdi Amini // distinct. It's always distinct. 1616ef27db87SMehdi Amini IsDistinct = true; 1617ef27db87SMehdi Amini auto *CU = DICompileUnit::getDistinct( 1618ef27db87SMehdi Amini Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]), 1619ef27db87SMehdi Amini Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]), 1620ef27db87SMehdi Amini Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1621ef27db87SMehdi Amini getMDOrNull(Record[12]), getMDOrNull(Record[13]), 1622ef27db87SMehdi Amini Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]), 1623ef27db87SMehdi Amini Record.size() <= 14 ? 0 : Record[14], 16240944a8c2SDehao Chen Record.size() <= 16 ? true : Record[16], 1625b52e2366SPeter Collingbourne Record.size() <= 17 ? false : Record[17], 1626bb279116SDavid Blaikie Record.size() <= 18 ? 0 : Record[18], 1627ab093bfeSDavid Blaikie Record.size() <= 19 ? 0 : Record[19], 1628e4e7e447SAdrian Prantl Record.size() <= 20 ? nullptr : getMDString(Record[20]), 1629e4e7e447SAdrian Prantl Record.size() <= 21 ? nullptr : getMDString(Record[21])); 1630ef27db87SMehdi Amini 1631c05c9db3SIvan Krasin MetadataList.assignValue(CU, NextMetadataNo); 1632c05c9db3SIvan Krasin NextMetadataNo++; 1633ef27db87SMehdi Amini 1634ef27db87SMehdi Amini // Move the Upgrade the list of subprograms. 1635ef27db87SMehdi Amini if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11])) 1636ef27db87SMehdi Amini CUSubprograms.push_back({CU, SPs}); 1637ef27db87SMehdi Amini break; 1638ef27db87SMehdi Amini } 1639ef27db87SMehdi Amini case bitc::METADATA_SUBPROGRAM: { 16401d12b885SAdrian Prantl if (Record.size() < 18 || Record.size() > 21) 1641ef27db87SMehdi Amini return error("Invalid record"); 1642ef27db87SMehdi Amini 1643adcdc1bdSPaul Robinson bool HasSPFlags = Record[0] & 4; 164438a61873SPetar Jovanovic 164538a61873SPetar Jovanovic DINode::DIFlags Flags; 164638a61873SPetar Jovanovic DISubprogram::DISPFlags SPFlags; 164738a61873SPetar Jovanovic if (!HasSPFlags) 164838a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11 + 2]); 164938a61873SPetar Jovanovic else { 165038a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11]); 165138a61873SPetar Jovanovic SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]); 165238a61873SPetar Jovanovic } 165338a61873SPetar Jovanovic 165438a61873SPetar Jovanovic // Support for old metadata when 165538a61873SPetar Jovanovic // subprogram specific flags are placed in DIFlags. 165638a61873SPetar Jovanovic const unsigned DIFlagMainSubprogram = 1 << 21; 165738a61873SPetar Jovanovic bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram; 165838a61873SPetar Jovanovic if (HasOldMainSubprogramFlag) 165938a61873SPetar Jovanovic // Remove old DIFlagMainSubprogram from DIFlags. 166038a61873SPetar Jovanovic // Note: This assumes that any future use of bit 21 defaults to it 166138a61873SPetar Jovanovic // being 0. 166238a61873SPetar Jovanovic Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram); 166338a61873SPetar Jovanovic 166438a61873SPetar Jovanovic if (HasOldMainSubprogramFlag && HasSPFlags) 166538a61873SPetar Jovanovic SPFlags |= DISubprogram::SPFlagMainSubprogram; 166638a61873SPetar Jovanovic else if (!HasSPFlags) 166738a61873SPetar Jovanovic SPFlags = DISubprogram::toSPFlags( 1668adcdc1bdSPaul Robinson /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], 166938a61873SPetar Jovanovic /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], 167038a61873SPetar Jovanovic /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag); 1671adcdc1bdSPaul Robinson 1672adcdc1bdSPaul Robinson // All definitions should be distinct. 1673adcdc1bdSPaul Robinson IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition); 1674ef27db87SMehdi Amini // Version 1 has a Function as Record[15]. 1675ef27db87SMehdi Amini // Version 2 has removed Record[15]. 1676ef27db87SMehdi Amini // Version 3 has the Unit as Record[15]. 1677ef27db87SMehdi Amini // Version 4 added thisAdjustment. 1678adcdc1bdSPaul Robinson // Version 5 repacked flags into DISPFlags, changing many element numbers. 1679adcdc1bdSPaul Robinson bool HasUnit = Record[0] & 2; 1680adcdc1bdSPaul Robinson if (!HasSPFlags && HasUnit && Record.size() < 19) 1681ef27db87SMehdi Amini return error("Invalid record"); 1682adcdc1bdSPaul Robinson if (HasSPFlags && !HasUnit) 1683adcdc1bdSPaul Robinson return error("Invalid record"); 1684adcdc1bdSPaul Robinson // Accommodate older formats. 1685adcdc1bdSPaul Robinson bool HasFn = false; 1686adcdc1bdSPaul Robinson bool HasThisAdj = true; 1687adcdc1bdSPaul Robinson bool HasThrownTypes = true; 1688adcdc1bdSPaul Robinson unsigned OffsetA = 0; 1689adcdc1bdSPaul Robinson unsigned OffsetB = 0; 1690adcdc1bdSPaul Robinson if (!HasSPFlags) { 1691adcdc1bdSPaul Robinson OffsetA = 2; 1692adcdc1bdSPaul Robinson OffsetB = 2; 1693adcdc1bdSPaul Robinson if (Record.size() >= 19) { 1694adcdc1bdSPaul Robinson HasFn = !HasUnit; 1695adcdc1bdSPaul Robinson OffsetB++; 1696adcdc1bdSPaul Robinson } 1697adcdc1bdSPaul Robinson HasThisAdj = Record.size() >= 20; 1698adcdc1bdSPaul Robinson HasThrownTypes = Record.size() >= 21; 1699adcdc1bdSPaul Robinson } 1700adcdc1bdSPaul Robinson Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]); 1701ef27db87SMehdi Amini DISubprogram *SP = GET_OR_DISTINCT( 17021d12b885SAdrian Prantl DISubprogram, 17031d12b885SAdrian Prantl (Context, 1704ef27db87SMehdi Amini getDITypeRefOrNull(Record[1]), // scope 1705ef27db87SMehdi Amini getMDString(Record[2]), // name 1706ef27db87SMehdi Amini getMDString(Record[3]), // linkageName 1707ef27db87SMehdi Amini getMDOrNull(Record[4]), // file 1708ef27db87SMehdi Amini Record[5], // line 1709ef27db87SMehdi Amini getMDOrNull(Record[6]), // type 1710adcdc1bdSPaul Robinson Record[7 + OffsetA], // scopeLine 1711adcdc1bdSPaul Robinson getDITypeRefOrNull(Record[8 + OffsetA]), // containingType 1712adcdc1bdSPaul Robinson Record[10 + OffsetA], // virtualIndex 1713adcdc1bdSPaul Robinson HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment 171438a61873SPetar Jovanovic Flags, // flags 1715cda54210SPaul Robinson SPFlags, // SPFlags 1716ef27db87SMehdi Amini HasUnit ? CUorFn : nullptr, // unit 1717adcdc1bdSPaul Robinson getMDOrNull(Record[13 + OffsetB]), // templateParams 1718adcdc1bdSPaul Robinson getMDOrNull(Record[14 + OffsetB]), // declaration 1719adcdc1bdSPaul Robinson getMDOrNull(Record[15 + OffsetB]), // retainedNodes 1720adcdc1bdSPaul Robinson HasThrownTypes ? getMDOrNull(Record[17 + OffsetB]) 1721adcdc1bdSPaul Robinson : nullptr // thrownTypes 1722ef27db87SMehdi Amini )); 1723c05c9db3SIvan Krasin MetadataList.assignValue(SP, NextMetadataNo); 1724c05c9db3SIvan Krasin NextMetadataNo++; 1725ef27db87SMehdi Amini 1726ef27db87SMehdi Amini // Upgrade sp->function mapping to function->sp mapping. 1727ef27db87SMehdi Amini if (HasFn) { 1728ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn)) 1729ef27db87SMehdi Amini if (auto *F = dyn_cast<Function>(CMD->getValue())) { 1730ef27db87SMehdi Amini if (F->isMaterializable()) 1731ef27db87SMehdi Amini // Defer until materialized; unmaterialized functions may not have 1732ef27db87SMehdi Amini // metadata. 1733ef27db87SMehdi Amini FunctionsWithSPs[F] = SP; 1734ef27db87SMehdi Amini else if (!F->empty()) 1735ef27db87SMehdi Amini F->setSubprogram(SP); 1736ef27db87SMehdi Amini } 1737ef27db87SMehdi Amini } 1738ef27db87SMehdi Amini break; 1739ef27db87SMehdi Amini } 1740ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK: { 1741ef27db87SMehdi Amini if (Record.size() != 5) 1742ef27db87SMehdi Amini return error("Invalid record"); 1743ef27db87SMehdi Amini 1744ef27db87SMehdi Amini IsDistinct = Record[0]; 1745ef27db87SMehdi Amini MetadataList.assignValue( 1746ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlock, 1747ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), 1748ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3], Record[4])), 1749c05c9db3SIvan Krasin NextMetadataNo); 1750c05c9db3SIvan Krasin NextMetadataNo++; 1751ef27db87SMehdi Amini break; 1752ef27db87SMehdi Amini } 1753ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE: { 1754ef27db87SMehdi Amini if (Record.size() != 4) 1755ef27db87SMehdi Amini return error("Invalid record"); 1756ef27db87SMehdi Amini 1757ef27db87SMehdi Amini IsDistinct = Record[0]; 1758ef27db87SMehdi Amini MetadataList.assignValue( 1759ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlockFile, 1760ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), 1761ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3])), 1762c05c9db3SIvan Krasin NextMetadataNo); 1763c05c9db3SIvan Krasin NextMetadataNo++; 1764ef27db87SMehdi Amini break; 1765ef27db87SMehdi Amini } 17666ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK: { 17676ed5706aSAdrian Prantl IsDistinct = Record[0] & 1; 17686ed5706aSAdrian Prantl MetadataList.assignValue( 17696ed5706aSAdrian Prantl GET_OR_DISTINCT(DICommonBlock, 17706ed5706aSAdrian Prantl (Context, getMDOrNull(Record[1]), 17716ed5706aSAdrian Prantl getMDOrNull(Record[2]), getMDString(Record[3]), 17726ed5706aSAdrian Prantl getMDOrNull(Record[4]), Record[5])), 17736ed5706aSAdrian Prantl NextMetadataNo); 17746ed5706aSAdrian Prantl NextMetadataNo++; 17756ed5706aSAdrian Prantl break; 17766ed5706aSAdrian Prantl } 1777ef27db87SMehdi Amini case bitc::METADATA_NAMESPACE: { 1778fed4f399SAdrian Prantl // Newer versions of DINamespace dropped file and line. 1779fed4f399SAdrian Prantl MDString *Name; 1780fed4f399SAdrian Prantl if (Record.size() == 3) 1781fed4f399SAdrian Prantl Name = getMDString(Record[2]); 1782fed4f399SAdrian Prantl else if (Record.size() == 5) 1783fed4f399SAdrian Prantl Name = getMDString(Record[3]); 1784fed4f399SAdrian Prantl else 1785ef27db87SMehdi Amini return error("Invalid record"); 1786ef27db87SMehdi Amini 1787ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 1788ef27db87SMehdi Amini bool ExportSymbols = Record[0] & 2; 1789ef27db87SMehdi Amini MetadataList.assignValue( 1790ef27db87SMehdi Amini GET_OR_DISTINCT(DINamespace, 1791fed4f399SAdrian Prantl (Context, getMDOrNull(Record[1]), Name, ExportSymbols)), 1792c05c9db3SIvan Krasin NextMetadataNo); 1793c05c9db3SIvan Krasin NextMetadataNo++; 1794ef27db87SMehdi Amini break; 1795ef27db87SMehdi Amini } 1796ef27db87SMehdi Amini case bitc::METADATA_MACRO: { 1797ef27db87SMehdi Amini if (Record.size() != 5) 1798ef27db87SMehdi Amini return error("Invalid record"); 1799ef27db87SMehdi Amini 1800ef27db87SMehdi Amini IsDistinct = Record[0]; 1801ef27db87SMehdi Amini MetadataList.assignValue( 1802ef27db87SMehdi Amini GET_OR_DISTINCT(DIMacro, 18039f926f70SMehdi Amini (Context, Record[1], Record[2], getMDString(Record[3]), 18049f926f70SMehdi Amini getMDString(Record[4]))), 1805c05c9db3SIvan Krasin NextMetadataNo); 1806c05c9db3SIvan Krasin NextMetadataNo++; 1807ef27db87SMehdi Amini break; 1808ef27db87SMehdi Amini } 1809ef27db87SMehdi Amini case bitc::METADATA_MACRO_FILE: { 1810ef27db87SMehdi Amini if (Record.size() != 5) 1811ef27db87SMehdi Amini return error("Invalid record"); 1812ef27db87SMehdi Amini 1813ef27db87SMehdi Amini IsDistinct = Record[0]; 1814ef27db87SMehdi Amini MetadataList.assignValue( 1815ef27db87SMehdi Amini GET_OR_DISTINCT(DIMacroFile, 18169f926f70SMehdi Amini (Context, Record[1], Record[2], getMDOrNull(Record[3]), 18179f926f70SMehdi Amini getMDOrNull(Record[4]))), 1818c05c9db3SIvan Krasin NextMetadataNo); 1819c05c9db3SIvan Krasin NextMetadataNo++; 1820ef27db87SMehdi Amini break; 1821ef27db87SMehdi Amini } 1822ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_TYPE: { 18237a42babeSAwanish Pandey if (Record.size() < 3 || Record.size() > 4) 1824ef27db87SMehdi Amini return error("Invalid record"); 1825ef27db87SMehdi Amini 1826ef27db87SMehdi Amini IsDistinct = Record[0]; 18277a42babeSAwanish Pandey MetadataList.assignValue( 18287a42babeSAwanish Pandey GET_OR_DISTINCT(DITemplateTypeParameter, 1829ef27db87SMehdi Amini (Context, getMDString(Record[1]), 18307a42babeSAwanish Pandey getDITypeRefOrNull(Record[2]), 18317a42babeSAwanish Pandey (Record.size() == 4) ? getMDOrNull(Record[3]) 18327a42babeSAwanish Pandey : getMDOrNull(false))), 1833c05c9db3SIvan Krasin NextMetadataNo); 1834c05c9db3SIvan Krasin NextMetadataNo++; 1835ef27db87SMehdi Amini break; 1836ef27db87SMehdi Amini } 1837ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_VALUE: { 18387a42babeSAwanish Pandey if (Record.size() < 5 || Record.size() > 6) 1839ef27db87SMehdi Amini return error("Invalid record"); 1840ef27db87SMehdi Amini 1841ef27db87SMehdi Amini IsDistinct = Record[0]; 18427a42babeSAwanish Pandey 1843ef27db87SMehdi Amini MetadataList.assignValue( 18447a42babeSAwanish Pandey GET_OR_DISTINCT( 18457a42babeSAwanish Pandey DITemplateValueParameter, 1846ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]), 1847ef27db87SMehdi Amini getDITypeRefOrNull(Record[3]), 18487a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false), 18497a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[5]) 18507a42babeSAwanish Pandey : getMDOrNull(Record[4]))), 1851c05c9db3SIvan Krasin NextMetadataNo); 1852c05c9db3SIvan Krasin NextMetadataNo++; 1853ef27db87SMehdi Amini break; 1854ef27db87SMehdi Amini } 1855ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_VAR: { 1856f8ab35a4SMatthew Voss if (Record.size() < 11 || Record.size() > 13) 1857ef27db87SMehdi Amini return error("Invalid record"); 1858ef27db87SMehdi Amini 1859bceaaa96SAdrian Prantl IsDistinct = Record[0] & 1; 1860bceaaa96SAdrian Prantl unsigned Version = Record[0] >> 1; 1861ef27db87SMehdi Amini 1862f8ab35a4SMatthew Voss if (Version == 2) { 1863f8ab35a4SMatthew Voss MetadataList.assignValue( 1864f8ab35a4SMatthew Voss GET_OR_DISTINCT( 1865f8ab35a4SMatthew Voss DIGlobalVariable, 1866f8ab35a4SMatthew Voss (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1867f8ab35a4SMatthew Voss getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1868f8ab35a4SMatthew Voss getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1869f8ab35a4SMatthew Voss getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])), 1870f8ab35a4SMatthew Voss NextMetadataNo); 1871f8ab35a4SMatthew Voss 1872f8ab35a4SMatthew Voss NextMetadataNo++; 1873f8ab35a4SMatthew Voss } else if (Version == 1) { 1874f8ab35a4SMatthew Voss // No upgrade necessary. A null field will be introduced to indicate 1875f8ab35a4SMatthew Voss // that no parameter information is available. 1876bceaaa96SAdrian Prantl MetadataList.assignValue( 1877bceaaa96SAdrian Prantl GET_OR_DISTINCT(DIGlobalVariable, 1878bceaaa96SAdrian Prantl (Context, getMDOrNull(Record[1]), 1879bceaaa96SAdrian Prantl getMDString(Record[2]), getMDString(Record[3]), 1880bceaaa96SAdrian Prantl getMDOrNull(Record[4]), Record[5], 18819f926f70SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1882f8ab35a4SMatthew Voss getMDOrNull(Record[10]), nullptr, Record[11])), 1883c05c9db3SIvan Krasin NextMetadataNo); 1884f8ab35a4SMatthew Voss 1885c05c9db3SIvan Krasin NextMetadataNo++; 1886bceaaa96SAdrian Prantl } else if (Version == 0) { 1887ef27db87SMehdi Amini // Upgrade old metadata, which stored a global variable reference or a 1888ef27db87SMehdi Amini // ConstantInt here. 1889a5bf2d70SAdrian Prantl NeedUpgradeToDIGlobalVariableExpression = true; 1890ef27db87SMehdi Amini Metadata *Expr = getMDOrNull(Record[9]); 1891ef27db87SMehdi Amini uint32_t AlignInBits = 0; 1892ef27db87SMehdi Amini if (Record.size() > 11) { 1893ef27db87SMehdi Amini if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1894ef27db87SMehdi Amini return error("Alignment value is too large"); 1895ef27db87SMehdi Amini AlignInBits = Record[11]; 1896ef27db87SMehdi Amini } 1897ef27db87SMehdi Amini GlobalVariable *Attach = nullptr; 1898ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) { 1899ef27db87SMehdi Amini if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) { 1900ef27db87SMehdi Amini Attach = GV; 1901ef27db87SMehdi Amini Expr = nullptr; 1902ef27db87SMehdi Amini } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) { 1903ef27db87SMehdi Amini Expr = DIExpression::get(Context, 1904ef27db87SMehdi Amini {dwarf::DW_OP_constu, CI->getZExtValue(), 1905ef27db87SMehdi Amini dwarf::DW_OP_stack_value}); 1906ef27db87SMehdi Amini } else { 1907ef27db87SMehdi Amini Expr = nullptr; 1908ef27db87SMehdi Amini } 1909ef27db87SMehdi Amini } 1910ef27db87SMehdi Amini DIGlobalVariable *DGV = GET_OR_DISTINCT( 1911ef27db87SMehdi Amini DIGlobalVariable, 1912ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1913ef27db87SMehdi Amini getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1914bceaaa96SAdrian Prantl getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1915f8ab35a4SMatthew Voss getMDOrNull(Record[10]), nullptr, AlignInBits)); 191603c6d31aSAdrian Prantl 1917e37d3144SAdrian Prantl DIGlobalVariableExpression *DGVE = nullptr; 1918e37d3144SAdrian Prantl if (Attach || Expr) 191905782218SAdrian Prantl DGVE = DIGlobalVariableExpression::getDistinct( 192005782218SAdrian Prantl Context, DGV, Expr ? Expr : DIExpression::get(Context, {})); 192173ec0656SAdrian Prantl if (Attach) 1922bceaaa96SAdrian Prantl Attach->addDebugInfo(DGVE); 1923e37d3144SAdrian Prantl 1924e37d3144SAdrian Prantl auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV); 1925e37d3144SAdrian Prantl MetadataList.assignValue(MDNode, NextMetadataNo); 1926e37d3144SAdrian Prantl NextMetadataNo++; 1927bceaaa96SAdrian Prantl } else 1928bceaaa96SAdrian Prantl return error("Invalid record"); 192973ec0656SAdrian Prantl 1930ef27db87SMehdi Amini break; 1931ef27db87SMehdi Amini } 1932ef27db87SMehdi Amini case bitc::METADATA_LOCAL_VAR: { 1933ef27db87SMehdi Amini // 10th field is for the obseleted 'inlinedAt:' field. 1934ef27db87SMehdi Amini if (Record.size() < 8 || Record.size() > 10) 1935ef27db87SMehdi Amini return error("Invalid record"); 1936ef27db87SMehdi Amini 1937ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 1938ef27db87SMehdi Amini bool HasAlignment = Record[0] & 2; 1939ef27db87SMehdi Amini // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or 1940ef27db87SMehdi Amini // DW_TAG_arg_variable, if we have alignment flag encoded it means, that 194168168d17SSimon Pilgrim // this is newer version of record which doesn't have artificial tag. 1942ef27db87SMehdi Amini bool HasTag = !HasAlignment && Record.size() > 8; 1943ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]); 1944ef27db87SMehdi Amini uint32_t AlignInBits = 0; 1945ef27db87SMehdi Amini if (HasAlignment) { 1946ef27db87SMehdi Amini if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1947ef27db87SMehdi Amini return error("Alignment value is too large"); 1948ef27db87SMehdi Amini AlignInBits = Record[8 + HasTag]; 1949ef27db87SMehdi Amini } 1950ef27db87SMehdi Amini MetadataList.assignValue( 1951ef27db87SMehdi Amini GET_OR_DISTINCT(DILocalVariable, 1952ef27db87SMehdi Amini (Context, getMDOrNull(Record[1 + HasTag]), 1953ef27db87SMehdi Amini getMDString(Record[2 + HasTag]), 1954ef27db87SMehdi Amini getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag], 1955ef27db87SMehdi Amini getDITypeRefOrNull(Record[5 + HasTag]), 1956ef27db87SMehdi Amini Record[6 + HasTag], Flags, AlignInBits)), 1957c05c9db3SIvan Krasin NextMetadataNo); 1958c05c9db3SIvan Krasin NextMetadataNo++; 1959ef27db87SMehdi Amini break; 1960ef27db87SMehdi Amini } 19612c864551SShiva Chen case bitc::METADATA_LABEL: { 19622c864551SShiva Chen if (Record.size() != 5) 19632c864551SShiva Chen return error("Invalid record"); 19642c864551SShiva Chen 19652c864551SShiva Chen IsDistinct = Record[0] & 1; 19662c864551SShiva Chen MetadataList.assignValue( 19672c864551SShiva Chen GET_OR_DISTINCT(DILabel, 19682c864551SShiva Chen (Context, getMDOrNull(Record[1]), 19692c864551SShiva Chen getMDString(Record[2]), 19702c864551SShiva Chen getMDOrNull(Record[3]), Record[4])), 19712c864551SShiva Chen NextMetadataNo); 19722c864551SShiva Chen NextMetadataNo++; 19732c864551SShiva Chen break; 19742c864551SShiva Chen } 1975ef27db87SMehdi Amini case bitc::METADATA_EXPRESSION: { 1976ef27db87SMehdi Amini if (Record.size() < 1) 1977ef27db87SMehdi Amini return error("Invalid record"); 1978ef27db87SMehdi Amini 1979ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 19806825fb64SAdrian Prantl uint64_t Version = Record[0] >> 1; 1981ef27db87SMehdi Amini auto Elts = MutableArrayRef<uint64_t>(Record).slice(1); 1982ffc498dfSFlorian Hahn 1983ffc498dfSFlorian Hahn SmallVector<uint64_t, 6> Buffer; 1984*52b5491aSJonas Devlieghere if (Error Err = upgradeDIExpression(Version, Elts, Buffer)) 1985ffc498dfSFlorian Hahn return Err; 1986ef27db87SMehdi Amini 1987ef27db87SMehdi Amini MetadataList.assignValue( 1988ffc498dfSFlorian Hahn GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo); 1989c05c9db3SIvan Krasin NextMetadataNo++; 1990ef27db87SMehdi Amini break; 1991ef27db87SMehdi Amini } 1992bceaaa96SAdrian Prantl case bitc::METADATA_GLOBAL_VAR_EXPR: { 1993bceaaa96SAdrian Prantl if (Record.size() != 3) 1994bceaaa96SAdrian Prantl return error("Invalid record"); 1995bceaaa96SAdrian Prantl 1996bceaaa96SAdrian Prantl IsDistinct = Record[0]; 199705782218SAdrian Prantl Metadata *Expr = getMDOrNull(Record[2]); 199805782218SAdrian Prantl if (!Expr) 199905782218SAdrian Prantl Expr = DIExpression::get(Context, {}); 200005782218SAdrian Prantl MetadataList.assignValue( 200105782218SAdrian Prantl GET_OR_DISTINCT(DIGlobalVariableExpression, 200205782218SAdrian Prantl (Context, getMDOrNull(Record[1]), Expr)), 2003c05c9db3SIvan Krasin NextMetadataNo); 2004c05c9db3SIvan Krasin NextMetadataNo++; 2005bceaaa96SAdrian Prantl break; 2006bceaaa96SAdrian Prantl } 2007ef27db87SMehdi Amini case bitc::METADATA_OBJC_PROPERTY: { 2008ef27db87SMehdi Amini if (Record.size() != 8) 2009ef27db87SMehdi Amini return error("Invalid record"); 2010ef27db87SMehdi Amini 2011ef27db87SMehdi Amini IsDistinct = Record[0]; 2012ef27db87SMehdi Amini MetadataList.assignValue( 2013ef27db87SMehdi Amini GET_OR_DISTINCT(DIObjCProperty, 2014ef27db87SMehdi Amini (Context, getMDString(Record[1]), 2015ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3], 2016ef27db87SMehdi Amini getMDString(Record[4]), getMDString(Record[5]), 2017ef27db87SMehdi Amini Record[6], getDITypeRefOrNull(Record[7]))), 2018c05c9db3SIvan Krasin NextMetadataNo); 2019c05c9db3SIvan Krasin NextMetadataNo++; 2020ef27db87SMehdi Amini break; 2021ef27db87SMehdi Amini } 2022ef27db87SMehdi Amini case bitc::METADATA_IMPORTED_ENTITY: { 2023d63bfd21SAdrian Prantl if (Record.size() != 6 && Record.size() != 7) 2024ef27db87SMehdi Amini return error("Invalid record"); 2025ef27db87SMehdi Amini 2026ef27db87SMehdi Amini IsDistinct = Record[0]; 2027d63bfd21SAdrian Prantl bool HasFile = (Record.size() == 7); 2028ef27db87SMehdi Amini MetadataList.assignValue( 2029ef27db87SMehdi Amini GET_OR_DISTINCT(DIImportedEntity, 2030ef27db87SMehdi Amini (Context, Record[1], getMDOrNull(Record[2]), 2031d63bfd21SAdrian Prantl getDITypeRefOrNull(Record[3]), 2032d63bfd21SAdrian Prantl HasFile ? getMDOrNull(Record[6]) : nullptr, 2033d63bfd21SAdrian Prantl HasFile ? Record[4] : 0, getMDString(Record[5]))), 2034c05c9db3SIvan Krasin NextMetadataNo); 2035c05c9db3SIvan Krasin NextMetadataNo++; 2036ef27db87SMehdi Amini break; 2037ef27db87SMehdi Amini } 2038ef27db87SMehdi Amini case bitc::METADATA_STRING_OLD: { 2039ef27db87SMehdi Amini std::string String(Record.begin(), Record.end()); 2040ef27db87SMehdi Amini 2041ef27db87SMehdi Amini // Test for upgrading !llvm.loop. 2042ef27db87SMehdi Amini HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String); 204319ef4fadSMehdi Amini ++NumMDStringLoaded; 2044ef27db87SMehdi Amini Metadata *MD = MDString::get(Context, String); 2045c05c9db3SIvan Krasin MetadataList.assignValue(MD, NextMetadataNo); 2046c05c9db3SIvan Krasin NextMetadataNo++; 2047ef27db87SMehdi Amini break; 2048ef27db87SMehdi Amini } 204919ef4fadSMehdi Amini case bitc::METADATA_STRINGS: { 205019ef4fadSMehdi Amini auto CreateNextMDString = [&](StringRef Str) { 205119ef4fadSMehdi Amini ++NumMDStringLoaded; 2052c05c9db3SIvan Krasin MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo); 2053c05c9db3SIvan Krasin NextMetadataNo++; 205419ef4fadSMehdi Amini }; 205519ef4fadSMehdi Amini if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString)) 2056ef27db87SMehdi Amini return Err; 2057ef27db87SMehdi Amini break; 205819ef4fadSMehdi Amini } 2059ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 2060ef27db87SMehdi Amini if (Record.size() % 2 == 0) 2061ef27db87SMehdi Amini return error("Invalid record"); 2062ef27db87SMehdi Amini unsigned ValueID = Record[0]; 2063ef27db87SMehdi Amini if (ValueID >= ValueList.size()) 2064ef27db87SMehdi Amini return error("Invalid record"); 2065ef27db87SMehdi Amini if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) 2066ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment( 2067ef27db87SMehdi Amini *GO, ArrayRef<uint64_t>(Record).slice(1))) 2068ef27db87SMehdi Amini return Err; 2069ef27db87SMehdi Amini break; 2070ef27db87SMehdi Amini } 2071ef27db87SMehdi Amini case bitc::METADATA_KIND: { 2072ef27db87SMehdi Amini // Support older bitcode files that had METADATA_KIND records in a 2073ef27db87SMehdi Amini // block with METADATA_BLOCK_ID. 2074ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record)) 2075ef27db87SMehdi Amini return Err; 2076ef27db87SMehdi Amini break; 2077ef27db87SMehdi Amini } 207865600cb2Sgbtozers case bitc::METADATA_ARG_LIST: { 207965600cb2Sgbtozers SmallVector<ValueAsMetadata *, 4> Elts; 208065600cb2Sgbtozers Elts.reserve(Record.size()); 2081e5d844b5SStephen Tozer for (uint64_t Elt : Record) { 2082e5d844b5SStephen Tozer Metadata *MD = getMD(Elt); 2083e5d844b5SStephen Tozer if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary()) 2084e5d844b5SStephen Tozer return error( 2085e5d844b5SStephen Tozer "Invalid record: DIArgList should not contain forward refs"); 2086e5d844b5SStephen Tozer if (!isa<ValueAsMetadata>(MD)) 2087e5d844b5SStephen Tozer return error("Invalid record"); 2088e5d844b5SStephen Tozer Elts.push_back(cast<ValueAsMetadata>(MD)); 2089e5d844b5SStephen Tozer } 209065600cb2Sgbtozers 209165600cb2Sgbtozers MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo); 209265600cb2Sgbtozers NextMetadataNo++; 209365600cb2Sgbtozers break; 209465600cb2Sgbtozers } 2095ef27db87SMehdi Amini } 20969f926f70SMehdi Amini return Error::success(); 209719ef4fadSMehdi Amini #undef GET_OR_DISTINCT 2098ef27db87SMehdi Amini } 2099ef27db87SMehdi Amini 2100ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings( 210119ef4fadSMehdi Amini ArrayRef<uint64_t> Record, StringRef Blob, 2102061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack) { 2103ef27db87SMehdi Amini // All the MDStrings in the block are emitted together in a single 2104ef27db87SMehdi Amini // record. The strings are concatenated and stored in a blob along with 2105ef27db87SMehdi Amini // their sizes. 2106ef27db87SMehdi Amini if (Record.size() != 2) 2107ef27db87SMehdi Amini return error("Invalid record: metadata strings layout"); 2108ef27db87SMehdi Amini 2109ef27db87SMehdi Amini unsigned NumStrings = Record[0]; 2110ef27db87SMehdi Amini unsigned StringsOffset = Record[1]; 2111ef27db87SMehdi Amini if (!NumStrings) 2112ef27db87SMehdi Amini return error("Invalid record: metadata strings with no strings"); 2113ef27db87SMehdi Amini if (StringsOffset > Blob.size()) 2114ef27db87SMehdi Amini return error("Invalid record: metadata strings corrupt offset"); 2115ef27db87SMehdi Amini 2116ef27db87SMehdi Amini StringRef Lengths = Blob.slice(0, StringsOffset); 2117ef27db87SMehdi Amini SimpleBitstreamCursor R(Lengths); 2118ef27db87SMehdi Amini 2119ef27db87SMehdi Amini StringRef Strings = Blob.drop_front(StringsOffset); 2120ef27db87SMehdi Amini do { 2121ef27db87SMehdi Amini if (R.AtEndOfStream()) 2122ef27db87SMehdi Amini return error("Invalid record: metadata strings bad length"); 2123ef27db87SMehdi Amini 21240e828958SJF Bastien Expected<uint32_t> MaybeSize = R.ReadVBR(6); 21250e828958SJF Bastien if (!MaybeSize) 21260e828958SJF Bastien return MaybeSize.takeError(); 21270e828958SJF Bastien uint32_t Size = MaybeSize.get(); 2128ef27db87SMehdi Amini if (Strings.size() < Size) 2129ef27db87SMehdi Amini return error("Invalid record: metadata strings truncated chars"); 2130ef27db87SMehdi Amini 213119ef4fadSMehdi Amini CallBack(Strings.slice(0, Size)); 2132ef27db87SMehdi Amini Strings = Strings.drop_front(Size); 2133ef27db87SMehdi Amini } while (--NumStrings); 2134ef27db87SMehdi Amini 2135ef27db87SMehdi Amini return Error::success(); 2136ef27db87SMehdi Amini } 2137ef27db87SMehdi Amini 2138ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment( 2139ef27db87SMehdi Amini GlobalObject &GO, ArrayRef<uint64_t> Record) { 2140ef27db87SMehdi Amini assert(Record.size() % 2 == 0); 2141ef27db87SMehdi Amini for (unsigned I = 0, E = Record.size(); I != E; I += 2) { 2142ef27db87SMehdi Amini auto K = MDKindMap.find(Record[I]); 2143ef27db87SMehdi Amini if (K == MDKindMap.end()) 2144ef27db87SMehdi Amini return error("Invalid ID"); 2145c27ab339STeresa Johnson MDNode *MD = 2146c27ab339STeresa Johnson dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1])); 2147ef27db87SMehdi Amini if (!MD) 2148f3d2453dSTeresa Johnson return error("Invalid metadata attachment: expect fwd ref to MDNode"); 2149ef27db87SMehdi Amini GO.addMetadata(K->second, *MD); 2150ef27db87SMehdi Amini } 2151ef27db87SMehdi Amini return Error::success(); 2152ef27db87SMehdi Amini } 2153ef27db87SMehdi Amini 2154ef27db87SMehdi Amini /// Parse metadata attachments. 2155ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment( 2156ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList) { 21570e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 21580e828958SJF Bastien return Err; 2159ef27db87SMehdi Amini 2160ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 21617b0d1457SMehdi Amini PlaceholderQueue Placeholders; 2162ef27db87SMehdi Amini 2163ef27db87SMehdi Amini while (true) { 21640e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); 21650e828958SJF Bastien if (!MaybeEntry) 21660e828958SJF Bastien return MaybeEntry.takeError(); 21670e828958SJF Bastien BitstreamEntry Entry = MaybeEntry.get(); 2168ef27db87SMehdi Amini 2169ef27db87SMehdi Amini switch (Entry.Kind) { 2170ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 2171ef27db87SMehdi Amini case BitstreamEntry::Error: 2172ef27db87SMehdi Amini return error("Malformed block"); 2173ef27db87SMehdi Amini case BitstreamEntry::EndBlock: 21747b0d1457SMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 2175ef27db87SMehdi Amini return Error::success(); 2176ef27db87SMehdi Amini case BitstreamEntry::Record: 2177ef27db87SMehdi Amini // The interesting case. 2178ef27db87SMehdi Amini break; 2179ef27db87SMehdi Amini } 2180ef27db87SMehdi Amini 2181ef27db87SMehdi Amini // Read a metadata attachment record. 2182ef27db87SMehdi Amini Record.clear(); 218319ef4fadSMehdi Amini ++NumMDRecordLoaded; 21840e828958SJF Bastien Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record); 21850e828958SJF Bastien if (!MaybeRecord) 21860e828958SJF Bastien return MaybeRecord.takeError(); 21870e828958SJF Bastien switch (MaybeRecord.get()) { 2188ef27db87SMehdi Amini default: // Default behavior: ignore. 2189ef27db87SMehdi Amini break; 2190ef27db87SMehdi Amini case bitc::METADATA_ATTACHMENT: { 2191ef27db87SMehdi Amini unsigned RecordLength = Record.size(); 2192ef27db87SMehdi Amini if (Record.empty()) 2193ef27db87SMehdi Amini return error("Invalid record"); 2194ef27db87SMehdi Amini if (RecordLength % 2 == 0) { 2195ef27db87SMehdi Amini // A function attachment. 2196ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment(F, Record)) 2197ef27db87SMehdi Amini return Err; 2198ef27db87SMehdi Amini continue; 2199ef27db87SMehdi Amini } 2200ef27db87SMehdi Amini 2201ef27db87SMehdi Amini // An instruction attachment. 2202ef27db87SMehdi Amini Instruction *Inst = InstructionList[Record[0]]; 2203ef27db87SMehdi Amini for (unsigned i = 1; i != RecordLength; i = i + 2) { 2204ef27db87SMehdi Amini unsigned Kind = Record[i]; 2205ef27db87SMehdi Amini DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind); 2206ef27db87SMehdi Amini if (I == MDKindMap.end()) 2207ef27db87SMehdi Amini return error("Invalid ID"); 22088662305bSMehdi Amini if (I->second == LLVMContext::MD_tbaa && StripTBAA) 22098662305bSMehdi Amini continue; 22108662305bSMehdi Amini 221119ef4fadSMehdi Amini auto Idx = Record[i + 1]; 221219ef4fadSMehdi Amini if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) && 2213d5549f3dSMehdi Amini !MetadataList.lookup(Idx)) { 221419ef4fadSMehdi Amini // Load the attachment if it is in the lazy-loadable range and hasn't 221519ef4fadSMehdi Amini // been loaded yet. 221619ef4fadSMehdi Amini lazyLoadOneMetadata(Idx, Placeholders); 2217d5549f3dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 2218d5549f3dSMehdi Amini } 221919ef4fadSMehdi Amini 222019ef4fadSMehdi Amini Metadata *Node = MetadataList.getMetadataFwdRef(Idx); 2221ef27db87SMehdi Amini if (isa<LocalAsMetadata>(Node)) 2222ef27db87SMehdi Amini // Drop the attachment. This used to be legal, but there's no 2223ef27db87SMehdi Amini // upgrade path. 2224ef27db87SMehdi Amini break; 2225ef27db87SMehdi Amini MDNode *MD = dyn_cast_or_null<MDNode>(Node); 2226ef27db87SMehdi Amini if (!MD) 2227ef27db87SMehdi Amini return error("Invalid metadata attachment"); 2228ef27db87SMehdi Amini 2229ef27db87SMehdi Amini if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop) 2230ef27db87SMehdi Amini MD = upgradeInstructionLoopAttachment(*MD); 2231ef27db87SMehdi Amini 2232ef27db87SMehdi Amini if (I->second == LLVMContext::MD_tbaa) { 2233ef27db87SMehdi Amini assert(!MD->isTemporary() && "should load MDs before attachments"); 2234ef27db87SMehdi Amini MD = UpgradeTBAANode(*MD); 2235ef27db87SMehdi Amini } 2236ef27db87SMehdi Amini Inst->setMetadata(I->second, MD); 2237ef27db87SMehdi Amini } 2238ef27db87SMehdi Amini break; 2239ef27db87SMehdi Amini } 2240ef27db87SMehdi Amini } 2241ef27db87SMehdi Amini } 2242ef27db87SMehdi Amini } 2243ef27db87SMehdi Amini 2244ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap. 2245ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord( 2246ef27db87SMehdi Amini SmallVectorImpl<uint64_t> &Record) { 2247ef27db87SMehdi Amini if (Record.size() < 2) 2248ef27db87SMehdi Amini return error("Invalid record"); 2249ef27db87SMehdi Amini 2250ef27db87SMehdi Amini unsigned Kind = Record[0]; 2251ef27db87SMehdi Amini SmallString<8> Name(Record.begin() + 1, Record.end()); 2252ef27db87SMehdi Amini 2253ef27db87SMehdi Amini unsigned NewKind = TheModule.getMDKindID(Name.str()); 2254ef27db87SMehdi Amini if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 2255ef27db87SMehdi Amini return error("Conflicting METADATA_KIND records"); 2256ef27db87SMehdi Amini return Error::success(); 2257ef27db87SMehdi Amini } 2258ef27db87SMehdi Amini 2259ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK. 2260ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() { 22610e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID)) 22620e828958SJF Bastien return Err; 2263ef27db87SMehdi Amini 2264ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 2265ef27db87SMehdi Amini 2266ef27db87SMehdi Amini // Read all the records. 2267ef27db87SMehdi Amini while (true) { 22680e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks(); 22690e828958SJF Bastien if (!MaybeEntry) 22700e828958SJF Bastien return MaybeEntry.takeError(); 22710e828958SJF Bastien BitstreamEntry Entry = MaybeEntry.get(); 2272ef27db87SMehdi Amini 2273ef27db87SMehdi Amini switch (Entry.Kind) { 2274ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 2275ef27db87SMehdi Amini case BitstreamEntry::Error: 2276ef27db87SMehdi Amini return error("Malformed block"); 2277ef27db87SMehdi Amini case BitstreamEntry::EndBlock: 2278ef27db87SMehdi Amini return Error::success(); 2279ef27db87SMehdi Amini case BitstreamEntry::Record: 2280ef27db87SMehdi Amini // The interesting case. 2281ef27db87SMehdi Amini break; 2282ef27db87SMehdi Amini } 2283ef27db87SMehdi Amini 2284ef27db87SMehdi Amini // Read a record. 2285ef27db87SMehdi Amini Record.clear(); 228619ef4fadSMehdi Amini ++NumMDRecordLoaded; 22870e828958SJF Bastien Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record); 22880e828958SJF Bastien if (!MaybeCode) 22890e828958SJF Bastien return MaybeCode.takeError(); 22900e828958SJF Bastien switch (MaybeCode.get()) { 2291ef27db87SMehdi Amini default: // Default behavior: ignore. 2292ef27db87SMehdi Amini break; 2293ef27db87SMehdi Amini case bitc::METADATA_KIND: { 2294ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record)) 2295ef27db87SMehdi Amini return Err; 2296ef27db87SMehdi Amini break; 2297ef27db87SMehdi Amini } 2298ef27db87SMehdi Amini } 2299ef27db87SMehdi Amini } 2300ef27db87SMehdi Amini } 2301ef27db87SMehdi Amini 2302ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) { 2303ef27db87SMehdi Amini Pimpl = std::move(RHS.Pimpl); 2304ef27db87SMehdi Amini return *this; 2305ef27db87SMehdi Amini } 2306ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS) 2307ec68dd49SMehdi Amini : Pimpl(std::move(RHS.Pimpl)) {} 2308ef27db87SMehdi Amini 2309ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default; 2310ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 2311ef27db87SMehdi Amini BitcodeReaderValueList &ValueList, 2312a61f5e37STeresa Johnson bool IsImporting, 2313ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID) 23140eaee545SJonas Devlieghere : Pimpl(std::make_unique<MetadataLoaderImpl>( 2315061f4a5fSBenjamin Kramer Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {} 2316ef27db87SMehdi Amini 2317ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) { 2318ec68dd49SMehdi Amini return Pimpl->parseMetadata(ModuleLevel); 2319ef27db87SMehdi Amini } 2320ef27db87SMehdi Amini 2321ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); } 2322ef27db87SMehdi Amini 2323ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 2324ef27db87SMehdi Amini /// necessary. 23253bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) { 23263bb4d01dSMehdi Amini return Pimpl->getMetadataFwdRefOrLoad(Idx); 2327ef27db87SMehdi Amini } 2328ef27db87SMehdi Amini 2329ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) { 2330ef27db87SMehdi Amini return Pimpl->lookupSubprogramForFunction(F); 2331ef27db87SMehdi Amini } 2332ef27db87SMehdi Amini 2333ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment( 2334ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList) { 2335ef27db87SMehdi Amini return Pimpl->parseMetadataAttachment(F, InstructionList); 2336ef27db87SMehdi Amini } 2337ef27db87SMehdi Amini 2338ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() { 2339ef27db87SMehdi Amini return Pimpl->parseMetadataKinds(); 2340ef27db87SMehdi Amini } 2341ef27db87SMehdi Amini 23428662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) { 23438662305bSMehdi Amini return Pimpl->setStripTBAA(StripTBAA); 23448662305bSMehdi Amini } 23458662305bSMehdi Amini 23468662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); } 23478662305bSMehdi Amini 2348ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); } 2349ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); } 23506825fb64SAdrian Prantl 23516825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) { 23526825fb64SAdrian Prantl return Pimpl->upgradeDebugIntrinsics(F); 23536825fb64SAdrian Prantl } 2354