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() {
36527379892SMehdi Amini     assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed");
36627379892SMehdi Amini   }
367bd76f372SSimon Pilgrim   bool empty() const { return PHs.empty(); }
368ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
369ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
37019ef4fadSMehdi Amini 
37119ef4fadSMehdi Amini   /// Return the list of temporaries nodes in the queue, these need to be
37219ef4fadSMehdi Amini   /// loaded before we can flush the queue.
37319ef4fadSMehdi Amini   void getTemporaries(BitcodeReaderMetadataList &MetadataList,
37419ef4fadSMehdi Amini                       DenseSet<unsigned> &Temporaries) {
37519ef4fadSMehdi Amini     for (auto &PH : PHs) {
37619ef4fadSMehdi Amini       auto ID = PH.getID();
37719ef4fadSMehdi Amini       auto *MD = MetadataList.lookup(ID);
37819ef4fadSMehdi Amini       if (!MD) {
37919ef4fadSMehdi Amini         Temporaries.insert(ID);
38019ef4fadSMehdi Amini         continue;
38119ef4fadSMehdi Amini       }
38219ef4fadSMehdi Amini       auto *N = dyn_cast_or_null<MDNode>(MD);
38319ef4fadSMehdi Amini       if (N && N->isTemporary())
38419ef4fadSMehdi Amini         Temporaries.insert(ID);
38519ef4fadSMehdi Amini     }
38619ef4fadSMehdi Amini   }
387ef27db87SMehdi Amini };
388ef27db87SMehdi Amini 
389ef27db87SMehdi Amini } // end anonymous namespace
390ef27db87SMehdi Amini 
391ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
392ef27db87SMehdi Amini   PHs.emplace_back(ID);
393ef27db87SMehdi Amini   return PHs.back();
394ef27db87SMehdi Amini }
395ef27db87SMehdi Amini 
396ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
397ef27db87SMehdi Amini   while (!PHs.empty()) {
3984f90ee00SMehdi Amini     auto *MD = MetadataList.lookup(PHs.front().getID());
3994f90ee00SMehdi Amini     assert(MD && "Flushing placeholder on unassigned MD");
4005ae6170fSMehdi Amini #ifndef NDEBUG
4014f90ee00SMehdi Amini     if (auto *MDN = dyn_cast<MDNode>(MD))
4025ae6170fSMehdi Amini       assert(MDN->isResolved() &&
4035ae6170fSMehdi Amini              "Flushing Placeholder while cycles aren't resolved");
4045ae6170fSMehdi Amini #endif
4055ae6170fSMehdi Amini     PHs.front().replaceUseWith(MD);
406ef27db87SMehdi Amini     PHs.pop_front();
407ef27db87SMehdi Amini   }
408ef27db87SMehdi Amini }
409ef27db87SMehdi Amini 
410d68904f9SJames Henderson } // anonymous namespace
411ef27db87SMehdi Amini 
412ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
413ffc498dfSFlorian Hahn   return make_error<StringError>(
414ffc498dfSFlorian Hahn       Message, make_error_code(BitcodeError::CorruptedBitcode));
415ffc498dfSFlorian Hahn }
416ffc498dfSFlorian Hahn 
417ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
418ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
419ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
420ef27db87SMehdi Amini   BitstreamCursor &Stream;
421ef27db87SMehdi Amini   LLVMContext &Context;
422ef27db87SMehdi Amini   Module &TheModule;
423ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
424ef27db87SMehdi Amini 
42519ef4fadSMehdi Amini   /// Cursor associated with the lazy-loading of Metadata. This is the easy way
42619ef4fadSMehdi Amini   /// to keep around the right "context" (Abbrev list) to be able to jump in
42719ef4fadSMehdi Amini   /// the middle of the metadata block and load any record.
42819ef4fadSMehdi Amini   BitstreamCursor IndexCursor;
42919ef4fadSMehdi Amini 
43019ef4fadSMehdi Amini   /// Index that keeps track of MDString values.
43119ef4fadSMehdi Amini   std::vector<StringRef> MDStringRef;
43219ef4fadSMehdi Amini 
43319ef4fadSMehdi Amini   /// On-demand loading of a single MDString. Requires the index above to be
43419ef4fadSMehdi Amini   /// populated.
43519ef4fadSMehdi Amini   MDString *lazyLoadOneMDString(unsigned Idx);
43619ef4fadSMehdi Amini 
43719ef4fadSMehdi Amini   /// Index that keeps track of where to find a metadata record in the stream.
43819ef4fadSMehdi Amini   std::vector<uint64_t> GlobalMetadataBitPosIndex;
43919ef4fadSMehdi Amini 
440c27ab339STeresa Johnson   /// Cursor position of the start of the global decl attachments, to enable
441c27ab339STeresa Johnson   /// loading using the index built for lazy loading, instead of forward
442c27ab339STeresa Johnson   /// references.
443c27ab339STeresa Johnson   uint64_t GlobalDeclAttachmentPos = 0;
444c27ab339STeresa Johnson 
445c27ab339STeresa Johnson #ifndef NDEBUG
446c27ab339STeresa Johnson   /// Sanity check that we end up parsing all of the global decl attachments.
447c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachSkipped = 0;
448c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachParsed = 0;
449c27ab339STeresa Johnson #endif
450c27ab339STeresa Johnson 
451c27ab339STeresa Johnson   /// Load the global decl attachments, using the index built for lazy loading.
452c27ab339STeresa Johnson   Expected<bool> loadGlobalDeclAttachments();
453c27ab339STeresa Johnson 
45419ef4fadSMehdi Amini   /// Populate the index above to enable lazily loading of metadata, and load
45519ef4fadSMehdi Amini   /// the named metadata as well as the transitively referenced global
45619ef4fadSMehdi Amini   /// Metadata.
45742ef1990SMehdi Amini   Expected<bool> lazyLoadModuleMetadataBlock();
45819ef4fadSMehdi Amini 
45919ef4fadSMehdi Amini   /// On-demand loading of a single metadata. Requires the index above to be
46019ef4fadSMehdi Amini   /// populated.
46119ef4fadSMehdi Amini   void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
46219ef4fadSMehdi Amini 
4639f926f70SMehdi Amini   // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4649f926f70SMehdi Amini   // point from SP to CU after a block is completly parsed.
4659f926f70SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4669f926f70SMehdi Amini 
467ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
468ef27db87SMehdi Amini   /// metadata.
469ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
470ef27db87SMehdi Amini 
471ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
472ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
473ef27db87SMehdi Amini 
4748662305bSMehdi Amini   bool StripTBAA = false;
475ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
476e37d3144SAdrian Prantl   bool NeedUpgradeToDIGlobalVariableExpression = false;
4776825fb64SAdrian Prantl   bool NeedDeclareExpressionUpgrade = false;
478ef27db87SMehdi Amini 
479ec68dd49SMehdi Amini   /// True if metadata is being parsed for a module being ThinLTO imported.
480ec68dd49SMehdi Amini   bool IsImporting = false;
481ec68dd49SMehdi Amini 
4829f926f70SMehdi Amini   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4839f926f70SMehdi Amini                          PlaceholderQueue &Placeholders, StringRef Blob,
484ef27db87SMehdi Amini                          unsigned &NextMetadataNo);
48519ef4fadSMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
486061f4a5fSBenjamin Kramer                              function_ref<void(StringRef)> CallBack);
487ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
488ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
489ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
490ef27db87SMehdi Amini 
49119ef4fadSMehdi Amini   void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
49219ef4fadSMehdi Amini 
49319ef4fadSMehdi Amini   /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
49419ef4fadSMehdi Amini   void upgradeCUSubprograms() {
49519ef4fadSMehdi Amini     for (auto CU_SP : CUSubprograms)
49619ef4fadSMehdi Amini       if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
49719ef4fadSMehdi Amini         for (auto &Op : SPs->operands())
4989d2f019fSAdrian Prantl           if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
4999d2f019fSAdrian Prantl             SP->replaceUnit(CU_SP.first);
50019ef4fadSMehdi Amini     CUSubprograms.clear();
50119ef4fadSMehdi Amini   }
50219ef4fadSMehdi Amini 
503e37d3144SAdrian Prantl   /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
504e37d3144SAdrian Prantl   void upgradeCUVariables() {
505e37d3144SAdrian Prantl     if (!NeedUpgradeToDIGlobalVariableExpression)
506e37d3144SAdrian Prantl       return;
507e37d3144SAdrian Prantl 
508e37d3144SAdrian Prantl     // Upgrade list of variables attached to the CUs.
509e37d3144SAdrian Prantl     if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
510e37d3144SAdrian Prantl       for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
511e37d3144SAdrian Prantl         auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
512e37d3144SAdrian Prantl         if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
513e37d3144SAdrian Prantl           for (unsigned I = 0; I < GVs->getNumOperands(); I++)
514e37d3144SAdrian Prantl             if (auto *GV =
515e37d3144SAdrian Prantl                     dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
51605782218SAdrian Prantl               auto *DGVE = DIGlobalVariableExpression::getDistinct(
51705782218SAdrian Prantl                   Context, GV, DIExpression::get(Context, {}));
518e37d3144SAdrian Prantl               GVs->replaceOperandWith(I, DGVE);
519e37d3144SAdrian Prantl             }
520e37d3144SAdrian Prantl       }
521e37d3144SAdrian Prantl 
522e37d3144SAdrian Prantl     // Upgrade variables attached to globals.
523e37d3144SAdrian Prantl     for (auto &GV : TheModule.globals()) {
52456a08b40SDavide Italiano       SmallVector<MDNode *, 1> MDs;
525e37d3144SAdrian Prantl       GV.getMetadata(LLVMContext::MD_dbg, MDs);
526e37d3144SAdrian Prantl       GV.eraseMetadata(LLVMContext::MD_dbg);
527e37d3144SAdrian Prantl       for (auto *MD : MDs)
5282bb217b5SSimon Pilgrim         if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
52905782218SAdrian Prantl           auto *DGVE = DIGlobalVariableExpression::getDistinct(
53005782218SAdrian Prantl               Context, DGV, DIExpression::get(Context, {}));
531e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
532e37d3144SAdrian Prantl         } else
533e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *MD);
534e37d3144SAdrian Prantl     }
535e37d3144SAdrian Prantl   }
536e37d3144SAdrian Prantl 
5376825fb64SAdrian Prantl   /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5386825fb64SAdrian Prantl   /// describes a function argument.
5396825fb64SAdrian Prantl   void upgradeDeclareExpressions(Function &F) {
5406825fb64SAdrian Prantl     if (!NeedDeclareExpressionUpgrade)
5416825fb64SAdrian Prantl       return;
5426825fb64SAdrian Prantl 
5436825fb64SAdrian Prantl     for (auto &BB : F)
5446825fb64SAdrian Prantl       for (auto &I : BB)
5456825fb64SAdrian Prantl         if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5466825fb64SAdrian Prantl           if (auto *DIExpr = DDI->getExpression())
5476825fb64SAdrian Prantl             if (DIExpr->startsWithDeref() &&
5486825fb64SAdrian Prantl                 dyn_cast_or_null<Argument>(DDI->getAddress())) {
5496825fb64SAdrian Prantl               SmallVector<uint64_t, 8> Ops;
5506825fb64SAdrian Prantl               Ops.append(std::next(DIExpr->elements_begin()),
5516825fb64SAdrian Prantl                          DIExpr->elements_end());
552e5d958c4Sgbtozers               DDI->setExpression(DIExpression::get(Context, Ops));
5536825fb64SAdrian Prantl             }
5546825fb64SAdrian Prantl   }
5556825fb64SAdrian Prantl 
556ffc498dfSFlorian Hahn   /// Upgrade the expression from previous versions.
557*05963a3dSArthur Eubanks   Error upgradeDIExpression(uint64_t FromVersion,
558ffc498dfSFlorian Hahn                             MutableArrayRef<uint64_t> &Expr,
559ffc498dfSFlorian Hahn                             SmallVectorImpl<uint64_t> &Buffer) {
560ffc498dfSFlorian Hahn     auto N = Expr.size();
561ffc498dfSFlorian Hahn     switch (FromVersion) {
562ffc498dfSFlorian Hahn     default:
563ffc498dfSFlorian Hahn       return error("Invalid record");
564ffc498dfSFlorian Hahn     case 0:
565ffc498dfSFlorian Hahn       if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
566ffc498dfSFlorian Hahn         Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
567ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
568ffc498dfSFlorian Hahn     case 1:
569ffc498dfSFlorian Hahn       // Move DW_OP_deref to the end.
570ffc498dfSFlorian Hahn       if (N && Expr[0] == dwarf::DW_OP_deref) {
571ffc498dfSFlorian Hahn         auto End = Expr.end();
572ffc498dfSFlorian Hahn         if (Expr.size() >= 3 &&
573ffc498dfSFlorian Hahn             *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
574ffc498dfSFlorian Hahn           End = std::prev(End, 3);
575ffc498dfSFlorian Hahn         std::move(std::next(Expr.begin()), End, Expr.begin());
576ffc498dfSFlorian Hahn         *std::prev(End) = dwarf::DW_OP_deref;
577ffc498dfSFlorian Hahn       }
578ffc498dfSFlorian Hahn       NeedDeclareExpressionUpgrade = true;
579ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
580ffc498dfSFlorian Hahn     case 2: {
581ffc498dfSFlorian Hahn       // Change DW_OP_plus to DW_OP_plus_uconst.
582ffc498dfSFlorian Hahn       // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
583ffc498dfSFlorian Hahn       auto SubExpr = ArrayRef<uint64_t>(Expr);
584ffc498dfSFlorian Hahn       while (!SubExpr.empty()) {
585ffc498dfSFlorian Hahn         // Skip past other operators with their operands
586ffc498dfSFlorian Hahn         // for this version of the IR, obtained from
587ffc498dfSFlorian Hahn         // from historic DIExpression::ExprOperand::getSize().
588ffc498dfSFlorian Hahn         size_t HistoricSize;
589ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
590ffc498dfSFlorian Hahn         default:
591ffc498dfSFlorian Hahn           HistoricSize = 1;
592ffc498dfSFlorian Hahn           break;
593ffc498dfSFlorian Hahn         case dwarf::DW_OP_constu:
594ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
595ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
596ffc498dfSFlorian Hahn           HistoricSize = 2;
597ffc498dfSFlorian Hahn           break;
598ffc498dfSFlorian Hahn         case dwarf::DW_OP_LLVM_fragment:
599ffc498dfSFlorian Hahn           HistoricSize = 3;
600ffc498dfSFlorian Hahn           break;
601ffc498dfSFlorian Hahn         }
602ffc498dfSFlorian Hahn 
603ffc498dfSFlorian Hahn         // If the expression is malformed, make sure we don't
604ffc498dfSFlorian Hahn         // copy more elements than we should.
605ffc498dfSFlorian Hahn         HistoricSize = std::min(SubExpr.size(), HistoricSize);
606ffc498dfSFlorian Hahn         ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1);
607ffc498dfSFlorian Hahn 
608ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
609ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
610ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_plus_uconst);
611ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
612ffc498dfSFlorian Hahn           break;
613ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
614ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_constu);
615ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
616ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_minus);
617ffc498dfSFlorian Hahn           break;
618ffc498dfSFlorian Hahn         default:
619ffc498dfSFlorian Hahn           Buffer.push_back(*SubExpr.begin());
620ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
621ffc498dfSFlorian Hahn           break;
622ffc498dfSFlorian Hahn         }
623ffc498dfSFlorian Hahn 
624ffc498dfSFlorian Hahn         // Continue with remaining elements.
625ffc498dfSFlorian Hahn         SubExpr = SubExpr.slice(HistoricSize);
626ffc498dfSFlorian Hahn       }
627ffc498dfSFlorian Hahn       Expr = MutableArrayRef<uint64_t>(Buffer);
628ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
629ffc498dfSFlorian Hahn     }
630ffc498dfSFlorian Hahn     case 3:
631ffc498dfSFlorian Hahn       // Up-to-date!
632ffc498dfSFlorian Hahn       break;
633ffc498dfSFlorian Hahn     }
634ffc498dfSFlorian Hahn 
635ffc498dfSFlorian Hahn     return Error::success();
636ffc498dfSFlorian Hahn   }
637ffc498dfSFlorian Hahn 
638e37d3144SAdrian Prantl   void upgradeDebugInfo() {
639e37d3144SAdrian Prantl     upgradeCUSubprograms();
640e37d3144SAdrian Prantl     upgradeCUVariables();
641e37d3144SAdrian Prantl   }
642e37d3144SAdrian Prantl 
643ef27db87SMehdi Amini public:
644ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
645ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
646ec68dd49SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID,
647ec68dd49SMehdi Amini                      bool IsImporting)
648864474c9SFlorian Hahn       : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
649864474c9SFlorian Hahn         ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
650864474c9SFlorian Hahn         TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
651864474c9SFlorian Hahn         IsImporting(IsImporting) {}
652ef27db87SMehdi Amini 
653ec68dd49SMehdi Amini   Error parseMetadata(bool ModuleLevel);
654ef27db87SMehdi Amini 
655ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6563bb4d01dSMehdi Amini 
6573bb4d01dSMehdi Amini   Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6583bb4d01dSMehdi Amini     if (ID < MDStringRef.size())
6593bb4d01dSMehdi Amini       return lazyLoadOneMDString(ID);
6603bb4d01dSMehdi Amini     if (auto *MD = MetadataList.lookup(ID))
6613bb4d01dSMehdi Amini       return MD;
6623bb4d01dSMehdi Amini     // If lazy-loading is enabled, we try recursively to load the operand
6633bb4d01dSMehdi Amini     // instead of creating a temporary.
6643bb4d01dSMehdi Amini     if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6653bb4d01dSMehdi Amini       PlaceholderQueue Placeholders;
6663bb4d01dSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
6673bb4d01dSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
6683bb4d01dSMehdi Amini       return MetadataList.lookup(ID);
6693bb4d01dSMehdi Amini     }
6703bb4d01dSMehdi Amini     return MetadataList.getMetadataFwdRef(ID);
671ef27db87SMehdi Amini   }
672ef27db87SMehdi Amini 
673ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
674ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
675ef27db87SMehdi Amini   }
676ef27db87SMehdi Amini 
677bd76f372SSimon Pilgrim   bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
678ef27db87SMehdi Amini 
679ef27db87SMehdi Amini   Error parseMetadataAttachment(
680ef27db87SMehdi Amini       Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
681ef27db87SMehdi Amini 
682ef27db87SMehdi Amini   Error parseMetadataKinds();
683ef27db87SMehdi Amini 
6848662305bSMehdi Amini   void setStripTBAA(bool Value) { StripTBAA = Value; }
685bd76f372SSimon Pilgrim   bool isStrippingTBAA() const { return StripTBAA; }
6868662305bSMehdi Amini 
687ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
688ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
6896825fb64SAdrian Prantl   void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
690ef27db87SMehdi Amini };
691ef27db87SMehdi Amini 
69242ef1990SMehdi Amini Expected<bool>
69342ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
69419ef4fadSMehdi Amini   IndexCursor = Stream;
69519ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
696c27ab339STeresa Johnson   GlobalDeclAttachmentPos = 0;
69719ef4fadSMehdi Amini   // Get the abbrevs, and preload record positions to make them lazy-loadable.
69819ef4fadSMehdi Amini   while (true) {
699c27ab339STeresa Johnson     uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
700b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
701b12a864cSDuncan P. N. Exon Smith     if (Error E =
702b12a864cSDuncan P. N. Exon Smith             IndexCursor
703b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
704b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
705b12a864cSDuncan P. N. Exon Smith       return std::move(E);
7060e828958SJF Bastien 
70719ef4fadSMehdi Amini     switch (Entry.Kind) {
70819ef4fadSMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
70919ef4fadSMehdi Amini     case BitstreamEntry::Error:
71019ef4fadSMehdi Amini       return error("Malformed block");
71119ef4fadSMehdi Amini     case BitstreamEntry::EndBlock: {
71219ef4fadSMehdi Amini       return true;
71319ef4fadSMehdi Amini     }
71419ef4fadSMehdi Amini     case BitstreamEntry::Record: {
71519ef4fadSMehdi Amini       // The interesting case.
71619ef4fadSMehdi Amini       ++NumMDRecordLoaded;
71719ef4fadSMehdi Amini       uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
718b12a864cSDuncan P. N. Exon Smith       unsigned Code;
719b12a864cSDuncan P. N. Exon Smith       if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
720b12a864cSDuncan P. N. Exon Smith         return std::move(E);
72119ef4fadSMehdi Amini       switch (Code) {
72219ef4fadSMehdi Amini       case bitc::METADATA_STRINGS: {
72319ef4fadSMehdi Amini         // Rewind and parse the strings.
7240e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
725c55cf4afSBill Wendling           return std::move(Err);
72619ef4fadSMehdi Amini         StringRef Blob;
72719ef4fadSMehdi Amini         Record.clear();
7280e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7290e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record, &Blob))
7300e828958SJF Bastien           ;
7310e828958SJF Bastien         else
7320e828958SJF Bastien           return MaybeRecord.takeError();
73319ef4fadSMehdi Amini         unsigned NumStrings = Record[0];
73419ef4fadSMehdi Amini         MDStringRef.reserve(NumStrings);
73519ef4fadSMehdi Amini         auto IndexNextMDString = [&](StringRef Str) {
73619ef4fadSMehdi Amini           MDStringRef.push_back(Str);
73719ef4fadSMehdi Amini         };
73819ef4fadSMehdi Amini         if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
739c55cf4afSBill Wendling           return std::move(Err);
74019ef4fadSMehdi Amini         break;
74119ef4fadSMehdi Amini       }
74219ef4fadSMehdi Amini       case bitc::METADATA_INDEX_OFFSET: {
74319ef4fadSMehdi Amini         // This is the offset to the index, when we see this we skip all the
74419ef4fadSMehdi Amini         // records and load only an index to these.
7450e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
746c55cf4afSBill Wendling           return std::move(Err);
74719ef4fadSMehdi Amini         Record.clear();
7480e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7490e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7500e828958SJF Bastien           ;
7510e828958SJF Bastien         else
7520e828958SJF Bastien           return MaybeRecord.takeError();
75319ef4fadSMehdi Amini         if (Record.size() != 2)
75419ef4fadSMehdi Amini           return error("Invalid record");
75519ef4fadSMehdi Amini         auto Offset = Record[0] + (Record[1] << 32);
75619ef4fadSMehdi Amini         auto BeginPos = IndexCursor.GetCurrentBitNo();
7570e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
758c55cf4afSBill Wendling           return std::move(Err);
7590e828958SJF Bastien         Expected<BitstreamEntry> MaybeEntry =
7600e828958SJF Bastien             IndexCursor.advanceSkippingSubblocks(
76119ef4fadSMehdi Amini                 BitstreamCursor::AF_DontPopBlockAtEnd);
7620e828958SJF Bastien         if (!MaybeEntry)
7630e828958SJF Bastien           return MaybeEntry.takeError();
7640e828958SJF Bastien         Entry = MaybeEntry.get();
76519ef4fadSMehdi Amini         assert(Entry.Kind == BitstreamEntry::Record &&
76619ef4fadSMehdi Amini                "Corrupted bitcode: Expected `Record` when trying to find the "
76719ef4fadSMehdi Amini                "Metadata index");
76819ef4fadSMehdi Amini         Record.clear();
7690e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7700e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7710e828958SJF Bastien           assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7720e828958SJF Bastien                  "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7730e828958SJF Bastien                  "find the Metadata index");
7740e828958SJF Bastien         else
7750e828958SJF Bastien           return MaybeCode.takeError();
77619ef4fadSMehdi Amini         // Delta unpack
77719ef4fadSMehdi Amini         auto CurrentValue = BeginPos;
77819ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.reserve(Record.size());
77919ef4fadSMehdi Amini         for (auto &Elt : Record) {
78019ef4fadSMehdi Amini           CurrentValue += Elt;
78119ef4fadSMehdi Amini           GlobalMetadataBitPosIndex.push_back(CurrentValue);
78219ef4fadSMehdi Amini         }
78319ef4fadSMehdi Amini         break;
78419ef4fadSMehdi Amini       }
78519ef4fadSMehdi Amini       case bitc::METADATA_INDEX:
78619ef4fadSMehdi Amini         // We don't expect to get there, the Index is loaded when we encounter
78719ef4fadSMehdi Amini         // the offset.
78819ef4fadSMehdi Amini         return error("Corrupted Metadata block");
78919ef4fadSMehdi Amini       case bitc::METADATA_NAME: {
79019ef4fadSMehdi Amini         // Named metadata need to be materialized now and aren't deferred.
7910e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
792c55cf4afSBill Wendling           return std::move(Err);
79319ef4fadSMehdi Amini         Record.clear();
7940e828958SJF Bastien 
7950e828958SJF Bastien         unsigned Code;
7960e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7970e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record)) {
7980e828958SJF Bastien           Code = MaybeCode.get();
79919ef4fadSMehdi Amini           assert(Code == bitc::METADATA_NAME);
8000e828958SJF Bastien         } else
8010e828958SJF Bastien           return MaybeCode.takeError();
80219ef4fadSMehdi Amini 
80319ef4fadSMehdi Amini         // Read name of the named metadata.
80419ef4fadSMehdi Amini         SmallString<8> Name(Record.begin(), Record.end());
8050e828958SJF Bastien         if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
8060e828958SJF Bastien           Code = MaybeCode.get();
8070e828958SJF Bastien         else
8080e828958SJF Bastien           return MaybeCode.takeError();
80919ef4fadSMehdi Amini 
81019ef4fadSMehdi Amini         // Named Metadata comes in two parts, we expect the name to be followed
81119ef4fadSMehdi Amini         // by the node
81219ef4fadSMehdi Amini         Record.clear();
8130e828958SJF Bastien         if (Expected<unsigned> MaybeNextBitCode =
8140e828958SJF Bastien                 IndexCursor.readRecord(Code, Record))
8150e828958SJF Bastien           assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8160e828958SJF Bastien         else
8170e828958SJF Bastien           return MaybeNextBitCode.takeError();
81819ef4fadSMehdi Amini 
81919ef4fadSMehdi Amini         // Read named metadata elements.
82019ef4fadSMehdi Amini         unsigned Size = Record.size();
82119ef4fadSMehdi Amini         NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
82219ef4fadSMehdi Amini         for (unsigned i = 0; i != Size; ++i) {
82319ef4fadSMehdi Amini           // FIXME: We could use a placeholder here, however NamedMDNode are
82419ef4fadSMehdi Amini           // taking MDNode as operand and not using the Metadata infrastructure.
82519ef4fadSMehdi Amini           // It is acknowledged by 'TODO: Inherit from Metadata' in the
82619ef4fadSMehdi Amini           // NamedMDNode class definition.
82719ef4fadSMehdi Amini           MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
828f3d2453dSTeresa Johnson           assert(MD && "Invalid metadata: expect fwd ref to MDNode");
82919ef4fadSMehdi Amini           NMD->addOperand(MD);
83019ef4fadSMehdi Amini         }
83119ef4fadSMehdi Amini         break;
83219ef4fadSMehdi Amini       }
83319ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
834c27ab339STeresa Johnson         if (!GlobalDeclAttachmentPos)
835c27ab339STeresa Johnson           GlobalDeclAttachmentPos = SavedPos;
836c27ab339STeresa Johnson #ifndef NDEBUG
837c27ab339STeresa Johnson         NumGlobalDeclAttachSkipped++;
838c27ab339STeresa Johnson #endif
83919ef4fadSMehdi Amini         break;
84019ef4fadSMehdi Amini       }
84119ef4fadSMehdi Amini       case bitc::METADATA_KIND:
84219ef4fadSMehdi Amini       case bitc::METADATA_STRING_OLD:
84319ef4fadSMehdi Amini       case bitc::METADATA_OLD_FN_NODE:
84419ef4fadSMehdi Amini       case bitc::METADATA_OLD_NODE:
84519ef4fadSMehdi Amini       case bitc::METADATA_VALUE:
84619ef4fadSMehdi Amini       case bitc::METADATA_DISTINCT_NODE:
84719ef4fadSMehdi Amini       case bitc::METADATA_NODE:
84819ef4fadSMehdi Amini       case bitc::METADATA_LOCATION:
84919ef4fadSMehdi Amini       case bitc::METADATA_GENERIC_DEBUG:
85019ef4fadSMehdi Amini       case bitc::METADATA_SUBRANGE:
85119ef4fadSMehdi Amini       case bitc::METADATA_ENUMERATOR:
85219ef4fadSMehdi Amini       case bitc::METADATA_BASIC_TYPE:
853f91d18eaSSourabh Singh Tomar       case bitc::METADATA_STRING_TYPE:
85419ef4fadSMehdi Amini       case bitc::METADATA_DERIVED_TYPE:
85519ef4fadSMehdi Amini       case bitc::METADATA_COMPOSITE_TYPE:
85619ef4fadSMehdi Amini       case bitc::METADATA_SUBROUTINE_TYPE:
85719ef4fadSMehdi Amini       case bitc::METADATA_MODULE:
85819ef4fadSMehdi Amini       case bitc::METADATA_FILE:
85919ef4fadSMehdi Amini       case bitc::METADATA_COMPILE_UNIT:
86019ef4fadSMehdi Amini       case bitc::METADATA_SUBPROGRAM:
86119ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK:
86219ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK_FILE:
86319ef4fadSMehdi Amini       case bitc::METADATA_NAMESPACE:
8646ed5706aSAdrian Prantl       case bitc::METADATA_COMMON_BLOCK:
86519ef4fadSMehdi Amini       case bitc::METADATA_MACRO:
86619ef4fadSMehdi Amini       case bitc::METADATA_MACRO_FILE:
86719ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_TYPE:
86819ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_VALUE:
86919ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR:
87019ef4fadSMehdi Amini       case bitc::METADATA_LOCAL_VAR:
8712c864551SShiva Chen       case bitc::METADATA_LABEL:
87219ef4fadSMehdi Amini       case bitc::METADATA_EXPRESSION:
87319ef4fadSMehdi Amini       case bitc::METADATA_OBJC_PROPERTY:
87419ef4fadSMehdi Amini       case bitc::METADATA_IMPORTED_ENTITY:
87519ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR_EXPR:
876a6dd01afSAlok Kumar Sharma       case bitc::METADATA_GENERIC_SUBRANGE:
87719ef4fadSMehdi Amini         // We don't expect to see any of these, if we see one, give up on
87819ef4fadSMehdi Amini         // lazy-loading and fallback.
87919ef4fadSMehdi Amini         MDStringRef.clear();
88019ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.clear();
88119ef4fadSMehdi Amini         return false;
88219ef4fadSMehdi Amini       }
88319ef4fadSMehdi Amini       break;
88419ef4fadSMehdi Amini     }
88519ef4fadSMehdi Amini     }
88619ef4fadSMehdi Amini   }
88719ef4fadSMehdi Amini }
88819ef4fadSMehdi Amini 
889c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index.
890c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be
891c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying
892c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index
893c27ab339STeresa Johnson // instead of creating temporaries.
894c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
895c27ab339STeresa Johnson   // Nothing to do if we didn't find any of these metadata records.
896c27ab339STeresa Johnson   if (!GlobalDeclAttachmentPos)
897c27ab339STeresa Johnson     return true;
898c27ab339STeresa Johnson   // Use a temporary cursor so that we don't mess up the main Stream cursor or
899c27ab339STeresa Johnson   // the lazy loading IndexCursor (which holds the necessary abbrev ids).
900c27ab339STeresa Johnson   BitstreamCursor TempCursor = Stream;
901c27ab339STeresa Johnson   SmallVector<uint64_t, 64> Record;
902c27ab339STeresa Johnson   // Jump to the position before the first global decl attachment, so we can
903c27ab339STeresa Johnson   // scan for the first BitstreamEntry record.
904c27ab339STeresa Johnson   if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
905c27ab339STeresa Johnson     return std::move(Err);
906c27ab339STeresa Johnson   while (true) {
907b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
908b12a864cSDuncan P. N. Exon Smith     if (Error E =
909b12a864cSDuncan P. N. Exon Smith             TempCursor
910b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
911b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
912b12a864cSDuncan P. N. Exon Smith       return std::move(E);
913c27ab339STeresa Johnson 
914c27ab339STeresa Johnson     switch (Entry.Kind) {
915c27ab339STeresa Johnson     case BitstreamEntry::SubBlock: // Handled for us already.
916c27ab339STeresa Johnson     case BitstreamEntry::Error:
917c27ab339STeresa Johnson       return error("Malformed block");
918c27ab339STeresa Johnson     case BitstreamEntry::EndBlock:
919c27ab339STeresa Johnson       // Sanity check that we parsed them all.
920c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
921c27ab339STeresa Johnson       return true;
922c27ab339STeresa Johnson     case BitstreamEntry::Record:
923c27ab339STeresa Johnson       break;
924c27ab339STeresa Johnson     }
925c27ab339STeresa Johnson     uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
926c27ab339STeresa Johnson     Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
927c27ab339STeresa Johnson     if (!MaybeCode)
928c27ab339STeresa Johnson       return MaybeCode.takeError();
929c27ab339STeresa Johnson     if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
930c27ab339STeresa Johnson       // Anything other than a global decl attachment signals the end of
931c27ab339STeresa Johnson       // these records. sanity check that we parsed them all.
932c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
933c27ab339STeresa Johnson       return true;
934c27ab339STeresa Johnson     }
935c27ab339STeresa Johnson #ifndef NDEBUG
936c27ab339STeresa Johnson     NumGlobalDeclAttachParsed++;
937c27ab339STeresa Johnson #endif
938c27ab339STeresa Johnson     // FIXME: we need to do this early because we don't materialize global
939c27ab339STeresa Johnson     // value explicitly.
940c27ab339STeresa Johnson     if (Error Err = TempCursor.JumpToBit(CurrentPos))
941c27ab339STeresa Johnson       return std::move(Err);
942c27ab339STeresa Johnson     Record.clear();
943c27ab339STeresa Johnson     if (Expected<unsigned> MaybeRecord =
944c27ab339STeresa Johnson             TempCursor.readRecord(Entry.ID, Record))
945c27ab339STeresa Johnson       ;
946c27ab339STeresa Johnson     else
947c27ab339STeresa Johnson       return MaybeRecord.takeError();
948c27ab339STeresa Johnson     if (Record.size() % 2 == 0)
949c27ab339STeresa Johnson       return error("Invalid record");
950c27ab339STeresa Johnson     unsigned ValueID = Record[0];
951c27ab339STeresa Johnson     if (ValueID >= ValueList.size())
952c27ab339STeresa Johnson       return error("Invalid record");
953c27ab339STeresa Johnson     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
954c27ab339STeresa Johnson       // Need to save and restore the current position since
955c27ab339STeresa Johnson       // parseGlobalObjectAttachment will resolve all forward references which
956c27ab339STeresa Johnson       // would require parsing from locations stored in the index.
957c27ab339STeresa Johnson       CurrentPos = TempCursor.GetCurrentBitNo();
958c27ab339STeresa Johnson       if (Error Err = parseGlobalObjectAttachment(
959c27ab339STeresa Johnson               *GO, ArrayRef<uint64_t>(Record).slice(1)))
960c27ab339STeresa Johnson         return std::move(Err);
961c27ab339STeresa Johnson       if (Error Err = TempCursor.JumpToBit(CurrentPos))
962c27ab339STeresa Johnson         return std::move(Err);
963c27ab339STeresa Johnson     }
964c27ab339STeresa Johnson   }
965c27ab339STeresa Johnson }
966c27ab339STeresa Johnson 
967ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
968ef27db87SMehdi Amini /// module level metadata.
969ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
970ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
971ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
972ef27db87SMehdi Amini 
97319ef4fadSMehdi Amini   // Record the entry position so that we can jump back here and efficiently
97419ef4fadSMehdi Amini   // skip the whole block in case we lazy-load.
97519ef4fadSMehdi Amini   auto EntryPos = Stream.GetCurrentBitNo();
97619ef4fadSMehdi Amini 
9770e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9780e828958SJF Bastien     return Err;
979ef27db87SMehdi Amini 
980ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
981ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
9829f926f70SMehdi Amini 
98319ef4fadSMehdi Amini   // We lazy-load module-level metadata: we build an index for each record, and
98419ef4fadSMehdi Amini   // then load individual record as needed, starting with the named metadata.
98519ef4fadSMehdi Amini   if (ModuleLevel && IsImporting && MetadataList.empty() &&
98619ef4fadSMehdi Amini       !DisableLazyLoading) {
98742ef1990SMehdi Amini     auto SuccessOrErr = lazyLoadModuleMetadataBlock();
98819ef4fadSMehdi Amini     if (!SuccessOrErr)
98919ef4fadSMehdi Amini       return SuccessOrErr.takeError();
99019ef4fadSMehdi Amini     if (SuccessOrErr.get()) {
99119ef4fadSMehdi Amini       // An index was successfully created and we will be able to load metadata
99219ef4fadSMehdi Amini       // on-demand.
99319ef4fadSMehdi Amini       MetadataList.resize(MDStringRef.size() +
99419ef4fadSMehdi Amini                           GlobalMetadataBitPosIndex.size());
99519ef4fadSMehdi Amini 
996c27ab339STeresa Johnson       // Now that we have built the index, load the global decl attachments
997c27ab339STeresa Johnson       // that were deferred during that process. This avoids creating
998c27ab339STeresa Johnson       // temporaries.
999c27ab339STeresa Johnson       SuccessOrErr = loadGlobalDeclAttachments();
1000c27ab339STeresa Johnson       if (!SuccessOrErr)
1001c27ab339STeresa Johnson         return SuccessOrErr.takeError();
1002c27ab339STeresa Johnson       assert(SuccessOrErr.get());
1003c27ab339STeresa Johnson 
100419ef4fadSMehdi Amini       // Reading the named metadata created forward references and/or
100519ef4fadSMehdi Amini       // placeholders, that we flush here.
100619ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
1007e37d3144SAdrian Prantl       upgradeDebugInfo();
100819ef4fadSMehdi Amini       // Return at the beginning of the block, since it is easy to skip it
100919ef4fadSMehdi Amini       // entirely from there.
101019ef4fadSMehdi Amini       Stream.ReadBlockEnd(); // Pop the abbrev block context.
10110e828958SJF Bastien       if (Error Err = IndexCursor.JumpToBit(EntryPos))
10120e828958SJF Bastien         return Err;
10130e828958SJF Bastien       if (Error Err = Stream.SkipBlock()) {
10140e828958SJF Bastien         // FIXME this drops the error on the floor, which
10150e828958SJF Bastien         // ThinLTO/X86/debuginfo-cu-import.ll relies on.
10160e828958SJF Bastien         consumeError(std::move(Err));
10170e828958SJF Bastien         return Error::success();
10180e828958SJF Bastien       }
101919ef4fadSMehdi Amini       return Error::success();
102019ef4fadSMehdi Amini     }
102119ef4fadSMehdi Amini     // Couldn't load an index, fallback to loading all the block "old-style".
102219ef4fadSMehdi Amini   }
102319ef4fadSMehdi Amini 
102419ef4fadSMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
102519ef4fadSMehdi Amini 
10269f926f70SMehdi Amini   // Read all the records.
10279f926f70SMehdi Amini   while (true) {
1028b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
1029b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1030b12a864cSDuncan P. N. Exon Smith       return E;
10319f926f70SMehdi Amini 
10329f926f70SMehdi Amini     switch (Entry.Kind) {
10339f926f70SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
10349f926f70SMehdi Amini     case BitstreamEntry::Error:
10359f926f70SMehdi Amini       return error("Malformed block");
10369f926f70SMehdi Amini     case BitstreamEntry::EndBlock:
103719ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
1038e37d3144SAdrian Prantl       upgradeDebugInfo();
10399f926f70SMehdi Amini       return Error::success();
10409f926f70SMehdi Amini     case BitstreamEntry::Record:
10419f926f70SMehdi Amini       // The interesting case.
10429f926f70SMehdi Amini       break;
10439f926f70SMehdi Amini     }
10449f926f70SMehdi Amini 
10459f926f70SMehdi Amini     // Read a record.
10469f926f70SMehdi Amini     Record.clear();
10479f926f70SMehdi Amini     StringRef Blob;
104819ef4fadSMehdi Amini     ++NumMDRecordLoaded;
10490e828958SJF Bastien     if (Expected<unsigned> MaybeCode =
10500e828958SJF Bastien             Stream.readRecord(Entry.ID, Record, &Blob)) {
10510e828958SJF Bastien       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
10520e828958SJF Bastien                                        Blob, NextMetadataNo))
10539f926f70SMehdi Amini         return Err;
10540e828958SJF Bastien     } else
10550e828958SJF Bastien       return MaybeCode.takeError();
10569f926f70SMehdi Amini   }
10579f926f70SMehdi Amini }
10589f926f70SMehdi Amini 
105919ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
106019ef4fadSMehdi Amini   ++NumMDStringLoaded;
106119ef4fadSMehdi Amini   if (Metadata *MD = MetadataList.lookup(ID))
106219ef4fadSMehdi Amini     return cast<MDString>(MD);
106319ef4fadSMehdi Amini   auto MDS = MDString::get(Context, MDStringRef[ID]);
106419ef4fadSMehdi Amini   MetadataList.assignValue(MDS, ID);
106519ef4fadSMehdi Amini   return MDS;
106619ef4fadSMehdi Amini }
106719ef4fadSMehdi Amini 
106819ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
106919ef4fadSMehdi Amini     unsigned ID, PlaceholderQueue &Placeholders) {
107019ef4fadSMehdi Amini   assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
107119ef4fadSMehdi Amini   assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
107219ef4fadSMehdi Amini   // Lookup first if the metadata hasn't already been loaded.
107319ef4fadSMehdi Amini   if (auto *MD = MetadataList.lookup(ID)) {
107487399997SSimon Pilgrim     auto *N = cast<MDNode>(MD);
107567d2cc1fSMehdi Amini     if (!N->isTemporary())
107667d2cc1fSMehdi Amini       return;
107719ef4fadSMehdi Amini   }
107819ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
107919ef4fadSMehdi Amini   StringRef Blob;
10800e828958SJF Bastien   if (Error Err = IndexCursor.JumpToBit(
10810e828958SJF Bastien           GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
10820e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed jumping: " +
108321661607SSimon Pilgrim                        Twine(toString(std::move(Err))));
1084b12a864cSDuncan P. N. Exon Smith   BitstreamEntry Entry;
1085b12a864cSDuncan P. N. Exon Smith   if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
10860e828958SJF Bastien     // FIXME this drops the error on the floor.
10870e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
1088b12a864cSDuncan P. N. Exon Smith                        Twine(toString(std::move(E))));
108919ef4fadSMehdi Amini   ++NumMDRecordLoaded;
10900e828958SJF Bastien   if (Expected<unsigned> MaybeCode =
10910e828958SJF Bastien           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10920e828958SJF Bastien     if (Error Err =
10930e828958SJF Bastien             parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10940e828958SJF Bastien       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
109521661607SSimon Pilgrim                          Twine(toString(std::move(Err))));
10960e828958SJF Bastien   } else
109721661607SSimon Pilgrim     report_fatal_error("Can't lazyload MD: " +
109821661607SSimon Pilgrim                        Twine(toString(MaybeCode.takeError())));
109919ef4fadSMehdi Amini }
110019ef4fadSMehdi Amini 
110119ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
110219ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
110319ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
110419ef4fadSMehdi Amini     PlaceholderQueue &Placeholders) {
110519ef4fadSMehdi Amini   DenseSet<unsigned> Temporaries;
110619ef4fadSMehdi Amini   while (1) {
110719ef4fadSMehdi Amini     // Populate Temporaries with the placeholders that haven't been loaded yet.
110819ef4fadSMehdi Amini     Placeholders.getTemporaries(MetadataList, Temporaries);
110919ef4fadSMehdi Amini 
111019ef4fadSMehdi Amini     // If we don't have any temporary, or FwdReference, we're done!
111119ef4fadSMehdi Amini     if (Temporaries.empty() && !MetadataList.hasFwdRefs())
111219ef4fadSMehdi Amini       break;
111319ef4fadSMehdi Amini 
111419ef4fadSMehdi Amini     // First, load all the temporaries. This can add new placeholders or
111519ef4fadSMehdi Amini     // forward references.
111619ef4fadSMehdi Amini     for (auto ID : Temporaries)
111719ef4fadSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
111819ef4fadSMehdi Amini     Temporaries.clear();
111919ef4fadSMehdi Amini 
112019ef4fadSMehdi Amini     // Second, load the forward-references. This can also add new placeholders
112119ef4fadSMehdi Amini     // or forward references.
112219ef4fadSMehdi Amini     while (MetadataList.hasFwdRefs())
112319ef4fadSMehdi Amini       lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
112419ef4fadSMehdi Amini   }
112519ef4fadSMehdi Amini   // At this point we don't have any forward reference remaining, or temporary
112619ef4fadSMehdi Amini   // that haven't been loaded. We can safely drop RAUW support and mark cycles
112719ef4fadSMehdi Amini   // as resolved.
112819ef4fadSMehdi Amini   MetadataList.tryToResolveCycles();
112919ef4fadSMehdi Amini 
113019ef4fadSMehdi Amini   // Finally, everything is in place, we can replace the placeholders operands
113119ef4fadSMehdi Amini   // with the final node they refer to.
113219ef4fadSMehdi Amini   Placeholders.flush(MetadataList);
113319ef4fadSMehdi Amini }
113419ef4fadSMehdi Amini 
11359f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
11369f926f70SMehdi Amini     SmallVectorImpl<uint64_t> &Record, unsigned Code,
113719ef4fadSMehdi Amini     PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
11389f926f70SMehdi Amini 
11399f926f70SMehdi Amini   bool IsDistinct = false;
1140ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
114119ef4fadSMehdi Amini     if (ID < MDStringRef.size())
114219ef4fadSMehdi Amini       return lazyLoadOneMDString(ID);
114367d2cc1fSMehdi Amini     if (!IsDistinct) {
114467d2cc1fSMehdi Amini       if (auto *MD = MetadataList.lookup(ID))
114567d2cc1fSMehdi Amini         return MD;
114667d2cc1fSMehdi Amini       // If lazy-loading is enabled, we try recursively to load the operand
114767d2cc1fSMehdi Amini       // instead of creating a temporary.
114867d2cc1fSMehdi Amini       if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
114967d2cc1fSMehdi Amini         // Create a temporary for the node that is referencing the operand we
115067d2cc1fSMehdi Amini         // will lazy-load. It is needed before recursing in case there are
115167d2cc1fSMehdi Amini         // uniquing cycles.
115267d2cc1fSMehdi Amini         MetadataList.getMetadataFwdRef(NextMetadataNo);
115367d2cc1fSMehdi Amini         lazyLoadOneMetadata(ID, Placeholders);
115467d2cc1fSMehdi Amini         return MetadataList.lookup(ID);
115567d2cc1fSMehdi Amini       }
115667d2cc1fSMehdi Amini       // Return a temporary.
1157ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
115867d2cc1fSMehdi Amini     }
1159ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1160ef27db87SMehdi Amini       return MD;
1161ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
1162ef27db87SMehdi Amini   };
1163ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1164ef27db87SMehdi Amini     if (ID)
1165ef27db87SMehdi Amini       return getMD(ID - 1);
1166ef27db87SMehdi Amini     return nullptr;
1167ef27db87SMehdi Amini   };
1168ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1169ef27db87SMehdi Amini     if (ID)
1170ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
1171ef27db87SMehdi Amini     return nullptr;
1172ef27db87SMehdi Amini   };
1173ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
1174ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
1175ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
117619ef4fadSMehdi Amini     auto MDS = getMDOrNull(ID);
117719ef4fadSMehdi Amini     return cast_or_null<MDString>(MDS);
1178ef27db87SMehdi Amini   };
1179ef27db87SMehdi Amini 
1180ef27db87SMehdi Amini   // Support for old type refs.
1181ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
1182ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1183ef27db87SMehdi Amini   };
1184ef27db87SMehdi Amini 
1185ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
1186ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1187ef27db87SMehdi Amini 
1188ef27db87SMehdi Amini   switch (Code) {
1189ef27db87SMehdi Amini   default: // Default behavior: ignore.
1190ef27db87SMehdi Amini     break;
1191ef27db87SMehdi Amini   case bitc::METADATA_NAME: {
1192ef27db87SMehdi Amini     // Read name of the named metadata.
1193ef27db87SMehdi Amini     SmallString<8> Name(Record.begin(), Record.end());
1194ef27db87SMehdi Amini     Record.clear();
1195b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.ReadCode().moveInto(Code))
1196b12a864cSDuncan P. N. Exon Smith       return E;
1197ef27db87SMehdi Amini 
119819ef4fadSMehdi Amini     ++NumMDRecordLoaded;
11990e828958SJF Bastien     if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
12000e828958SJF Bastien       if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1201ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
12020e828958SJF Bastien     } else
12030e828958SJF Bastien       return MaybeNextBitCode.takeError();
1204ef27db87SMehdi Amini 
1205ef27db87SMehdi Amini     // Read named metadata elements.
1206ef27db87SMehdi Amini     unsigned Size = Record.size();
1207ef27db87SMehdi Amini     NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1208ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; ++i) {
1209ef27db87SMehdi Amini       MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1210ef27db87SMehdi Amini       if (!MD)
1211f3d2453dSTeresa Johnson         return error("Invalid named metadata: expect fwd ref to MDNode");
1212ef27db87SMehdi Amini       NMD->addOperand(MD);
1213ef27db87SMehdi Amini     }
1214ef27db87SMehdi Amini     break;
1215ef27db87SMehdi Amini   }
1216ef27db87SMehdi Amini   case bitc::METADATA_OLD_FN_NODE: {
12174abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1218ef27db87SMehdi Amini     // This is a LocalAsMetadata record, the only type of function-local
1219ef27db87SMehdi Amini     // metadata.
1220ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1221ef27db87SMehdi Amini       return error("Invalid record");
1222ef27db87SMehdi Amini 
1223ef27db87SMehdi Amini     // If this isn't a LocalAsMetadata record, we're dropping it.  This used
1224ef27db87SMehdi Amini     // to be legal, but there's no upgrade path.
1225ef27db87SMehdi Amini     auto dropRecord = [&] {
1226c05c9db3SIvan Krasin       MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1227c05c9db3SIvan Krasin       NextMetadataNo++;
1228ef27db87SMehdi Amini     };
1229ef27db87SMehdi Amini     if (Record.size() != 2) {
1230ef27db87SMehdi Amini       dropRecord();
1231ef27db87SMehdi Amini       break;
1232ef27db87SMehdi Amini     }
1233ef27db87SMehdi Amini 
1234ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1235ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1236ef27db87SMehdi Amini       dropRecord();
1237ef27db87SMehdi Amini       break;
1238ef27db87SMehdi Amini     }
1239ef27db87SMehdi Amini 
1240ef27db87SMehdi Amini     MetadataList.assignValue(
1241ef27db87SMehdi Amini         LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1242c05c9db3SIvan Krasin         NextMetadataNo);
1243c05c9db3SIvan Krasin     NextMetadataNo++;
1244ef27db87SMehdi Amini     break;
1245ef27db87SMehdi Amini   }
1246ef27db87SMehdi Amini   case bitc::METADATA_OLD_NODE: {
12474abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1248ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1249ef27db87SMehdi Amini       return error("Invalid record");
1250ef27db87SMehdi Amini 
1251ef27db87SMehdi Amini     unsigned Size = Record.size();
1252ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1253ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; i += 2) {
1254ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[i]);
1255ef27db87SMehdi Amini       if (!Ty)
1256ef27db87SMehdi Amini         return error("Invalid record");
1257ef27db87SMehdi Amini       if (Ty->isMetadataTy())
1258ef27db87SMehdi Amini         Elts.push_back(getMD(Record[i + 1]));
1259ef27db87SMehdi Amini       else if (!Ty->isVoidTy()) {
1260ef27db87SMehdi Amini         auto *MD =
1261ef27db87SMehdi Amini             ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1262ef27db87SMehdi Amini         assert(isa<ConstantAsMetadata>(MD) &&
1263ef27db87SMehdi Amini                "Expected non-function-local metadata");
1264ef27db87SMehdi Amini         Elts.push_back(MD);
1265ef27db87SMehdi Amini       } else
1266ef27db87SMehdi Amini         Elts.push_back(nullptr);
1267ef27db87SMehdi Amini     }
1268c05c9db3SIvan Krasin     MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1269c05c9db3SIvan Krasin     NextMetadataNo++;
1270ef27db87SMehdi Amini     break;
1271ef27db87SMehdi Amini   }
1272ef27db87SMehdi Amini   case bitc::METADATA_VALUE: {
1273ef27db87SMehdi Amini     if (Record.size() != 2)
1274ef27db87SMehdi Amini       return error("Invalid record");
1275ef27db87SMehdi Amini 
1276ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1277ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy())
1278ef27db87SMehdi Amini       return error("Invalid record");
1279ef27db87SMehdi Amini 
1280ef27db87SMehdi Amini     MetadataList.assignValue(
1281ef27db87SMehdi Amini         ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1282c05c9db3SIvan Krasin         NextMetadataNo);
1283c05c9db3SIvan Krasin     NextMetadataNo++;
1284ef27db87SMehdi Amini     break;
1285ef27db87SMehdi Amini   }
1286ef27db87SMehdi Amini   case bitc::METADATA_DISTINCT_NODE:
1287ef27db87SMehdi Amini     IsDistinct = true;
1288ef27db87SMehdi Amini     LLVM_FALLTHROUGH;
1289ef27db87SMehdi Amini   case bitc::METADATA_NODE: {
1290ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1291ef27db87SMehdi Amini     Elts.reserve(Record.size());
1292ef27db87SMehdi Amini     for (unsigned ID : Record)
1293ef27db87SMehdi Amini       Elts.push_back(getMDOrNull(ID));
1294ef27db87SMehdi Amini     MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1295ef27db87SMehdi Amini                                         : MDNode::get(Context, Elts),
1296c05c9db3SIvan Krasin                              NextMetadataNo);
1297c05c9db3SIvan Krasin     NextMetadataNo++;
1298ef27db87SMehdi Amini     break;
1299ef27db87SMehdi Amini   }
1300ef27db87SMehdi Amini   case bitc::METADATA_LOCATION: {
1301386ad01cSVedant Kumar     if (Record.size() != 5 && Record.size() != 6)
1302ef27db87SMehdi Amini       return error("Invalid record");
1303ef27db87SMehdi Amini 
1304ef27db87SMehdi Amini     IsDistinct = Record[0];
1305ef27db87SMehdi Amini     unsigned Line = Record[1];
1306ef27db87SMehdi Amini     unsigned Column = Record[2];
1307ef27db87SMehdi Amini     Metadata *Scope = getMD(Record[3]);
1308ef27db87SMehdi Amini     Metadata *InlinedAt = getMDOrNull(Record[4]);
1309386ad01cSVedant Kumar     bool ImplicitCode = Record.size() == 6 && Record[5];
1310ef27db87SMehdi Amini     MetadataList.assignValue(
1311eb7f6020SCalixte Denizet         GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1312eb7f6020SCalixte Denizet                                      ImplicitCode)),
1313c05c9db3SIvan Krasin         NextMetadataNo);
1314c05c9db3SIvan Krasin     NextMetadataNo++;
1315ef27db87SMehdi Amini     break;
1316ef27db87SMehdi Amini   }
1317ef27db87SMehdi Amini   case bitc::METADATA_GENERIC_DEBUG: {
1318ef27db87SMehdi Amini     if (Record.size() < 4)
1319ef27db87SMehdi Amini       return error("Invalid record");
1320ef27db87SMehdi Amini 
1321ef27db87SMehdi Amini     IsDistinct = Record[0];
1322ef27db87SMehdi Amini     unsigned Tag = Record[1];
1323ef27db87SMehdi Amini     unsigned Version = Record[2];
1324ef27db87SMehdi Amini 
1325ef27db87SMehdi Amini     if (Tag >= 1u << 16 || Version != 0)
1326ef27db87SMehdi Amini       return error("Invalid record");
1327ef27db87SMehdi Amini 
1328ef27db87SMehdi Amini     auto *Header = getMDString(Record[3]);
1329ef27db87SMehdi Amini     SmallVector<Metadata *, 8> DwarfOps;
1330ef27db87SMehdi Amini     for (unsigned I = 4, E = Record.size(); I != E; ++I)
1331ef27db87SMehdi Amini       DwarfOps.push_back(getMDOrNull(Record[I]));
1332ef27db87SMehdi Amini     MetadataList.assignValue(
1333ef27db87SMehdi Amini         GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1334c05c9db3SIvan Krasin         NextMetadataNo);
1335c05c9db3SIvan Krasin     NextMetadataNo++;
1336ef27db87SMehdi Amini     break;
1337ef27db87SMehdi Amini   }
1338ef27db87SMehdi Amini   case bitc::METADATA_SUBRANGE: {
1339fdf40917SSander de Smalen     Metadata *Val = nullptr;
1340fdf40917SSander de Smalen     // Operand 'count' is interpreted as:
1341fdf40917SSander de Smalen     // - Signed integer (version 0)
1342fdf40917SSander de Smalen     // - Metadata node  (version 1)
1343d20bf5a7SAlok Kumar Sharma     // Operand 'lowerBound' is interpreted as:
1344d20bf5a7SAlok Kumar Sharma     // - Signed integer (version 0 and 1)
1345d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1346d20bf5a7SAlok Kumar Sharma     // Operands 'upperBound' and 'stride' are interpreted as:
1347d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1348fdf40917SSander de Smalen     switch (Record[0] >> 1) {
1349fdf40917SSander de Smalen     case 0:
1350fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange,
1351d20bf5a7SAlok Kumar Sharma                             (Context, Record[1], unrotateSign(Record[2])));
1352fdf40917SSander de Smalen       break;
1353fdf40917SSander de Smalen     case 1:
1354fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1355d20bf5a7SAlok Kumar Sharma                                          unrotateSign(Record[2])));
1356d20bf5a7SAlok Kumar Sharma       break;
1357d20bf5a7SAlok Kumar Sharma     case 2:
1358d20bf5a7SAlok Kumar Sharma       Val = GET_OR_DISTINCT(
1359d20bf5a7SAlok Kumar Sharma           DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1360d20bf5a7SAlok Kumar Sharma                        getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1361fdf40917SSander de Smalen       break;
1362fdf40917SSander de Smalen     default:
1363fdf40917SSander de Smalen       return error("Invalid record: Unsupported version of DISubrange");
1364fdf40917SSander de Smalen     }
1365ef27db87SMehdi Amini 
1366fdf40917SSander de Smalen     MetadataList.assignValue(Val, NextMetadataNo);
1367fdf40917SSander de Smalen     IsDistinct = Record[0] & 1;
1368c05c9db3SIvan Krasin     NextMetadataNo++;
1369ef27db87SMehdi Amini     break;
1370ef27db87SMehdi Amini   }
1371a6dd01afSAlok Kumar Sharma   case bitc::METADATA_GENERIC_SUBRANGE: {
1372a6dd01afSAlok Kumar Sharma     Metadata *Val = nullptr;
1373a6dd01afSAlok Kumar Sharma     Val = GET_OR_DISTINCT(DIGenericSubrange,
1374a6dd01afSAlok Kumar Sharma                           (Context, getMDOrNull(Record[1]),
1375a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1376a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[4])));
1377a6dd01afSAlok Kumar Sharma 
1378a6dd01afSAlok Kumar Sharma     MetadataList.assignValue(Val, NextMetadataNo);
1379a6dd01afSAlok Kumar Sharma     IsDistinct = Record[0] & 1;
1380a6dd01afSAlok Kumar Sharma     NextMetadataNo++;
1381a6dd01afSAlok Kumar Sharma     break;
1382a6dd01afSAlok Kumar Sharma   }
1383ef27db87SMehdi Amini   case bitc::METADATA_ENUMERATOR: {
1384aad3d578SLemonBoy     if (Record.size() < 3)
1385ef27db87SMehdi Amini       return error("Invalid record");
1386ef27db87SMehdi Amini 
138708dc66efSMomchil Velikov     IsDistinct = Record[0] & 1;
138808dc66efSMomchil Velikov     bool IsUnsigned = Record[0] & 2;
1389aad3d578SLemonBoy     bool IsBigInt = Record[0] & 4;
1390aad3d578SLemonBoy     APInt Value;
1391aad3d578SLemonBoy 
1392aad3d578SLemonBoy     if (IsBigInt) {
1393aad3d578SLemonBoy       const uint64_t BitWidth = Record[1];
1394aad3d578SLemonBoy       const size_t NumWords = Record.size() - 3;
1395aad3d578SLemonBoy       Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1396aad3d578SLemonBoy     } else
1397aad3d578SLemonBoy       Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1398aad3d578SLemonBoy 
1399ef27db87SMehdi Amini     MetadataList.assignValue(
1400aad3d578SLemonBoy         GET_OR_DISTINCT(DIEnumerator,
1401aad3d578SLemonBoy                         (Context, Value, IsUnsigned, getMDString(Record[2]))),
1402c05c9db3SIvan Krasin         NextMetadataNo);
1403c05c9db3SIvan Krasin     NextMetadataNo++;
1404ef27db87SMehdi Amini     break;
1405ef27db87SMehdi Amini   }
1406ef27db87SMehdi Amini   case bitc::METADATA_BASIC_TYPE: {
140755f42629SAdrian Prantl     if (Record.size() < 6 || Record.size() > 7)
1408ef27db87SMehdi Amini       return error("Invalid record");
1409ef27db87SMehdi Amini 
1410ef27db87SMehdi Amini     IsDistinct = Record[0];
141155f42629SAdrian Prantl     DINode::DIFlags Flags = (Record.size() > 6) ?
141255f42629SAdrian Prantl                     static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero;
141355f42629SAdrian Prantl 
1414ef27db87SMehdi Amini     MetadataList.assignValue(
1415ef27db87SMehdi Amini         GET_OR_DISTINCT(DIBasicType,
14169f926f70SMehdi Amini                         (Context, Record[1], getMDString(Record[2]), Record[3],
141755f42629SAdrian Prantl                          Record[4], Record[5], Flags)),
1418c05c9db3SIvan Krasin         NextMetadataNo);
1419c05c9db3SIvan Krasin     NextMetadataNo++;
1420ef27db87SMehdi Amini     break;
1421ef27db87SMehdi Amini   }
1422f91d18eaSSourabh Singh Tomar   case bitc::METADATA_STRING_TYPE: {
1423f91d18eaSSourabh Singh Tomar     if (Record.size() != 8)
1424f91d18eaSSourabh Singh Tomar       return error("Invalid record");
1425f91d18eaSSourabh Singh Tomar 
1426f91d18eaSSourabh Singh Tomar     IsDistinct = Record[0];
1427f91d18eaSSourabh Singh Tomar     MetadataList.assignValue(
1428f91d18eaSSourabh Singh Tomar         GET_OR_DISTINCT(DIStringType,
1429f91d18eaSSourabh Singh Tomar                         (Context, Record[1], getMDString(Record[2]),
1430f91d18eaSSourabh Singh Tomar                          getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1431f91d18eaSSourabh Singh Tomar                          Record[5], Record[6], Record[7])),
1432f91d18eaSSourabh Singh Tomar         NextMetadataNo);
1433f91d18eaSSourabh Singh Tomar     NextMetadataNo++;
1434f91d18eaSSourabh Singh Tomar     break;
1435f91d18eaSSourabh Singh Tomar   }
1436ef27db87SMehdi Amini   case bitc::METADATA_DERIVED_TYPE: {
1437430e2238SYonghong Song     if (Record.size() < 12 || Record.size() > 14)
1438ef27db87SMehdi Amini       return error("Invalid record");
1439ef27db87SMehdi Amini 
1440d5561e0aSKonstantin Zhuravlyov     // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1441d5561e0aSKonstantin Zhuravlyov     // that there is no DWARF address space associated with DIDerivedType.
1442d5561e0aSKonstantin Zhuravlyov     Optional<unsigned> DWARFAddressSpace;
1443d5561e0aSKonstantin Zhuravlyov     if (Record.size() > 12 && Record[12])
1444d5561e0aSKonstantin Zhuravlyov       DWARFAddressSpace = Record[12] - 1;
1445d5561e0aSKonstantin Zhuravlyov 
1446430e2238SYonghong Song     Metadata *Annotations = nullptr;
1447430e2238SYonghong Song     if (Record.size() > 13 && Record[13])
1448430e2238SYonghong Song       Annotations = getMDOrNull(Record[13]);
1449430e2238SYonghong Song 
1450ef27db87SMehdi Amini     IsDistinct = Record[0];
1451ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1452ef27db87SMehdi Amini     MetadataList.assignValue(
1453ef27db87SMehdi Amini         GET_OR_DISTINCT(DIDerivedType,
1454ef27db87SMehdi Amini                         (Context, Record[1], getMDString(Record[2]),
1455ef27db87SMehdi Amini                          getMDOrNull(Record[3]), Record[4],
1456ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5]),
1457ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1458d5561e0aSKonstantin Zhuravlyov                          Record[9], DWARFAddressSpace, Flags,
1459430e2238SYonghong Song                          getDITypeRefOrNull(Record[11]), Annotations)),
1460c05c9db3SIvan Krasin         NextMetadataNo);
1461c05c9db3SIvan Krasin     NextMetadataNo++;
1462ef27db87SMehdi Amini     break;
1463ef27db87SMehdi Amini   }
1464ef27db87SMehdi Amini   case bitc::METADATA_COMPOSITE_TYPE: {
14650b32dca1SYonghong Song     if (Record.size() < 16 || Record.size() > 22)
1466ef27db87SMehdi Amini       return error("Invalid record");
1467ef27db87SMehdi Amini 
1468ef27db87SMehdi Amini     // If we have a UUID and this is not a forward declaration, lookup the
1469ef27db87SMehdi Amini     // mapping.
1470ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1471ef27db87SMehdi Amini     bool IsNotUsedInTypeRef = Record[0] >= 2;
1472ef27db87SMehdi Amini     unsigned Tag = Record[1];
1473ef27db87SMehdi Amini     MDString *Name = getMDString(Record[2]);
1474ef27db87SMehdi Amini     Metadata *File = getMDOrNull(Record[3]);
1475ef27db87SMehdi Amini     unsigned Line = Record[4];
1476ef27db87SMehdi Amini     Metadata *Scope = getDITypeRefOrNull(Record[5]);
1477a61f5e37STeresa Johnson     Metadata *BaseType = nullptr;
1478ef27db87SMehdi Amini     uint64_t SizeInBits = Record[7];
1479ef27db87SMehdi Amini     if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1480ef27db87SMehdi Amini       return error("Alignment value is too large");
1481ef27db87SMehdi Amini     uint32_t AlignInBits = Record[8];
1482a61f5e37STeresa Johnson     uint64_t OffsetInBits = 0;
1483ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1484a61f5e37STeresa Johnson     Metadata *Elements = nullptr;
1485ef27db87SMehdi Amini     unsigned RuntimeLang = Record[12];
1486a61f5e37STeresa Johnson     Metadata *VTableHolder = nullptr;
1487a61f5e37STeresa Johnson     Metadata *TemplateParams = nullptr;
14888c59921cSAdrian Prantl     Metadata *Discriminator = nullptr;
14894042ada1SAlok Kumar Sharma     Metadata *DataLocation = nullptr;
14902d10258aSAlok Kumar Sharma     Metadata *Associated = nullptr;
14912d10258aSAlok Kumar Sharma     Metadata *Allocated = nullptr;
149296bd4d34SAlok Kumar Sharma     Metadata *Rank = nullptr;
14930b32dca1SYonghong Song     Metadata *Annotations = nullptr;
1494ef27db87SMehdi Amini     auto *Identifier = getMDString(Record[15]);
1495a61f5e37STeresa Johnson     // If this module is being parsed so that it can be ThinLTO imported
1496a61f5e37STeresa Johnson     // into another module, composite types only need to be imported
1497a61f5e37STeresa Johnson     // as type declarations (unless full type definitions requested).
1498a61f5e37STeresa Johnson     // Create type declarations up front to save memory. Also, buildODRType
1499a61f5e37STeresa Johnson     // handles the case where this is type ODRed with a definition needed
1500a61f5e37STeresa Johnson     // by the importing module, in which case the existing definition is
1501a61f5e37STeresa Johnson     // used.
15025a8dba5bSTeresa Johnson     if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1503a61f5e37STeresa Johnson         (Tag == dwarf::DW_TAG_enumeration_type ||
1504a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_class_type ||
1505a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_structure_type ||
1506a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_union_type)) {
1507a61f5e37STeresa Johnson       Flags = Flags | DINode::FlagFwdDecl;
1508a61f5e37STeresa Johnson     } else {
1509a61f5e37STeresa Johnson       BaseType = getDITypeRefOrNull(Record[6]);
1510a61f5e37STeresa Johnson       OffsetInBits = Record[9];
1511a61f5e37STeresa Johnson       Elements = getMDOrNull(Record[11]);
1512a61f5e37STeresa Johnson       VTableHolder = getDITypeRefOrNull(Record[13]);
1513a61f5e37STeresa Johnson       TemplateParams = getMDOrNull(Record[14]);
15148c59921cSAdrian Prantl       if (Record.size() > 16)
15158c59921cSAdrian Prantl         Discriminator = getMDOrNull(Record[16]);
15164042ada1SAlok Kumar Sharma       if (Record.size() > 17)
15174042ada1SAlok Kumar Sharma         DataLocation = getMDOrNull(Record[17]);
15182d10258aSAlok Kumar Sharma       if (Record.size() > 19) {
15192d10258aSAlok Kumar Sharma         Associated = getMDOrNull(Record[18]);
15202d10258aSAlok Kumar Sharma         Allocated = getMDOrNull(Record[19]);
15212d10258aSAlok Kumar Sharma       }
152296bd4d34SAlok Kumar Sharma       if (Record.size() > 20) {
152396bd4d34SAlok Kumar Sharma         Rank = getMDOrNull(Record[20]);
152496bd4d34SAlok Kumar Sharma       }
15250b32dca1SYonghong Song       if (Record.size() > 21) {
15260b32dca1SYonghong Song         Annotations = getMDOrNull(Record[21]);
15270b32dca1SYonghong Song       }
1528a61f5e37STeresa Johnson     }
1529ef27db87SMehdi Amini     DICompositeType *CT = nullptr;
1530ef27db87SMehdi Amini     if (Identifier)
1531ef27db87SMehdi Amini       CT = DICompositeType::buildODRType(
1532ef27db87SMehdi Amini           Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1533ef27db87SMehdi Amini           SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
15342d10258aSAlok Kumar Sharma           VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
15350b32dca1SYonghong Song           Allocated, Rank, Annotations);
1536ef27db87SMehdi Amini 
1537ef27db87SMehdi Amini     // Create a node if we didn't get a lazy ODR type.
1538ef27db87SMehdi Amini     if (!CT)
1539ef27db87SMehdi Amini       CT = GET_OR_DISTINCT(DICompositeType,
1540ef27db87SMehdi Amini                            (Context, Tag, Name, File, Line, Scope, BaseType,
1541ef27db87SMehdi Amini                             SizeInBits, AlignInBits, OffsetInBits, Flags,
15429f926f70SMehdi Amini                             Elements, RuntimeLang, VTableHolder, TemplateParams,
15432d10258aSAlok Kumar Sharma                             Identifier, Discriminator, DataLocation, Associated,
15440b32dca1SYonghong Song                             Allocated, Rank, Annotations));
1545ef27db87SMehdi Amini     if (!IsNotUsedInTypeRef && Identifier)
1546ef27db87SMehdi Amini       MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1547ef27db87SMehdi Amini 
1548c05c9db3SIvan Krasin     MetadataList.assignValue(CT, NextMetadataNo);
1549c05c9db3SIvan Krasin     NextMetadataNo++;
1550ef27db87SMehdi Amini     break;
1551ef27db87SMehdi Amini   }
1552ef27db87SMehdi Amini   case bitc::METADATA_SUBROUTINE_TYPE: {
1553ef27db87SMehdi Amini     if (Record.size() < 3 || Record.size() > 4)
1554ef27db87SMehdi Amini       return error("Invalid record");
1555ef27db87SMehdi Amini     bool IsOldTypeRefArray = Record[0] < 2;
1556ef27db87SMehdi Amini     unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1557ef27db87SMehdi Amini 
1558ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1559ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1560ef27db87SMehdi Amini     Metadata *Types = getMDOrNull(Record[2]);
1561ef27db87SMehdi Amini     if (LLVM_UNLIKELY(IsOldTypeRefArray))
1562ef27db87SMehdi Amini       Types = MetadataList.upgradeTypeRefArray(Types);
1563ef27db87SMehdi Amini 
1564ef27db87SMehdi Amini     MetadataList.assignValue(
1565ef27db87SMehdi Amini         GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1566c05c9db3SIvan Krasin         NextMetadataNo);
1567c05c9db3SIvan Krasin     NextMetadataNo++;
1568ef27db87SMehdi Amini     break;
1569ef27db87SMehdi Amini   }
1570ef27db87SMehdi Amini 
1571ef27db87SMehdi Amini   case bitc::METADATA_MODULE: {
15725f75dcf5SChih-Ping Chen     if (Record.size() < 5 || Record.size() > 9)
1573ef27db87SMehdi Amini       return error("Invalid record");
1574ef27db87SMehdi Amini 
15755f75dcf5SChih-Ping Chen     unsigned Offset = Record.size() >= 8 ? 2 : 1;
1576ef27db87SMehdi Amini     IsDistinct = Record[0];
1577ef27db87SMehdi Amini     MetadataList.assignValue(
1578e59744fdSSourabh Singh Tomar         GET_OR_DISTINCT(
1579e59744fdSSourabh Singh Tomar             DIModule,
15805f75dcf5SChih-Ping Chen             (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
1581e59744fdSSourabh Singh Tomar              getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1582e59744fdSSourabh Singh Tomar              getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1583e59744fdSSourabh Singh Tomar              getMDString(Record[4 + Offset]),
15845f75dcf5SChih-Ping Chen              Record.size() <= 7 ? 0 : Record[7],
15855f75dcf5SChih-Ping Chen              Record.size() <= 8 ? false : Record[8])),
1586c05c9db3SIvan Krasin         NextMetadataNo);
1587c05c9db3SIvan Krasin     NextMetadataNo++;
1588ef27db87SMehdi Amini     break;
1589ef27db87SMehdi Amini   }
1590ef27db87SMehdi Amini 
1591ef27db87SMehdi Amini   case bitc::METADATA_FILE: {
159216c7bdafSScott Linder     if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1593ef27db87SMehdi Amini       return error("Invalid record");
1594ef27db87SMehdi Amini 
1595ef27db87SMehdi Amini     IsDistinct = Record[0];
15967160384dSScott Linder     Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
15977160384dSScott Linder     // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
15987160384dSScott Linder     // is not present. This matches up with the old internal representation,
15997160384dSScott Linder     // and the old encoding for CSK_None in the ChecksumKind. The new
16007160384dSScott Linder     // representation reserves the value 0 in the ChecksumKind to continue to
16017160384dSScott Linder     // encode None in a backwards-compatible way.
160216c7bdafSScott Linder     if (Record.size() > 4 && Record[3] && Record[4])
16037160384dSScott Linder       Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
16047160384dSScott Linder                        getMDString(Record[4]));
1605ef27db87SMehdi Amini     MetadataList.assignValue(
16069f926f70SMehdi Amini         GET_OR_DISTINCT(
16077faeecc8SAmjad Aboud             DIFile,
160816c7bdafSScott Linder             (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
160916c7bdafSScott Linder              Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
161016c7bdafSScott Linder                                : None)),
1611c05c9db3SIvan Krasin         NextMetadataNo);
1612c05c9db3SIvan Krasin     NextMetadataNo++;
1613ef27db87SMehdi Amini     break;
1614ef27db87SMehdi Amini   }
1615ef27db87SMehdi Amini   case bitc::METADATA_COMPILE_UNIT: {
1616e4e7e447SAdrian Prantl     if (Record.size() < 14 || Record.size() > 22)
1617ef27db87SMehdi Amini       return error("Invalid record");
1618ef27db87SMehdi Amini 
1619ef27db87SMehdi Amini     // Ignore Record[0], which indicates whether this compile unit is
1620ef27db87SMehdi Amini     // distinct.  It's always distinct.
1621ef27db87SMehdi Amini     IsDistinct = true;
1622ef27db87SMehdi Amini     auto *CU = DICompileUnit::getDistinct(
1623ef27db87SMehdi Amini         Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1624ef27db87SMehdi Amini         Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1625ef27db87SMehdi Amini         Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1626ef27db87SMehdi Amini         getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1627ef27db87SMehdi Amini         Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1628ef27db87SMehdi Amini         Record.size() <= 14 ? 0 : Record[14],
16290944a8c2SDehao Chen         Record.size() <= 16 ? true : Record[16],
1630b52e2366SPeter Collingbourne         Record.size() <= 17 ? false : Record[17],
1631bb279116SDavid Blaikie         Record.size() <= 18 ? 0 : Record[18],
1632ab093bfeSDavid Blaikie         Record.size() <= 19 ? 0 : Record[19],
1633e4e7e447SAdrian Prantl         Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1634e4e7e447SAdrian Prantl         Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1635ef27db87SMehdi Amini 
1636c05c9db3SIvan Krasin     MetadataList.assignValue(CU, NextMetadataNo);
1637c05c9db3SIvan Krasin     NextMetadataNo++;
1638ef27db87SMehdi Amini 
1639ef27db87SMehdi Amini     // Move the Upgrade the list of subprograms.
1640ef27db87SMehdi Amini     if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1641ef27db87SMehdi Amini       CUSubprograms.push_back({CU, SPs});
1642ef27db87SMehdi Amini     break;
1643ef27db87SMehdi Amini   }
1644ef27db87SMehdi Amini   case bitc::METADATA_SUBPROGRAM: {
16451d12b885SAdrian Prantl     if (Record.size() < 18 || Record.size() > 21)
1646ef27db87SMehdi Amini       return error("Invalid record");
1647ef27db87SMehdi Amini 
1648adcdc1bdSPaul Robinson     bool HasSPFlags = Record[0] & 4;
164938a61873SPetar Jovanovic 
165038a61873SPetar Jovanovic     DINode::DIFlags Flags;
165138a61873SPetar Jovanovic     DISubprogram::DISPFlags SPFlags;
165238a61873SPetar Jovanovic     if (!HasSPFlags)
165338a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
165438a61873SPetar Jovanovic     else {
165538a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11]);
165638a61873SPetar Jovanovic       SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
165738a61873SPetar Jovanovic     }
165838a61873SPetar Jovanovic 
165938a61873SPetar Jovanovic     // Support for old metadata when
166038a61873SPetar Jovanovic     // subprogram specific flags are placed in DIFlags.
166138a61873SPetar Jovanovic     const unsigned DIFlagMainSubprogram = 1 << 21;
166238a61873SPetar Jovanovic     bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
166338a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag)
166438a61873SPetar Jovanovic       // Remove old DIFlagMainSubprogram from DIFlags.
166538a61873SPetar Jovanovic       // Note: This assumes that any future use of bit 21 defaults to it
166638a61873SPetar Jovanovic       // being 0.
166738a61873SPetar Jovanovic       Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
166838a61873SPetar Jovanovic 
166938a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag && HasSPFlags)
167038a61873SPetar Jovanovic       SPFlags |= DISubprogram::SPFlagMainSubprogram;
167138a61873SPetar Jovanovic     else if (!HasSPFlags)
167238a61873SPetar Jovanovic       SPFlags = DISubprogram::toSPFlags(
1673adcdc1bdSPaul Robinson                     /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
167438a61873SPetar Jovanovic                     /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
167538a61873SPetar Jovanovic                     /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag);
1676adcdc1bdSPaul Robinson 
1677adcdc1bdSPaul Robinson     // All definitions should be distinct.
1678adcdc1bdSPaul Robinson     IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1679ef27db87SMehdi Amini     // Version 1 has a Function as Record[15].
1680ef27db87SMehdi Amini     // Version 2 has removed Record[15].
1681ef27db87SMehdi Amini     // Version 3 has the Unit as Record[15].
1682ef27db87SMehdi Amini     // Version 4 added thisAdjustment.
1683adcdc1bdSPaul Robinson     // Version 5 repacked flags into DISPFlags, changing many element numbers.
1684adcdc1bdSPaul Robinson     bool HasUnit = Record[0] & 2;
1685adcdc1bdSPaul Robinson     if (!HasSPFlags && HasUnit && Record.size() < 19)
1686ef27db87SMehdi Amini       return error("Invalid record");
1687adcdc1bdSPaul Robinson     if (HasSPFlags && !HasUnit)
1688adcdc1bdSPaul Robinson       return error("Invalid record");
1689adcdc1bdSPaul Robinson     // Accommodate older formats.
1690adcdc1bdSPaul Robinson     bool HasFn = false;
1691adcdc1bdSPaul Robinson     bool HasThisAdj = true;
1692adcdc1bdSPaul Robinson     bool HasThrownTypes = true;
1693d383df32SYonghong Song     bool HasAnnotations = false;
1694adcdc1bdSPaul Robinson     unsigned OffsetA = 0;
1695adcdc1bdSPaul Robinson     unsigned OffsetB = 0;
1696adcdc1bdSPaul Robinson     if (!HasSPFlags) {
1697adcdc1bdSPaul Robinson       OffsetA = 2;
1698adcdc1bdSPaul Robinson       OffsetB = 2;
1699adcdc1bdSPaul Robinson       if (Record.size() >= 19) {
1700adcdc1bdSPaul Robinson         HasFn = !HasUnit;
1701adcdc1bdSPaul Robinson         OffsetB++;
1702adcdc1bdSPaul Robinson       }
1703adcdc1bdSPaul Robinson       HasThisAdj = Record.size() >= 20;
1704adcdc1bdSPaul Robinson       HasThrownTypes = Record.size() >= 21;
1705d383df32SYonghong Song     } else {
1706d383df32SYonghong Song       HasAnnotations = Record.size() >= 19;
1707adcdc1bdSPaul Robinson     }
1708adcdc1bdSPaul Robinson     Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1709ef27db87SMehdi Amini     DISubprogram *SP = GET_OR_DISTINCT(
17101d12b885SAdrian Prantl         DISubprogram,
17111d12b885SAdrian Prantl         (Context,
1712ef27db87SMehdi Amini          getDITypeRefOrNull(Record[1]),                     // scope
1713ef27db87SMehdi Amini          getMDString(Record[2]),                            // name
1714ef27db87SMehdi Amini          getMDString(Record[3]),                            // linkageName
1715ef27db87SMehdi Amini          getMDOrNull(Record[4]),                            // file
1716ef27db87SMehdi Amini          Record[5],                                         // line
1717ef27db87SMehdi Amini          getMDOrNull(Record[6]),                            // type
1718adcdc1bdSPaul Robinson          Record[7 + OffsetA],                               // scopeLine
1719adcdc1bdSPaul Robinson          getDITypeRefOrNull(Record[8 + OffsetA]),           // containingType
1720adcdc1bdSPaul Robinson          Record[10 + OffsetA],                              // virtualIndex
1721adcdc1bdSPaul Robinson          HasThisAdj ? Record[16 + OffsetB] : 0,             // thisAdjustment
172238a61873SPetar Jovanovic          Flags,                                             // flags
1723cda54210SPaul Robinson          SPFlags,                                           // SPFlags
1724ef27db87SMehdi Amini          HasUnit ? CUorFn : nullptr,                        // unit
1725adcdc1bdSPaul Robinson          getMDOrNull(Record[13 + OffsetB]),                 // templateParams
1726adcdc1bdSPaul Robinson          getMDOrNull(Record[14 + OffsetB]),                 // declaration
1727adcdc1bdSPaul Robinson          getMDOrNull(Record[15 + OffsetB]),                 // retainedNodes
1728adcdc1bdSPaul Robinson          HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1729d383df32SYonghong Song                         : nullptr,                          // thrownTypes
1730d383df32SYonghong Song          HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1731d383df32SYonghong Song                         : nullptr                           // annotations
1732ef27db87SMehdi Amini          ));
1733c05c9db3SIvan Krasin     MetadataList.assignValue(SP, NextMetadataNo);
1734c05c9db3SIvan Krasin     NextMetadataNo++;
1735ef27db87SMehdi Amini 
1736ef27db87SMehdi Amini     // Upgrade sp->function mapping to function->sp mapping.
1737ef27db87SMehdi Amini     if (HasFn) {
1738ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1739ef27db87SMehdi Amini         if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1740ef27db87SMehdi Amini           if (F->isMaterializable())
1741ef27db87SMehdi Amini             // Defer until materialized; unmaterialized functions may not have
1742ef27db87SMehdi Amini             // metadata.
1743ef27db87SMehdi Amini             FunctionsWithSPs[F] = SP;
1744ef27db87SMehdi Amini           else if (!F->empty())
1745ef27db87SMehdi Amini             F->setSubprogram(SP);
1746ef27db87SMehdi Amini         }
1747ef27db87SMehdi Amini     }
1748ef27db87SMehdi Amini     break;
1749ef27db87SMehdi Amini   }
1750ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK: {
1751ef27db87SMehdi Amini     if (Record.size() != 5)
1752ef27db87SMehdi Amini       return error("Invalid record");
1753ef27db87SMehdi Amini 
1754ef27db87SMehdi Amini     IsDistinct = Record[0];
1755ef27db87SMehdi Amini     MetadataList.assignValue(
1756ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlock,
1757ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1758ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3], Record[4])),
1759c05c9db3SIvan Krasin         NextMetadataNo);
1760c05c9db3SIvan Krasin     NextMetadataNo++;
1761ef27db87SMehdi Amini     break;
1762ef27db87SMehdi Amini   }
1763ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1764ef27db87SMehdi Amini     if (Record.size() != 4)
1765ef27db87SMehdi Amini       return error("Invalid record");
1766ef27db87SMehdi Amini 
1767ef27db87SMehdi Amini     IsDistinct = Record[0];
1768ef27db87SMehdi Amini     MetadataList.assignValue(
1769ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlockFile,
1770ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1771ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3])),
1772c05c9db3SIvan Krasin         NextMetadataNo);
1773c05c9db3SIvan Krasin     NextMetadataNo++;
1774ef27db87SMehdi Amini     break;
1775ef27db87SMehdi Amini   }
17766ed5706aSAdrian Prantl   case bitc::METADATA_COMMON_BLOCK: {
17776ed5706aSAdrian Prantl     IsDistinct = Record[0] & 1;
17786ed5706aSAdrian Prantl     MetadataList.assignValue(
17796ed5706aSAdrian Prantl         GET_OR_DISTINCT(DICommonBlock,
17806ed5706aSAdrian Prantl                         (Context, getMDOrNull(Record[1]),
17816ed5706aSAdrian Prantl                          getMDOrNull(Record[2]), getMDString(Record[3]),
17826ed5706aSAdrian Prantl                          getMDOrNull(Record[4]), Record[5])),
17836ed5706aSAdrian Prantl         NextMetadataNo);
17846ed5706aSAdrian Prantl     NextMetadataNo++;
17856ed5706aSAdrian Prantl     break;
17866ed5706aSAdrian Prantl   }
1787ef27db87SMehdi Amini   case bitc::METADATA_NAMESPACE: {
1788fed4f399SAdrian Prantl     // Newer versions of DINamespace dropped file and line.
1789fed4f399SAdrian Prantl     MDString *Name;
1790fed4f399SAdrian Prantl     if (Record.size() == 3)
1791fed4f399SAdrian Prantl       Name = getMDString(Record[2]);
1792fed4f399SAdrian Prantl     else if (Record.size() == 5)
1793fed4f399SAdrian Prantl       Name = getMDString(Record[3]);
1794fed4f399SAdrian Prantl     else
1795ef27db87SMehdi Amini       return error("Invalid record");
1796ef27db87SMehdi Amini 
1797ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1798ef27db87SMehdi Amini     bool ExportSymbols = Record[0] & 2;
1799ef27db87SMehdi Amini     MetadataList.assignValue(
1800ef27db87SMehdi Amini         GET_OR_DISTINCT(DINamespace,
1801fed4f399SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1802c05c9db3SIvan Krasin         NextMetadataNo);
1803c05c9db3SIvan Krasin     NextMetadataNo++;
1804ef27db87SMehdi Amini     break;
1805ef27db87SMehdi Amini   }
1806ef27db87SMehdi Amini   case bitc::METADATA_MACRO: {
1807ef27db87SMehdi Amini     if (Record.size() != 5)
1808ef27db87SMehdi Amini       return error("Invalid record");
1809ef27db87SMehdi Amini 
1810ef27db87SMehdi Amini     IsDistinct = Record[0];
1811ef27db87SMehdi Amini     MetadataList.assignValue(
1812ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacro,
18139f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDString(Record[3]),
18149f926f70SMehdi Amini                          getMDString(Record[4]))),
1815c05c9db3SIvan Krasin         NextMetadataNo);
1816c05c9db3SIvan Krasin     NextMetadataNo++;
1817ef27db87SMehdi Amini     break;
1818ef27db87SMehdi Amini   }
1819ef27db87SMehdi Amini   case bitc::METADATA_MACRO_FILE: {
1820ef27db87SMehdi Amini     if (Record.size() != 5)
1821ef27db87SMehdi Amini       return error("Invalid record");
1822ef27db87SMehdi Amini 
1823ef27db87SMehdi Amini     IsDistinct = Record[0];
1824ef27db87SMehdi Amini     MetadataList.assignValue(
1825ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacroFile,
18269f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDOrNull(Record[3]),
18279f926f70SMehdi Amini                          getMDOrNull(Record[4]))),
1828c05c9db3SIvan Krasin         NextMetadataNo);
1829c05c9db3SIvan Krasin     NextMetadataNo++;
1830ef27db87SMehdi Amini     break;
1831ef27db87SMehdi Amini   }
1832ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_TYPE: {
18337a42babeSAwanish Pandey     if (Record.size() < 3 || Record.size() > 4)
1834ef27db87SMehdi Amini       return error("Invalid record");
1835ef27db87SMehdi Amini 
1836ef27db87SMehdi Amini     IsDistinct = Record[0];
18377a42babeSAwanish Pandey     MetadataList.assignValue(
18387a42babeSAwanish Pandey         GET_OR_DISTINCT(DITemplateTypeParameter,
1839ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
18407a42babeSAwanish Pandey                          getDITypeRefOrNull(Record[2]),
18417a42babeSAwanish Pandey                          (Record.size() == 4) ? getMDOrNull(Record[3])
18427a42babeSAwanish Pandey                                               : getMDOrNull(false))),
1843c05c9db3SIvan Krasin         NextMetadataNo);
1844c05c9db3SIvan Krasin     NextMetadataNo++;
1845ef27db87SMehdi Amini     break;
1846ef27db87SMehdi Amini   }
1847ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_VALUE: {
18487a42babeSAwanish Pandey     if (Record.size() < 5 || Record.size() > 6)
1849ef27db87SMehdi Amini       return error("Invalid record");
1850ef27db87SMehdi Amini 
1851ef27db87SMehdi Amini     IsDistinct = Record[0];
18527a42babeSAwanish Pandey 
1853ef27db87SMehdi Amini     MetadataList.assignValue(
18547a42babeSAwanish Pandey         GET_OR_DISTINCT(
18557a42babeSAwanish Pandey             DITemplateValueParameter,
1856ef27db87SMehdi Amini             (Context, Record[1], getMDString(Record[2]),
1857ef27db87SMehdi Amini              getDITypeRefOrNull(Record[3]),
18587a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
18597a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[5])
18607a42babeSAwanish Pandey                                   : getMDOrNull(Record[4]))),
1861c05c9db3SIvan Krasin         NextMetadataNo);
1862c05c9db3SIvan Krasin     NextMetadataNo++;
1863ef27db87SMehdi Amini     break;
1864ef27db87SMehdi Amini   }
1865ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_VAR: {
1866f8ab35a4SMatthew Voss     if (Record.size() < 11 || Record.size() > 13)
1867ef27db87SMehdi Amini       return error("Invalid record");
1868ef27db87SMehdi Amini 
1869bceaaa96SAdrian Prantl     IsDistinct = Record[0] & 1;
1870bceaaa96SAdrian Prantl     unsigned Version = Record[0] >> 1;
1871ef27db87SMehdi Amini 
1872f8ab35a4SMatthew Voss     if (Version == 2) {
187330c28848SYonghong Song       Metadata *Annotations = nullptr;
187430c28848SYonghong Song       if (Record.size() > 12)
187530c28848SYonghong Song         Annotations = getMDOrNull(Record[12]);
187630c28848SYonghong Song 
1877f8ab35a4SMatthew Voss       MetadataList.assignValue(
1878f8ab35a4SMatthew Voss           GET_OR_DISTINCT(
1879f8ab35a4SMatthew Voss               DIGlobalVariable,
1880f8ab35a4SMatthew Voss               (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1881f8ab35a4SMatthew Voss                getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1882f8ab35a4SMatthew Voss                getDITypeRefOrNull(Record[6]), Record[7], Record[8],
188330c28848SYonghong Song                getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11],
188430c28848SYonghong Song                Annotations)),
1885f8ab35a4SMatthew Voss           NextMetadataNo);
1886f8ab35a4SMatthew Voss 
1887f8ab35a4SMatthew Voss       NextMetadataNo++;
1888f8ab35a4SMatthew Voss     } else if (Version == 1) {
1889f8ab35a4SMatthew Voss       // No upgrade necessary. A null field will be introduced to indicate
1890f8ab35a4SMatthew Voss       // that no parameter information is available.
1891bceaaa96SAdrian Prantl       MetadataList.assignValue(
1892bceaaa96SAdrian Prantl           GET_OR_DISTINCT(DIGlobalVariable,
1893bceaaa96SAdrian Prantl                           (Context, getMDOrNull(Record[1]),
1894bceaaa96SAdrian Prantl                            getMDString(Record[2]), getMDString(Record[3]),
1895bceaaa96SAdrian Prantl                            getMDOrNull(Record[4]), Record[5],
18969f926f70SMehdi Amini                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
189730c28848SYonghong Song                            getMDOrNull(Record[10]), nullptr, Record[11],
189830c28848SYonghong Song                            nullptr)),
1899c05c9db3SIvan Krasin           NextMetadataNo);
1900f8ab35a4SMatthew Voss 
1901c05c9db3SIvan Krasin       NextMetadataNo++;
1902bceaaa96SAdrian Prantl     } else if (Version == 0) {
1903ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
1904ef27db87SMehdi Amini       // ConstantInt here.
1905a5bf2d70SAdrian Prantl       NeedUpgradeToDIGlobalVariableExpression = true;
1906ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
1907ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1908ef27db87SMehdi Amini       if (Record.size() > 11) {
1909ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1910ef27db87SMehdi Amini           return error("Alignment value is too large");
1911ef27db87SMehdi Amini         AlignInBits = Record[11];
1912ef27db87SMehdi Amini       }
1913ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
1914ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1915ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1916ef27db87SMehdi Amini           Attach = GV;
1917ef27db87SMehdi Amini           Expr = nullptr;
1918ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1919ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
1920ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
1921ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
1922ef27db87SMehdi Amini         } else {
1923ef27db87SMehdi Amini           Expr = nullptr;
1924ef27db87SMehdi Amini         }
1925ef27db87SMehdi Amini       }
1926ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
1927ef27db87SMehdi Amini           DIGlobalVariable,
1928ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1929ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1930bceaaa96SAdrian Prantl            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
193130c28848SYonghong Song            getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));
193203c6d31aSAdrian Prantl 
1933e37d3144SAdrian Prantl       DIGlobalVariableExpression *DGVE = nullptr;
1934e37d3144SAdrian Prantl       if (Attach || Expr)
193505782218SAdrian Prantl         DGVE = DIGlobalVariableExpression::getDistinct(
193605782218SAdrian Prantl             Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
193773ec0656SAdrian Prantl       if (Attach)
1938bceaaa96SAdrian Prantl         Attach->addDebugInfo(DGVE);
1939e37d3144SAdrian Prantl 
1940e37d3144SAdrian Prantl       auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1941e37d3144SAdrian Prantl       MetadataList.assignValue(MDNode, NextMetadataNo);
1942e37d3144SAdrian Prantl       NextMetadataNo++;
1943bceaaa96SAdrian Prantl     } else
1944bceaaa96SAdrian Prantl       return error("Invalid record");
194573ec0656SAdrian Prantl 
1946ef27db87SMehdi Amini     break;
1947ef27db87SMehdi Amini   }
1948ef27db87SMehdi Amini   case bitc::METADATA_LOCAL_VAR: {
1949ef27db87SMehdi Amini     // 10th field is for the obseleted 'inlinedAt:' field.
1950ef27db87SMehdi Amini     if (Record.size() < 8 || Record.size() > 10)
1951ef27db87SMehdi Amini       return error("Invalid record");
1952ef27db87SMehdi Amini 
1953ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1954ef27db87SMehdi Amini     bool HasAlignment = Record[0] & 2;
1955ef27db87SMehdi Amini     // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1956ef27db87SMehdi Amini     // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
195768168d17SSimon Pilgrim     // this is newer version of record which doesn't have artificial tag.
1958ef27db87SMehdi Amini     bool HasTag = !HasAlignment && Record.size() > 8;
1959ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1960ef27db87SMehdi Amini     uint32_t AlignInBits = 0;
19611bebc31cSYonghong Song     Metadata *Annotations = nullptr;
1962ef27db87SMehdi Amini     if (HasAlignment) {
19631bebc31cSYonghong Song       if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1964ef27db87SMehdi Amini         return error("Alignment value is too large");
19651bebc31cSYonghong Song       AlignInBits = Record[8];
19661bebc31cSYonghong Song       if (Record.size() > 9)
19671bebc31cSYonghong Song         Annotations = getMDOrNull(Record[9]);
1968ef27db87SMehdi Amini     }
19691bebc31cSYonghong Song 
1970ef27db87SMehdi Amini     MetadataList.assignValue(
1971ef27db87SMehdi Amini         GET_OR_DISTINCT(DILocalVariable,
1972ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1 + HasTag]),
1973ef27db87SMehdi Amini                          getMDString(Record[2 + HasTag]),
1974ef27db87SMehdi Amini                          getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1975ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5 + HasTag]),
19761bebc31cSYonghong Song                          Record[6 + HasTag], Flags, AlignInBits,
19771bebc31cSYonghong Song                          Annotations)),
1978c05c9db3SIvan Krasin         NextMetadataNo);
1979c05c9db3SIvan Krasin     NextMetadataNo++;
1980ef27db87SMehdi Amini     break;
1981ef27db87SMehdi Amini   }
19822c864551SShiva Chen   case bitc::METADATA_LABEL: {
19832c864551SShiva Chen     if (Record.size() != 5)
19842c864551SShiva Chen       return error("Invalid record");
19852c864551SShiva Chen 
19862c864551SShiva Chen     IsDistinct = Record[0] & 1;
19872c864551SShiva Chen     MetadataList.assignValue(
19882c864551SShiva Chen         GET_OR_DISTINCT(DILabel,
19892c864551SShiva Chen                         (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;
2005*05963a3dSArthur Eubanks     if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
2006ffc498dfSFlorian Hahn       return Err;
2007ef27db87SMehdi Amini 
2008*05963a3dSArthur Eubanks     MetadataList.assignValue(
2009*05963a3dSArthur Eubanks         GET_OR_DISTINCT(DIExpression, (Context, Elts)), 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