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" 24ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h" 2508ed2160SItay Bookstein #include "llvm/Bitstream/BitstreamReader.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/GlobalObject.h" 44ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h" 45ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h" 46ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h" 47ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h" 48ef27db87SMehdi Amini #include "llvm/IR/Instruction.h" 49ef27db87SMehdi Amini #include "llvm/IR/Instructions.h" 506825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h" 516bda14b3SChandler Carruth #include "llvm/IR/Intrinsics.h" 52ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h" 53ef27db87SMehdi Amini #include "llvm/IR/Module.h" 54ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h" 55ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h" 56ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h" 57ef27db87SMehdi Amini #include "llvm/IR/Type.h" 58ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h" 59ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h" 60ef27db87SMehdi Amini #include "llvm/Support/Casting.h" 61ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h" 62ef27db87SMehdi Amini #include "llvm/Support/Compiler.h" 63ef27db87SMehdi Amini #include "llvm/Support/Debug.h" 64ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h" 65ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h" 66ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h" 67ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h" 68ef27db87SMehdi Amini #include <algorithm> 69ef27db87SMehdi Amini #include <cassert> 70ef27db87SMehdi Amini #include <cstddef> 71ef27db87SMehdi Amini #include <cstdint> 72ef27db87SMehdi Amini #include <deque> 73ef27db87SMehdi Amini #include <limits> 74ef27db87SMehdi Amini #include <map> 75ef27db87SMehdi Amini #include <string> 76ef27db87SMehdi Amini #include <system_error> 77ef27db87SMehdi Amini #include <tuple> 78ef27db87SMehdi Amini #include <utility> 79ef27db87SMehdi Amini #include <vector> 80ef27db87SMehdi Amini 81ef27db87SMehdi Amini using namespace llvm; 82ef27db87SMehdi Amini 8319ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader" 8419ef4fadSMehdi Amini 8519ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded"); 8619ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created"); 8719ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded"); 8819ef4fadSMehdi Amini 89a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO. 90a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB. 91a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions( 92a61f5e37STeresa Johnson "import-full-type-definitions", cl::init(false), cl::Hidden, 93a61f5e37STeresa Johnson cl::desc("Import full type definitions for ThinLTO.")); 94a61f5e37STeresa Johnson 9519ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading( 9619ef4fadSMehdi Amini "disable-ondemand-mds-loading", cl::init(false), cl::Hidden, 9719ef4fadSMehdi Amini cl::desc("Force disable the lazy-loading on-demand of metadata when " 9819ef4fadSMehdi Amini "loading bitcode for importing.")); 9919ef4fadSMehdi Amini 100ef27db87SMehdi Amini namespace { 101ef27db87SMehdi Amini 102aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; } 103ef27db87SMehdi Amini 104ef27db87SMehdi Amini class BitcodeReaderMetadataList { 105ef27db87SMehdi Amini /// Array of metadata references. 106ef27db87SMehdi Amini /// 107ef27db87SMehdi Amini /// Don't use std::vector here. Some versions of libc++ copy (instead of 108ef27db87SMehdi Amini /// move) on resize, and TrackingMDRef is very expensive to copy. 109ef27db87SMehdi Amini SmallVector<TrackingMDRef, 1> MetadataPtrs; 110ef27db87SMehdi Amini 111690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of forward references that were 112690952d1SMehdi Amini /// generated. 113690952d1SMehdi Amini SmallDenseSet<unsigned, 1> ForwardReference; 114690952d1SMehdi Amini 115690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of Metadata that need to be 116690952d1SMehdi Amini /// resolved. 117690952d1SMehdi Amini SmallDenseSet<unsigned, 1> UnresolvedNodes; 118690952d1SMehdi Amini 119ef27db87SMehdi Amini /// Structures for resolving old type refs. 120ef27db87SMehdi Amini struct { 121ef27db87SMehdi Amini SmallDenseMap<MDString *, TempMDTuple, 1> Unknown; 122ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> Final; 123ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls; 124ef27db87SMehdi Amini SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays; 125ef27db87SMehdi Amini } OldTypeRefs; 126ef27db87SMehdi Amini 127ef27db87SMehdi Amini LLVMContext &Context; 128ef27db87SMehdi Amini 129864474c9SFlorian Hahn /// Maximum number of valid references. Forward references exceeding the 130864474c9SFlorian Hahn /// maximum must be invalid. 131864474c9SFlorian Hahn unsigned RefsUpperBound; 132864474c9SFlorian Hahn 133ef27db87SMehdi Amini public: 134864474c9SFlorian Hahn BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound) 135864474c9SFlorian Hahn : Context(C), 136864474c9SFlorian Hahn RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(), 137864474c9SFlorian Hahn RefsUpperBound)) {} 138ef27db87SMehdi Amini 139ef27db87SMehdi Amini // vector compatibility methods 140ef27db87SMehdi Amini unsigned size() const { return MetadataPtrs.size(); } 141ef27db87SMehdi Amini void resize(unsigned N) { MetadataPtrs.resize(N); } 142ef27db87SMehdi Amini void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); } 143ef27db87SMehdi Amini void clear() { MetadataPtrs.clear(); } 144ef27db87SMehdi Amini Metadata *back() const { return MetadataPtrs.back(); } 145ef27db87SMehdi Amini void pop_back() { MetadataPtrs.pop_back(); } 146ef27db87SMehdi Amini bool empty() const { return MetadataPtrs.empty(); } 147ef27db87SMehdi Amini 148ef27db87SMehdi Amini Metadata *operator[](unsigned i) const { 149ef27db87SMehdi Amini assert(i < MetadataPtrs.size()); 150ef27db87SMehdi Amini return MetadataPtrs[i]; 151ef27db87SMehdi Amini } 152ef27db87SMehdi Amini 153ef27db87SMehdi Amini Metadata *lookup(unsigned I) const { 154ef27db87SMehdi Amini if (I < MetadataPtrs.size()) 155ef27db87SMehdi Amini return MetadataPtrs[I]; 156ef27db87SMehdi Amini return nullptr; 157ef27db87SMehdi Amini } 158ef27db87SMehdi Amini 159ef27db87SMehdi Amini void shrinkTo(unsigned N) { 160ef27db87SMehdi Amini assert(N <= size() && "Invalid shrinkTo request!"); 161690952d1SMehdi Amini assert(ForwardReference.empty() && "Unexpected forward refs"); 162690952d1SMehdi Amini assert(UnresolvedNodes.empty() && "Unexpected unresolved node"); 163ef27db87SMehdi Amini MetadataPtrs.resize(N); 164ef27db87SMehdi Amini } 165ef27db87SMehdi Amini 166ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 167ef27db87SMehdi Amini /// necessary. 168ef27db87SMehdi Amini Metadata *getMetadataFwdRef(unsigned Idx); 169ef27db87SMehdi Amini 1708f976ba0SHiroshi Inoue /// Return the given metadata only if it is fully resolved. 171ef27db87SMehdi Amini /// 172ef27db87SMehdi Amini /// Gives the same result as \a lookup(), unless \a MDNode::isResolved() 173ef27db87SMehdi Amini /// would give \c false. 174ef27db87SMehdi Amini Metadata *getMetadataIfResolved(unsigned Idx); 175ef27db87SMehdi Amini 176ef27db87SMehdi Amini MDNode *getMDNodeFwdRefOrNull(unsigned Idx); 177ef27db87SMehdi Amini void assignValue(Metadata *MD, unsigned Idx); 178ef27db87SMehdi Amini void tryToResolveCycles(); 179690952d1SMehdi Amini bool hasFwdRefs() const { return !ForwardReference.empty(); } 18019ef4fadSMehdi Amini int getNextFwdRef() { 18119ef4fadSMehdi Amini assert(hasFwdRefs()); 18219ef4fadSMehdi Amini return *ForwardReference.begin(); 18319ef4fadSMehdi Amini } 184ef27db87SMehdi Amini 185ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference. 186ef27db87SMehdi Amini void addTypeRef(MDString &UUID, DICompositeType &CT); 187ef27db87SMehdi Amini 188ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference. 189ef27db87SMehdi Amini Metadata *upgradeTypeRef(Metadata *MaybeUUID); 190ef27db87SMehdi Amini 191ef27db87SMehdi Amini /// Upgrade a type ref array that may have MDString references. 192ef27db87SMehdi Amini Metadata *upgradeTypeRefArray(Metadata *MaybeTuple); 193ef27db87SMehdi Amini 194ef27db87SMehdi Amini private: 195ef27db87SMehdi Amini Metadata *resolveTypeRefArray(Metadata *MaybeTuple); 196ef27db87SMehdi Amini }; 197ef27db87SMehdi Amini 198ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) { 199690952d1SMehdi Amini if (auto *MDN = dyn_cast<MDNode>(MD)) 200690952d1SMehdi Amini if (!MDN->isResolved()) 201690952d1SMehdi Amini UnresolvedNodes.insert(Idx); 202690952d1SMehdi Amini 203ef27db87SMehdi Amini if (Idx == size()) { 204ef27db87SMehdi Amini push_back(MD); 205ef27db87SMehdi Amini return; 206ef27db87SMehdi Amini } 207ef27db87SMehdi Amini 208ef27db87SMehdi Amini if (Idx >= size()) 209ef27db87SMehdi Amini resize(Idx + 1); 210ef27db87SMehdi Amini 211ef27db87SMehdi Amini TrackingMDRef &OldMD = MetadataPtrs[Idx]; 212ef27db87SMehdi Amini if (!OldMD) { 213ef27db87SMehdi Amini OldMD.reset(MD); 214ef27db87SMehdi Amini return; 215ef27db87SMehdi Amini } 216ef27db87SMehdi Amini 217ef27db87SMehdi Amini // If there was a forward reference to this value, replace it. 218ef27db87SMehdi Amini TempMDTuple PrevMD(cast<MDTuple>(OldMD.get())); 219ef27db87SMehdi Amini PrevMD->replaceAllUsesWith(MD); 220690952d1SMehdi Amini ForwardReference.erase(Idx); 221ef27db87SMehdi Amini } 222ef27db87SMehdi Amini 223ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) { 224864474c9SFlorian Hahn // Bail out for a clearly invalid value. 225864474c9SFlorian Hahn if (Idx >= RefsUpperBound) 226864474c9SFlorian Hahn return nullptr; 227864474c9SFlorian Hahn 228ef27db87SMehdi Amini if (Idx >= size()) 229ef27db87SMehdi Amini resize(Idx + 1); 230ef27db87SMehdi Amini 231ef27db87SMehdi Amini if (Metadata *MD = MetadataPtrs[Idx]) 232ef27db87SMehdi Amini return MD; 233ef27db87SMehdi Amini 234ef27db87SMehdi Amini // Track forward refs to be resolved later. 235690952d1SMehdi Amini ForwardReference.insert(Idx); 236ef27db87SMehdi Amini 237ef27db87SMehdi Amini // Create and return a placeholder, which will later be RAUW'd. 23819ef4fadSMehdi Amini ++NumMDNodeTemporary; 239ef27db87SMehdi Amini Metadata *MD = MDNode::getTemporary(Context, None).release(); 240ef27db87SMehdi Amini MetadataPtrs[Idx].reset(MD); 241ef27db87SMehdi Amini return MD; 242ef27db87SMehdi Amini } 243ef27db87SMehdi Amini 244ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) { 245ef27db87SMehdi Amini Metadata *MD = lookup(Idx); 246ef27db87SMehdi Amini if (auto *N = dyn_cast_or_null<MDNode>(MD)) 247ef27db87SMehdi Amini if (!N->isResolved()) 248ef27db87SMehdi Amini return nullptr; 249ef27db87SMehdi Amini return MD; 250ef27db87SMehdi Amini } 251ef27db87SMehdi Amini 252ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) { 253ef27db87SMehdi Amini return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx)); 254ef27db87SMehdi Amini } 255ef27db87SMehdi Amini 256ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() { 257690952d1SMehdi Amini if (!ForwardReference.empty()) 258ef27db87SMehdi Amini // Still forward references... can't resolve cycles. 259ef27db87SMehdi Amini return; 260ef27db87SMehdi Amini 261ef27db87SMehdi Amini // Give up on finding a full definition for any forward decls that remain. 262ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.FwdDecls) 263ef27db87SMehdi Amini OldTypeRefs.Final.insert(Ref); 264ef27db87SMehdi Amini OldTypeRefs.FwdDecls.clear(); 265ef27db87SMehdi Amini 266ef27db87SMehdi Amini // Upgrade from old type ref arrays. In strange cases, this could add to 267ef27db87SMehdi Amini // OldTypeRefs.Unknown. 268690952d1SMehdi Amini for (const auto &Array : OldTypeRefs.Arrays) 269ef27db87SMehdi Amini Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get())); 270ef27db87SMehdi Amini OldTypeRefs.Arrays.clear(); 271ef27db87SMehdi Amini 272ef27db87SMehdi Amini // Replace old string-based type refs with the resolved node, if possible. 273ef27db87SMehdi Amini // If we haven't seen the node, leave it to the verifier to complain about 274ef27db87SMehdi Amini // the invalid string reference. 275ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.Unknown) { 276ef27db87SMehdi Amini if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first)) 277ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(CT); 278ef27db87SMehdi Amini else 279ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(Ref.first); 280ef27db87SMehdi Amini } 281ef27db87SMehdi Amini OldTypeRefs.Unknown.clear(); 282ef27db87SMehdi Amini 283690952d1SMehdi Amini if (UnresolvedNodes.empty()) 284ef27db87SMehdi Amini // Nothing to do. 285ef27db87SMehdi Amini return; 286ef27db87SMehdi Amini 287ef27db87SMehdi Amini // Resolve any cycles. 288690952d1SMehdi Amini for (unsigned I : UnresolvedNodes) { 289ef27db87SMehdi Amini auto &MD = MetadataPtrs[I]; 290ef27db87SMehdi Amini auto *N = dyn_cast_or_null<MDNode>(MD); 291ef27db87SMehdi Amini if (!N) 292ef27db87SMehdi Amini continue; 293ef27db87SMehdi Amini 294ef27db87SMehdi Amini assert(!N->isTemporary() && "Unexpected forward reference"); 295ef27db87SMehdi Amini N->resolveCycles(); 296ef27db87SMehdi Amini } 297ef27db87SMehdi Amini 298690952d1SMehdi Amini // Make sure we return early again until there's another unresolved ref. 299690952d1SMehdi Amini UnresolvedNodes.clear(); 300ef27db87SMehdi Amini } 301ef27db87SMehdi Amini 302ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID, 303ef27db87SMehdi Amini DICompositeType &CT) { 304ef27db87SMehdi Amini assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID"); 305ef27db87SMehdi Amini if (CT.isForwardDecl()) 306ef27db87SMehdi Amini OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT)); 307ef27db87SMehdi Amini else 308ef27db87SMehdi Amini OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT)); 309ef27db87SMehdi Amini } 310ef27db87SMehdi Amini 311ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) { 312ef27db87SMehdi Amini auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID); 313ef27db87SMehdi Amini if (LLVM_LIKELY(!UUID)) 314ef27db87SMehdi Amini return MaybeUUID; 315ef27db87SMehdi Amini 316ef27db87SMehdi Amini if (auto *CT = OldTypeRefs.Final.lookup(UUID)) 317ef27db87SMehdi Amini return CT; 318ef27db87SMehdi Amini 319ef27db87SMehdi Amini auto &Ref = OldTypeRefs.Unknown[UUID]; 320ef27db87SMehdi Amini if (!Ref) 321ef27db87SMehdi Amini Ref = MDNode::getTemporary(Context, None); 322ef27db87SMehdi Amini return Ref.get(); 323ef27db87SMehdi Amini } 324ef27db87SMehdi Amini 325ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) { 326ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 327ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct()) 328ef27db87SMehdi Amini return MaybeTuple; 329ef27db87SMehdi Amini 330ef27db87SMehdi Amini // Look through the array immediately if possible. 331ef27db87SMehdi Amini if (!Tuple->isTemporary()) 332ef27db87SMehdi Amini return resolveTypeRefArray(Tuple); 333ef27db87SMehdi Amini 334ef27db87SMehdi Amini // Create and return a placeholder to use for now. Eventually 335ef27db87SMehdi Amini // resolveTypeRefArrays() will be resolve this forward reference. 336ef27db87SMehdi Amini OldTypeRefs.Arrays.emplace_back( 337ef27db87SMehdi Amini std::piecewise_construct, std::forward_as_tuple(Tuple), 338ef27db87SMehdi Amini std::forward_as_tuple(MDTuple::getTemporary(Context, None))); 339ef27db87SMehdi Amini return OldTypeRefs.Arrays.back().second.get(); 340ef27db87SMehdi Amini } 341ef27db87SMehdi Amini 342ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) { 343ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple); 344ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct()) 345ef27db87SMehdi Amini return MaybeTuple; 346ef27db87SMehdi Amini 347da82ce99SFangrui Song // Look through the DITypeRefArray, upgrading each DIType *. 348ef27db87SMehdi Amini SmallVector<Metadata *, 32> Ops; 349ef27db87SMehdi Amini Ops.reserve(Tuple->getNumOperands()); 350ef27db87SMehdi Amini for (Metadata *MD : Tuple->operands()) 351ef27db87SMehdi Amini Ops.push_back(upgradeTypeRef(MD)); 352ef27db87SMehdi Amini 353ef27db87SMehdi Amini return MDTuple::get(Context, Ops); 354ef27db87SMehdi Amini } 355ef27db87SMehdi Amini 356ef27db87SMehdi Amini namespace { 357ef27db87SMehdi Amini 358ef27db87SMehdi Amini class PlaceholderQueue { 359ef27db87SMehdi Amini // Placeholders would thrash around when moved, so store in a std::deque 360ef27db87SMehdi Amini // instead of some sort of vector. 361ef27db87SMehdi Amini std::deque<DistinctMDOperandPlaceholder> PHs; 362ef27db87SMehdi Amini 363ef27db87SMehdi Amini public: 36427379892SMehdi Amini ~PlaceholderQueue() { 365665b4138SLuís Ferreira assert(empty() && 366665b4138SLuís Ferreira "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 44795875d24SZarko Todorovski /// Baisic correctness check that we end up parsing all of the global decl 44895875d24SZarko Todorovski /// attachments. 449c27ab339STeresa Johnson unsigned NumGlobalDeclAttachSkipped = 0; 450c27ab339STeresa Johnson unsigned NumGlobalDeclAttachParsed = 0; 451c27ab339STeresa Johnson #endif 452c27ab339STeresa Johnson 453c27ab339STeresa Johnson /// Load the global decl attachments, using the index built for lazy loading. 454c27ab339STeresa Johnson Expected<bool> loadGlobalDeclAttachments(); 455c27ab339STeresa Johnson 45619ef4fadSMehdi Amini /// Populate the index above to enable lazily loading of metadata, and load 45719ef4fadSMehdi Amini /// the named metadata as well as the transitively referenced global 45819ef4fadSMehdi Amini /// Metadata. 45942ef1990SMehdi Amini Expected<bool> lazyLoadModuleMetadataBlock(); 46019ef4fadSMehdi Amini 46119ef4fadSMehdi Amini /// On-demand loading of a single metadata. Requires the index above to be 46219ef4fadSMehdi Amini /// populated. 46319ef4fadSMehdi Amini void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders); 46419ef4fadSMehdi Amini 4659f926f70SMehdi Amini // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to 4669f926f70SMehdi Amini // point from SP to CU after a block is completly parsed. 4679f926f70SMehdi Amini std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms; 4689f926f70SMehdi Amini 469ef27db87SMehdi Amini /// Functions that need to be matched with subprograms when upgrading old 470ef27db87SMehdi Amini /// metadata. 471ef27db87SMehdi Amini SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs; 472ef27db87SMehdi Amini 473ef27db87SMehdi Amini // Map the bitcode's custom MDKind ID to the Module's MDKind ID. 474ef27db87SMehdi Amini DenseMap<unsigned, unsigned> MDKindMap; 475ef27db87SMehdi Amini 4768662305bSMehdi Amini bool StripTBAA = false; 477ef27db87SMehdi Amini bool HasSeenOldLoopTags = false; 478e37d3144SAdrian Prantl bool NeedUpgradeToDIGlobalVariableExpression = false; 4796825fb64SAdrian Prantl bool NeedDeclareExpressionUpgrade = false; 480ef27db87SMehdi Amini 481ec68dd49SMehdi Amini /// True if metadata is being parsed for a module being ThinLTO imported. 482ec68dd49SMehdi Amini bool IsImporting = false; 483ec68dd49SMehdi Amini 4849f926f70SMehdi Amini Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code, 4859f926f70SMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob, 486ef27db87SMehdi Amini unsigned &NextMetadataNo); 48719ef4fadSMehdi Amini Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob, 488061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack); 489ef27db87SMehdi Amini Error parseGlobalObjectAttachment(GlobalObject &GO, 490ef27db87SMehdi Amini ArrayRef<uint64_t> Record); 491ef27db87SMehdi Amini Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record); 492ef27db87SMehdi Amini 49319ef4fadSMehdi Amini void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders); 49419ef4fadSMehdi Amini 49519ef4fadSMehdi Amini /// Upgrade old-style CU <-> SP pointers to point from SP to CU. 49619ef4fadSMehdi Amini void upgradeCUSubprograms() { 49719ef4fadSMehdi Amini for (auto CU_SP : CUSubprograms) 49819ef4fadSMehdi Amini if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second)) 49919ef4fadSMehdi Amini for (auto &Op : SPs->operands()) 5009d2f019fSAdrian Prantl if (auto *SP = dyn_cast_or_null<DISubprogram>(Op)) 5019d2f019fSAdrian Prantl SP->replaceUnit(CU_SP.first); 50219ef4fadSMehdi Amini CUSubprograms.clear(); 50319ef4fadSMehdi Amini } 50419ef4fadSMehdi Amini 505e37d3144SAdrian Prantl /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions. 506e37d3144SAdrian Prantl void upgradeCUVariables() { 507e37d3144SAdrian Prantl if (!NeedUpgradeToDIGlobalVariableExpression) 508e37d3144SAdrian Prantl return; 509e37d3144SAdrian Prantl 510e37d3144SAdrian Prantl // Upgrade list of variables attached to the CUs. 511e37d3144SAdrian Prantl if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu")) 512e37d3144SAdrian Prantl for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) { 513e37d3144SAdrian Prantl auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I)); 514e37d3144SAdrian Prantl if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables())) 515e37d3144SAdrian Prantl for (unsigned I = 0; I < GVs->getNumOperands(); I++) 516e37d3144SAdrian Prantl if (auto *GV = 517e37d3144SAdrian Prantl dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) { 51805782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct( 51905782218SAdrian Prantl Context, GV, DIExpression::get(Context, {})); 520e37d3144SAdrian Prantl GVs->replaceOperandWith(I, DGVE); 521e37d3144SAdrian Prantl } 522e37d3144SAdrian Prantl } 523e37d3144SAdrian Prantl 524e37d3144SAdrian Prantl // Upgrade variables attached to globals. 525e37d3144SAdrian Prantl for (auto &GV : TheModule.globals()) { 52656a08b40SDavide Italiano SmallVector<MDNode *, 1> MDs; 527e37d3144SAdrian Prantl GV.getMetadata(LLVMContext::MD_dbg, MDs); 528e37d3144SAdrian Prantl GV.eraseMetadata(LLVMContext::MD_dbg); 529e37d3144SAdrian Prantl for (auto *MD : MDs) 5302bb217b5SSimon Pilgrim if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) { 53105782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct( 53205782218SAdrian Prantl Context, DGV, DIExpression::get(Context, {})); 533e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *DGVE); 534e37d3144SAdrian Prantl } else 535e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *MD); 536e37d3144SAdrian Prantl } 537e37d3144SAdrian Prantl } 538e37d3144SAdrian Prantl 5396825fb64SAdrian Prantl /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that 5406825fb64SAdrian Prantl /// describes a function argument. 5416825fb64SAdrian Prantl void upgradeDeclareExpressions(Function &F) { 5426825fb64SAdrian Prantl if (!NeedDeclareExpressionUpgrade) 5436825fb64SAdrian Prantl return; 5446825fb64SAdrian Prantl 5456825fb64SAdrian Prantl for (auto &BB : F) 5466825fb64SAdrian Prantl for (auto &I : BB) 5476825fb64SAdrian Prantl if (auto *DDI = dyn_cast<DbgDeclareInst>(&I)) 5486825fb64SAdrian Prantl if (auto *DIExpr = DDI->getExpression()) 5496825fb64SAdrian Prantl if (DIExpr->startsWithDeref() && 550d243cbf8SKazu Hirata isa_and_nonnull<Argument>(DDI->getAddress())) { 5516825fb64SAdrian Prantl SmallVector<uint64_t, 8> Ops; 5526825fb64SAdrian Prantl Ops.append(std::next(DIExpr->elements_begin()), 5536825fb64SAdrian Prantl DIExpr->elements_end()); 554e5d958c4Sgbtozers DDI->setExpression(DIExpression::get(Context, Ops)); 5556825fb64SAdrian Prantl } 5566825fb64SAdrian Prantl } 5576825fb64SAdrian Prantl 558ffc498dfSFlorian Hahn /// Upgrade the expression from previous versions. 55905963a3dSArthur Eubanks Error upgradeDIExpression(uint64_t FromVersion, 560ffc498dfSFlorian Hahn MutableArrayRef<uint64_t> &Expr, 561ffc498dfSFlorian Hahn SmallVectorImpl<uint64_t> &Buffer) { 562ffc498dfSFlorian Hahn auto N = Expr.size(); 563ffc498dfSFlorian Hahn switch (FromVersion) { 564ffc498dfSFlorian Hahn default: 565ffc498dfSFlorian Hahn return error("Invalid record"); 566ffc498dfSFlorian Hahn case 0: 567ffc498dfSFlorian Hahn if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece) 568ffc498dfSFlorian Hahn Expr[N - 3] = dwarf::DW_OP_LLVM_fragment; 569ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 570ffc498dfSFlorian Hahn case 1: 571ffc498dfSFlorian Hahn // Move DW_OP_deref to the end. 572ffc498dfSFlorian Hahn if (N && Expr[0] == dwarf::DW_OP_deref) { 573ffc498dfSFlorian Hahn auto End = Expr.end(); 574ffc498dfSFlorian Hahn if (Expr.size() >= 3 && 575ffc498dfSFlorian Hahn *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment) 576ffc498dfSFlorian Hahn End = std::prev(End, 3); 577ffc498dfSFlorian Hahn std::move(std::next(Expr.begin()), End, Expr.begin()); 578ffc498dfSFlorian Hahn *std::prev(End) = dwarf::DW_OP_deref; 579ffc498dfSFlorian Hahn } 580ffc498dfSFlorian Hahn NeedDeclareExpressionUpgrade = true; 581ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 582ffc498dfSFlorian Hahn case 2: { 583ffc498dfSFlorian Hahn // Change DW_OP_plus to DW_OP_plus_uconst. 584ffc498dfSFlorian Hahn // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus 585ffc498dfSFlorian Hahn auto SubExpr = ArrayRef<uint64_t>(Expr); 586ffc498dfSFlorian Hahn while (!SubExpr.empty()) { 587ffc498dfSFlorian Hahn // Skip past other operators with their operands 588ffc498dfSFlorian Hahn // for this version of the IR, obtained from 589ffc498dfSFlorian Hahn // from historic DIExpression::ExprOperand::getSize(). 590ffc498dfSFlorian Hahn size_t HistoricSize; 591ffc498dfSFlorian Hahn switch (SubExpr.front()) { 592ffc498dfSFlorian Hahn default: 593ffc498dfSFlorian Hahn HistoricSize = 1; 594ffc498dfSFlorian Hahn break; 595ffc498dfSFlorian Hahn case dwarf::DW_OP_constu: 596ffc498dfSFlorian Hahn case dwarf::DW_OP_minus: 597ffc498dfSFlorian Hahn case dwarf::DW_OP_plus: 598ffc498dfSFlorian Hahn HistoricSize = 2; 599ffc498dfSFlorian Hahn break; 600ffc498dfSFlorian Hahn case dwarf::DW_OP_LLVM_fragment: 601ffc498dfSFlorian Hahn HistoricSize = 3; 602ffc498dfSFlorian Hahn break; 603ffc498dfSFlorian Hahn } 604ffc498dfSFlorian Hahn 605ffc498dfSFlorian Hahn // If the expression is malformed, make sure we don't 606ffc498dfSFlorian Hahn // copy more elements than we should. 607ffc498dfSFlorian Hahn HistoricSize = std::min(SubExpr.size(), HistoricSize); 608ffc498dfSFlorian Hahn ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1); 609ffc498dfSFlorian Hahn 610ffc498dfSFlorian Hahn switch (SubExpr.front()) { 611ffc498dfSFlorian Hahn case dwarf::DW_OP_plus: 612ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_plus_uconst); 613ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 614ffc498dfSFlorian Hahn break; 615ffc498dfSFlorian Hahn case dwarf::DW_OP_minus: 616ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_constu); 617ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 618ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_minus); 619ffc498dfSFlorian Hahn break; 620ffc498dfSFlorian Hahn default: 621ffc498dfSFlorian Hahn Buffer.push_back(*SubExpr.begin()); 622ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end()); 623ffc498dfSFlorian Hahn break; 624ffc498dfSFlorian Hahn } 625ffc498dfSFlorian Hahn 626ffc498dfSFlorian Hahn // Continue with remaining elements. 627ffc498dfSFlorian Hahn SubExpr = SubExpr.slice(HistoricSize); 628ffc498dfSFlorian Hahn } 629ffc498dfSFlorian Hahn Expr = MutableArrayRef<uint64_t>(Buffer); 630ffc498dfSFlorian Hahn LLVM_FALLTHROUGH; 631ffc498dfSFlorian Hahn } 632ffc498dfSFlorian Hahn case 3: 633ffc498dfSFlorian Hahn // Up-to-date! 634ffc498dfSFlorian Hahn break; 635ffc498dfSFlorian Hahn } 636ffc498dfSFlorian Hahn 637ffc498dfSFlorian Hahn return Error::success(); 638ffc498dfSFlorian Hahn } 639ffc498dfSFlorian Hahn 640e37d3144SAdrian Prantl void upgradeDebugInfo() { 641e37d3144SAdrian Prantl upgradeCUSubprograms(); 642e37d3144SAdrian Prantl upgradeCUVariables(); 643e37d3144SAdrian Prantl } 644e37d3144SAdrian Prantl 645ef27db87SMehdi Amini public: 646ef27db87SMehdi Amini MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule, 647ef27db87SMehdi Amini BitcodeReaderValueList &ValueList, 648ec68dd49SMehdi Amini std::function<Type *(unsigned)> getTypeByID, 649ec68dd49SMehdi Amini bool IsImporting) 650864474c9SFlorian Hahn : MetadataList(TheModule.getContext(), Stream.SizeInBytes()), 651864474c9SFlorian Hahn ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()), 652864474c9SFlorian Hahn TheModule(TheModule), getTypeByID(std::move(getTypeByID)), 653864474c9SFlorian Hahn IsImporting(IsImporting) {} 654ef27db87SMehdi Amini 655ec68dd49SMehdi Amini Error parseMetadata(bool ModuleLevel); 656ef27db87SMehdi Amini 657ef27db87SMehdi Amini bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); } 6583bb4d01dSMehdi Amini 6593bb4d01dSMehdi Amini Metadata *getMetadataFwdRefOrLoad(unsigned ID) { 6603bb4d01dSMehdi Amini if (ID < MDStringRef.size()) 6613bb4d01dSMehdi Amini return lazyLoadOneMDString(ID); 6623bb4d01dSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) 6633bb4d01dSMehdi Amini return MD; 6643bb4d01dSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand 6653bb4d01dSMehdi Amini // instead of creating a temporary. 6663bb4d01dSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 6673bb4d01dSMehdi Amini PlaceholderQueue Placeholders; 6683bb4d01dSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 6693bb4d01dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 6703bb4d01dSMehdi Amini return MetadataList.lookup(ID); 6713bb4d01dSMehdi Amini } 6723bb4d01dSMehdi Amini return MetadataList.getMetadataFwdRef(ID); 673ef27db87SMehdi Amini } 674ef27db87SMehdi Amini 675ef27db87SMehdi Amini DISubprogram *lookupSubprogramForFunction(Function *F) { 676ef27db87SMehdi Amini return FunctionsWithSPs.lookup(F); 677ef27db87SMehdi Amini } 678ef27db87SMehdi Amini 679bd76f372SSimon Pilgrim bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; } 680ef27db87SMehdi Amini 681ef27db87SMehdi Amini Error parseMetadataAttachment( 682ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList); 683ef27db87SMehdi Amini 684ef27db87SMehdi Amini Error parseMetadataKinds(); 685ef27db87SMehdi Amini 6868662305bSMehdi Amini void setStripTBAA(bool Value) { StripTBAA = Value; } 687bd76f372SSimon Pilgrim bool isStrippingTBAA() const { return StripTBAA; } 6888662305bSMehdi Amini 689ef27db87SMehdi Amini unsigned size() const { return MetadataList.size(); } 690ef27db87SMehdi Amini void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); } 6916825fb64SAdrian Prantl void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); } 692ef27db87SMehdi Amini }; 693ef27db87SMehdi Amini 69442ef1990SMehdi Amini Expected<bool> 69542ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() { 69619ef4fadSMehdi Amini IndexCursor = Stream; 69719ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record; 698c27ab339STeresa Johnson GlobalDeclAttachmentPos = 0; 69919ef4fadSMehdi Amini // Get the abbrevs, and preload record positions to make them lazy-loadable. 70019ef4fadSMehdi Amini while (true) { 701c27ab339STeresa Johnson uint64_t SavedPos = IndexCursor.GetCurrentBitNo(); 702b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 703b12a864cSDuncan P. N. Exon Smith if (Error E = 704b12a864cSDuncan P. N. Exon Smith IndexCursor 705b12a864cSDuncan P. N. Exon Smith .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) 706b12a864cSDuncan P. N. Exon Smith .moveInto(Entry)) 707b12a864cSDuncan P. N. Exon Smith return std::move(E); 7080e828958SJF Bastien 70919ef4fadSMehdi Amini switch (Entry.Kind) { 71019ef4fadSMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 71119ef4fadSMehdi Amini case BitstreamEntry::Error: 71219ef4fadSMehdi Amini return error("Malformed block"); 71319ef4fadSMehdi Amini case BitstreamEntry::EndBlock: { 71419ef4fadSMehdi Amini return true; 71519ef4fadSMehdi Amini } 71619ef4fadSMehdi Amini case BitstreamEntry::Record: { 71719ef4fadSMehdi Amini // The interesting case. 71819ef4fadSMehdi Amini ++NumMDRecordLoaded; 71919ef4fadSMehdi Amini uint64_t CurrentPos = IndexCursor.GetCurrentBitNo(); 720b12a864cSDuncan P. N. Exon Smith unsigned Code; 721b12a864cSDuncan P. N. Exon Smith if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code)) 722b12a864cSDuncan P. N. Exon Smith return std::move(E); 72319ef4fadSMehdi Amini switch (Code) { 72419ef4fadSMehdi Amini case bitc::METADATA_STRINGS: { 72519ef4fadSMehdi Amini // Rewind and parse the strings. 7260e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 727c55cf4afSBill Wendling return std::move(Err); 72819ef4fadSMehdi Amini StringRef Blob; 72919ef4fadSMehdi Amini Record.clear(); 7300e828958SJF Bastien if (Expected<unsigned> MaybeRecord = 7310e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record, &Blob)) 7320e828958SJF Bastien ; 7330e828958SJF Bastien else 7340e828958SJF Bastien return MaybeRecord.takeError(); 73519ef4fadSMehdi Amini unsigned NumStrings = Record[0]; 73619ef4fadSMehdi Amini MDStringRef.reserve(NumStrings); 73719ef4fadSMehdi Amini auto IndexNextMDString = [&](StringRef Str) { 73819ef4fadSMehdi Amini MDStringRef.push_back(Str); 73919ef4fadSMehdi Amini }; 74019ef4fadSMehdi Amini if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString)) 741c55cf4afSBill Wendling return std::move(Err); 74219ef4fadSMehdi Amini break; 74319ef4fadSMehdi Amini } 74419ef4fadSMehdi Amini case bitc::METADATA_INDEX_OFFSET: { 74519ef4fadSMehdi Amini // This is the offset to the index, when we see this we skip all the 74619ef4fadSMehdi Amini // records and load only an index to these. 7470e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 748c55cf4afSBill Wendling return std::move(Err); 74919ef4fadSMehdi Amini Record.clear(); 7500e828958SJF Bastien if (Expected<unsigned> MaybeRecord = 7510e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) 7520e828958SJF Bastien ; 7530e828958SJF Bastien else 7540e828958SJF Bastien return MaybeRecord.takeError(); 75519ef4fadSMehdi Amini if (Record.size() != 2) 75619ef4fadSMehdi Amini return error("Invalid record"); 75719ef4fadSMehdi Amini auto Offset = Record[0] + (Record[1] << 32); 75819ef4fadSMehdi Amini auto BeginPos = IndexCursor.GetCurrentBitNo(); 7590e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset)) 760c55cf4afSBill Wendling return std::move(Err); 7610e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry = 7620e828958SJF Bastien IndexCursor.advanceSkippingSubblocks( 76319ef4fadSMehdi Amini BitstreamCursor::AF_DontPopBlockAtEnd); 7640e828958SJF Bastien if (!MaybeEntry) 7650e828958SJF Bastien return MaybeEntry.takeError(); 7660e828958SJF Bastien Entry = MaybeEntry.get(); 76719ef4fadSMehdi Amini assert(Entry.Kind == BitstreamEntry::Record && 76819ef4fadSMehdi Amini "Corrupted bitcode: Expected `Record` when trying to find the " 76919ef4fadSMehdi Amini "Metadata index"); 77019ef4fadSMehdi Amini Record.clear(); 7710e828958SJF Bastien if (Expected<unsigned> MaybeCode = 7720e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) 7730e828958SJF Bastien assert(MaybeCode.get() == bitc::METADATA_INDEX && 7740e828958SJF Bastien "Corrupted bitcode: Expected `METADATA_INDEX` when trying to " 7750e828958SJF Bastien "find the Metadata index"); 7760e828958SJF Bastien else 7770e828958SJF Bastien return MaybeCode.takeError(); 77819ef4fadSMehdi Amini // Delta unpack 77919ef4fadSMehdi Amini auto CurrentValue = BeginPos; 78019ef4fadSMehdi Amini GlobalMetadataBitPosIndex.reserve(Record.size()); 78119ef4fadSMehdi Amini for (auto &Elt : Record) { 78219ef4fadSMehdi Amini CurrentValue += Elt; 78319ef4fadSMehdi Amini GlobalMetadataBitPosIndex.push_back(CurrentValue); 78419ef4fadSMehdi Amini } 78519ef4fadSMehdi Amini break; 78619ef4fadSMehdi Amini } 78719ef4fadSMehdi Amini case bitc::METADATA_INDEX: 78819ef4fadSMehdi Amini // We don't expect to get there, the Index is loaded when we encounter 78919ef4fadSMehdi Amini // the offset. 79019ef4fadSMehdi Amini return error("Corrupted Metadata block"); 79119ef4fadSMehdi Amini case bitc::METADATA_NAME: { 79219ef4fadSMehdi Amini // Named metadata need to be materialized now and aren't deferred. 7930e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos)) 794c55cf4afSBill Wendling return std::move(Err); 79519ef4fadSMehdi Amini Record.clear(); 7960e828958SJF Bastien 7970e828958SJF Bastien unsigned Code; 7980e828958SJF Bastien if (Expected<unsigned> MaybeCode = 7990e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) { 8000e828958SJF Bastien Code = MaybeCode.get(); 80119ef4fadSMehdi Amini assert(Code == bitc::METADATA_NAME); 8020e828958SJF Bastien } else 8030e828958SJF Bastien return MaybeCode.takeError(); 80419ef4fadSMehdi Amini 80519ef4fadSMehdi Amini // Read name of the named metadata. 80619ef4fadSMehdi Amini SmallString<8> Name(Record.begin(), Record.end()); 8070e828958SJF Bastien if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode()) 8080e828958SJF Bastien Code = MaybeCode.get(); 8090e828958SJF Bastien else 8100e828958SJF Bastien return MaybeCode.takeError(); 81119ef4fadSMehdi Amini 81219ef4fadSMehdi Amini // Named Metadata comes in two parts, we expect the name to be followed 81319ef4fadSMehdi Amini // by the node 81419ef4fadSMehdi Amini Record.clear(); 8150e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode = 8160e828958SJF Bastien IndexCursor.readRecord(Code, Record)) 8170e828958SJF Bastien assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE); 8180e828958SJF Bastien else 8190e828958SJF Bastien return MaybeNextBitCode.takeError(); 82019ef4fadSMehdi Amini 82119ef4fadSMehdi Amini // Read named metadata elements. 82219ef4fadSMehdi Amini unsigned Size = Record.size(); 82319ef4fadSMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 82419ef4fadSMehdi Amini for (unsigned i = 0; i != Size; ++i) { 82519ef4fadSMehdi Amini // FIXME: We could use a placeholder here, however NamedMDNode are 82619ef4fadSMehdi Amini // taking MDNode as operand and not using the Metadata infrastructure. 82719ef4fadSMehdi Amini // It is acknowledged by 'TODO: Inherit from Metadata' in the 82819ef4fadSMehdi Amini // NamedMDNode class definition. 82919ef4fadSMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 830f3d2453dSTeresa Johnson assert(MD && "Invalid metadata: expect fwd ref to MDNode"); 83119ef4fadSMehdi Amini NMD->addOperand(MD); 83219ef4fadSMehdi Amini } 83319ef4fadSMehdi Amini break; 83419ef4fadSMehdi Amini } 83519ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 836c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos) 837c27ab339STeresa Johnson GlobalDeclAttachmentPos = SavedPos; 838c27ab339STeresa Johnson #ifndef NDEBUG 839c27ab339STeresa Johnson NumGlobalDeclAttachSkipped++; 840c27ab339STeresa Johnson #endif 84119ef4fadSMehdi Amini break; 84219ef4fadSMehdi Amini } 84319ef4fadSMehdi Amini case bitc::METADATA_KIND: 84419ef4fadSMehdi Amini case bitc::METADATA_STRING_OLD: 84519ef4fadSMehdi Amini case bitc::METADATA_OLD_FN_NODE: 84619ef4fadSMehdi Amini case bitc::METADATA_OLD_NODE: 84719ef4fadSMehdi Amini case bitc::METADATA_VALUE: 84819ef4fadSMehdi Amini case bitc::METADATA_DISTINCT_NODE: 84919ef4fadSMehdi Amini case bitc::METADATA_NODE: 85019ef4fadSMehdi Amini case bitc::METADATA_LOCATION: 85119ef4fadSMehdi Amini case bitc::METADATA_GENERIC_DEBUG: 85219ef4fadSMehdi Amini case bitc::METADATA_SUBRANGE: 85319ef4fadSMehdi Amini case bitc::METADATA_ENUMERATOR: 85419ef4fadSMehdi Amini case bitc::METADATA_BASIC_TYPE: 855f91d18eaSSourabh Singh Tomar case bitc::METADATA_STRING_TYPE: 85619ef4fadSMehdi Amini case bitc::METADATA_DERIVED_TYPE: 85719ef4fadSMehdi Amini case bitc::METADATA_COMPOSITE_TYPE: 85819ef4fadSMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE: 85919ef4fadSMehdi Amini case bitc::METADATA_MODULE: 86019ef4fadSMehdi Amini case bitc::METADATA_FILE: 86119ef4fadSMehdi Amini case bitc::METADATA_COMPILE_UNIT: 86219ef4fadSMehdi Amini case bitc::METADATA_SUBPROGRAM: 86319ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK: 86419ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE: 86519ef4fadSMehdi Amini case bitc::METADATA_NAMESPACE: 8666ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK: 86719ef4fadSMehdi Amini case bitc::METADATA_MACRO: 86819ef4fadSMehdi Amini case bitc::METADATA_MACRO_FILE: 86919ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_TYPE: 87019ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_VALUE: 87119ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR: 87219ef4fadSMehdi Amini case bitc::METADATA_LOCAL_VAR: 8732c864551SShiva Chen case bitc::METADATA_LABEL: 87419ef4fadSMehdi Amini case bitc::METADATA_EXPRESSION: 87519ef4fadSMehdi Amini case bitc::METADATA_OBJC_PROPERTY: 87619ef4fadSMehdi Amini case bitc::METADATA_IMPORTED_ENTITY: 87719ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR_EXPR: 878a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE: 87919ef4fadSMehdi Amini // We don't expect to see any of these, if we see one, give up on 88019ef4fadSMehdi Amini // lazy-loading and fallback. 88119ef4fadSMehdi Amini MDStringRef.clear(); 88219ef4fadSMehdi Amini GlobalMetadataBitPosIndex.clear(); 88319ef4fadSMehdi Amini return false; 88419ef4fadSMehdi Amini } 88519ef4fadSMehdi Amini break; 88619ef4fadSMehdi Amini } 88719ef4fadSMehdi Amini } 88819ef4fadSMehdi Amini } 88919ef4fadSMehdi Amini } 89019ef4fadSMehdi Amini 891c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index. 892c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be 893c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying 894c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index 895c27ab339STeresa Johnson // instead of creating temporaries. 896c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() { 897c27ab339STeresa Johnson // Nothing to do if we didn't find any of these metadata records. 898c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos) 899c27ab339STeresa Johnson return true; 900c27ab339STeresa Johnson // Use a temporary cursor so that we don't mess up the main Stream cursor or 901c27ab339STeresa Johnson // the lazy loading IndexCursor (which holds the necessary abbrev ids). 902c27ab339STeresa Johnson BitstreamCursor TempCursor = Stream; 903c27ab339STeresa Johnson SmallVector<uint64_t, 64> Record; 904c27ab339STeresa Johnson // Jump to the position before the first global decl attachment, so we can 905c27ab339STeresa Johnson // scan for the first BitstreamEntry record. 906c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos)) 907c27ab339STeresa Johnson return std::move(Err); 908c27ab339STeresa Johnson while (true) { 909b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 910b12a864cSDuncan P. N. Exon Smith if (Error E = 911b12a864cSDuncan P. N. Exon Smith TempCursor 912b12a864cSDuncan P. N. Exon Smith .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd) 913b12a864cSDuncan P. N. Exon Smith .moveInto(Entry)) 914b12a864cSDuncan P. N. Exon Smith return std::move(E); 915c27ab339STeresa Johnson 916c27ab339STeresa Johnson switch (Entry.Kind) { 917c27ab339STeresa Johnson case BitstreamEntry::SubBlock: // Handled for us already. 918c27ab339STeresa Johnson case BitstreamEntry::Error: 919c27ab339STeresa Johnson return error("Malformed block"); 920c27ab339STeresa Johnson case BitstreamEntry::EndBlock: 92195875d24SZarko Todorovski // Check that we parsed them all. 922c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 923c27ab339STeresa Johnson return true; 924c27ab339STeresa Johnson case BitstreamEntry::Record: 925c27ab339STeresa Johnson break; 926c27ab339STeresa Johnson } 927c27ab339STeresa Johnson uint64_t CurrentPos = TempCursor.GetCurrentBitNo(); 928c27ab339STeresa Johnson Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID); 929c27ab339STeresa Johnson if (!MaybeCode) 930c27ab339STeresa Johnson return MaybeCode.takeError(); 931c27ab339STeresa Johnson if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) { 932c27ab339STeresa Johnson // Anything other than a global decl attachment signals the end of 93395875d24SZarko Todorovski // these records. Check that we parsed them all. 934c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed); 935c27ab339STeresa Johnson return true; 936c27ab339STeresa Johnson } 937c27ab339STeresa Johnson #ifndef NDEBUG 938c27ab339STeresa Johnson NumGlobalDeclAttachParsed++; 939c27ab339STeresa Johnson #endif 940c27ab339STeresa Johnson // FIXME: we need to do this early because we don't materialize global 941c27ab339STeresa Johnson // value explicitly. 942c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos)) 943c27ab339STeresa Johnson return std::move(Err); 944c27ab339STeresa Johnson Record.clear(); 945c27ab339STeresa Johnson if (Expected<unsigned> MaybeRecord = 946c27ab339STeresa Johnson TempCursor.readRecord(Entry.ID, Record)) 947c27ab339STeresa Johnson ; 948c27ab339STeresa Johnson else 949c27ab339STeresa Johnson return MaybeRecord.takeError(); 950c27ab339STeresa Johnson if (Record.size() % 2 == 0) 951c27ab339STeresa Johnson return error("Invalid record"); 952c27ab339STeresa Johnson unsigned ValueID = Record[0]; 953c27ab339STeresa Johnson if (ValueID >= ValueList.size()) 954c27ab339STeresa Johnson return error("Invalid record"); 955c27ab339STeresa Johnson if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) { 956c27ab339STeresa Johnson // Need to save and restore the current position since 957c27ab339STeresa Johnson // parseGlobalObjectAttachment will resolve all forward references which 958c27ab339STeresa Johnson // would require parsing from locations stored in the index. 959c27ab339STeresa Johnson CurrentPos = TempCursor.GetCurrentBitNo(); 960c27ab339STeresa Johnson if (Error Err = parseGlobalObjectAttachment( 961c27ab339STeresa Johnson *GO, ArrayRef<uint64_t>(Record).slice(1))) 962c27ab339STeresa Johnson return std::move(Err); 963c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos)) 964c27ab339STeresa Johnson return std::move(Err); 965c27ab339STeresa Johnson } 966c27ab339STeresa Johnson } 967c27ab339STeresa Johnson } 968c27ab339STeresa Johnson 969ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing 970ef27db87SMehdi Amini /// module level metadata. 971ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) { 972ef27db87SMehdi Amini if (!ModuleLevel && MetadataList.hasFwdRefs()) 973ef27db87SMehdi Amini return error("Invalid metadata: fwd refs into function blocks"); 974ef27db87SMehdi Amini 97519ef4fadSMehdi Amini // Record the entry position so that we can jump back here and efficiently 97619ef4fadSMehdi Amini // skip the whole block in case we lazy-load. 97719ef4fadSMehdi Amini auto EntryPos = Stream.GetCurrentBitNo(); 97819ef4fadSMehdi Amini 9790e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID)) 9800e828958SJF Bastien return Err; 981ef27db87SMehdi Amini 982ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 983ef27db87SMehdi Amini PlaceholderQueue Placeholders; 9849f926f70SMehdi Amini 98519ef4fadSMehdi Amini // We lazy-load module-level metadata: we build an index for each record, and 98619ef4fadSMehdi Amini // then load individual record as needed, starting with the named metadata. 98719ef4fadSMehdi Amini if (ModuleLevel && IsImporting && MetadataList.empty() && 98819ef4fadSMehdi Amini !DisableLazyLoading) { 98942ef1990SMehdi Amini auto SuccessOrErr = lazyLoadModuleMetadataBlock(); 99019ef4fadSMehdi Amini if (!SuccessOrErr) 99119ef4fadSMehdi Amini return SuccessOrErr.takeError(); 99219ef4fadSMehdi Amini if (SuccessOrErr.get()) { 99319ef4fadSMehdi Amini // An index was successfully created and we will be able to load metadata 99419ef4fadSMehdi Amini // on-demand. 99519ef4fadSMehdi Amini MetadataList.resize(MDStringRef.size() + 99619ef4fadSMehdi Amini GlobalMetadataBitPosIndex.size()); 99719ef4fadSMehdi Amini 998c27ab339STeresa Johnson // Now that we have built the index, load the global decl attachments 999c27ab339STeresa Johnson // that were deferred during that process. This avoids creating 1000c27ab339STeresa Johnson // temporaries. 1001c27ab339STeresa Johnson SuccessOrErr = loadGlobalDeclAttachments(); 1002c27ab339STeresa Johnson if (!SuccessOrErr) 1003c27ab339STeresa Johnson return SuccessOrErr.takeError(); 1004c27ab339STeresa Johnson assert(SuccessOrErr.get()); 1005c27ab339STeresa Johnson 100619ef4fadSMehdi Amini // Reading the named metadata created forward references and/or 100719ef4fadSMehdi Amini // placeholders, that we flush here. 100819ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 1009e37d3144SAdrian Prantl upgradeDebugInfo(); 101019ef4fadSMehdi Amini // Return at the beginning of the block, since it is easy to skip it 101119ef4fadSMehdi Amini // entirely from there. 101219ef4fadSMehdi Amini Stream.ReadBlockEnd(); // Pop the abbrev block context. 10130e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(EntryPos)) 10140e828958SJF Bastien return Err; 10150e828958SJF Bastien if (Error Err = Stream.SkipBlock()) { 10160e828958SJF Bastien // FIXME this drops the error on the floor, which 10170e828958SJF Bastien // ThinLTO/X86/debuginfo-cu-import.ll relies on. 10180e828958SJF Bastien consumeError(std::move(Err)); 10190e828958SJF Bastien return Error::success(); 10200e828958SJF Bastien } 102119ef4fadSMehdi Amini return Error::success(); 102219ef4fadSMehdi Amini } 102319ef4fadSMehdi Amini // Couldn't load an index, fallback to loading all the block "old-style". 102419ef4fadSMehdi Amini } 102519ef4fadSMehdi Amini 102619ef4fadSMehdi Amini unsigned NextMetadataNo = MetadataList.size(); 102719ef4fadSMehdi Amini 10289f926f70SMehdi Amini // Read all the records. 10299f926f70SMehdi Amini while (true) { 1030b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 1031b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 1032b12a864cSDuncan P. N. Exon Smith return E; 10339f926f70SMehdi Amini 10349f926f70SMehdi Amini switch (Entry.Kind) { 10359f926f70SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 10369f926f70SMehdi Amini case BitstreamEntry::Error: 10379f926f70SMehdi Amini return error("Malformed block"); 10389f926f70SMehdi Amini case BitstreamEntry::EndBlock: 103919ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 1040e37d3144SAdrian Prantl upgradeDebugInfo(); 10419f926f70SMehdi Amini return Error::success(); 10429f926f70SMehdi Amini case BitstreamEntry::Record: 10439f926f70SMehdi Amini // The interesting case. 10449f926f70SMehdi Amini break; 10459f926f70SMehdi Amini } 10469f926f70SMehdi Amini 10479f926f70SMehdi Amini // Read a record. 10489f926f70SMehdi Amini Record.clear(); 10499f926f70SMehdi Amini StringRef Blob; 105019ef4fadSMehdi Amini ++NumMDRecordLoaded; 10510e828958SJF Bastien if (Expected<unsigned> MaybeCode = 10520e828958SJF Bastien Stream.readRecord(Entry.ID, Record, &Blob)) { 10530e828958SJF Bastien if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders, 10540e828958SJF Bastien Blob, NextMetadataNo)) 10559f926f70SMehdi Amini return Err; 10560e828958SJF Bastien } else 10570e828958SJF Bastien return MaybeCode.takeError(); 10589f926f70SMehdi Amini } 10599f926f70SMehdi Amini } 10609f926f70SMehdi Amini 106119ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) { 106219ef4fadSMehdi Amini ++NumMDStringLoaded; 106319ef4fadSMehdi Amini if (Metadata *MD = MetadataList.lookup(ID)) 106419ef4fadSMehdi Amini return cast<MDString>(MD); 106519ef4fadSMehdi Amini auto MDS = MDString::get(Context, MDStringRef[ID]); 106619ef4fadSMehdi Amini MetadataList.assignValue(MDS, ID); 106719ef4fadSMehdi Amini return MDS; 106819ef4fadSMehdi Amini } 106919ef4fadSMehdi Amini 107019ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata( 107119ef4fadSMehdi Amini unsigned ID, PlaceholderQueue &Placeholders) { 107219ef4fadSMehdi Amini assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size()); 107319ef4fadSMehdi Amini assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString"); 107419ef4fadSMehdi Amini // Lookup first if the metadata hasn't already been loaded. 107519ef4fadSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) { 107687399997SSimon Pilgrim auto *N = cast<MDNode>(MD); 107767d2cc1fSMehdi Amini if (!N->isTemporary()) 107867d2cc1fSMehdi Amini return; 107919ef4fadSMehdi Amini } 108019ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record; 108119ef4fadSMehdi Amini StringRef Blob; 10820e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit( 10830e828958SJF Bastien GlobalMetadataBitPosIndex[ID - MDStringRef.size()])) 10840e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed jumping: " + 108521661607SSimon Pilgrim Twine(toString(std::move(Err)))); 1086b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 1087b12a864cSDuncan P. N. Exon Smith if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry)) 10880e828958SJF Bastien // FIXME this drops the error on the floor. 10890e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " + 1090b12a864cSDuncan P. N. Exon Smith Twine(toString(std::move(E)))); 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: " + 109721661607SSimon Pilgrim Twine(toString(std::move(Err)))); 10980e828958SJF Bastien } else 109921661607SSimon Pilgrim report_fatal_error("Can't lazyload MD: " + 110021661607SSimon Pilgrim Twine(toString(MaybeCode.takeError()))); 110119ef4fadSMehdi Amini } 110219ef4fadSMehdi Amini 110319ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved. 110419ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed. 110519ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders( 110619ef4fadSMehdi Amini PlaceholderQueue &Placeholders) { 110719ef4fadSMehdi Amini DenseSet<unsigned> Temporaries; 1108*2aed0813SKazu Hirata while (true) { 110919ef4fadSMehdi Amini // Populate Temporaries with the placeholders that haven't been loaded yet. 111019ef4fadSMehdi Amini Placeholders.getTemporaries(MetadataList, Temporaries); 111119ef4fadSMehdi Amini 111219ef4fadSMehdi Amini // If we don't have any temporary, or FwdReference, we're done! 111319ef4fadSMehdi Amini if (Temporaries.empty() && !MetadataList.hasFwdRefs()) 111419ef4fadSMehdi Amini break; 111519ef4fadSMehdi Amini 111619ef4fadSMehdi Amini // First, load all the temporaries. This can add new placeholders or 111719ef4fadSMehdi Amini // forward references. 111819ef4fadSMehdi Amini for (auto ID : Temporaries) 111919ef4fadSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 112019ef4fadSMehdi Amini Temporaries.clear(); 112119ef4fadSMehdi Amini 112219ef4fadSMehdi Amini // Second, load the forward-references. This can also add new placeholders 112319ef4fadSMehdi Amini // or forward references. 112419ef4fadSMehdi Amini while (MetadataList.hasFwdRefs()) 112519ef4fadSMehdi Amini lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders); 112619ef4fadSMehdi Amini } 112719ef4fadSMehdi Amini // At this point we don't have any forward reference remaining, or temporary 112819ef4fadSMehdi Amini // that haven't been loaded. We can safely drop RAUW support and mark cycles 112919ef4fadSMehdi Amini // as resolved. 113019ef4fadSMehdi Amini MetadataList.tryToResolveCycles(); 113119ef4fadSMehdi Amini 113219ef4fadSMehdi Amini // Finally, everything is in place, we can replace the placeholders operands 113319ef4fadSMehdi Amini // with the final node they refer to. 113419ef4fadSMehdi Amini Placeholders.flush(MetadataList); 113519ef4fadSMehdi Amini } 113619ef4fadSMehdi Amini 11379f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata( 11389f926f70SMehdi Amini SmallVectorImpl<uint64_t> &Record, unsigned Code, 113919ef4fadSMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) { 11409f926f70SMehdi Amini 11419f926f70SMehdi Amini bool IsDistinct = false; 1142ef27db87SMehdi Amini auto getMD = [&](unsigned ID) -> Metadata * { 114319ef4fadSMehdi Amini if (ID < MDStringRef.size()) 114419ef4fadSMehdi Amini return lazyLoadOneMDString(ID); 114567d2cc1fSMehdi Amini if (!IsDistinct) { 114667d2cc1fSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) 114767d2cc1fSMehdi Amini return MD; 114867d2cc1fSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand 114967d2cc1fSMehdi Amini // instead of creating a temporary. 115067d2cc1fSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) { 115167d2cc1fSMehdi Amini // Create a temporary for the node that is referencing the operand we 115267d2cc1fSMehdi Amini // will lazy-load. It is needed before recursing in case there are 115367d2cc1fSMehdi Amini // uniquing cycles. 115467d2cc1fSMehdi Amini MetadataList.getMetadataFwdRef(NextMetadataNo); 115567d2cc1fSMehdi Amini lazyLoadOneMetadata(ID, Placeholders); 115667d2cc1fSMehdi Amini return MetadataList.lookup(ID); 115767d2cc1fSMehdi Amini } 115867d2cc1fSMehdi Amini // Return a temporary. 1159ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID); 116067d2cc1fSMehdi Amini } 1161ef27db87SMehdi Amini if (auto *MD = MetadataList.getMetadataIfResolved(ID)) 1162ef27db87SMehdi Amini return MD; 1163ef27db87SMehdi Amini return &Placeholders.getPlaceholderOp(ID); 1164ef27db87SMehdi Amini }; 1165ef27db87SMehdi Amini auto getMDOrNull = [&](unsigned ID) -> Metadata * { 1166ef27db87SMehdi Amini if (ID) 1167ef27db87SMehdi Amini return getMD(ID - 1); 1168ef27db87SMehdi Amini return nullptr; 1169ef27db87SMehdi Amini }; 1170ef27db87SMehdi Amini auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * { 1171ef27db87SMehdi Amini if (ID) 1172ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID - 1); 1173ef27db87SMehdi Amini return nullptr; 1174ef27db87SMehdi Amini }; 1175ef27db87SMehdi Amini auto getMDString = [&](unsigned ID) -> MDString * { 1176ef27db87SMehdi Amini // This requires that the ID is not really a forward reference. In 1177ef27db87SMehdi Amini // particular, the MDString must already have been resolved. 117819ef4fadSMehdi Amini auto MDS = getMDOrNull(ID); 117919ef4fadSMehdi Amini return cast_or_null<MDString>(MDS); 1180ef27db87SMehdi Amini }; 1181ef27db87SMehdi Amini 1182ef27db87SMehdi Amini // Support for old type refs. 1183ef27db87SMehdi Amini auto getDITypeRefOrNull = [&](unsigned ID) { 1184ef27db87SMehdi Amini return MetadataList.upgradeTypeRef(getMDOrNull(ID)); 1185ef27db87SMehdi Amini }; 1186ef27db87SMehdi Amini 1187ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS) \ 1188ef27db87SMehdi Amini (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS) 1189ef27db87SMehdi Amini 1190ef27db87SMehdi Amini switch (Code) { 1191ef27db87SMehdi Amini default: // Default behavior: ignore. 1192ef27db87SMehdi Amini break; 1193ef27db87SMehdi Amini case bitc::METADATA_NAME: { 1194ef27db87SMehdi Amini // Read name of the named metadata. 1195ef27db87SMehdi Amini SmallString<8> Name(Record.begin(), Record.end()); 1196ef27db87SMehdi Amini Record.clear(); 1197b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.ReadCode().moveInto(Code)) 1198b12a864cSDuncan P. N. Exon Smith return E; 1199ef27db87SMehdi Amini 120019ef4fadSMehdi Amini ++NumMDRecordLoaded; 12010e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) { 12020e828958SJF Bastien if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE) 1203ef27db87SMehdi Amini return error("METADATA_NAME not followed by METADATA_NAMED_NODE"); 12040e828958SJF Bastien } else 12050e828958SJF Bastien return MaybeNextBitCode.takeError(); 1206ef27db87SMehdi Amini 1207ef27db87SMehdi Amini // Read named metadata elements. 1208ef27db87SMehdi Amini unsigned Size = Record.size(); 1209ef27db87SMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name); 1210ef27db87SMehdi Amini for (unsigned i = 0; i != Size; ++i) { 1211ef27db87SMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]); 1212ef27db87SMehdi Amini if (!MD) 1213f3d2453dSTeresa Johnson return error("Invalid named metadata: expect fwd ref to MDNode"); 1214ef27db87SMehdi Amini NMD->addOperand(MD); 1215ef27db87SMehdi Amini } 1216ef27db87SMehdi Amini break; 1217ef27db87SMehdi Amini } 1218ef27db87SMehdi Amini case bitc::METADATA_OLD_FN_NODE: { 12194abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files. 1220ef27db87SMehdi Amini // This is a LocalAsMetadata record, the only type of function-local 1221ef27db87SMehdi Amini // metadata. 1222ef27db87SMehdi Amini if (Record.size() % 2 == 1) 1223ef27db87SMehdi Amini return error("Invalid record"); 1224ef27db87SMehdi Amini 1225ef27db87SMehdi Amini // If this isn't a LocalAsMetadata record, we're dropping it. This used 1226ef27db87SMehdi Amini // to be legal, but there's no upgrade path. 1227ef27db87SMehdi Amini auto dropRecord = [&] { 1228c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo); 1229c05c9db3SIvan Krasin NextMetadataNo++; 1230ef27db87SMehdi Amini }; 1231ef27db87SMehdi Amini if (Record.size() != 2) { 1232ef27db87SMehdi Amini dropRecord(); 1233ef27db87SMehdi Amini break; 1234ef27db87SMehdi Amini } 1235ef27db87SMehdi Amini 1236ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[0]); 1237ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy()) { 1238ef27db87SMehdi Amini dropRecord(); 1239ef27db87SMehdi Amini break; 1240ef27db87SMehdi Amini } 1241ef27db87SMehdi Amini 1242ef27db87SMehdi Amini MetadataList.assignValue( 1243ef27db87SMehdi Amini LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 1244c05c9db3SIvan Krasin NextMetadataNo); 1245c05c9db3SIvan Krasin NextMetadataNo++; 1246ef27db87SMehdi Amini break; 1247ef27db87SMehdi Amini } 1248ef27db87SMehdi Amini case bitc::METADATA_OLD_NODE: { 12494abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files. 1250ef27db87SMehdi Amini if (Record.size() % 2 == 1) 1251ef27db87SMehdi Amini return error("Invalid record"); 1252ef27db87SMehdi Amini 1253ef27db87SMehdi Amini unsigned Size = Record.size(); 1254ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts; 1255ef27db87SMehdi Amini for (unsigned i = 0; i != Size; i += 2) { 1256ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[i]); 1257ef27db87SMehdi Amini if (!Ty) 1258ef27db87SMehdi Amini return error("Invalid record"); 1259ef27db87SMehdi Amini if (Ty->isMetadataTy()) 1260ef27db87SMehdi Amini Elts.push_back(getMD(Record[i + 1])); 1261ef27db87SMehdi Amini else if (!Ty->isVoidTy()) { 1262ef27db87SMehdi Amini auto *MD = 1263ef27db87SMehdi Amini ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty)); 1264ef27db87SMehdi Amini assert(isa<ConstantAsMetadata>(MD) && 1265ef27db87SMehdi Amini "Expected non-function-local metadata"); 1266ef27db87SMehdi Amini Elts.push_back(MD); 1267ef27db87SMehdi Amini } else 1268ef27db87SMehdi Amini Elts.push_back(nullptr); 1269ef27db87SMehdi Amini } 1270c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo); 1271c05c9db3SIvan Krasin NextMetadataNo++; 1272ef27db87SMehdi Amini break; 1273ef27db87SMehdi Amini } 1274ef27db87SMehdi Amini case bitc::METADATA_VALUE: { 1275ef27db87SMehdi Amini if (Record.size() != 2) 1276ef27db87SMehdi Amini return error("Invalid record"); 1277ef27db87SMehdi Amini 1278ef27db87SMehdi Amini Type *Ty = getTypeByID(Record[0]); 1279ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy()) 1280ef27db87SMehdi Amini return error("Invalid record"); 1281ef27db87SMehdi Amini 1282ef27db87SMehdi Amini MetadataList.assignValue( 1283ef27db87SMehdi Amini ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)), 1284c05c9db3SIvan Krasin NextMetadataNo); 1285c05c9db3SIvan Krasin NextMetadataNo++; 1286ef27db87SMehdi Amini break; 1287ef27db87SMehdi Amini } 1288ef27db87SMehdi Amini case bitc::METADATA_DISTINCT_NODE: 1289ef27db87SMehdi Amini IsDistinct = true; 1290ef27db87SMehdi Amini LLVM_FALLTHROUGH; 1291ef27db87SMehdi Amini case bitc::METADATA_NODE: { 1292ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts; 1293ef27db87SMehdi Amini Elts.reserve(Record.size()); 1294ef27db87SMehdi Amini for (unsigned ID : Record) 1295ef27db87SMehdi Amini Elts.push_back(getMDOrNull(ID)); 1296ef27db87SMehdi Amini MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts) 1297ef27db87SMehdi Amini : MDNode::get(Context, Elts), 1298c05c9db3SIvan Krasin NextMetadataNo); 1299c05c9db3SIvan Krasin NextMetadataNo++; 1300ef27db87SMehdi Amini break; 1301ef27db87SMehdi Amini } 1302ef27db87SMehdi Amini case bitc::METADATA_LOCATION: { 1303386ad01cSVedant Kumar if (Record.size() != 5 && Record.size() != 6) 1304ef27db87SMehdi Amini return error("Invalid record"); 1305ef27db87SMehdi Amini 1306ef27db87SMehdi Amini IsDistinct = Record[0]; 1307ef27db87SMehdi Amini unsigned Line = Record[1]; 1308ef27db87SMehdi Amini unsigned Column = Record[2]; 1309ef27db87SMehdi Amini Metadata *Scope = getMD(Record[3]); 1310ef27db87SMehdi Amini Metadata *InlinedAt = getMDOrNull(Record[4]); 1311386ad01cSVedant Kumar bool ImplicitCode = Record.size() == 6 && Record[5]; 1312ef27db87SMehdi Amini MetadataList.assignValue( 1313eb7f6020SCalixte Denizet GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt, 1314eb7f6020SCalixte Denizet ImplicitCode)), 1315c05c9db3SIvan Krasin NextMetadataNo); 1316c05c9db3SIvan Krasin NextMetadataNo++; 1317ef27db87SMehdi Amini break; 1318ef27db87SMehdi Amini } 1319ef27db87SMehdi Amini case bitc::METADATA_GENERIC_DEBUG: { 1320ef27db87SMehdi Amini if (Record.size() < 4) 1321ef27db87SMehdi Amini return error("Invalid record"); 1322ef27db87SMehdi Amini 1323ef27db87SMehdi Amini IsDistinct = Record[0]; 1324ef27db87SMehdi Amini unsigned Tag = Record[1]; 1325ef27db87SMehdi Amini unsigned Version = Record[2]; 1326ef27db87SMehdi Amini 1327ef27db87SMehdi Amini if (Tag >= 1u << 16 || Version != 0) 1328ef27db87SMehdi Amini return error("Invalid record"); 1329ef27db87SMehdi Amini 1330ef27db87SMehdi Amini auto *Header = getMDString(Record[3]); 1331ef27db87SMehdi Amini SmallVector<Metadata *, 8> DwarfOps; 1332ef27db87SMehdi Amini for (unsigned I = 4, E = Record.size(); I != E; ++I) 1333ef27db87SMehdi Amini DwarfOps.push_back(getMDOrNull(Record[I])); 1334ef27db87SMehdi Amini MetadataList.assignValue( 1335ef27db87SMehdi Amini GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)), 1336c05c9db3SIvan Krasin NextMetadataNo); 1337c05c9db3SIvan Krasin NextMetadataNo++; 1338ef27db87SMehdi Amini break; 1339ef27db87SMehdi Amini } 1340ef27db87SMehdi Amini case bitc::METADATA_SUBRANGE: { 1341fdf40917SSander de Smalen Metadata *Val = nullptr; 1342fdf40917SSander de Smalen // Operand 'count' is interpreted as: 1343fdf40917SSander de Smalen // - Signed integer (version 0) 1344fdf40917SSander de Smalen // - Metadata node (version 1) 1345d20bf5a7SAlok Kumar Sharma // Operand 'lowerBound' is interpreted as: 1346d20bf5a7SAlok Kumar Sharma // - Signed integer (version 0 and 1) 1347d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2) 1348d20bf5a7SAlok Kumar Sharma // Operands 'upperBound' and 'stride' are interpreted as: 1349d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2) 1350fdf40917SSander de Smalen switch (Record[0] >> 1) { 1351fdf40917SSander de Smalen case 0: 1352fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange, 1353d20bf5a7SAlok Kumar Sharma (Context, Record[1], unrotateSign(Record[2]))); 1354fdf40917SSander de Smalen break; 1355fdf40917SSander de Smalen case 1: 1356fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]), 1357d20bf5a7SAlok Kumar Sharma unrotateSign(Record[2]))); 1358d20bf5a7SAlok Kumar Sharma break; 1359d20bf5a7SAlok Kumar Sharma case 2: 1360d20bf5a7SAlok Kumar Sharma Val = GET_OR_DISTINCT( 1361d20bf5a7SAlok Kumar Sharma DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]), 1362d20bf5a7SAlok Kumar Sharma getMDOrNull(Record[3]), getMDOrNull(Record[4]))); 1363fdf40917SSander de Smalen break; 1364fdf40917SSander de Smalen default: 1365fdf40917SSander de Smalen return error("Invalid record: Unsupported version of DISubrange"); 1366fdf40917SSander de Smalen } 1367ef27db87SMehdi Amini 1368fdf40917SSander de Smalen MetadataList.assignValue(Val, NextMetadataNo); 1369fdf40917SSander de Smalen IsDistinct = Record[0] & 1; 1370c05c9db3SIvan Krasin NextMetadataNo++; 1371ef27db87SMehdi Amini break; 1372ef27db87SMehdi Amini } 1373a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE: { 1374a6dd01afSAlok Kumar Sharma Metadata *Val = nullptr; 1375a6dd01afSAlok Kumar Sharma Val = GET_OR_DISTINCT(DIGenericSubrange, 1376a6dd01afSAlok Kumar Sharma (Context, getMDOrNull(Record[1]), 1377a6dd01afSAlok Kumar Sharma getMDOrNull(Record[2]), getMDOrNull(Record[3]), 1378a6dd01afSAlok Kumar Sharma getMDOrNull(Record[4]))); 1379a6dd01afSAlok Kumar Sharma 1380a6dd01afSAlok Kumar Sharma MetadataList.assignValue(Val, NextMetadataNo); 1381a6dd01afSAlok Kumar Sharma IsDistinct = Record[0] & 1; 1382a6dd01afSAlok Kumar Sharma NextMetadataNo++; 1383a6dd01afSAlok Kumar Sharma break; 1384a6dd01afSAlok Kumar Sharma } 1385ef27db87SMehdi Amini case bitc::METADATA_ENUMERATOR: { 1386aad3d578SLemonBoy if (Record.size() < 3) 1387ef27db87SMehdi Amini return error("Invalid record"); 1388ef27db87SMehdi Amini 138908dc66efSMomchil Velikov IsDistinct = Record[0] & 1; 139008dc66efSMomchil Velikov bool IsUnsigned = Record[0] & 2; 1391aad3d578SLemonBoy bool IsBigInt = Record[0] & 4; 1392aad3d578SLemonBoy APInt Value; 1393aad3d578SLemonBoy 1394aad3d578SLemonBoy if (IsBigInt) { 1395aad3d578SLemonBoy const uint64_t BitWidth = Record[1]; 1396aad3d578SLemonBoy const size_t NumWords = Record.size() - 3; 1397aad3d578SLemonBoy Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth); 1398aad3d578SLemonBoy } else 1399aad3d578SLemonBoy Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned); 1400aad3d578SLemonBoy 1401ef27db87SMehdi Amini MetadataList.assignValue( 1402aad3d578SLemonBoy GET_OR_DISTINCT(DIEnumerator, 1403aad3d578SLemonBoy (Context, Value, IsUnsigned, getMDString(Record[2]))), 1404c05c9db3SIvan Krasin NextMetadataNo); 1405c05c9db3SIvan Krasin NextMetadataNo++; 1406ef27db87SMehdi Amini break; 1407ef27db87SMehdi Amini } 1408ef27db87SMehdi Amini case bitc::METADATA_BASIC_TYPE: { 140955f42629SAdrian Prantl if (Record.size() < 6 || Record.size() > 7) 1410ef27db87SMehdi Amini return error("Invalid record"); 1411ef27db87SMehdi Amini 1412ef27db87SMehdi Amini IsDistinct = Record[0]; 1413665b4138SLuís Ferreira DINode::DIFlags Flags = (Record.size() > 6) 1414665b4138SLuís Ferreira ? static_cast<DINode::DIFlags>(Record[6]) 1415665b4138SLuís Ferreira : 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: { 1440430e2238SYonghong Song if (Record.size() < 12 || Record.size() > 14) 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 1449430e2238SYonghong Song Metadata *Annotations = nullptr; 1450430e2238SYonghong Song if (Record.size() > 13 && Record[13]) 1451430e2238SYonghong Song Annotations = getMDOrNull(Record[13]); 1452430e2238SYonghong Song 1453ef27db87SMehdi Amini IsDistinct = Record[0]; 1454ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 1455ef27db87SMehdi Amini MetadataList.assignValue( 1456ef27db87SMehdi Amini GET_OR_DISTINCT(DIDerivedType, 1457ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]), 1458ef27db87SMehdi Amini getMDOrNull(Record[3]), Record[4], 1459ef27db87SMehdi Amini getDITypeRefOrNull(Record[5]), 1460ef27db87SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1461d5561e0aSKonstantin Zhuravlyov Record[9], DWARFAddressSpace, Flags, 1462430e2238SYonghong Song getDITypeRefOrNull(Record[11]), Annotations)), 1463c05c9db3SIvan Krasin NextMetadataNo); 1464c05c9db3SIvan Krasin NextMetadataNo++; 1465ef27db87SMehdi Amini break; 1466ef27db87SMehdi Amini } 1467ef27db87SMehdi Amini case bitc::METADATA_COMPOSITE_TYPE: { 14680b32dca1SYonghong Song if (Record.size() < 16 || Record.size() > 22) 1469ef27db87SMehdi Amini return error("Invalid record"); 1470ef27db87SMehdi Amini 1471ef27db87SMehdi Amini // If we have a UUID and this is not a forward declaration, lookup the 1472ef27db87SMehdi Amini // mapping. 1473ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1; 1474ef27db87SMehdi Amini bool IsNotUsedInTypeRef = Record[0] >= 2; 1475ef27db87SMehdi Amini unsigned Tag = Record[1]; 1476ef27db87SMehdi Amini MDString *Name = getMDString(Record[2]); 1477ef27db87SMehdi Amini Metadata *File = getMDOrNull(Record[3]); 1478ef27db87SMehdi Amini unsigned Line = Record[4]; 1479ef27db87SMehdi Amini Metadata *Scope = getDITypeRefOrNull(Record[5]); 1480a61f5e37STeresa Johnson Metadata *BaseType = nullptr; 1481ef27db87SMehdi Amini uint64_t SizeInBits = Record[7]; 1482ef27db87SMehdi Amini if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1483ef27db87SMehdi Amini return error("Alignment value is too large"); 1484ef27db87SMehdi Amini uint32_t AlignInBits = Record[8]; 1485a61f5e37STeresa Johnson uint64_t OffsetInBits = 0; 1486ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]); 1487a61f5e37STeresa Johnson Metadata *Elements = nullptr; 1488ef27db87SMehdi Amini unsigned RuntimeLang = Record[12]; 1489a61f5e37STeresa Johnson Metadata *VTableHolder = nullptr; 1490a61f5e37STeresa Johnson Metadata *TemplateParams = nullptr; 14918c59921cSAdrian Prantl Metadata *Discriminator = nullptr; 14924042ada1SAlok Kumar Sharma Metadata *DataLocation = nullptr; 14932d10258aSAlok Kumar Sharma Metadata *Associated = nullptr; 14942d10258aSAlok Kumar Sharma Metadata *Allocated = nullptr; 149596bd4d34SAlok Kumar Sharma Metadata *Rank = nullptr; 14960b32dca1SYonghong Song Metadata *Annotations = nullptr; 1497ef27db87SMehdi Amini auto *Identifier = getMDString(Record[15]); 1498a61f5e37STeresa Johnson // If this module is being parsed so that it can be ThinLTO imported 1499a61f5e37STeresa Johnson // into another module, composite types only need to be imported 1500a61f5e37STeresa Johnson // as type declarations (unless full type definitions requested). 1501a61f5e37STeresa Johnson // Create type declarations up front to save memory. Also, buildODRType 1502a61f5e37STeresa Johnson // handles the case where this is type ODRed with a definition needed 1503a61f5e37STeresa Johnson // by the importing module, in which case the existing definition is 1504a61f5e37STeresa Johnson // used. 15055a8dba5bSTeresa Johnson if (IsImporting && !ImportFullTypeDefinitions && Identifier && 1506a61f5e37STeresa Johnson (Tag == dwarf::DW_TAG_enumeration_type || 1507a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_class_type || 1508a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_structure_type || 1509a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_union_type)) { 1510a61f5e37STeresa Johnson Flags = Flags | DINode::FlagFwdDecl; 1511a61f5e37STeresa Johnson } else { 1512a61f5e37STeresa Johnson BaseType = getDITypeRefOrNull(Record[6]); 1513a61f5e37STeresa Johnson OffsetInBits = Record[9]; 1514a61f5e37STeresa Johnson Elements = getMDOrNull(Record[11]); 1515a61f5e37STeresa Johnson VTableHolder = getDITypeRefOrNull(Record[13]); 1516a61f5e37STeresa Johnson TemplateParams = getMDOrNull(Record[14]); 15178c59921cSAdrian Prantl if (Record.size() > 16) 15188c59921cSAdrian Prantl Discriminator = getMDOrNull(Record[16]); 15194042ada1SAlok Kumar Sharma if (Record.size() > 17) 15204042ada1SAlok Kumar Sharma DataLocation = getMDOrNull(Record[17]); 15212d10258aSAlok Kumar Sharma if (Record.size() > 19) { 15222d10258aSAlok Kumar Sharma Associated = getMDOrNull(Record[18]); 15232d10258aSAlok Kumar Sharma Allocated = getMDOrNull(Record[19]); 15242d10258aSAlok Kumar Sharma } 152596bd4d34SAlok Kumar Sharma if (Record.size() > 20) { 152696bd4d34SAlok Kumar Sharma Rank = getMDOrNull(Record[20]); 152796bd4d34SAlok Kumar Sharma } 15280b32dca1SYonghong Song if (Record.size() > 21) { 15290b32dca1SYonghong Song Annotations = getMDOrNull(Record[21]); 15300b32dca1SYonghong Song } 1531a61f5e37STeresa Johnson } 1532ef27db87SMehdi Amini DICompositeType *CT = nullptr; 1533ef27db87SMehdi Amini if (Identifier) 1534ef27db87SMehdi Amini CT = DICompositeType::buildODRType( 1535ef27db87SMehdi Amini Context, *Identifier, Tag, Name, File, Line, Scope, BaseType, 1536ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, 15372d10258aSAlok Kumar Sharma VTableHolder, TemplateParams, Discriminator, DataLocation, Associated, 15380b32dca1SYonghong Song Allocated, Rank, Annotations); 1539ef27db87SMehdi Amini 1540ef27db87SMehdi Amini // Create a node if we didn't get a lazy ODR type. 1541ef27db87SMehdi Amini if (!CT) 1542ef27db87SMehdi Amini CT = GET_OR_DISTINCT(DICompositeType, 1543ef27db87SMehdi Amini (Context, Tag, Name, File, Line, Scope, BaseType, 1544ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags, 15459f926f70SMehdi Amini Elements, RuntimeLang, VTableHolder, TemplateParams, 15462d10258aSAlok Kumar Sharma Identifier, Discriminator, DataLocation, Associated, 15470b32dca1SYonghong Song Allocated, Rank, Annotations)); 1548ef27db87SMehdi Amini if (!IsNotUsedInTypeRef && Identifier) 1549ef27db87SMehdi Amini MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT)); 1550ef27db87SMehdi Amini 1551c05c9db3SIvan Krasin MetadataList.assignValue(CT, NextMetadataNo); 1552c05c9db3SIvan Krasin NextMetadataNo++; 1553ef27db87SMehdi Amini break; 1554ef27db87SMehdi Amini } 1555ef27db87SMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE: { 1556ef27db87SMehdi Amini if (Record.size() < 3 || Record.size() > 4) 1557ef27db87SMehdi Amini return error("Invalid record"); 1558ef27db87SMehdi Amini bool IsOldTypeRefArray = Record[0] < 2; 1559ef27db87SMehdi Amini unsigned CC = (Record.size() > 3) ? Record[3] : 0; 1560ef27db87SMehdi Amini 1561ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1; 1562ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]); 1563ef27db87SMehdi Amini Metadata *Types = getMDOrNull(Record[2]); 1564ef27db87SMehdi Amini if (LLVM_UNLIKELY(IsOldTypeRefArray)) 1565ef27db87SMehdi Amini Types = MetadataList.upgradeTypeRefArray(Types); 1566ef27db87SMehdi Amini 1567ef27db87SMehdi Amini MetadataList.assignValue( 1568ef27db87SMehdi Amini GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)), 1569c05c9db3SIvan Krasin NextMetadataNo); 1570c05c9db3SIvan Krasin NextMetadataNo++; 1571ef27db87SMehdi Amini break; 1572ef27db87SMehdi Amini } 1573ef27db87SMehdi Amini 1574ef27db87SMehdi Amini case bitc::METADATA_MODULE: { 15755f75dcf5SChih-Ping Chen if (Record.size() < 5 || Record.size() > 9) 1576ef27db87SMehdi Amini return error("Invalid record"); 1577ef27db87SMehdi Amini 15785f75dcf5SChih-Ping Chen unsigned Offset = Record.size() >= 8 ? 2 : 1; 1579ef27db87SMehdi Amini IsDistinct = Record[0]; 1580ef27db87SMehdi Amini MetadataList.assignValue( 1581e59744fdSSourabh Singh Tomar GET_OR_DISTINCT( 1582e59744fdSSourabh Singh Tomar DIModule, 15835f75dcf5SChih-Ping Chen (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr, 1584e59744fdSSourabh Singh Tomar getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]), 1585e59744fdSSourabh Singh Tomar getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]), 1586e59744fdSSourabh Singh Tomar getMDString(Record[4 + Offset]), 15875f75dcf5SChih-Ping Chen Record.size() <= 7 ? 0 : Record[7], 15885f75dcf5SChih-Ping Chen Record.size() <= 8 ? false : Record[8])), 1589c05c9db3SIvan Krasin NextMetadataNo); 1590c05c9db3SIvan Krasin NextMetadataNo++; 1591ef27db87SMehdi Amini break; 1592ef27db87SMehdi Amini } 1593ef27db87SMehdi Amini 1594ef27db87SMehdi Amini case bitc::METADATA_FILE: { 159516c7bdafSScott Linder if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6) 1596ef27db87SMehdi Amini return error("Invalid record"); 1597ef27db87SMehdi Amini 1598ef27db87SMehdi Amini IsDistinct = Record[0]; 15997160384dSScott Linder Optional<DIFile::ChecksumInfo<MDString *>> Checksum; 16007160384dSScott Linder // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum 16017160384dSScott Linder // is not present. This matches up with the old internal representation, 16027160384dSScott Linder // and the old encoding for CSK_None in the ChecksumKind. The new 16037160384dSScott Linder // representation reserves the value 0 in the ChecksumKind to continue to 16047160384dSScott Linder // encode None in a backwards-compatible way. 160516c7bdafSScott Linder if (Record.size() > 4 && Record[3] && Record[4]) 16067160384dSScott Linder Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]), 16077160384dSScott Linder getMDString(Record[4])); 1608ef27db87SMehdi Amini MetadataList.assignValue( 16099f926f70SMehdi Amini GET_OR_DISTINCT( 16107faeecc8SAmjad Aboud DIFile, 161116c7bdafSScott Linder (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum, 161216c7bdafSScott Linder Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5])) 161316c7bdafSScott Linder : None)), 1614c05c9db3SIvan Krasin NextMetadataNo); 1615c05c9db3SIvan Krasin NextMetadataNo++; 1616ef27db87SMehdi Amini break; 1617ef27db87SMehdi Amini } 1618ef27db87SMehdi Amini case bitc::METADATA_COMPILE_UNIT: { 1619e4e7e447SAdrian Prantl if (Record.size() < 14 || Record.size() > 22) 1620ef27db87SMehdi Amini return error("Invalid record"); 1621ef27db87SMehdi Amini 1622ef27db87SMehdi Amini // Ignore Record[0], which indicates whether this compile unit is 1623ef27db87SMehdi Amini // distinct. It's always distinct. 1624ef27db87SMehdi Amini IsDistinct = true; 1625ef27db87SMehdi Amini auto *CU = DICompileUnit::getDistinct( 1626ef27db87SMehdi Amini Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]), 1627ef27db87SMehdi Amini Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]), 1628ef27db87SMehdi Amini Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1629ef27db87SMehdi Amini getMDOrNull(Record[12]), getMDOrNull(Record[13]), 1630ef27db87SMehdi Amini Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]), 1631ef27db87SMehdi Amini Record.size() <= 14 ? 0 : Record[14], 16320944a8c2SDehao Chen Record.size() <= 16 ? true : Record[16], 1633b52e2366SPeter Collingbourne Record.size() <= 17 ? false : Record[17], 1634bb279116SDavid Blaikie Record.size() <= 18 ? 0 : Record[18], 1635*2aed0813SKazu Hirata Record.size() <= 19 ? false : Record[19], 1636e4e7e447SAdrian Prantl Record.size() <= 20 ? nullptr : getMDString(Record[20]), 1637e4e7e447SAdrian Prantl Record.size() <= 21 ? nullptr : getMDString(Record[21])); 1638ef27db87SMehdi Amini 1639c05c9db3SIvan Krasin MetadataList.assignValue(CU, NextMetadataNo); 1640c05c9db3SIvan Krasin NextMetadataNo++; 1641ef27db87SMehdi Amini 1642ef27db87SMehdi Amini // Move the Upgrade the list of subprograms. 1643ef27db87SMehdi Amini if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11])) 1644ef27db87SMehdi Amini CUSubprograms.push_back({CU, SPs}); 1645ef27db87SMehdi Amini break; 1646ef27db87SMehdi Amini } 1647ef27db87SMehdi Amini case bitc::METADATA_SUBPROGRAM: { 16481d12b885SAdrian Prantl if (Record.size() < 18 || Record.size() > 21) 1649ef27db87SMehdi Amini return error("Invalid record"); 1650ef27db87SMehdi Amini 1651adcdc1bdSPaul Robinson bool HasSPFlags = Record[0] & 4; 165238a61873SPetar Jovanovic 165338a61873SPetar Jovanovic DINode::DIFlags Flags; 165438a61873SPetar Jovanovic DISubprogram::DISPFlags SPFlags; 165538a61873SPetar Jovanovic if (!HasSPFlags) 165638a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11 + 2]); 165738a61873SPetar Jovanovic else { 165838a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11]); 165938a61873SPetar Jovanovic SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]); 166038a61873SPetar Jovanovic } 166138a61873SPetar Jovanovic 166238a61873SPetar Jovanovic // Support for old metadata when 166338a61873SPetar Jovanovic // subprogram specific flags are placed in DIFlags. 166438a61873SPetar Jovanovic const unsigned DIFlagMainSubprogram = 1 << 21; 166538a61873SPetar Jovanovic bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram; 166638a61873SPetar Jovanovic if (HasOldMainSubprogramFlag) 166738a61873SPetar Jovanovic // Remove old DIFlagMainSubprogram from DIFlags. 166838a61873SPetar Jovanovic // Note: This assumes that any future use of bit 21 defaults to it 166938a61873SPetar Jovanovic // being 0. 167038a61873SPetar Jovanovic Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram); 167138a61873SPetar Jovanovic 167238a61873SPetar Jovanovic if (HasOldMainSubprogramFlag && HasSPFlags) 167338a61873SPetar Jovanovic SPFlags |= DISubprogram::SPFlagMainSubprogram; 167438a61873SPetar Jovanovic else if (!HasSPFlags) 167538a61873SPetar Jovanovic SPFlags = DISubprogram::toSPFlags( 1676adcdc1bdSPaul Robinson /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8], 167738a61873SPetar Jovanovic /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11], 1678665b4138SLuís Ferreira /*DIFlagMainSubprogram=*/HasOldMainSubprogramFlag); 1679adcdc1bdSPaul Robinson 1680adcdc1bdSPaul Robinson // All definitions should be distinct. 1681adcdc1bdSPaul Robinson IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition); 1682ef27db87SMehdi Amini // Version 1 has a Function as Record[15]. 1683ef27db87SMehdi Amini // Version 2 has removed Record[15]. 1684ef27db87SMehdi Amini // Version 3 has the Unit as Record[15]. 1685ef27db87SMehdi Amini // Version 4 added thisAdjustment. 1686adcdc1bdSPaul Robinson // Version 5 repacked flags into DISPFlags, changing many element numbers. 1687adcdc1bdSPaul Robinson bool HasUnit = Record[0] & 2; 1688adcdc1bdSPaul Robinson if (!HasSPFlags && HasUnit && Record.size() < 19) 1689ef27db87SMehdi Amini return error("Invalid record"); 1690adcdc1bdSPaul Robinson if (HasSPFlags && !HasUnit) 1691adcdc1bdSPaul Robinson return error("Invalid record"); 1692adcdc1bdSPaul Robinson // Accommodate older formats. 1693adcdc1bdSPaul Robinson bool HasFn = false; 1694adcdc1bdSPaul Robinson bool HasThisAdj = true; 1695adcdc1bdSPaul Robinson bool HasThrownTypes = true; 1696d383df32SYonghong Song bool HasAnnotations = false; 1697adcdc1bdSPaul Robinson unsigned OffsetA = 0; 1698adcdc1bdSPaul Robinson unsigned OffsetB = 0; 1699adcdc1bdSPaul Robinson if (!HasSPFlags) { 1700adcdc1bdSPaul Robinson OffsetA = 2; 1701adcdc1bdSPaul Robinson OffsetB = 2; 1702adcdc1bdSPaul Robinson if (Record.size() >= 19) { 1703adcdc1bdSPaul Robinson HasFn = !HasUnit; 1704adcdc1bdSPaul Robinson OffsetB++; 1705adcdc1bdSPaul Robinson } 1706adcdc1bdSPaul Robinson HasThisAdj = Record.size() >= 20; 1707adcdc1bdSPaul Robinson HasThrownTypes = Record.size() >= 21; 1708d383df32SYonghong Song } else { 1709d383df32SYonghong Song HasAnnotations = Record.size() >= 19; 1710adcdc1bdSPaul Robinson } 1711adcdc1bdSPaul Robinson Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]); 1712ef27db87SMehdi Amini DISubprogram *SP = GET_OR_DISTINCT( 17131d12b885SAdrian Prantl DISubprogram, 17141d12b885SAdrian Prantl (Context, 1715ef27db87SMehdi Amini getDITypeRefOrNull(Record[1]), // scope 1716ef27db87SMehdi Amini getMDString(Record[2]), // name 1717ef27db87SMehdi Amini getMDString(Record[3]), // linkageName 1718ef27db87SMehdi Amini getMDOrNull(Record[4]), // file 1719ef27db87SMehdi Amini Record[5], // line 1720ef27db87SMehdi Amini getMDOrNull(Record[6]), // type 1721adcdc1bdSPaul Robinson Record[7 + OffsetA], // scopeLine 1722adcdc1bdSPaul Robinson getDITypeRefOrNull(Record[8 + OffsetA]), // containingType 1723adcdc1bdSPaul Robinson Record[10 + OffsetA], // virtualIndex 1724adcdc1bdSPaul Robinson HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment 172538a61873SPetar Jovanovic Flags, // flags 1726cda54210SPaul Robinson SPFlags, // SPFlags 1727ef27db87SMehdi Amini HasUnit ? CUorFn : nullptr, // unit 1728adcdc1bdSPaul Robinson getMDOrNull(Record[13 + OffsetB]), // templateParams 1729adcdc1bdSPaul Robinson getMDOrNull(Record[14 + OffsetB]), // declaration 1730adcdc1bdSPaul Robinson getMDOrNull(Record[15 + OffsetB]), // retainedNodes 1731adcdc1bdSPaul Robinson HasThrownTypes ? getMDOrNull(Record[17 + OffsetB]) 1732d383df32SYonghong Song : nullptr, // thrownTypes 1733d383df32SYonghong Song HasAnnotations ? getMDOrNull(Record[18 + OffsetB]) 1734d383df32SYonghong Song : nullptr // annotations 1735ef27db87SMehdi Amini )); 1736c05c9db3SIvan Krasin MetadataList.assignValue(SP, NextMetadataNo); 1737c05c9db3SIvan Krasin NextMetadataNo++; 1738ef27db87SMehdi Amini 1739ef27db87SMehdi Amini // Upgrade sp->function mapping to function->sp mapping. 1740ef27db87SMehdi Amini if (HasFn) { 1741ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn)) 1742ef27db87SMehdi Amini if (auto *F = dyn_cast<Function>(CMD->getValue())) { 1743ef27db87SMehdi Amini if (F->isMaterializable()) 1744ef27db87SMehdi Amini // Defer until materialized; unmaterialized functions may not have 1745ef27db87SMehdi Amini // metadata. 1746ef27db87SMehdi Amini FunctionsWithSPs[F] = SP; 1747ef27db87SMehdi Amini else if (!F->empty()) 1748ef27db87SMehdi Amini F->setSubprogram(SP); 1749ef27db87SMehdi Amini } 1750ef27db87SMehdi Amini } 1751ef27db87SMehdi Amini break; 1752ef27db87SMehdi Amini } 1753ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK: { 1754ef27db87SMehdi Amini if (Record.size() != 5) 1755ef27db87SMehdi Amini return error("Invalid record"); 1756ef27db87SMehdi Amini 1757ef27db87SMehdi Amini IsDistinct = Record[0]; 1758ef27db87SMehdi Amini MetadataList.assignValue( 1759ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlock, 1760ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), 1761ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3], Record[4])), 1762c05c9db3SIvan Krasin NextMetadataNo); 1763c05c9db3SIvan Krasin NextMetadataNo++; 1764ef27db87SMehdi Amini break; 1765ef27db87SMehdi Amini } 1766ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE: { 1767ef27db87SMehdi Amini if (Record.size() != 4) 1768ef27db87SMehdi Amini return error("Invalid record"); 1769ef27db87SMehdi Amini 1770ef27db87SMehdi Amini IsDistinct = Record[0]; 1771ef27db87SMehdi Amini MetadataList.assignValue( 1772ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlockFile, 1773ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), 1774ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3])), 1775c05c9db3SIvan Krasin NextMetadataNo); 1776c05c9db3SIvan Krasin NextMetadataNo++; 1777ef27db87SMehdi Amini break; 1778ef27db87SMehdi Amini } 17796ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK: { 17806ed5706aSAdrian Prantl IsDistinct = Record[0] & 1; 17816ed5706aSAdrian Prantl MetadataList.assignValue( 17826ed5706aSAdrian Prantl GET_OR_DISTINCT(DICommonBlock, 17836ed5706aSAdrian Prantl (Context, getMDOrNull(Record[1]), 17846ed5706aSAdrian Prantl getMDOrNull(Record[2]), getMDString(Record[3]), 17856ed5706aSAdrian Prantl getMDOrNull(Record[4]), Record[5])), 17866ed5706aSAdrian Prantl NextMetadataNo); 17876ed5706aSAdrian Prantl NextMetadataNo++; 17886ed5706aSAdrian Prantl break; 17896ed5706aSAdrian Prantl } 1790ef27db87SMehdi Amini case bitc::METADATA_NAMESPACE: { 1791fed4f399SAdrian Prantl // Newer versions of DINamespace dropped file and line. 1792fed4f399SAdrian Prantl MDString *Name; 1793fed4f399SAdrian Prantl if (Record.size() == 3) 1794fed4f399SAdrian Prantl Name = getMDString(Record[2]); 1795fed4f399SAdrian Prantl else if (Record.size() == 5) 1796fed4f399SAdrian Prantl Name = getMDString(Record[3]); 1797fed4f399SAdrian Prantl else 1798ef27db87SMehdi Amini return error("Invalid record"); 1799ef27db87SMehdi Amini 1800ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 1801ef27db87SMehdi Amini bool ExportSymbols = Record[0] & 2; 1802ef27db87SMehdi Amini MetadataList.assignValue( 1803ef27db87SMehdi Amini GET_OR_DISTINCT(DINamespace, 1804fed4f399SAdrian Prantl (Context, getMDOrNull(Record[1]), Name, ExportSymbols)), 1805c05c9db3SIvan Krasin NextMetadataNo); 1806c05c9db3SIvan Krasin NextMetadataNo++; 1807ef27db87SMehdi Amini break; 1808ef27db87SMehdi Amini } 1809ef27db87SMehdi Amini case bitc::METADATA_MACRO: { 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(DIMacro, 18169f926f70SMehdi Amini (Context, Record[1], Record[2], getMDString(Record[3]), 18179f926f70SMehdi Amini getMDString(Record[4]))), 1818c05c9db3SIvan Krasin NextMetadataNo); 1819c05c9db3SIvan Krasin NextMetadataNo++; 1820ef27db87SMehdi Amini break; 1821ef27db87SMehdi Amini } 1822ef27db87SMehdi Amini case bitc::METADATA_MACRO_FILE: { 1823ef27db87SMehdi Amini if (Record.size() != 5) 1824ef27db87SMehdi Amini return error("Invalid record"); 1825ef27db87SMehdi Amini 1826ef27db87SMehdi Amini IsDistinct = Record[0]; 1827ef27db87SMehdi Amini MetadataList.assignValue( 1828ef27db87SMehdi Amini GET_OR_DISTINCT(DIMacroFile, 18299f926f70SMehdi Amini (Context, Record[1], Record[2], getMDOrNull(Record[3]), 18309f926f70SMehdi Amini getMDOrNull(Record[4]))), 1831c05c9db3SIvan Krasin NextMetadataNo); 1832c05c9db3SIvan Krasin NextMetadataNo++; 1833ef27db87SMehdi Amini break; 1834ef27db87SMehdi Amini } 1835ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_TYPE: { 18367a42babeSAwanish Pandey if (Record.size() < 3 || Record.size() > 4) 1837ef27db87SMehdi Amini return error("Invalid record"); 1838ef27db87SMehdi Amini 1839ef27db87SMehdi Amini IsDistinct = Record[0]; 18407a42babeSAwanish Pandey MetadataList.assignValue( 18417a42babeSAwanish Pandey GET_OR_DISTINCT(DITemplateTypeParameter, 1842ef27db87SMehdi Amini (Context, getMDString(Record[1]), 18437a42babeSAwanish Pandey getDITypeRefOrNull(Record[2]), 18447a42babeSAwanish Pandey (Record.size() == 4) ? getMDOrNull(Record[3]) 18457a42babeSAwanish Pandey : getMDOrNull(false))), 1846c05c9db3SIvan Krasin NextMetadataNo); 1847c05c9db3SIvan Krasin NextMetadataNo++; 1848ef27db87SMehdi Amini break; 1849ef27db87SMehdi Amini } 1850ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_VALUE: { 18517a42babeSAwanish Pandey if (Record.size() < 5 || Record.size() > 6) 1852ef27db87SMehdi Amini return error("Invalid record"); 1853ef27db87SMehdi Amini 1854ef27db87SMehdi Amini IsDistinct = Record[0]; 18557a42babeSAwanish Pandey 1856ef27db87SMehdi Amini MetadataList.assignValue( 18577a42babeSAwanish Pandey GET_OR_DISTINCT( 18587a42babeSAwanish Pandey DITemplateValueParameter, 1859ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]), 1860ef27db87SMehdi Amini getDITypeRefOrNull(Record[3]), 18617a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false), 18627a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[5]) 18637a42babeSAwanish Pandey : getMDOrNull(Record[4]))), 1864c05c9db3SIvan Krasin NextMetadataNo); 1865c05c9db3SIvan Krasin NextMetadataNo++; 1866ef27db87SMehdi Amini break; 1867ef27db87SMehdi Amini } 1868ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_VAR: { 1869f8ab35a4SMatthew Voss if (Record.size() < 11 || Record.size() > 13) 1870ef27db87SMehdi Amini return error("Invalid record"); 1871ef27db87SMehdi Amini 1872bceaaa96SAdrian Prantl IsDistinct = Record[0] & 1; 1873bceaaa96SAdrian Prantl unsigned Version = Record[0] >> 1; 1874ef27db87SMehdi Amini 1875f8ab35a4SMatthew Voss if (Version == 2) { 187630c28848SYonghong Song Metadata *Annotations = nullptr; 187730c28848SYonghong Song if (Record.size() > 12) 187830c28848SYonghong Song Annotations = getMDOrNull(Record[12]); 187930c28848SYonghong Song 1880f8ab35a4SMatthew Voss MetadataList.assignValue( 1881665b4138SLuís Ferreira GET_OR_DISTINCT(DIGlobalVariable, 1882665b4138SLuís Ferreira (Context, getMDOrNull(Record[1]), 1883665b4138SLuís Ferreira getMDString(Record[2]), getMDString(Record[3]), 1884665b4138SLuís Ferreira getMDOrNull(Record[4]), Record[5], 1885f8ab35a4SMatthew Voss getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1886665b4138SLuís Ferreira getMDOrNull(Record[9]), getMDOrNull(Record[10]), 1887665b4138SLuís Ferreira Record[11], Annotations)), 1888f8ab35a4SMatthew Voss NextMetadataNo); 1889f8ab35a4SMatthew Voss 1890f8ab35a4SMatthew Voss NextMetadataNo++; 1891f8ab35a4SMatthew Voss } else if (Version == 1) { 1892f8ab35a4SMatthew Voss // No upgrade necessary. A null field will be introduced to indicate 1893f8ab35a4SMatthew Voss // that no parameter information is available. 1894bceaaa96SAdrian Prantl MetadataList.assignValue( 1895665b4138SLuís Ferreira GET_OR_DISTINCT( 1896665b4138SLuís Ferreira DIGlobalVariable, 1897665b4138SLuís Ferreira (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1898665b4138SLuís Ferreira getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 18999f926f70SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8], 1900665b4138SLuís Ferreira getMDOrNull(Record[10]), nullptr, Record[11], nullptr)), 1901c05c9db3SIvan Krasin NextMetadataNo); 1902f8ab35a4SMatthew Voss 1903c05c9db3SIvan Krasin NextMetadataNo++; 1904bceaaa96SAdrian Prantl } else if (Version == 0) { 1905ef27db87SMehdi Amini // Upgrade old metadata, which stored a global variable reference or a 1906ef27db87SMehdi Amini // ConstantInt here. 1907a5bf2d70SAdrian Prantl NeedUpgradeToDIGlobalVariableExpression = true; 1908ef27db87SMehdi Amini Metadata *Expr = getMDOrNull(Record[9]); 1909ef27db87SMehdi Amini uint32_t AlignInBits = 0; 1910ef27db87SMehdi Amini if (Record.size() > 11) { 1911ef27db87SMehdi Amini if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1912ef27db87SMehdi Amini return error("Alignment value is too large"); 1913ef27db87SMehdi Amini AlignInBits = Record[11]; 1914ef27db87SMehdi Amini } 1915ef27db87SMehdi Amini GlobalVariable *Attach = nullptr; 1916ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) { 1917ef27db87SMehdi Amini if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) { 1918ef27db87SMehdi Amini Attach = GV; 1919ef27db87SMehdi Amini Expr = nullptr; 1920ef27db87SMehdi Amini } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) { 1921ef27db87SMehdi Amini Expr = DIExpression::get(Context, 1922ef27db87SMehdi Amini {dwarf::DW_OP_constu, CI->getZExtValue(), 1923ef27db87SMehdi Amini dwarf::DW_OP_stack_value}); 1924ef27db87SMehdi Amini } else { 1925ef27db87SMehdi Amini Expr = nullptr; 1926ef27db87SMehdi Amini } 1927ef27db87SMehdi Amini } 1928ef27db87SMehdi Amini DIGlobalVariable *DGV = GET_OR_DISTINCT( 1929ef27db87SMehdi Amini DIGlobalVariable, 1930ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), getMDString(Record[2]), 1931ef27db87SMehdi Amini getMDString(Record[3]), getMDOrNull(Record[4]), Record[5], 1932bceaaa96SAdrian Prantl getDITypeRefOrNull(Record[6]), Record[7], Record[8], 193330c28848SYonghong Song getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr)); 193403c6d31aSAdrian Prantl 1935e37d3144SAdrian Prantl DIGlobalVariableExpression *DGVE = nullptr; 1936e37d3144SAdrian Prantl if (Attach || Expr) 193705782218SAdrian Prantl DGVE = DIGlobalVariableExpression::getDistinct( 193805782218SAdrian Prantl Context, DGV, Expr ? Expr : DIExpression::get(Context, {})); 193973ec0656SAdrian Prantl if (Attach) 1940bceaaa96SAdrian Prantl Attach->addDebugInfo(DGVE); 1941e37d3144SAdrian Prantl 1942e37d3144SAdrian Prantl auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV); 1943e37d3144SAdrian Prantl MetadataList.assignValue(MDNode, NextMetadataNo); 1944e37d3144SAdrian Prantl NextMetadataNo++; 1945bceaaa96SAdrian Prantl } else 1946bceaaa96SAdrian Prantl return error("Invalid record"); 194773ec0656SAdrian Prantl 1948ef27db87SMehdi Amini break; 1949ef27db87SMehdi Amini } 1950ef27db87SMehdi Amini case bitc::METADATA_LOCAL_VAR: { 1951ef27db87SMehdi Amini // 10th field is for the obseleted 'inlinedAt:' field. 1952ef27db87SMehdi Amini if (Record.size() < 8 || Record.size() > 10) 1953ef27db87SMehdi Amini return error("Invalid record"); 1954ef27db87SMehdi Amini 1955ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 1956ef27db87SMehdi Amini bool HasAlignment = Record[0] & 2; 1957ef27db87SMehdi Amini // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or 1958ef27db87SMehdi Amini // DW_TAG_arg_variable, if we have alignment flag encoded it means, that 195968168d17SSimon Pilgrim // this is newer version of record which doesn't have artificial tag. 1960ef27db87SMehdi Amini bool HasTag = !HasAlignment && Record.size() > 8; 1961ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]); 1962ef27db87SMehdi Amini uint32_t AlignInBits = 0; 19631bebc31cSYonghong Song Metadata *Annotations = nullptr; 1964ef27db87SMehdi Amini if (HasAlignment) { 19651bebc31cSYonghong Song if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max()) 1966ef27db87SMehdi Amini return error("Alignment value is too large"); 19671bebc31cSYonghong Song AlignInBits = Record[8]; 19681bebc31cSYonghong Song if (Record.size() > 9) 19691bebc31cSYonghong Song Annotations = getMDOrNull(Record[9]); 1970ef27db87SMehdi Amini } 19711bebc31cSYonghong Song 1972ef27db87SMehdi Amini MetadataList.assignValue( 1973ef27db87SMehdi Amini GET_OR_DISTINCT(DILocalVariable, 1974ef27db87SMehdi Amini (Context, getMDOrNull(Record[1 + HasTag]), 1975ef27db87SMehdi Amini getMDString(Record[2 + HasTag]), 1976ef27db87SMehdi Amini getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag], 1977ef27db87SMehdi Amini getDITypeRefOrNull(Record[5 + HasTag]), 1978665b4138SLuís Ferreira Record[6 + HasTag], Flags, AlignInBits, Annotations)), 1979c05c9db3SIvan Krasin NextMetadataNo); 1980c05c9db3SIvan Krasin NextMetadataNo++; 1981ef27db87SMehdi Amini break; 1982ef27db87SMehdi Amini } 19832c864551SShiva Chen case bitc::METADATA_LABEL: { 19842c864551SShiva Chen if (Record.size() != 5) 19852c864551SShiva Chen return error("Invalid record"); 19862c864551SShiva Chen 19872c864551SShiva Chen IsDistinct = Record[0] & 1; 19882c864551SShiva Chen MetadataList.assignValue( 1989665b4138SLuís Ferreira GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]), 19902c864551SShiva Chen getMDString(Record[2]), 19912c864551SShiva Chen getMDOrNull(Record[3]), Record[4])), 19922c864551SShiva Chen NextMetadataNo); 19932c864551SShiva Chen NextMetadataNo++; 19942c864551SShiva Chen break; 19952c864551SShiva Chen } 1996ef27db87SMehdi Amini case bitc::METADATA_EXPRESSION: { 1997ef27db87SMehdi Amini if (Record.size() < 1) 1998ef27db87SMehdi Amini return error("Invalid record"); 1999ef27db87SMehdi Amini 2000ef27db87SMehdi Amini IsDistinct = Record[0] & 1; 20016825fb64SAdrian Prantl uint64_t Version = Record[0] >> 1; 2002ef27db87SMehdi Amini auto Elts = MutableArrayRef<uint64_t>(Record).slice(1); 2003ffc498dfSFlorian Hahn 2004ffc498dfSFlorian Hahn SmallVector<uint64_t, 6> Buffer; 200505963a3dSArthur Eubanks if (Error Err = upgradeDIExpression(Version, Elts, Buffer)) 2006ffc498dfSFlorian Hahn return Err; 2007ef27db87SMehdi Amini 2008665b4138SLuís Ferreira MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)), 2009665b4138SLuís Ferreira NextMetadataNo); 2010c05c9db3SIvan Krasin NextMetadataNo++; 2011ef27db87SMehdi Amini break; 2012ef27db87SMehdi Amini } 2013bceaaa96SAdrian Prantl case bitc::METADATA_GLOBAL_VAR_EXPR: { 2014bceaaa96SAdrian Prantl if (Record.size() != 3) 2015bceaaa96SAdrian Prantl return error("Invalid record"); 2016bceaaa96SAdrian Prantl 2017bceaaa96SAdrian Prantl IsDistinct = Record[0]; 201805782218SAdrian Prantl Metadata *Expr = getMDOrNull(Record[2]); 201905782218SAdrian Prantl if (!Expr) 202005782218SAdrian Prantl Expr = DIExpression::get(Context, {}); 202105782218SAdrian Prantl MetadataList.assignValue( 202205782218SAdrian Prantl GET_OR_DISTINCT(DIGlobalVariableExpression, 202305782218SAdrian Prantl (Context, getMDOrNull(Record[1]), Expr)), 2024c05c9db3SIvan Krasin NextMetadataNo); 2025c05c9db3SIvan Krasin NextMetadataNo++; 2026bceaaa96SAdrian Prantl break; 2027bceaaa96SAdrian Prantl } 2028ef27db87SMehdi Amini case bitc::METADATA_OBJC_PROPERTY: { 2029ef27db87SMehdi Amini if (Record.size() != 8) 2030ef27db87SMehdi Amini return error("Invalid record"); 2031ef27db87SMehdi Amini 2032ef27db87SMehdi Amini IsDistinct = Record[0]; 2033ef27db87SMehdi Amini MetadataList.assignValue( 2034ef27db87SMehdi Amini GET_OR_DISTINCT(DIObjCProperty, 2035ef27db87SMehdi Amini (Context, getMDString(Record[1]), 2036ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3], 2037ef27db87SMehdi Amini getMDString(Record[4]), getMDString(Record[5]), 2038ef27db87SMehdi Amini Record[6], getDITypeRefOrNull(Record[7]))), 2039c05c9db3SIvan Krasin NextMetadataNo); 2040c05c9db3SIvan Krasin NextMetadataNo++; 2041ef27db87SMehdi Amini break; 2042ef27db87SMehdi Amini } 2043ef27db87SMehdi Amini case bitc::METADATA_IMPORTED_ENTITY: { 2044a5b72abcSAlok Kumar Sharma if (Record.size() < 6 && Record.size() > 8) 2045ef27db87SMehdi Amini return error("Invalid record"); 2046ef27db87SMehdi Amini 2047ef27db87SMehdi Amini IsDistinct = Record[0]; 2048a5b72abcSAlok Kumar Sharma bool HasFile = (Record.size() >= 7); 2049a5b72abcSAlok Kumar Sharma bool HasElements = (Record.size() >= 8); 2050ef27db87SMehdi Amini MetadataList.assignValue( 2051ef27db87SMehdi Amini GET_OR_DISTINCT(DIImportedEntity, 2052ef27db87SMehdi Amini (Context, Record[1], getMDOrNull(Record[2]), 2053d63bfd21SAdrian Prantl getDITypeRefOrNull(Record[3]), 2054d63bfd21SAdrian Prantl HasFile ? getMDOrNull(Record[6]) : nullptr, 2055a5b72abcSAlok Kumar Sharma HasFile ? Record[4] : 0, getMDString(Record[5]), 2056a5b72abcSAlok Kumar Sharma HasElements ? getMDOrNull(Record[7]) : nullptr)), 2057c05c9db3SIvan Krasin NextMetadataNo); 2058c05c9db3SIvan Krasin NextMetadataNo++; 2059ef27db87SMehdi Amini break; 2060ef27db87SMehdi Amini } 2061ef27db87SMehdi Amini case bitc::METADATA_STRING_OLD: { 2062ef27db87SMehdi Amini std::string String(Record.begin(), Record.end()); 2063ef27db87SMehdi Amini 2064ef27db87SMehdi Amini // Test for upgrading !llvm.loop. 2065ef27db87SMehdi Amini HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String); 206619ef4fadSMehdi Amini ++NumMDStringLoaded; 2067ef27db87SMehdi Amini Metadata *MD = MDString::get(Context, String); 2068c05c9db3SIvan Krasin MetadataList.assignValue(MD, NextMetadataNo); 2069c05c9db3SIvan Krasin NextMetadataNo++; 2070ef27db87SMehdi Amini break; 2071ef27db87SMehdi Amini } 207219ef4fadSMehdi Amini case bitc::METADATA_STRINGS: { 207319ef4fadSMehdi Amini auto CreateNextMDString = [&](StringRef Str) { 207419ef4fadSMehdi Amini ++NumMDStringLoaded; 2075c05c9db3SIvan Krasin MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo); 2076c05c9db3SIvan Krasin NextMetadataNo++; 207719ef4fadSMehdi Amini }; 207819ef4fadSMehdi Amini if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString)) 2079ef27db87SMehdi Amini return Err; 2080ef27db87SMehdi Amini break; 208119ef4fadSMehdi Amini } 2082ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: { 2083ef27db87SMehdi Amini if (Record.size() % 2 == 0) 2084ef27db87SMehdi Amini return error("Invalid record"); 2085ef27db87SMehdi Amini unsigned ValueID = Record[0]; 2086ef27db87SMehdi Amini if (ValueID >= ValueList.size()) 2087ef27db87SMehdi Amini return error("Invalid record"); 2088ef27db87SMehdi Amini if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) 2089ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment( 2090ef27db87SMehdi Amini *GO, ArrayRef<uint64_t>(Record).slice(1))) 2091ef27db87SMehdi Amini return Err; 2092ef27db87SMehdi Amini break; 2093ef27db87SMehdi Amini } 2094ef27db87SMehdi Amini case bitc::METADATA_KIND: { 2095ef27db87SMehdi Amini // Support older bitcode files that had METADATA_KIND records in a 2096ef27db87SMehdi Amini // block with METADATA_BLOCK_ID. 2097ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record)) 2098ef27db87SMehdi Amini return Err; 2099ef27db87SMehdi Amini break; 2100ef27db87SMehdi Amini } 210165600cb2Sgbtozers case bitc::METADATA_ARG_LIST: { 210265600cb2Sgbtozers SmallVector<ValueAsMetadata *, 4> Elts; 210365600cb2Sgbtozers Elts.reserve(Record.size()); 2104e5d844b5SStephen Tozer for (uint64_t Elt : Record) { 2105e5d844b5SStephen Tozer Metadata *MD = getMD(Elt); 2106e5d844b5SStephen Tozer if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary()) 2107e5d844b5SStephen Tozer return error( 2108e5d844b5SStephen Tozer "Invalid record: DIArgList should not contain forward refs"); 2109e5d844b5SStephen Tozer if (!isa<ValueAsMetadata>(MD)) 2110e5d844b5SStephen Tozer return error("Invalid record"); 2111e5d844b5SStephen Tozer Elts.push_back(cast<ValueAsMetadata>(MD)); 2112e5d844b5SStephen Tozer } 211365600cb2Sgbtozers 211465600cb2Sgbtozers MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo); 211565600cb2Sgbtozers NextMetadataNo++; 211665600cb2Sgbtozers break; 211765600cb2Sgbtozers } 2118ef27db87SMehdi Amini } 21199f926f70SMehdi Amini return Error::success(); 212019ef4fadSMehdi Amini #undef GET_OR_DISTINCT 2121ef27db87SMehdi Amini } 2122ef27db87SMehdi Amini 2123ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings( 212419ef4fadSMehdi Amini ArrayRef<uint64_t> Record, StringRef Blob, 2125061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack) { 2126ef27db87SMehdi Amini // All the MDStrings in the block are emitted together in a single 2127ef27db87SMehdi Amini // record. The strings are concatenated and stored in a blob along with 2128ef27db87SMehdi Amini // their sizes. 2129ef27db87SMehdi Amini if (Record.size() != 2) 2130ef27db87SMehdi Amini return error("Invalid record: metadata strings layout"); 2131ef27db87SMehdi Amini 2132ef27db87SMehdi Amini unsigned NumStrings = Record[0]; 2133ef27db87SMehdi Amini unsigned StringsOffset = Record[1]; 2134ef27db87SMehdi Amini if (!NumStrings) 2135ef27db87SMehdi Amini return error("Invalid record: metadata strings with no strings"); 2136ef27db87SMehdi Amini if (StringsOffset > Blob.size()) 2137ef27db87SMehdi Amini return error("Invalid record: metadata strings corrupt offset"); 2138ef27db87SMehdi Amini 2139ef27db87SMehdi Amini StringRef Lengths = Blob.slice(0, StringsOffset); 2140ef27db87SMehdi Amini SimpleBitstreamCursor R(Lengths); 2141ef27db87SMehdi Amini 2142ef27db87SMehdi Amini StringRef Strings = Blob.drop_front(StringsOffset); 2143ef27db87SMehdi Amini do { 2144ef27db87SMehdi Amini if (R.AtEndOfStream()) 2145ef27db87SMehdi Amini return error("Invalid record: metadata strings bad length"); 2146ef27db87SMehdi Amini 2147b12a864cSDuncan P. N. Exon Smith uint32_t Size; 2148b12a864cSDuncan P. N. Exon Smith if (Error E = R.ReadVBR(6).moveInto(Size)) 2149b12a864cSDuncan P. N. Exon Smith return E; 2150ef27db87SMehdi Amini if (Strings.size() < Size) 2151ef27db87SMehdi Amini return error("Invalid record: metadata strings truncated chars"); 2152ef27db87SMehdi Amini 215319ef4fadSMehdi Amini CallBack(Strings.slice(0, Size)); 2154ef27db87SMehdi Amini Strings = Strings.drop_front(Size); 2155ef27db87SMehdi Amini } while (--NumStrings); 2156ef27db87SMehdi Amini 2157ef27db87SMehdi Amini return Error::success(); 2158ef27db87SMehdi Amini } 2159ef27db87SMehdi Amini 2160ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment( 2161ef27db87SMehdi Amini GlobalObject &GO, ArrayRef<uint64_t> Record) { 2162ef27db87SMehdi Amini assert(Record.size() % 2 == 0); 2163ef27db87SMehdi Amini for (unsigned I = 0, E = Record.size(); I != E; I += 2) { 2164ef27db87SMehdi Amini auto K = MDKindMap.find(Record[I]); 2165ef27db87SMehdi Amini if (K == MDKindMap.end()) 2166ef27db87SMehdi Amini return error("Invalid ID"); 2167c27ab339STeresa Johnson MDNode *MD = 2168c27ab339STeresa Johnson dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1])); 2169ef27db87SMehdi Amini if (!MD) 2170f3d2453dSTeresa Johnson return error("Invalid metadata attachment: expect fwd ref to MDNode"); 2171ef27db87SMehdi Amini GO.addMetadata(K->second, *MD); 2172ef27db87SMehdi Amini } 2173ef27db87SMehdi Amini return Error::success(); 2174ef27db87SMehdi Amini } 2175ef27db87SMehdi Amini 2176ef27db87SMehdi Amini /// Parse metadata attachments. 2177ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment( 2178ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList) { 21790e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID)) 21800e828958SJF Bastien return Err; 2181ef27db87SMehdi Amini 2182ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 21837b0d1457SMehdi Amini PlaceholderQueue Placeholders; 2184ef27db87SMehdi Amini 2185ef27db87SMehdi Amini while (true) { 2186b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 2187b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 2188b12a864cSDuncan P. N. Exon Smith return E; 2189ef27db87SMehdi Amini 2190ef27db87SMehdi Amini switch (Entry.Kind) { 2191ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 2192ef27db87SMehdi Amini case BitstreamEntry::Error: 2193ef27db87SMehdi Amini return error("Malformed block"); 2194ef27db87SMehdi Amini case BitstreamEntry::EndBlock: 21957b0d1457SMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 2196ef27db87SMehdi Amini return Error::success(); 2197ef27db87SMehdi Amini case BitstreamEntry::Record: 2198ef27db87SMehdi Amini // The interesting case. 2199ef27db87SMehdi Amini break; 2200ef27db87SMehdi Amini } 2201ef27db87SMehdi Amini 2202ef27db87SMehdi Amini // Read a metadata attachment record. 2203ef27db87SMehdi Amini Record.clear(); 220419ef4fadSMehdi Amini ++NumMDRecordLoaded; 22050e828958SJF Bastien Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record); 22060e828958SJF Bastien if (!MaybeRecord) 22070e828958SJF Bastien return MaybeRecord.takeError(); 22080e828958SJF Bastien switch (MaybeRecord.get()) { 2209ef27db87SMehdi Amini default: // Default behavior: ignore. 2210ef27db87SMehdi Amini break; 2211ef27db87SMehdi Amini case bitc::METADATA_ATTACHMENT: { 2212ef27db87SMehdi Amini unsigned RecordLength = Record.size(); 2213ef27db87SMehdi Amini if (Record.empty()) 2214ef27db87SMehdi Amini return error("Invalid record"); 2215ef27db87SMehdi Amini if (RecordLength % 2 == 0) { 2216ef27db87SMehdi Amini // A function attachment. 2217ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment(F, Record)) 2218ef27db87SMehdi Amini return Err; 2219ef27db87SMehdi Amini continue; 2220ef27db87SMehdi Amini } 2221ef27db87SMehdi Amini 2222ef27db87SMehdi Amini // An instruction attachment. 2223ef27db87SMehdi Amini Instruction *Inst = InstructionList[Record[0]]; 2224ef27db87SMehdi Amini for (unsigned i = 1; i != RecordLength; i = i + 2) { 2225ef27db87SMehdi Amini unsigned Kind = Record[i]; 2226ef27db87SMehdi Amini DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind); 2227ef27db87SMehdi Amini if (I == MDKindMap.end()) 2228ef27db87SMehdi Amini return error("Invalid ID"); 22298662305bSMehdi Amini if (I->second == LLVMContext::MD_tbaa && StripTBAA) 22308662305bSMehdi Amini continue; 22318662305bSMehdi Amini 223219ef4fadSMehdi Amini auto Idx = Record[i + 1]; 223319ef4fadSMehdi Amini if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) && 2234d5549f3dSMehdi Amini !MetadataList.lookup(Idx)) { 223519ef4fadSMehdi Amini // Load the attachment if it is in the lazy-loadable range and hasn't 223619ef4fadSMehdi Amini // been loaded yet. 223719ef4fadSMehdi Amini lazyLoadOneMetadata(Idx, Placeholders); 2238d5549f3dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders); 2239d5549f3dSMehdi Amini } 224019ef4fadSMehdi Amini 224119ef4fadSMehdi Amini Metadata *Node = MetadataList.getMetadataFwdRef(Idx); 2242ef27db87SMehdi Amini if (isa<LocalAsMetadata>(Node)) 2243ef27db87SMehdi Amini // Drop the attachment. This used to be legal, but there's no 2244ef27db87SMehdi Amini // upgrade path. 2245ef27db87SMehdi Amini break; 2246ef27db87SMehdi Amini MDNode *MD = dyn_cast_or_null<MDNode>(Node); 2247ef27db87SMehdi Amini if (!MD) 2248ef27db87SMehdi Amini return error("Invalid metadata attachment"); 2249ef27db87SMehdi Amini 2250ef27db87SMehdi Amini if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop) 2251ef27db87SMehdi Amini MD = upgradeInstructionLoopAttachment(*MD); 2252ef27db87SMehdi Amini 2253ef27db87SMehdi Amini if (I->second == LLVMContext::MD_tbaa) { 2254ef27db87SMehdi Amini assert(!MD->isTemporary() && "should load MDs before attachments"); 2255ef27db87SMehdi Amini MD = UpgradeTBAANode(*MD); 2256ef27db87SMehdi Amini } 2257ef27db87SMehdi Amini Inst->setMetadata(I->second, MD); 2258ef27db87SMehdi Amini } 2259ef27db87SMehdi Amini break; 2260ef27db87SMehdi Amini } 2261ef27db87SMehdi Amini } 2262ef27db87SMehdi Amini } 2263ef27db87SMehdi Amini } 2264ef27db87SMehdi Amini 2265ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap. 2266ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord( 2267ef27db87SMehdi Amini SmallVectorImpl<uint64_t> &Record) { 2268ef27db87SMehdi Amini if (Record.size() < 2) 2269ef27db87SMehdi Amini return error("Invalid record"); 2270ef27db87SMehdi Amini 2271ef27db87SMehdi Amini unsigned Kind = Record[0]; 2272ef27db87SMehdi Amini SmallString<8> Name(Record.begin() + 1, Record.end()); 2273ef27db87SMehdi Amini 2274ef27db87SMehdi Amini unsigned NewKind = TheModule.getMDKindID(Name.str()); 2275ef27db87SMehdi Amini if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second) 2276ef27db87SMehdi Amini return error("Conflicting METADATA_KIND records"); 2277ef27db87SMehdi Amini return Error::success(); 2278ef27db87SMehdi Amini } 2279ef27db87SMehdi Amini 2280ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK. 2281ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() { 22820e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID)) 22830e828958SJF Bastien return Err; 2284ef27db87SMehdi Amini 2285ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record; 2286ef27db87SMehdi Amini 2287ef27db87SMehdi Amini // Read all the records. 2288ef27db87SMehdi Amini while (true) { 2289b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry; 2290b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry)) 2291b12a864cSDuncan P. N. Exon Smith return E; 2292ef27db87SMehdi Amini 2293ef27db87SMehdi Amini switch (Entry.Kind) { 2294ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already. 2295ef27db87SMehdi Amini case BitstreamEntry::Error: 2296ef27db87SMehdi Amini return error("Malformed block"); 2297ef27db87SMehdi Amini case BitstreamEntry::EndBlock: 2298ef27db87SMehdi Amini return Error::success(); 2299ef27db87SMehdi Amini case BitstreamEntry::Record: 2300ef27db87SMehdi Amini // The interesting case. 2301ef27db87SMehdi Amini break; 2302ef27db87SMehdi Amini } 2303ef27db87SMehdi Amini 2304ef27db87SMehdi Amini // Read a record. 2305ef27db87SMehdi Amini Record.clear(); 230619ef4fadSMehdi Amini ++NumMDRecordLoaded; 23070e828958SJF Bastien Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record); 23080e828958SJF Bastien if (!MaybeCode) 23090e828958SJF Bastien return MaybeCode.takeError(); 23100e828958SJF Bastien switch (MaybeCode.get()) { 2311ef27db87SMehdi Amini default: // Default behavior: ignore. 2312ef27db87SMehdi Amini break; 2313ef27db87SMehdi Amini case bitc::METADATA_KIND: { 2314ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record)) 2315ef27db87SMehdi Amini return Err; 2316ef27db87SMehdi Amini break; 2317ef27db87SMehdi Amini } 2318ef27db87SMehdi Amini } 2319ef27db87SMehdi Amini } 2320ef27db87SMehdi Amini } 2321ef27db87SMehdi Amini 2322ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) { 2323ef27db87SMehdi Amini Pimpl = std::move(RHS.Pimpl); 2324ef27db87SMehdi Amini return *this; 2325ef27db87SMehdi Amini } 2326ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS) 2327ec68dd49SMehdi Amini : Pimpl(std::move(RHS.Pimpl)) {} 2328ef27db87SMehdi Amini 2329ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default; 2330ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule, 2331ef27db87SMehdi Amini BitcodeReaderValueList &ValueList, 2332a61f5e37STeresa Johnson bool IsImporting, 2333ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID) 23340eaee545SJonas Devlieghere : Pimpl(std::make_unique<MetadataLoaderImpl>( 2335061f4a5fSBenjamin Kramer Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {} 2336ef27db87SMehdi Amini 2337ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) { 2338ec68dd49SMehdi Amini return Pimpl->parseMetadata(ModuleLevel); 2339ef27db87SMehdi Amini } 2340ef27db87SMehdi Amini 2341ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); } 2342ef27db87SMehdi Amini 2343ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if 2344ef27db87SMehdi Amini /// necessary. 23453bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) { 23463bb4d01dSMehdi Amini return Pimpl->getMetadataFwdRefOrLoad(Idx); 2347ef27db87SMehdi Amini } 2348ef27db87SMehdi Amini 2349ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) { 2350ef27db87SMehdi Amini return Pimpl->lookupSubprogramForFunction(F); 2351ef27db87SMehdi Amini } 2352ef27db87SMehdi Amini 2353ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment( 2354ef27db87SMehdi Amini Function &F, const SmallVectorImpl<Instruction *> &InstructionList) { 2355ef27db87SMehdi Amini return Pimpl->parseMetadataAttachment(F, InstructionList); 2356ef27db87SMehdi Amini } 2357ef27db87SMehdi Amini 2358ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() { 2359ef27db87SMehdi Amini return Pimpl->parseMetadataKinds(); 2360ef27db87SMehdi Amini } 2361ef27db87SMehdi Amini 23628662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) { 23638662305bSMehdi Amini return Pimpl->setStripTBAA(StripTBAA); 23648662305bSMehdi Amini } 23658662305bSMehdi Amini 23668662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); } 23678662305bSMehdi Amini 2368ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); } 2369ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); } 23706825fb64SAdrian Prantl 23716825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) { 23726825fb64SAdrian Prantl return Pimpl->upgradeDebugIntrinsics(F); 23736825fb64SAdrian Prantl } 2374