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/APInt.h"
13ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h"
14*1237c149Sserge-sans-paille #include "llvm/ADT/BitmaskEnum.h"
15ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h"
1619ef4fadSMehdi Amini #include "llvm/ADT/DenseSet.h"
17ef27db87SMehdi Amini #include "llvm/ADT/None.h"
18*1237c149Sserge-sans-paille #include "llvm/ADT/Optional.h"
19*1237c149Sserge-sans-paille #include "llvm/ADT/STLFunctionalExtras.h"
20ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h"
21*1237c149Sserge-sans-paille #include "llvm/ADT/SmallVector.h"
2219ef4fadSMehdi Amini #include "llvm/ADT/Statistic.h"
23ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h"
24ef27db87SMehdi Amini #include "llvm/ADT/Twine.h"
25*1237c149Sserge-sans-paille #include "llvm/ADT/ilist_iterator.h"
26*1237c149Sserge-sans-paille #include "llvm/ADT/iterator_range.h"
27ffe8720aSserge-sans-paille #include "llvm/BinaryFormat/Dwarf.h"
28ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
29ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
3008ed2160SItay Bookstein #include "llvm/Bitstream/BitstreamReader.h"
31ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
32ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
33ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
34ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
35ef27db87SMehdi Amini #include "llvm/IR/Function.h"
36ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
37ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
38ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
396825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h"
40ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
41*1237c149Sserge-sans-paille #include "llvm/IR/Metadata.h"
42ef27db87SMehdi Amini #include "llvm/IR/Module.h"
43ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
44ef27db87SMehdi Amini #include "llvm/IR/Type.h"
45ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
46ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
47ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
48ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
49*1237c149Sserge-sans-paille #include "llvm/Support/type_traits.h"
50*1237c149Sserge-sans-paille 
51ef27db87SMehdi Amini #include <algorithm>
52ef27db87SMehdi Amini #include <cassert>
53ef27db87SMehdi Amini #include <cstddef>
54ef27db87SMehdi Amini #include <cstdint>
55ef27db87SMehdi Amini #include <deque>
56*1237c149Sserge-sans-paille #include <iterator>
57ef27db87SMehdi Amini #include <limits>
58ef27db87SMehdi Amini #include <string>
59ef27db87SMehdi Amini #include <tuple>
60*1237c149Sserge-sans-paille #include <type_traits>
61ef27db87SMehdi Amini #include <utility>
62ef27db87SMehdi Amini #include <vector>
63*1237c149Sserge-sans-paille namespace llvm {
64*1237c149Sserge-sans-paille class Argument;
65*1237c149Sserge-sans-paille }
66ef27db87SMehdi Amini 
67ef27db87SMehdi Amini using namespace llvm;
68ef27db87SMehdi Amini 
6919ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader"
7019ef4fadSMehdi Amini 
7119ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
7219ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
7319ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
7419ef4fadSMehdi Amini 
75a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO.
76a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB.
77a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions(
78a61f5e37STeresa Johnson     "import-full-type-definitions", cl::init(false), cl::Hidden,
79a61f5e37STeresa Johnson     cl::desc("Import full type definitions for ThinLTO."));
80a61f5e37STeresa Johnson 
8119ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading(
8219ef4fadSMehdi Amini     "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
8319ef4fadSMehdi Amini     cl::desc("Force disable the lazy-loading on-demand of metadata when "
8419ef4fadSMehdi Amini              "loading bitcode for importing."));
8519ef4fadSMehdi Amini 
86ef27db87SMehdi Amini namespace {
87ef27db87SMehdi Amini 
88aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
89ef27db87SMehdi Amini 
90ef27db87SMehdi Amini class BitcodeReaderMetadataList {
91ef27db87SMehdi Amini   /// Array of metadata references.
92ef27db87SMehdi Amini   ///
93ef27db87SMehdi Amini   /// Don't use std::vector here.  Some versions of libc++ copy (instead of
94ef27db87SMehdi Amini   /// move) on resize, and TrackingMDRef is very expensive to copy.
95ef27db87SMehdi Amini   SmallVector<TrackingMDRef, 1> MetadataPtrs;
96ef27db87SMehdi Amini 
97690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of forward references that were
98690952d1SMehdi Amini   /// generated.
99690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> ForwardReference;
100690952d1SMehdi Amini 
101690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of Metadata that need to be
102690952d1SMehdi Amini   /// resolved.
103690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> UnresolvedNodes;
104690952d1SMehdi Amini 
105ef27db87SMehdi Amini   /// Structures for resolving old type refs.
106ef27db87SMehdi Amini   struct {
107ef27db87SMehdi Amini     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
108ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
109ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
110ef27db87SMehdi Amini     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
111ef27db87SMehdi Amini   } OldTypeRefs;
112ef27db87SMehdi Amini 
113ef27db87SMehdi Amini   LLVMContext &Context;
114ef27db87SMehdi Amini 
115864474c9SFlorian Hahn   /// Maximum number of valid references. Forward references exceeding the
116864474c9SFlorian Hahn   /// maximum must be invalid.
117864474c9SFlorian Hahn   unsigned RefsUpperBound;
118864474c9SFlorian Hahn 
119ef27db87SMehdi Amini public:
120864474c9SFlorian Hahn   BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
121864474c9SFlorian Hahn       : Context(C),
122864474c9SFlorian Hahn         RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
123864474c9SFlorian Hahn                                 RefsUpperBound)) {}
124ef27db87SMehdi Amini 
125ef27db87SMehdi Amini   // vector compatibility methods
126ef27db87SMehdi Amini   unsigned size() const { return MetadataPtrs.size(); }
127ef27db87SMehdi Amini   void resize(unsigned N) { MetadataPtrs.resize(N); }
128ef27db87SMehdi Amini   void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
129ef27db87SMehdi Amini   void clear() { MetadataPtrs.clear(); }
130ef27db87SMehdi Amini   Metadata *back() const { return MetadataPtrs.back(); }
131ef27db87SMehdi Amini   void pop_back() { MetadataPtrs.pop_back(); }
132ef27db87SMehdi Amini   bool empty() const { return MetadataPtrs.empty(); }
133ef27db87SMehdi Amini 
134ef27db87SMehdi Amini   Metadata *operator[](unsigned i) const {
135ef27db87SMehdi Amini     assert(i < MetadataPtrs.size());
136ef27db87SMehdi Amini     return MetadataPtrs[i];
137ef27db87SMehdi Amini   }
138ef27db87SMehdi Amini 
139ef27db87SMehdi Amini   Metadata *lookup(unsigned I) const {
140ef27db87SMehdi Amini     if (I < MetadataPtrs.size())
141ef27db87SMehdi Amini       return MetadataPtrs[I];
142ef27db87SMehdi Amini     return nullptr;
143ef27db87SMehdi Amini   }
144ef27db87SMehdi Amini 
145ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
146ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
147690952d1SMehdi Amini     assert(ForwardReference.empty() && "Unexpected forward refs");
148690952d1SMehdi Amini     assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
149ef27db87SMehdi Amini     MetadataPtrs.resize(N);
150ef27db87SMehdi Amini   }
151ef27db87SMehdi Amini 
152ef27db87SMehdi Amini   /// Return the given metadata, creating a replaceable forward reference if
153ef27db87SMehdi Amini   /// necessary.
154ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx);
155ef27db87SMehdi Amini 
1568f976ba0SHiroshi Inoue   /// Return the given metadata only if it is fully resolved.
157ef27db87SMehdi Amini   ///
158ef27db87SMehdi Amini   /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
159ef27db87SMehdi Amini   /// would give \c false.
160ef27db87SMehdi Amini   Metadata *getMetadataIfResolved(unsigned Idx);
161ef27db87SMehdi Amini 
162ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
163ef27db87SMehdi Amini   void assignValue(Metadata *MD, unsigned Idx);
164ef27db87SMehdi Amini   void tryToResolveCycles();
165690952d1SMehdi Amini   bool hasFwdRefs() const { return !ForwardReference.empty(); }
16619ef4fadSMehdi Amini   int getNextFwdRef() {
16719ef4fadSMehdi Amini     assert(hasFwdRefs());
16819ef4fadSMehdi Amini     return *ForwardReference.begin();
16919ef4fadSMehdi Amini   }
170ef27db87SMehdi Amini 
171ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
172ef27db87SMehdi Amini   void addTypeRef(MDString &UUID, DICompositeType &CT);
173ef27db87SMehdi Amini 
174ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
175ef27db87SMehdi Amini   Metadata *upgradeTypeRef(Metadata *MaybeUUID);
176ef27db87SMehdi Amini 
177ef27db87SMehdi Amini   /// Upgrade a type ref array that may have MDString references.
178ef27db87SMehdi Amini   Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
179ef27db87SMehdi Amini 
180ef27db87SMehdi Amini private:
181ef27db87SMehdi Amini   Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
182ef27db87SMehdi Amini };
183ef27db87SMehdi Amini 
184ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
185690952d1SMehdi Amini   if (auto *MDN = dyn_cast<MDNode>(MD))
186690952d1SMehdi Amini     if (!MDN->isResolved())
187690952d1SMehdi Amini       UnresolvedNodes.insert(Idx);
188690952d1SMehdi Amini 
189ef27db87SMehdi Amini   if (Idx == size()) {
190ef27db87SMehdi Amini     push_back(MD);
191ef27db87SMehdi Amini     return;
192ef27db87SMehdi Amini   }
193ef27db87SMehdi Amini 
194ef27db87SMehdi Amini   if (Idx >= size())
195ef27db87SMehdi Amini     resize(Idx + 1);
196ef27db87SMehdi Amini 
197ef27db87SMehdi Amini   TrackingMDRef &OldMD = MetadataPtrs[Idx];
198ef27db87SMehdi Amini   if (!OldMD) {
199ef27db87SMehdi Amini     OldMD.reset(MD);
200ef27db87SMehdi Amini     return;
201ef27db87SMehdi Amini   }
202ef27db87SMehdi Amini 
203ef27db87SMehdi Amini   // If there was a forward reference to this value, replace it.
204ef27db87SMehdi Amini   TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
205ef27db87SMehdi Amini   PrevMD->replaceAllUsesWith(MD);
206690952d1SMehdi Amini   ForwardReference.erase(Idx);
207ef27db87SMehdi Amini }
208ef27db87SMehdi Amini 
209ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
210864474c9SFlorian Hahn   // Bail out for a clearly invalid value.
211864474c9SFlorian Hahn   if (Idx >= RefsUpperBound)
212864474c9SFlorian Hahn     return nullptr;
213864474c9SFlorian Hahn 
214ef27db87SMehdi Amini   if (Idx >= size())
215ef27db87SMehdi Amini     resize(Idx + 1);
216ef27db87SMehdi Amini 
217ef27db87SMehdi Amini   if (Metadata *MD = MetadataPtrs[Idx])
218ef27db87SMehdi Amini     return MD;
219ef27db87SMehdi Amini 
220ef27db87SMehdi Amini   // Track forward refs to be resolved later.
221690952d1SMehdi Amini   ForwardReference.insert(Idx);
222ef27db87SMehdi Amini 
223ef27db87SMehdi Amini   // Create and return a placeholder, which will later be RAUW'd.
22419ef4fadSMehdi Amini   ++NumMDNodeTemporary;
225ef27db87SMehdi Amini   Metadata *MD = MDNode::getTemporary(Context, None).release();
226ef27db87SMehdi Amini   MetadataPtrs[Idx].reset(MD);
227ef27db87SMehdi Amini   return MD;
228ef27db87SMehdi Amini }
229ef27db87SMehdi Amini 
230ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
231ef27db87SMehdi Amini   Metadata *MD = lookup(Idx);
232ef27db87SMehdi Amini   if (auto *N = dyn_cast_or_null<MDNode>(MD))
233ef27db87SMehdi Amini     if (!N->isResolved())
234ef27db87SMehdi Amini       return nullptr;
235ef27db87SMehdi Amini   return MD;
236ef27db87SMehdi Amini }
237ef27db87SMehdi Amini 
238ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
239ef27db87SMehdi Amini   return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
240ef27db87SMehdi Amini }
241ef27db87SMehdi Amini 
242ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
243690952d1SMehdi Amini   if (!ForwardReference.empty())
244ef27db87SMehdi Amini     // Still forward references... can't resolve cycles.
245ef27db87SMehdi Amini     return;
246ef27db87SMehdi Amini 
247ef27db87SMehdi Amini   // Give up on finding a full definition for any forward decls that remain.
248ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.FwdDecls)
249ef27db87SMehdi Amini     OldTypeRefs.Final.insert(Ref);
250ef27db87SMehdi Amini   OldTypeRefs.FwdDecls.clear();
251ef27db87SMehdi Amini 
252ef27db87SMehdi Amini   // Upgrade from old type ref arrays.  In strange cases, this could add to
253ef27db87SMehdi Amini   // OldTypeRefs.Unknown.
254690952d1SMehdi Amini   for (const auto &Array : OldTypeRefs.Arrays)
255ef27db87SMehdi Amini     Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
256ef27db87SMehdi Amini   OldTypeRefs.Arrays.clear();
257ef27db87SMehdi Amini 
258ef27db87SMehdi Amini   // Replace old string-based type refs with the resolved node, if possible.
259ef27db87SMehdi Amini   // If we haven't seen the node, leave it to the verifier to complain about
260ef27db87SMehdi Amini   // the invalid string reference.
261ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.Unknown) {
262ef27db87SMehdi Amini     if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
263ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(CT);
264ef27db87SMehdi Amini     else
265ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(Ref.first);
266ef27db87SMehdi Amini   }
267ef27db87SMehdi Amini   OldTypeRefs.Unknown.clear();
268ef27db87SMehdi Amini 
269690952d1SMehdi Amini   if (UnresolvedNodes.empty())
270ef27db87SMehdi Amini     // Nothing to do.
271ef27db87SMehdi Amini     return;
272ef27db87SMehdi Amini 
273ef27db87SMehdi Amini   // Resolve any cycles.
274690952d1SMehdi Amini   for (unsigned I : UnresolvedNodes) {
275ef27db87SMehdi Amini     auto &MD = MetadataPtrs[I];
276ef27db87SMehdi Amini     auto *N = dyn_cast_or_null<MDNode>(MD);
277ef27db87SMehdi Amini     if (!N)
278ef27db87SMehdi Amini       continue;
279ef27db87SMehdi Amini 
280ef27db87SMehdi Amini     assert(!N->isTemporary() && "Unexpected forward reference");
281ef27db87SMehdi Amini     N->resolveCycles();
282ef27db87SMehdi Amini   }
283ef27db87SMehdi Amini 
284690952d1SMehdi Amini   // Make sure we return early again until there's another unresolved ref.
285690952d1SMehdi Amini   UnresolvedNodes.clear();
286ef27db87SMehdi Amini }
287ef27db87SMehdi Amini 
288ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
289ef27db87SMehdi Amini                                            DICompositeType &CT) {
290ef27db87SMehdi Amini   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
291ef27db87SMehdi Amini   if (CT.isForwardDecl())
292ef27db87SMehdi Amini     OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
293ef27db87SMehdi Amini   else
294ef27db87SMehdi Amini     OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
295ef27db87SMehdi Amini }
296ef27db87SMehdi Amini 
297ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
298ef27db87SMehdi Amini   auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
299ef27db87SMehdi Amini   if (LLVM_LIKELY(!UUID))
300ef27db87SMehdi Amini     return MaybeUUID;
301ef27db87SMehdi Amini 
302ef27db87SMehdi Amini   if (auto *CT = OldTypeRefs.Final.lookup(UUID))
303ef27db87SMehdi Amini     return CT;
304ef27db87SMehdi Amini 
305ef27db87SMehdi Amini   auto &Ref = OldTypeRefs.Unknown[UUID];
306ef27db87SMehdi Amini   if (!Ref)
307ef27db87SMehdi Amini     Ref = MDNode::getTemporary(Context, None);
308ef27db87SMehdi Amini   return Ref.get();
309ef27db87SMehdi Amini }
310ef27db87SMehdi Amini 
311ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
312ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
313ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
314ef27db87SMehdi Amini     return MaybeTuple;
315ef27db87SMehdi Amini 
316ef27db87SMehdi Amini   // Look through the array immediately if possible.
317ef27db87SMehdi Amini   if (!Tuple->isTemporary())
318ef27db87SMehdi Amini     return resolveTypeRefArray(Tuple);
319ef27db87SMehdi Amini 
320ef27db87SMehdi Amini   // Create and return a placeholder to use for now.  Eventually
321ef27db87SMehdi Amini   // resolveTypeRefArrays() will be resolve this forward reference.
322ef27db87SMehdi Amini   OldTypeRefs.Arrays.emplace_back(
323ef27db87SMehdi Amini       std::piecewise_construct, std::forward_as_tuple(Tuple),
324ef27db87SMehdi Amini       std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
325ef27db87SMehdi Amini   return OldTypeRefs.Arrays.back().second.get();
326ef27db87SMehdi Amini }
327ef27db87SMehdi Amini 
328ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
329ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
330ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
331ef27db87SMehdi Amini     return MaybeTuple;
332ef27db87SMehdi Amini 
333da82ce99SFangrui Song   // Look through the DITypeRefArray, upgrading each DIType *.
334ef27db87SMehdi Amini   SmallVector<Metadata *, 32> Ops;
335ef27db87SMehdi Amini   Ops.reserve(Tuple->getNumOperands());
336ef27db87SMehdi Amini   for (Metadata *MD : Tuple->operands())
337ef27db87SMehdi Amini     Ops.push_back(upgradeTypeRef(MD));
338ef27db87SMehdi Amini 
339ef27db87SMehdi Amini   return MDTuple::get(Context, Ops);
340ef27db87SMehdi Amini }
341ef27db87SMehdi Amini 
342ef27db87SMehdi Amini namespace {
343ef27db87SMehdi Amini 
344ef27db87SMehdi Amini class PlaceholderQueue {
345ef27db87SMehdi Amini   // Placeholders would thrash around when moved, so store in a std::deque
346ef27db87SMehdi Amini   // instead of some sort of vector.
347ef27db87SMehdi Amini   std::deque<DistinctMDOperandPlaceholder> PHs;
348ef27db87SMehdi Amini 
349ef27db87SMehdi Amini public:
35027379892SMehdi Amini   ~PlaceholderQueue() {
351665b4138SLuís Ferreira     assert(empty() &&
352665b4138SLuís Ferreira            "PlaceholderQueue hasn't been flushed before being destroyed");
35327379892SMehdi Amini   }
354bd76f372SSimon Pilgrim   bool empty() const { return PHs.empty(); }
355ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
356ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
35719ef4fadSMehdi Amini 
35819ef4fadSMehdi Amini   /// Return the list of temporaries nodes in the queue, these need to be
35919ef4fadSMehdi Amini   /// loaded before we can flush the queue.
36019ef4fadSMehdi Amini   void getTemporaries(BitcodeReaderMetadataList &MetadataList,
36119ef4fadSMehdi Amini                       DenseSet<unsigned> &Temporaries) {
36219ef4fadSMehdi Amini     for (auto &PH : PHs) {
36319ef4fadSMehdi Amini       auto ID = PH.getID();
36419ef4fadSMehdi Amini       auto *MD = MetadataList.lookup(ID);
36519ef4fadSMehdi Amini       if (!MD) {
36619ef4fadSMehdi Amini         Temporaries.insert(ID);
36719ef4fadSMehdi Amini         continue;
36819ef4fadSMehdi Amini       }
36919ef4fadSMehdi Amini       auto *N = dyn_cast_or_null<MDNode>(MD);
37019ef4fadSMehdi Amini       if (N && N->isTemporary())
37119ef4fadSMehdi Amini         Temporaries.insert(ID);
37219ef4fadSMehdi Amini     }
37319ef4fadSMehdi Amini   }
374ef27db87SMehdi Amini };
375ef27db87SMehdi Amini 
376ef27db87SMehdi Amini } // end anonymous namespace
377ef27db87SMehdi Amini 
378ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
379ef27db87SMehdi Amini   PHs.emplace_back(ID);
380ef27db87SMehdi Amini   return PHs.back();
381ef27db87SMehdi Amini }
382ef27db87SMehdi Amini 
383ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
384ef27db87SMehdi Amini   while (!PHs.empty()) {
3854f90ee00SMehdi Amini     auto *MD = MetadataList.lookup(PHs.front().getID());
3864f90ee00SMehdi Amini     assert(MD && "Flushing placeholder on unassigned MD");
3875ae6170fSMehdi Amini #ifndef NDEBUG
3884f90ee00SMehdi Amini     if (auto *MDN = dyn_cast<MDNode>(MD))
3895ae6170fSMehdi Amini       assert(MDN->isResolved() &&
3905ae6170fSMehdi Amini              "Flushing Placeholder while cycles aren't resolved");
3915ae6170fSMehdi Amini #endif
3925ae6170fSMehdi Amini     PHs.front().replaceUseWith(MD);
393ef27db87SMehdi Amini     PHs.pop_front();
394ef27db87SMehdi Amini   }
395ef27db87SMehdi Amini }
396ef27db87SMehdi Amini 
397d68904f9SJames Henderson } // anonymous namespace
398ef27db87SMehdi Amini 
399ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
400ffc498dfSFlorian Hahn   return make_error<StringError>(
401ffc498dfSFlorian Hahn       Message, make_error_code(BitcodeError::CorruptedBitcode));
402ffc498dfSFlorian Hahn }
403ffc498dfSFlorian Hahn 
404ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
405ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
406ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
407ef27db87SMehdi Amini   BitstreamCursor &Stream;
408ef27db87SMehdi Amini   LLVMContext &Context;
409ef27db87SMehdi Amini   Module &TheModule;
410ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
411ef27db87SMehdi Amini 
41219ef4fadSMehdi Amini   /// Cursor associated with the lazy-loading of Metadata. This is the easy way
41319ef4fadSMehdi Amini   /// to keep around the right "context" (Abbrev list) to be able to jump in
41419ef4fadSMehdi Amini   /// the middle of the metadata block and load any record.
41519ef4fadSMehdi Amini   BitstreamCursor IndexCursor;
41619ef4fadSMehdi Amini 
41719ef4fadSMehdi Amini   /// Index that keeps track of MDString values.
41819ef4fadSMehdi Amini   std::vector<StringRef> MDStringRef;
41919ef4fadSMehdi Amini 
42019ef4fadSMehdi Amini   /// On-demand loading of a single MDString. Requires the index above to be
42119ef4fadSMehdi Amini   /// populated.
42219ef4fadSMehdi Amini   MDString *lazyLoadOneMDString(unsigned Idx);
42319ef4fadSMehdi Amini 
42419ef4fadSMehdi Amini   /// Index that keeps track of where to find a metadata record in the stream.
42519ef4fadSMehdi Amini   std::vector<uint64_t> GlobalMetadataBitPosIndex;
42619ef4fadSMehdi Amini 
427c27ab339STeresa Johnson   /// Cursor position of the start of the global decl attachments, to enable
428c27ab339STeresa Johnson   /// loading using the index built for lazy loading, instead of forward
429c27ab339STeresa Johnson   /// references.
430c27ab339STeresa Johnson   uint64_t GlobalDeclAttachmentPos = 0;
431c27ab339STeresa Johnson 
432c27ab339STeresa Johnson #ifndef NDEBUG
43395875d24SZarko Todorovski   /// Baisic correctness check that we end up parsing all of the global decl
43495875d24SZarko Todorovski   /// attachments.
435c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachSkipped = 0;
436c27ab339STeresa Johnson   unsigned NumGlobalDeclAttachParsed = 0;
437c27ab339STeresa Johnson #endif
438c27ab339STeresa Johnson 
439c27ab339STeresa Johnson   /// Load the global decl attachments, using the index built for lazy loading.
440c27ab339STeresa Johnson   Expected<bool> loadGlobalDeclAttachments();
441c27ab339STeresa Johnson 
44219ef4fadSMehdi Amini   /// Populate the index above to enable lazily loading of metadata, and load
44319ef4fadSMehdi Amini   /// the named metadata as well as the transitively referenced global
44419ef4fadSMehdi Amini   /// Metadata.
44542ef1990SMehdi Amini   Expected<bool> lazyLoadModuleMetadataBlock();
44619ef4fadSMehdi Amini 
44719ef4fadSMehdi Amini   /// On-demand loading of a single metadata. Requires the index above to be
44819ef4fadSMehdi Amini   /// populated.
44919ef4fadSMehdi Amini   void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
45019ef4fadSMehdi Amini 
4519f926f70SMehdi Amini   // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4529f926f70SMehdi Amini   // point from SP to CU after a block is completly parsed.
4539f926f70SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4549f926f70SMehdi Amini 
455ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
456ef27db87SMehdi Amini   /// metadata.
457ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
458ef27db87SMehdi Amini 
459ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
460ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
461ef27db87SMehdi Amini 
4628662305bSMehdi Amini   bool StripTBAA = false;
463ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
464e37d3144SAdrian Prantl   bool NeedUpgradeToDIGlobalVariableExpression = false;
4656825fb64SAdrian Prantl   bool NeedDeclareExpressionUpgrade = false;
466ef27db87SMehdi Amini 
467ec68dd49SMehdi Amini   /// True if metadata is being parsed for a module being ThinLTO imported.
468ec68dd49SMehdi Amini   bool IsImporting = false;
469ec68dd49SMehdi Amini 
4709f926f70SMehdi Amini   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4719f926f70SMehdi Amini                          PlaceholderQueue &Placeholders, StringRef Blob,
472ef27db87SMehdi Amini                          unsigned &NextMetadataNo);
47319ef4fadSMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
474061f4a5fSBenjamin Kramer                              function_ref<void(StringRef)> CallBack);
475ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
476ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
477ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
478ef27db87SMehdi Amini 
47919ef4fadSMehdi Amini   void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
48019ef4fadSMehdi Amini 
48119ef4fadSMehdi Amini   /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
48219ef4fadSMehdi Amini   void upgradeCUSubprograms() {
48319ef4fadSMehdi Amini     for (auto CU_SP : CUSubprograms)
48419ef4fadSMehdi Amini       if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
48519ef4fadSMehdi Amini         for (auto &Op : SPs->operands())
4869d2f019fSAdrian Prantl           if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
4879d2f019fSAdrian Prantl             SP->replaceUnit(CU_SP.first);
48819ef4fadSMehdi Amini     CUSubprograms.clear();
48919ef4fadSMehdi Amini   }
49019ef4fadSMehdi Amini 
491e37d3144SAdrian Prantl   /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
492e37d3144SAdrian Prantl   void upgradeCUVariables() {
493e37d3144SAdrian Prantl     if (!NeedUpgradeToDIGlobalVariableExpression)
494e37d3144SAdrian Prantl       return;
495e37d3144SAdrian Prantl 
496e37d3144SAdrian Prantl     // Upgrade list of variables attached to the CUs.
497e37d3144SAdrian Prantl     if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
498e37d3144SAdrian Prantl       for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
499e37d3144SAdrian Prantl         auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
500e37d3144SAdrian Prantl         if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
501e37d3144SAdrian Prantl           for (unsigned I = 0; I < GVs->getNumOperands(); I++)
502e37d3144SAdrian Prantl             if (auto *GV =
503e37d3144SAdrian Prantl                     dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
50405782218SAdrian Prantl               auto *DGVE = DIGlobalVariableExpression::getDistinct(
50505782218SAdrian Prantl                   Context, GV, DIExpression::get(Context, {}));
506e37d3144SAdrian Prantl               GVs->replaceOperandWith(I, DGVE);
507e37d3144SAdrian Prantl             }
508e37d3144SAdrian Prantl       }
509e37d3144SAdrian Prantl 
510e37d3144SAdrian Prantl     // Upgrade variables attached to globals.
511e37d3144SAdrian Prantl     for (auto &GV : TheModule.globals()) {
51256a08b40SDavide Italiano       SmallVector<MDNode *, 1> MDs;
513e37d3144SAdrian Prantl       GV.getMetadata(LLVMContext::MD_dbg, MDs);
514e37d3144SAdrian Prantl       GV.eraseMetadata(LLVMContext::MD_dbg);
515e37d3144SAdrian Prantl       for (auto *MD : MDs)
5162bb217b5SSimon Pilgrim         if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
51705782218SAdrian Prantl           auto *DGVE = DIGlobalVariableExpression::getDistinct(
51805782218SAdrian Prantl               Context, DGV, DIExpression::get(Context, {}));
519e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
520e37d3144SAdrian Prantl         } else
521e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *MD);
522e37d3144SAdrian Prantl     }
523e37d3144SAdrian Prantl   }
524e37d3144SAdrian Prantl 
5256825fb64SAdrian Prantl   /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5266825fb64SAdrian Prantl   /// describes a function argument.
5276825fb64SAdrian Prantl   void upgradeDeclareExpressions(Function &F) {
5286825fb64SAdrian Prantl     if (!NeedDeclareExpressionUpgrade)
5296825fb64SAdrian Prantl       return;
5306825fb64SAdrian Prantl 
5316825fb64SAdrian Prantl     for (auto &BB : F)
5326825fb64SAdrian Prantl       for (auto &I : BB)
5336825fb64SAdrian Prantl         if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5346825fb64SAdrian Prantl           if (auto *DIExpr = DDI->getExpression())
5356825fb64SAdrian Prantl             if (DIExpr->startsWithDeref() &&
536d243cbf8SKazu Hirata                 isa_and_nonnull<Argument>(DDI->getAddress())) {
5376825fb64SAdrian Prantl               SmallVector<uint64_t, 8> Ops;
5386825fb64SAdrian Prantl               Ops.append(std::next(DIExpr->elements_begin()),
5396825fb64SAdrian Prantl                          DIExpr->elements_end());
540e5d958c4Sgbtozers               DDI->setExpression(DIExpression::get(Context, Ops));
5416825fb64SAdrian Prantl             }
5426825fb64SAdrian Prantl   }
5436825fb64SAdrian Prantl 
544ffc498dfSFlorian Hahn   /// Upgrade the expression from previous versions.
54505963a3dSArthur Eubanks   Error upgradeDIExpression(uint64_t FromVersion,
546ffc498dfSFlorian Hahn                             MutableArrayRef<uint64_t> &Expr,
547ffc498dfSFlorian Hahn                             SmallVectorImpl<uint64_t> &Buffer) {
548ffc498dfSFlorian Hahn     auto N = Expr.size();
549ffc498dfSFlorian Hahn     switch (FromVersion) {
550ffc498dfSFlorian Hahn     default:
551ffc498dfSFlorian Hahn       return error("Invalid record");
552ffc498dfSFlorian Hahn     case 0:
553ffc498dfSFlorian Hahn       if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
554ffc498dfSFlorian Hahn         Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
555ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
556ffc498dfSFlorian Hahn     case 1:
557ffc498dfSFlorian Hahn       // Move DW_OP_deref to the end.
558ffc498dfSFlorian Hahn       if (N && Expr[0] == dwarf::DW_OP_deref) {
559ffc498dfSFlorian Hahn         auto End = Expr.end();
560ffc498dfSFlorian Hahn         if (Expr.size() >= 3 &&
561ffc498dfSFlorian Hahn             *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
562ffc498dfSFlorian Hahn           End = std::prev(End, 3);
563ffc498dfSFlorian Hahn         std::move(std::next(Expr.begin()), End, Expr.begin());
564ffc498dfSFlorian Hahn         *std::prev(End) = dwarf::DW_OP_deref;
565ffc498dfSFlorian Hahn       }
566ffc498dfSFlorian Hahn       NeedDeclareExpressionUpgrade = true;
567ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
568ffc498dfSFlorian Hahn     case 2: {
569ffc498dfSFlorian Hahn       // Change DW_OP_plus to DW_OP_plus_uconst.
570ffc498dfSFlorian Hahn       // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
571ffc498dfSFlorian Hahn       auto SubExpr = ArrayRef<uint64_t>(Expr);
572ffc498dfSFlorian Hahn       while (!SubExpr.empty()) {
573ffc498dfSFlorian Hahn         // Skip past other operators with their operands
574ffc498dfSFlorian Hahn         // for this version of the IR, obtained from
575ffc498dfSFlorian Hahn         // from historic DIExpression::ExprOperand::getSize().
576ffc498dfSFlorian Hahn         size_t HistoricSize;
577ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
578ffc498dfSFlorian Hahn         default:
579ffc498dfSFlorian Hahn           HistoricSize = 1;
580ffc498dfSFlorian Hahn           break;
581ffc498dfSFlorian Hahn         case dwarf::DW_OP_constu:
582ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
583ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
584ffc498dfSFlorian Hahn           HistoricSize = 2;
585ffc498dfSFlorian Hahn           break;
586ffc498dfSFlorian Hahn         case dwarf::DW_OP_LLVM_fragment:
587ffc498dfSFlorian Hahn           HistoricSize = 3;
588ffc498dfSFlorian Hahn           break;
589ffc498dfSFlorian Hahn         }
590ffc498dfSFlorian Hahn 
591ffc498dfSFlorian Hahn         // If the expression is malformed, make sure we don't
592ffc498dfSFlorian Hahn         // copy more elements than we should.
593ffc498dfSFlorian Hahn         HistoricSize = std::min(SubExpr.size(), HistoricSize);
594ffc498dfSFlorian Hahn         ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1);
595ffc498dfSFlorian Hahn 
596ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
597ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
598ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_plus_uconst);
599ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
600ffc498dfSFlorian Hahn           break;
601ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
602ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_constu);
603ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
604ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_minus);
605ffc498dfSFlorian Hahn           break;
606ffc498dfSFlorian Hahn         default:
607ffc498dfSFlorian Hahn           Buffer.push_back(*SubExpr.begin());
608ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
609ffc498dfSFlorian Hahn           break;
610ffc498dfSFlorian Hahn         }
611ffc498dfSFlorian Hahn 
612ffc498dfSFlorian Hahn         // Continue with remaining elements.
613ffc498dfSFlorian Hahn         SubExpr = SubExpr.slice(HistoricSize);
614ffc498dfSFlorian Hahn       }
615ffc498dfSFlorian Hahn       Expr = MutableArrayRef<uint64_t>(Buffer);
616ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
617ffc498dfSFlorian Hahn     }
618ffc498dfSFlorian Hahn     case 3:
619ffc498dfSFlorian Hahn       // Up-to-date!
620ffc498dfSFlorian Hahn       break;
621ffc498dfSFlorian Hahn     }
622ffc498dfSFlorian Hahn 
623ffc498dfSFlorian Hahn     return Error::success();
624ffc498dfSFlorian Hahn   }
625ffc498dfSFlorian Hahn 
626e37d3144SAdrian Prantl   void upgradeDebugInfo() {
627e37d3144SAdrian Prantl     upgradeCUSubprograms();
628e37d3144SAdrian Prantl     upgradeCUVariables();
629e37d3144SAdrian Prantl   }
630e37d3144SAdrian Prantl 
631ef27db87SMehdi Amini public:
632ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
633ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
634ec68dd49SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID,
635ec68dd49SMehdi Amini                      bool IsImporting)
636864474c9SFlorian Hahn       : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
637864474c9SFlorian Hahn         ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
638864474c9SFlorian Hahn         TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
639864474c9SFlorian Hahn         IsImporting(IsImporting) {}
640ef27db87SMehdi Amini 
641ec68dd49SMehdi Amini   Error parseMetadata(bool ModuleLevel);
642ef27db87SMehdi Amini 
643ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6443bb4d01dSMehdi Amini 
6453bb4d01dSMehdi Amini   Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6463bb4d01dSMehdi Amini     if (ID < MDStringRef.size())
6473bb4d01dSMehdi Amini       return lazyLoadOneMDString(ID);
6483bb4d01dSMehdi Amini     if (auto *MD = MetadataList.lookup(ID))
6493bb4d01dSMehdi Amini       return MD;
6503bb4d01dSMehdi Amini     // If lazy-loading is enabled, we try recursively to load the operand
6513bb4d01dSMehdi Amini     // instead of creating a temporary.
6523bb4d01dSMehdi Amini     if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6533bb4d01dSMehdi Amini       PlaceholderQueue Placeholders;
6543bb4d01dSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
6553bb4d01dSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
6563bb4d01dSMehdi Amini       return MetadataList.lookup(ID);
6573bb4d01dSMehdi Amini     }
6583bb4d01dSMehdi Amini     return MetadataList.getMetadataFwdRef(ID);
659ef27db87SMehdi Amini   }
660ef27db87SMehdi Amini 
661ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
662ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
663ef27db87SMehdi Amini   }
664ef27db87SMehdi Amini 
665bd76f372SSimon Pilgrim   bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
666ef27db87SMehdi Amini 
667*1237c149Sserge-sans-paille   Error parseMetadataAttachment(Function &F,
668*1237c149Sserge-sans-paille                                 ArrayRef<Instruction *> InstructionList);
669ef27db87SMehdi Amini 
670ef27db87SMehdi Amini   Error parseMetadataKinds();
671ef27db87SMehdi Amini 
6728662305bSMehdi Amini   void setStripTBAA(bool Value) { StripTBAA = Value; }
673bd76f372SSimon Pilgrim   bool isStrippingTBAA() const { return StripTBAA; }
6748662305bSMehdi Amini 
675ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
676ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
6776825fb64SAdrian Prantl   void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
678ef27db87SMehdi Amini };
679ef27db87SMehdi Amini 
68042ef1990SMehdi Amini Expected<bool>
68142ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
68219ef4fadSMehdi Amini   IndexCursor = Stream;
68319ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
684c27ab339STeresa Johnson   GlobalDeclAttachmentPos = 0;
68519ef4fadSMehdi Amini   // Get the abbrevs, and preload record positions to make them lazy-loadable.
68619ef4fadSMehdi Amini   while (true) {
687c27ab339STeresa Johnson     uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
688b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
689b12a864cSDuncan P. N. Exon Smith     if (Error E =
690b12a864cSDuncan P. N. Exon Smith             IndexCursor
691b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
692b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
693b12a864cSDuncan P. N. Exon Smith       return std::move(E);
6940e828958SJF Bastien 
69519ef4fadSMehdi Amini     switch (Entry.Kind) {
69619ef4fadSMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
69719ef4fadSMehdi Amini     case BitstreamEntry::Error:
69819ef4fadSMehdi Amini       return error("Malformed block");
69919ef4fadSMehdi Amini     case BitstreamEntry::EndBlock: {
70019ef4fadSMehdi Amini       return true;
70119ef4fadSMehdi Amini     }
70219ef4fadSMehdi Amini     case BitstreamEntry::Record: {
70319ef4fadSMehdi Amini       // The interesting case.
70419ef4fadSMehdi Amini       ++NumMDRecordLoaded;
70519ef4fadSMehdi Amini       uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
706b12a864cSDuncan P. N. Exon Smith       unsigned Code;
707b12a864cSDuncan P. N. Exon Smith       if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
708b12a864cSDuncan P. N. Exon Smith         return std::move(E);
70919ef4fadSMehdi Amini       switch (Code) {
71019ef4fadSMehdi Amini       case bitc::METADATA_STRINGS: {
71119ef4fadSMehdi Amini         // Rewind and parse the strings.
7120e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
713c55cf4afSBill Wendling           return std::move(Err);
71419ef4fadSMehdi Amini         StringRef Blob;
71519ef4fadSMehdi Amini         Record.clear();
7160e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7170e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record, &Blob))
7180e828958SJF Bastien           ;
7190e828958SJF Bastien         else
7200e828958SJF Bastien           return MaybeRecord.takeError();
72119ef4fadSMehdi Amini         unsigned NumStrings = Record[0];
72219ef4fadSMehdi Amini         MDStringRef.reserve(NumStrings);
72319ef4fadSMehdi Amini         auto IndexNextMDString = [&](StringRef Str) {
72419ef4fadSMehdi Amini           MDStringRef.push_back(Str);
72519ef4fadSMehdi Amini         };
72619ef4fadSMehdi Amini         if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
727c55cf4afSBill Wendling           return std::move(Err);
72819ef4fadSMehdi Amini         break;
72919ef4fadSMehdi Amini       }
73019ef4fadSMehdi Amini       case bitc::METADATA_INDEX_OFFSET: {
73119ef4fadSMehdi Amini         // This is the offset to the index, when we see this we skip all the
73219ef4fadSMehdi Amini         // records and load only an index to these.
7330e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
734c55cf4afSBill Wendling           return std::move(Err);
73519ef4fadSMehdi Amini         Record.clear();
7360e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7370e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7380e828958SJF Bastien           ;
7390e828958SJF Bastien         else
7400e828958SJF Bastien           return MaybeRecord.takeError();
74119ef4fadSMehdi Amini         if (Record.size() != 2)
74219ef4fadSMehdi Amini           return error("Invalid record");
74319ef4fadSMehdi Amini         auto Offset = Record[0] + (Record[1] << 32);
74419ef4fadSMehdi Amini         auto BeginPos = IndexCursor.GetCurrentBitNo();
7450e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
746c55cf4afSBill Wendling           return std::move(Err);
7470e828958SJF Bastien         Expected<BitstreamEntry> MaybeEntry =
7480e828958SJF Bastien             IndexCursor.advanceSkippingSubblocks(
74919ef4fadSMehdi Amini                 BitstreamCursor::AF_DontPopBlockAtEnd);
7500e828958SJF Bastien         if (!MaybeEntry)
7510e828958SJF Bastien           return MaybeEntry.takeError();
7520e828958SJF Bastien         Entry = MaybeEntry.get();
75319ef4fadSMehdi Amini         assert(Entry.Kind == BitstreamEntry::Record &&
75419ef4fadSMehdi Amini                "Corrupted bitcode: Expected `Record` when trying to find the "
75519ef4fadSMehdi Amini                "Metadata index");
75619ef4fadSMehdi Amini         Record.clear();
7570e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7580e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7590e828958SJF Bastien           assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7600e828958SJF Bastien                  "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7610e828958SJF Bastien                  "find the Metadata index");
7620e828958SJF Bastien         else
7630e828958SJF Bastien           return MaybeCode.takeError();
76419ef4fadSMehdi Amini         // Delta unpack
76519ef4fadSMehdi Amini         auto CurrentValue = BeginPos;
76619ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.reserve(Record.size());
76719ef4fadSMehdi Amini         for (auto &Elt : Record) {
76819ef4fadSMehdi Amini           CurrentValue += Elt;
76919ef4fadSMehdi Amini           GlobalMetadataBitPosIndex.push_back(CurrentValue);
77019ef4fadSMehdi Amini         }
77119ef4fadSMehdi Amini         break;
77219ef4fadSMehdi Amini       }
77319ef4fadSMehdi Amini       case bitc::METADATA_INDEX:
77419ef4fadSMehdi Amini         // We don't expect to get there, the Index is loaded when we encounter
77519ef4fadSMehdi Amini         // the offset.
77619ef4fadSMehdi Amini         return error("Corrupted Metadata block");
77719ef4fadSMehdi Amini       case bitc::METADATA_NAME: {
77819ef4fadSMehdi Amini         // Named metadata need to be materialized now and aren't deferred.
7790e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
780c55cf4afSBill Wendling           return std::move(Err);
78119ef4fadSMehdi Amini         Record.clear();
7820e828958SJF Bastien 
7830e828958SJF Bastien         unsigned Code;
7840e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7850e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record)) {
7860e828958SJF Bastien           Code = MaybeCode.get();
78719ef4fadSMehdi Amini           assert(Code == bitc::METADATA_NAME);
7880e828958SJF Bastien         } else
7890e828958SJF Bastien           return MaybeCode.takeError();
79019ef4fadSMehdi Amini 
79119ef4fadSMehdi Amini         // Read name of the named metadata.
79219ef4fadSMehdi Amini         SmallString<8> Name(Record.begin(), Record.end());
7930e828958SJF Bastien         if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
7940e828958SJF Bastien           Code = MaybeCode.get();
7950e828958SJF Bastien         else
7960e828958SJF Bastien           return MaybeCode.takeError();
79719ef4fadSMehdi Amini 
79819ef4fadSMehdi Amini         // Named Metadata comes in two parts, we expect the name to be followed
79919ef4fadSMehdi Amini         // by the node
80019ef4fadSMehdi Amini         Record.clear();
8010e828958SJF Bastien         if (Expected<unsigned> MaybeNextBitCode =
8020e828958SJF Bastien                 IndexCursor.readRecord(Code, Record))
8030e828958SJF Bastien           assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8040e828958SJF Bastien         else
8050e828958SJF Bastien           return MaybeNextBitCode.takeError();
80619ef4fadSMehdi Amini 
80719ef4fadSMehdi Amini         // Read named metadata elements.
80819ef4fadSMehdi Amini         unsigned Size = Record.size();
80919ef4fadSMehdi Amini         NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
81019ef4fadSMehdi Amini         for (unsigned i = 0; i != Size; ++i) {
81119ef4fadSMehdi Amini           // FIXME: We could use a placeholder here, however NamedMDNode are
81219ef4fadSMehdi Amini           // taking MDNode as operand and not using the Metadata infrastructure.
81319ef4fadSMehdi Amini           // It is acknowledged by 'TODO: Inherit from Metadata' in the
81419ef4fadSMehdi Amini           // NamedMDNode class definition.
81519ef4fadSMehdi Amini           MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
816f3d2453dSTeresa Johnson           assert(MD && "Invalid metadata: expect fwd ref to MDNode");
81719ef4fadSMehdi Amini           NMD->addOperand(MD);
81819ef4fadSMehdi Amini         }
81919ef4fadSMehdi Amini         break;
82019ef4fadSMehdi Amini       }
82119ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
822c27ab339STeresa Johnson         if (!GlobalDeclAttachmentPos)
823c27ab339STeresa Johnson           GlobalDeclAttachmentPos = SavedPos;
824c27ab339STeresa Johnson #ifndef NDEBUG
825c27ab339STeresa Johnson         NumGlobalDeclAttachSkipped++;
826c27ab339STeresa Johnson #endif
82719ef4fadSMehdi Amini         break;
82819ef4fadSMehdi Amini       }
82919ef4fadSMehdi Amini       case bitc::METADATA_KIND:
83019ef4fadSMehdi Amini       case bitc::METADATA_STRING_OLD:
83119ef4fadSMehdi Amini       case bitc::METADATA_OLD_FN_NODE:
83219ef4fadSMehdi Amini       case bitc::METADATA_OLD_NODE:
83319ef4fadSMehdi Amini       case bitc::METADATA_VALUE:
83419ef4fadSMehdi Amini       case bitc::METADATA_DISTINCT_NODE:
83519ef4fadSMehdi Amini       case bitc::METADATA_NODE:
83619ef4fadSMehdi Amini       case bitc::METADATA_LOCATION:
83719ef4fadSMehdi Amini       case bitc::METADATA_GENERIC_DEBUG:
83819ef4fadSMehdi Amini       case bitc::METADATA_SUBRANGE:
83919ef4fadSMehdi Amini       case bitc::METADATA_ENUMERATOR:
84019ef4fadSMehdi Amini       case bitc::METADATA_BASIC_TYPE:
841f91d18eaSSourabh Singh Tomar       case bitc::METADATA_STRING_TYPE:
84219ef4fadSMehdi Amini       case bitc::METADATA_DERIVED_TYPE:
84319ef4fadSMehdi Amini       case bitc::METADATA_COMPOSITE_TYPE:
84419ef4fadSMehdi Amini       case bitc::METADATA_SUBROUTINE_TYPE:
84519ef4fadSMehdi Amini       case bitc::METADATA_MODULE:
84619ef4fadSMehdi Amini       case bitc::METADATA_FILE:
84719ef4fadSMehdi Amini       case bitc::METADATA_COMPILE_UNIT:
84819ef4fadSMehdi Amini       case bitc::METADATA_SUBPROGRAM:
84919ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK:
85019ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK_FILE:
85119ef4fadSMehdi Amini       case bitc::METADATA_NAMESPACE:
8526ed5706aSAdrian Prantl       case bitc::METADATA_COMMON_BLOCK:
85319ef4fadSMehdi Amini       case bitc::METADATA_MACRO:
85419ef4fadSMehdi Amini       case bitc::METADATA_MACRO_FILE:
85519ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_TYPE:
85619ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_VALUE:
85719ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR:
85819ef4fadSMehdi Amini       case bitc::METADATA_LOCAL_VAR:
8592c864551SShiva Chen       case bitc::METADATA_LABEL:
86019ef4fadSMehdi Amini       case bitc::METADATA_EXPRESSION:
86119ef4fadSMehdi Amini       case bitc::METADATA_OBJC_PROPERTY:
86219ef4fadSMehdi Amini       case bitc::METADATA_IMPORTED_ENTITY:
86319ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR_EXPR:
864a6dd01afSAlok Kumar Sharma       case bitc::METADATA_GENERIC_SUBRANGE:
86519ef4fadSMehdi Amini         // We don't expect to see any of these, if we see one, give up on
86619ef4fadSMehdi Amini         // lazy-loading and fallback.
86719ef4fadSMehdi Amini         MDStringRef.clear();
86819ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.clear();
86919ef4fadSMehdi Amini         return false;
87019ef4fadSMehdi Amini       }
87119ef4fadSMehdi Amini       break;
87219ef4fadSMehdi Amini     }
87319ef4fadSMehdi Amini     }
87419ef4fadSMehdi Amini   }
87519ef4fadSMehdi Amini }
87619ef4fadSMehdi Amini 
877c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index.
878c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be
879c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying
880c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index
881c27ab339STeresa Johnson // instead of creating temporaries.
882c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
883c27ab339STeresa Johnson   // Nothing to do if we didn't find any of these metadata records.
884c27ab339STeresa Johnson   if (!GlobalDeclAttachmentPos)
885c27ab339STeresa Johnson     return true;
886c27ab339STeresa Johnson   // Use a temporary cursor so that we don't mess up the main Stream cursor or
887c27ab339STeresa Johnson   // the lazy loading IndexCursor (which holds the necessary abbrev ids).
888c27ab339STeresa Johnson   BitstreamCursor TempCursor = Stream;
889c27ab339STeresa Johnson   SmallVector<uint64_t, 64> Record;
890c27ab339STeresa Johnson   // Jump to the position before the first global decl attachment, so we can
891c27ab339STeresa Johnson   // scan for the first BitstreamEntry record.
892c27ab339STeresa Johnson   if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
893c27ab339STeresa Johnson     return std::move(Err);
894c27ab339STeresa Johnson   while (true) {
895b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
896b12a864cSDuncan P. N. Exon Smith     if (Error E =
897b12a864cSDuncan P. N. Exon Smith             TempCursor
898b12a864cSDuncan P. N. Exon Smith                 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
899b12a864cSDuncan P. N. Exon Smith                 .moveInto(Entry))
900b12a864cSDuncan P. N. Exon Smith       return std::move(E);
901c27ab339STeresa Johnson 
902c27ab339STeresa Johnson     switch (Entry.Kind) {
903c27ab339STeresa Johnson     case BitstreamEntry::SubBlock: // Handled for us already.
904c27ab339STeresa Johnson     case BitstreamEntry::Error:
905c27ab339STeresa Johnson       return error("Malformed block");
906c27ab339STeresa Johnson     case BitstreamEntry::EndBlock:
90795875d24SZarko Todorovski       // Check that we parsed them all.
908c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
909c27ab339STeresa Johnson       return true;
910c27ab339STeresa Johnson     case BitstreamEntry::Record:
911c27ab339STeresa Johnson       break;
912c27ab339STeresa Johnson     }
913c27ab339STeresa Johnson     uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
914c27ab339STeresa Johnson     Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
915c27ab339STeresa Johnson     if (!MaybeCode)
916c27ab339STeresa Johnson       return MaybeCode.takeError();
917c27ab339STeresa Johnson     if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
918c27ab339STeresa Johnson       // Anything other than a global decl attachment signals the end of
91995875d24SZarko Todorovski       // these records. Check that we parsed them all.
920c27ab339STeresa Johnson       assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
921c27ab339STeresa Johnson       return true;
922c27ab339STeresa Johnson     }
923c27ab339STeresa Johnson #ifndef NDEBUG
924c27ab339STeresa Johnson     NumGlobalDeclAttachParsed++;
925c27ab339STeresa Johnson #endif
926c27ab339STeresa Johnson     // FIXME: we need to do this early because we don't materialize global
927c27ab339STeresa Johnson     // value explicitly.
928c27ab339STeresa Johnson     if (Error Err = TempCursor.JumpToBit(CurrentPos))
929c27ab339STeresa Johnson       return std::move(Err);
930c27ab339STeresa Johnson     Record.clear();
931c27ab339STeresa Johnson     if (Expected<unsigned> MaybeRecord =
932c27ab339STeresa Johnson             TempCursor.readRecord(Entry.ID, Record))
933c27ab339STeresa Johnson       ;
934c27ab339STeresa Johnson     else
935c27ab339STeresa Johnson       return MaybeRecord.takeError();
936c27ab339STeresa Johnson     if (Record.size() % 2 == 0)
937c27ab339STeresa Johnson       return error("Invalid record");
938c27ab339STeresa Johnson     unsigned ValueID = Record[0];
939c27ab339STeresa Johnson     if (ValueID >= ValueList.size())
940c27ab339STeresa Johnson       return error("Invalid record");
941c27ab339STeresa Johnson     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
942c27ab339STeresa Johnson       // Need to save and restore the current position since
943c27ab339STeresa Johnson       // parseGlobalObjectAttachment will resolve all forward references which
944c27ab339STeresa Johnson       // would require parsing from locations stored in the index.
945c27ab339STeresa Johnson       CurrentPos = TempCursor.GetCurrentBitNo();
946c27ab339STeresa Johnson       if (Error Err = parseGlobalObjectAttachment(
947c27ab339STeresa Johnson               *GO, ArrayRef<uint64_t>(Record).slice(1)))
948c27ab339STeresa Johnson         return std::move(Err);
949c27ab339STeresa Johnson       if (Error Err = TempCursor.JumpToBit(CurrentPos))
950c27ab339STeresa Johnson         return std::move(Err);
951c27ab339STeresa Johnson     }
952c27ab339STeresa Johnson   }
953c27ab339STeresa Johnson }
954c27ab339STeresa Johnson 
955ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
956ef27db87SMehdi Amini /// module level metadata.
957ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
958ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
959ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
960ef27db87SMehdi Amini 
96119ef4fadSMehdi Amini   // Record the entry position so that we can jump back here and efficiently
96219ef4fadSMehdi Amini   // skip the whole block in case we lazy-load.
96319ef4fadSMehdi Amini   auto EntryPos = Stream.GetCurrentBitNo();
96419ef4fadSMehdi Amini 
9650e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9660e828958SJF Bastien     return Err;
967ef27db87SMehdi Amini 
968ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
969ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
9709f926f70SMehdi Amini 
97119ef4fadSMehdi Amini   // We lazy-load module-level metadata: we build an index for each record, and
97219ef4fadSMehdi Amini   // then load individual record as needed, starting with the named metadata.
97319ef4fadSMehdi Amini   if (ModuleLevel && IsImporting && MetadataList.empty() &&
97419ef4fadSMehdi Amini       !DisableLazyLoading) {
97542ef1990SMehdi Amini     auto SuccessOrErr = lazyLoadModuleMetadataBlock();
97619ef4fadSMehdi Amini     if (!SuccessOrErr)
97719ef4fadSMehdi Amini       return SuccessOrErr.takeError();
97819ef4fadSMehdi Amini     if (SuccessOrErr.get()) {
97919ef4fadSMehdi Amini       // An index was successfully created and we will be able to load metadata
98019ef4fadSMehdi Amini       // on-demand.
98119ef4fadSMehdi Amini       MetadataList.resize(MDStringRef.size() +
98219ef4fadSMehdi Amini                           GlobalMetadataBitPosIndex.size());
98319ef4fadSMehdi Amini 
984c27ab339STeresa Johnson       // Now that we have built the index, load the global decl attachments
985c27ab339STeresa Johnson       // that were deferred during that process. This avoids creating
986c27ab339STeresa Johnson       // temporaries.
987c27ab339STeresa Johnson       SuccessOrErr = loadGlobalDeclAttachments();
988c27ab339STeresa Johnson       if (!SuccessOrErr)
989c27ab339STeresa Johnson         return SuccessOrErr.takeError();
990c27ab339STeresa Johnson       assert(SuccessOrErr.get());
991c27ab339STeresa Johnson 
99219ef4fadSMehdi Amini       // Reading the named metadata created forward references and/or
99319ef4fadSMehdi Amini       // placeholders, that we flush here.
99419ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
995e37d3144SAdrian Prantl       upgradeDebugInfo();
99619ef4fadSMehdi Amini       // Return at the beginning of the block, since it is easy to skip it
99719ef4fadSMehdi Amini       // entirely from there.
99819ef4fadSMehdi Amini       Stream.ReadBlockEnd(); // Pop the abbrev block context.
9990e828958SJF Bastien       if (Error Err = IndexCursor.JumpToBit(EntryPos))
10000e828958SJF Bastien         return Err;
10010e828958SJF Bastien       if (Error Err = Stream.SkipBlock()) {
10020e828958SJF Bastien         // FIXME this drops the error on the floor, which
10030e828958SJF Bastien         // ThinLTO/X86/debuginfo-cu-import.ll relies on.
10040e828958SJF Bastien         consumeError(std::move(Err));
10050e828958SJF Bastien         return Error::success();
10060e828958SJF Bastien       }
100719ef4fadSMehdi Amini       return Error::success();
100819ef4fadSMehdi Amini     }
100919ef4fadSMehdi Amini     // Couldn't load an index, fallback to loading all the block "old-style".
101019ef4fadSMehdi Amini   }
101119ef4fadSMehdi Amini 
101219ef4fadSMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
101319ef4fadSMehdi Amini 
10149f926f70SMehdi Amini   // Read all the records.
10159f926f70SMehdi Amini   while (true) {
1016b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
1017b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1018b12a864cSDuncan P. N. Exon Smith       return E;
10199f926f70SMehdi Amini 
10209f926f70SMehdi Amini     switch (Entry.Kind) {
10219f926f70SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
10229f926f70SMehdi Amini     case BitstreamEntry::Error:
10239f926f70SMehdi Amini       return error("Malformed block");
10249f926f70SMehdi Amini     case BitstreamEntry::EndBlock:
102519ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
1026e37d3144SAdrian Prantl       upgradeDebugInfo();
10279f926f70SMehdi Amini       return Error::success();
10289f926f70SMehdi Amini     case BitstreamEntry::Record:
10299f926f70SMehdi Amini       // The interesting case.
10309f926f70SMehdi Amini       break;
10319f926f70SMehdi Amini     }
10329f926f70SMehdi Amini 
10339f926f70SMehdi Amini     // Read a record.
10349f926f70SMehdi Amini     Record.clear();
10359f926f70SMehdi Amini     StringRef Blob;
103619ef4fadSMehdi Amini     ++NumMDRecordLoaded;
10370e828958SJF Bastien     if (Expected<unsigned> MaybeCode =
10380e828958SJF Bastien             Stream.readRecord(Entry.ID, Record, &Blob)) {
10390e828958SJF Bastien       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
10400e828958SJF Bastien                                        Blob, NextMetadataNo))
10419f926f70SMehdi Amini         return Err;
10420e828958SJF Bastien     } else
10430e828958SJF Bastien       return MaybeCode.takeError();
10449f926f70SMehdi Amini   }
10459f926f70SMehdi Amini }
10469f926f70SMehdi Amini 
104719ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
104819ef4fadSMehdi Amini   ++NumMDStringLoaded;
104919ef4fadSMehdi Amini   if (Metadata *MD = MetadataList.lookup(ID))
105019ef4fadSMehdi Amini     return cast<MDString>(MD);
105119ef4fadSMehdi Amini   auto MDS = MDString::get(Context, MDStringRef[ID]);
105219ef4fadSMehdi Amini   MetadataList.assignValue(MDS, ID);
105319ef4fadSMehdi Amini   return MDS;
105419ef4fadSMehdi Amini }
105519ef4fadSMehdi Amini 
105619ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
105719ef4fadSMehdi Amini     unsigned ID, PlaceholderQueue &Placeholders) {
105819ef4fadSMehdi Amini   assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
105919ef4fadSMehdi Amini   assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
106019ef4fadSMehdi Amini   // Lookup first if the metadata hasn't already been loaded.
106119ef4fadSMehdi Amini   if (auto *MD = MetadataList.lookup(ID)) {
106287399997SSimon Pilgrim     auto *N = cast<MDNode>(MD);
106367d2cc1fSMehdi Amini     if (!N->isTemporary())
106467d2cc1fSMehdi Amini       return;
106519ef4fadSMehdi Amini   }
106619ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
106719ef4fadSMehdi Amini   StringRef Blob;
10680e828958SJF Bastien   if (Error Err = IndexCursor.JumpToBit(
10690e828958SJF Bastien           GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
10700e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed jumping: " +
107121661607SSimon Pilgrim                        Twine(toString(std::move(Err))));
1072b12a864cSDuncan P. N. Exon Smith   BitstreamEntry Entry;
1073b12a864cSDuncan P. N. Exon Smith   if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
10740e828958SJF Bastien     // FIXME this drops the error on the floor.
10750e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
1076b12a864cSDuncan P. N. Exon Smith                        Twine(toString(std::move(E))));
107719ef4fadSMehdi Amini   ++NumMDRecordLoaded;
10780e828958SJF Bastien   if (Expected<unsigned> MaybeCode =
10790e828958SJF Bastien           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10800e828958SJF Bastien     if (Error Err =
10810e828958SJF Bastien             parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10820e828958SJF Bastien       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
108321661607SSimon Pilgrim                          Twine(toString(std::move(Err))));
10840e828958SJF Bastien   } else
108521661607SSimon Pilgrim     report_fatal_error("Can't lazyload MD: " +
108621661607SSimon Pilgrim                        Twine(toString(MaybeCode.takeError())));
108719ef4fadSMehdi Amini }
108819ef4fadSMehdi Amini 
108919ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
109019ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
109119ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
109219ef4fadSMehdi Amini     PlaceholderQueue &Placeholders) {
109319ef4fadSMehdi Amini   DenseSet<unsigned> Temporaries;
10942aed0813SKazu Hirata   while (true) {
109519ef4fadSMehdi Amini     // Populate Temporaries with the placeholders that haven't been loaded yet.
109619ef4fadSMehdi Amini     Placeholders.getTemporaries(MetadataList, Temporaries);
109719ef4fadSMehdi Amini 
109819ef4fadSMehdi Amini     // If we don't have any temporary, or FwdReference, we're done!
109919ef4fadSMehdi Amini     if (Temporaries.empty() && !MetadataList.hasFwdRefs())
110019ef4fadSMehdi Amini       break;
110119ef4fadSMehdi Amini 
110219ef4fadSMehdi Amini     // First, load all the temporaries. This can add new placeholders or
110319ef4fadSMehdi Amini     // forward references.
110419ef4fadSMehdi Amini     for (auto ID : Temporaries)
110519ef4fadSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
110619ef4fadSMehdi Amini     Temporaries.clear();
110719ef4fadSMehdi Amini 
110819ef4fadSMehdi Amini     // Second, load the forward-references. This can also add new placeholders
110919ef4fadSMehdi Amini     // or forward references.
111019ef4fadSMehdi Amini     while (MetadataList.hasFwdRefs())
111119ef4fadSMehdi Amini       lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
111219ef4fadSMehdi Amini   }
111319ef4fadSMehdi Amini   // At this point we don't have any forward reference remaining, or temporary
111419ef4fadSMehdi Amini   // that haven't been loaded. We can safely drop RAUW support and mark cycles
111519ef4fadSMehdi Amini   // as resolved.
111619ef4fadSMehdi Amini   MetadataList.tryToResolveCycles();
111719ef4fadSMehdi Amini 
111819ef4fadSMehdi Amini   // Finally, everything is in place, we can replace the placeholders operands
111919ef4fadSMehdi Amini   // with the final node they refer to.
112019ef4fadSMehdi Amini   Placeholders.flush(MetadataList);
112119ef4fadSMehdi Amini }
112219ef4fadSMehdi Amini 
11239f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
11249f926f70SMehdi Amini     SmallVectorImpl<uint64_t> &Record, unsigned Code,
112519ef4fadSMehdi Amini     PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
11269f926f70SMehdi Amini 
11279f926f70SMehdi Amini   bool IsDistinct = false;
1128ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
112919ef4fadSMehdi Amini     if (ID < MDStringRef.size())
113019ef4fadSMehdi Amini       return lazyLoadOneMDString(ID);
113167d2cc1fSMehdi Amini     if (!IsDistinct) {
113267d2cc1fSMehdi Amini       if (auto *MD = MetadataList.lookup(ID))
113367d2cc1fSMehdi Amini         return MD;
113467d2cc1fSMehdi Amini       // If lazy-loading is enabled, we try recursively to load the operand
113567d2cc1fSMehdi Amini       // instead of creating a temporary.
113667d2cc1fSMehdi Amini       if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
113767d2cc1fSMehdi Amini         // Create a temporary for the node that is referencing the operand we
113867d2cc1fSMehdi Amini         // will lazy-load. It is needed before recursing in case there are
113967d2cc1fSMehdi Amini         // uniquing cycles.
114067d2cc1fSMehdi Amini         MetadataList.getMetadataFwdRef(NextMetadataNo);
114167d2cc1fSMehdi Amini         lazyLoadOneMetadata(ID, Placeholders);
114267d2cc1fSMehdi Amini         return MetadataList.lookup(ID);
114367d2cc1fSMehdi Amini       }
114467d2cc1fSMehdi Amini       // Return a temporary.
1145ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
114667d2cc1fSMehdi Amini     }
1147ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1148ef27db87SMehdi Amini       return MD;
1149ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
1150ef27db87SMehdi Amini   };
1151ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1152ef27db87SMehdi Amini     if (ID)
1153ef27db87SMehdi Amini       return getMD(ID - 1);
1154ef27db87SMehdi Amini     return nullptr;
1155ef27db87SMehdi Amini   };
1156ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1157ef27db87SMehdi Amini     if (ID)
1158ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
1159ef27db87SMehdi Amini     return nullptr;
1160ef27db87SMehdi Amini   };
1161ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
1162ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
1163ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
116419ef4fadSMehdi Amini     auto MDS = getMDOrNull(ID);
116519ef4fadSMehdi Amini     return cast_or_null<MDString>(MDS);
1166ef27db87SMehdi Amini   };
1167ef27db87SMehdi Amini 
1168ef27db87SMehdi Amini   // Support for old type refs.
1169ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
1170ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1171ef27db87SMehdi Amini   };
1172ef27db87SMehdi Amini 
1173ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
1174ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1175ef27db87SMehdi Amini 
1176ef27db87SMehdi Amini   switch (Code) {
1177ef27db87SMehdi Amini   default: // Default behavior: ignore.
1178ef27db87SMehdi Amini     break;
1179ef27db87SMehdi Amini   case bitc::METADATA_NAME: {
1180ef27db87SMehdi Amini     // Read name of the named metadata.
1181ef27db87SMehdi Amini     SmallString<8> Name(Record.begin(), Record.end());
1182ef27db87SMehdi Amini     Record.clear();
1183b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.ReadCode().moveInto(Code))
1184b12a864cSDuncan P. N. Exon Smith       return E;
1185ef27db87SMehdi Amini 
118619ef4fadSMehdi Amini     ++NumMDRecordLoaded;
11870e828958SJF Bastien     if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
11880e828958SJF Bastien       if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1189ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
11900e828958SJF Bastien     } else
11910e828958SJF Bastien       return MaybeNextBitCode.takeError();
1192ef27db87SMehdi Amini 
1193ef27db87SMehdi Amini     // Read named metadata elements.
1194ef27db87SMehdi Amini     unsigned Size = Record.size();
1195ef27db87SMehdi Amini     NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1196ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; ++i) {
1197ef27db87SMehdi Amini       MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1198ef27db87SMehdi Amini       if (!MD)
1199f3d2453dSTeresa Johnson         return error("Invalid named metadata: expect fwd ref to MDNode");
1200ef27db87SMehdi Amini       NMD->addOperand(MD);
1201ef27db87SMehdi Amini     }
1202ef27db87SMehdi Amini     break;
1203ef27db87SMehdi Amini   }
1204ef27db87SMehdi Amini   case bitc::METADATA_OLD_FN_NODE: {
12054abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1206ef27db87SMehdi Amini     // This is a LocalAsMetadata record, the only type of function-local
1207ef27db87SMehdi Amini     // metadata.
1208ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1209ef27db87SMehdi Amini       return error("Invalid record");
1210ef27db87SMehdi Amini 
1211ef27db87SMehdi Amini     // If this isn't a LocalAsMetadata record, we're dropping it.  This used
1212ef27db87SMehdi Amini     // to be legal, but there's no upgrade path.
1213ef27db87SMehdi Amini     auto dropRecord = [&] {
1214c05c9db3SIvan Krasin       MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1215c05c9db3SIvan Krasin       NextMetadataNo++;
1216ef27db87SMehdi Amini     };
1217ef27db87SMehdi Amini     if (Record.size() != 2) {
1218ef27db87SMehdi Amini       dropRecord();
1219ef27db87SMehdi Amini       break;
1220ef27db87SMehdi Amini     }
1221ef27db87SMehdi Amini 
1222ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1223ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1224ef27db87SMehdi Amini       dropRecord();
1225ef27db87SMehdi Amini       break;
1226ef27db87SMehdi Amini     }
1227ef27db87SMehdi Amini 
1228ef27db87SMehdi Amini     MetadataList.assignValue(
1229ef27db87SMehdi Amini         LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1230c05c9db3SIvan Krasin         NextMetadataNo);
1231c05c9db3SIvan Krasin     NextMetadataNo++;
1232ef27db87SMehdi Amini     break;
1233ef27db87SMehdi Amini   }
1234ef27db87SMehdi Amini   case bitc::METADATA_OLD_NODE: {
12354abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1236ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1237ef27db87SMehdi Amini       return error("Invalid record");
1238ef27db87SMehdi Amini 
1239ef27db87SMehdi Amini     unsigned Size = Record.size();
1240ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1241ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; i += 2) {
1242ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[i]);
1243ef27db87SMehdi Amini       if (!Ty)
1244ef27db87SMehdi Amini         return error("Invalid record");
1245ef27db87SMehdi Amini       if (Ty->isMetadataTy())
1246ef27db87SMehdi Amini         Elts.push_back(getMD(Record[i + 1]));
1247ef27db87SMehdi Amini       else if (!Ty->isVoidTy()) {
1248ef27db87SMehdi Amini         auto *MD =
1249ef27db87SMehdi Amini             ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1250ef27db87SMehdi Amini         assert(isa<ConstantAsMetadata>(MD) &&
1251ef27db87SMehdi Amini                "Expected non-function-local metadata");
1252ef27db87SMehdi Amini         Elts.push_back(MD);
1253ef27db87SMehdi Amini       } else
1254ef27db87SMehdi Amini         Elts.push_back(nullptr);
1255ef27db87SMehdi Amini     }
1256c05c9db3SIvan Krasin     MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1257c05c9db3SIvan Krasin     NextMetadataNo++;
1258ef27db87SMehdi Amini     break;
1259ef27db87SMehdi Amini   }
1260ef27db87SMehdi Amini   case bitc::METADATA_VALUE: {
1261ef27db87SMehdi Amini     if (Record.size() != 2)
1262ef27db87SMehdi Amini       return error("Invalid record");
1263ef27db87SMehdi Amini 
1264ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1265ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy())
1266ef27db87SMehdi Amini       return error("Invalid record");
1267ef27db87SMehdi Amini 
1268ef27db87SMehdi Amini     MetadataList.assignValue(
1269ef27db87SMehdi Amini         ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1270c05c9db3SIvan Krasin         NextMetadataNo);
1271c05c9db3SIvan Krasin     NextMetadataNo++;
1272ef27db87SMehdi Amini     break;
1273ef27db87SMehdi Amini   }
1274ef27db87SMehdi Amini   case bitc::METADATA_DISTINCT_NODE:
1275ef27db87SMehdi Amini     IsDistinct = true;
1276ef27db87SMehdi Amini     LLVM_FALLTHROUGH;
1277ef27db87SMehdi Amini   case bitc::METADATA_NODE: {
1278ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1279ef27db87SMehdi Amini     Elts.reserve(Record.size());
1280ef27db87SMehdi Amini     for (unsigned ID : Record)
1281ef27db87SMehdi Amini       Elts.push_back(getMDOrNull(ID));
1282ef27db87SMehdi Amini     MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1283ef27db87SMehdi Amini                                         : MDNode::get(Context, Elts),
1284c05c9db3SIvan Krasin                              NextMetadataNo);
1285c05c9db3SIvan Krasin     NextMetadataNo++;
1286ef27db87SMehdi Amini     break;
1287ef27db87SMehdi Amini   }
1288ef27db87SMehdi Amini   case bitc::METADATA_LOCATION: {
1289386ad01cSVedant Kumar     if (Record.size() != 5 && Record.size() != 6)
1290ef27db87SMehdi Amini       return error("Invalid record");
1291ef27db87SMehdi Amini 
1292ef27db87SMehdi Amini     IsDistinct = Record[0];
1293ef27db87SMehdi Amini     unsigned Line = Record[1];
1294ef27db87SMehdi Amini     unsigned Column = Record[2];
1295ef27db87SMehdi Amini     Metadata *Scope = getMD(Record[3]);
1296ef27db87SMehdi Amini     Metadata *InlinedAt = getMDOrNull(Record[4]);
1297386ad01cSVedant Kumar     bool ImplicitCode = Record.size() == 6 && Record[5];
1298ef27db87SMehdi Amini     MetadataList.assignValue(
1299eb7f6020SCalixte Denizet         GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1300eb7f6020SCalixte Denizet                                      ImplicitCode)),
1301c05c9db3SIvan Krasin         NextMetadataNo);
1302c05c9db3SIvan Krasin     NextMetadataNo++;
1303ef27db87SMehdi Amini     break;
1304ef27db87SMehdi Amini   }
1305ef27db87SMehdi Amini   case bitc::METADATA_GENERIC_DEBUG: {
1306ef27db87SMehdi Amini     if (Record.size() < 4)
1307ef27db87SMehdi Amini       return error("Invalid record");
1308ef27db87SMehdi Amini 
1309ef27db87SMehdi Amini     IsDistinct = Record[0];
1310ef27db87SMehdi Amini     unsigned Tag = Record[1];
1311ef27db87SMehdi Amini     unsigned Version = Record[2];
1312ef27db87SMehdi Amini 
1313ef27db87SMehdi Amini     if (Tag >= 1u << 16 || Version != 0)
1314ef27db87SMehdi Amini       return error("Invalid record");
1315ef27db87SMehdi Amini 
1316ef27db87SMehdi Amini     auto *Header = getMDString(Record[3]);
1317ef27db87SMehdi Amini     SmallVector<Metadata *, 8> DwarfOps;
1318ef27db87SMehdi Amini     for (unsigned I = 4, E = Record.size(); I != E; ++I)
1319ef27db87SMehdi Amini       DwarfOps.push_back(getMDOrNull(Record[I]));
1320ef27db87SMehdi Amini     MetadataList.assignValue(
1321ef27db87SMehdi Amini         GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1322c05c9db3SIvan Krasin         NextMetadataNo);
1323c05c9db3SIvan Krasin     NextMetadataNo++;
1324ef27db87SMehdi Amini     break;
1325ef27db87SMehdi Amini   }
1326ef27db87SMehdi Amini   case bitc::METADATA_SUBRANGE: {
1327fdf40917SSander de Smalen     Metadata *Val = nullptr;
1328fdf40917SSander de Smalen     // Operand 'count' is interpreted as:
1329fdf40917SSander de Smalen     // - Signed integer (version 0)
1330fdf40917SSander de Smalen     // - Metadata node  (version 1)
1331d20bf5a7SAlok Kumar Sharma     // Operand 'lowerBound' is interpreted as:
1332d20bf5a7SAlok Kumar Sharma     // - Signed integer (version 0 and 1)
1333d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1334d20bf5a7SAlok Kumar Sharma     // Operands 'upperBound' and 'stride' are interpreted as:
1335d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1336fdf40917SSander de Smalen     switch (Record[0] >> 1) {
1337fdf40917SSander de Smalen     case 0:
1338fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange,
1339d20bf5a7SAlok Kumar Sharma                             (Context, Record[1], unrotateSign(Record[2])));
1340fdf40917SSander de Smalen       break;
1341fdf40917SSander de Smalen     case 1:
1342fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1343d20bf5a7SAlok Kumar Sharma                                          unrotateSign(Record[2])));
1344d20bf5a7SAlok Kumar Sharma       break;
1345d20bf5a7SAlok Kumar Sharma     case 2:
1346d20bf5a7SAlok Kumar Sharma       Val = GET_OR_DISTINCT(
1347d20bf5a7SAlok Kumar Sharma           DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1348d20bf5a7SAlok Kumar Sharma                        getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1349fdf40917SSander de Smalen       break;
1350fdf40917SSander de Smalen     default:
1351fdf40917SSander de Smalen       return error("Invalid record: Unsupported version of DISubrange");
1352fdf40917SSander de Smalen     }
1353ef27db87SMehdi Amini 
1354fdf40917SSander de Smalen     MetadataList.assignValue(Val, NextMetadataNo);
1355fdf40917SSander de Smalen     IsDistinct = Record[0] & 1;
1356c05c9db3SIvan Krasin     NextMetadataNo++;
1357ef27db87SMehdi Amini     break;
1358ef27db87SMehdi Amini   }
1359a6dd01afSAlok Kumar Sharma   case bitc::METADATA_GENERIC_SUBRANGE: {
1360a6dd01afSAlok Kumar Sharma     Metadata *Val = nullptr;
1361a6dd01afSAlok Kumar Sharma     Val = GET_OR_DISTINCT(DIGenericSubrange,
1362a6dd01afSAlok Kumar Sharma                           (Context, getMDOrNull(Record[1]),
1363a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1364a6dd01afSAlok Kumar Sharma                            getMDOrNull(Record[4])));
1365a6dd01afSAlok Kumar Sharma 
1366a6dd01afSAlok Kumar Sharma     MetadataList.assignValue(Val, NextMetadataNo);
1367a6dd01afSAlok Kumar Sharma     IsDistinct = Record[0] & 1;
1368a6dd01afSAlok Kumar Sharma     NextMetadataNo++;
1369a6dd01afSAlok Kumar Sharma     break;
1370a6dd01afSAlok Kumar Sharma   }
1371ef27db87SMehdi Amini   case bitc::METADATA_ENUMERATOR: {
1372aad3d578SLemonBoy     if (Record.size() < 3)
1373ef27db87SMehdi Amini       return error("Invalid record");
1374ef27db87SMehdi Amini 
137508dc66efSMomchil Velikov     IsDistinct = Record[0] & 1;
137608dc66efSMomchil Velikov     bool IsUnsigned = Record[0] & 2;
1377aad3d578SLemonBoy     bool IsBigInt = Record[0] & 4;
1378aad3d578SLemonBoy     APInt Value;
1379aad3d578SLemonBoy 
1380aad3d578SLemonBoy     if (IsBigInt) {
1381aad3d578SLemonBoy       const uint64_t BitWidth = Record[1];
1382aad3d578SLemonBoy       const size_t NumWords = Record.size() - 3;
1383aad3d578SLemonBoy       Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1384aad3d578SLemonBoy     } else
1385aad3d578SLemonBoy       Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1386aad3d578SLemonBoy 
1387ef27db87SMehdi Amini     MetadataList.assignValue(
1388aad3d578SLemonBoy         GET_OR_DISTINCT(DIEnumerator,
1389aad3d578SLemonBoy                         (Context, Value, IsUnsigned, getMDString(Record[2]))),
1390c05c9db3SIvan Krasin         NextMetadataNo);
1391c05c9db3SIvan Krasin     NextMetadataNo++;
1392ef27db87SMehdi Amini     break;
1393ef27db87SMehdi Amini   }
1394ef27db87SMehdi Amini   case bitc::METADATA_BASIC_TYPE: {
139555f42629SAdrian Prantl     if (Record.size() < 6 || Record.size() > 7)
1396ef27db87SMehdi Amini       return error("Invalid record");
1397ef27db87SMehdi Amini 
1398ef27db87SMehdi Amini     IsDistinct = Record[0];
1399665b4138SLuís Ferreira     DINode::DIFlags Flags = (Record.size() > 6)
1400665b4138SLuís Ferreira                                 ? static_cast<DINode::DIFlags>(Record[6])
1401665b4138SLuís Ferreira                                 : DINode::FlagZero;
140255f42629SAdrian Prantl 
1403ef27db87SMehdi Amini     MetadataList.assignValue(
1404ef27db87SMehdi Amini         GET_OR_DISTINCT(DIBasicType,
14059f926f70SMehdi Amini                         (Context, Record[1], getMDString(Record[2]), Record[3],
140655f42629SAdrian Prantl                          Record[4], Record[5], Flags)),
1407c05c9db3SIvan Krasin         NextMetadataNo);
1408c05c9db3SIvan Krasin     NextMetadataNo++;
1409ef27db87SMehdi Amini     break;
1410ef27db87SMehdi Amini   }
1411f91d18eaSSourabh Singh Tomar   case bitc::METADATA_STRING_TYPE: {
141228bfa57aSChih-Ping Chen     if (Record.size() > 9 || Record.size() < 8)
1413f91d18eaSSourabh Singh Tomar       return error("Invalid record");
1414f91d18eaSSourabh Singh Tomar 
1415f91d18eaSSourabh Singh Tomar     IsDistinct = Record[0];
141628bfa57aSChih-Ping Chen     bool SizeIs8 = Record.size() == 8;
141728bfa57aSChih-Ping Chen     // StringLocationExp (i.e. Record[5]) is added at a later time
141828bfa57aSChih-Ping Chen     // than the other fields. The code here enables backward compatibility.
141928bfa57aSChih-Ping Chen     Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
142028bfa57aSChih-Ping Chen     unsigned Offset = SizeIs8 ? 5 : 6;
1421f91d18eaSSourabh Singh Tomar     MetadataList.assignValue(
1422f91d18eaSSourabh Singh Tomar         GET_OR_DISTINCT(DIStringType,
1423f91d18eaSSourabh Singh Tomar                         (Context, Record[1], getMDString(Record[2]),
1424f91d18eaSSourabh Singh Tomar                          getMDOrNull(Record[3]), getMDOrNull(Record[4]),
142528bfa57aSChih-Ping Chen                          StringLocationExp, Record[Offset], Record[Offset + 1],
142628bfa57aSChih-Ping Chen                          Record[Offset + 2])),
1427f91d18eaSSourabh Singh Tomar         NextMetadataNo);
1428f91d18eaSSourabh Singh Tomar     NextMetadataNo++;
1429f91d18eaSSourabh Singh Tomar     break;
1430f91d18eaSSourabh Singh Tomar   }
1431ef27db87SMehdi Amini   case bitc::METADATA_DERIVED_TYPE: {
1432430e2238SYonghong Song     if (Record.size() < 12 || Record.size() > 14)
1433ef27db87SMehdi Amini       return error("Invalid record");
1434ef27db87SMehdi Amini 
1435d5561e0aSKonstantin Zhuravlyov     // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1436d5561e0aSKonstantin Zhuravlyov     // that there is no DWARF address space associated with DIDerivedType.
1437d5561e0aSKonstantin Zhuravlyov     Optional<unsigned> DWARFAddressSpace;
1438d5561e0aSKonstantin Zhuravlyov     if (Record.size() > 12 && Record[12])
1439d5561e0aSKonstantin Zhuravlyov       DWARFAddressSpace = Record[12] - 1;
1440d5561e0aSKonstantin Zhuravlyov 
1441430e2238SYonghong Song     Metadata *Annotations = nullptr;
1442430e2238SYonghong Song     if (Record.size() > 13 && Record[13])
1443430e2238SYonghong Song       Annotations = getMDOrNull(Record[13]);
1444430e2238SYonghong Song 
1445ef27db87SMehdi Amini     IsDistinct = Record[0];
1446ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1447ef27db87SMehdi Amini     MetadataList.assignValue(
1448ef27db87SMehdi Amini         GET_OR_DISTINCT(DIDerivedType,
1449ef27db87SMehdi Amini                         (Context, Record[1], getMDString(Record[2]),
1450ef27db87SMehdi Amini                          getMDOrNull(Record[3]), Record[4],
1451ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5]),
1452ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1453d5561e0aSKonstantin Zhuravlyov                          Record[9], DWARFAddressSpace, Flags,
1454430e2238SYonghong Song                          getDITypeRefOrNull(Record[11]), Annotations)),
1455c05c9db3SIvan Krasin         NextMetadataNo);
1456c05c9db3SIvan Krasin     NextMetadataNo++;
1457ef27db87SMehdi Amini     break;
1458ef27db87SMehdi Amini   }
1459ef27db87SMehdi Amini   case bitc::METADATA_COMPOSITE_TYPE: {
14600b32dca1SYonghong Song     if (Record.size() < 16 || Record.size() > 22)
1461ef27db87SMehdi Amini       return error("Invalid record");
1462ef27db87SMehdi Amini 
1463ef27db87SMehdi Amini     // If we have a UUID and this is not a forward declaration, lookup the
1464ef27db87SMehdi Amini     // mapping.
1465ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1466ef27db87SMehdi Amini     bool IsNotUsedInTypeRef = Record[0] >= 2;
1467ef27db87SMehdi Amini     unsigned Tag = Record[1];
1468ef27db87SMehdi Amini     MDString *Name = getMDString(Record[2]);
1469ef27db87SMehdi Amini     Metadata *File = getMDOrNull(Record[3]);
1470ef27db87SMehdi Amini     unsigned Line = Record[4];
1471ef27db87SMehdi Amini     Metadata *Scope = getDITypeRefOrNull(Record[5]);
1472a61f5e37STeresa Johnson     Metadata *BaseType = nullptr;
1473ef27db87SMehdi Amini     uint64_t SizeInBits = Record[7];
1474ef27db87SMehdi Amini     if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1475ef27db87SMehdi Amini       return error("Alignment value is too large");
1476ef27db87SMehdi Amini     uint32_t AlignInBits = Record[8];
1477a61f5e37STeresa Johnson     uint64_t OffsetInBits = 0;
1478ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1479a61f5e37STeresa Johnson     Metadata *Elements = nullptr;
1480ef27db87SMehdi Amini     unsigned RuntimeLang = Record[12];
1481a61f5e37STeresa Johnson     Metadata *VTableHolder = nullptr;
1482a61f5e37STeresa Johnson     Metadata *TemplateParams = nullptr;
14838c59921cSAdrian Prantl     Metadata *Discriminator = nullptr;
14844042ada1SAlok Kumar Sharma     Metadata *DataLocation = nullptr;
14852d10258aSAlok Kumar Sharma     Metadata *Associated = nullptr;
14862d10258aSAlok Kumar Sharma     Metadata *Allocated = nullptr;
148796bd4d34SAlok Kumar Sharma     Metadata *Rank = nullptr;
14880b32dca1SYonghong Song     Metadata *Annotations = nullptr;
1489ef27db87SMehdi Amini     auto *Identifier = getMDString(Record[15]);
1490a61f5e37STeresa Johnson     // If this module is being parsed so that it can be ThinLTO imported
1491a61f5e37STeresa Johnson     // into another module, composite types only need to be imported
1492a61f5e37STeresa Johnson     // as type declarations (unless full type definitions requested).
1493a61f5e37STeresa Johnson     // Create type declarations up front to save memory. Also, buildODRType
1494a61f5e37STeresa Johnson     // handles the case where this is type ODRed with a definition needed
1495a61f5e37STeresa Johnson     // by the importing module, in which case the existing definition is
1496a61f5e37STeresa Johnson     // used.
14975a8dba5bSTeresa Johnson     if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1498a61f5e37STeresa Johnson         (Tag == dwarf::DW_TAG_enumeration_type ||
1499a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_class_type ||
1500a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_structure_type ||
1501a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_union_type)) {
1502a61f5e37STeresa Johnson       Flags = Flags | DINode::FlagFwdDecl;
1503a61f5e37STeresa Johnson     } else {
1504a61f5e37STeresa Johnson       BaseType = getDITypeRefOrNull(Record[6]);
1505a61f5e37STeresa Johnson       OffsetInBits = Record[9];
1506a61f5e37STeresa Johnson       Elements = getMDOrNull(Record[11]);
1507a61f5e37STeresa Johnson       VTableHolder = getDITypeRefOrNull(Record[13]);
1508a61f5e37STeresa Johnson       TemplateParams = getMDOrNull(Record[14]);
15098c59921cSAdrian Prantl       if (Record.size() > 16)
15108c59921cSAdrian Prantl         Discriminator = getMDOrNull(Record[16]);
15114042ada1SAlok Kumar Sharma       if (Record.size() > 17)
15124042ada1SAlok Kumar Sharma         DataLocation = getMDOrNull(Record[17]);
15132d10258aSAlok Kumar Sharma       if (Record.size() > 19) {
15142d10258aSAlok Kumar Sharma         Associated = getMDOrNull(Record[18]);
15152d10258aSAlok Kumar Sharma         Allocated = getMDOrNull(Record[19]);
15162d10258aSAlok Kumar Sharma       }
151796bd4d34SAlok Kumar Sharma       if (Record.size() > 20) {
151896bd4d34SAlok Kumar Sharma         Rank = getMDOrNull(Record[20]);
151996bd4d34SAlok Kumar Sharma       }
15200b32dca1SYonghong Song       if (Record.size() > 21) {
15210b32dca1SYonghong Song         Annotations = getMDOrNull(Record[21]);
15220b32dca1SYonghong Song       }
1523a61f5e37STeresa Johnson     }
1524ef27db87SMehdi Amini     DICompositeType *CT = nullptr;
1525ef27db87SMehdi Amini     if (Identifier)
1526ef27db87SMehdi Amini       CT = DICompositeType::buildODRType(
1527ef27db87SMehdi Amini           Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1528ef27db87SMehdi Amini           SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
15292d10258aSAlok Kumar Sharma           VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
15300b32dca1SYonghong Song           Allocated, Rank, Annotations);
1531ef27db87SMehdi Amini 
1532ef27db87SMehdi Amini     // Create a node if we didn't get a lazy ODR type.
1533ef27db87SMehdi Amini     if (!CT)
1534ef27db87SMehdi Amini       CT = GET_OR_DISTINCT(DICompositeType,
1535ef27db87SMehdi Amini                            (Context, Tag, Name, File, Line, Scope, BaseType,
1536ef27db87SMehdi Amini                             SizeInBits, AlignInBits, OffsetInBits, Flags,
15379f926f70SMehdi Amini                             Elements, RuntimeLang, VTableHolder, TemplateParams,
15382d10258aSAlok Kumar Sharma                             Identifier, Discriminator, DataLocation, Associated,
15390b32dca1SYonghong Song                             Allocated, Rank, Annotations));
1540ef27db87SMehdi Amini     if (!IsNotUsedInTypeRef && Identifier)
1541ef27db87SMehdi Amini       MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1542ef27db87SMehdi Amini 
1543c05c9db3SIvan Krasin     MetadataList.assignValue(CT, NextMetadataNo);
1544c05c9db3SIvan Krasin     NextMetadataNo++;
1545ef27db87SMehdi Amini     break;
1546ef27db87SMehdi Amini   }
1547ef27db87SMehdi Amini   case bitc::METADATA_SUBROUTINE_TYPE: {
1548ef27db87SMehdi Amini     if (Record.size() < 3 || Record.size() > 4)
1549ef27db87SMehdi Amini       return error("Invalid record");
1550ef27db87SMehdi Amini     bool IsOldTypeRefArray = Record[0] < 2;
1551ef27db87SMehdi Amini     unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1552ef27db87SMehdi Amini 
1553ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1554ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1555ef27db87SMehdi Amini     Metadata *Types = getMDOrNull(Record[2]);
1556ef27db87SMehdi Amini     if (LLVM_UNLIKELY(IsOldTypeRefArray))
1557ef27db87SMehdi Amini       Types = MetadataList.upgradeTypeRefArray(Types);
1558ef27db87SMehdi Amini 
1559ef27db87SMehdi Amini     MetadataList.assignValue(
1560ef27db87SMehdi Amini         GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1561c05c9db3SIvan Krasin         NextMetadataNo);
1562c05c9db3SIvan Krasin     NextMetadataNo++;
1563ef27db87SMehdi Amini     break;
1564ef27db87SMehdi Amini   }
1565ef27db87SMehdi Amini 
1566ef27db87SMehdi Amini   case bitc::METADATA_MODULE: {
15675f75dcf5SChih-Ping Chen     if (Record.size() < 5 || Record.size() > 9)
1568ef27db87SMehdi Amini       return error("Invalid record");
1569ef27db87SMehdi Amini 
15705f75dcf5SChih-Ping Chen     unsigned Offset = Record.size() >= 8 ? 2 : 1;
1571ef27db87SMehdi Amini     IsDistinct = Record[0];
1572ef27db87SMehdi Amini     MetadataList.assignValue(
1573e59744fdSSourabh Singh Tomar         GET_OR_DISTINCT(
1574e59744fdSSourabh Singh Tomar             DIModule,
15755f75dcf5SChih-Ping Chen             (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
1576e59744fdSSourabh Singh Tomar              getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1577e59744fdSSourabh Singh Tomar              getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1578e59744fdSSourabh Singh Tomar              getMDString(Record[4 + Offset]),
15795f75dcf5SChih-Ping Chen              Record.size() <= 7 ? 0 : Record[7],
15805f75dcf5SChih-Ping Chen              Record.size() <= 8 ? false : Record[8])),
1581c05c9db3SIvan Krasin         NextMetadataNo);
1582c05c9db3SIvan Krasin     NextMetadataNo++;
1583ef27db87SMehdi Amini     break;
1584ef27db87SMehdi Amini   }
1585ef27db87SMehdi Amini 
1586ef27db87SMehdi Amini   case bitc::METADATA_FILE: {
158716c7bdafSScott Linder     if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1588ef27db87SMehdi Amini       return error("Invalid record");
1589ef27db87SMehdi Amini 
1590ef27db87SMehdi Amini     IsDistinct = Record[0];
15917160384dSScott Linder     Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
15927160384dSScott Linder     // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
15937160384dSScott Linder     // is not present. This matches up with the old internal representation,
15947160384dSScott Linder     // and the old encoding for CSK_None in the ChecksumKind. The new
15957160384dSScott Linder     // representation reserves the value 0 in the ChecksumKind to continue to
15967160384dSScott Linder     // encode None in a backwards-compatible way.
159716c7bdafSScott Linder     if (Record.size() > 4 && Record[3] && Record[4])
15987160384dSScott Linder       Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
15997160384dSScott Linder                        getMDString(Record[4]));
1600ef27db87SMehdi Amini     MetadataList.assignValue(
16019f926f70SMehdi Amini         GET_OR_DISTINCT(
16027faeecc8SAmjad Aboud             DIFile,
160316c7bdafSScott Linder             (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
160416c7bdafSScott Linder              Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
160516c7bdafSScott Linder                                : None)),
1606c05c9db3SIvan Krasin         NextMetadataNo);
1607c05c9db3SIvan Krasin     NextMetadataNo++;
1608ef27db87SMehdi Amini     break;
1609ef27db87SMehdi Amini   }
1610ef27db87SMehdi Amini   case bitc::METADATA_COMPILE_UNIT: {
1611e4e7e447SAdrian Prantl     if (Record.size() < 14 || Record.size() > 22)
1612ef27db87SMehdi Amini       return error("Invalid record");
1613ef27db87SMehdi Amini 
1614ef27db87SMehdi Amini     // Ignore Record[0], which indicates whether this compile unit is
1615ef27db87SMehdi Amini     // distinct.  It's always distinct.
1616ef27db87SMehdi Amini     IsDistinct = true;
1617ef27db87SMehdi Amini     auto *CU = DICompileUnit::getDistinct(
1618ef27db87SMehdi Amini         Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1619ef27db87SMehdi Amini         Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1620ef27db87SMehdi Amini         Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1621ef27db87SMehdi Amini         getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1622ef27db87SMehdi Amini         Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1623ef27db87SMehdi Amini         Record.size() <= 14 ? 0 : Record[14],
16240944a8c2SDehao Chen         Record.size() <= 16 ? true : Record[16],
1625b52e2366SPeter Collingbourne         Record.size() <= 17 ? false : Record[17],
1626bb279116SDavid Blaikie         Record.size() <= 18 ? 0 : Record[18],
16272aed0813SKazu Hirata         Record.size() <= 19 ? false : Record[19],
1628e4e7e447SAdrian Prantl         Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1629e4e7e447SAdrian Prantl         Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1630ef27db87SMehdi Amini 
1631c05c9db3SIvan Krasin     MetadataList.assignValue(CU, NextMetadataNo);
1632c05c9db3SIvan Krasin     NextMetadataNo++;
1633ef27db87SMehdi Amini 
1634ef27db87SMehdi Amini     // Move the Upgrade the list of subprograms.
1635ef27db87SMehdi Amini     if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1636ef27db87SMehdi Amini       CUSubprograms.push_back({CU, SPs});
1637ef27db87SMehdi Amini     break;
1638ef27db87SMehdi Amini   }
1639ef27db87SMehdi Amini   case bitc::METADATA_SUBPROGRAM: {
16401d12b885SAdrian Prantl     if (Record.size() < 18 || Record.size() > 21)
1641ef27db87SMehdi Amini       return error("Invalid record");
1642ef27db87SMehdi Amini 
1643adcdc1bdSPaul Robinson     bool HasSPFlags = Record[0] & 4;
164438a61873SPetar Jovanovic 
164538a61873SPetar Jovanovic     DINode::DIFlags Flags;
164638a61873SPetar Jovanovic     DISubprogram::DISPFlags SPFlags;
164738a61873SPetar Jovanovic     if (!HasSPFlags)
164838a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
164938a61873SPetar Jovanovic     else {
165038a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11]);
165138a61873SPetar Jovanovic       SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
165238a61873SPetar Jovanovic     }
165338a61873SPetar Jovanovic 
165438a61873SPetar Jovanovic     // Support for old metadata when
165538a61873SPetar Jovanovic     // subprogram specific flags are placed in DIFlags.
165638a61873SPetar Jovanovic     const unsigned DIFlagMainSubprogram = 1 << 21;
165738a61873SPetar Jovanovic     bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
165838a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag)
165938a61873SPetar Jovanovic       // Remove old DIFlagMainSubprogram from DIFlags.
166038a61873SPetar Jovanovic       // Note: This assumes that any future use of bit 21 defaults to it
166138a61873SPetar Jovanovic       // being 0.
166238a61873SPetar Jovanovic       Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
166338a61873SPetar Jovanovic 
166438a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag && HasSPFlags)
166538a61873SPetar Jovanovic       SPFlags |= DISubprogram::SPFlagMainSubprogram;
166638a61873SPetar Jovanovic     else if (!HasSPFlags)
166738a61873SPetar Jovanovic       SPFlags = DISubprogram::toSPFlags(
1668adcdc1bdSPaul Robinson           /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
166938a61873SPetar Jovanovic           /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
1670435a5a36SKazu Hirata           /*IsMainSubprogram=*/HasOldMainSubprogramFlag);
1671adcdc1bdSPaul Robinson 
1672adcdc1bdSPaul Robinson     // All definitions should be distinct.
1673adcdc1bdSPaul Robinson     IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1674ef27db87SMehdi Amini     // Version 1 has a Function as Record[15].
1675ef27db87SMehdi Amini     // Version 2 has removed Record[15].
1676ef27db87SMehdi Amini     // Version 3 has the Unit as Record[15].
1677ef27db87SMehdi Amini     // Version 4 added thisAdjustment.
1678adcdc1bdSPaul Robinson     // Version 5 repacked flags into DISPFlags, changing many element numbers.
1679adcdc1bdSPaul Robinson     bool HasUnit = Record[0] & 2;
1680adcdc1bdSPaul Robinson     if (!HasSPFlags && HasUnit && Record.size() < 19)
1681ef27db87SMehdi Amini       return error("Invalid record");
1682adcdc1bdSPaul Robinson     if (HasSPFlags && !HasUnit)
1683adcdc1bdSPaul Robinson       return error("Invalid record");
1684adcdc1bdSPaul Robinson     // Accommodate older formats.
1685adcdc1bdSPaul Robinson     bool HasFn = false;
1686adcdc1bdSPaul Robinson     bool HasThisAdj = true;
1687adcdc1bdSPaul Robinson     bool HasThrownTypes = true;
1688d383df32SYonghong Song     bool HasAnnotations = false;
1689adcdc1bdSPaul Robinson     unsigned OffsetA = 0;
1690adcdc1bdSPaul Robinson     unsigned OffsetB = 0;
1691adcdc1bdSPaul Robinson     if (!HasSPFlags) {
1692adcdc1bdSPaul Robinson       OffsetA = 2;
1693adcdc1bdSPaul Robinson       OffsetB = 2;
1694adcdc1bdSPaul Robinson       if (Record.size() >= 19) {
1695adcdc1bdSPaul Robinson         HasFn = !HasUnit;
1696adcdc1bdSPaul Robinson         OffsetB++;
1697adcdc1bdSPaul Robinson       }
1698adcdc1bdSPaul Robinson       HasThisAdj = Record.size() >= 20;
1699adcdc1bdSPaul Robinson       HasThrownTypes = Record.size() >= 21;
1700d383df32SYonghong Song     } else {
1701d383df32SYonghong Song       HasAnnotations = Record.size() >= 19;
1702adcdc1bdSPaul Robinson     }
1703adcdc1bdSPaul Robinson     Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1704ef27db87SMehdi Amini     DISubprogram *SP = GET_OR_DISTINCT(
17051d12b885SAdrian Prantl         DISubprogram,
17061d12b885SAdrian Prantl         (Context,
1707ef27db87SMehdi Amini          getDITypeRefOrNull(Record[1]),           // scope
1708ef27db87SMehdi Amini          getMDString(Record[2]),                  // name
1709ef27db87SMehdi Amini          getMDString(Record[3]),                  // linkageName
1710ef27db87SMehdi Amini          getMDOrNull(Record[4]),                  // file
1711ef27db87SMehdi Amini          Record[5],                               // line
1712ef27db87SMehdi Amini          getMDOrNull(Record[6]),                  // type
1713adcdc1bdSPaul Robinson          Record[7 + OffsetA],                     // scopeLine
1714adcdc1bdSPaul Robinson          getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
1715adcdc1bdSPaul Robinson          Record[10 + OffsetA],                    // virtualIndex
1716adcdc1bdSPaul Robinson          HasThisAdj ? Record[16 + OffsetB] : 0,   // thisAdjustment
171738a61873SPetar Jovanovic          Flags,                                   // flags
1718cda54210SPaul Robinson          SPFlags,                                 // SPFlags
1719ef27db87SMehdi Amini          HasUnit ? CUorFn : nullptr,              // unit
1720adcdc1bdSPaul Robinson          getMDOrNull(Record[13 + OffsetB]),       // templateParams
1721adcdc1bdSPaul Robinson          getMDOrNull(Record[14 + OffsetB]),       // declaration
1722adcdc1bdSPaul Robinson          getMDOrNull(Record[15 + OffsetB]),       // retainedNodes
1723adcdc1bdSPaul Robinson          HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1724d383df32SYonghong Song                         : nullptr, // thrownTypes
1725d383df32SYonghong Song          HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1726d383df32SYonghong Song                         : nullptr // annotations
1727ef27db87SMehdi Amini          ));
1728c05c9db3SIvan Krasin     MetadataList.assignValue(SP, NextMetadataNo);
1729c05c9db3SIvan Krasin     NextMetadataNo++;
1730ef27db87SMehdi Amini 
1731ef27db87SMehdi Amini     // Upgrade sp->function mapping to function->sp mapping.
1732ef27db87SMehdi Amini     if (HasFn) {
1733ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1734ef27db87SMehdi Amini         if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1735ef27db87SMehdi Amini           if (F->isMaterializable())
1736ef27db87SMehdi Amini             // Defer until materialized; unmaterialized functions may not have
1737ef27db87SMehdi Amini             // metadata.
1738ef27db87SMehdi Amini             FunctionsWithSPs[F] = SP;
1739ef27db87SMehdi Amini           else if (!F->empty())
1740ef27db87SMehdi Amini             F->setSubprogram(SP);
1741ef27db87SMehdi Amini         }
1742ef27db87SMehdi Amini     }
1743ef27db87SMehdi Amini     break;
1744ef27db87SMehdi Amini   }
1745ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK: {
1746ef27db87SMehdi Amini     if (Record.size() != 5)
1747ef27db87SMehdi Amini       return error("Invalid record");
1748ef27db87SMehdi Amini 
1749ef27db87SMehdi Amini     IsDistinct = Record[0];
1750ef27db87SMehdi Amini     MetadataList.assignValue(
1751ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlock,
1752ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1753ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3], Record[4])),
1754c05c9db3SIvan Krasin         NextMetadataNo);
1755c05c9db3SIvan Krasin     NextMetadataNo++;
1756ef27db87SMehdi Amini     break;
1757ef27db87SMehdi Amini   }
1758ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1759ef27db87SMehdi Amini     if (Record.size() != 4)
1760ef27db87SMehdi Amini       return error("Invalid record");
1761ef27db87SMehdi Amini 
1762ef27db87SMehdi Amini     IsDistinct = Record[0];
1763ef27db87SMehdi Amini     MetadataList.assignValue(
1764ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlockFile,
1765ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1766ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3])),
1767c05c9db3SIvan Krasin         NextMetadataNo);
1768c05c9db3SIvan Krasin     NextMetadataNo++;
1769ef27db87SMehdi Amini     break;
1770ef27db87SMehdi Amini   }
17716ed5706aSAdrian Prantl   case bitc::METADATA_COMMON_BLOCK: {
17726ed5706aSAdrian Prantl     IsDistinct = Record[0] & 1;
17736ed5706aSAdrian Prantl     MetadataList.assignValue(
17746ed5706aSAdrian Prantl         GET_OR_DISTINCT(DICommonBlock,
17756ed5706aSAdrian Prantl                         (Context, getMDOrNull(Record[1]),
17766ed5706aSAdrian Prantl                          getMDOrNull(Record[2]), getMDString(Record[3]),
17776ed5706aSAdrian Prantl                          getMDOrNull(Record[4]), Record[5])),
17786ed5706aSAdrian Prantl         NextMetadataNo);
17796ed5706aSAdrian Prantl     NextMetadataNo++;
17806ed5706aSAdrian Prantl     break;
17816ed5706aSAdrian Prantl   }
1782ef27db87SMehdi Amini   case bitc::METADATA_NAMESPACE: {
1783fed4f399SAdrian Prantl     // Newer versions of DINamespace dropped file and line.
1784fed4f399SAdrian Prantl     MDString *Name;
1785fed4f399SAdrian Prantl     if (Record.size() == 3)
1786fed4f399SAdrian Prantl       Name = getMDString(Record[2]);
1787fed4f399SAdrian Prantl     else if (Record.size() == 5)
1788fed4f399SAdrian Prantl       Name = getMDString(Record[3]);
1789fed4f399SAdrian Prantl     else
1790ef27db87SMehdi Amini       return error("Invalid record");
1791ef27db87SMehdi Amini 
1792ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1793ef27db87SMehdi Amini     bool ExportSymbols = Record[0] & 2;
1794ef27db87SMehdi Amini     MetadataList.assignValue(
1795ef27db87SMehdi Amini         GET_OR_DISTINCT(DINamespace,
1796fed4f399SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1797c05c9db3SIvan Krasin         NextMetadataNo);
1798c05c9db3SIvan Krasin     NextMetadataNo++;
1799ef27db87SMehdi Amini     break;
1800ef27db87SMehdi Amini   }
1801ef27db87SMehdi Amini   case bitc::METADATA_MACRO: {
1802ef27db87SMehdi Amini     if (Record.size() != 5)
1803ef27db87SMehdi Amini       return error("Invalid record");
1804ef27db87SMehdi Amini 
1805ef27db87SMehdi Amini     IsDistinct = Record[0];
1806ef27db87SMehdi Amini     MetadataList.assignValue(
1807ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacro,
18089f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDString(Record[3]),
18099f926f70SMehdi Amini                          getMDString(Record[4]))),
1810c05c9db3SIvan Krasin         NextMetadataNo);
1811c05c9db3SIvan Krasin     NextMetadataNo++;
1812ef27db87SMehdi Amini     break;
1813ef27db87SMehdi Amini   }
1814ef27db87SMehdi Amini   case bitc::METADATA_MACRO_FILE: {
1815ef27db87SMehdi Amini     if (Record.size() != 5)
1816ef27db87SMehdi Amini       return error("Invalid record");
1817ef27db87SMehdi Amini 
1818ef27db87SMehdi Amini     IsDistinct = Record[0];
1819ef27db87SMehdi Amini     MetadataList.assignValue(
1820ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacroFile,
18219f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDOrNull(Record[3]),
18229f926f70SMehdi Amini                          getMDOrNull(Record[4]))),
1823c05c9db3SIvan Krasin         NextMetadataNo);
1824c05c9db3SIvan Krasin     NextMetadataNo++;
1825ef27db87SMehdi Amini     break;
1826ef27db87SMehdi Amini   }
1827ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_TYPE: {
18287a42babeSAwanish Pandey     if (Record.size() < 3 || Record.size() > 4)
1829ef27db87SMehdi Amini       return error("Invalid record");
1830ef27db87SMehdi Amini 
1831ef27db87SMehdi Amini     IsDistinct = Record[0];
18327a42babeSAwanish Pandey     MetadataList.assignValue(
18337a42babeSAwanish Pandey         GET_OR_DISTINCT(DITemplateTypeParameter,
1834ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
18357a42babeSAwanish Pandey                          getDITypeRefOrNull(Record[2]),
18367a42babeSAwanish Pandey                          (Record.size() == 4) ? getMDOrNull(Record[3])
18377a42babeSAwanish Pandey                                               : getMDOrNull(false))),
1838c05c9db3SIvan Krasin         NextMetadataNo);
1839c05c9db3SIvan Krasin     NextMetadataNo++;
1840ef27db87SMehdi Amini     break;
1841ef27db87SMehdi Amini   }
1842ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_VALUE: {
18437a42babeSAwanish Pandey     if (Record.size() < 5 || Record.size() > 6)
1844ef27db87SMehdi Amini       return error("Invalid record");
1845ef27db87SMehdi Amini 
1846ef27db87SMehdi Amini     IsDistinct = Record[0];
18477a42babeSAwanish Pandey 
1848ef27db87SMehdi Amini     MetadataList.assignValue(
18497a42babeSAwanish Pandey         GET_OR_DISTINCT(
18507a42babeSAwanish Pandey             DITemplateValueParameter,
1851ef27db87SMehdi Amini             (Context, Record[1], getMDString(Record[2]),
1852ef27db87SMehdi Amini              getDITypeRefOrNull(Record[3]),
18537a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
18547a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[5])
18557a42babeSAwanish Pandey                                   : getMDOrNull(Record[4]))),
1856c05c9db3SIvan Krasin         NextMetadataNo);
1857c05c9db3SIvan Krasin     NextMetadataNo++;
1858ef27db87SMehdi Amini     break;
1859ef27db87SMehdi Amini   }
1860ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_VAR: {
1861f8ab35a4SMatthew Voss     if (Record.size() < 11 || Record.size() > 13)
1862ef27db87SMehdi Amini       return error("Invalid record");
1863ef27db87SMehdi Amini 
1864bceaaa96SAdrian Prantl     IsDistinct = Record[0] & 1;
1865bceaaa96SAdrian Prantl     unsigned Version = Record[0] >> 1;
1866ef27db87SMehdi Amini 
1867f8ab35a4SMatthew Voss     if (Version == 2) {
186830c28848SYonghong Song       Metadata *Annotations = nullptr;
186930c28848SYonghong Song       if (Record.size() > 12)
187030c28848SYonghong Song         Annotations = getMDOrNull(Record[12]);
187130c28848SYonghong Song 
1872f8ab35a4SMatthew Voss       MetadataList.assignValue(
1873665b4138SLuís Ferreira           GET_OR_DISTINCT(DIGlobalVariable,
1874665b4138SLuís Ferreira                           (Context, getMDOrNull(Record[1]),
1875665b4138SLuís Ferreira                            getMDString(Record[2]), getMDString(Record[3]),
1876665b4138SLuís Ferreira                            getMDOrNull(Record[4]), Record[5],
1877f8ab35a4SMatthew Voss                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1878665b4138SLuís Ferreira                            getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1879665b4138SLuís Ferreira                            Record[11], Annotations)),
1880f8ab35a4SMatthew Voss           NextMetadataNo);
1881f8ab35a4SMatthew Voss 
1882f8ab35a4SMatthew Voss       NextMetadataNo++;
1883f8ab35a4SMatthew Voss     } else if (Version == 1) {
1884f8ab35a4SMatthew Voss       // No upgrade necessary. A null field will be introduced to indicate
1885f8ab35a4SMatthew Voss       // that no parameter information is available.
1886bceaaa96SAdrian Prantl       MetadataList.assignValue(
1887665b4138SLuís Ferreira           GET_OR_DISTINCT(
1888665b4138SLuís Ferreira               DIGlobalVariable,
1889665b4138SLuís Ferreira               (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1890665b4138SLuís Ferreira                getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
18919f926f70SMehdi Amini                getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1892665b4138SLuís Ferreira                getMDOrNull(Record[10]), nullptr, Record[11], nullptr)),
1893c05c9db3SIvan Krasin           NextMetadataNo);
1894f8ab35a4SMatthew Voss 
1895c05c9db3SIvan Krasin       NextMetadataNo++;
1896bceaaa96SAdrian Prantl     } else if (Version == 0) {
1897ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
1898ef27db87SMehdi Amini       // ConstantInt here.
1899a5bf2d70SAdrian Prantl       NeedUpgradeToDIGlobalVariableExpression = true;
1900ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
1901ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1902ef27db87SMehdi Amini       if (Record.size() > 11) {
1903ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1904ef27db87SMehdi Amini           return error("Alignment value is too large");
1905ef27db87SMehdi Amini         AlignInBits = Record[11];
1906ef27db87SMehdi Amini       }
1907ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
1908ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1909ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1910ef27db87SMehdi Amini           Attach = GV;
1911ef27db87SMehdi Amini           Expr = nullptr;
1912ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1913ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
1914ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
1915ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
1916ef27db87SMehdi Amini         } else {
1917ef27db87SMehdi Amini           Expr = nullptr;
1918ef27db87SMehdi Amini         }
1919ef27db87SMehdi Amini       }
1920ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
1921ef27db87SMehdi Amini           DIGlobalVariable,
1922ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1923ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1924bceaaa96SAdrian Prantl            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
192530c28848SYonghong Song            getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));
192603c6d31aSAdrian Prantl 
1927e37d3144SAdrian Prantl       DIGlobalVariableExpression *DGVE = nullptr;
1928e37d3144SAdrian Prantl       if (Attach || Expr)
192905782218SAdrian Prantl         DGVE = DIGlobalVariableExpression::getDistinct(
193005782218SAdrian Prantl             Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
193173ec0656SAdrian Prantl       if (Attach)
1932bceaaa96SAdrian Prantl         Attach->addDebugInfo(DGVE);
1933e37d3144SAdrian Prantl 
1934e37d3144SAdrian Prantl       auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1935e37d3144SAdrian Prantl       MetadataList.assignValue(MDNode, NextMetadataNo);
1936e37d3144SAdrian Prantl       NextMetadataNo++;
1937bceaaa96SAdrian Prantl     } else
1938bceaaa96SAdrian Prantl       return error("Invalid record");
193973ec0656SAdrian Prantl 
1940ef27db87SMehdi Amini     break;
1941ef27db87SMehdi Amini   }
1942ef27db87SMehdi Amini   case bitc::METADATA_LOCAL_VAR: {
1943ef27db87SMehdi Amini     // 10th field is for the obseleted 'inlinedAt:' field.
1944ef27db87SMehdi Amini     if (Record.size() < 8 || Record.size() > 10)
1945ef27db87SMehdi Amini       return error("Invalid record");
1946ef27db87SMehdi Amini 
1947ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1948ef27db87SMehdi Amini     bool HasAlignment = Record[0] & 2;
1949ef27db87SMehdi Amini     // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1950ef27db87SMehdi Amini     // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
195168168d17SSimon Pilgrim     // this is newer version of record which doesn't have artificial tag.
1952ef27db87SMehdi Amini     bool HasTag = !HasAlignment && Record.size() > 8;
1953ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1954ef27db87SMehdi Amini     uint32_t AlignInBits = 0;
19551bebc31cSYonghong Song     Metadata *Annotations = nullptr;
1956ef27db87SMehdi Amini     if (HasAlignment) {
19571bebc31cSYonghong Song       if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1958ef27db87SMehdi Amini         return error("Alignment value is too large");
19591bebc31cSYonghong Song       AlignInBits = Record[8];
19601bebc31cSYonghong Song       if (Record.size() > 9)
19611bebc31cSYonghong Song         Annotations = getMDOrNull(Record[9]);
1962ef27db87SMehdi Amini     }
19631bebc31cSYonghong Song 
1964ef27db87SMehdi Amini     MetadataList.assignValue(
1965ef27db87SMehdi Amini         GET_OR_DISTINCT(DILocalVariable,
1966ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1 + HasTag]),
1967ef27db87SMehdi Amini                          getMDString(Record[2 + HasTag]),
1968ef27db87SMehdi Amini                          getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1969ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5 + HasTag]),
1970665b4138SLuís Ferreira                          Record[6 + HasTag], Flags, AlignInBits, Annotations)),
1971c05c9db3SIvan Krasin         NextMetadataNo);
1972c05c9db3SIvan Krasin     NextMetadataNo++;
1973ef27db87SMehdi Amini     break;
1974ef27db87SMehdi Amini   }
19752c864551SShiva Chen   case bitc::METADATA_LABEL: {
19762c864551SShiva Chen     if (Record.size() != 5)
19772c864551SShiva Chen       return error("Invalid record");
19782c864551SShiva Chen 
19792c864551SShiva Chen     IsDistinct = Record[0] & 1;
19802c864551SShiva Chen     MetadataList.assignValue(
1981665b4138SLuís Ferreira         GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]),
19822c864551SShiva Chen                                   getMDString(Record[2]),
19832c864551SShiva Chen                                   getMDOrNull(Record[3]), Record[4])),
19842c864551SShiva Chen         NextMetadataNo);
19852c864551SShiva Chen     NextMetadataNo++;
19862c864551SShiva Chen     break;
19872c864551SShiva Chen   }
1988ef27db87SMehdi Amini   case bitc::METADATA_EXPRESSION: {
1989ef27db87SMehdi Amini     if (Record.size() < 1)
1990ef27db87SMehdi Amini       return error("Invalid record");
1991ef27db87SMehdi Amini 
1992ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
19936825fb64SAdrian Prantl     uint64_t Version = Record[0] >> 1;
1994ef27db87SMehdi Amini     auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
1995ffc498dfSFlorian Hahn 
1996ffc498dfSFlorian Hahn     SmallVector<uint64_t, 6> Buffer;
199705963a3dSArthur Eubanks     if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
1998ffc498dfSFlorian Hahn       return Err;
1999ef27db87SMehdi Amini 
2000665b4138SLuís Ferreira     MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)),
2001665b4138SLuís Ferreira                              NextMetadataNo);
2002c05c9db3SIvan Krasin     NextMetadataNo++;
2003ef27db87SMehdi Amini     break;
2004ef27db87SMehdi Amini   }
2005bceaaa96SAdrian Prantl   case bitc::METADATA_GLOBAL_VAR_EXPR: {
2006bceaaa96SAdrian Prantl     if (Record.size() != 3)
2007bceaaa96SAdrian Prantl       return error("Invalid record");
2008bceaaa96SAdrian Prantl 
2009bceaaa96SAdrian Prantl     IsDistinct = Record[0];
201005782218SAdrian Prantl     Metadata *Expr = getMDOrNull(Record[2]);
201105782218SAdrian Prantl     if (!Expr)
201205782218SAdrian Prantl       Expr = DIExpression::get(Context, {});
201305782218SAdrian Prantl     MetadataList.assignValue(
201405782218SAdrian Prantl         GET_OR_DISTINCT(DIGlobalVariableExpression,
201505782218SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Expr)),
2016c05c9db3SIvan Krasin         NextMetadataNo);
2017c05c9db3SIvan Krasin     NextMetadataNo++;
2018bceaaa96SAdrian Prantl     break;
2019bceaaa96SAdrian Prantl   }
2020ef27db87SMehdi Amini   case bitc::METADATA_OBJC_PROPERTY: {
2021ef27db87SMehdi Amini     if (Record.size() != 8)
2022ef27db87SMehdi Amini       return error("Invalid record");
2023ef27db87SMehdi Amini 
2024ef27db87SMehdi Amini     IsDistinct = Record[0];
2025ef27db87SMehdi Amini     MetadataList.assignValue(
2026ef27db87SMehdi Amini         GET_OR_DISTINCT(DIObjCProperty,
2027ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
2028ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3],
2029ef27db87SMehdi Amini                          getMDString(Record[4]), getMDString(Record[5]),
2030ef27db87SMehdi Amini                          Record[6], getDITypeRefOrNull(Record[7]))),
2031c05c9db3SIvan Krasin         NextMetadataNo);
2032c05c9db3SIvan Krasin     NextMetadataNo++;
2033ef27db87SMehdi Amini     break;
2034ef27db87SMehdi Amini   }
2035ef27db87SMehdi Amini   case bitc::METADATA_IMPORTED_ENTITY: {
2036a5b72abcSAlok Kumar Sharma     if (Record.size() < 6 && Record.size() > 8)
2037ef27db87SMehdi Amini       return error("Invalid record");
2038ef27db87SMehdi Amini 
2039ef27db87SMehdi Amini     IsDistinct = Record[0];
2040a5b72abcSAlok Kumar Sharma     bool HasFile = (Record.size() >= 7);
2041a5b72abcSAlok Kumar Sharma     bool HasElements = (Record.size() >= 8);
2042ef27db87SMehdi Amini     MetadataList.assignValue(
2043ef27db87SMehdi Amini         GET_OR_DISTINCT(DIImportedEntity,
2044ef27db87SMehdi Amini                         (Context, Record[1], getMDOrNull(Record[2]),
2045d63bfd21SAdrian Prantl                          getDITypeRefOrNull(Record[3]),
2046d63bfd21SAdrian Prantl                          HasFile ? getMDOrNull(Record[6]) : nullptr,
2047a5b72abcSAlok Kumar Sharma                          HasFile ? Record[4] : 0, getMDString(Record[5]),
2048a5b72abcSAlok Kumar Sharma                          HasElements ? getMDOrNull(Record[7]) : nullptr)),
2049c05c9db3SIvan Krasin         NextMetadataNo);
2050c05c9db3SIvan Krasin     NextMetadataNo++;
2051ef27db87SMehdi Amini     break;
2052ef27db87SMehdi Amini   }
2053ef27db87SMehdi Amini   case bitc::METADATA_STRING_OLD: {
2054ef27db87SMehdi Amini     std::string String(Record.begin(), Record.end());
2055ef27db87SMehdi Amini 
2056ef27db87SMehdi Amini     // Test for upgrading !llvm.loop.
2057ef27db87SMehdi Amini     HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
205819ef4fadSMehdi Amini     ++NumMDStringLoaded;
2059ef27db87SMehdi Amini     Metadata *MD = MDString::get(Context, String);
2060c05c9db3SIvan Krasin     MetadataList.assignValue(MD, NextMetadataNo);
2061c05c9db3SIvan Krasin     NextMetadataNo++;
2062ef27db87SMehdi Amini     break;
2063ef27db87SMehdi Amini   }
206419ef4fadSMehdi Amini   case bitc::METADATA_STRINGS: {
206519ef4fadSMehdi Amini     auto CreateNextMDString = [&](StringRef Str) {
206619ef4fadSMehdi Amini       ++NumMDStringLoaded;
2067c05c9db3SIvan Krasin       MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
2068c05c9db3SIvan Krasin       NextMetadataNo++;
206919ef4fadSMehdi Amini     };
207019ef4fadSMehdi Amini     if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2071ef27db87SMehdi Amini       return Err;
2072ef27db87SMehdi Amini     break;
207319ef4fadSMehdi Amini   }
2074ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
2075ef27db87SMehdi Amini     if (Record.size() % 2 == 0)
2076ef27db87SMehdi Amini       return error("Invalid record");
2077ef27db87SMehdi Amini     unsigned ValueID = Record[0];
2078ef27db87SMehdi Amini     if (ValueID >= ValueList.size())
2079ef27db87SMehdi Amini       return error("Invalid record");
2080ef27db87SMehdi Amini     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
2081ef27db87SMehdi Amini       if (Error Err = parseGlobalObjectAttachment(
2082ef27db87SMehdi Amini               *GO, ArrayRef<uint64_t>(Record).slice(1)))
2083ef27db87SMehdi Amini         return Err;
2084ef27db87SMehdi Amini     break;
2085ef27db87SMehdi Amini   }
2086ef27db87SMehdi Amini   case bitc::METADATA_KIND: {
2087ef27db87SMehdi Amini     // Support older bitcode files that had METADATA_KIND records in a
2088ef27db87SMehdi Amini     // block with METADATA_BLOCK_ID.
2089ef27db87SMehdi Amini     if (Error Err = parseMetadataKindRecord(Record))
2090ef27db87SMehdi Amini       return Err;
2091ef27db87SMehdi Amini     break;
2092ef27db87SMehdi Amini   }
209365600cb2Sgbtozers   case bitc::METADATA_ARG_LIST: {
209465600cb2Sgbtozers     SmallVector<ValueAsMetadata *, 4> Elts;
209565600cb2Sgbtozers     Elts.reserve(Record.size());
2096e5d844b5SStephen Tozer     for (uint64_t Elt : Record) {
2097e5d844b5SStephen Tozer       Metadata *MD = getMD(Elt);
2098e5d844b5SStephen Tozer       if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())
2099e5d844b5SStephen Tozer         return error(
2100e5d844b5SStephen Tozer             "Invalid record: DIArgList should not contain forward refs");
2101e5d844b5SStephen Tozer       if (!isa<ValueAsMetadata>(MD))
2102e5d844b5SStephen Tozer         return error("Invalid record");
2103e5d844b5SStephen Tozer       Elts.push_back(cast<ValueAsMetadata>(MD));
2104e5d844b5SStephen Tozer     }
210565600cb2Sgbtozers 
210665600cb2Sgbtozers     MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);
210765600cb2Sgbtozers     NextMetadataNo++;
210865600cb2Sgbtozers     break;
210965600cb2Sgbtozers   }
2110ef27db87SMehdi Amini   }
21119f926f70SMehdi Amini   return Error::success();
211219ef4fadSMehdi Amini #undef GET_OR_DISTINCT
2113ef27db87SMehdi Amini }
2114ef27db87SMehdi Amini 
2115ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
211619ef4fadSMehdi Amini     ArrayRef<uint64_t> Record, StringRef Blob,
2117061f4a5fSBenjamin Kramer     function_ref<void(StringRef)> CallBack) {
2118ef27db87SMehdi Amini   // All the MDStrings in the block are emitted together in a single
2119ef27db87SMehdi Amini   // record.  The strings are concatenated and stored in a blob along with
2120ef27db87SMehdi Amini   // their sizes.
2121ef27db87SMehdi Amini   if (Record.size() != 2)
2122ef27db87SMehdi Amini     return error("Invalid record: metadata strings layout");
2123ef27db87SMehdi Amini 
2124ef27db87SMehdi Amini   unsigned NumStrings = Record[0];
2125ef27db87SMehdi Amini   unsigned StringsOffset = Record[1];
2126ef27db87SMehdi Amini   if (!NumStrings)
2127ef27db87SMehdi Amini     return error("Invalid record: metadata strings with no strings");
2128ef27db87SMehdi Amini   if (StringsOffset > Blob.size())
2129ef27db87SMehdi Amini     return error("Invalid record: metadata strings corrupt offset");
2130ef27db87SMehdi Amini 
2131ef27db87SMehdi Amini   StringRef Lengths = Blob.slice(0, StringsOffset);
2132ef27db87SMehdi Amini   SimpleBitstreamCursor R(Lengths);
2133ef27db87SMehdi Amini 
2134ef27db87SMehdi Amini   StringRef Strings = Blob.drop_front(StringsOffset);
2135ef27db87SMehdi Amini   do {
2136ef27db87SMehdi Amini     if (R.AtEndOfStream())
2137ef27db87SMehdi Amini       return error("Invalid record: metadata strings bad length");
2138ef27db87SMehdi Amini 
2139b12a864cSDuncan P. N. Exon Smith     uint32_t Size;
2140b12a864cSDuncan P. N. Exon Smith     if (Error E = R.ReadVBR(6).moveInto(Size))
2141b12a864cSDuncan P. N. Exon Smith       return E;
2142ef27db87SMehdi Amini     if (Strings.size() < Size)
2143ef27db87SMehdi Amini       return error("Invalid record: metadata strings truncated chars");
2144ef27db87SMehdi Amini 
214519ef4fadSMehdi Amini     CallBack(Strings.slice(0, Size));
2146ef27db87SMehdi Amini     Strings = Strings.drop_front(Size);
2147ef27db87SMehdi Amini   } while (--NumStrings);
2148ef27db87SMehdi Amini 
2149ef27db87SMehdi Amini   return Error::success();
2150ef27db87SMehdi Amini }
2151ef27db87SMehdi Amini 
2152ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2153ef27db87SMehdi Amini     GlobalObject &GO, ArrayRef<uint64_t> Record) {
2154ef27db87SMehdi Amini   assert(Record.size() % 2 == 0);
2155ef27db87SMehdi Amini   for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2156ef27db87SMehdi Amini     auto K = MDKindMap.find(Record[I]);
2157ef27db87SMehdi Amini     if (K == MDKindMap.end())
2158ef27db87SMehdi Amini       return error("Invalid ID");
2159c27ab339STeresa Johnson     MDNode *MD =
2160c27ab339STeresa Johnson         dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));
2161ef27db87SMehdi Amini     if (!MD)
2162f3d2453dSTeresa Johnson       return error("Invalid metadata attachment: expect fwd ref to MDNode");
2163ef27db87SMehdi Amini     GO.addMetadata(K->second, *MD);
2164ef27db87SMehdi Amini   }
2165ef27db87SMehdi Amini   return Error::success();
2166ef27db87SMehdi Amini }
2167ef27db87SMehdi Amini 
2168ef27db87SMehdi Amini /// Parse metadata attachments.
2169ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
2170*1237c149Sserge-sans-paille     Function &F, ArrayRef<Instruction *> InstructionList) {
21710e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
21720e828958SJF Bastien     return Err;
2173ef27db87SMehdi Amini 
2174ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
21757b0d1457SMehdi Amini   PlaceholderQueue Placeholders;
2176ef27db87SMehdi Amini 
2177ef27db87SMehdi Amini   while (true) {
2178b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
2179b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2180b12a864cSDuncan P. N. Exon Smith       return E;
2181ef27db87SMehdi Amini 
2182ef27db87SMehdi Amini     switch (Entry.Kind) {
2183ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2184ef27db87SMehdi Amini     case BitstreamEntry::Error:
2185ef27db87SMehdi Amini       return error("Malformed block");
2186ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
21877b0d1457SMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
2188ef27db87SMehdi Amini       return Error::success();
2189ef27db87SMehdi Amini     case BitstreamEntry::Record:
2190ef27db87SMehdi Amini       // The interesting case.
2191ef27db87SMehdi Amini       break;
2192ef27db87SMehdi Amini     }
2193ef27db87SMehdi Amini 
2194ef27db87SMehdi Amini     // Read a metadata attachment record.
2195ef27db87SMehdi Amini     Record.clear();
219619ef4fadSMehdi Amini     ++NumMDRecordLoaded;
21970e828958SJF Bastien     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
21980e828958SJF Bastien     if (!MaybeRecord)
21990e828958SJF Bastien       return MaybeRecord.takeError();
22000e828958SJF Bastien     switch (MaybeRecord.get()) {
2201ef27db87SMehdi Amini     default: // Default behavior: ignore.
2202ef27db87SMehdi Amini       break;
2203ef27db87SMehdi Amini     case bitc::METADATA_ATTACHMENT: {
2204ef27db87SMehdi Amini       unsigned RecordLength = Record.size();
2205ef27db87SMehdi Amini       if (Record.empty())
2206ef27db87SMehdi Amini         return error("Invalid record");
2207ef27db87SMehdi Amini       if (RecordLength % 2 == 0) {
2208ef27db87SMehdi Amini         // A function attachment.
2209ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(F, Record))
2210ef27db87SMehdi Amini           return Err;
2211ef27db87SMehdi Amini         continue;
2212ef27db87SMehdi Amini       }
2213ef27db87SMehdi Amini 
2214ef27db87SMehdi Amini       // An instruction attachment.
2215ef27db87SMehdi Amini       Instruction *Inst = InstructionList[Record[0]];
2216ef27db87SMehdi Amini       for (unsigned i = 1; i != RecordLength; i = i + 2) {
2217ef27db87SMehdi Amini         unsigned Kind = Record[i];
2218ef27db87SMehdi Amini         DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
2219ef27db87SMehdi Amini         if (I == MDKindMap.end())
2220ef27db87SMehdi Amini           return error("Invalid ID");
22218662305bSMehdi Amini         if (I->second == LLVMContext::MD_tbaa && StripTBAA)
22228662305bSMehdi Amini           continue;
22238662305bSMehdi Amini 
222419ef4fadSMehdi Amini         auto Idx = Record[i + 1];
222519ef4fadSMehdi Amini         if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2226d5549f3dSMehdi Amini             !MetadataList.lookup(Idx)) {
222719ef4fadSMehdi Amini           // Load the attachment if it is in the lazy-loadable range and hasn't
222819ef4fadSMehdi Amini           // been loaded yet.
222919ef4fadSMehdi Amini           lazyLoadOneMetadata(Idx, Placeholders);
2230d5549f3dSMehdi Amini           resolveForwardRefsAndPlaceholders(Placeholders);
2231d5549f3dSMehdi Amini         }
223219ef4fadSMehdi Amini 
223319ef4fadSMehdi Amini         Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2234ef27db87SMehdi Amini         if (isa<LocalAsMetadata>(Node))
2235ef27db87SMehdi Amini           // Drop the attachment.  This used to be legal, but there's no
2236ef27db87SMehdi Amini           // upgrade path.
2237ef27db87SMehdi Amini           break;
2238ef27db87SMehdi Amini         MDNode *MD = dyn_cast_or_null<MDNode>(Node);
2239ef27db87SMehdi Amini         if (!MD)
2240ef27db87SMehdi Amini           return error("Invalid metadata attachment");
2241ef27db87SMehdi Amini 
2242ef27db87SMehdi Amini         if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2243ef27db87SMehdi Amini           MD = upgradeInstructionLoopAttachment(*MD);
2244ef27db87SMehdi Amini 
2245ef27db87SMehdi Amini         if (I->second == LLVMContext::MD_tbaa) {
2246ef27db87SMehdi Amini           assert(!MD->isTemporary() && "should load MDs before attachments");
2247ef27db87SMehdi Amini           MD = UpgradeTBAANode(*MD);
2248ef27db87SMehdi Amini         }
2249ef27db87SMehdi Amini         Inst->setMetadata(I->second, MD);
2250ef27db87SMehdi Amini       }
2251ef27db87SMehdi Amini       break;
2252ef27db87SMehdi Amini     }
2253ef27db87SMehdi Amini     }
2254ef27db87SMehdi Amini   }
2255ef27db87SMehdi Amini }
2256ef27db87SMehdi Amini 
2257ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
2258ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2259ef27db87SMehdi Amini     SmallVectorImpl<uint64_t> &Record) {
2260ef27db87SMehdi Amini   if (Record.size() < 2)
2261ef27db87SMehdi Amini     return error("Invalid record");
2262ef27db87SMehdi Amini 
2263ef27db87SMehdi Amini   unsigned Kind = Record[0];
2264ef27db87SMehdi Amini   SmallString<8> Name(Record.begin() + 1, Record.end());
2265ef27db87SMehdi Amini 
2266ef27db87SMehdi Amini   unsigned NewKind = TheModule.getMDKindID(Name.str());
2267ef27db87SMehdi Amini   if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2268ef27db87SMehdi Amini     return error("Conflicting METADATA_KIND records");
2269ef27db87SMehdi Amini   return Error::success();
2270ef27db87SMehdi Amini }
2271ef27db87SMehdi Amini 
2272ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
2273ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
22740e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
22750e828958SJF Bastien     return Err;
2276ef27db87SMehdi Amini 
2277ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
2278ef27db87SMehdi Amini 
2279ef27db87SMehdi Amini   // Read all the records.
2280ef27db87SMehdi Amini   while (true) {
2281b12a864cSDuncan P. N. Exon Smith     BitstreamEntry Entry;
2282b12a864cSDuncan P. N. Exon Smith     if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2283b12a864cSDuncan P. N. Exon Smith       return E;
2284ef27db87SMehdi Amini 
2285ef27db87SMehdi Amini     switch (Entry.Kind) {
2286ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2287ef27db87SMehdi Amini     case BitstreamEntry::Error:
2288ef27db87SMehdi Amini       return error("Malformed block");
2289ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
2290ef27db87SMehdi Amini       return Error::success();
2291ef27db87SMehdi Amini     case BitstreamEntry::Record:
2292ef27db87SMehdi Amini       // The interesting case.
2293ef27db87SMehdi Amini       break;
2294ef27db87SMehdi Amini     }
2295ef27db87SMehdi Amini 
2296ef27db87SMehdi Amini     // Read a record.
2297ef27db87SMehdi Amini     Record.clear();
229819ef4fadSMehdi Amini     ++NumMDRecordLoaded;
22990e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
23000e828958SJF Bastien     if (!MaybeCode)
23010e828958SJF Bastien       return MaybeCode.takeError();
23020e828958SJF Bastien     switch (MaybeCode.get()) {
2303ef27db87SMehdi Amini     default: // Default behavior: ignore.
2304ef27db87SMehdi Amini       break;
2305ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
2306ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
2307ef27db87SMehdi Amini         return Err;
2308ef27db87SMehdi Amini       break;
2309ef27db87SMehdi Amini     }
2310ef27db87SMehdi Amini     }
2311ef27db87SMehdi Amini   }
2312ef27db87SMehdi Amini }
2313ef27db87SMehdi Amini 
2314ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
2315ef27db87SMehdi Amini   Pimpl = std::move(RHS.Pimpl);
2316ef27db87SMehdi Amini   return *this;
2317ef27db87SMehdi Amini }
2318ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2319ec68dd49SMehdi Amini     : Pimpl(std::move(RHS.Pimpl)) {}
2320ef27db87SMehdi Amini 
2321ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
2322ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2323ef27db87SMehdi Amini                                BitcodeReaderValueList &ValueList,
2324a61f5e37STeresa Johnson                                bool IsImporting,
2325ef27db87SMehdi Amini                                std::function<Type *(unsigned)> getTypeByID)
23260eaee545SJonas Devlieghere     : Pimpl(std::make_unique<MetadataLoaderImpl>(
2327061f4a5fSBenjamin Kramer           Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2328ef27db87SMehdi Amini 
2329ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2330ec68dd49SMehdi Amini   return Pimpl->parseMetadata(ModuleLevel);
2331ef27db87SMehdi Amini }
2332ef27db87SMehdi Amini 
2333ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2334ef27db87SMehdi Amini 
2335ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
2336ef27db87SMehdi Amini /// necessary.
23373bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
23383bb4d01dSMehdi Amini   return Pimpl->getMetadataFwdRefOrLoad(Idx);
2339ef27db87SMehdi Amini }
2340ef27db87SMehdi Amini 
2341ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2342ef27db87SMehdi Amini   return Pimpl->lookupSubprogramForFunction(F);
2343ef27db87SMehdi Amini }
2344ef27db87SMehdi Amini 
2345ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
2346*1237c149Sserge-sans-paille     Function &F, ArrayRef<Instruction *> InstructionList) {
2347ef27db87SMehdi Amini   return Pimpl->parseMetadataAttachment(F, InstructionList);
2348ef27db87SMehdi Amini }
2349ef27db87SMehdi Amini 
2350ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
2351ef27db87SMehdi Amini   return Pimpl->parseMetadataKinds();
2352ef27db87SMehdi Amini }
2353ef27db87SMehdi Amini 
23548662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) {
23558662305bSMehdi Amini   return Pimpl->setStripTBAA(StripTBAA);
23568662305bSMehdi Amini }
23578662305bSMehdi Amini 
23588662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
23598662305bSMehdi Amini 
2360ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
2361ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
23626825fb64SAdrian Prantl 
23636825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
23646825fb64SAdrian Prantl   return Pimpl->upgradeDebugIntrinsics(F);
23656825fb64SAdrian Prantl }
2366