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"
23*ffe8720aSserge-sans-paille #include "llvm/BinaryFormat/Dwarf.h"
24ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
25ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
2608ed2160SItay Bookstein #include "llvm/Bitstream/BitstreamReader.h"
27ef27db87SMehdi Amini #include "llvm/IR/Argument.h"
28ef27db87SMehdi Amini #include "llvm/IR/Attributes.h"
29ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
30ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
31ef27db87SMehdi Amini #include "llvm/IR/CallingConv.h"
32ef27db87SMehdi Amini #include "llvm/IR/Comdat.h"
33ef27db87SMehdi Amini #include "llvm/IR/Constant.h"
34ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
35ef27db87SMehdi Amini #include "llvm/IR/DebugInfo.h"
36ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
37ef27db87SMehdi Amini #include "llvm/IR/DebugLoc.h"
38ef27db87SMehdi Amini #include "llvm/IR/DerivedTypes.h"
39ef27db87SMehdi Amini #include "llvm/IR/DiagnosticPrinter.h"
40ef27db87SMehdi Amini #include "llvm/IR/Function.h"
41ef27db87SMehdi Amini #include "llvm/IR/GVMaterializer.h"
42ef27db87SMehdi Amini #include "llvm/IR/GlobalAlias.h"
43ef27db87SMehdi Amini #include "llvm/IR/GlobalIFunc.h"
44ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
45ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h"
46ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
47ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h"
48ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h"
49ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
50ef27db87SMehdi Amini #include "llvm/IR/Instructions.h"
516825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h"
526bda14b3SChandler Carruth #include "llvm/IR/Intrinsics.h"
53ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
54ef27db87SMehdi Amini #include "llvm/IR/Module.h"
55ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h"
56ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h"
57ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
58ef27db87SMehdi Amini #include "llvm/IR/Type.h"
59ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h"
60ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h"
61ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
62ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
63ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
64ef27db87SMehdi Amini #include "llvm/Support/Debug.h"
65ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
66ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h"
67ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h"
68ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h"
69ef27db87SMehdi Amini #include <algorithm>
70ef27db87SMehdi Amini #include <cassert>
71ef27db87SMehdi Amini #include <cstddef>
72ef27db87SMehdi Amini #include <cstdint>
73ef27db87SMehdi Amini #include <deque>
74ef27db87SMehdi Amini #include <limits>
75ef27db87SMehdi Amini #include <map>
76ef27db87SMehdi Amini #include <string>
77ef27db87SMehdi Amini #include <system_error>
78ef27db87SMehdi Amini #include <tuple>
79ef27db87SMehdi Amini #include <utility>
80ef27db87SMehdi Amini #include <vector>
81ef27db87SMehdi Amini 
82ef27db87SMehdi Amini using namespace llvm;
83ef27db87SMehdi Amini 
8419ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader"
8519ef4fadSMehdi Amini 
8619ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
8719ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
8819ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
8919ef4fadSMehdi Amini 
90a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO.
91a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB.
92a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions(
93a61f5e37STeresa Johnson     "import-full-type-definitions", cl::init(false), cl::Hidden,
94a61f5e37STeresa Johnson     cl::desc("Import full type definitions for ThinLTO."));
95a61f5e37STeresa Johnson 
9619ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading(
9719ef4fadSMehdi Amini     "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
9819ef4fadSMehdi Amini     cl::desc("Force disable the lazy-loading on-demand of metadata when "
9919ef4fadSMehdi Amini              "loading bitcode for importing."));
10019ef4fadSMehdi Amini 
101ef27db87SMehdi Amini namespace {
102ef27db87SMehdi Amini 
103aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
104ef27db87SMehdi Amini 
105ef27db87SMehdi Amini class BitcodeReaderMetadataList {
106ef27db87SMehdi Amini   /// Array of metadata references.
107ef27db87SMehdi Amini   ///
108ef27db87SMehdi Amini   /// Don't use std::vector here.  Some versions of libc++ copy (instead of
109ef27db87SMehdi Amini   /// move) on resize, and TrackingMDRef is very expensive to copy.
110ef27db87SMehdi Amini   SmallVector<TrackingMDRef, 1> MetadataPtrs;
111ef27db87SMehdi Amini 
112690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of forward references that were
113690952d1SMehdi Amini   /// generated.
114690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> ForwardReference;
115690952d1SMehdi Amini 
116690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of Metadata that need to be
117690952d1SMehdi Amini   /// resolved.
118690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> UnresolvedNodes;
119690952d1SMehdi Amini 
120ef27db87SMehdi Amini   /// Structures for resolving old type refs.
121ef27db87SMehdi Amini   struct {
122ef27db87SMehdi Amini     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
123ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
124ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
125ef27db87SMehdi Amini     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
126ef27db87SMehdi Amini   } OldTypeRefs;
127ef27db87SMehdi Amini 
128ef27db87SMehdi Amini   LLVMContext &Context;
129ef27db87SMehdi Amini 
130864474c9SFlorian Hahn   /// Maximum number of valid references. Forward references exceeding the
131864474c9SFlorian Hahn   /// maximum must be invalid.
132864474c9SFlorian Hahn   unsigned RefsUpperBound;
133864474c9SFlorian Hahn 
134ef27db87SMehdi Amini public:
135864474c9SFlorian Hahn   BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
136864474c9SFlorian Hahn       : Context(C),
137864474c9SFlorian Hahn         RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
138864474c9SFlorian Hahn                                 RefsUpperBound)) {}
139ef27db87SMehdi Amini 
140ef27db87SMehdi Amini   // vector compatibility methods
141ef27db87SMehdi Amini   unsigned size() const { return MetadataPtrs.size(); }
142ef27db87SMehdi Amini   void resize(unsigned N) { MetadataPtrs.resize(N); }
143ef27db87SMehdi Amini   void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
144ef27db87SMehdi Amini   void clear() { MetadataPtrs.clear(); }
145ef27db87SMehdi Amini   Metadata *back() const { return MetadataPtrs.back(); }
146ef27db87SMehdi Amini   void pop_back() { MetadataPtrs.pop_back(); }
147ef27db87SMehdi Amini   bool empty() const { return MetadataPtrs.empty(); }
148ef27db87SMehdi Amini 
149ef27db87SMehdi Amini   Metadata *operator[](unsigned i) const {
150ef27db87SMehdi Amini     assert(i < MetadataPtrs.size());
151ef27db87SMehdi Amini     return MetadataPtrs[i];
152ef27db87SMehdi Amini   }
153ef27db87SMehdi Amini 
154ef27db87SMehdi Amini   Metadata *lookup(unsigned I) const {
155ef27db87SMehdi Amini     if (I < MetadataPtrs.size())
156ef27db87SMehdi Amini       return MetadataPtrs[I];
157ef27db87SMehdi Amini     return nullptr;
158ef27db87SMehdi Amini   }
159ef27db87SMehdi Amini 
160ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
161ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
162690952d1SMehdi Amini     assert(ForwardReference.empty() && "Unexpected forward refs");
163690952d1SMehdi Amini     assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
164ef27db87SMehdi Amini     MetadataPtrs.resize(N);
165ef27db87SMehdi Amini   }
166ef27db87SMehdi Amini 
167ef27db87SMehdi Amini   /// Return the given metadata, creating a replaceable forward reference if
168ef27db87SMehdi Amini   /// necessary.
169ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx);
170ef27db87SMehdi Amini 
1718f976ba0SHiroshi Inoue   /// Return the given metadata only if it is fully resolved.
172ef27db87SMehdi Amini   ///
173ef27db87SMehdi Amini   /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
174ef27db87SMehdi Amini   /// would give \c false.
175ef27db87SMehdi Amini   Metadata *getMetadataIfResolved(unsigned Idx);
176ef27db87SMehdi Amini 
177ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
178ef27db87SMehdi Amini   void assignValue(Metadata *MD, unsigned Idx);
179ef27db87SMehdi Amini   void tryToResolveCycles();
180690952d1SMehdi Amini   bool hasFwdRefs() const { return !ForwardReference.empty(); }
18119ef4fadSMehdi Amini   int getNextFwdRef() {
18219ef4fadSMehdi Amini     assert(hasFwdRefs());
18319ef4fadSMehdi Amini     return *ForwardReference.begin();
18419ef4fadSMehdi Amini   }
185ef27db87SMehdi Amini 
186ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
187ef27db87SMehdi Amini   void addTypeRef(MDString &UUID, DICompositeType &CT);
188ef27db87SMehdi Amini 
189ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
190ef27db87SMehdi Amini   Metadata *upgradeTypeRef(Metadata *MaybeUUID);
191ef27db87SMehdi Amini 
192ef27db87SMehdi Amini   /// Upgrade a type ref array that may have MDString references.
193ef27db87SMehdi Amini   Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
194ef27db87SMehdi Amini 
195ef27db87SMehdi Amini private:
196ef27db87SMehdi Amini   Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
197ef27db87SMehdi Amini };
198ef27db87SMehdi Amini 
199ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
200690952d1SMehdi Amini   if (auto *MDN = dyn_cast<MDNode>(MD))
201690952d1SMehdi Amini     if (!MDN->isResolved())
202690952d1SMehdi Amini       UnresolvedNodes.insert(Idx);
203690952d1SMehdi Amini 
204ef27db87SMehdi Amini   if (Idx == size()) {
205ef27db87SMehdi Amini     push_back(MD);
206ef27db87SMehdi Amini     return;
207ef27db87SMehdi Amini   }
208ef27db87SMehdi Amini 
209ef27db87SMehdi Amini   if (Idx >= size())
210ef27db87SMehdi Amini     resize(Idx + 1);
211ef27db87SMehdi Amini 
212ef27db87SMehdi Amini   TrackingMDRef &OldMD = MetadataPtrs[Idx];
213ef27db87SMehdi Amini   if (!OldMD) {
214ef27db87SMehdi Amini     OldMD.reset(MD);
215ef27db87SMehdi Amini     return;
216ef27db87SMehdi Amini   }
217ef27db87SMehdi Amini 
218ef27db87SMehdi Amini   // If there was a forward reference to this value, replace it.
219ef27db87SMehdi Amini   TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
220ef27db87SMehdi Amini   PrevMD->replaceAllUsesWith(MD);
221690952d1SMehdi Amini   ForwardReference.erase(Idx);
222ef27db87SMehdi Amini }
223ef27db87SMehdi Amini 
224ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
225864474c9SFlorian Hahn   // Bail out for a clearly invalid value.
226864474c9SFlorian Hahn   if (Idx >= RefsUpperBound)
227864474c9SFlorian Hahn     return nullptr;
228864474c9SFlorian Hahn 
229ef27db87SMehdi Amini   if (Idx >= size())
230ef27db87SMehdi Amini     resize(Idx + 1);
231ef27db87SMehdi Amini 
232ef27db87SMehdi Amini   if (Metadata *MD = MetadataPtrs[Idx])
233ef27db87SMehdi Amini     return MD;
234ef27db87SMehdi Amini 
235ef27db87SMehdi Amini   // Track forward refs to be resolved later.
236690952d1SMehdi Amini   ForwardReference.insert(Idx);
237ef27db87SMehdi Amini 
238ef27db87SMehdi Amini   // Create and return a placeholder, which will later be RAUW'd.
23919ef4fadSMehdi Amini   ++NumMDNodeTemporary;
240ef27db87SMehdi Amini   Metadata *MD = MDNode::getTemporary(Context, None).release();
241ef27db87SMehdi Amini   MetadataPtrs[Idx].reset(MD);
242ef27db87SMehdi Amini   return MD;
243ef27db87SMehdi Amini }
244ef27db87SMehdi Amini 
245ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
246ef27db87SMehdi Amini   Metadata *MD = lookup(Idx);
247ef27db87SMehdi Amini   if (auto *N = dyn_cast_or_null<MDNode>(MD))
248ef27db87SMehdi Amini     if (!N->isResolved())
249ef27db87SMehdi Amini       return nullptr;
250ef27db87SMehdi Amini   return MD;
251ef27db87SMehdi Amini }
252ef27db87SMehdi Amini 
253ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
254ef27db87SMehdi Amini   return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
255ef27db87SMehdi Amini }
256ef27db87SMehdi Amini 
257ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
258690952d1SMehdi Amini   if (!ForwardReference.empty())
259ef27db87SMehdi Amini     // Still forward references... can't resolve cycles.
260ef27db87SMehdi Amini     return;
261ef27db87SMehdi Amini 
262ef27db87SMehdi Amini   // Give up on finding a full definition for any forward decls that remain.
263ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.FwdDecls)
264ef27db87SMehdi Amini     OldTypeRefs.Final.insert(Ref);
265ef27db87SMehdi Amini   OldTypeRefs.FwdDecls.clear();
266ef27db87SMehdi Amini 
267ef27db87SMehdi Amini   // Upgrade from old type ref arrays.  In strange cases, this could add to
268ef27db87SMehdi Amini   // OldTypeRefs.Unknown.
269690952d1SMehdi Amini   for (const auto &Array : OldTypeRefs.Arrays)
270ef27db87SMehdi Amini     Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
271ef27db87SMehdi Amini   OldTypeRefs.Arrays.clear();
272ef27db87SMehdi Amini 
273ef27db87SMehdi Amini   // Replace old string-based type refs with the resolved node, if possible.
274ef27db87SMehdi Amini   // If we haven't seen the node, leave it to the verifier to complain about
275ef27db87SMehdi Amini   // the invalid string reference.
276ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.Unknown) {
277ef27db87SMehdi Amini     if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
278ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(CT);
279ef27db87SMehdi Amini     else
280ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(Ref.first);
281ef27db87SMehdi Amini   }
282ef27db87SMehdi Amini   OldTypeRefs.Unknown.clear();
283ef27db87SMehdi Amini 
284690952d1SMehdi Amini   if (UnresolvedNodes.empty())
285ef27db87SMehdi Amini     // Nothing to do.
286ef27db87SMehdi Amini     return;
287ef27db87SMehdi Amini 
288ef27db87SMehdi Amini   // Resolve any cycles.
289690952d1SMehdi Amini   for (unsigned I : UnresolvedNodes) {
290ef27db87SMehdi Amini     auto &MD = MetadataPtrs[I];
291ef27db87SMehdi Amini     auto *N = dyn_cast_or_null<MDNode>(MD);
292ef27db87SMehdi Amini     if (!N)
293ef27db87SMehdi Amini       continue;
294ef27db87SMehdi Amini 
295ef27db87SMehdi Amini     assert(!N->isTemporary() && "Unexpected forward reference");
296ef27db87SMehdi Amini     N->resolveCycles();
297ef27db87SMehdi Amini   }
298ef27db87SMehdi Amini 
299690952d1SMehdi Amini   // Make sure we return early again until there's another unresolved ref.
300690952d1SMehdi Amini   UnresolvedNodes.clear();
301ef27db87SMehdi Amini }
302ef27db87SMehdi Amini 
303ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
304ef27db87SMehdi Amini                                            DICompositeType &CT) {
305ef27db87SMehdi Amini   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
306ef27db87SMehdi Amini   if (CT.isForwardDecl())
307ef27db87SMehdi Amini     OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
308ef27db87SMehdi Amini   else
309ef27db87SMehdi Amini     OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
310ef27db87SMehdi Amini }
311ef27db87SMehdi Amini 
312ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
313ef27db87SMehdi Amini   auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
314ef27db87SMehdi Amini   if (LLVM_LIKELY(!UUID))
315ef27db87SMehdi Amini     return MaybeUUID;
316ef27db87SMehdi Amini 
317ef27db87SMehdi Amini   if (auto *CT = OldTypeRefs.Final.lookup(UUID))
318ef27db87SMehdi Amini     return CT;
319ef27db87SMehdi Amini 
320ef27db87SMehdi Amini   auto &Ref = OldTypeRefs.Unknown[UUID];
321ef27db87SMehdi Amini   if (!Ref)
322ef27db87SMehdi Amini     Ref = MDNode::getTemporary(Context, None);
323ef27db87SMehdi Amini   return Ref.get();
324ef27db87SMehdi Amini }
325ef27db87SMehdi Amini 
326ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
327ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
328ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
329ef27db87SMehdi Amini     return MaybeTuple;
330ef27db87SMehdi Amini 
331ef27db87SMehdi Amini   // Look through the array immediately if possible.
332ef27db87SMehdi Amini   if (!Tuple->isTemporary())
333ef27db87SMehdi Amini     return resolveTypeRefArray(Tuple);
334ef27db87SMehdi Amini 
335ef27db87SMehdi Amini   // Create and return a placeholder to use for now.  Eventually
336ef27db87SMehdi Amini   // resolveTypeRefArrays() will be resolve this forward reference.
337ef27db87SMehdi Amini   OldTypeRefs.Arrays.emplace_back(
338ef27db87SMehdi Amini       std::piecewise_construct, std::forward_as_tuple(Tuple),
339ef27db87SMehdi Amini       std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
340ef27db87SMehdi Amini   return OldTypeRefs.Arrays.back().second.get();
341ef27db87SMehdi Amini }
342ef27db87SMehdi Amini 
343ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
344ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
345ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
346ef27db87SMehdi Amini     return MaybeTuple;
347ef27db87SMehdi Amini 
348da82ce99SFangrui Song   // Look through the DITypeRefArray, upgrading each DIType *.
349ef27db87SMehdi Amini   SmallVector<Metadata *, 32> Ops;
350ef27db87SMehdi Amini   Ops.reserve(Tuple->getNumOperands());
351ef27db87SMehdi Amini   for (Metadata *MD : Tuple->operands())
352ef27db87SMehdi Amini     Ops.push_back(upgradeTypeRef(MD));
353ef27db87SMehdi Amini 
354ef27db87SMehdi Amini   return MDTuple::get(Context, Ops);
355ef27db87SMehdi Amini }
356ef27db87SMehdi Amini 
357ef27db87SMehdi Amini namespace {
358ef27db87SMehdi Amini 
359ef27db87SMehdi Amini class PlaceholderQueue {
360ef27db87SMehdi Amini   // Placeholders would thrash around when moved, so store in a std::deque
361ef27db87SMehdi Amini   // instead of some sort of vector.
362ef27db87SMehdi Amini   std::deque<DistinctMDOperandPlaceholder> PHs;
363ef27db87SMehdi Amini 
364ef27db87SMehdi Amini public:
36527379892SMehdi Amini   ~PlaceholderQueue() {
366665b4138SLuís Ferreira     assert(empty() &&
367665b4138SLuís Ferreira            "PlaceholderQueue hasn't been flushed before being destroyed");
36827379892SMehdi Amini   }
369bd76f372SSimon Pilgrim   bool empty() const { return PHs.empty(); }
370ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
371ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
37219ef4fadSMehdi Amini 
37319ef4fadSMehdi Amini   /// Return the list of temporaries nodes in the queue, these need to be
37419ef4fadSMehdi Amini   /// loaded before we can flush the queue.
37519ef4fadSMehdi Amini   void getTemporaries(BitcodeReaderMetadataList &MetadataList,
37619ef4fadSMehdi Amini                       DenseSet<unsigned> &Temporaries) {
37719ef4fadSMehdi Amini     for (auto &PH : PHs) {
37819ef4fadSMehdi Amini       auto ID = PH.getID();
37919ef4fadSMehdi Amini       auto *MD = MetadataList.lookup(ID);
38019ef4fadSMehdi Amini       if (!MD) {
38119ef4fadSMehdi Amini         Temporaries.insert(ID);
38219ef4fadSMehdi Amini         continue;
38319ef4fadSMehdi Amini       }
38419ef4fadSMehdi Amini       auto *N = dyn_cast_or_null<MDNode>(MD);
38519ef4fadSMehdi Amini       if (N && N->isTemporary())
38619ef4fadSMehdi Amini         Temporaries.insert(ID);
38719ef4fadSMehdi Amini     }
38819ef4fadSMehdi Amini   }
389ef27db87SMehdi Amini };
390ef27db87SMehdi Amini 
391ef27db87SMehdi Amini } // end anonymous namespace
392ef27db87SMehdi Amini 
393ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
394ef27db87SMehdi Amini   PHs.emplace_back(ID);
395ef27db87SMehdi Amini   return PHs.back();
396ef27db87SMehdi Amini }
397ef27db87SMehdi Amini 
398ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
399ef27db87SMehdi Amini   while (!PHs.empty()) {
4004f90ee00SMehdi Amini     auto *MD = MetadataList.lookup(PHs.front().getID());
4014f90ee00SMehdi Amini     assert(MD && "Flushing placeholder on unassigned MD");
4025ae6170fSMehdi Amini #ifndef NDEBUG
4034f90ee00SMehdi Amini     if (auto *MDN = dyn_cast<MDNode>(MD))
4045ae6170fSMehdi Amini       assert(MDN->isResolved() &&
4055ae6170fSMehdi Amini              "Flushing Placeholder while cycles aren't resolved");
4065ae6170fSMehdi Amini #endif
4075ae6170fSMehdi Amini     PHs.front().replaceUseWith(MD);
408ef27db87SMehdi Amini     PHs.pop_front();
409ef27db87SMehdi Amini   }
410ef27db87SMehdi Amini }
411ef27db87SMehdi Amini 
412d68904f9SJames Henderson } // anonymous namespace
413ef27db87SMehdi Amini 
414ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
415ffc498dfSFlorian Hahn   return make_error<StringError>(
416ffc498dfSFlorian Hahn       Message, make_error_code(BitcodeError::CorruptedBitcode));
417ffc498dfSFlorian Hahn }
418ffc498dfSFlorian Hahn 
419ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
420ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
421ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
422ef27db87SMehdi Amini   BitstreamCursor &Stream;
423ef27db87SMehdi Amini   LLVMContext &Context;
424ef27db87SMehdi Amini   Module &TheModule;
425ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
426ef27db87SMehdi Amini 
42719ef4fadSMehdi Amini   /// Cursor associated with the lazy-loading of Metadata. This is the easy way
42819ef4fadSMehdi Amini   /// to keep around the right "context" (Abbrev list) to be able to jump in
42919ef4fadSMehdi Amini   /// the middle of the metadata block and load any record.
43019ef4fadSMehdi Amini   BitstreamCursor IndexCursor;
43119ef4fadSMehdi Amini 
43219ef4fadSMehdi Amini   /// Index that keeps track of MDString values.
43319ef4fadSMehdi Amini   std::vector<StringRef> MDStringRef;
43419ef4fadSMehdi Amini 
43519ef4fadSMehdi Amini   /// On-demand loading of a single MDString. Requires the index above to be
43619ef4fadSMehdi Amini   /// populated.
43719ef4fadSMehdi Amini   MDString *lazyLoadOneMDString(unsigned Idx);
43819ef4fadSMehdi Amini 
43919ef4fadSMehdi Amini   /// Index that keeps track of where to find a metadata record in the stream.
44019ef4fadSMehdi Amini   std::vector<uint64_t> GlobalMetadataBitPosIndex;
44119ef4fadSMehdi Amini 
442c27ab339STeresa Johnson   /// Cursor position of the start of the global decl attachments, to enable
443c27ab339STeresa Johnson   /// loading using the index built for lazy loading, instead of forward
444c27ab339STeresa Johnson   /// references.
445c27ab339STeresa Johnson   uint64_t GlobalDeclAttachmentPos = 0;
446c27ab339STeresa Johnson 
447c27ab339STeresa Johnson #ifndef NDEBUG
44895875d24SZarko Todorovski   /// Baisic correctness check that we end up parsing all of the global decl
44995875d24SZarko Todorovski   /// attachments.
450c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachSkipped = 0;
451c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachParsed = 0;
452c27ab339STeresa Johnson #endif
453c27ab339STeresa Johnson 
454c27ab339STeresa Johnson   /// Load the global decl attachments, using the index built for lazy loading.
455c27ab339STeresa Johnson   Expected<bool> loadGlobalDeclAttachments();
456c27ab339STeresa Johnson 
45719ef4fadSMehdi Amini   /// Populate the index above to enable lazily loading of metadata, and load
45819ef4fadSMehdi Amini   /// the named metadata as well as the transitively referenced global
45919ef4fadSMehdi Amini   /// Metadata.
46042ef1990SMehdi Amini   Expected<bool> lazyLoadModuleMetadataBlock();
46119ef4fadSMehdi Amini 
46219ef4fadSMehdi Amini   /// On-demand loading of a single metadata. Requires the index above to be
46319ef4fadSMehdi Amini   /// populated.
46419ef4fadSMehdi Amini   void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
46519ef4fadSMehdi Amini 
4669f926f70SMehdi Amini   // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4679f926f70SMehdi Amini   // point from SP to CU after a block is completly parsed.
4689f926f70SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4699f926f70SMehdi Amini 
470ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
471ef27db87SMehdi Amini   /// metadata.
472ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
473ef27db87SMehdi Amini 
474ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
475ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
476ef27db87SMehdi Amini 
4778662305bSMehdi Amini   bool StripTBAA = false;
478ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
479e37d3144SAdrian Prantl   bool NeedUpgradeToDIGlobalVariableExpression = false;
4806825fb64SAdrian Prantl   bool NeedDeclareExpressionUpgrade = false;
481ef27db87SMehdi Amini 
482ec68dd49SMehdi Amini   /// True if metadata is being parsed for a module being ThinLTO imported.
483ec68dd49SMehdi Amini   bool IsImporting = false;
484ec68dd49SMehdi Amini 
4859f926f70SMehdi Amini   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4869f926f70SMehdi Amini                          PlaceholderQueue &Placeholders, StringRef Blob,
487ef27db87SMehdi Amini                          unsigned &NextMetadataNo);
48819ef4fadSMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
489061f4a5fSBenjamin Kramer                              function_ref<void(StringRef)> CallBack);
490ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
491ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
492ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
493ef27db87SMehdi Amini 
49419ef4fadSMehdi Amini   void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
49519ef4fadSMehdi Amini 
49619ef4fadSMehdi Amini   /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
49719ef4fadSMehdi Amini   void upgradeCUSubprograms() {
49819ef4fadSMehdi Amini     for (auto CU_SP : CUSubprograms)
49919ef4fadSMehdi Amini       if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
50019ef4fadSMehdi Amini         for (auto &Op : SPs->operands())
5019d2f019fSAdrian Prantl           if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
5029d2f019fSAdrian Prantl             SP->replaceUnit(CU_SP.first);
50319ef4fadSMehdi Amini     CUSubprograms.clear();
50419ef4fadSMehdi Amini   }
50519ef4fadSMehdi Amini 
506e37d3144SAdrian Prantl   /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
507e37d3144SAdrian Prantl   void upgradeCUVariables() {
508e37d3144SAdrian Prantl     if (!NeedUpgradeToDIGlobalVariableExpression)
509e37d3144SAdrian Prantl       return;
510e37d3144SAdrian Prantl 
511e37d3144SAdrian Prantl     // Upgrade list of variables attached to the CUs.
512e37d3144SAdrian Prantl     if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
513e37d3144SAdrian Prantl       for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
514e37d3144SAdrian Prantl         auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
515e37d3144SAdrian Prantl         if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
516e37d3144SAdrian Prantl           for (unsigned I = 0; I < GVs->getNumOperands(); I++)
517e37d3144SAdrian Prantl             if (auto *GV =
518e37d3144SAdrian Prantl                     dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
51905782218SAdrian Prantl               auto *DGVE = DIGlobalVariableExpression::getDistinct(
52005782218SAdrian Prantl                   Context, GV, DIExpression::get(Context, {}));
521e37d3144SAdrian Prantl               GVs->replaceOperandWith(I, DGVE);
522e37d3144SAdrian Prantl             }
523e37d3144SAdrian Prantl       }
524e37d3144SAdrian Prantl 
525e37d3144SAdrian Prantl     // Upgrade variables attached to globals.
526e37d3144SAdrian Prantl     for (auto &GV : TheModule.globals()) {
52756a08b40SDavide Italiano       SmallVector<MDNode *, 1> MDs;
528e37d3144SAdrian Prantl       GV.getMetadata(LLVMContext::MD_dbg, MDs);
529e37d3144SAdrian Prantl       GV.eraseMetadata(LLVMContext::MD_dbg);
530e37d3144SAdrian Prantl       for (auto *MD : MDs)
5312bb217b5SSimon Pilgrim         if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
53205782218SAdrian Prantl           auto *DGVE = DIGlobalVariableExpression::getDistinct(
53305782218SAdrian Prantl               Context, DGV, DIExpression::get(Context, {}));
534e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
535e37d3144SAdrian Prantl         } else
536e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *MD);
537e37d3144SAdrian Prantl     }
538e37d3144SAdrian Prantl   }
539e37d3144SAdrian Prantl 
5406825fb64SAdrian Prantl   /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5416825fb64SAdrian Prantl   /// describes a function argument.
5426825fb64SAdrian Prantl   void upgradeDeclareExpressions(Function &F) {
5436825fb64SAdrian Prantl     if (!NeedDeclareExpressionUpgrade)
5446825fb64SAdrian Prantl       return;
5456825fb64SAdrian Prantl 
5466825fb64SAdrian Prantl     for (auto &BB : F)
5476825fb64SAdrian Prantl       for (auto &I : BB)
5486825fb64SAdrian Prantl         if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5496825fb64SAdrian Prantl           if (auto *DIExpr = DDI->getExpression())
5506825fb64SAdrian Prantl             if (DIExpr->startsWithDeref() &&
551d243cbf8SKazu Hirata                 isa_and_nonnull<Argument>(DDI->getAddress())) {
5526825fb64SAdrian Prantl               SmallVector<uint64_t, 8> Ops;
5536825fb64SAdrian Prantl               Ops.append(std::next(DIExpr->elements_begin()),
5546825fb64SAdrian Prantl                          DIExpr->elements_end());
555e5d958c4Sgbtozers               DDI->setExpression(DIExpression::get(Context, Ops));
5566825fb64SAdrian Prantl             }
5576825fb64SAdrian Prantl   }
5586825fb64SAdrian Prantl 
559ffc498dfSFlorian Hahn   /// Upgrade the expression from previous versions.
56005963a3dSArthur Eubanks   Error upgradeDIExpression(uint64_t FromVersion,
561ffc498dfSFlorian Hahn                             MutableArrayRef<uint64_t> &Expr,
562ffc498dfSFlorian Hahn                             SmallVectorImpl<uint64_t> &Buffer) {
563ffc498dfSFlorian Hahn     auto N = Expr.size();
564ffc498dfSFlorian Hahn     switch (FromVersion) {
565ffc498dfSFlorian Hahn     default:
566ffc498dfSFlorian Hahn       return error("Invalid record");
567ffc498dfSFlorian Hahn     case 0:
568ffc498dfSFlorian Hahn       if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
569ffc498dfSFlorian Hahn         Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
570ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
571ffc498dfSFlorian Hahn     case 1:
572ffc498dfSFlorian Hahn       // Move DW_OP_deref to the end.
573ffc498dfSFlorian Hahn       if (N && Expr[0] == dwarf::DW_OP_deref) {
574ffc498dfSFlorian Hahn         auto End = Expr.end();
575ffc498dfSFlorian Hahn         if (Expr.size() >= 3 &&
576ffc498dfSFlorian Hahn             *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
577ffc498dfSFlorian Hahn           End = std::prev(End, 3);
578ffc498dfSFlorian Hahn         std::move(std::next(Expr.begin()), End, Expr.begin());
579ffc498dfSFlorian Hahn         *std::prev(End) = dwarf::DW_OP_deref;
580ffc498dfSFlorian Hahn       }
581ffc498dfSFlorian Hahn       NeedDeclareExpressionUpgrade = true;
582ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
583ffc498dfSFlorian Hahn     case 2: {
584ffc498dfSFlorian Hahn       // Change DW_OP_plus to DW_OP_plus_uconst.
585ffc498dfSFlorian Hahn       // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
586ffc498dfSFlorian Hahn       auto SubExpr = ArrayRef<uint64_t>(Expr);
587ffc498dfSFlorian Hahn       while (!SubExpr.empty()) {
588ffc498dfSFlorian Hahn         // Skip past other operators with their operands
589ffc498dfSFlorian Hahn         // for this version of the IR, obtained from
590ffc498dfSFlorian Hahn         // from historic DIExpression::ExprOperand::getSize().
591ffc498dfSFlorian Hahn         size_t HistoricSize;
592ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
593ffc498dfSFlorian Hahn         default:
594ffc498dfSFlorian Hahn           HistoricSize = 1;
595ffc498dfSFlorian Hahn           break;
596ffc498dfSFlorian Hahn         case dwarf::DW_OP_constu:
597ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
598ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
599ffc498dfSFlorian Hahn           HistoricSize = 2;
600ffc498dfSFlorian Hahn           break;
601ffc498dfSFlorian Hahn         case dwarf::DW_OP_LLVM_fragment:
602ffc498dfSFlorian Hahn           HistoricSize = 3;
603ffc498dfSFlorian Hahn           break;
604ffc498dfSFlorian Hahn         }
605ffc498dfSFlorian Hahn 
606ffc498dfSFlorian Hahn         // If the expression is malformed, make sure we don't
607ffc498dfSFlorian Hahn         // copy more elements than we should.
608ffc498dfSFlorian Hahn         HistoricSize = std::min(SubExpr.size(), HistoricSize);
609ffc498dfSFlorian Hahn         ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1);
610ffc498dfSFlorian Hahn 
611ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
612ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
613ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_plus_uconst);
614ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
615ffc498dfSFlorian Hahn           break;
616ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
617ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_constu);
618ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
619ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_minus);
620ffc498dfSFlorian Hahn           break;
621ffc498dfSFlorian Hahn         default:
622ffc498dfSFlorian Hahn           Buffer.push_back(*SubExpr.begin());
623ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
624ffc498dfSFlorian Hahn           break;
625ffc498dfSFlorian Hahn         }
626ffc498dfSFlorian Hahn 
627ffc498dfSFlorian Hahn         // Continue with remaining elements.
628ffc498dfSFlorian Hahn         SubExpr = SubExpr.slice(HistoricSize);
629ffc498dfSFlorian Hahn       }
630ffc498dfSFlorian Hahn       Expr = MutableArrayRef<uint64_t>(Buffer);
631ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
632ffc498dfSFlorian Hahn     }
633ffc498dfSFlorian Hahn     case 3:
634ffc498dfSFlorian Hahn       // Up-to-date!
635ffc498dfSFlorian Hahn       break;
636ffc498dfSFlorian Hahn     }
637ffc498dfSFlorian Hahn 
638ffc498dfSFlorian Hahn     return Error::success();
639ffc498dfSFlorian Hahn   }
640ffc498dfSFlorian Hahn 
641e37d3144SAdrian Prantl   void upgradeDebugInfo() {
642e37d3144SAdrian Prantl     upgradeCUSubprograms();
643e37d3144SAdrian Prantl     upgradeCUVariables();
644e37d3144SAdrian Prantl   }
645e37d3144SAdrian Prantl 
646ef27db87SMehdi Amini public:
647ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
648ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
649ec68dd49SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID,
650ec68dd49SMehdi Amini                      bool IsImporting)
651864474c9SFlorian Hahn       : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
652864474c9SFlorian Hahn         ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
653864474c9SFlorian Hahn         TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
654864474c9SFlorian Hahn         IsImporting(IsImporting) {}
655ef27db87SMehdi Amini 
656ec68dd49SMehdi Amini   Error parseMetadata(bool ModuleLevel);
657ef27db87SMehdi Amini 
658ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6593bb4d01dSMehdi Amini 
6603bb4d01dSMehdi Amini   Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6613bb4d01dSMehdi Amini     if (ID < MDStringRef.size())
6623bb4d01dSMehdi Amini       return lazyLoadOneMDString(ID);
6633bb4d01dSMehdi Amini     if (auto *MD = MetadataList.lookup(ID))
6643bb4d01dSMehdi Amini       return MD;
6653bb4d01dSMehdi Amini     // If lazy-loading is enabled, we try recursively to load the operand
6663bb4d01dSMehdi Amini     // instead of creating a temporary.
6673bb4d01dSMehdi Amini     if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6683bb4d01dSMehdi Amini       PlaceholderQueue Placeholders;
6693bb4d01dSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
6703bb4d01dSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
6713bb4d01dSMehdi Amini       return MetadataList.lookup(ID);
6723bb4d01dSMehdi Amini     }
6733bb4d01dSMehdi Amini     return MetadataList.getMetadataFwdRef(ID);
674ef27db87SMehdi Amini   }
675ef27db87SMehdi Amini 
676ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
677ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
678ef27db87SMehdi Amini   }
679ef27db87SMehdi Amini 
680bd76f372SSimon Pilgrim   bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
681ef27db87SMehdi Amini 
682ef27db87SMehdi Amini   Error parseMetadataAttachment(
683ef27db87SMehdi Amini       Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
684ef27db87SMehdi Amini 
685ef27db87SMehdi Amini   Error parseMetadataKinds();
686ef27db87SMehdi Amini 
6878662305bSMehdi Amini   void setStripTBAA(bool Value) { StripTBAA = Value; }
688bd76f372SSimon Pilgrim   bool isStrippingTBAA() const { return StripTBAA; }
6898662305bSMehdi Amini 
690ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
691ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
6926825fb64SAdrian Prantl   void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
693ef27db87SMehdi Amini };
694ef27db87SMehdi Amini 
69542ef1990SMehdi Amini Expected<bool>
69642ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
69719ef4fadSMehdi Amini   IndexCursor = Stream;
69819ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
699c27ab339STeresa Johnson   GlobalDeclAttachmentPos = 0;
70019ef4fadSMehdi Amini   // Get the abbrevs, and preload record positions to make them lazy-loadable.
70119ef4fadSMehdi Amini   while (true) {
702c27ab339STeresa Johnson     uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
703b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
704b12a864cSDuncan P. N. Exon Smith     if (Error E =
705b12a864cSDuncan P. N. Exon Smith             IndexCursor
706b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
707b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
708b12a864cSDuncan P. N. Exon Smith       return std::move(E);
7090e828958SJF Bastien 
71019ef4fadSMehdi Amini     switch (Entry.Kind) {
71119ef4fadSMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
71219ef4fadSMehdi Amini     case BitstreamEntry::Error:
71319ef4fadSMehdi Amini       return error("Malformed block");
71419ef4fadSMehdi Amini     case BitstreamEntry::EndBlock: {
71519ef4fadSMehdi Amini       return true;
71619ef4fadSMehdi Amini     }
71719ef4fadSMehdi Amini     case BitstreamEntry::Record: {
71819ef4fadSMehdi Amini       // The interesting case.
71919ef4fadSMehdi Amini       ++NumMDRecordLoaded;
72019ef4fadSMehdi Amini       uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
721b12a864cSDuncan P. N. Exon Smith       unsigned Code;
722b12a864cSDuncan P. N. Exon Smith       if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
723b12a864cSDuncan P. N. Exon Smith         return std::move(E);
72419ef4fadSMehdi Amini       switch (Code) {
72519ef4fadSMehdi Amini       case bitc::METADATA_STRINGS: {
72619ef4fadSMehdi Amini         // Rewind and parse the strings.
7270e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
728c55cf4afSBill Wendling           return std::move(Err);
72919ef4fadSMehdi Amini         StringRef Blob;
73019ef4fadSMehdi Amini         Record.clear();
7310e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7320e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record, &Blob))
7330e828958SJF Bastien           ;
7340e828958SJF Bastien         else
7350e828958SJF Bastien           return MaybeRecord.takeError();
73619ef4fadSMehdi Amini         unsigned NumStrings = Record[0];
73719ef4fadSMehdi Amini         MDStringRef.reserve(NumStrings);
73819ef4fadSMehdi Amini         auto IndexNextMDString = [&](StringRef Str) {
73919ef4fadSMehdi Amini           MDStringRef.push_back(Str);
74019ef4fadSMehdi Amini         };
74119ef4fadSMehdi Amini         if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
742c55cf4afSBill Wendling           return std::move(Err);
74319ef4fadSMehdi Amini         break;
74419ef4fadSMehdi Amini       }
74519ef4fadSMehdi Amini       case bitc::METADATA_INDEX_OFFSET: {
74619ef4fadSMehdi Amini         // This is the offset to the index, when we see this we skip all the
74719ef4fadSMehdi Amini         // records and load only an index to these.
7480e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
749c55cf4afSBill Wendling           return std::move(Err);
75019ef4fadSMehdi Amini         Record.clear();
7510e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7520e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7530e828958SJF Bastien           ;
7540e828958SJF Bastien         else
7550e828958SJF Bastien           return MaybeRecord.takeError();
75619ef4fadSMehdi Amini         if (Record.size() != 2)
75719ef4fadSMehdi Amini           return error("Invalid record");
75819ef4fadSMehdi Amini         auto Offset = Record[0] + (Record[1] << 32);
75919ef4fadSMehdi Amini         auto BeginPos = IndexCursor.GetCurrentBitNo();
7600e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
761c55cf4afSBill Wendling           return std::move(Err);
7620e828958SJF Bastien         Expected<BitstreamEntry> MaybeEntry =
7630e828958SJF Bastien             IndexCursor.advanceSkippingSubblocks(
76419ef4fadSMehdi Amini                 BitstreamCursor::AF_DontPopBlockAtEnd);
7650e828958SJF Bastien         if (!MaybeEntry)
7660e828958SJF Bastien           return MaybeEntry.takeError();
7670e828958SJF Bastien         Entry = MaybeEntry.get();
76819ef4fadSMehdi Amini         assert(Entry.Kind == BitstreamEntry::Record &&
76919ef4fadSMehdi Amini                "Corrupted bitcode: Expected `Record` when trying to find the "
77019ef4fadSMehdi Amini                "Metadata index");
77119ef4fadSMehdi Amini         Record.clear();
7720e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7730e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7740e828958SJF Bastien           assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7750e828958SJF Bastien                  "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7760e828958SJF Bastien                  "find the Metadata index");
7770e828958SJF Bastien         else
7780e828958SJF Bastien           return MaybeCode.takeError();
77919ef4fadSMehdi Amini         // Delta unpack
78019ef4fadSMehdi Amini         auto CurrentValue = BeginPos;
78119ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.reserve(Record.size());
78219ef4fadSMehdi Amini         for (auto &Elt : Record) {
78319ef4fadSMehdi Amini           CurrentValue += Elt;
78419ef4fadSMehdi Amini           GlobalMetadataBitPosIndex.push_back(CurrentValue);
78519ef4fadSMehdi Amini         }
78619ef4fadSMehdi Amini         break;
78719ef4fadSMehdi Amini       }
78819ef4fadSMehdi Amini       case bitc::METADATA_INDEX:
78919ef4fadSMehdi Amini         // We don't expect to get there, the Index is loaded when we encounter
79019ef4fadSMehdi Amini         // the offset.
79119ef4fadSMehdi Amini         return error("Corrupted Metadata block");
79219ef4fadSMehdi Amini       case bitc::METADATA_NAME: {
79319ef4fadSMehdi Amini         // Named metadata need to be materialized now and aren't deferred.
7940e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
795c55cf4afSBill Wendling           return std::move(Err);
79619ef4fadSMehdi Amini         Record.clear();
7970e828958SJF Bastien 
7980e828958SJF Bastien         unsigned Code;
7990e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
8000e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record)) {
8010e828958SJF Bastien           Code = MaybeCode.get();
80219ef4fadSMehdi Amini           assert(Code == bitc::METADATA_NAME);
8030e828958SJF Bastien         } else
8040e828958SJF Bastien           return MaybeCode.takeError();
80519ef4fadSMehdi Amini 
80619ef4fadSMehdi Amini         // Read name of the named metadata.
80719ef4fadSMehdi Amini         SmallString<8> Name(Record.begin(), Record.end());
8080e828958SJF Bastien         if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
8090e828958SJF Bastien           Code = MaybeCode.get();
8100e828958SJF Bastien         else
8110e828958SJF Bastien           return MaybeCode.takeError();
81219ef4fadSMehdi Amini 
81319ef4fadSMehdi Amini         // Named Metadata comes in two parts, we expect the name to be followed
81419ef4fadSMehdi Amini         // by the node
81519ef4fadSMehdi Amini         Record.clear();
8160e828958SJF Bastien         if (Expected<unsigned> MaybeNextBitCode =
8170e828958SJF Bastien                 IndexCursor.readRecord(Code, Record))
8180e828958SJF Bastien           assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8190e828958SJF Bastien         else
8200e828958SJF Bastien           return MaybeNextBitCode.takeError();
82119ef4fadSMehdi Amini 
82219ef4fadSMehdi Amini         // Read named metadata elements.
82319ef4fadSMehdi Amini         unsigned Size = Record.size();
82419ef4fadSMehdi Amini         NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
82519ef4fadSMehdi Amini         for (unsigned i = 0; i != Size; ++i) {
82619ef4fadSMehdi Amini           // FIXME: We could use a placeholder here, however NamedMDNode are
82719ef4fadSMehdi Amini           // taking MDNode as operand and not using the Metadata infrastructure.
82819ef4fadSMehdi Amini           // It is acknowledged by 'TODO: Inherit from Metadata' in the
82919ef4fadSMehdi Amini           // NamedMDNode class definition.
83019ef4fadSMehdi Amini           MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
831f3d2453dSTeresa Johnson           assert(MD && "Invalid metadata: expect fwd ref to MDNode");
83219ef4fadSMehdi Amini           NMD->addOperand(MD);
83319ef4fadSMehdi Amini         }
83419ef4fadSMehdi Amini         break;
83519ef4fadSMehdi Amini       }
83619ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
837c27ab339STeresa Johnson         if (!GlobalDeclAttachmentPos)
838c27ab339STeresa Johnson           GlobalDeclAttachmentPos = SavedPos;
839c27ab339STeresa Johnson #ifndef NDEBUG
840c27ab339STeresa Johnson         NumGlobalDeclAttachSkipped++;
841c27ab339STeresa Johnson #endif
84219ef4fadSMehdi Amini         break;
84319ef4fadSMehdi Amini       }
84419ef4fadSMehdi Amini       case bitc::METADATA_KIND:
84519ef4fadSMehdi Amini       case bitc::METADATA_STRING_OLD:
84619ef4fadSMehdi Amini       case bitc::METADATA_OLD_FN_NODE:
84719ef4fadSMehdi Amini       case bitc::METADATA_OLD_NODE:
84819ef4fadSMehdi Amini       case bitc::METADATA_VALUE:
84919ef4fadSMehdi Amini       case bitc::METADATA_DISTINCT_NODE:
85019ef4fadSMehdi Amini       case bitc::METADATA_NODE:
85119ef4fadSMehdi Amini       case bitc::METADATA_LOCATION:
85219ef4fadSMehdi Amini       case bitc::METADATA_GENERIC_DEBUG:
85319ef4fadSMehdi Amini       case bitc::METADATA_SUBRANGE:
85419ef4fadSMehdi Amini       case bitc::METADATA_ENUMERATOR:
85519ef4fadSMehdi Amini       case bitc::METADATA_BASIC_TYPE:
856f91d18eaSSourabh Singh Tomar       case bitc::METADATA_STRING_TYPE:
85719ef4fadSMehdi Amini       case bitc::METADATA_DERIVED_TYPE:
85819ef4fadSMehdi Amini       case bitc::METADATA_COMPOSITE_TYPE:
85919ef4fadSMehdi Amini       case bitc::METADATA_SUBROUTINE_TYPE:
86019ef4fadSMehdi Amini       case bitc::METADATA_MODULE:
86119ef4fadSMehdi Amini       case bitc::METADATA_FILE:
86219ef4fadSMehdi Amini       case bitc::METADATA_COMPILE_UNIT:
86319ef4fadSMehdi Amini       case bitc::METADATA_SUBPROGRAM:
86419ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK:
86519ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK_FILE:
86619ef4fadSMehdi Amini       case bitc::METADATA_NAMESPACE:
8676ed5706aSAdrian Prantl       case bitc::METADATA_COMMON_BLOCK:
86819ef4fadSMehdi Amini       case bitc::METADATA_MACRO:
86919ef4fadSMehdi Amini       case bitc::METADATA_MACRO_FILE:
87019ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_TYPE:
87119ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_VALUE:
87219ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR:
87319ef4fadSMehdi Amini       case bitc::METADATA_LOCAL_VAR:
8742c864551SShiva Chen       case bitc::METADATA_LABEL:
87519ef4fadSMehdi Amini       case bitc::METADATA_EXPRESSION:
87619ef4fadSMehdi Amini       case bitc::METADATA_OBJC_PROPERTY:
87719ef4fadSMehdi Amini       case bitc::METADATA_IMPORTED_ENTITY:
87819ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR_EXPR:
879a6dd01afSAlok Kumar Sharma       case bitc::METADATA_GENERIC_SUBRANGE:
88019ef4fadSMehdi Amini         // We don't expect to see any of these, if we see one, give up on
88119ef4fadSMehdi Amini         // lazy-loading and fallback.
88219ef4fadSMehdi Amini         MDStringRef.clear();
88319ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.clear();
88419ef4fadSMehdi Amini         return false;
88519ef4fadSMehdi Amini       }
88619ef4fadSMehdi Amini       break;
88719ef4fadSMehdi Amini     }
88819ef4fadSMehdi Amini     }
88919ef4fadSMehdi Amini   }
89019ef4fadSMehdi Amini }
89119ef4fadSMehdi Amini 
892c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index.
893c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be
894c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying
895c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index
896c27ab339STeresa Johnson // instead of creating temporaries.
897c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
898c27ab339STeresa Johnson   // Nothing to do if we didn't find any of these metadata records.
899c27ab339STeresa Johnson   if (!GlobalDeclAttachmentPos)
900c27ab339STeresa Johnson     return true;
901c27ab339STeresa Johnson   // Use a temporary cursor so that we don't mess up the main Stream cursor or
902c27ab339STeresa Johnson   // the lazy loading IndexCursor (which holds the necessary abbrev ids).
903c27ab339STeresa Johnson   BitstreamCursor TempCursor = Stream;
904c27ab339STeresa Johnson   SmallVector<uint64_t, 64> Record;
905c27ab339STeresa Johnson   // Jump to the position before the first global decl attachment, so we can
906c27ab339STeresa Johnson   // scan for the first BitstreamEntry record.
907c27ab339STeresa Johnson   if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
908c27ab339STeresa Johnson     return std::move(Err);
909c27ab339STeresa Johnson   while (true) {
910b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
911b12a864cSDuncan P. N. Exon Smith     if (Error E =
912b12a864cSDuncan P. N. Exon Smith             TempCursor
913b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
914b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
915b12a864cSDuncan P. N. Exon Smith       return std::move(E);
916c27ab339STeresa Johnson 
917c27ab339STeresa Johnson     switch (Entry.Kind) {
918c27ab339STeresa Johnson     case BitstreamEntry::SubBlock: // Handled for us already.
919c27ab339STeresa Johnson     case BitstreamEntry::Error:
920c27ab339STeresa Johnson       return error("Malformed block");
921c27ab339STeresa Johnson     case BitstreamEntry::EndBlock:
92295875d24SZarko Todorovski       // Check that we parsed them all.
923c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
924c27ab339STeresa Johnson       return true;
925c27ab339STeresa Johnson     case BitstreamEntry::Record:
926c27ab339STeresa Johnson       break;
927c27ab339STeresa Johnson     }
928c27ab339STeresa Johnson     uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
929c27ab339STeresa Johnson     Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
930c27ab339STeresa Johnson     if (!MaybeCode)
931c27ab339STeresa Johnson       return MaybeCode.takeError();
932c27ab339STeresa Johnson     if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
933c27ab339STeresa Johnson       // Anything other than a global decl attachment signals the end of
93495875d24SZarko Todorovski       // these records. Check that we parsed them all.
935c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
936c27ab339STeresa Johnson       return true;
937c27ab339STeresa Johnson     }
938c27ab339STeresa Johnson #ifndef NDEBUG
939c27ab339STeresa Johnson     NumGlobalDeclAttachParsed++;
940c27ab339STeresa Johnson #endif
941c27ab339STeresa Johnson     // FIXME: we need to do this early because we don't materialize global
942c27ab339STeresa Johnson     // value explicitly.
943c27ab339STeresa Johnson     if (Error Err = TempCursor.JumpToBit(CurrentPos))
944c27ab339STeresa Johnson       return std::move(Err);
945c27ab339STeresa Johnson     Record.clear();
946c27ab339STeresa Johnson     if (Expected<unsigned> MaybeRecord =
947c27ab339STeresa Johnson             TempCursor.readRecord(Entry.ID, Record))
948c27ab339STeresa Johnson       ;
949c27ab339STeresa Johnson     else
950c27ab339STeresa Johnson       return MaybeRecord.takeError();
951c27ab339STeresa Johnson     if (Record.size() % 2 == 0)
952c27ab339STeresa Johnson       return error("Invalid record");
953c27ab339STeresa Johnson     unsigned ValueID = Record[0];
954c27ab339STeresa Johnson     if (ValueID >= ValueList.size())
955c27ab339STeresa Johnson       return error("Invalid record");
956c27ab339STeresa Johnson     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
957c27ab339STeresa Johnson       // Need to save and restore the current position since
958c27ab339STeresa Johnson       // parseGlobalObjectAttachment will resolve all forward references which
959c27ab339STeresa Johnson       // would require parsing from locations stored in the index.
960c27ab339STeresa Johnson       CurrentPos = TempCursor.GetCurrentBitNo();
961c27ab339STeresa Johnson       if (Error Err = parseGlobalObjectAttachment(
962c27ab339STeresa Johnson               *GO, ArrayRef<uint64_t>(Record).slice(1)))
963c27ab339STeresa Johnson         return std::move(Err);
964c27ab339STeresa Johnson       if (Error Err = TempCursor.JumpToBit(CurrentPos))
965c27ab339STeresa Johnson         return std::move(Err);
966c27ab339STeresa Johnson     }
967c27ab339STeresa Johnson   }
968c27ab339STeresa Johnson }
969c27ab339STeresa Johnson 
970ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
971ef27db87SMehdi Amini /// module level metadata.
972ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
973ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
974ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
975ef27db87SMehdi Amini 
97619ef4fadSMehdi Amini   // Record the entry position so that we can jump back here and efficiently
97719ef4fadSMehdi Amini   // skip the whole block in case we lazy-load.
97819ef4fadSMehdi Amini   auto EntryPos = Stream.GetCurrentBitNo();
97919ef4fadSMehdi Amini 
9800e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9810e828958SJF Bastien     return Err;
982ef27db87SMehdi Amini 
983ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
984ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
9859f926f70SMehdi Amini 
98619ef4fadSMehdi Amini   // We lazy-load module-level metadata: we build an index for each record, and
98719ef4fadSMehdi Amini   // then load individual record as needed, starting with the named metadata.
98819ef4fadSMehdi Amini   if (ModuleLevel && IsImporting && MetadataList.empty() &&
98919ef4fadSMehdi Amini       !DisableLazyLoading) {
99042ef1990SMehdi Amini     auto SuccessOrErr = lazyLoadModuleMetadataBlock();
99119ef4fadSMehdi Amini     if (!SuccessOrErr)
99219ef4fadSMehdi Amini       return SuccessOrErr.takeError();
99319ef4fadSMehdi Amini     if (SuccessOrErr.get()) {
99419ef4fadSMehdi Amini       // An index was successfully created and we will be able to load metadata
99519ef4fadSMehdi Amini       // on-demand.
99619ef4fadSMehdi Amini       MetadataList.resize(MDStringRef.size() +
99719ef4fadSMehdi Amini                           GlobalMetadataBitPosIndex.size());
99819ef4fadSMehdi Amini 
999c27ab339STeresa Johnson       // Now that we have built the index, load the global decl attachments
1000c27ab339STeresa Johnson       // that were deferred during that process. This avoids creating
1001c27ab339STeresa Johnson       // temporaries.
1002c27ab339STeresa Johnson       SuccessOrErr = loadGlobalDeclAttachments();
1003c27ab339STeresa Johnson       if (!SuccessOrErr)
1004c27ab339STeresa Johnson         return SuccessOrErr.takeError();
1005c27ab339STeresa Johnson       assert(SuccessOrErr.get());
1006c27ab339STeresa Johnson 
100719ef4fadSMehdi Amini       // Reading the named metadata created forward references and/or
100819ef4fadSMehdi Amini       // placeholders, that we flush here.
100919ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
1010e37d3144SAdrian Prantl       upgradeDebugInfo();
101119ef4fadSMehdi Amini       // Return at the beginning of the block, since it is easy to skip it
101219ef4fadSMehdi Amini       // entirely from there.
101319ef4fadSMehdi Amini       Stream.ReadBlockEnd(); // Pop the abbrev block context.
10140e828958SJF Bastien       if (Error Err = IndexCursor.JumpToBit(EntryPos))
10150e828958SJF Bastien         return Err;
10160e828958SJF Bastien       if (Error Err = Stream.SkipBlock()) {
10170e828958SJF Bastien         // FIXME this drops the error on the floor, which
10180e828958SJF Bastien         // ThinLTO/X86/debuginfo-cu-import.ll relies on.
10190e828958SJF Bastien         consumeError(std::move(Err));
10200e828958SJF Bastien         return Error::success();
10210e828958SJF Bastien       }
102219ef4fadSMehdi Amini       return Error::success();
102319ef4fadSMehdi Amini     }
102419ef4fadSMehdi Amini     // Couldn't load an index, fallback to loading all the block "old-style".
102519ef4fadSMehdi Amini   }
102619ef4fadSMehdi Amini 
102719ef4fadSMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
102819ef4fadSMehdi Amini 
10299f926f70SMehdi Amini   // Read all the records.
10309f926f70SMehdi Amini   while (true) {
1031b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
1032b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1033b12a864cSDuncan P. N. Exon Smith       return E;
10349f926f70SMehdi Amini 
10359f926f70SMehdi Amini     switch (Entry.Kind) {
10369f926f70SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
10379f926f70SMehdi Amini     case BitstreamEntry::Error:
10389f926f70SMehdi Amini       return error("Malformed block");
10399f926f70SMehdi Amini     case BitstreamEntry::EndBlock:
104019ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
1041e37d3144SAdrian Prantl       upgradeDebugInfo();
10429f926f70SMehdi Amini       return Error::success();
10439f926f70SMehdi Amini     case BitstreamEntry::Record:
10449f926f70SMehdi Amini       // The interesting case.
10459f926f70SMehdi Amini       break;
10469f926f70SMehdi Amini     }
10479f926f70SMehdi Amini 
10489f926f70SMehdi Amini     // Read a record.
10499f926f70SMehdi Amini     Record.clear();
10509f926f70SMehdi Amini     StringRef Blob;
105119ef4fadSMehdi Amini     ++NumMDRecordLoaded;
10520e828958SJF Bastien     if (Expected<unsigned> MaybeCode =
10530e828958SJF Bastien             Stream.readRecord(Entry.ID, Record, &Blob)) {
10540e828958SJF Bastien       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
10550e828958SJF Bastien                                        Blob, NextMetadataNo))
10569f926f70SMehdi Amini         return Err;
10570e828958SJF Bastien     } else
10580e828958SJF Bastien       return MaybeCode.takeError();
10599f926f70SMehdi Amini   }
10609f926f70SMehdi Amini }
10619f926f70SMehdi Amini 
106219ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
106319ef4fadSMehdi Amini   ++NumMDStringLoaded;
106419ef4fadSMehdi Amini   if (Metadata *MD = MetadataList.lookup(ID))
106519ef4fadSMehdi Amini     return cast<MDString>(MD);
106619ef4fadSMehdi Amini   auto MDS = MDString::get(Context, MDStringRef[ID]);
106719ef4fadSMehdi Amini   MetadataList.assignValue(MDS, ID);
106819ef4fadSMehdi Amini   return MDS;
106919ef4fadSMehdi Amini }
107019ef4fadSMehdi Amini 
107119ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
107219ef4fadSMehdi Amini     unsigned ID, PlaceholderQueue &Placeholders) {
107319ef4fadSMehdi Amini   assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
107419ef4fadSMehdi Amini   assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
107519ef4fadSMehdi Amini   // Lookup first if the metadata hasn't already been loaded.
107619ef4fadSMehdi Amini   if (auto *MD = MetadataList.lookup(ID)) {
107787399997SSimon Pilgrim     auto *N = cast<MDNode>(MD);
107867d2cc1fSMehdi Amini     if (!N->isTemporary())
107967d2cc1fSMehdi Amini       return;
108019ef4fadSMehdi Amini   }
108119ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
108219ef4fadSMehdi Amini   StringRef Blob;
10830e828958SJF Bastien   if (Error Err = IndexCursor.JumpToBit(
10840e828958SJF Bastien           GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
10850e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed jumping: " +
108621661607SSimon Pilgrim                        Twine(toString(std::move(Err))));
1087b12a864cSDuncan P. N. Exon Smith   BitstreamEntry Entry;
1088b12a864cSDuncan P. N. Exon Smith   if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
10890e828958SJF Bastien     // FIXME this drops the error on the floor.
10900e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
1091b12a864cSDuncan P. N. Exon Smith                        Twine(toString(std::move(E))));
109219ef4fadSMehdi Amini   ++NumMDRecordLoaded;
10930e828958SJF Bastien   if (Expected<unsigned> MaybeCode =
10940e828958SJF Bastien           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10950e828958SJF Bastien     if (Error Err =
10960e828958SJF Bastien             parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10970e828958SJF Bastien       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
109821661607SSimon Pilgrim                          Twine(toString(std::move(Err))));
10990e828958SJF Bastien   } else
110021661607SSimon Pilgrim     report_fatal_error("Can't lazyload MD: " +
110121661607SSimon Pilgrim                        Twine(toString(MaybeCode.takeError())));
110219ef4fadSMehdi Amini }
110319ef4fadSMehdi Amini 
110419ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
110519ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
110619ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
110719ef4fadSMehdi Amini     PlaceholderQueue &Placeholders) {
110819ef4fadSMehdi Amini   DenseSet<unsigned> Temporaries;
11092aed0813SKazu Hirata   while (true) {
111019ef4fadSMehdi Amini     // Populate Temporaries with the placeholders that haven't been loaded yet.
111119ef4fadSMehdi Amini     Placeholders.getTemporaries(MetadataList, Temporaries);
111219ef4fadSMehdi Amini 
111319ef4fadSMehdi Amini     // If we don't have any temporary, or FwdReference, we're done!
111419ef4fadSMehdi Amini     if (Temporaries.empty() && !MetadataList.hasFwdRefs())
111519ef4fadSMehdi Amini       break;
111619ef4fadSMehdi Amini 
111719ef4fadSMehdi Amini     // First, load all the temporaries. This can add new placeholders or
111819ef4fadSMehdi Amini     // forward references.
111919ef4fadSMehdi Amini     for (auto ID : Temporaries)
112019ef4fadSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
112119ef4fadSMehdi Amini     Temporaries.clear();
112219ef4fadSMehdi Amini 
112319ef4fadSMehdi Amini     // Second, load the forward-references. This can also add new placeholders
112419ef4fadSMehdi Amini     // or forward references.
112519ef4fadSMehdi Amini     while (MetadataList.hasFwdRefs())
112619ef4fadSMehdi Amini       lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
112719ef4fadSMehdi Amini   }
112819ef4fadSMehdi Amini   // At this point we don't have any forward reference remaining, or temporary
112919ef4fadSMehdi Amini   // that haven't been loaded. We can safely drop RAUW support and mark cycles
113019ef4fadSMehdi Amini   // as resolved.
113119ef4fadSMehdi Amini   MetadataList.tryToResolveCycles();
113219ef4fadSMehdi Amini 
113319ef4fadSMehdi Amini   // Finally, everything is in place, we can replace the placeholders operands
113419ef4fadSMehdi Amini   // with the final node they refer to.
113519ef4fadSMehdi Amini   Placeholders.flush(MetadataList);
113619ef4fadSMehdi Amini }
113719ef4fadSMehdi Amini 
11389f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
11399f926f70SMehdi Amini     SmallVectorImpl<uint64_t> &Record, unsigned Code,
114019ef4fadSMehdi Amini     PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
11419f926f70SMehdi Amini 
11429f926f70SMehdi Amini   bool IsDistinct = false;
1143ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
114419ef4fadSMehdi Amini     if (ID < MDStringRef.size())
114519ef4fadSMehdi Amini       return lazyLoadOneMDString(ID);
114667d2cc1fSMehdi Amini     if (!IsDistinct) {
114767d2cc1fSMehdi Amini       if (auto *MD = MetadataList.lookup(ID))
114867d2cc1fSMehdi Amini         return MD;
114967d2cc1fSMehdi Amini       // If lazy-loading is enabled, we try recursively to load the operand
115067d2cc1fSMehdi Amini       // instead of creating a temporary.
115167d2cc1fSMehdi Amini       if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
115267d2cc1fSMehdi Amini         // Create a temporary for the node that is referencing the operand we
115367d2cc1fSMehdi Amini         // will lazy-load. It is needed before recursing in case there are
115467d2cc1fSMehdi Amini         // uniquing cycles.
115567d2cc1fSMehdi Amini         MetadataList.getMetadataFwdRef(NextMetadataNo);
115667d2cc1fSMehdi Amini         lazyLoadOneMetadata(ID, Placeholders);
115767d2cc1fSMehdi Amini         return MetadataList.lookup(ID);
115867d2cc1fSMehdi Amini       }
115967d2cc1fSMehdi Amini       // Return a temporary.
1160ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
116167d2cc1fSMehdi Amini     }
1162ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1163ef27db87SMehdi Amini       return MD;
1164ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
1165ef27db87SMehdi Amini   };
1166ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1167ef27db87SMehdi Amini     if (ID)
1168ef27db87SMehdi Amini       return getMD(ID - 1);
1169ef27db87SMehdi Amini     return nullptr;
1170ef27db87SMehdi Amini   };
1171ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1172ef27db87SMehdi Amini     if (ID)
1173ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
1174ef27db87SMehdi Amini     return nullptr;
1175ef27db87SMehdi Amini   };
1176ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
1177ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
1178ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
117919ef4fadSMehdi Amini     auto MDS = getMDOrNull(ID);
118019ef4fadSMehdi Amini     return cast_or_null<MDString>(MDS);
1181ef27db87SMehdi Amini   };
1182ef27db87SMehdi Amini 
1183ef27db87SMehdi Amini   // Support for old type refs.
1184ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
1185ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1186ef27db87SMehdi Amini   };
1187ef27db87SMehdi Amini 
1188ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
1189ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1190ef27db87SMehdi Amini 
1191ef27db87SMehdi Amini   switch (Code) {
1192ef27db87SMehdi Amini   default: // Default behavior: ignore.
1193ef27db87SMehdi Amini     break;
1194ef27db87SMehdi Amini   case bitc::METADATA_NAME: {
1195ef27db87SMehdi Amini     // Read name of the named metadata.
1196ef27db87SMehdi Amini     SmallString<8> Name(Record.begin(), Record.end());
1197ef27db87SMehdi Amini     Record.clear();
1198b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.ReadCode().moveInto(Code))
1199b12a864cSDuncan P. N. Exon Smith       return E;
1200ef27db87SMehdi Amini 
120119ef4fadSMehdi Amini     ++NumMDRecordLoaded;
12020e828958SJF Bastien     if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
12030e828958SJF Bastien       if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1204ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
12050e828958SJF Bastien     } else
12060e828958SJF Bastien       return MaybeNextBitCode.takeError();
1207ef27db87SMehdi Amini 
1208ef27db87SMehdi Amini     // Read named metadata elements.
1209ef27db87SMehdi Amini     unsigned Size = Record.size();
1210ef27db87SMehdi Amini     NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1211ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; ++i) {
1212ef27db87SMehdi Amini       MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1213ef27db87SMehdi Amini       if (!MD)
1214f3d2453dSTeresa Johnson         return error("Invalid named metadata: expect fwd ref to MDNode");
1215ef27db87SMehdi Amini       NMD->addOperand(MD);
1216ef27db87SMehdi Amini     }
1217ef27db87SMehdi Amini     break;
1218ef27db87SMehdi Amini   }
1219ef27db87SMehdi Amini   case bitc::METADATA_OLD_FN_NODE: {
12204abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1221ef27db87SMehdi Amini     // This is a LocalAsMetadata record, the only type of function-local
1222ef27db87SMehdi Amini     // metadata.
1223ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1224ef27db87SMehdi Amini       return error("Invalid record");
1225ef27db87SMehdi Amini 
1226ef27db87SMehdi Amini     // If this isn't a LocalAsMetadata record, we're dropping it.  This used
1227ef27db87SMehdi Amini     // to be legal, but there's no upgrade path.
1228ef27db87SMehdi Amini     auto dropRecord = [&] {
1229c05c9db3SIvan Krasin       MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1230c05c9db3SIvan Krasin       NextMetadataNo++;
1231ef27db87SMehdi Amini     };
1232ef27db87SMehdi Amini     if (Record.size() != 2) {
1233ef27db87SMehdi Amini       dropRecord();
1234ef27db87SMehdi Amini       break;
1235ef27db87SMehdi Amini     }
1236ef27db87SMehdi Amini 
1237ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1238ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1239ef27db87SMehdi Amini       dropRecord();
1240ef27db87SMehdi Amini       break;
1241ef27db87SMehdi Amini     }
1242ef27db87SMehdi Amini 
1243ef27db87SMehdi Amini     MetadataList.assignValue(
1244ef27db87SMehdi Amini         LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1245c05c9db3SIvan Krasin         NextMetadataNo);
1246c05c9db3SIvan Krasin     NextMetadataNo++;
1247ef27db87SMehdi Amini     break;
1248ef27db87SMehdi Amini   }
1249ef27db87SMehdi Amini   case bitc::METADATA_OLD_NODE: {
12504abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1251ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1252ef27db87SMehdi Amini       return error("Invalid record");
1253ef27db87SMehdi Amini 
1254ef27db87SMehdi Amini     unsigned Size = Record.size();
1255ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1256ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; i += 2) {
1257ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[i]);
1258ef27db87SMehdi Amini       if (!Ty)
1259ef27db87SMehdi Amini         return error("Invalid record");
1260ef27db87SMehdi Amini       if (Ty->isMetadataTy())
1261ef27db87SMehdi Amini         Elts.push_back(getMD(Record[i + 1]));
1262ef27db87SMehdi Amini       else if (!Ty->isVoidTy()) {
1263ef27db87SMehdi Amini         auto *MD =
1264ef27db87SMehdi Amini             ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1265ef27db87SMehdi Amini         assert(isa<ConstantAsMetadata>(MD) &&
1266ef27db87SMehdi Amini                "Expected non-function-local metadata");
1267ef27db87SMehdi Amini         Elts.push_back(MD);
1268ef27db87SMehdi Amini       } else
1269ef27db87SMehdi Amini         Elts.push_back(nullptr);
1270ef27db87SMehdi Amini     }
1271c05c9db3SIvan Krasin     MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1272c05c9db3SIvan Krasin     NextMetadataNo++;
1273ef27db87SMehdi Amini     break;
1274ef27db87SMehdi Amini   }
1275ef27db87SMehdi Amini   case bitc::METADATA_VALUE: {
1276ef27db87SMehdi Amini     if (Record.size() != 2)
1277ef27db87SMehdi Amini       return error("Invalid record");
1278ef27db87SMehdi Amini 
1279ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1280ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy())
1281ef27db87SMehdi Amini       return error("Invalid record");
1282ef27db87SMehdi Amini 
1283ef27db87SMehdi Amini     MetadataList.assignValue(
1284ef27db87SMehdi Amini         ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1285c05c9db3SIvan Krasin         NextMetadataNo);
1286c05c9db3SIvan Krasin     NextMetadataNo++;
1287ef27db87SMehdi Amini     break;
1288ef27db87SMehdi Amini   }
1289ef27db87SMehdi Amini   case bitc::METADATA_DISTINCT_NODE:
1290ef27db87SMehdi Amini     IsDistinct = true;
1291ef27db87SMehdi Amini     LLVM_FALLTHROUGH;
1292ef27db87SMehdi Amini   case bitc::METADATA_NODE: {
1293ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1294ef27db87SMehdi Amini     Elts.reserve(Record.size());
1295ef27db87SMehdi Amini     for (unsigned ID : Record)
1296ef27db87SMehdi Amini       Elts.push_back(getMDOrNull(ID));
1297ef27db87SMehdi Amini     MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1298ef27db87SMehdi Amini                                         : MDNode::get(Context, Elts),
1299c05c9db3SIvan Krasin                              NextMetadataNo);
1300c05c9db3SIvan Krasin     NextMetadataNo++;
1301ef27db87SMehdi Amini     break;
1302ef27db87SMehdi Amini   }
1303ef27db87SMehdi Amini   case bitc::METADATA_LOCATION: {
1304386ad01cSVedant Kumar     if (Record.size() != 5 && Record.size() != 6)
1305ef27db87SMehdi Amini       return error("Invalid record");
1306ef27db87SMehdi Amini 
1307ef27db87SMehdi Amini     IsDistinct = Record[0];
1308ef27db87SMehdi Amini     unsigned Line = Record[1];
1309ef27db87SMehdi Amini     unsigned Column = Record[2];
1310ef27db87SMehdi Amini     Metadata *Scope = getMD(Record[3]);
1311ef27db87SMehdi Amini     Metadata *InlinedAt = getMDOrNull(Record[4]);
1312386ad01cSVedant Kumar     bool ImplicitCode = Record.size() == 6 && Record[5];
1313ef27db87SMehdi Amini     MetadataList.assignValue(
1314eb7f6020SCalixte Denizet         GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1315eb7f6020SCalixte Denizet                                      ImplicitCode)),
1316c05c9db3SIvan Krasin         NextMetadataNo);
1317c05c9db3SIvan Krasin     NextMetadataNo++;
1318ef27db87SMehdi Amini     break;
1319ef27db87SMehdi Amini   }
1320ef27db87SMehdi Amini   case bitc::METADATA_GENERIC_DEBUG: {
1321ef27db87SMehdi Amini     if (Record.size() < 4)
1322ef27db87SMehdi Amini       return error("Invalid record");
1323ef27db87SMehdi Amini 
1324ef27db87SMehdi Amini     IsDistinct = Record[0];
1325ef27db87SMehdi Amini     unsigned Tag = Record[1];
1326ef27db87SMehdi Amini     unsigned Version = Record[2];
1327ef27db87SMehdi Amini 
1328ef27db87SMehdi Amini     if (Tag >= 1u << 16 || Version != 0)
1329ef27db87SMehdi Amini       return error("Invalid record");
1330ef27db87SMehdi Amini 
1331ef27db87SMehdi Amini     auto *Header = getMDString(Record[3]);
1332ef27db87SMehdi Amini     SmallVector<Metadata *, 8> DwarfOps;
1333ef27db87SMehdi Amini     for (unsigned I = 4, E = Record.size(); I != E; ++I)
1334ef27db87SMehdi Amini       DwarfOps.push_back(getMDOrNull(Record[I]));
1335ef27db87SMehdi Amini     MetadataList.assignValue(
1336ef27db87SMehdi Amini         GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1337c05c9db3SIvan Krasin         NextMetadataNo);
1338c05c9db3SIvan Krasin     NextMetadataNo++;
1339ef27db87SMehdi Amini     break;
1340ef27db87SMehdi Amini   }
1341ef27db87SMehdi Amini   case bitc::METADATA_SUBRANGE: {
1342fdf40917SSander de Smalen     Metadata *Val = nullptr;
1343fdf40917SSander de Smalen     // Operand 'count' is interpreted as:
1344fdf40917SSander de Smalen     // - Signed integer (version 0)
1345fdf40917SSander de Smalen     // - Metadata node  (version 1)
1346d20bf5a7SAlok Kumar Sharma     // Operand 'lowerBound' is interpreted as:
1347d20bf5a7SAlok Kumar Sharma     // - Signed integer (version 0 and 1)
1348d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1349d20bf5a7SAlok Kumar Sharma     // Operands 'upperBound' and 'stride' are interpreted as:
1350d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1351fdf40917SSander de Smalen     switch (Record[0] >> 1) {
1352fdf40917SSander de Smalen     case 0:
1353fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange,
1354d20bf5a7SAlok Kumar Sharma                             (Context, Record[1], unrotateSign(Record[2])));
1355fdf40917SSander de Smalen       break;
1356fdf40917SSander de Smalen     case 1:
1357fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1358d20bf5a7SAlok Kumar Sharma                                          unrotateSign(Record[2])));
1359d20bf5a7SAlok Kumar Sharma       break;
1360d20bf5a7SAlok Kumar Sharma     case 2:
1361d20bf5a7SAlok Kumar Sharma       Val = GET_OR_DISTINCT(
1362d20bf5a7SAlok Kumar Sharma           DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1363d20bf5a7SAlok Kumar Sharma                        getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1364fdf40917SSander de Smalen       break;
1365fdf40917SSander de Smalen     default:
1366fdf40917SSander de Smalen       return error("Invalid record: Unsupported version of DISubrange");
1367fdf40917SSander de Smalen     }
1368ef27db87SMehdi Amini 
1369fdf40917SSander de Smalen     MetadataList.assignValue(Val, NextMetadataNo);
1370fdf40917SSander de Smalen     IsDistinct = Record[0] & 1;
1371c05c9db3SIvan Krasin     NextMetadataNo++;
1372ef27db87SMehdi Amini     break;
1373ef27db87SMehdi Amini   }
1374a6dd01afSAlok Kumar Sharma   case bitc::METADATA_GENERIC_SUBRANGE: {
1375a6dd01afSAlok Kumar Sharma     Metadata *Val = nullptr;
1376a6dd01afSAlok Kumar Sharma     Val = GET_OR_DISTINCT(DIGenericSubrange,
1377a6dd01afSAlok Kumar Sharma                           (Context, getMDOrNull(Record[1]),
1378a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1379a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[4])));
1380a6dd01afSAlok Kumar Sharma 
1381a6dd01afSAlok Kumar Sharma     MetadataList.assignValue(Val, NextMetadataNo);
1382a6dd01afSAlok Kumar Sharma     IsDistinct = Record[0] & 1;
1383a6dd01afSAlok Kumar Sharma     NextMetadataNo++;
1384a6dd01afSAlok Kumar Sharma     break;
1385a6dd01afSAlok Kumar Sharma   }
1386ef27db87SMehdi Amini   case bitc::METADATA_ENUMERATOR: {
1387aad3d578SLemonBoy     if (Record.size() < 3)
1388ef27db87SMehdi Amini       return error("Invalid record");
1389ef27db87SMehdi Amini 
139008dc66efSMomchil Velikov     IsDistinct = Record[0] & 1;
139108dc66efSMomchil Velikov     bool IsUnsigned = Record[0] & 2;
1392aad3d578SLemonBoy     bool IsBigInt = Record[0] & 4;
1393aad3d578SLemonBoy     APInt Value;
1394aad3d578SLemonBoy 
1395aad3d578SLemonBoy     if (IsBigInt) {
1396aad3d578SLemonBoy       const uint64_t BitWidth = Record[1];
1397aad3d578SLemonBoy       const size_t NumWords = Record.size() - 3;
1398aad3d578SLemonBoy       Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1399aad3d578SLemonBoy     } else
1400aad3d578SLemonBoy       Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1401aad3d578SLemonBoy 
1402ef27db87SMehdi Amini     MetadataList.assignValue(
1403aad3d578SLemonBoy         GET_OR_DISTINCT(DIEnumerator,
1404aad3d578SLemonBoy                         (Context, Value, IsUnsigned, getMDString(Record[2]))),
1405c05c9db3SIvan Krasin         NextMetadataNo);
1406c05c9db3SIvan Krasin     NextMetadataNo++;
1407ef27db87SMehdi Amini     break;
1408ef27db87SMehdi Amini   }
1409ef27db87SMehdi Amini   case bitc::METADATA_BASIC_TYPE: {
141055f42629SAdrian Prantl     if (Record.size() < 6 || Record.size() > 7)
1411ef27db87SMehdi Amini       return error("Invalid record");
1412ef27db87SMehdi Amini 
1413ef27db87SMehdi Amini     IsDistinct = Record[0];
1414665b4138SLuís Ferreira     DINode::DIFlags Flags = (Record.size() > 6)
1415665b4138SLuís Ferreira                                 ? static_cast<DINode::DIFlags>(Record[6])
1416665b4138SLuís Ferreira                                 : DINode::FlagZero;
141755f42629SAdrian Prantl 
1418ef27db87SMehdi Amini     MetadataList.assignValue(
1419ef27db87SMehdi Amini         GET_OR_DISTINCT(DIBasicType,
14209f926f70SMehdi Amini                         (Context, Record[1], getMDString(Record[2]), Record[3],
142155f42629SAdrian Prantl                          Record[4], Record[5], Flags)),
1422c05c9db3SIvan Krasin         NextMetadataNo);
1423c05c9db3SIvan Krasin     NextMetadataNo++;
1424ef27db87SMehdi Amini     break;
1425ef27db87SMehdi Amini   }
1426f91d18eaSSourabh Singh Tomar   case bitc::METADATA_STRING_TYPE: {
142728bfa57aSChih-Ping Chen     if (Record.size() > 9 || Record.size() < 8)
1428f91d18eaSSourabh Singh Tomar       return error("Invalid record");
1429f91d18eaSSourabh Singh Tomar 
1430f91d18eaSSourabh Singh Tomar     IsDistinct = Record[0];
143128bfa57aSChih-Ping Chen     bool SizeIs8 = Record.size() == 8;
143228bfa57aSChih-Ping Chen     // StringLocationExp (i.e. Record[5]) is added at a later time
143328bfa57aSChih-Ping Chen     // than the other fields. The code here enables backward compatibility.
143428bfa57aSChih-Ping Chen     Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
143528bfa57aSChih-Ping Chen     unsigned Offset = SizeIs8 ? 5 : 6;
1436f91d18eaSSourabh Singh Tomar     MetadataList.assignValue(
1437f91d18eaSSourabh Singh Tomar         GET_OR_DISTINCT(DIStringType,
1438f91d18eaSSourabh Singh Tomar                         (Context, Record[1], getMDString(Record[2]),
1439f91d18eaSSourabh Singh Tomar                          getMDOrNull(Record[3]), getMDOrNull(Record[4]),
144028bfa57aSChih-Ping Chen                          StringLocationExp, Record[Offset], Record[Offset + 1],
144128bfa57aSChih-Ping Chen                          Record[Offset + 2])),
1442f91d18eaSSourabh Singh Tomar         NextMetadataNo);
1443f91d18eaSSourabh Singh Tomar     NextMetadataNo++;
1444f91d18eaSSourabh Singh Tomar     break;
1445f91d18eaSSourabh Singh Tomar   }
1446ef27db87SMehdi Amini   case bitc::METADATA_DERIVED_TYPE: {
1447430e2238SYonghong Song     if (Record.size() < 12 || Record.size() > 14)
1448ef27db87SMehdi Amini       return error("Invalid record");
1449ef27db87SMehdi Amini 
1450d5561e0aSKonstantin Zhuravlyov     // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1451d5561e0aSKonstantin Zhuravlyov     // that there is no DWARF address space associated with DIDerivedType.
1452d5561e0aSKonstantin Zhuravlyov     Optional<unsigned> DWARFAddressSpace;
1453d5561e0aSKonstantin Zhuravlyov     if (Record.size() > 12 && Record[12])
1454d5561e0aSKonstantin Zhuravlyov       DWARFAddressSpace = Record[12] - 1;
1455d5561e0aSKonstantin Zhuravlyov 
1456430e2238SYonghong Song     Metadata *Annotations = nullptr;
1457430e2238SYonghong Song     if (Record.size() > 13 && Record[13])
1458430e2238SYonghong Song       Annotations = getMDOrNull(Record[13]);
1459430e2238SYonghong Song 
1460ef27db87SMehdi Amini     IsDistinct = Record[0];
1461ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1462ef27db87SMehdi Amini     MetadataList.assignValue(
1463ef27db87SMehdi Amini         GET_OR_DISTINCT(DIDerivedType,
1464ef27db87SMehdi Amini                         (Context, Record[1], getMDString(Record[2]),
1465ef27db87SMehdi Amini                          getMDOrNull(Record[3]), Record[4],
1466ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5]),
1467ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1468d5561e0aSKonstantin Zhuravlyov                          Record[9], DWARFAddressSpace, Flags,
1469430e2238SYonghong Song                          getDITypeRefOrNull(Record[11]), Annotations)),
1470c05c9db3SIvan Krasin         NextMetadataNo);
1471c05c9db3SIvan Krasin     NextMetadataNo++;
1472ef27db87SMehdi Amini     break;
1473ef27db87SMehdi Amini   }
1474ef27db87SMehdi Amini   case bitc::METADATA_COMPOSITE_TYPE: {
14750b32dca1SYonghong Song     if (Record.size() < 16 || Record.size() > 22)
1476ef27db87SMehdi Amini       return error("Invalid record");
1477ef27db87SMehdi Amini 
1478ef27db87SMehdi Amini     // If we have a UUID and this is not a forward declaration, lookup the
1479ef27db87SMehdi Amini     // mapping.
1480ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1481ef27db87SMehdi Amini     bool IsNotUsedInTypeRef = Record[0] >= 2;
1482ef27db87SMehdi Amini     unsigned Tag = Record[1];
1483ef27db87SMehdi Amini     MDString *Name = getMDString(Record[2]);
1484ef27db87SMehdi Amini     Metadata *File = getMDOrNull(Record[3]);
1485ef27db87SMehdi Amini     unsigned Line = Record[4];
1486ef27db87SMehdi Amini     Metadata *Scope = getDITypeRefOrNull(Record[5]);
1487a61f5e37STeresa Johnson     Metadata *BaseType = nullptr;
1488ef27db87SMehdi Amini     uint64_t SizeInBits = Record[7];
1489ef27db87SMehdi Amini     if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1490ef27db87SMehdi Amini       return error("Alignment value is too large");
1491ef27db87SMehdi Amini     uint32_t AlignInBits = Record[8];
1492a61f5e37STeresa Johnson     uint64_t OffsetInBits = 0;
1493ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1494a61f5e37STeresa Johnson     Metadata *Elements = nullptr;
1495ef27db87SMehdi Amini     unsigned RuntimeLang = Record[12];
1496a61f5e37STeresa Johnson     Metadata *VTableHolder = nullptr;
1497a61f5e37STeresa Johnson     Metadata *TemplateParams = nullptr;
14988c59921cSAdrian Prantl     Metadata *Discriminator = nullptr;
14994042ada1SAlok Kumar Sharma     Metadata *DataLocation = nullptr;
15002d10258aSAlok Kumar Sharma     Metadata *Associated = nullptr;
15012d10258aSAlok Kumar Sharma     Metadata *Allocated = nullptr;
150296bd4d34SAlok Kumar Sharma     Metadata *Rank = nullptr;
15030b32dca1SYonghong Song     Metadata *Annotations = nullptr;
1504ef27db87SMehdi Amini     auto *Identifier = getMDString(Record[15]);
1505a61f5e37STeresa Johnson     // If this module is being parsed so that it can be ThinLTO imported
1506a61f5e37STeresa Johnson     // into another module, composite types only need to be imported
1507a61f5e37STeresa Johnson     // as type declarations (unless full type definitions requested).
1508a61f5e37STeresa Johnson     // Create type declarations up front to save memory. Also, buildODRType
1509a61f5e37STeresa Johnson     // handles the case where this is type ODRed with a definition needed
1510a61f5e37STeresa Johnson     // by the importing module, in which case the existing definition is
1511a61f5e37STeresa Johnson     // used.
15125a8dba5bSTeresa Johnson     if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1513a61f5e37STeresa Johnson         (Tag == dwarf::DW_TAG_enumeration_type ||
1514a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_class_type ||
1515a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_structure_type ||
1516a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_union_type)) {
1517a61f5e37STeresa Johnson       Flags = Flags | DINode::FlagFwdDecl;
1518a61f5e37STeresa Johnson     } else {
1519a61f5e37STeresa Johnson       BaseType = getDITypeRefOrNull(Record[6]);
1520a61f5e37STeresa Johnson       OffsetInBits = Record[9];
1521a61f5e37STeresa Johnson       Elements = getMDOrNull(Record[11]);
1522a61f5e37STeresa Johnson       VTableHolder = getDITypeRefOrNull(Record[13]);
1523a61f5e37STeresa Johnson       TemplateParams = getMDOrNull(Record[14]);
15248c59921cSAdrian Prantl       if (Record.size() > 16)
15258c59921cSAdrian Prantl         Discriminator = getMDOrNull(Record[16]);
15264042ada1SAlok Kumar Sharma       if (Record.size() > 17)
15274042ada1SAlok Kumar Sharma         DataLocation = getMDOrNull(Record[17]);
15282d10258aSAlok Kumar Sharma       if (Record.size() > 19) {
15292d10258aSAlok Kumar Sharma         Associated = getMDOrNull(Record[18]);
15302d10258aSAlok Kumar Sharma         Allocated = getMDOrNull(Record[19]);
15312d10258aSAlok Kumar Sharma       }
153296bd4d34SAlok Kumar Sharma       if (Record.size() > 20) {
153396bd4d34SAlok Kumar Sharma         Rank = getMDOrNull(Record[20]);
153496bd4d34SAlok Kumar Sharma       }
15350b32dca1SYonghong Song       if (Record.size() > 21) {
15360b32dca1SYonghong Song         Annotations = getMDOrNull(Record[21]);
15370b32dca1SYonghong Song       }
1538a61f5e37STeresa Johnson     }
1539ef27db87SMehdi Amini     DICompositeType *CT = nullptr;
1540ef27db87SMehdi Amini     if (Identifier)
1541ef27db87SMehdi Amini       CT = DICompositeType::buildODRType(
1542ef27db87SMehdi Amini           Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1543ef27db87SMehdi Amini           SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
15442d10258aSAlok Kumar Sharma           VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
15450b32dca1SYonghong Song           Allocated, Rank, Annotations);
1546ef27db87SMehdi Amini 
1547ef27db87SMehdi Amini     // Create a node if we didn't get a lazy ODR type.
1548ef27db87SMehdi Amini     if (!CT)
1549ef27db87SMehdi Amini       CT = GET_OR_DISTINCT(DICompositeType,
1550ef27db87SMehdi Amini                            (Context, Tag, Name, File, Line, Scope, BaseType,
1551ef27db87SMehdi Amini                             SizeInBits, AlignInBits, OffsetInBits, Flags,
15529f926f70SMehdi Amini                             Elements, RuntimeLang, VTableHolder, TemplateParams,
15532d10258aSAlok Kumar Sharma                             Identifier, Discriminator, DataLocation, Associated,
15540b32dca1SYonghong Song                             Allocated, Rank, Annotations));
1555ef27db87SMehdi Amini     if (!IsNotUsedInTypeRef && Identifier)
1556ef27db87SMehdi Amini       MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1557ef27db87SMehdi Amini 
1558c05c9db3SIvan Krasin     MetadataList.assignValue(CT, NextMetadataNo);
1559c05c9db3SIvan Krasin     NextMetadataNo++;
1560ef27db87SMehdi Amini     break;
1561ef27db87SMehdi Amini   }
1562ef27db87SMehdi Amini   case bitc::METADATA_SUBROUTINE_TYPE: {
1563ef27db87SMehdi Amini     if (Record.size() < 3 || Record.size() > 4)
1564ef27db87SMehdi Amini       return error("Invalid record");
1565ef27db87SMehdi Amini     bool IsOldTypeRefArray = Record[0] < 2;
1566ef27db87SMehdi Amini     unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1567ef27db87SMehdi Amini 
1568ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1569ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1570ef27db87SMehdi Amini     Metadata *Types = getMDOrNull(Record[2]);
1571ef27db87SMehdi Amini     if (LLVM_UNLIKELY(IsOldTypeRefArray))
1572ef27db87SMehdi Amini       Types = MetadataList.upgradeTypeRefArray(Types);
1573ef27db87SMehdi Amini 
1574ef27db87SMehdi Amini     MetadataList.assignValue(
1575ef27db87SMehdi Amini         GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1576c05c9db3SIvan Krasin         NextMetadataNo);
1577c05c9db3SIvan Krasin     NextMetadataNo++;
1578ef27db87SMehdi Amini     break;
1579ef27db87SMehdi Amini   }
1580ef27db87SMehdi Amini 
1581ef27db87SMehdi Amini   case bitc::METADATA_MODULE: {
15825f75dcf5SChih-Ping Chen     if (Record.size() < 5 || Record.size() > 9)
1583ef27db87SMehdi Amini       return error("Invalid record");
1584ef27db87SMehdi Amini 
15855f75dcf5SChih-Ping Chen     unsigned Offset = Record.size() >= 8 ? 2 : 1;
1586ef27db87SMehdi Amini     IsDistinct = Record[0];
1587ef27db87SMehdi Amini     MetadataList.assignValue(
1588e59744fdSSourabh Singh Tomar         GET_OR_DISTINCT(
1589e59744fdSSourabh Singh Tomar             DIModule,
15905f75dcf5SChih-Ping Chen             (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
1591e59744fdSSourabh Singh Tomar              getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1592e59744fdSSourabh Singh Tomar              getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1593e59744fdSSourabh Singh Tomar              getMDString(Record[4 + Offset]),
15945f75dcf5SChih-Ping Chen              Record.size() <= 7 ? 0 : Record[7],
15955f75dcf5SChih-Ping Chen              Record.size() <= 8 ? false : Record[8])),
1596c05c9db3SIvan Krasin         NextMetadataNo);
1597c05c9db3SIvan Krasin     NextMetadataNo++;
1598ef27db87SMehdi Amini     break;
1599ef27db87SMehdi Amini   }
1600ef27db87SMehdi Amini 
1601ef27db87SMehdi Amini   case bitc::METADATA_FILE: {
160216c7bdafSScott Linder     if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1603ef27db87SMehdi Amini       return error("Invalid record");
1604ef27db87SMehdi Amini 
1605ef27db87SMehdi Amini     IsDistinct = Record[0];
16067160384dSScott Linder     Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
16077160384dSScott Linder     // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
16087160384dSScott Linder     // is not present. This matches up with the old internal representation,
16097160384dSScott Linder     // and the old encoding for CSK_None in the ChecksumKind. The new
16107160384dSScott Linder     // representation reserves the value 0 in the ChecksumKind to continue to
16117160384dSScott Linder     // encode None in a backwards-compatible way.
161216c7bdafSScott Linder     if (Record.size() > 4 && Record[3] && Record[4])
16137160384dSScott Linder       Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
16147160384dSScott Linder                        getMDString(Record[4]));
1615ef27db87SMehdi Amini     MetadataList.assignValue(
16169f926f70SMehdi Amini         GET_OR_DISTINCT(
16177faeecc8SAmjad Aboud             DIFile,
161816c7bdafSScott Linder             (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
161916c7bdafSScott Linder              Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
162016c7bdafSScott Linder                                : None)),
1621c05c9db3SIvan Krasin         NextMetadataNo);
1622c05c9db3SIvan Krasin     NextMetadataNo++;
1623ef27db87SMehdi Amini     break;
1624ef27db87SMehdi Amini   }
1625ef27db87SMehdi Amini   case bitc::METADATA_COMPILE_UNIT: {
1626e4e7e447SAdrian Prantl     if (Record.size() < 14 || Record.size() > 22)
1627ef27db87SMehdi Amini       return error("Invalid record");
1628ef27db87SMehdi Amini 
1629ef27db87SMehdi Amini     // Ignore Record[0], which indicates whether this compile unit is
1630ef27db87SMehdi Amini     // distinct.  It's always distinct.
1631ef27db87SMehdi Amini     IsDistinct = true;
1632ef27db87SMehdi Amini     auto *CU = DICompileUnit::getDistinct(
1633ef27db87SMehdi Amini         Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1634ef27db87SMehdi Amini         Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1635ef27db87SMehdi Amini         Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1636ef27db87SMehdi Amini         getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1637ef27db87SMehdi Amini         Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1638ef27db87SMehdi Amini         Record.size() <= 14 ? 0 : Record[14],
16390944a8c2SDehao Chen         Record.size() <= 16 ? true : Record[16],
1640b52e2366SPeter Collingbourne         Record.size() <= 17 ? false : Record[17],
1641bb279116SDavid Blaikie         Record.size() <= 18 ? 0 : Record[18],
16422aed0813SKazu Hirata         Record.size() <= 19 ? false : Record[19],
1643e4e7e447SAdrian Prantl         Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1644e4e7e447SAdrian Prantl         Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1645ef27db87SMehdi Amini 
1646c05c9db3SIvan Krasin     MetadataList.assignValue(CU, NextMetadataNo);
1647c05c9db3SIvan Krasin     NextMetadataNo++;
1648ef27db87SMehdi Amini 
1649ef27db87SMehdi Amini     // Move the Upgrade the list of subprograms.
1650ef27db87SMehdi Amini     if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1651ef27db87SMehdi Amini       CUSubprograms.push_back({CU, SPs});
1652ef27db87SMehdi Amini     break;
1653ef27db87SMehdi Amini   }
1654ef27db87SMehdi Amini   case bitc::METADATA_SUBPROGRAM: {
16551d12b885SAdrian Prantl     if (Record.size() < 18 || Record.size() > 21)
1656ef27db87SMehdi Amini       return error("Invalid record");
1657ef27db87SMehdi Amini 
1658adcdc1bdSPaul Robinson     bool HasSPFlags = Record[0] & 4;
165938a61873SPetar Jovanovic 
166038a61873SPetar Jovanovic     DINode::DIFlags Flags;
166138a61873SPetar Jovanovic     DISubprogram::DISPFlags SPFlags;
166238a61873SPetar Jovanovic     if (!HasSPFlags)
166338a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
166438a61873SPetar Jovanovic     else {
166538a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11]);
166638a61873SPetar Jovanovic       SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
166738a61873SPetar Jovanovic     }
166838a61873SPetar Jovanovic 
166938a61873SPetar Jovanovic     // Support for old metadata when
167038a61873SPetar Jovanovic     // subprogram specific flags are placed in DIFlags.
167138a61873SPetar Jovanovic     const unsigned DIFlagMainSubprogram = 1 << 21;
167238a61873SPetar Jovanovic     bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
167338a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag)
167438a61873SPetar Jovanovic       // Remove old DIFlagMainSubprogram from DIFlags.
167538a61873SPetar Jovanovic       // Note: This assumes that any future use of bit 21 defaults to it
167638a61873SPetar Jovanovic       // being 0.
167738a61873SPetar Jovanovic       Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
167838a61873SPetar Jovanovic 
167938a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag && HasSPFlags)
168038a61873SPetar Jovanovic       SPFlags |= DISubprogram::SPFlagMainSubprogram;
168138a61873SPetar Jovanovic     else if (!HasSPFlags)
168238a61873SPetar Jovanovic       SPFlags = DISubprogram::toSPFlags(
1683adcdc1bdSPaul Robinson           /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
168438a61873SPetar Jovanovic           /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
1685435a5a36SKazu Hirata           /*IsMainSubprogram=*/HasOldMainSubprogramFlag);
1686adcdc1bdSPaul Robinson 
1687adcdc1bdSPaul Robinson     // All definitions should be distinct.
1688adcdc1bdSPaul Robinson     IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1689ef27db87SMehdi Amini     // Version 1 has a Function as Record[15].
1690ef27db87SMehdi Amini     // Version 2 has removed Record[15].
1691ef27db87SMehdi Amini     // Version 3 has the Unit as Record[15].
1692ef27db87SMehdi Amini     // Version 4 added thisAdjustment.
1693adcdc1bdSPaul Robinson     // Version 5 repacked flags into DISPFlags, changing many element numbers.
1694adcdc1bdSPaul Robinson     bool HasUnit = Record[0] & 2;
1695adcdc1bdSPaul Robinson     if (!HasSPFlags && HasUnit && Record.size() < 19)
1696ef27db87SMehdi Amini       return error("Invalid record");
1697adcdc1bdSPaul Robinson     if (HasSPFlags && !HasUnit)
1698adcdc1bdSPaul Robinson       return error("Invalid record");
1699adcdc1bdSPaul Robinson     // Accommodate older formats.
1700adcdc1bdSPaul Robinson     bool HasFn = false;
1701adcdc1bdSPaul Robinson     bool HasThisAdj = true;
1702adcdc1bdSPaul Robinson     bool HasThrownTypes = true;
1703d383df32SYonghong Song     bool HasAnnotations = false;
1704adcdc1bdSPaul Robinson     unsigned OffsetA = 0;
1705adcdc1bdSPaul Robinson     unsigned OffsetB = 0;
1706adcdc1bdSPaul Robinson     if (!HasSPFlags) {
1707adcdc1bdSPaul Robinson       OffsetA = 2;
1708adcdc1bdSPaul Robinson       OffsetB = 2;
1709adcdc1bdSPaul Robinson       if (Record.size() >= 19) {
1710adcdc1bdSPaul Robinson         HasFn = !HasUnit;
1711adcdc1bdSPaul Robinson         OffsetB++;
1712adcdc1bdSPaul Robinson       }
1713adcdc1bdSPaul Robinson       HasThisAdj = Record.size() >= 20;
1714adcdc1bdSPaul Robinson       HasThrownTypes = Record.size() >= 21;
1715d383df32SYonghong Song     } else {
1716d383df32SYonghong Song       HasAnnotations = Record.size() >= 19;
1717adcdc1bdSPaul Robinson     }
1718adcdc1bdSPaul Robinson     Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1719ef27db87SMehdi Amini     DISubprogram *SP = GET_OR_DISTINCT(
17201d12b885SAdrian Prantl         DISubprogram,
17211d12b885SAdrian Prantl         (Context,
1722ef27db87SMehdi Amini          getDITypeRefOrNull(Record[1]),           // scope
1723ef27db87SMehdi Amini          getMDString(Record[2]),                  // name
1724ef27db87SMehdi Amini          getMDString(Record[3]),                  // linkageName
1725ef27db87SMehdi Amini          getMDOrNull(Record[4]),                  // file
1726ef27db87SMehdi Amini          Record[5],                               // line
1727ef27db87SMehdi Amini          getMDOrNull(Record[6]),                  // type
1728adcdc1bdSPaul Robinson          Record[7 + OffsetA],                     // scopeLine
1729adcdc1bdSPaul Robinson          getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
1730adcdc1bdSPaul Robinson          Record[10 + OffsetA],                    // virtualIndex
1731adcdc1bdSPaul Robinson          HasThisAdj ? Record[16 + OffsetB] : 0,   // thisAdjustment
173238a61873SPetar Jovanovic          Flags,                                   // flags
1733cda54210SPaul Robinson          SPFlags,                                 // SPFlags
1734ef27db87SMehdi Amini          HasUnit ? CUorFn : nullptr,              // unit
1735adcdc1bdSPaul Robinson          getMDOrNull(Record[13 + OffsetB]),       // templateParams
1736adcdc1bdSPaul Robinson          getMDOrNull(Record[14 + OffsetB]),       // declaration
1737adcdc1bdSPaul Robinson          getMDOrNull(Record[15 + OffsetB]),       // retainedNodes
1738adcdc1bdSPaul Robinson          HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1739d383df32SYonghong Song                         : nullptr, // thrownTypes
1740d383df32SYonghong Song          HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1741d383df32SYonghong Song                         : nullptr // annotations
1742ef27db87SMehdi Amini          ));
1743c05c9db3SIvan Krasin     MetadataList.assignValue(SP, NextMetadataNo);
1744c05c9db3SIvan Krasin     NextMetadataNo++;
1745ef27db87SMehdi Amini 
1746ef27db87SMehdi Amini     // Upgrade sp->function mapping to function->sp mapping.
1747ef27db87SMehdi Amini     if (HasFn) {
1748ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1749ef27db87SMehdi Amini         if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1750ef27db87SMehdi Amini           if (F->isMaterializable())
1751ef27db87SMehdi Amini             // Defer until materialized; unmaterialized functions may not have
1752ef27db87SMehdi Amini             // metadata.
1753ef27db87SMehdi Amini             FunctionsWithSPs[F] = SP;
1754ef27db87SMehdi Amini           else if (!F->empty())
1755ef27db87SMehdi Amini             F->setSubprogram(SP);
1756ef27db87SMehdi Amini         }
1757ef27db87SMehdi Amini     }
1758ef27db87SMehdi Amini     break;
1759ef27db87SMehdi Amini   }
1760ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK: {
1761ef27db87SMehdi Amini     if (Record.size() != 5)
1762ef27db87SMehdi Amini       return error("Invalid record");
1763ef27db87SMehdi Amini 
1764ef27db87SMehdi Amini     IsDistinct = Record[0];
1765ef27db87SMehdi Amini     MetadataList.assignValue(
1766ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlock,
1767ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1768ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3], Record[4])),
1769c05c9db3SIvan Krasin         NextMetadataNo);
1770c05c9db3SIvan Krasin     NextMetadataNo++;
1771ef27db87SMehdi Amini     break;
1772ef27db87SMehdi Amini   }
1773ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1774ef27db87SMehdi Amini     if (Record.size() != 4)
1775ef27db87SMehdi Amini       return error("Invalid record");
1776ef27db87SMehdi Amini 
1777ef27db87SMehdi Amini     IsDistinct = Record[0];
1778ef27db87SMehdi Amini     MetadataList.assignValue(
1779ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlockFile,
1780ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1781ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3])),
1782c05c9db3SIvan Krasin         NextMetadataNo);
1783c05c9db3SIvan Krasin     NextMetadataNo++;
1784ef27db87SMehdi Amini     break;
1785ef27db87SMehdi Amini   }
17866ed5706aSAdrian Prantl   case bitc::METADATA_COMMON_BLOCK: {
17876ed5706aSAdrian Prantl     IsDistinct = Record[0] & 1;
17886ed5706aSAdrian Prantl     MetadataList.assignValue(
17896ed5706aSAdrian Prantl         GET_OR_DISTINCT(DICommonBlock,
17906ed5706aSAdrian Prantl                         (Context, getMDOrNull(Record[1]),
17916ed5706aSAdrian Prantl                          getMDOrNull(Record[2]), getMDString(Record[3]),
17926ed5706aSAdrian Prantl                          getMDOrNull(Record[4]), Record[5])),
17936ed5706aSAdrian Prantl         NextMetadataNo);
17946ed5706aSAdrian Prantl     NextMetadataNo++;
17956ed5706aSAdrian Prantl     break;
17966ed5706aSAdrian Prantl   }
1797ef27db87SMehdi Amini   case bitc::METADATA_NAMESPACE: {
1798fed4f399SAdrian Prantl     // Newer versions of DINamespace dropped file and line.
1799fed4f399SAdrian Prantl     MDString *Name;
1800fed4f399SAdrian Prantl     if (Record.size() == 3)
1801fed4f399SAdrian Prantl       Name = getMDString(Record[2]);
1802fed4f399SAdrian Prantl     else if (Record.size() == 5)
1803fed4f399SAdrian Prantl       Name = getMDString(Record[3]);
1804fed4f399SAdrian Prantl     else
1805ef27db87SMehdi Amini       return error("Invalid record");
1806ef27db87SMehdi Amini 
1807ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1808ef27db87SMehdi Amini     bool ExportSymbols = Record[0] & 2;
1809ef27db87SMehdi Amini     MetadataList.assignValue(
1810ef27db87SMehdi Amini         GET_OR_DISTINCT(DINamespace,
1811fed4f399SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1812c05c9db3SIvan Krasin         NextMetadataNo);
1813c05c9db3SIvan Krasin     NextMetadataNo++;
1814ef27db87SMehdi Amini     break;
1815ef27db87SMehdi Amini   }
1816ef27db87SMehdi Amini   case bitc::METADATA_MACRO: {
1817ef27db87SMehdi Amini     if (Record.size() != 5)
1818ef27db87SMehdi Amini       return error("Invalid record");
1819ef27db87SMehdi Amini 
1820ef27db87SMehdi Amini     IsDistinct = Record[0];
1821ef27db87SMehdi Amini     MetadataList.assignValue(
1822ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacro,
18239f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDString(Record[3]),
18249f926f70SMehdi Amini                          getMDString(Record[4]))),
1825c05c9db3SIvan Krasin         NextMetadataNo);
1826c05c9db3SIvan Krasin     NextMetadataNo++;
1827ef27db87SMehdi Amini     break;
1828ef27db87SMehdi Amini   }
1829ef27db87SMehdi Amini   case bitc::METADATA_MACRO_FILE: {
1830ef27db87SMehdi Amini     if (Record.size() != 5)
1831ef27db87SMehdi Amini       return error("Invalid record");
1832ef27db87SMehdi Amini 
1833ef27db87SMehdi Amini     IsDistinct = Record[0];
1834ef27db87SMehdi Amini     MetadataList.assignValue(
1835ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacroFile,
18369f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDOrNull(Record[3]),
18379f926f70SMehdi Amini                          getMDOrNull(Record[4]))),
1838c05c9db3SIvan Krasin         NextMetadataNo);
1839c05c9db3SIvan Krasin     NextMetadataNo++;
1840ef27db87SMehdi Amini     break;
1841ef27db87SMehdi Amini   }
1842ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_TYPE: {
18437a42babeSAwanish Pandey     if (Record.size() < 3 || Record.size() > 4)
1844ef27db87SMehdi Amini       return error("Invalid record");
1845ef27db87SMehdi Amini 
1846ef27db87SMehdi Amini     IsDistinct = Record[0];
18477a42babeSAwanish Pandey     MetadataList.assignValue(
18487a42babeSAwanish Pandey         GET_OR_DISTINCT(DITemplateTypeParameter,
1849ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
18507a42babeSAwanish Pandey                          getDITypeRefOrNull(Record[2]),
18517a42babeSAwanish Pandey                          (Record.size() == 4) ? getMDOrNull(Record[3])
18527a42babeSAwanish Pandey                                               : getMDOrNull(false))),
1853c05c9db3SIvan Krasin         NextMetadataNo);
1854c05c9db3SIvan Krasin     NextMetadataNo++;
1855ef27db87SMehdi Amini     break;
1856ef27db87SMehdi Amini   }
1857ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_VALUE: {
18587a42babeSAwanish Pandey     if (Record.size() < 5 || Record.size() > 6)
1859ef27db87SMehdi Amini       return error("Invalid record");
1860ef27db87SMehdi Amini 
1861ef27db87SMehdi Amini     IsDistinct = Record[0];
18627a42babeSAwanish Pandey 
1863ef27db87SMehdi Amini     MetadataList.assignValue(
18647a42babeSAwanish Pandey         GET_OR_DISTINCT(
18657a42babeSAwanish Pandey             DITemplateValueParameter,
1866ef27db87SMehdi Amini             (Context, Record[1], getMDString(Record[2]),
1867ef27db87SMehdi Amini              getDITypeRefOrNull(Record[3]),
18687a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
18697a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[5])
18707a42babeSAwanish Pandey                                   : getMDOrNull(Record[4]))),
1871c05c9db3SIvan Krasin         NextMetadataNo);
1872c05c9db3SIvan Krasin     NextMetadataNo++;
1873ef27db87SMehdi Amini     break;
1874ef27db87SMehdi Amini   }
1875ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_VAR: {
1876f8ab35a4SMatthew Voss     if (Record.size() < 11 || Record.size() > 13)
1877ef27db87SMehdi Amini       return error("Invalid record");
1878ef27db87SMehdi Amini 
1879bceaaa96SAdrian Prantl     IsDistinct = Record[0] & 1;
1880bceaaa96SAdrian Prantl     unsigned Version = Record[0] >> 1;
1881ef27db87SMehdi Amini 
1882f8ab35a4SMatthew Voss     if (Version == 2) {
188330c28848SYonghong Song       Metadata *Annotations = nullptr;
188430c28848SYonghong Song       if (Record.size() > 12)
188530c28848SYonghong Song         Annotations = getMDOrNull(Record[12]);
188630c28848SYonghong Song 
1887f8ab35a4SMatthew Voss       MetadataList.assignValue(
1888665b4138SLuís Ferreira           GET_OR_DISTINCT(DIGlobalVariable,
1889665b4138SLuís Ferreira                           (Context, getMDOrNull(Record[1]),
1890665b4138SLuís Ferreira                            getMDString(Record[2]), getMDString(Record[3]),
1891665b4138SLuís Ferreira                            getMDOrNull(Record[4]), Record[5],
1892f8ab35a4SMatthew Voss                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1893665b4138SLuís Ferreira                            getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1894665b4138SLuís Ferreira                            Record[11], Annotations)),
1895f8ab35a4SMatthew Voss           NextMetadataNo);
1896f8ab35a4SMatthew Voss 
1897f8ab35a4SMatthew Voss       NextMetadataNo++;
1898f8ab35a4SMatthew Voss     } else if (Version == 1) {
1899f8ab35a4SMatthew Voss       // No upgrade necessary. A null field will be introduced to indicate
1900f8ab35a4SMatthew Voss       // that no parameter information is available.
1901bceaaa96SAdrian Prantl       MetadataList.assignValue(
1902665b4138SLuís Ferreira           GET_OR_DISTINCT(
1903665b4138SLuís Ferreira               DIGlobalVariable,
1904665b4138SLuís Ferreira               (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1905665b4138SLuís Ferreira                getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
19069f926f70SMehdi Amini                getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1907665b4138SLuís Ferreira                getMDOrNull(Record[10]), nullptr, Record[11], nullptr)),
1908c05c9db3SIvan Krasin           NextMetadataNo);
1909f8ab35a4SMatthew Voss 
1910c05c9db3SIvan Krasin       NextMetadataNo++;
1911bceaaa96SAdrian Prantl     } else if (Version == 0) {
1912ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
1913ef27db87SMehdi Amini       // ConstantInt here.
1914a5bf2d70SAdrian Prantl       NeedUpgradeToDIGlobalVariableExpression = true;
1915ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
1916ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1917ef27db87SMehdi Amini       if (Record.size() > 11) {
1918ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1919ef27db87SMehdi Amini           return error("Alignment value is too large");
1920ef27db87SMehdi Amini         AlignInBits = Record[11];
1921ef27db87SMehdi Amini       }
1922ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
1923ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1924ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1925ef27db87SMehdi Amini           Attach = GV;
1926ef27db87SMehdi Amini           Expr = nullptr;
1927ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1928ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
1929ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
1930ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
1931ef27db87SMehdi Amini         } else {
1932ef27db87SMehdi Amini           Expr = nullptr;
1933ef27db87SMehdi Amini         }
1934ef27db87SMehdi Amini       }
1935ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
1936ef27db87SMehdi Amini           DIGlobalVariable,
1937ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1938ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1939bceaaa96SAdrian Prantl            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
194030c28848SYonghong Song            getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));
194103c6d31aSAdrian Prantl 
1942e37d3144SAdrian Prantl       DIGlobalVariableExpression *DGVE = nullptr;
1943e37d3144SAdrian Prantl       if (Attach || Expr)
194405782218SAdrian Prantl         DGVE = DIGlobalVariableExpression::getDistinct(
194505782218SAdrian Prantl             Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
194673ec0656SAdrian Prantl       if (Attach)
1947bceaaa96SAdrian Prantl         Attach->addDebugInfo(DGVE);
1948e37d3144SAdrian Prantl 
1949e37d3144SAdrian Prantl       auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1950e37d3144SAdrian Prantl       MetadataList.assignValue(MDNode, NextMetadataNo);
1951e37d3144SAdrian Prantl       NextMetadataNo++;
1952bceaaa96SAdrian Prantl     } else
1953bceaaa96SAdrian Prantl       return error("Invalid record");
195473ec0656SAdrian Prantl 
1955ef27db87SMehdi Amini     break;
1956ef27db87SMehdi Amini   }
1957ef27db87SMehdi Amini   case bitc::METADATA_LOCAL_VAR: {
1958ef27db87SMehdi Amini     // 10th field is for the obseleted 'inlinedAt:' field.
1959ef27db87SMehdi Amini     if (Record.size() < 8 || Record.size() > 10)
1960ef27db87SMehdi Amini       return error("Invalid record");
1961ef27db87SMehdi Amini 
1962ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1963ef27db87SMehdi Amini     bool HasAlignment = Record[0] & 2;
1964ef27db87SMehdi Amini     // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1965ef27db87SMehdi Amini     // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
196668168d17SSimon Pilgrim     // this is newer version of record which doesn't have artificial tag.
1967ef27db87SMehdi Amini     bool HasTag = !HasAlignment && Record.size() > 8;
1968ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1969ef27db87SMehdi Amini     uint32_t AlignInBits = 0;
19701bebc31cSYonghong Song     Metadata *Annotations = nullptr;
1971ef27db87SMehdi Amini     if (HasAlignment) {
19721bebc31cSYonghong Song       if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1973ef27db87SMehdi Amini         return error("Alignment value is too large");
19741bebc31cSYonghong Song       AlignInBits = Record[8];
19751bebc31cSYonghong Song       if (Record.size() > 9)
19761bebc31cSYonghong Song         Annotations = getMDOrNull(Record[9]);
1977ef27db87SMehdi Amini     }
19781bebc31cSYonghong Song 
1979ef27db87SMehdi Amini     MetadataList.assignValue(
1980ef27db87SMehdi Amini         GET_OR_DISTINCT(DILocalVariable,
1981ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1 + HasTag]),
1982ef27db87SMehdi Amini                          getMDString(Record[2 + HasTag]),
1983ef27db87SMehdi Amini                          getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1984ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5 + HasTag]),
1985665b4138SLuís Ferreira                          Record[6 + HasTag], Flags, AlignInBits, Annotations)),
1986c05c9db3SIvan Krasin         NextMetadataNo);
1987c05c9db3SIvan Krasin     NextMetadataNo++;
1988ef27db87SMehdi Amini     break;
1989ef27db87SMehdi Amini   }
19902c864551SShiva Chen   case bitc::METADATA_LABEL: {
19912c864551SShiva Chen     if (Record.size() != 5)
19922c864551SShiva Chen       return error("Invalid record");
19932c864551SShiva Chen 
19942c864551SShiva Chen     IsDistinct = Record[0] & 1;
19952c864551SShiva Chen     MetadataList.assignValue(
1996665b4138SLuís Ferreira         GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]),
19972c864551SShiva Chen                                   getMDString(Record[2]),
19982c864551SShiva Chen                                   getMDOrNull(Record[3]), Record[4])),
19992c864551SShiva Chen         NextMetadataNo);
20002c864551SShiva Chen     NextMetadataNo++;
20012c864551SShiva Chen     break;
20022c864551SShiva Chen   }
2003ef27db87SMehdi Amini   case bitc::METADATA_EXPRESSION: {
2004ef27db87SMehdi Amini     if (Record.size() < 1)
2005ef27db87SMehdi Amini       return error("Invalid record");
2006ef27db87SMehdi Amini 
2007ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
20086825fb64SAdrian Prantl     uint64_t Version = Record[0] >> 1;
2009ef27db87SMehdi Amini     auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
2010ffc498dfSFlorian Hahn 
2011ffc498dfSFlorian Hahn     SmallVector<uint64_t, 6> Buffer;
201205963a3dSArthur Eubanks     if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
2013ffc498dfSFlorian Hahn       return Err;
2014ef27db87SMehdi Amini 
2015665b4138SLuís Ferreira     MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)),
2016665b4138SLuís Ferreira                              NextMetadataNo);
2017c05c9db3SIvan Krasin     NextMetadataNo++;
2018ef27db87SMehdi Amini     break;
2019ef27db87SMehdi Amini   }
2020bceaaa96SAdrian Prantl   case bitc::METADATA_GLOBAL_VAR_EXPR: {
2021bceaaa96SAdrian Prantl     if (Record.size() != 3)
2022bceaaa96SAdrian Prantl       return error("Invalid record");
2023bceaaa96SAdrian Prantl 
2024bceaaa96SAdrian Prantl     IsDistinct = Record[0];
202505782218SAdrian Prantl     Metadata *Expr = getMDOrNull(Record[2]);
202605782218SAdrian Prantl     if (!Expr)
202705782218SAdrian Prantl       Expr = DIExpression::get(Context, {});
202805782218SAdrian Prantl     MetadataList.assignValue(
202905782218SAdrian Prantl         GET_OR_DISTINCT(DIGlobalVariableExpression,
203005782218SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Expr)),
2031c05c9db3SIvan Krasin         NextMetadataNo);
2032c05c9db3SIvan Krasin     NextMetadataNo++;
2033bceaaa96SAdrian Prantl     break;
2034bceaaa96SAdrian Prantl   }
2035ef27db87SMehdi Amini   case bitc::METADATA_OBJC_PROPERTY: {
2036ef27db87SMehdi Amini     if (Record.size() != 8)
2037ef27db87SMehdi Amini       return error("Invalid record");
2038ef27db87SMehdi Amini 
2039ef27db87SMehdi Amini     IsDistinct = Record[0];
2040ef27db87SMehdi Amini     MetadataList.assignValue(
2041ef27db87SMehdi Amini         GET_OR_DISTINCT(DIObjCProperty,
2042ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
2043ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3],
2044ef27db87SMehdi Amini                          getMDString(Record[4]), getMDString(Record[5]),
2045ef27db87SMehdi Amini                          Record[6], getDITypeRefOrNull(Record[7]))),
2046c05c9db3SIvan Krasin         NextMetadataNo);
2047c05c9db3SIvan Krasin     NextMetadataNo++;
2048ef27db87SMehdi Amini     break;
2049ef27db87SMehdi Amini   }
2050ef27db87SMehdi Amini   case bitc::METADATA_IMPORTED_ENTITY: {
2051a5b72abcSAlok Kumar Sharma     if (Record.size() < 6 && Record.size() > 8)
2052ef27db87SMehdi Amini       return error("Invalid record");
2053ef27db87SMehdi Amini 
2054ef27db87SMehdi Amini     IsDistinct = Record[0];
2055a5b72abcSAlok Kumar Sharma     bool HasFile = (Record.size() >= 7);
2056a5b72abcSAlok Kumar Sharma     bool HasElements = (Record.size() >= 8);
2057ef27db87SMehdi Amini     MetadataList.assignValue(
2058ef27db87SMehdi Amini         GET_OR_DISTINCT(DIImportedEntity,
2059ef27db87SMehdi Amini                         (Context, Record[1], getMDOrNull(Record[2]),
2060d63bfd21SAdrian Prantl                          getDITypeRefOrNull(Record[3]),
2061d63bfd21SAdrian Prantl                          HasFile ? getMDOrNull(Record[6]) : nullptr,
2062a5b72abcSAlok Kumar Sharma                          HasFile ? Record[4] : 0, getMDString(Record[5]),
2063a5b72abcSAlok Kumar Sharma                          HasElements ? getMDOrNull(Record[7]) : nullptr)),
2064c05c9db3SIvan Krasin         NextMetadataNo);
2065c05c9db3SIvan Krasin     NextMetadataNo++;
2066ef27db87SMehdi Amini     break;
2067ef27db87SMehdi Amini   }
2068ef27db87SMehdi Amini   case bitc::METADATA_STRING_OLD: {
2069ef27db87SMehdi Amini     std::string String(Record.begin(), Record.end());
2070ef27db87SMehdi Amini 
2071ef27db87SMehdi Amini     // Test for upgrading !llvm.loop.
2072ef27db87SMehdi Amini     HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
207319ef4fadSMehdi Amini     ++NumMDStringLoaded;
2074ef27db87SMehdi Amini     Metadata *MD = MDString::get(Context, String);
2075c05c9db3SIvan Krasin     MetadataList.assignValue(MD, NextMetadataNo);
2076c05c9db3SIvan Krasin     NextMetadataNo++;
2077ef27db87SMehdi Amini     break;
2078ef27db87SMehdi Amini   }
207919ef4fadSMehdi Amini   case bitc::METADATA_STRINGS: {
208019ef4fadSMehdi Amini     auto CreateNextMDString = [&](StringRef Str) {
208119ef4fadSMehdi Amini       ++NumMDStringLoaded;
2082c05c9db3SIvan Krasin       MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
2083c05c9db3SIvan Krasin       NextMetadataNo++;
208419ef4fadSMehdi Amini     };
208519ef4fadSMehdi Amini     if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2086ef27db87SMehdi Amini       return Err;
2087ef27db87SMehdi Amini     break;
208819ef4fadSMehdi Amini   }
2089ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
2090ef27db87SMehdi Amini     if (Record.size() % 2 == 0)
2091ef27db87SMehdi Amini       return error("Invalid record");
2092ef27db87SMehdi Amini     unsigned ValueID = Record[0];
2093ef27db87SMehdi Amini     if (ValueID >= ValueList.size())
2094ef27db87SMehdi Amini       return error("Invalid record");
2095ef27db87SMehdi Amini     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
2096ef27db87SMehdi Amini       if (Error Err = parseGlobalObjectAttachment(
2097ef27db87SMehdi Amini               *GO, ArrayRef<uint64_t>(Record).slice(1)))
2098ef27db87SMehdi Amini         return Err;
2099ef27db87SMehdi Amini     break;
2100ef27db87SMehdi Amini   }
2101ef27db87SMehdi Amini   case bitc::METADATA_KIND: {
2102ef27db87SMehdi Amini     // Support older bitcode files that had METADATA_KIND records in a
2103ef27db87SMehdi Amini     // block with METADATA_BLOCK_ID.
2104ef27db87SMehdi Amini     if (Error Err = parseMetadataKindRecord(Record))
2105ef27db87SMehdi Amini       return Err;
2106ef27db87SMehdi Amini     break;
2107ef27db87SMehdi Amini   }
210865600cb2Sgbtozers   case bitc::METADATA_ARG_LIST: {
210965600cb2Sgbtozers     SmallVector<ValueAsMetadata *, 4> Elts;
211065600cb2Sgbtozers     Elts.reserve(Record.size());
2111e5d844b5SStephen Tozer     for (uint64_t Elt : Record) {
2112e5d844b5SStephen Tozer       Metadata *MD = getMD(Elt);
2113e5d844b5SStephen Tozer       if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())
2114e5d844b5SStephen Tozer         return error(
2115e5d844b5SStephen Tozer             "Invalid record: DIArgList should not contain forward refs");
2116e5d844b5SStephen Tozer       if (!isa<ValueAsMetadata>(MD))
2117e5d844b5SStephen Tozer         return error("Invalid record");
2118e5d844b5SStephen Tozer       Elts.push_back(cast<ValueAsMetadata>(MD));
2119e5d844b5SStephen Tozer     }
212065600cb2Sgbtozers 
212165600cb2Sgbtozers     MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);
212265600cb2Sgbtozers     NextMetadataNo++;
212365600cb2Sgbtozers     break;
212465600cb2Sgbtozers   }
2125ef27db87SMehdi Amini   }
21269f926f70SMehdi Amini   return Error::success();
212719ef4fadSMehdi Amini #undef GET_OR_DISTINCT
2128ef27db87SMehdi Amini }
2129ef27db87SMehdi Amini 
2130ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
213119ef4fadSMehdi Amini     ArrayRef<uint64_t> Record, StringRef Blob,
2132061f4a5fSBenjamin Kramer     function_ref<void(StringRef)> CallBack) {
2133ef27db87SMehdi Amini   // All the MDStrings in the block are emitted together in a single
2134ef27db87SMehdi Amini   // record.  The strings are concatenated and stored in a blob along with
2135ef27db87SMehdi Amini   // their sizes.
2136ef27db87SMehdi Amini   if (Record.size() != 2)
2137ef27db87SMehdi Amini     return error("Invalid record: metadata strings layout");
2138ef27db87SMehdi Amini 
2139ef27db87SMehdi Amini   unsigned NumStrings = Record[0];
2140ef27db87SMehdi Amini   unsigned StringsOffset = Record[1];
2141ef27db87SMehdi Amini   if (!NumStrings)
2142ef27db87SMehdi Amini     return error("Invalid record: metadata strings with no strings");
2143ef27db87SMehdi Amini   if (StringsOffset > Blob.size())
2144ef27db87SMehdi Amini     return error("Invalid record: metadata strings corrupt offset");
2145ef27db87SMehdi Amini 
2146ef27db87SMehdi Amini   StringRef Lengths = Blob.slice(0, StringsOffset);
2147ef27db87SMehdi Amini   SimpleBitstreamCursor R(Lengths);
2148ef27db87SMehdi Amini 
2149ef27db87SMehdi Amini   StringRef Strings = Blob.drop_front(StringsOffset);
2150ef27db87SMehdi Amini   do {
2151ef27db87SMehdi Amini     if (R.AtEndOfStream())
2152ef27db87SMehdi Amini       return error("Invalid record: metadata strings bad length");
2153ef27db87SMehdi Amini 
2154b12a864cSDuncan P. N. Exon Smith     uint32_t Size;
2155b12a864cSDuncan P. N. Exon Smith     if (Error E = R.ReadVBR(6).moveInto(Size))
2156b12a864cSDuncan P. N. Exon Smith       return E;
2157ef27db87SMehdi Amini     if (Strings.size() < Size)
2158ef27db87SMehdi Amini       return error("Invalid record: metadata strings truncated chars");
2159ef27db87SMehdi Amini 
216019ef4fadSMehdi Amini     CallBack(Strings.slice(0, Size));
2161ef27db87SMehdi Amini     Strings = Strings.drop_front(Size);
2162ef27db87SMehdi Amini   } while (--NumStrings);
2163ef27db87SMehdi Amini 
2164ef27db87SMehdi Amini   return Error::success();
2165ef27db87SMehdi Amini }
2166ef27db87SMehdi Amini 
2167ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2168ef27db87SMehdi Amini     GlobalObject &GO, ArrayRef<uint64_t> Record) {
2169ef27db87SMehdi Amini   assert(Record.size() % 2 == 0);
2170ef27db87SMehdi Amini   for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2171ef27db87SMehdi Amini     auto K = MDKindMap.find(Record[I]);
2172ef27db87SMehdi Amini     if (K == MDKindMap.end())
2173ef27db87SMehdi Amini       return error("Invalid ID");
2174c27ab339STeresa Johnson     MDNode *MD =
2175c27ab339STeresa Johnson         dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));
2176ef27db87SMehdi Amini     if (!MD)
2177f3d2453dSTeresa Johnson       return error("Invalid metadata attachment: expect fwd ref to MDNode");
2178ef27db87SMehdi Amini     GO.addMetadata(K->second, *MD);
2179ef27db87SMehdi Amini   }
2180ef27db87SMehdi Amini   return Error::success();
2181ef27db87SMehdi Amini }
2182ef27db87SMehdi Amini 
2183ef27db87SMehdi Amini /// Parse metadata attachments.
2184ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
2185ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
21860e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
21870e828958SJF Bastien     return Err;
2188ef27db87SMehdi Amini 
2189ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
21907b0d1457SMehdi Amini   PlaceholderQueue Placeholders;
2191ef27db87SMehdi Amini 
2192ef27db87SMehdi Amini   while (true) {
2193b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
2194b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2195b12a864cSDuncan P. N. Exon Smith       return E;
2196ef27db87SMehdi Amini 
2197ef27db87SMehdi Amini     switch (Entry.Kind) {
2198ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2199ef27db87SMehdi Amini     case BitstreamEntry::Error:
2200ef27db87SMehdi Amini       return error("Malformed block");
2201ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
22027b0d1457SMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
2203ef27db87SMehdi Amini       return Error::success();
2204ef27db87SMehdi Amini     case BitstreamEntry::Record:
2205ef27db87SMehdi Amini       // The interesting case.
2206ef27db87SMehdi Amini       break;
2207ef27db87SMehdi Amini     }
2208ef27db87SMehdi Amini 
2209ef27db87SMehdi Amini     // Read a metadata attachment record.
2210ef27db87SMehdi Amini     Record.clear();
221119ef4fadSMehdi Amini     ++NumMDRecordLoaded;
22120e828958SJF Bastien     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
22130e828958SJF Bastien     if (!MaybeRecord)
22140e828958SJF Bastien       return MaybeRecord.takeError();
22150e828958SJF Bastien     switch (MaybeRecord.get()) {
2216ef27db87SMehdi Amini     default: // Default behavior: ignore.
2217ef27db87SMehdi Amini       break;
2218ef27db87SMehdi Amini     case bitc::METADATA_ATTACHMENT: {
2219ef27db87SMehdi Amini       unsigned RecordLength = Record.size();
2220ef27db87SMehdi Amini       if (Record.empty())
2221ef27db87SMehdi Amini         return error("Invalid record");
2222ef27db87SMehdi Amini       if (RecordLength % 2 == 0) {
2223ef27db87SMehdi Amini         // A function attachment.
2224ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(F, Record))
2225ef27db87SMehdi Amini           return Err;
2226ef27db87SMehdi Amini         continue;
2227ef27db87SMehdi Amini       }
2228ef27db87SMehdi Amini 
2229ef27db87SMehdi Amini       // An instruction attachment.
2230ef27db87SMehdi Amini       Instruction *Inst = InstructionList[Record[0]];
2231ef27db87SMehdi Amini       for (unsigned i = 1; i != RecordLength; i = i + 2) {
2232ef27db87SMehdi Amini         unsigned Kind = Record[i];
2233ef27db87SMehdi Amini         DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
2234ef27db87SMehdi Amini         if (I == MDKindMap.end())
2235ef27db87SMehdi Amini           return error("Invalid ID");
22368662305bSMehdi Amini         if (I->second == LLVMContext::MD_tbaa && StripTBAA)
22378662305bSMehdi Amini           continue;
22388662305bSMehdi Amini 
223919ef4fadSMehdi Amini         auto Idx = Record[i + 1];
224019ef4fadSMehdi Amini         if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2241d5549f3dSMehdi Amini             !MetadataList.lookup(Idx)) {
224219ef4fadSMehdi Amini           // Load the attachment if it is in the lazy-loadable range and hasn't
224319ef4fadSMehdi Amini           // been loaded yet.
224419ef4fadSMehdi Amini           lazyLoadOneMetadata(Idx, Placeholders);
2245d5549f3dSMehdi Amini           resolveForwardRefsAndPlaceholders(Placeholders);
2246d5549f3dSMehdi Amini         }
224719ef4fadSMehdi Amini 
224819ef4fadSMehdi Amini         Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2249ef27db87SMehdi Amini         if (isa<LocalAsMetadata>(Node))
2250ef27db87SMehdi Amini           // Drop the attachment.  This used to be legal, but there's no
2251ef27db87SMehdi Amini           // upgrade path.
2252ef27db87SMehdi Amini           break;
2253ef27db87SMehdi Amini         MDNode *MD = dyn_cast_or_null<MDNode>(Node);
2254ef27db87SMehdi Amini         if (!MD)
2255ef27db87SMehdi Amini           return error("Invalid metadata attachment");
2256ef27db87SMehdi Amini 
2257ef27db87SMehdi Amini         if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2258ef27db87SMehdi Amini           MD = upgradeInstructionLoopAttachment(*MD);
2259ef27db87SMehdi Amini 
2260ef27db87SMehdi Amini         if (I->second == LLVMContext::MD_tbaa) {
2261ef27db87SMehdi Amini           assert(!MD->isTemporary() && "should load MDs before attachments");
2262ef27db87SMehdi Amini           MD = UpgradeTBAANode(*MD);
2263ef27db87SMehdi Amini         }
2264ef27db87SMehdi Amini         Inst->setMetadata(I->second, MD);
2265ef27db87SMehdi Amini       }
2266ef27db87SMehdi Amini       break;
2267ef27db87SMehdi Amini     }
2268ef27db87SMehdi Amini     }
2269ef27db87SMehdi Amini   }
2270ef27db87SMehdi Amini }
2271ef27db87SMehdi Amini 
2272ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
2273ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2274ef27db87SMehdi Amini     SmallVectorImpl<uint64_t> &Record) {
2275ef27db87SMehdi Amini   if (Record.size() < 2)
2276ef27db87SMehdi Amini     return error("Invalid record");
2277ef27db87SMehdi Amini 
2278ef27db87SMehdi Amini   unsigned Kind = Record[0];
2279ef27db87SMehdi Amini   SmallString<8> Name(Record.begin() + 1, Record.end());
2280ef27db87SMehdi Amini 
2281ef27db87SMehdi Amini   unsigned NewKind = TheModule.getMDKindID(Name.str());
2282ef27db87SMehdi Amini   if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2283ef27db87SMehdi Amini     return error("Conflicting METADATA_KIND records");
2284ef27db87SMehdi Amini   return Error::success();
2285ef27db87SMehdi Amini }
2286ef27db87SMehdi Amini 
2287ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
2288ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
22890e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
22900e828958SJF Bastien     return Err;
2291ef27db87SMehdi Amini 
2292ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
2293ef27db87SMehdi Amini 
2294ef27db87SMehdi Amini   // Read all the records.
2295ef27db87SMehdi Amini   while (true) {
2296b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
2297b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2298b12a864cSDuncan P. N. Exon Smith       return E;
2299ef27db87SMehdi Amini 
2300ef27db87SMehdi Amini     switch (Entry.Kind) {
2301ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2302ef27db87SMehdi Amini     case BitstreamEntry::Error:
2303ef27db87SMehdi Amini       return error("Malformed block");
2304ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
2305ef27db87SMehdi Amini       return Error::success();
2306ef27db87SMehdi Amini     case BitstreamEntry::Record:
2307ef27db87SMehdi Amini       // The interesting case.
2308ef27db87SMehdi Amini       break;
2309ef27db87SMehdi Amini     }
2310ef27db87SMehdi Amini 
2311ef27db87SMehdi Amini     // Read a record.
2312ef27db87SMehdi Amini     Record.clear();
231319ef4fadSMehdi Amini     ++NumMDRecordLoaded;
23140e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
23150e828958SJF Bastien     if (!MaybeCode)
23160e828958SJF Bastien       return MaybeCode.takeError();
23170e828958SJF Bastien     switch (MaybeCode.get()) {
2318ef27db87SMehdi Amini     default: // Default behavior: ignore.
2319ef27db87SMehdi Amini       break;
2320ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
2321ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
2322ef27db87SMehdi Amini         return Err;
2323ef27db87SMehdi Amini       break;
2324ef27db87SMehdi Amini     }
2325ef27db87SMehdi Amini     }
2326ef27db87SMehdi Amini   }
2327ef27db87SMehdi Amini }
2328ef27db87SMehdi Amini 
2329ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
2330ef27db87SMehdi Amini   Pimpl = std::move(RHS.Pimpl);
2331ef27db87SMehdi Amini   return *this;
2332ef27db87SMehdi Amini }
2333ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2334ec68dd49SMehdi Amini     : Pimpl(std::move(RHS.Pimpl)) {}
2335ef27db87SMehdi Amini 
2336ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
2337ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2338ef27db87SMehdi Amini                                BitcodeReaderValueList &ValueList,
2339a61f5e37STeresa Johnson                                bool IsImporting,
2340ef27db87SMehdi Amini                                std::function<Type *(unsigned)> getTypeByID)
23410eaee545SJonas Devlieghere     : Pimpl(std::make_unique<MetadataLoaderImpl>(
2342061f4a5fSBenjamin Kramer           Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2343ef27db87SMehdi Amini 
2344ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2345ec68dd49SMehdi Amini   return Pimpl->parseMetadata(ModuleLevel);
2346ef27db87SMehdi Amini }
2347ef27db87SMehdi Amini 
2348ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2349ef27db87SMehdi Amini 
2350ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
2351ef27db87SMehdi Amini /// necessary.
23523bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
23533bb4d01dSMehdi Amini   return Pimpl->getMetadataFwdRefOrLoad(Idx);
2354ef27db87SMehdi Amini }
2355ef27db87SMehdi Amini 
2356ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2357ef27db87SMehdi Amini   return Pimpl->lookupSubprogramForFunction(F);
2358ef27db87SMehdi Amini }
2359ef27db87SMehdi Amini 
2360ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
2361ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
2362ef27db87SMehdi Amini   return Pimpl->parseMetadataAttachment(F, InstructionList);
2363ef27db87SMehdi Amini }
2364ef27db87SMehdi Amini 
2365ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
2366ef27db87SMehdi Amini   return Pimpl->parseMetadataKinds();
2367ef27db87SMehdi Amini }
2368ef27db87SMehdi Amini 
23698662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) {
23708662305bSMehdi Amini   return Pimpl->setStripTBAA(StripTBAA);
23718662305bSMehdi Amini }
23728662305bSMehdi Amini 
23738662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
23748662305bSMehdi Amini 
2375ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
2376ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
23776825fb64SAdrian Prantl 
23786825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
23796825fb64SAdrian Prantl   return Pimpl->upgradeDebugIntrinsics(F);
23806825fb64SAdrian Prantl }
2381