1ef27db87SMehdi Amini //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2ef27db87SMehdi Amini //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef27db87SMehdi Amini //
7ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
8ef27db87SMehdi Amini 
9ef27db87SMehdi Amini #include "MetadataLoader.h"
10ef27db87SMehdi Amini #include "ValueList.h"
11ef27db87SMehdi Amini 
12ef27db87SMehdi Amini #include "llvm/ADT/APFloat.h"
13ef27db87SMehdi Amini #include "llvm/ADT/APInt.h"
14ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h"
15ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h"
1619ef4fadSMehdi Amini #include "llvm/ADT/DenseSet.h"
17ef27db87SMehdi Amini #include "llvm/ADT/None.h"
18ef27db87SMehdi Amini #include "llvm/ADT/STLExtras.h"
19ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h"
20ef27db87SMehdi Amini #include "llvm/ADT/SmallVector.h"
2119ef4fadSMehdi Amini #include "llvm/ADT/Statistic.h"
22ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h"
23ef27db87SMehdi Amini #include "llvm/ADT/Twine.h"
24ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
25e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h"
26ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
27ef27db87SMehdi Amini #include "llvm/IR/Argument.h"
28ef27db87SMehdi Amini #include "llvm/IR/Attributes.h"
29ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
30ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
31ef27db87SMehdi Amini #include "llvm/IR/CallingConv.h"
32ef27db87SMehdi Amini #include "llvm/IR/Comdat.h"
33ef27db87SMehdi Amini #include "llvm/IR/Constant.h"
34ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
35ef27db87SMehdi Amini #include "llvm/IR/DebugInfo.h"
36ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
37ef27db87SMehdi Amini #include "llvm/IR/DebugLoc.h"
38ef27db87SMehdi Amini #include "llvm/IR/DerivedTypes.h"
39ef27db87SMehdi Amini #include "llvm/IR/DiagnosticPrinter.h"
40ef27db87SMehdi Amini #include "llvm/IR/Function.h"
41ef27db87SMehdi Amini #include "llvm/IR/GVMaterializer.h"
42ef27db87SMehdi Amini #include "llvm/IR/GlobalAlias.h"
43ef27db87SMehdi Amini #include "llvm/IR/GlobalIFunc.h"
44ef27db87SMehdi Amini #include "llvm/IR/GlobalIndirectSymbol.h"
45ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
46ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h"
47ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
48ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h"
49ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h"
50ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
51ef27db87SMehdi Amini #include "llvm/IR/Instructions.h"
526825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h"
536bda14b3SChandler Carruth #include "llvm/IR/Intrinsics.h"
54ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
55ef27db87SMehdi Amini #include "llvm/IR/Module.h"
56ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h"
57ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h"
58ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
59ef27db87SMehdi Amini #include "llvm/IR/Type.h"
60ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h"
61ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h"
62ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
63ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
64ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
65ef27db87SMehdi Amini #include "llvm/Support/Debug.h"
66ef27db87SMehdi Amini #include "llvm/Support/Error.h"
67ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
68ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h"
69ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h"
70ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h"
71ef27db87SMehdi Amini #include <algorithm>
72ef27db87SMehdi Amini #include <cassert>
73ef27db87SMehdi Amini #include <cstddef>
74ef27db87SMehdi Amini #include <cstdint>
75ef27db87SMehdi Amini #include <deque>
76ef27db87SMehdi Amini #include <limits>
77ef27db87SMehdi Amini #include <map>
78ef27db87SMehdi Amini #include <memory>
79ef27db87SMehdi Amini #include <string>
80ef27db87SMehdi Amini #include <system_error>
81ef27db87SMehdi Amini #include <tuple>
82ef27db87SMehdi Amini #include <utility>
83ef27db87SMehdi Amini #include <vector>
84ef27db87SMehdi Amini 
85ef27db87SMehdi Amini using namespace llvm;
86ef27db87SMehdi Amini 
8719ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader"
8819ef4fadSMehdi Amini 
8919ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
9019ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
9119ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
9219ef4fadSMehdi Amini 
93a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO.
94a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB.
95a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions(
96a61f5e37STeresa Johnson     "import-full-type-definitions", cl::init(false), cl::Hidden,
97a61f5e37STeresa Johnson     cl::desc("Import full type definitions for ThinLTO."));
98a61f5e37STeresa Johnson 
9919ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading(
10019ef4fadSMehdi Amini     "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
10119ef4fadSMehdi Amini     cl::desc("Force disable the lazy-loading on-demand of metadata when "
10219ef4fadSMehdi Amini              "loading bitcode for importing."));
10319ef4fadSMehdi Amini 
104ef27db87SMehdi Amini namespace {
105ef27db87SMehdi Amini 
106aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
107ef27db87SMehdi Amini 
108ef27db87SMehdi Amini class BitcodeReaderMetadataList {
109ef27db87SMehdi Amini   /// Array of metadata references.
110ef27db87SMehdi Amini   ///
111ef27db87SMehdi Amini   /// Don't use std::vector here.  Some versions of libc++ copy (instead of
112ef27db87SMehdi Amini   /// move) on resize, and TrackingMDRef is very expensive to copy.
113ef27db87SMehdi Amini   SmallVector<TrackingMDRef, 1> MetadataPtrs;
114ef27db87SMehdi Amini 
115690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of forward references that were
116690952d1SMehdi Amini   /// generated.
117690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> ForwardReference;
118690952d1SMehdi Amini 
119690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of Metadata that need to be
120690952d1SMehdi Amini   /// resolved.
121690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> UnresolvedNodes;
122690952d1SMehdi Amini 
123ef27db87SMehdi Amini   /// Structures for resolving old type refs.
124ef27db87SMehdi Amini   struct {
125ef27db87SMehdi Amini     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
126ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
127ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
128ef27db87SMehdi Amini     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
129ef27db87SMehdi Amini   } OldTypeRefs;
130ef27db87SMehdi Amini 
131ef27db87SMehdi Amini   LLVMContext &Context;
132ef27db87SMehdi Amini 
133864474c9SFlorian Hahn   /// Maximum number of valid references. Forward references exceeding the
134864474c9SFlorian Hahn   /// maximum must be invalid.
135864474c9SFlorian Hahn   unsigned RefsUpperBound;
136864474c9SFlorian Hahn 
137ef27db87SMehdi Amini public:
138864474c9SFlorian Hahn   BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
139864474c9SFlorian Hahn       : Context(C),
140864474c9SFlorian Hahn         RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
141864474c9SFlorian Hahn                                 RefsUpperBound)) {}
142ef27db87SMehdi Amini 
143ef27db87SMehdi Amini   // vector compatibility methods
144ef27db87SMehdi Amini   unsigned size() const { return MetadataPtrs.size(); }
145ef27db87SMehdi Amini   void resize(unsigned N) { MetadataPtrs.resize(N); }
146ef27db87SMehdi Amini   void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
147ef27db87SMehdi Amini   void clear() { MetadataPtrs.clear(); }
148ef27db87SMehdi Amini   Metadata *back() const { return MetadataPtrs.back(); }
149ef27db87SMehdi Amini   void pop_back() { MetadataPtrs.pop_back(); }
150ef27db87SMehdi Amini   bool empty() const { return MetadataPtrs.empty(); }
151ef27db87SMehdi Amini 
152ef27db87SMehdi Amini   Metadata *operator[](unsigned i) const {
153ef27db87SMehdi Amini     assert(i < MetadataPtrs.size());
154ef27db87SMehdi Amini     return MetadataPtrs[i];
155ef27db87SMehdi Amini   }
156ef27db87SMehdi Amini 
157ef27db87SMehdi Amini   Metadata *lookup(unsigned I) const {
158ef27db87SMehdi Amini     if (I < MetadataPtrs.size())
159ef27db87SMehdi Amini       return MetadataPtrs[I];
160ef27db87SMehdi Amini     return nullptr;
161ef27db87SMehdi Amini   }
162ef27db87SMehdi Amini 
163ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
164ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
165690952d1SMehdi Amini     assert(ForwardReference.empty() && "Unexpected forward refs");
166690952d1SMehdi Amini     assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
167ef27db87SMehdi Amini     MetadataPtrs.resize(N);
168ef27db87SMehdi Amini   }
169ef27db87SMehdi Amini 
170ef27db87SMehdi Amini   /// Return the given metadata, creating a replaceable forward reference if
171ef27db87SMehdi Amini   /// necessary.
172ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx);
173ef27db87SMehdi Amini 
1748f976ba0SHiroshi Inoue   /// Return the given metadata only if it is fully resolved.
175ef27db87SMehdi Amini   ///
176ef27db87SMehdi Amini   /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
177ef27db87SMehdi Amini   /// would give \c false.
178ef27db87SMehdi Amini   Metadata *getMetadataIfResolved(unsigned Idx);
179ef27db87SMehdi Amini 
180ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
181ef27db87SMehdi Amini   void assignValue(Metadata *MD, unsigned Idx);
182ef27db87SMehdi Amini   void tryToResolveCycles();
183690952d1SMehdi Amini   bool hasFwdRefs() const { return !ForwardReference.empty(); }
18419ef4fadSMehdi Amini   int getNextFwdRef() {
18519ef4fadSMehdi Amini     assert(hasFwdRefs());
18619ef4fadSMehdi Amini     return *ForwardReference.begin();
18719ef4fadSMehdi Amini   }
188ef27db87SMehdi Amini 
189ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
190ef27db87SMehdi Amini   void addTypeRef(MDString &UUID, DICompositeType &CT);
191ef27db87SMehdi Amini 
192ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
193ef27db87SMehdi Amini   Metadata *upgradeTypeRef(Metadata *MaybeUUID);
194ef27db87SMehdi Amini 
195ef27db87SMehdi Amini   /// Upgrade a type ref array that may have MDString references.
196ef27db87SMehdi Amini   Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
197ef27db87SMehdi Amini 
198ef27db87SMehdi Amini private:
199ef27db87SMehdi Amini   Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
200ef27db87SMehdi Amini };
201ef27db87SMehdi Amini 
202ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
203690952d1SMehdi Amini   if (auto *MDN = dyn_cast<MDNode>(MD))
204690952d1SMehdi Amini     if (!MDN->isResolved())
205690952d1SMehdi Amini       UnresolvedNodes.insert(Idx);
206690952d1SMehdi Amini 
207ef27db87SMehdi Amini   if (Idx == size()) {
208ef27db87SMehdi Amini     push_back(MD);
209ef27db87SMehdi Amini     return;
210ef27db87SMehdi Amini   }
211ef27db87SMehdi Amini 
212ef27db87SMehdi Amini   if (Idx >= size())
213ef27db87SMehdi Amini     resize(Idx + 1);
214ef27db87SMehdi Amini 
215ef27db87SMehdi Amini   TrackingMDRef &OldMD = MetadataPtrs[Idx];
216ef27db87SMehdi Amini   if (!OldMD) {
217ef27db87SMehdi Amini     OldMD.reset(MD);
218ef27db87SMehdi Amini     return;
219ef27db87SMehdi Amini   }
220ef27db87SMehdi Amini 
221ef27db87SMehdi Amini   // If there was a forward reference to this value, replace it.
222ef27db87SMehdi Amini   TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
223ef27db87SMehdi Amini   PrevMD->replaceAllUsesWith(MD);
224690952d1SMehdi Amini   ForwardReference.erase(Idx);
225ef27db87SMehdi Amini }
226ef27db87SMehdi Amini 
227ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
228864474c9SFlorian Hahn   // Bail out for a clearly invalid value.
229864474c9SFlorian Hahn   if (Idx >= RefsUpperBound)
230864474c9SFlorian Hahn     return nullptr;
231864474c9SFlorian Hahn 
232ef27db87SMehdi Amini   if (Idx >= size())
233ef27db87SMehdi Amini     resize(Idx + 1);
234ef27db87SMehdi Amini 
235ef27db87SMehdi Amini   if (Metadata *MD = MetadataPtrs[Idx])
236ef27db87SMehdi Amini     return MD;
237ef27db87SMehdi Amini 
238ef27db87SMehdi Amini   // Track forward refs to be resolved later.
239690952d1SMehdi Amini   ForwardReference.insert(Idx);
240ef27db87SMehdi Amini 
241ef27db87SMehdi Amini   // Create and return a placeholder, which will later be RAUW'd.
24219ef4fadSMehdi Amini   ++NumMDNodeTemporary;
243ef27db87SMehdi Amini   Metadata *MD = MDNode::getTemporary(Context, None).release();
244ef27db87SMehdi Amini   MetadataPtrs[Idx].reset(MD);
245ef27db87SMehdi Amini   return MD;
246ef27db87SMehdi Amini }
247ef27db87SMehdi Amini 
248ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
249ef27db87SMehdi Amini   Metadata *MD = lookup(Idx);
250ef27db87SMehdi Amini   if (auto *N = dyn_cast_or_null<MDNode>(MD))
251ef27db87SMehdi Amini     if (!N->isResolved())
252ef27db87SMehdi Amini       return nullptr;
253ef27db87SMehdi Amini   return MD;
254ef27db87SMehdi Amini }
255ef27db87SMehdi Amini 
256ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
257ef27db87SMehdi Amini   return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
258ef27db87SMehdi Amini }
259ef27db87SMehdi Amini 
260ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
261690952d1SMehdi Amini   if (!ForwardReference.empty())
262ef27db87SMehdi Amini     // Still forward references... can't resolve cycles.
263ef27db87SMehdi Amini     return;
264ef27db87SMehdi Amini 
265ef27db87SMehdi Amini   // Give up on finding a full definition for any forward decls that remain.
266ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.FwdDecls)
267ef27db87SMehdi Amini     OldTypeRefs.Final.insert(Ref);
268ef27db87SMehdi Amini   OldTypeRefs.FwdDecls.clear();
269ef27db87SMehdi Amini 
270ef27db87SMehdi Amini   // Upgrade from old type ref arrays.  In strange cases, this could add to
271ef27db87SMehdi Amini   // OldTypeRefs.Unknown.
272690952d1SMehdi Amini   for (const auto &Array : OldTypeRefs.Arrays)
273ef27db87SMehdi Amini     Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
274ef27db87SMehdi Amini   OldTypeRefs.Arrays.clear();
275ef27db87SMehdi Amini 
276ef27db87SMehdi Amini   // Replace old string-based type refs with the resolved node, if possible.
277ef27db87SMehdi Amini   // If we haven't seen the node, leave it to the verifier to complain about
278ef27db87SMehdi Amini   // the invalid string reference.
279ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.Unknown) {
280ef27db87SMehdi Amini     if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
281ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(CT);
282ef27db87SMehdi Amini     else
283ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(Ref.first);
284ef27db87SMehdi Amini   }
285ef27db87SMehdi Amini   OldTypeRefs.Unknown.clear();
286ef27db87SMehdi Amini 
287690952d1SMehdi Amini   if (UnresolvedNodes.empty())
288ef27db87SMehdi Amini     // Nothing to do.
289ef27db87SMehdi Amini     return;
290ef27db87SMehdi Amini 
291ef27db87SMehdi Amini   // Resolve any cycles.
292690952d1SMehdi Amini   for (unsigned I : UnresolvedNodes) {
293ef27db87SMehdi Amini     auto &MD = MetadataPtrs[I];
294ef27db87SMehdi Amini     auto *N = dyn_cast_or_null<MDNode>(MD);
295ef27db87SMehdi Amini     if (!N)
296ef27db87SMehdi Amini       continue;
297ef27db87SMehdi Amini 
298ef27db87SMehdi Amini     assert(!N->isTemporary() && "Unexpected forward reference");
299ef27db87SMehdi Amini     N->resolveCycles();
300ef27db87SMehdi Amini   }
301ef27db87SMehdi Amini 
302690952d1SMehdi Amini   // Make sure we return early again until there's another unresolved ref.
303690952d1SMehdi Amini   UnresolvedNodes.clear();
304ef27db87SMehdi Amini }
305ef27db87SMehdi Amini 
306ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
307ef27db87SMehdi Amini                                            DICompositeType &CT) {
308ef27db87SMehdi Amini   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
309ef27db87SMehdi Amini   if (CT.isForwardDecl())
310ef27db87SMehdi Amini     OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
311ef27db87SMehdi Amini   else
312ef27db87SMehdi Amini     OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
313ef27db87SMehdi Amini }
314ef27db87SMehdi Amini 
315ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
316ef27db87SMehdi Amini   auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
317ef27db87SMehdi Amini   if (LLVM_LIKELY(!UUID))
318ef27db87SMehdi Amini     return MaybeUUID;
319ef27db87SMehdi Amini 
320ef27db87SMehdi Amini   if (auto *CT = OldTypeRefs.Final.lookup(UUID))
321ef27db87SMehdi Amini     return CT;
322ef27db87SMehdi Amini 
323ef27db87SMehdi Amini   auto &Ref = OldTypeRefs.Unknown[UUID];
324ef27db87SMehdi Amini   if (!Ref)
325ef27db87SMehdi Amini     Ref = MDNode::getTemporary(Context, None);
326ef27db87SMehdi Amini   return Ref.get();
327ef27db87SMehdi Amini }
328ef27db87SMehdi Amini 
329ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
330ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
331ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
332ef27db87SMehdi Amini     return MaybeTuple;
333ef27db87SMehdi Amini 
334ef27db87SMehdi Amini   // Look through the array immediately if possible.
335ef27db87SMehdi Amini   if (!Tuple->isTemporary())
336ef27db87SMehdi Amini     return resolveTypeRefArray(Tuple);
337ef27db87SMehdi Amini 
338ef27db87SMehdi Amini   // Create and return a placeholder to use for now.  Eventually
339ef27db87SMehdi Amini   // resolveTypeRefArrays() will be resolve this forward reference.
340ef27db87SMehdi Amini   OldTypeRefs.Arrays.emplace_back(
341ef27db87SMehdi Amini       std::piecewise_construct, std::forward_as_tuple(Tuple),
342ef27db87SMehdi Amini       std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
343ef27db87SMehdi Amini   return OldTypeRefs.Arrays.back().second.get();
344ef27db87SMehdi Amini }
345ef27db87SMehdi Amini 
346ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
347ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
348ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
349ef27db87SMehdi Amini     return MaybeTuple;
350ef27db87SMehdi Amini 
351da82ce99SFangrui Song   // Look through the DITypeRefArray, upgrading each DIType *.
352ef27db87SMehdi Amini   SmallVector<Metadata *, 32> Ops;
353ef27db87SMehdi Amini   Ops.reserve(Tuple->getNumOperands());
354ef27db87SMehdi Amini   for (Metadata *MD : Tuple->operands())
355ef27db87SMehdi Amini     Ops.push_back(upgradeTypeRef(MD));
356ef27db87SMehdi Amini 
357ef27db87SMehdi Amini   return MDTuple::get(Context, Ops);
358ef27db87SMehdi Amini }
359ef27db87SMehdi Amini 
360ef27db87SMehdi Amini namespace {
361ef27db87SMehdi Amini 
362ef27db87SMehdi Amini class PlaceholderQueue {
363ef27db87SMehdi Amini   // Placeholders would thrash around when moved, so store in a std::deque
364ef27db87SMehdi Amini   // instead of some sort of vector.
365ef27db87SMehdi Amini   std::deque<DistinctMDOperandPlaceholder> PHs;
366ef27db87SMehdi Amini 
367ef27db87SMehdi Amini public:
36827379892SMehdi Amini   ~PlaceholderQueue() {
36927379892SMehdi Amini     assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed");
37027379892SMehdi Amini   }
37119ef4fadSMehdi Amini   bool empty() { return PHs.empty(); }
372ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
373ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
37419ef4fadSMehdi Amini 
37519ef4fadSMehdi Amini   /// Return the list of temporaries nodes in the queue, these need to be
37619ef4fadSMehdi Amini   /// loaded before we can flush the queue.
37719ef4fadSMehdi Amini   void getTemporaries(BitcodeReaderMetadataList &MetadataList,
37819ef4fadSMehdi Amini                       DenseSet<unsigned> &Temporaries) {
37919ef4fadSMehdi Amini     for (auto &PH : PHs) {
38019ef4fadSMehdi Amini       auto ID = PH.getID();
38119ef4fadSMehdi Amini       auto *MD = MetadataList.lookup(ID);
38219ef4fadSMehdi Amini       if (!MD) {
38319ef4fadSMehdi Amini         Temporaries.insert(ID);
38419ef4fadSMehdi Amini         continue;
38519ef4fadSMehdi Amini       }
38619ef4fadSMehdi Amini       auto *N = dyn_cast_or_null<MDNode>(MD);
38719ef4fadSMehdi Amini       if (N && N->isTemporary())
38819ef4fadSMehdi Amini         Temporaries.insert(ID);
38919ef4fadSMehdi Amini     }
39019ef4fadSMehdi Amini   }
391ef27db87SMehdi Amini };
392ef27db87SMehdi Amini 
393ef27db87SMehdi Amini } // end anonymous namespace
394ef27db87SMehdi Amini 
395ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
396ef27db87SMehdi Amini   PHs.emplace_back(ID);
397ef27db87SMehdi Amini   return PHs.back();
398ef27db87SMehdi Amini }
399ef27db87SMehdi Amini 
400ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
401ef27db87SMehdi Amini   while (!PHs.empty()) {
4024f90ee00SMehdi Amini     auto *MD = MetadataList.lookup(PHs.front().getID());
4034f90ee00SMehdi Amini     assert(MD && "Flushing placeholder on unassigned MD");
4045ae6170fSMehdi Amini #ifndef NDEBUG
4054f90ee00SMehdi Amini     if (auto *MDN = dyn_cast<MDNode>(MD))
4065ae6170fSMehdi Amini       assert(MDN->isResolved() &&
4075ae6170fSMehdi Amini              "Flushing Placeholder while cycles aren't resolved");
4085ae6170fSMehdi Amini #endif
4095ae6170fSMehdi Amini     PHs.front().replaceUseWith(MD);
410ef27db87SMehdi Amini     PHs.pop_front();
411ef27db87SMehdi Amini   }
412ef27db87SMehdi Amini }
413ef27db87SMehdi Amini 
414d68904f9SJames Henderson } // anonymous namespace
415ef27db87SMehdi Amini 
416ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
417ffc498dfSFlorian Hahn   return make_error<StringError>(
418ffc498dfSFlorian Hahn       Message, make_error_code(BitcodeError::CorruptedBitcode));
419ffc498dfSFlorian Hahn }
420ffc498dfSFlorian Hahn 
421ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
422ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
423ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
424ef27db87SMehdi Amini   BitstreamCursor &Stream;
425ef27db87SMehdi Amini   LLVMContext &Context;
426ef27db87SMehdi Amini   Module &TheModule;
427ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
428ef27db87SMehdi Amini 
42919ef4fadSMehdi Amini   /// Cursor associated with the lazy-loading of Metadata. This is the easy way
43019ef4fadSMehdi Amini   /// to keep around the right "context" (Abbrev list) to be able to jump in
43119ef4fadSMehdi Amini   /// the middle of the metadata block and load any record.
43219ef4fadSMehdi Amini   BitstreamCursor IndexCursor;
43319ef4fadSMehdi Amini 
43419ef4fadSMehdi Amini   /// Index that keeps track of MDString values.
43519ef4fadSMehdi Amini   std::vector<StringRef> MDStringRef;
43619ef4fadSMehdi Amini 
43719ef4fadSMehdi Amini   /// On-demand loading of a single MDString. Requires the index above to be
43819ef4fadSMehdi Amini   /// populated.
43919ef4fadSMehdi Amini   MDString *lazyLoadOneMDString(unsigned Idx);
44019ef4fadSMehdi Amini 
44119ef4fadSMehdi Amini   /// Index that keeps track of where to find a metadata record in the stream.
44219ef4fadSMehdi Amini   std::vector<uint64_t> GlobalMetadataBitPosIndex;
44319ef4fadSMehdi Amini 
44419ef4fadSMehdi Amini   /// Populate the index above to enable lazily loading of metadata, and load
44519ef4fadSMehdi Amini   /// the named metadata as well as the transitively referenced global
44619ef4fadSMehdi Amini   /// Metadata.
44742ef1990SMehdi Amini   Expected<bool> lazyLoadModuleMetadataBlock();
44819ef4fadSMehdi Amini 
44919ef4fadSMehdi Amini   /// On-demand loading of a single metadata. Requires the index above to be
45019ef4fadSMehdi Amini   /// populated.
45119ef4fadSMehdi Amini   void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
45219ef4fadSMehdi Amini 
4539f926f70SMehdi Amini   // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4549f926f70SMehdi Amini   // point from SP to CU after a block is completly parsed.
4559f926f70SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4569f926f70SMehdi Amini 
457ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
458ef27db87SMehdi Amini   /// metadata.
459ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
460ef27db87SMehdi Amini 
461ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
462ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
463ef27db87SMehdi Amini 
4648662305bSMehdi Amini   bool StripTBAA = false;
465ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
466e37d3144SAdrian Prantl   bool NeedUpgradeToDIGlobalVariableExpression = false;
4676825fb64SAdrian Prantl   bool NeedDeclareExpressionUpgrade = false;
468ef27db87SMehdi Amini 
469ec68dd49SMehdi Amini   /// True if metadata is being parsed for a module being ThinLTO imported.
470ec68dd49SMehdi Amini   bool IsImporting = false;
471ec68dd49SMehdi Amini 
4729f926f70SMehdi Amini   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4739f926f70SMehdi Amini                          PlaceholderQueue &Placeholders, StringRef Blob,
474ef27db87SMehdi Amini                          unsigned &NextMetadataNo);
47519ef4fadSMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
476061f4a5fSBenjamin Kramer                              function_ref<void(StringRef)> CallBack);
477ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
478ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
479ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
480ef27db87SMehdi Amini 
48119ef4fadSMehdi Amini   void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
48219ef4fadSMehdi Amini 
48319ef4fadSMehdi Amini   /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
48419ef4fadSMehdi Amini   void upgradeCUSubprograms() {
48519ef4fadSMehdi Amini     for (auto CU_SP : CUSubprograms)
48619ef4fadSMehdi Amini       if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
48719ef4fadSMehdi Amini         for (auto &Op : SPs->operands())
4889d2f019fSAdrian Prantl           if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
4899d2f019fSAdrian Prantl             SP->replaceUnit(CU_SP.first);
49019ef4fadSMehdi Amini     CUSubprograms.clear();
49119ef4fadSMehdi Amini   }
49219ef4fadSMehdi Amini 
493e37d3144SAdrian Prantl   /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
494e37d3144SAdrian Prantl   void upgradeCUVariables() {
495e37d3144SAdrian Prantl     if (!NeedUpgradeToDIGlobalVariableExpression)
496e37d3144SAdrian Prantl       return;
497e37d3144SAdrian Prantl 
498e37d3144SAdrian Prantl     // Upgrade list of variables attached to the CUs.
499e37d3144SAdrian Prantl     if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
500e37d3144SAdrian Prantl       for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
501e37d3144SAdrian Prantl         auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
502e37d3144SAdrian Prantl         if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
503e37d3144SAdrian Prantl           for (unsigned I = 0; I < GVs->getNumOperands(); I++)
504e37d3144SAdrian Prantl             if (auto *GV =
505e37d3144SAdrian Prantl                     dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
50605782218SAdrian Prantl               auto *DGVE = DIGlobalVariableExpression::getDistinct(
50705782218SAdrian Prantl                   Context, GV, DIExpression::get(Context, {}));
508e37d3144SAdrian Prantl               GVs->replaceOperandWith(I, DGVE);
509e37d3144SAdrian Prantl             }
510e37d3144SAdrian Prantl       }
511e37d3144SAdrian Prantl 
512e37d3144SAdrian Prantl     // Upgrade variables attached to globals.
513e37d3144SAdrian Prantl     for (auto &GV : TheModule.globals()) {
51456a08b40SDavide Italiano       SmallVector<MDNode *, 1> MDs;
515e37d3144SAdrian Prantl       GV.getMetadata(LLVMContext::MD_dbg, MDs);
516e37d3144SAdrian Prantl       GV.eraseMetadata(LLVMContext::MD_dbg);
517e37d3144SAdrian Prantl       for (auto *MD : MDs)
5182bb217b5SSimon Pilgrim         if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
51905782218SAdrian Prantl           auto *DGVE = DIGlobalVariableExpression::getDistinct(
52005782218SAdrian Prantl               Context, DGV, DIExpression::get(Context, {}));
521e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
522e37d3144SAdrian Prantl         } else
523e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *MD);
524e37d3144SAdrian Prantl     }
525e37d3144SAdrian Prantl   }
526e37d3144SAdrian Prantl 
5276825fb64SAdrian Prantl   /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5286825fb64SAdrian Prantl   /// describes a function argument.
5296825fb64SAdrian Prantl   void upgradeDeclareExpressions(Function &F) {
5306825fb64SAdrian Prantl     if (!NeedDeclareExpressionUpgrade)
5316825fb64SAdrian Prantl       return;
5326825fb64SAdrian Prantl 
5336825fb64SAdrian Prantl     for (auto &BB : F)
5346825fb64SAdrian Prantl       for (auto &I : BB)
5356825fb64SAdrian Prantl         if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5366825fb64SAdrian Prantl           if (auto *DIExpr = DDI->getExpression())
5376825fb64SAdrian Prantl             if (DIExpr->startsWithDeref() &&
5386825fb64SAdrian Prantl                 dyn_cast_or_null<Argument>(DDI->getAddress())) {
5396825fb64SAdrian Prantl               SmallVector<uint64_t, 8> Ops;
5406825fb64SAdrian Prantl               Ops.append(std::next(DIExpr->elements_begin()),
5416825fb64SAdrian Prantl                          DIExpr->elements_end());
5426825fb64SAdrian Prantl               auto *E = DIExpression::get(Context, Ops);
5436825fb64SAdrian Prantl               DDI->setOperand(2, MetadataAsValue::get(Context, E));
5446825fb64SAdrian Prantl             }
5456825fb64SAdrian Prantl   }
5466825fb64SAdrian Prantl 
547ffc498dfSFlorian Hahn   /// Upgrade the expression from previous versions.
548ffc498dfSFlorian Hahn   Error upgradeDIExpression(uint64_t FromVersion,
549ffc498dfSFlorian Hahn                             MutableArrayRef<uint64_t> &Expr,
550ffc498dfSFlorian Hahn                             SmallVectorImpl<uint64_t> &Buffer) {
551ffc498dfSFlorian Hahn     auto N = Expr.size();
552ffc498dfSFlorian Hahn     switch (FromVersion) {
553ffc498dfSFlorian Hahn     default:
554ffc498dfSFlorian Hahn       return error("Invalid record");
555ffc498dfSFlorian Hahn     case 0:
556ffc498dfSFlorian Hahn       if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
557ffc498dfSFlorian Hahn         Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
558ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
559ffc498dfSFlorian Hahn     case 1:
560ffc498dfSFlorian Hahn       // Move DW_OP_deref to the end.
561ffc498dfSFlorian Hahn       if (N && Expr[0] == dwarf::DW_OP_deref) {
562ffc498dfSFlorian Hahn         auto End = Expr.end();
563ffc498dfSFlorian Hahn         if (Expr.size() >= 3 &&
564ffc498dfSFlorian Hahn             *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
565ffc498dfSFlorian Hahn           End = std::prev(End, 3);
566ffc498dfSFlorian Hahn         std::move(std::next(Expr.begin()), End, Expr.begin());
567ffc498dfSFlorian Hahn         *std::prev(End) = dwarf::DW_OP_deref;
568ffc498dfSFlorian Hahn       }
569ffc498dfSFlorian Hahn       NeedDeclareExpressionUpgrade = true;
570ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
571ffc498dfSFlorian Hahn     case 2: {
572ffc498dfSFlorian Hahn       // Change DW_OP_plus to DW_OP_plus_uconst.
573ffc498dfSFlorian Hahn       // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
574ffc498dfSFlorian Hahn       auto SubExpr = ArrayRef<uint64_t>(Expr);
575ffc498dfSFlorian Hahn       while (!SubExpr.empty()) {
576ffc498dfSFlorian Hahn         // Skip past other operators with their operands
577ffc498dfSFlorian Hahn         // for this version of the IR, obtained from
578ffc498dfSFlorian Hahn         // from historic DIExpression::ExprOperand::getSize().
579ffc498dfSFlorian Hahn         size_t HistoricSize;
580ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
581ffc498dfSFlorian Hahn         default:
582ffc498dfSFlorian Hahn           HistoricSize = 1;
583ffc498dfSFlorian Hahn           break;
584ffc498dfSFlorian Hahn         case dwarf::DW_OP_constu:
585ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
586ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
587ffc498dfSFlorian Hahn           HistoricSize = 2;
588ffc498dfSFlorian Hahn           break;
589ffc498dfSFlorian Hahn         case dwarf::DW_OP_LLVM_fragment:
590ffc498dfSFlorian Hahn           HistoricSize = 3;
591ffc498dfSFlorian Hahn           break;
592ffc498dfSFlorian Hahn         }
593ffc498dfSFlorian Hahn 
594ffc498dfSFlorian Hahn         // If the expression is malformed, make sure we don't
595ffc498dfSFlorian Hahn         // copy more elements than we should.
596ffc498dfSFlorian Hahn         HistoricSize = std::min(SubExpr.size(), HistoricSize);
597ffc498dfSFlorian Hahn         ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1);
598ffc498dfSFlorian Hahn 
599ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
600ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
601ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_plus_uconst);
602ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
603ffc498dfSFlorian Hahn           break;
604ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
605ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_constu);
606ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
607ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_minus);
608ffc498dfSFlorian Hahn           break;
609ffc498dfSFlorian Hahn         default:
610ffc498dfSFlorian Hahn           Buffer.push_back(*SubExpr.begin());
611ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
612ffc498dfSFlorian Hahn           break;
613ffc498dfSFlorian Hahn         }
614ffc498dfSFlorian Hahn 
615ffc498dfSFlorian Hahn         // Continue with remaining elements.
616ffc498dfSFlorian Hahn         SubExpr = SubExpr.slice(HistoricSize);
617ffc498dfSFlorian Hahn       }
618ffc498dfSFlorian Hahn       Expr = MutableArrayRef<uint64_t>(Buffer);
619ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
620ffc498dfSFlorian Hahn     }
621ffc498dfSFlorian Hahn     case 3:
622ffc498dfSFlorian Hahn       // Up-to-date!
623ffc498dfSFlorian Hahn       break;
624ffc498dfSFlorian Hahn     }
625ffc498dfSFlorian Hahn 
626ffc498dfSFlorian Hahn     return Error::success();
627ffc498dfSFlorian Hahn   }
628ffc498dfSFlorian Hahn 
629e37d3144SAdrian Prantl   void upgradeDebugInfo() {
630e37d3144SAdrian Prantl     upgradeCUSubprograms();
631e37d3144SAdrian Prantl     upgradeCUVariables();
632e37d3144SAdrian Prantl   }
633e37d3144SAdrian Prantl 
634ef27db87SMehdi Amini public:
635ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
636ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
637ec68dd49SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID,
638ec68dd49SMehdi Amini                      bool IsImporting)
639864474c9SFlorian Hahn       : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
640864474c9SFlorian Hahn         ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
641864474c9SFlorian Hahn         TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
642864474c9SFlorian Hahn         IsImporting(IsImporting) {}
643ef27db87SMehdi Amini 
644ec68dd49SMehdi Amini   Error parseMetadata(bool ModuleLevel);
645ef27db87SMehdi Amini 
646ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6473bb4d01dSMehdi Amini 
6483bb4d01dSMehdi Amini   Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6493bb4d01dSMehdi Amini     if (ID < MDStringRef.size())
6503bb4d01dSMehdi Amini       return lazyLoadOneMDString(ID);
6513bb4d01dSMehdi Amini     if (auto *MD = MetadataList.lookup(ID))
6523bb4d01dSMehdi Amini       return MD;
6533bb4d01dSMehdi Amini     // If lazy-loading is enabled, we try recursively to load the operand
6543bb4d01dSMehdi Amini     // instead of creating a temporary.
6553bb4d01dSMehdi Amini     if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6563bb4d01dSMehdi Amini       PlaceholderQueue Placeholders;
6573bb4d01dSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
6583bb4d01dSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
6593bb4d01dSMehdi Amini       return MetadataList.lookup(ID);
6603bb4d01dSMehdi Amini     }
6613bb4d01dSMehdi Amini     return MetadataList.getMetadataFwdRef(ID);
662ef27db87SMehdi Amini   }
663ef27db87SMehdi Amini 
664ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
665ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
666ef27db87SMehdi Amini   }
667ef27db87SMehdi Amini 
668ef27db87SMehdi Amini   bool hasSeenOldLoopTags() { return HasSeenOldLoopTags; }
669ef27db87SMehdi Amini 
670ef27db87SMehdi Amini   Error parseMetadataAttachment(
671ef27db87SMehdi Amini       Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
672ef27db87SMehdi Amini 
673ef27db87SMehdi Amini   Error parseMetadataKinds();
674ef27db87SMehdi Amini 
6758662305bSMehdi Amini   void setStripTBAA(bool Value) { StripTBAA = Value; }
6768662305bSMehdi Amini   bool isStrippingTBAA() { return StripTBAA; }
6778662305bSMehdi Amini 
678ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
679ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
6806825fb64SAdrian Prantl   void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
681ef27db87SMehdi Amini };
682ef27db87SMehdi Amini 
68342ef1990SMehdi Amini Expected<bool>
68442ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
68519ef4fadSMehdi Amini   IndexCursor = Stream;
68619ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
68719ef4fadSMehdi Amini   // Get the abbrevs, and preload record positions to make them lazy-loadable.
68819ef4fadSMehdi Amini   while (true) {
6890e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks(
69019ef4fadSMehdi Amini         BitstreamCursor::AF_DontPopBlockAtEnd);
6910e828958SJF Bastien     if (!MaybeEntry)
6920e828958SJF Bastien       return MaybeEntry.takeError();
6930e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
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();
7060e828958SJF Bastien       Expected<unsigned> MaybeCode = IndexCursor.skipRecord(Entry.ID);
7070e828958SJF Bastien       if (!MaybeCode)
7080e828958SJF Bastien         return MaybeCode.takeError();
7090e828958SJF Bastien       unsigned Code = MaybeCode.get();
71019ef4fadSMehdi Amini       switch (Code) {
71119ef4fadSMehdi Amini       case bitc::METADATA_STRINGS: {
71219ef4fadSMehdi Amini         // Rewind and parse the strings.
7130e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
714c55cf4afSBill Wendling           return std::move(Err);
71519ef4fadSMehdi Amini         StringRef Blob;
71619ef4fadSMehdi Amini         Record.clear();
7170e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7180e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record, &Blob))
7190e828958SJF Bastien           ;
7200e828958SJF Bastien         else
7210e828958SJF Bastien           return MaybeRecord.takeError();
72219ef4fadSMehdi Amini         unsigned NumStrings = Record[0];
72319ef4fadSMehdi Amini         MDStringRef.reserve(NumStrings);
72419ef4fadSMehdi Amini         auto IndexNextMDString = [&](StringRef Str) {
72519ef4fadSMehdi Amini           MDStringRef.push_back(Str);
72619ef4fadSMehdi Amini         };
72719ef4fadSMehdi Amini         if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
728c55cf4afSBill Wendling           return std::move(Err);
72919ef4fadSMehdi Amini         break;
73019ef4fadSMehdi Amini       }
73119ef4fadSMehdi Amini       case bitc::METADATA_INDEX_OFFSET: {
73219ef4fadSMehdi Amini         // This is the offset to the index, when we see this we skip all the
73319ef4fadSMehdi Amini         // records and load only an index to these.
7340e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
735c55cf4afSBill Wendling           return std::move(Err);
73619ef4fadSMehdi Amini         Record.clear();
7370e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7380e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7390e828958SJF Bastien           ;
7400e828958SJF Bastien         else
7410e828958SJF Bastien           return MaybeRecord.takeError();
74219ef4fadSMehdi Amini         if (Record.size() != 2)
74319ef4fadSMehdi Amini           return error("Invalid record");
74419ef4fadSMehdi Amini         auto Offset = Record[0] + (Record[1] << 32);
74519ef4fadSMehdi Amini         auto BeginPos = IndexCursor.GetCurrentBitNo();
7460e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
747c55cf4afSBill Wendling           return std::move(Err);
7480e828958SJF Bastien         Expected<BitstreamEntry> MaybeEntry =
7490e828958SJF Bastien             IndexCursor.advanceSkippingSubblocks(
75019ef4fadSMehdi Amini                 BitstreamCursor::AF_DontPopBlockAtEnd);
7510e828958SJF Bastien         if (!MaybeEntry)
7520e828958SJF Bastien           return MaybeEntry.takeError();
7530e828958SJF Bastien         Entry = MaybeEntry.get();
75419ef4fadSMehdi Amini         assert(Entry.Kind == BitstreamEntry::Record &&
75519ef4fadSMehdi Amini                "Corrupted bitcode: Expected `Record` when trying to find the "
75619ef4fadSMehdi Amini                "Metadata index");
75719ef4fadSMehdi Amini         Record.clear();
7580e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7590e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7600e828958SJF Bastien           assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7610e828958SJF Bastien                  "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7620e828958SJF Bastien                  "find the Metadata index");
7630e828958SJF Bastien         else
7640e828958SJF Bastien           return MaybeCode.takeError();
76519ef4fadSMehdi Amini         // Delta unpack
76619ef4fadSMehdi Amini         auto CurrentValue = BeginPos;
76719ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.reserve(Record.size());
76819ef4fadSMehdi Amini         for (auto &Elt : Record) {
76919ef4fadSMehdi Amini           CurrentValue += Elt;
77019ef4fadSMehdi Amini           GlobalMetadataBitPosIndex.push_back(CurrentValue);
77119ef4fadSMehdi Amini         }
77219ef4fadSMehdi Amini         break;
77319ef4fadSMehdi Amini       }
77419ef4fadSMehdi Amini       case bitc::METADATA_INDEX:
77519ef4fadSMehdi Amini         // We don't expect to get there, the Index is loaded when we encounter
77619ef4fadSMehdi Amini         // the offset.
77719ef4fadSMehdi Amini         return error("Corrupted Metadata block");
77819ef4fadSMehdi Amini       case bitc::METADATA_NAME: {
77919ef4fadSMehdi Amini         // Named metadata need to be materialized now and aren't deferred.
7800e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
781c55cf4afSBill Wendling           return std::move(Err);
78219ef4fadSMehdi Amini         Record.clear();
7830e828958SJF Bastien 
7840e828958SJF Bastien         unsigned Code;
7850e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7860e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record)) {
7870e828958SJF Bastien           Code = MaybeCode.get();
78819ef4fadSMehdi Amini           assert(Code == bitc::METADATA_NAME);
7890e828958SJF Bastien         } else
7900e828958SJF Bastien           return MaybeCode.takeError();
79119ef4fadSMehdi Amini 
79219ef4fadSMehdi Amini         // Read name of the named metadata.
79319ef4fadSMehdi Amini         SmallString<8> Name(Record.begin(), Record.end());
7940e828958SJF Bastien         if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
7950e828958SJF Bastien           Code = MaybeCode.get();
7960e828958SJF Bastien         else
7970e828958SJF Bastien           return MaybeCode.takeError();
79819ef4fadSMehdi Amini 
79919ef4fadSMehdi Amini         // Named Metadata comes in two parts, we expect the name to be followed
80019ef4fadSMehdi Amini         // by the node
80119ef4fadSMehdi Amini         Record.clear();
8020e828958SJF Bastien         if (Expected<unsigned> MaybeNextBitCode =
8030e828958SJF Bastien                 IndexCursor.readRecord(Code, Record))
8040e828958SJF Bastien           assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8050e828958SJF Bastien         else
8060e828958SJF Bastien           return MaybeNextBitCode.takeError();
80719ef4fadSMehdi Amini 
80819ef4fadSMehdi Amini         // Read named metadata elements.
80919ef4fadSMehdi Amini         unsigned Size = Record.size();
81019ef4fadSMehdi Amini         NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
81119ef4fadSMehdi Amini         for (unsigned i = 0; i != Size; ++i) {
81219ef4fadSMehdi Amini           // FIXME: We could use a placeholder here, however NamedMDNode are
81319ef4fadSMehdi Amini           // taking MDNode as operand and not using the Metadata infrastructure.
81419ef4fadSMehdi Amini           // It is acknowledged by 'TODO: Inherit from Metadata' in the
81519ef4fadSMehdi Amini           // NamedMDNode class definition.
81619ef4fadSMehdi Amini           MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
817f3d2453dSTeresa Johnson           assert(MD && "Invalid metadata: expect fwd ref to MDNode");
81819ef4fadSMehdi Amini           NMD->addOperand(MD);
81919ef4fadSMehdi Amini         }
82019ef4fadSMehdi Amini         break;
82119ef4fadSMehdi Amini       }
82219ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
82319ef4fadSMehdi Amini         // FIXME: we need to do this early because we don't materialize global
82419ef4fadSMehdi Amini         // value explicitly.
8250e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
826c55cf4afSBill Wendling           return std::move(Err);
82719ef4fadSMehdi Amini         Record.clear();
8280e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
8290e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
8300e828958SJF Bastien           ;
8310e828958SJF Bastien         else
8320e828958SJF Bastien           return MaybeRecord.takeError();
83319ef4fadSMehdi Amini         if (Record.size() % 2 == 0)
83419ef4fadSMehdi Amini           return error("Invalid record");
83519ef4fadSMehdi Amini         unsigned ValueID = Record[0];
83619ef4fadSMehdi Amini         if (ValueID >= ValueList.size())
83719ef4fadSMehdi Amini           return error("Invalid record");
83819ef4fadSMehdi Amini         if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
83919ef4fadSMehdi Amini           if (Error Err = parseGlobalObjectAttachment(
84019ef4fadSMehdi Amini                   *GO, ArrayRef<uint64_t>(Record).slice(1)))
841c55cf4afSBill Wendling             return std::move(Err);
84219ef4fadSMehdi Amini         break;
84319ef4fadSMehdi Amini       }
84419ef4fadSMehdi Amini       case bitc::METADATA_KIND:
84519ef4fadSMehdi Amini       case bitc::METADATA_STRING_OLD:
84619ef4fadSMehdi Amini       case bitc::METADATA_OLD_FN_NODE:
84719ef4fadSMehdi Amini       case bitc::METADATA_OLD_NODE:
84819ef4fadSMehdi Amini       case bitc::METADATA_VALUE:
84919ef4fadSMehdi Amini       case bitc::METADATA_DISTINCT_NODE:
85019ef4fadSMehdi Amini       case bitc::METADATA_NODE:
85119ef4fadSMehdi Amini       case bitc::METADATA_LOCATION:
85219ef4fadSMehdi Amini       case bitc::METADATA_GENERIC_DEBUG:
85319ef4fadSMehdi Amini       case bitc::METADATA_SUBRANGE:
85419ef4fadSMehdi Amini       case bitc::METADATA_ENUMERATOR:
85519ef4fadSMehdi Amini       case bitc::METADATA_BASIC_TYPE:
856*f91d18eaSSourabh Singh Tomar       case bitc::METADATA_STRING_TYPE:
85719ef4fadSMehdi Amini       case bitc::METADATA_DERIVED_TYPE:
85819ef4fadSMehdi Amini       case bitc::METADATA_COMPOSITE_TYPE:
85919ef4fadSMehdi Amini       case bitc::METADATA_SUBROUTINE_TYPE:
86019ef4fadSMehdi Amini       case bitc::METADATA_MODULE:
86119ef4fadSMehdi Amini       case bitc::METADATA_FILE:
86219ef4fadSMehdi Amini       case bitc::METADATA_COMPILE_UNIT:
86319ef4fadSMehdi Amini       case bitc::METADATA_SUBPROGRAM:
86419ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK:
86519ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK_FILE:
86619ef4fadSMehdi Amini       case bitc::METADATA_NAMESPACE:
8676ed5706aSAdrian Prantl       case bitc::METADATA_COMMON_BLOCK:
86819ef4fadSMehdi Amini       case bitc::METADATA_MACRO:
86919ef4fadSMehdi Amini       case bitc::METADATA_MACRO_FILE:
87019ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_TYPE:
87119ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_VALUE:
87219ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR:
87319ef4fadSMehdi Amini       case bitc::METADATA_LOCAL_VAR:
8742c864551SShiva Chen       case bitc::METADATA_LABEL:
87519ef4fadSMehdi Amini       case bitc::METADATA_EXPRESSION:
87619ef4fadSMehdi Amini       case bitc::METADATA_OBJC_PROPERTY:
87719ef4fadSMehdi Amini       case bitc::METADATA_IMPORTED_ENTITY:
87819ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR_EXPR:
87919ef4fadSMehdi Amini         // We don't expect to see any of these, if we see one, give up on
88019ef4fadSMehdi Amini         // lazy-loading and fallback.
88119ef4fadSMehdi Amini         MDStringRef.clear();
88219ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.clear();
88319ef4fadSMehdi Amini         return false;
88419ef4fadSMehdi Amini       }
88519ef4fadSMehdi Amini       break;
88619ef4fadSMehdi Amini     }
88719ef4fadSMehdi Amini     }
88819ef4fadSMehdi Amini   }
88919ef4fadSMehdi Amini }
89019ef4fadSMehdi Amini 
891ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
892ef27db87SMehdi Amini /// module level metadata.
893ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
894ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
895ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
896ef27db87SMehdi Amini 
89719ef4fadSMehdi Amini   // Record the entry position so that we can jump back here and efficiently
89819ef4fadSMehdi Amini   // skip the whole block in case we lazy-load.
89919ef4fadSMehdi Amini   auto EntryPos = Stream.GetCurrentBitNo();
90019ef4fadSMehdi Amini 
9010e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9020e828958SJF Bastien     return Err;
903ef27db87SMehdi Amini 
904ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
905ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
9069f926f70SMehdi Amini 
90719ef4fadSMehdi Amini   // We lazy-load module-level metadata: we build an index for each record, and
90819ef4fadSMehdi Amini   // then load individual record as needed, starting with the named metadata.
90919ef4fadSMehdi Amini   if (ModuleLevel && IsImporting && MetadataList.empty() &&
91019ef4fadSMehdi Amini       !DisableLazyLoading) {
91142ef1990SMehdi Amini     auto SuccessOrErr = lazyLoadModuleMetadataBlock();
91219ef4fadSMehdi Amini     if (!SuccessOrErr)
91319ef4fadSMehdi Amini       return SuccessOrErr.takeError();
91419ef4fadSMehdi Amini     if (SuccessOrErr.get()) {
91519ef4fadSMehdi Amini       // An index was successfully created and we will be able to load metadata
91619ef4fadSMehdi Amini       // on-demand.
91719ef4fadSMehdi Amini       MetadataList.resize(MDStringRef.size() +
91819ef4fadSMehdi Amini                           GlobalMetadataBitPosIndex.size());
91919ef4fadSMehdi Amini 
92019ef4fadSMehdi Amini       // Reading the named metadata created forward references and/or
92119ef4fadSMehdi Amini       // placeholders, that we flush here.
92219ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
923e37d3144SAdrian Prantl       upgradeDebugInfo();
92419ef4fadSMehdi Amini       // Return at the beginning of the block, since it is easy to skip it
92519ef4fadSMehdi Amini       // entirely from there.
92619ef4fadSMehdi Amini       Stream.ReadBlockEnd(); // Pop the abbrev block context.
9270e828958SJF Bastien       if (Error Err = IndexCursor.JumpToBit(EntryPos))
9280e828958SJF Bastien         return Err;
9290e828958SJF Bastien       if (Error Err = Stream.SkipBlock()) {
9300e828958SJF Bastien         // FIXME this drops the error on the floor, which
9310e828958SJF Bastien         // ThinLTO/X86/debuginfo-cu-import.ll relies on.
9320e828958SJF Bastien         consumeError(std::move(Err));
9330e828958SJF Bastien         return Error::success();
9340e828958SJF Bastien       }
93519ef4fadSMehdi Amini       return Error::success();
93619ef4fadSMehdi Amini     }
93719ef4fadSMehdi Amini     // Couldn't load an index, fallback to loading all the block "old-style".
93819ef4fadSMehdi Amini   }
93919ef4fadSMehdi Amini 
94019ef4fadSMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
94119ef4fadSMehdi Amini 
9429f926f70SMehdi Amini   // Read all the records.
9439f926f70SMehdi Amini   while (true) {
9440e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
9450e828958SJF Bastien     if (!MaybeEntry)
9460e828958SJF Bastien       return MaybeEntry.takeError();
9470e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
9489f926f70SMehdi Amini 
9499f926f70SMehdi Amini     switch (Entry.Kind) {
9509f926f70SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
9519f926f70SMehdi Amini     case BitstreamEntry::Error:
9529f926f70SMehdi Amini       return error("Malformed block");
9539f926f70SMehdi Amini     case BitstreamEntry::EndBlock:
95419ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
955e37d3144SAdrian Prantl       upgradeDebugInfo();
9569f926f70SMehdi Amini       return Error::success();
9579f926f70SMehdi Amini     case BitstreamEntry::Record:
9589f926f70SMehdi Amini       // The interesting case.
9599f926f70SMehdi Amini       break;
9609f926f70SMehdi Amini     }
9619f926f70SMehdi Amini 
9629f926f70SMehdi Amini     // Read a record.
9639f926f70SMehdi Amini     Record.clear();
9649f926f70SMehdi Amini     StringRef Blob;
96519ef4fadSMehdi Amini     ++NumMDRecordLoaded;
9660e828958SJF Bastien     if (Expected<unsigned> MaybeCode =
9670e828958SJF Bastien             Stream.readRecord(Entry.ID, Record, &Blob)) {
9680e828958SJF Bastien       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
9690e828958SJF Bastien                                        Blob, NextMetadataNo))
9709f926f70SMehdi Amini         return Err;
9710e828958SJF Bastien     } else
9720e828958SJF Bastien       return MaybeCode.takeError();
9739f926f70SMehdi Amini   }
9749f926f70SMehdi Amini }
9759f926f70SMehdi Amini 
97619ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
97719ef4fadSMehdi Amini   ++NumMDStringLoaded;
97819ef4fadSMehdi Amini   if (Metadata *MD = MetadataList.lookup(ID))
97919ef4fadSMehdi Amini     return cast<MDString>(MD);
98019ef4fadSMehdi Amini   auto MDS = MDString::get(Context, MDStringRef[ID]);
98119ef4fadSMehdi Amini   MetadataList.assignValue(MDS, ID);
98219ef4fadSMehdi Amini   return MDS;
98319ef4fadSMehdi Amini }
98419ef4fadSMehdi Amini 
98519ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
98619ef4fadSMehdi Amini     unsigned ID, PlaceholderQueue &Placeholders) {
98719ef4fadSMehdi Amini   assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
98819ef4fadSMehdi Amini   assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
98919ef4fadSMehdi Amini   // Lookup first if the metadata hasn't already been loaded.
99019ef4fadSMehdi Amini   if (auto *MD = MetadataList.lookup(ID)) {
99187399997SSimon Pilgrim     auto *N = cast<MDNode>(MD);
99267d2cc1fSMehdi Amini     if (!N->isTemporary())
99367d2cc1fSMehdi Amini       return;
99419ef4fadSMehdi Amini   }
99519ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
99619ef4fadSMehdi Amini   StringRef Blob;
9970e828958SJF Bastien   if (Error Err = IndexCursor.JumpToBit(
9980e828958SJF Bastien           GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
9990e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed jumping: " +
10000e828958SJF Bastien                        toString(std::move(Err)));
10010e828958SJF Bastien   Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks();
10020e828958SJF Bastien   if (!MaybeEntry)
10030e828958SJF Bastien     // FIXME this drops the error on the floor.
10040e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
10050e828958SJF Bastien                        toString(MaybeEntry.takeError()));
10060e828958SJF Bastien   BitstreamEntry Entry = MaybeEntry.get();
100719ef4fadSMehdi Amini   ++NumMDRecordLoaded;
10080e828958SJF Bastien   if (Expected<unsigned> MaybeCode =
10090e828958SJF Bastien           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10100e828958SJF Bastien     if (Error Err =
10110e828958SJF Bastien             parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10120e828958SJF Bastien       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
10130e828958SJF Bastien                          toString(std::move(Err)));
10140e828958SJF Bastien   } else
10150e828958SJF Bastien     report_fatal_error("Can't lazyload MD: " + toString(MaybeCode.takeError()));
101619ef4fadSMehdi Amini }
101719ef4fadSMehdi Amini 
101819ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
101919ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
102019ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
102119ef4fadSMehdi Amini     PlaceholderQueue &Placeholders) {
102219ef4fadSMehdi Amini   DenseSet<unsigned> Temporaries;
102319ef4fadSMehdi Amini   while (1) {
102419ef4fadSMehdi Amini     // Populate Temporaries with the placeholders that haven't been loaded yet.
102519ef4fadSMehdi Amini     Placeholders.getTemporaries(MetadataList, Temporaries);
102619ef4fadSMehdi Amini 
102719ef4fadSMehdi Amini     // If we don't have any temporary, or FwdReference, we're done!
102819ef4fadSMehdi Amini     if (Temporaries.empty() && !MetadataList.hasFwdRefs())
102919ef4fadSMehdi Amini       break;
103019ef4fadSMehdi Amini 
103119ef4fadSMehdi Amini     // First, load all the temporaries. This can add new placeholders or
103219ef4fadSMehdi Amini     // forward references.
103319ef4fadSMehdi Amini     for (auto ID : Temporaries)
103419ef4fadSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
103519ef4fadSMehdi Amini     Temporaries.clear();
103619ef4fadSMehdi Amini 
103719ef4fadSMehdi Amini     // Second, load the forward-references. This can also add new placeholders
103819ef4fadSMehdi Amini     // or forward references.
103919ef4fadSMehdi Amini     while (MetadataList.hasFwdRefs())
104019ef4fadSMehdi Amini       lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
104119ef4fadSMehdi Amini   }
104219ef4fadSMehdi Amini   // At this point we don't have any forward reference remaining, or temporary
104319ef4fadSMehdi Amini   // that haven't been loaded. We can safely drop RAUW support and mark cycles
104419ef4fadSMehdi Amini   // as resolved.
104519ef4fadSMehdi Amini   MetadataList.tryToResolveCycles();
104619ef4fadSMehdi Amini 
104719ef4fadSMehdi Amini   // Finally, everything is in place, we can replace the placeholders operands
104819ef4fadSMehdi Amini   // with the final node they refer to.
104919ef4fadSMehdi Amini   Placeholders.flush(MetadataList);
105019ef4fadSMehdi Amini }
105119ef4fadSMehdi Amini 
10529f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
10539f926f70SMehdi Amini     SmallVectorImpl<uint64_t> &Record, unsigned Code,
105419ef4fadSMehdi Amini     PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
10559f926f70SMehdi Amini 
10569f926f70SMehdi Amini   bool IsDistinct = false;
1057ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
105819ef4fadSMehdi Amini     if (ID < MDStringRef.size())
105919ef4fadSMehdi Amini       return lazyLoadOneMDString(ID);
106067d2cc1fSMehdi Amini     if (!IsDistinct) {
106167d2cc1fSMehdi Amini       if (auto *MD = MetadataList.lookup(ID))
106267d2cc1fSMehdi Amini         return MD;
106367d2cc1fSMehdi Amini       // If lazy-loading is enabled, we try recursively to load the operand
106467d2cc1fSMehdi Amini       // instead of creating a temporary.
106567d2cc1fSMehdi Amini       if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
106667d2cc1fSMehdi Amini         // Create a temporary for the node that is referencing the operand we
106767d2cc1fSMehdi Amini         // will lazy-load. It is needed before recursing in case there are
106867d2cc1fSMehdi Amini         // uniquing cycles.
106967d2cc1fSMehdi Amini         MetadataList.getMetadataFwdRef(NextMetadataNo);
107067d2cc1fSMehdi Amini         lazyLoadOneMetadata(ID, Placeholders);
107167d2cc1fSMehdi Amini         return MetadataList.lookup(ID);
107267d2cc1fSMehdi Amini       }
107367d2cc1fSMehdi Amini       // Return a temporary.
1074ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
107567d2cc1fSMehdi Amini     }
1076ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1077ef27db87SMehdi Amini       return MD;
1078ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
1079ef27db87SMehdi Amini   };
1080ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1081ef27db87SMehdi Amini     if (ID)
1082ef27db87SMehdi Amini       return getMD(ID - 1);
1083ef27db87SMehdi Amini     return nullptr;
1084ef27db87SMehdi Amini   };
1085ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1086ef27db87SMehdi Amini     if (ID)
1087ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
1088ef27db87SMehdi Amini     return nullptr;
1089ef27db87SMehdi Amini   };
1090ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
1091ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
1092ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
109319ef4fadSMehdi Amini     auto MDS = getMDOrNull(ID);
109419ef4fadSMehdi Amini     return cast_or_null<MDString>(MDS);
1095ef27db87SMehdi Amini   };
1096ef27db87SMehdi Amini 
1097ef27db87SMehdi Amini   // Support for old type refs.
1098ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
1099ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1100ef27db87SMehdi Amini   };
1101ef27db87SMehdi Amini 
1102ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
1103ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1104ef27db87SMehdi Amini 
1105ef27db87SMehdi Amini   switch (Code) {
1106ef27db87SMehdi Amini   default: // Default behavior: ignore.
1107ef27db87SMehdi Amini     break;
1108ef27db87SMehdi Amini   case bitc::METADATA_NAME: {
1109ef27db87SMehdi Amini     // Read name of the named metadata.
1110ef27db87SMehdi Amini     SmallString<8> Name(Record.begin(), Record.end());
1111ef27db87SMehdi Amini     Record.clear();
11120e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.ReadCode();
11130e828958SJF Bastien     if (!MaybeCode)
11140e828958SJF Bastien       return MaybeCode.takeError();
11150e828958SJF Bastien     Code = MaybeCode.get();
1116ef27db87SMehdi Amini 
111719ef4fadSMehdi Amini     ++NumMDRecordLoaded;
11180e828958SJF Bastien     if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
11190e828958SJF Bastien       if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1120ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
11210e828958SJF Bastien     } else
11220e828958SJF Bastien       return MaybeNextBitCode.takeError();
1123ef27db87SMehdi Amini 
1124ef27db87SMehdi Amini     // Read named metadata elements.
1125ef27db87SMehdi Amini     unsigned Size = Record.size();
1126ef27db87SMehdi Amini     NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1127ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; ++i) {
1128ef27db87SMehdi Amini       MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1129ef27db87SMehdi Amini       if (!MD)
1130f3d2453dSTeresa Johnson         return error("Invalid named metadata: expect fwd ref to MDNode");
1131ef27db87SMehdi Amini       NMD->addOperand(MD);
1132ef27db87SMehdi Amini     }
1133ef27db87SMehdi Amini     break;
1134ef27db87SMehdi Amini   }
1135ef27db87SMehdi Amini   case bitc::METADATA_OLD_FN_NODE: {
11364abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1137ef27db87SMehdi Amini     // This is a LocalAsMetadata record, the only type of function-local
1138ef27db87SMehdi Amini     // metadata.
1139ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1140ef27db87SMehdi Amini       return error("Invalid record");
1141ef27db87SMehdi Amini 
1142ef27db87SMehdi Amini     // If this isn't a LocalAsMetadata record, we're dropping it.  This used
1143ef27db87SMehdi Amini     // to be legal, but there's no upgrade path.
1144ef27db87SMehdi Amini     auto dropRecord = [&] {
1145c05c9db3SIvan Krasin       MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1146c05c9db3SIvan Krasin       NextMetadataNo++;
1147ef27db87SMehdi Amini     };
1148ef27db87SMehdi Amini     if (Record.size() != 2) {
1149ef27db87SMehdi Amini       dropRecord();
1150ef27db87SMehdi Amini       break;
1151ef27db87SMehdi Amini     }
1152ef27db87SMehdi Amini 
1153ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1154ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1155ef27db87SMehdi Amini       dropRecord();
1156ef27db87SMehdi Amini       break;
1157ef27db87SMehdi Amini     }
1158ef27db87SMehdi Amini 
1159ef27db87SMehdi Amini     MetadataList.assignValue(
1160ef27db87SMehdi Amini         LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1161c05c9db3SIvan Krasin         NextMetadataNo);
1162c05c9db3SIvan Krasin     NextMetadataNo++;
1163ef27db87SMehdi Amini     break;
1164ef27db87SMehdi Amini   }
1165ef27db87SMehdi Amini   case bitc::METADATA_OLD_NODE: {
11664abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1167ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1168ef27db87SMehdi Amini       return error("Invalid record");
1169ef27db87SMehdi Amini 
1170ef27db87SMehdi Amini     unsigned Size = Record.size();
1171ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1172ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; i += 2) {
1173ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[i]);
1174ef27db87SMehdi Amini       if (!Ty)
1175ef27db87SMehdi Amini         return error("Invalid record");
1176ef27db87SMehdi Amini       if (Ty->isMetadataTy())
1177ef27db87SMehdi Amini         Elts.push_back(getMD(Record[i + 1]));
1178ef27db87SMehdi Amini       else if (!Ty->isVoidTy()) {
1179ef27db87SMehdi Amini         auto *MD =
1180ef27db87SMehdi Amini             ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1181ef27db87SMehdi Amini         assert(isa<ConstantAsMetadata>(MD) &&
1182ef27db87SMehdi Amini                "Expected non-function-local metadata");
1183ef27db87SMehdi Amini         Elts.push_back(MD);
1184ef27db87SMehdi Amini       } else
1185ef27db87SMehdi Amini         Elts.push_back(nullptr);
1186ef27db87SMehdi Amini     }
1187c05c9db3SIvan Krasin     MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1188c05c9db3SIvan Krasin     NextMetadataNo++;
1189ef27db87SMehdi Amini     break;
1190ef27db87SMehdi Amini   }
1191ef27db87SMehdi Amini   case bitc::METADATA_VALUE: {
1192ef27db87SMehdi Amini     if (Record.size() != 2)
1193ef27db87SMehdi Amini       return error("Invalid record");
1194ef27db87SMehdi Amini 
1195ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1196ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy())
1197ef27db87SMehdi Amini       return error("Invalid record");
1198ef27db87SMehdi Amini 
1199ef27db87SMehdi Amini     MetadataList.assignValue(
1200ef27db87SMehdi Amini         ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1201c05c9db3SIvan Krasin         NextMetadataNo);
1202c05c9db3SIvan Krasin     NextMetadataNo++;
1203ef27db87SMehdi Amini     break;
1204ef27db87SMehdi Amini   }
1205ef27db87SMehdi Amini   case bitc::METADATA_DISTINCT_NODE:
1206ef27db87SMehdi Amini     IsDistinct = true;
1207ef27db87SMehdi Amini     LLVM_FALLTHROUGH;
1208ef27db87SMehdi Amini   case bitc::METADATA_NODE: {
1209ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1210ef27db87SMehdi Amini     Elts.reserve(Record.size());
1211ef27db87SMehdi Amini     for (unsigned ID : Record)
1212ef27db87SMehdi Amini       Elts.push_back(getMDOrNull(ID));
1213ef27db87SMehdi Amini     MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1214ef27db87SMehdi Amini                                         : MDNode::get(Context, Elts),
1215c05c9db3SIvan Krasin                              NextMetadataNo);
1216c05c9db3SIvan Krasin     NextMetadataNo++;
1217ef27db87SMehdi Amini     break;
1218ef27db87SMehdi Amini   }
1219ef27db87SMehdi Amini   case bitc::METADATA_LOCATION: {
1220386ad01cSVedant Kumar     if (Record.size() != 5 && Record.size() != 6)
1221ef27db87SMehdi Amini       return error("Invalid record");
1222ef27db87SMehdi Amini 
1223ef27db87SMehdi Amini     IsDistinct = Record[0];
1224ef27db87SMehdi Amini     unsigned Line = Record[1];
1225ef27db87SMehdi Amini     unsigned Column = Record[2];
1226ef27db87SMehdi Amini     Metadata *Scope = getMD(Record[3]);
1227ef27db87SMehdi Amini     Metadata *InlinedAt = getMDOrNull(Record[4]);
1228386ad01cSVedant Kumar     bool ImplicitCode = Record.size() == 6 && Record[5];
1229ef27db87SMehdi Amini     MetadataList.assignValue(
1230eb7f6020SCalixte Denizet         GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1231eb7f6020SCalixte Denizet                                      ImplicitCode)),
1232c05c9db3SIvan Krasin         NextMetadataNo);
1233c05c9db3SIvan Krasin     NextMetadataNo++;
1234ef27db87SMehdi Amini     break;
1235ef27db87SMehdi Amini   }
1236ef27db87SMehdi Amini   case bitc::METADATA_GENERIC_DEBUG: {
1237ef27db87SMehdi Amini     if (Record.size() < 4)
1238ef27db87SMehdi Amini       return error("Invalid record");
1239ef27db87SMehdi Amini 
1240ef27db87SMehdi Amini     IsDistinct = Record[0];
1241ef27db87SMehdi Amini     unsigned Tag = Record[1];
1242ef27db87SMehdi Amini     unsigned Version = Record[2];
1243ef27db87SMehdi Amini 
1244ef27db87SMehdi Amini     if (Tag >= 1u << 16 || Version != 0)
1245ef27db87SMehdi Amini       return error("Invalid record");
1246ef27db87SMehdi Amini 
1247ef27db87SMehdi Amini     auto *Header = getMDString(Record[3]);
1248ef27db87SMehdi Amini     SmallVector<Metadata *, 8> DwarfOps;
1249ef27db87SMehdi Amini     for (unsigned I = 4, E = Record.size(); I != E; ++I)
1250ef27db87SMehdi Amini       DwarfOps.push_back(getMDOrNull(Record[I]));
1251ef27db87SMehdi Amini     MetadataList.assignValue(
1252ef27db87SMehdi Amini         GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1253c05c9db3SIvan Krasin         NextMetadataNo);
1254c05c9db3SIvan Krasin     NextMetadataNo++;
1255ef27db87SMehdi Amini     break;
1256ef27db87SMehdi Amini   }
1257ef27db87SMehdi Amini   case bitc::METADATA_SUBRANGE: {
1258fdf40917SSander de Smalen     Metadata *Val = nullptr;
1259fdf40917SSander de Smalen     // Operand 'count' is interpreted as:
1260fdf40917SSander de Smalen     // - Signed integer (version 0)
1261fdf40917SSander de Smalen     // - Metadata node  (version 1)
1262d20bf5a7SAlok Kumar Sharma     // Operand 'lowerBound' is interpreted as:
1263d20bf5a7SAlok Kumar Sharma     // - Signed integer (version 0 and 1)
1264d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1265d20bf5a7SAlok Kumar Sharma     // Operands 'upperBound' and 'stride' are interpreted as:
1266d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1267fdf40917SSander de Smalen     switch (Record[0] >> 1) {
1268fdf40917SSander de Smalen     case 0:
1269fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange,
1270d20bf5a7SAlok Kumar Sharma                             (Context, Record[1], unrotateSign(Record[2])));
1271fdf40917SSander de Smalen       break;
1272fdf40917SSander de Smalen     case 1:
1273fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1274d20bf5a7SAlok Kumar Sharma                                          unrotateSign(Record[2])));
1275d20bf5a7SAlok Kumar Sharma       break;
1276d20bf5a7SAlok Kumar Sharma     case 2:
1277d20bf5a7SAlok Kumar Sharma       Val = GET_OR_DISTINCT(
1278d20bf5a7SAlok Kumar Sharma           DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1279d20bf5a7SAlok Kumar Sharma                        getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1280fdf40917SSander de Smalen       break;
1281fdf40917SSander de Smalen     default:
1282fdf40917SSander de Smalen       return error("Invalid record: Unsupported version of DISubrange");
1283fdf40917SSander de Smalen     }
1284ef27db87SMehdi Amini 
1285fdf40917SSander de Smalen     MetadataList.assignValue(Val, NextMetadataNo);
1286fdf40917SSander de Smalen     IsDistinct = Record[0] & 1;
1287c05c9db3SIvan Krasin     NextMetadataNo++;
1288ef27db87SMehdi Amini     break;
1289ef27db87SMehdi Amini   }
1290ef27db87SMehdi Amini   case bitc::METADATA_ENUMERATOR: {
1291aad3d578SLemonBoy     if (Record.size() < 3)
1292ef27db87SMehdi Amini       return error("Invalid record");
1293ef27db87SMehdi Amini 
129408dc66efSMomchil Velikov     IsDistinct = Record[0] & 1;
129508dc66efSMomchil Velikov     bool IsUnsigned = Record[0] & 2;
1296aad3d578SLemonBoy     bool IsBigInt = Record[0] & 4;
1297aad3d578SLemonBoy     APInt Value;
1298aad3d578SLemonBoy 
1299aad3d578SLemonBoy     if (IsBigInt) {
1300aad3d578SLemonBoy       const uint64_t BitWidth = Record[1];
1301aad3d578SLemonBoy       const size_t NumWords = Record.size() - 3;
1302aad3d578SLemonBoy       Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1303aad3d578SLemonBoy     } else
1304aad3d578SLemonBoy       Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1305aad3d578SLemonBoy 
1306ef27db87SMehdi Amini     MetadataList.assignValue(
1307aad3d578SLemonBoy         GET_OR_DISTINCT(DIEnumerator,
1308aad3d578SLemonBoy                         (Context, Value, IsUnsigned, getMDString(Record[2]))),
1309c05c9db3SIvan Krasin         NextMetadataNo);
1310c05c9db3SIvan Krasin     NextMetadataNo++;
1311ef27db87SMehdi Amini     break;
1312ef27db87SMehdi Amini   }
1313ef27db87SMehdi Amini   case bitc::METADATA_BASIC_TYPE: {
131455f42629SAdrian Prantl     if (Record.size() < 6 || Record.size() > 7)
1315ef27db87SMehdi Amini       return error("Invalid record");
1316ef27db87SMehdi Amini 
1317ef27db87SMehdi Amini     IsDistinct = Record[0];
131855f42629SAdrian Prantl     DINode::DIFlags Flags = (Record.size() > 6) ?
131955f42629SAdrian Prantl                     static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero;
132055f42629SAdrian Prantl 
1321ef27db87SMehdi Amini     MetadataList.assignValue(
1322ef27db87SMehdi Amini         GET_OR_DISTINCT(DIBasicType,
13239f926f70SMehdi Amini                         (Context, Record[1], getMDString(Record[2]), Record[3],
132455f42629SAdrian Prantl                          Record[4], Record[5], Flags)),
1325c05c9db3SIvan Krasin         NextMetadataNo);
1326c05c9db3SIvan Krasin     NextMetadataNo++;
1327ef27db87SMehdi Amini     break;
1328ef27db87SMehdi Amini   }
1329*f91d18eaSSourabh Singh Tomar   case bitc::METADATA_STRING_TYPE: {
1330*f91d18eaSSourabh Singh Tomar     if (Record.size() != 8)
1331*f91d18eaSSourabh Singh Tomar       return error("Invalid record");
1332*f91d18eaSSourabh Singh Tomar 
1333*f91d18eaSSourabh Singh Tomar     IsDistinct = Record[0];
1334*f91d18eaSSourabh Singh Tomar     MetadataList.assignValue(
1335*f91d18eaSSourabh Singh Tomar         GET_OR_DISTINCT(DIStringType,
1336*f91d18eaSSourabh Singh Tomar                         (Context, Record[1], getMDString(Record[2]),
1337*f91d18eaSSourabh Singh Tomar                          getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1338*f91d18eaSSourabh Singh Tomar                          Record[5], Record[6], Record[7])),
1339*f91d18eaSSourabh Singh Tomar         NextMetadataNo);
1340*f91d18eaSSourabh Singh Tomar     NextMetadataNo++;
1341*f91d18eaSSourabh Singh Tomar     break;
1342*f91d18eaSSourabh Singh Tomar   }
1343ef27db87SMehdi Amini   case bitc::METADATA_DERIVED_TYPE: {
1344d5561e0aSKonstantin Zhuravlyov     if (Record.size() < 12 || Record.size() > 13)
1345ef27db87SMehdi Amini       return error("Invalid record");
1346ef27db87SMehdi Amini 
1347d5561e0aSKonstantin Zhuravlyov     // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1348d5561e0aSKonstantin Zhuravlyov     // that there is no DWARF address space associated with DIDerivedType.
1349d5561e0aSKonstantin Zhuravlyov     Optional<unsigned> DWARFAddressSpace;
1350d5561e0aSKonstantin Zhuravlyov     if (Record.size() > 12 && Record[12])
1351d5561e0aSKonstantin Zhuravlyov       DWARFAddressSpace = Record[12] - 1;
1352d5561e0aSKonstantin Zhuravlyov 
1353ef27db87SMehdi Amini     IsDistinct = Record[0];
1354ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1355ef27db87SMehdi Amini     MetadataList.assignValue(
1356ef27db87SMehdi Amini         GET_OR_DISTINCT(DIDerivedType,
1357ef27db87SMehdi Amini                         (Context, Record[1], getMDString(Record[2]),
1358ef27db87SMehdi Amini                          getMDOrNull(Record[3]), Record[4],
1359ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5]),
1360ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1361d5561e0aSKonstantin Zhuravlyov                          Record[9], DWARFAddressSpace, Flags,
1362d5561e0aSKonstantin Zhuravlyov                          getDITypeRefOrNull(Record[11]))),
1363c05c9db3SIvan Krasin         NextMetadataNo);
1364c05c9db3SIvan Krasin     NextMetadataNo++;
1365ef27db87SMehdi Amini     break;
1366ef27db87SMehdi Amini   }
1367ef27db87SMehdi Amini   case bitc::METADATA_COMPOSITE_TYPE: {
13682d10258aSAlok Kumar Sharma     if (Record.size() < 16 || Record.size() > 20)
1369ef27db87SMehdi Amini       return error("Invalid record");
1370ef27db87SMehdi Amini 
1371ef27db87SMehdi Amini     // If we have a UUID and this is not a forward declaration, lookup the
1372ef27db87SMehdi Amini     // mapping.
1373ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1374ef27db87SMehdi Amini     bool IsNotUsedInTypeRef = Record[0] >= 2;
1375ef27db87SMehdi Amini     unsigned Tag = Record[1];
1376ef27db87SMehdi Amini     MDString *Name = getMDString(Record[2]);
1377ef27db87SMehdi Amini     Metadata *File = getMDOrNull(Record[3]);
1378ef27db87SMehdi Amini     unsigned Line = Record[4];
1379ef27db87SMehdi Amini     Metadata *Scope = getDITypeRefOrNull(Record[5]);
1380a61f5e37STeresa Johnson     Metadata *BaseType = nullptr;
1381ef27db87SMehdi Amini     uint64_t SizeInBits = Record[7];
1382ef27db87SMehdi Amini     if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1383ef27db87SMehdi Amini       return error("Alignment value is too large");
1384ef27db87SMehdi Amini     uint32_t AlignInBits = Record[8];
1385a61f5e37STeresa Johnson     uint64_t OffsetInBits = 0;
1386ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1387a61f5e37STeresa Johnson     Metadata *Elements = nullptr;
1388ef27db87SMehdi Amini     unsigned RuntimeLang = Record[12];
1389a61f5e37STeresa Johnson     Metadata *VTableHolder = nullptr;
1390a61f5e37STeresa Johnson     Metadata *TemplateParams = nullptr;
13918c59921cSAdrian Prantl     Metadata *Discriminator = nullptr;
13924042ada1SAlok Kumar Sharma     Metadata *DataLocation = nullptr;
13932d10258aSAlok Kumar Sharma     Metadata *Associated = nullptr;
13942d10258aSAlok Kumar Sharma     Metadata *Allocated = nullptr;
1395ef27db87SMehdi Amini     auto *Identifier = getMDString(Record[15]);
1396a61f5e37STeresa Johnson     // If this module is being parsed so that it can be ThinLTO imported
1397a61f5e37STeresa Johnson     // into another module, composite types only need to be imported
1398a61f5e37STeresa Johnson     // as type declarations (unless full type definitions requested).
1399a61f5e37STeresa Johnson     // Create type declarations up front to save memory. Also, buildODRType
1400a61f5e37STeresa Johnson     // handles the case where this is type ODRed with a definition needed
1401a61f5e37STeresa Johnson     // by the importing module, in which case the existing definition is
1402a61f5e37STeresa Johnson     // used.
14035a8dba5bSTeresa Johnson     if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1404a61f5e37STeresa Johnson         (Tag == dwarf::DW_TAG_enumeration_type ||
1405a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_class_type ||
1406a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_structure_type ||
1407a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_union_type)) {
1408a61f5e37STeresa Johnson       Flags = Flags | DINode::FlagFwdDecl;
1409a61f5e37STeresa Johnson     } else {
1410a61f5e37STeresa Johnson       BaseType = getDITypeRefOrNull(Record[6]);
1411a61f5e37STeresa Johnson       OffsetInBits = Record[9];
1412a61f5e37STeresa Johnson       Elements = getMDOrNull(Record[11]);
1413a61f5e37STeresa Johnson       VTableHolder = getDITypeRefOrNull(Record[13]);
1414a61f5e37STeresa Johnson       TemplateParams = getMDOrNull(Record[14]);
14158c59921cSAdrian Prantl       if (Record.size() > 16)
14168c59921cSAdrian Prantl         Discriminator = getMDOrNull(Record[16]);
14174042ada1SAlok Kumar Sharma       if (Record.size() > 17)
14184042ada1SAlok Kumar Sharma         DataLocation = getMDOrNull(Record[17]);
14192d10258aSAlok Kumar Sharma       if (Record.size() > 19) {
14202d10258aSAlok Kumar Sharma         Associated = getMDOrNull(Record[18]);
14212d10258aSAlok Kumar Sharma         Allocated = getMDOrNull(Record[19]);
14222d10258aSAlok Kumar Sharma       }
1423a61f5e37STeresa Johnson     }
1424ef27db87SMehdi Amini     DICompositeType *CT = nullptr;
1425ef27db87SMehdi Amini     if (Identifier)
1426ef27db87SMehdi Amini       CT = DICompositeType::buildODRType(
1427ef27db87SMehdi Amini           Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1428ef27db87SMehdi Amini           SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
14292d10258aSAlok Kumar Sharma           VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
14302d10258aSAlok Kumar Sharma           Allocated);
1431ef27db87SMehdi Amini 
1432ef27db87SMehdi Amini     // Create a node if we didn't get a lazy ODR type.
1433ef27db87SMehdi Amini     if (!CT)
1434ef27db87SMehdi Amini       CT = GET_OR_DISTINCT(DICompositeType,
1435ef27db87SMehdi Amini                            (Context, Tag, Name, File, Line, Scope, BaseType,
1436ef27db87SMehdi Amini                             SizeInBits, AlignInBits, OffsetInBits, Flags,
14379f926f70SMehdi Amini                             Elements, RuntimeLang, VTableHolder, TemplateParams,
14382d10258aSAlok Kumar Sharma                             Identifier, Discriminator, DataLocation, Associated,
14392d10258aSAlok Kumar Sharma                             Allocated));
1440ef27db87SMehdi Amini     if (!IsNotUsedInTypeRef && Identifier)
1441ef27db87SMehdi Amini       MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1442ef27db87SMehdi Amini 
1443c05c9db3SIvan Krasin     MetadataList.assignValue(CT, NextMetadataNo);
1444c05c9db3SIvan Krasin     NextMetadataNo++;
1445ef27db87SMehdi Amini     break;
1446ef27db87SMehdi Amini   }
1447ef27db87SMehdi Amini   case bitc::METADATA_SUBROUTINE_TYPE: {
1448ef27db87SMehdi Amini     if (Record.size() < 3 || Record.size() > 4)
1449ef27db87SMehdi Amini       return error("Invalid record");
1450ef27db87SMehdi Amini     bool IsOldTypeRefArray = Record[0] < 2;
1451ef27db87SMehdi Amini     unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1452ef27db87SMehdi Amini 
1453ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1454ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1455ef27db87SMehdi Amini     Metadata *Types = getMDOrNull(Record[2]);
1456ef27db87SMehdi Amini     if (LLVM_UNLIKELY(IsOldTypeRefArray))
1457ef27db87SMehdi Amini       Types = MetadataList.upgradeTypeRefArray(Types);
1458ef27db87SMehdi Amini 
1459ef27db87SMehdi Amini     MetadataList.assignValue(
1460ef27db87SMehdi Amini         GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1461c05c9db3SIvan Krasin         NextMetadataNo);
1462c05c9db3SIvan Krasin     NextMetadataNo++;
1463ef27db87SMehdi Amini     break;
1464ef27db87SMehdi Amini   }
1465ef27db87SMehdi Amini 
1466ef27db87SMehdi Amini   case bitc::METADATA_MODULE: {
1467e59744fdSSourabh Singh Tomar     if (Record.size() < 5 || Record.size() > 8)
1468ef27db87SMehdi Amini       return error("Invalid record");
1469ef27db87SMehdi Amini 
1470e59744fdSSourabh Singh Tomar     unsigned Offset = Record.size() >= 7 ? 2 : 1;
1471ef27db87SMehdi Amini     IsDistinct = Record[0];
1472ef27db87SMehdi Amini     MetadataList.assignValue(
1473e59744fdSSourabh Singh Tomar         GET_OR_DISTINCT(
1474e59744fdSSourabh Singh Tomar             DIModule,
1475e59744fdSSourabh Singh Tomar             (Context, Record.size() >= 7 ? getMDOrNull(Record[1]) : nullptr,
1476e59744fdSSourabh Singh Tomar              getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1477e59744fdSSourabh Singh Tomar              getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1478e59744fdSSourabh Singh Tomar              getMDString(Record[4 + Offset]),
1479e59744fdSSourabh Singh Tomar              Record.size() <= 7 ? 0 : Record[7])),
1480c05c9db3SIvan Krasin         NextMetadataNo);
1481c05c9db3SIvan Krasin     NextMetadataNo++;
1482ef27db87SMehdi Amini     break;
1483ef27db87SMehdi Amini   }
1484ef27db87SMehdi Amini 
1485ef27db87SMehdi Amini   case bitc::METADATA_FILE: {
148616c7bdafSScott Linder     if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1487ef27db87SMehdi Amini       return error("Invalid record");
1488ef27db87SMehdi Amini 
1489ef27db87SMehdi Amini     IsDistinct = Record[0];
14907160384dSScott Linder     Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
14917160384dSScott Linder     // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
14927160384dSScott Linder     // is not present. This matches up with the old internal representation,
14937160384dSScott Linder     // and the old encoding for CSK_None in the ChecksumKind. The new
14947160384dSScott Linder     // representation reserves the value 0 in the ChecksumKind to continue to
14957160384dSScott Linder     // encode None in a backwards-compatible way.
149616c7bdafSScott Linder     if (Record.size() > 4 && Record[3] && Record[4])
14977160384dSScott Linder       Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
14987160384dSScott Linder                        getMDString(Record[4]));
1499ef27db87SMehdi Amini     MetadataList.assignValue(
15009f926f70SMehdi Amini         GET_OR_DISTINCT(
15017faeecc8SAmjad Aboud             DIFile,
150216c7bdafSScott Linder             (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
150316c7bdafSScott Linder              Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
150416c7bdafSScott Linder                                : None)),
1505c05c9db3SIvan Krasin         NextMetadataNo);
1506c05c9db3SIvan Krasin     NextMetadataNo++;
1507ef27db87SMehdi Amini     break;
1508ef27db87SMehdi Amini   }
1509ef27db87SMehdi Amini   case bitc::METADATA_COMPILE_UNIT: {
1510e4e7e447SAdrian Prantl     if (Record.size() < 14 || Record.size() > 22)
1511ef27db87SMehdi Amini       return error("Invalid record");
1512ef27db87SMehdi Amini 
1513ef27db87SMehdi Amini     // Ignore Record[0], which indicates whether this compile unit is
1514ef27db87SMehdi Amini     // distinct.  It's always distinct.
1515ef27db87SMehdi Amini     IsDistinct = true;
1516ef27db87SMehdi Amini     auto *CU = DICompileUnit::getDistinct(
1517ef27db87SMehdi Amini         Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1518ef27db87SMehdi Amini         Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1519ef27db87SMehdi Amini         Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1520ef27db87SMehdi Amini         getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1521ef27db87SMehdi Amini         Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1522ef27db87SMehdi Amini         Record.size() <= 14 ? 0 : Record[14],
15230944a8c2SDehao Chen         Record.size() <= 16 ? true : Record[16],
1524b52e2366SPeter Collingbourne         Record.size() <= 17 ? false : Record[17],
1525bb279116SDavid Blaikie         Record.size() <= 18 ? 0 : Record[18],
1526ab093bfeSDavid Blaikie         Record.size() <= 19 ? 0 : Record[19],
1527e4e7e447SAdrian Prantl         Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1528e4e7e447SAdrian Prantl         Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1529ef27db87SMehdi Amini 
1530c05c9db3SIvan Krasin     MetadataList.assignValue(CU, NextMetadataNo);
1531c05c9db3SIvan Krasin     NextMetadataNo++;
1532ef27db87SMehdi Amini 
1533ef27db87SMehdi Amini     // Move the Upgrade the list of subprograms.
1534ef27db87SMehdi Amini     if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1535ef27db87SMehdi Amini       CUSubprograms.push_back({CU, SPs});
1536ef27db87SMehdi Amini     break;
1537ef27db87SMehdi Amini   }
1538ef27db87SMehdi Amini   case bitc::METADATA_SUBPROGRAM: {
15391d12b885SAdrian Prantl     if (Record.size() < 18 || Record.size() > 21)
1540ef27db87SMehdi Amini       return error("Invalid record");
1541ef27db87SMehdi Amini 
1542adcdc1bdSPaul Robinson     bool HasSPFlags = Record[0] & 4;
154338a61873SPetar Jovanovic 
154438a61873SPetar Jovanovic     DINode::DIFlags Flags;
154538a61873SPetar Jovanovic     DISubprogram::DISPFlags SPFlags;
154638a61873SPetar Jovanovic     if (!HasSPFlags)
154738a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
154838a61873SPetar Jovanovic     else {
154938a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11]);
155038a61873SPetar Jovanovic       SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
155138a61873SPetar Jovanovic     }
155238a61873SPetar Jovanovic 
155338a61873SPetar Jovanovic     // Support for old metadata when
155438a61873SPetar Jovanovic     // subprogram specific flags are placed in DIFlags.
155538a61873SPetar Jovanovic     const unsigned DIFlagMainSubprogram = 1 << 21;
155638a61873SPetar Jovanovic     bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
155738a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag)
155838a61873SPetar Jovanovic       // Remove old DIFlagMainSubprogram from DIFlags.
155938a61873SPetar Jovanovic       // Note: This assumes that any future use of bit 21 defaults to it
156038a61873SPetar Jovanovic       // being 0.
156138a61873SPetar Jovanovic       Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
156238a61873SPetar Jovanovic 
156338a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag && HasSPFlags)
156438a61873SPetar Jovanovic       SPFlags |= DISubprogram::SPFlagMainSubprogram;
156538a61873SPetar Jovanovic     else if (!HasSPFlags)
156638a61873SPetar Jovanovic       SPFlags = DISubprogram::toSPFlags(
1567adcdc1bdSPaul Robinson                     /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
156838a61873SPetar Jovanovic                     /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
156938a61873SPetar Jovanovic                     /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag);
1570adcdc1bdSPaul Robinson 
1571adcdc1bdSPaul Robinson     // All definitions should be distinct.
1572adcdc1bdSPaul Robinson     IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1573ef27db87SMehdi Amini     // Version 1 has a Function as Record[15].
1574ef27db87SMehdi Amini     // Version 2 has removed Record[15].
1575ef27db87SMehdi Amini     // Version 3 has the Unit as Record[15].
1576ef27db87SMehdi Amini     // Version 4 added thisAdjustment.
1577adcdc1bdSPaul Robinson     // Version 5 repacked flags into DISPFlags, changing many element numbers.
1578adcdc1bdSPaul Robinson     bool HasUnit = Record[0] & 2;
1579adcdc1bdSPaul Robinson     if (!HasSPFlags && HasUnit && Record.size() < 19)
1580ef27db87SMehdi Amini       return error("Invalid record");
1581adcdc1bdSPaul Robinson     if (HasSPFlags && !HasUnit)
1582adcdc1bdSPaul Robinson       return error("Invalid record");
1583adcdc1bdSPaul Robinson     // Accommodate older formats.
1584adcdc1bdSPaul Robinson     bool HasFn = false;
1585adcdc1bdSPaul Robinson     bool HasThisAdj = true;
1586adcdc1bdSPaul Robinson     bool HasThrownTypes = true;
1587adcdc1bdSPaul Robinson     unsigned OffsetA = 0;
1588adcdc1bdSPaul Robinson     unsigned OffsetB = 0;
1589adcdc1bdSPaul Robinson     if (!HasSPFlags) {
1590adcdc1bdSPaul Robinson       OffsetA = 2;
1591adcdc1bdSPaul Robinson       OffsetB = 2;
1592adcdc1bdSPaul Robinson       if (Record.size() >= 19) {
1593adcdc1bdSPaul Robinson         HasFn = !HasUnit;
1594adcdc1bdSPaul Robinson         OffsetB++;
1595adcdc1bdSPaul Robinson       }
1596adcdc1bdSPaul Robinson       HasThisAdj = Record.size() >= 20;
1597adcdc1bdSPaul Robinson       HasThrownTypes = Record.size() >= 21;
1598adcdc1bdSPaul Robinson     }
1599adcdc1bdSPaul Robinson     Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1600ef27db87SMehdi Amini     DISubprogram *SP = GET_OR_DISTINCT(
16011d12b885SAdrian Prantl         DISubprogram,
16021d12b885SAdrian Prantl         (Context,
1603ef27db87SMehdi Amini          getDITypeRefOrNull(Record[1]),                     // scope
1604ef27db87SMehdi Amini          getMDString(Record[2]),                            // name
1605ef27db87SMehdi Amini          getMDString(Record[3]),                            // linkageName
1606ef27db87SMehdi Amini          getMDOrNull(Record[4]),                            // file
1607ef27db87SMehdi Amini          Record[5],                                         // line
1608ef27db87SMehdi Amini          getMDOrNull(Record[6]),                            // type
1609adcdc1bdSPaul Robinson          Record[7 + OffsetA],                               // scopeLine
1610adcdc1bdSPaul Robinson          getDITypeRefOrNull(Record[8 + OffsetA]),           // containingType
1611adcdc1bdSPaul Robinson          Record[10 + OffsetA],                              // virtualIndex
1612adcdc1bdSPaul Robinson          HasThisAdj ? Record[16 + OffsetB] : 0,             // thisAdjustment
161338a61873SPetar Jovanovic          Flags,                                             // flags
1614cda54210SPaul Robinson          SPFlags,                                           // SPFlags
1615ef27db87SMehdi Amini          HasUnit ? CUorFn : nullptr,                        // unit
1616adcdc1bdSPaul Robinson          getMDOrNull(Record[13 + OffsetB]),                 // templateParams
1617adcdc1bdSPaul Robinson          getMDOrNull(Record[14 + OffsetB]),                 // declaration
1618adcdc1bdSPaul Robinson          getMDOrNull(Record[15 + OffsetB]),                 // retainedNodes
1619adcdc1bdSPaul Robinson          HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1620adcdc1bdSPaul Robinson                         : nullptr                           // thrownTypes
1621ef27db87SMehdi Amini          ));
1622c05c9db3SIvan Krasin     MetadataList.assignValue(SP, NextMetadataNo);
1623c05c9db3SIvan Krasin     NextMetadataNo++;
1624ef27db87SMehdi Amini 
1625ef27db87SMehdi Amini     // Upgrade sp->function mapping to function->sp mapping.
1626ef27db87SMehdi Amini     if (HasFn) {
1627ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1628ef27db87SMehdi Amini         if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1629ef27db87SMehdi Amini           if (F->isMaterializable())
1630ef27db87SMehdi Amini             // Defer until materialized; unmaterialized functions may not have
1631ef27db87SMehdi Amini             // metadata.
1632ef27db87SMehdi Amini             FunctionsWithSPs[F] = SP;
1633ef27db87SMehdi Amini           else if (!F->empty())
1634ef27db87SMehdi Amini             F->setSubprogram(SP);
1635ef27db87SMehdi Amini         }
1636ef27db87SMehdi Amini     }
1637ef27db87SMehdi Amini     break;
1638ef27db87SMehdi Amini   }
1639ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK: {
1640ef27db87SMehdi Amini     if (Record.size() != 5)
1641ef27db87SMehdi Amini       return error("Invalid record");
1642ef27db87SMehdi Amini 
1643ef27db87SMehdi Amini     IsDistinct = Record[0];
1644ef27db87SMehdi Amini     MetadataList.assignValue(
1645ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlock,
1646ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1647ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3], Record[4])),
1648c05c9db3SIvan Krasin         NextMetadataNo);
1649c05c9db3SIvan Krasin     NextMetadataNo++;
1650ef27db87SMehdi Amini     break;
1651ef27db87SMehdi Amini   }
1652ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1653ef27db87SMehdi Amini     if (Record.size() != 4)
1654ef27db87SMehdi Amini       return error("Invalid record");
1655ef27db87SMehdi Amini 
1656ef27db87SMehdi Amini     IsDistinct = Record[0];
1657ef27db87SMehdi Amini     MetadataList.assignValue(
1658ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlockFile,
1659ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1660ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3])),
1661c05c9db3SIvan Krasin         NextMetadataNo);
1662c05c9db3SIvan Krasin     NextMetadataNo++;
1663ef27db87SMehdi Amini     break;
1664ef27db87SMehdi Amini   }
16656ed5706aSAdrian Prantl   case bitc::METADATA_COMMON_BLOCK: {
16666ed5706aSAdrian Prantl     IsDistinct = Record[0] & 1;
16676ed5706aSAdrian Prantl     MetadataList.assignValue(
16686ed5706aSAdrian Prantl         GET_OR_DISTINCT(DICommonBlock,
16696ed5706aSAdrian Prantl                         (Context, getMDOrNull(Record[1]),
16706ed5706aSAdrian Prantl                          getMDOrNull(Record[2]), getMDString(Record[3]),
16716ed5706aSAdrian Prantl                          getMDOrNull(Record[4]), Record[5])),
16726ed5706aSAdrian Prantl         NextMetadataNo);
16736ed5706aSAdrian Prantl     NextMetadataNo++;
16746ed5706aSAdrian Prantl     break;
16756ed5706aSAdrian Prantl   }
1676ef27db87SMehdi Amini   case bitc::METADATA_NAMESPACE: {
1677fed4f399SAdrian Prantl     // Newer versions of DINamespace dropped file and line.
1678fed4f399SAdrian Prantl     MDString *Name;
1679fed4f399SAdrian Prantl     if (Record.size() == 3)
1680fed4f399SAdrian Prantl       Name = getMDString(Record[2]);
1681fed4f399SAdrian Prantl     else if (Record.size() == 5)
1682fed4f399SAdrian Prantl       Name = getMDString(Record[3]);
1683fed4f399SAdrian Prantl     else
1684ef27db87SMehdi Amini       return error("Invalid record");
1685ef27db87SMehdi Amini 
1686ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1687ef27db87SMehdi Amini     bool ExportSymbols = Record[0] & 2;
1688ef27db87SMehdi Amini     MetadataList.assignValue(
1689ef27db87SMehdi Amini         GET_OR_DISTINCT(DINamespace,
1690fed4f399SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1691c05c9db3SIvan Krasin         NextMetadataNo);
1692c05c9db3SIvan Krasin     NextMetadataNo++;
1693ef27db87SMehdi Amini     break;
1694ef27db87SMehdi Amini   }
1695ef27db87SMehdi Amini   case bitc::METADATA_MACRO: {
1696ef27db87SMehdi Amini     if (Record.size() != 5)
1697ef27db87SMehdi Amini       return error("Invalid record");
1698ef27db87SMehdi Amini 
1699ef27db87SMehdi Amini     IsDistinct = Record[0];
1700ef27db87SMehdi Amini     MetadataList.assignValue(
1701ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacro,
17029f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDString(Record[3]),
17039f926f70SMehdi Amini                          getMDString(Record[4]))),
1704c05c9db3SIvan Krasin         NextMetadataNo);
1705c05c9db3SIvan Krasin     NextMetadataNo++;
1706ef27db87SMehdi Amini     break;
1707ef27db87SMehdi Amini   }
1708ef27db87SMehdi Amini   case bitc::METADATA_MACRO_FILE: {
1709ef27db87SMehdi Amini     if (Record.size() != 5)
1710ef27db87SMehdi Amini       return error("Invalid record");
1711ef27db87SMehdi Amini 
1712ef27db87SMehdi Amini     IsDistinct = Record[0];
1713ef27db87SMehdi Amini     MetadataList.assignValue(
1714ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacroFile,
17159f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDOrNull(Record[3]),
17169f926f70SMehdi Amini                          getMDOrNull(Record[4]))),
1717c05c9db3SIvan Krasin         NextMetadataNo);
1718c05c9db3SIvan Krasin     NextMetadataNo++;
1719ef27db87SMehdi Amini     break;
1720ef27db87SMehdi Amini   }
1721ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_TYPE: {
17227a42babeSAwanish Pandey     if (Record.size() < 3 || Record.size() > 4)
1723ef27db87SMehdi Amini       return error("Invalid record");
1724ef27db87SMehdi Amini 
1725ef27db87SMehdi Amini     IsDistinct = Record[0];
17267a42babeSAwanish Pandey     MetadataList.assignValue(
17277a42babeSAwanish Pandey         GET_OR_DISTINCT(DITemplateTypeParameter,
1728ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
17297a42babeSAwanish Pandey                          getDITypeRefOrNull(Record[2]),
17307a42babeSAwanish Pandey                          (Record.size() == 4) ? getMDOrNull(Record[3])
17317a42babeSAwanish Pandey                                               : getMDOrNull(false))),
1732c05c9db3SIvan Krasin         NextMetadataNo);
1733c05c9db3SIvan Krasin     NextMetadataNo++;
1734ef27db87SMehdi Amini     break;
1735ef27db87SMehdi Amini   }
1736ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_VALUE: {
17377a42babeSAwanish Pandey     if (Record.size() < 5 || Record.size() > 6)
1738ef27db87SMehdi Amini       return error("Invalid record");
1739ef27db87SMehdi Amini 
1740ef27db87SMehdi Amini     IsDistinct = Record[0];
17417a42babeSAwanish Pandey 
1742ef27db87SMehdi Amini     MetadataList.assignValue(
17437a42babeSAwanish Pandey         GET_OR_DISTINCT(
17447a42babeSAwanish Pandey             DITemplateValueParameter,
1745ef27db87SMehdi Amini             (Context, Record[1], getMDString(Record[2]),
1746ef27db87SMehdi Amini              getDITypeRefOrNull(Record[3]),
17477a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
17487a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[5])
17497a42babeSAwanish Pandey                                   : getMDOrNull(Record[4]))),
1750c05c9db3SIvan Krasin         NextMetadataNo);
1751c05c9db3SIvan Krasin     NextMetadataNo++;
1752ef27db87SMehdi Amini     break;
1753ef27db87SMehdi Amini   }
1754ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_VAR: {
1755f8ab35a4SMatthew Voss     if (Record.size() < 11 || Record.size() > 13)
1756ef27db87SMehdi Amini       return error("Invalid record");
1757ef27db87SMehdi Amini 
1758bceaaa96SAdrian Prantl     IsDistinct = Record[0] & 1;
1759bceaaa96SAdrian Prantl     unsigned Version = Record[0] >> 1;
1760ef27db87SMehdi Amini 
1761f8ab35a4SMatthew Voss     if (Version == 2) {
1762f8ab35a4SMatthew Voss       MetadataList.assignValue(
1763f8ab35a4SMatthew Voss           GET_OR_DISTINCT(
1764f8ab35a4SMatthew Voss               DIGlobalVariable,
1765f8ab35a4SMatthew Voss               (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1766f8ab35a4SMatthew Voss                getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1767f8ab35a4SMatthew Voss                getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1768f8ab35a4SMatthew Voss                getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])),
1769f8ab35a4SMatthew Voss           NextMetadataNo);
1770f8ab35a4SMatthew Voss 
1771f8ab35a4SMatthew Voss       NextMetadataNo++;
1772f8ab35a4SMatthew Voss     } else if (Version == 1) {
1773f8ab35a4SMatthew Voss       // No upgrade necessary. A null field will be introduced to indicate
1774f8ab35a4SMatthew Voss       // that no parameter information is available.
1775bceaaa96SAdrian Prantl       MetadataList.assignValue(
1776bceaaa96SAdrian Prantl           GET_OR_DISTINCT(DIGlobalVariable,
1777bceaaa96SAdrian Prantl                           (Context, getMDOrNull(Record[1]),
1778bceaaa96SAdrian Prantl                            getMDString(Record[2]), getMDString(Record[3]),
1779bceaaa96SAdrian Prantl                            getMDOrNull(Record[4]), Record[5],
17809f926f70SMehdi Amini                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1781f8ab35a4SMatthew Voss                            getMDOrNull(Record[10]), nullptr, Record[11])),
1782c05c9db3SIvan Krasin           NextMetadataNo);
1783f8ab35a4SMatthew Voss 
1784c05c9db3SIvan Krasin       NextMetadataNo++;
1785bceaaa96SAdrian Prantl     } else if (Version == 0) {
1786ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
1787ef27db87SMehdi Amini       // ConstantInt here.
1788a5bf2d70SAdrian Prantl       NeedUpgradeToDIGlobalVariableExpression = true;
1789ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
1790ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1791ef27db87SMehdi Amini       if (Record.size() > 11) {
1792ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1793ef27db87SMehdi Amini           return error("Alignment value is too large");
1794ef27db87SMehdi Amini         AlignInBits = Record[11];
1795ef27db87SMehdi Amini       }
1796ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
1797ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1798ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1799ef27db87SMehdi Amini           Attach = GV;
1800ef27db87SMehdi Amini           Expr = nullptr;
1801ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1802ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
1803ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
1804ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
1805ef27db87SMehdi Amini         } else {
1806ef27db87SMehdi Amini           Expr = nullptr;
1807ef27db87SMehdi Amini         }
1808ef27db87SMehdi Amini       }
1809ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
1810ef27db87SMehdi Amini           DIGlobalVariable,
1811ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1812ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1813bceaaa96SAdrian Prantl            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1814f8ab35a4SMatthew Voss            getMDOrNull(Record[10]), nullptr, AlignInBits));
181503c6d31aSAdrian Prantl 
1816e37d3144SAdrian Prantl       DIGlobalVariableExpression *DGVE = nullptr;
1817e37d3144SAdrian Prantl       if (Attach || Expr)
181805782218SAdrian Prantl         DGVE = DIGlobalVariableExpression::getDistinct(
181905782218SAdrian Prantl             Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
182073ec0656SAdrian Prantl       if (Attach)
1821bceaaa96SAdrian Prantl         Attach->addDebugInfo(DGVE);
1822e37d3144SAdrian Prantl 
1823e37d3144SAdrian Prantl       auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1824e37d3144SAdrian Prantl       MetadataList.assignValue(MDNode, NextMetadataNo);
1825e37d3144SAdrian Prantl       NextMetadataNo++;
1826bceaaa96SAdrian Prantl     } else
1827bceaaa96SAdrian Prantl       return error("Invalid record");
182873ec0656SAdrian Prantl 
1829ef27db87SMehdi Amini     break;
1830ef27db87SMehdi Amini   }
1831ef27db87SMehdi Amini   case bitc::METADATA_LOCAL_VAR: {
1832ef27db87SMehdi Amini     // 10th field is for the obseleted 'inlinedAt:' field.
1833ef27db87SMehdi Amini     if (Record.size() < 8 || Record.size() > 10)
1834ef27db87SMehdi Amini       return error("Invalid record");
1835ef27db87SMehdi Amini 
1836ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1837ef27db87SMehdi Amini     bool HasAlignment = Record[0] & 2;
1838ef27db87SMehdi Amini     // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1839ef27db87SMehdi Amini     // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
184068168d17SSimon Pilgrim     // this is newer version of record which doesn't have artificial tag.
1841ef27db87SMehdi Amini     bool HasTag = !HasAlignment && Record.size() > 8;
1842ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1843ef27db87SMehdi Amini     uint32_t AlignInBits = 0;
1844ef27db87SMehdi Amini     if (HasAlignment) {
1845ef27db87SMehdi Amini       if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max())
1846ef27db87SMehdi Amini         return error("Alignment value is too large");
1847ef27db87SMehdi Amini       AlignInBits = Record[8 + HasTag];
1848ef27db87SMehdi Amini     }
1849ef27db87SMehdi Amini     MetadataList.assignValue(
1850ef27db87SMehdi Amini         GET_OR_DISTINCT(DILocalVariable,
1851ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1 + HasTag]),
1852ef27db87SMehdi Amini                          getMDString(Record[2 + HasTag]),
1853ef27db87SMehdi Amini                          getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1854ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5 + HasTag]),
1855ef27db87SMehdi Amini                          Record[6 + HasTag], Flags, AlignInBits)),
1856c05c9db3SIvan Krasin         NextMetadataNo);
1857c05c9db3SIvan Krasin     NextMetadataNo++;
1858ef27db87SMehdi Amini     break;
1859ef27db87SMehdi Amini   }
18602c864551SShiva Chen   case bitc::METADATA_LABEL: {
18612c864551SShiva Chen     if (Record.size() != 5)
18622c864551SShiva Chen       return error("Invalid record");
18632c864551SShiva Chen 
18642c864551SShiva Chen     IsDistinct = Record[0] & 1;
18652c864551SShiva Chen     MetadataList.assignValue(
18662c864551SShiva Chen         GET_OR_DISTINCT(DILabel,
18672c864551SShiva Chen                         (Context, getMDOrNull(Record[1]),
18682c864551SShiva Chen                          getMDString(Record[2]),
18692c864551SShiva Chen                          getMDOrNull(Record[3]), Record[4])),
18702c864551SShiva Chen         NextMetadataNo);
18712c864551SShiva Chen     NextMetadataNo++;
18722c864551SShiva Chen     break;
18732c864551SShiva Chen   }
1874ef27db87SMehdi Amini   case bitc::METADATA_EXPRESSION: {
1875ef27db87SMehdi Amini     if (Record.size() < 1)
1876ef27db87SMehdi Amini       return error("Invalid record");
1877ef27db87SMehdi Amini 
1878ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
18796825fb64SAdrian Prantl     uint64_t Version = Record[0] >> 1;
1880ef27db87SMehdi Amini     auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
1881ffc498dfSFlorian Hahn 
1882ffc498dfSFlorian Hahn     SmallVector<uint64_t, 6> Buffer;
1883ffc498dfSFlorian Hahn     if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
1884ffc498dfSFlorian Hahn       return Err;
1885ef27db87SMehdi Amini 
1886ef27db87SMehdi Amini     MetadataList.assignValue(
1887ffc498dfSFlorian Hahn         GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo);
1888c05c9db3SIvan Krasin     NextMetadataNo++;
1889ef27db87SMehdi Amini     break;
1890ef27db87SMehdi Amini   }
1891bceaaa96SAdrian Prantl   case bitc::METADATA_GLOBAL_VAR_EXPR: {
1892bceaaa96SAdrian Prantl     if (Record.size() != 3)
1893bceaaa96SAdrian Prantl       return error("Invalid record");
1894bceaaa96SAdrian Prantl 
1895bceaaa96SAdrian Prantl     IsDistinct = Record[0];
189605782218SAdrian Prantl     Metadata *Expr = getMDOrNull(Record[2]);
189705782218SAdrian Prantl     if (!Expr)
189805782218SAdrian Prantl       Expr = DIExpression::get(Context, {});
189905782218SAdrian Prantl     MetadataList.assignValue(
190005782218SAdrian Prantl         GET_OR_DISTINCT(DIGlobalVariableExpression,
190105782218SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Expr)),
1902c05c9db3SIvan Krasin         NextMetadataNo);
1903c05c9db3SIvan Krasin     NextMetadataNo++;
1904bceaaa96SAdrian Prantl     break;
1905bceaaa96SAdrian Prantl   }
1906ef27db87SMehdi Amini   case bitc::METADATA_OBJC_PROPERTY: {
1907ef27db87SMehdi Amini     if (Record.size() != 8)
1908ef27db87SMehdi Amini       return error("Invalid record");
1909ef27db87SMehdi Amini 
1910ef27db87SMehdi Amini     IsDistinct = Record[0];
1911ef27db87SMehdi Amini     MetadataList.assignValue(
1912ef27db87SMehdi Amini         GET_OR_DISTINCT(DIObjCProperty,
1913ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
1914ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3],
1915ef27db87SMehdi Amini                          getMDString(Record[4]), getMDString(Record[5]),
1916ef27db87SMehdi Amini                          Record[6], getDITypeRefOrNull(Record[7]))),
1917c05c9db3SIvan Krasin         NextMetadataNo);
1918c05c9db3SIvan Krasin     NextMetadataNo++;
1919ef27db87SMehdi Amini     break;
1920ef27db87SMehdi Amini   }
1921ef27db87SMehdi Amini   case bitc::METADATA_IMPORTED_ENTITY: {
1922d63bfd21SAdrian Prantl     if (Record.size() != 6 && Record.size() != 7)
1923ef27db87SMehdi Amini       return error("Invalid record");
1924ef27db87SMehdi Amini 
1925ef27db87SMehdi Amini     IsDistinct = Record[0];
1926d63bfd21SAdrian Prantl     bool HasFile = (Record.size() == 7);
1927ef27db87SMehdi Amini     MetadataList.assignValue(
1928ef27db87SMehdi Amini         GET_OR_DISTINCT(DIImportedEntity,
1929ef27db87SMehdi Amini                         (Context, Record[1], getMDOrNull(Record[2]),
1930d63bfd21SAdrian Prantl                          getDITypeRefOrNull(Record[3]),
1931d63bfd21SAdrian Prantl                          HasFile ? getMDOrNull(Record[6]) : nullptr,
1932d63bfd21SAdrian Prantl                          HasFile ? Record[4] : 0, getMDString(Record[5]))),
1933c05c9db3SIvan Krasin         NextMetadataNo);
1934c05c9db3SIvan Krasin     NextMetadataNo++;
1935ef27db87SMehdi Amini     break;
1936ef27db87SMehdi Amini   }
1937ef27db87SMehdi Amini   case bitc::METADATA_STRING_OLD: {
1938ef27db87SMehdi Amini     std::string String(Record.begin(), Record.end());
1939ef27db87SMehdi Amini 
1940ef27db87SMehdi Amini     // Test for upgrading !llvm.loop.
1941ef27db87SMehdi Amini     HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
194219ef4fadSMehdi Amini     ++NumMDStringLoaded;
1943ef27db87SMehdi Amini     Metadata *MD = MDString::get(Context, String);
1944c05c9db3SIvan Krasin     MetadataList.assignValue(MD, NextMetadataNo);
1945c05c9db3SIvan Krasin     NextMetadataNo++;
1946ef27db87SMehdi Amini     break;
1947ef27db87SMehdi Amini   }
194819ef4fadSMehdi Amini   case bitc::METADATA_STRINGS: {
194919ef4fadSMehdi Amini     auto CreateNextMDString = [&](StringRef Str) {
195019ef4fadSMehdi Amini       ++NumMDStringLoaded;
1951c05c9db3SIvan Krasin       MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
1952c05c9db3SIvan Krasin       NextMetadataNo++;
195319ef4fadSMehdi Amini     };
195419ef4fadSMehdi Amini     if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
1955ef27db87SMehdi Amini       return Err;
1956ef27db87SMehdi Amini     break;
195719ef4fadSMehdi Amini   }
1958ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
1959ef27db87SMehdi Amini     if (Record.size() % 2 == 0)
1960ef27db87SMehdi Amini       return error("Invalid record");
1961ef27db87SMehdi Amini     unsigned ValueID = Record[0];
1962ef27db87SMehdi Amini     if (ValueID >= ValueList.size())
1963ef27db87SMehdi Amini       return error("Invalid record");
1964ef27db87SMehdi Amini     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
1965ef27db87SMehdi Amini       if (Error Err = parseGlobalObjectAttachment(
1966ef27db87SMehdi Amini               *GO, ArrayRef<uint64_t>(Record).slice(1)))
1967ef27db87SMehdi Amini         return Err;
1968ef27db87SMehdi Amini     break;
1969ef27db87SMehdi Amini   }
1970ef27db87SMehdi Amini   case bitc::METADATA_KIND: {
1971ef27db87SMehdi Amini     // Support older bitcode files that had METADATA_KIND records in a
1972ef27db87SMehdi Amini     // block with METADATA_BLOCK_ID.
1973ef27db87SMehdi Amini     if (Error Err = parseMetadataKindRecord(Record))
1974ef27db87SMehdi Amini       return Err;
1975ef27db87SMehdi Amini     break;
1976ef27db87SMehdi Amini   }
1977ef27db87SMehdi Amini   }
19789f926f70SMehdi Amini   return Error::success();
197919ef4fadSMehdi Amini #undef GET_OR_DISTINCT
1980ef27db87SMehdi Amini }
1981ef27db87SMehdi Amini 
1982ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
198319ef4fadSMehdi Amini     ArrayRef<uint64_t> Record, StringRef Blob,
1984061f4a5fSBenjamin Kramer     function_ref<void(StringRef)> CallBack) {
1985ef27db87SMehdi Amini   // All the MDStrings in the block are emitted together in a single
1986ef27db87SMehdi Amini   // record.  The strings are concatenated and stored in a blob along with
1987ef27db87SMehdi Amini   // their sizes.
1988ef27db87SMehdi Amini   if (Record.size() != 2)
1989ef27db87SMehdi Amini     return error("Invalid record: metadata strings layout");
1990ef27db87SMehdi Amini 
1991ef27db87SMehdi Amini   unsigned NumStrings = Record[0];
1992ef27db87SMehdi Amini   unsigned StringsOffset = Record[1];
1993ef27db87SMehdi Amini   if (!NumStrings)
1994ef27db87SMehdi Amini     return error("Invalid record: metadata strings with no strings");
1995ef27db87SMehdi Amini   if (StringsOffset > Blob.size())
1996ef27db87SMehdi Amini     return error("Invalid record: metadata strings corrupt offset");
1997ef27db87SMehdi Amini 
1998ef27db87SMehdi Amini   StringRef Lengths = Blob.slice(0, StringsOffset);
1999ef27db87SMehdi Amini   SimpleBitstreamCursor R(Lengths);
2000ef27db87SMehdi Amini 
2001ef27db87SMehdi Amini   StringRef Strings = Blob.drop_front(StringsOffset);
2002ef27db87SMehdi Amini   do {
2003ef27db87SMehdi Amini     if (R.AtEndOfStream())
2004ef27db87SMehdi Amini       return error("Invalid record: metadata strings bad length");
2005ef27db87SMehdi Amini 
20060e828958SJF Bastien     Expected<uint32_t> MaybeSize = R.ReadVBR(6);
20070e828958SJF Bastien     if (!MaybeSize)
20080e828958SJF Bastien       return MaybeSize.takeError();
20090e828958SJF Bastien     uint32_t Size = MaybeSize.get();
2010ef27db87SMehdi Amini     if (Strings.size() < Size)
2011ef27db87SMehdi Amini       return error("Invalid record: metadata strings truncated chars");
2012ef27db87SMehdi Amini 
201319ef4fadSMehdi Amini     CallBack(Strings.slice(0, Size));
2014ef27db87SMehdi Amini     Strings = Strings.drop_front(Size);
2015ef27db87SMehdi Amini   } while (--NumStrings);
2016ef27db87SMehdi Amini 
2017ef27db87SMehdi Amini   return Error::success();
2018ef27db87SMehdi Amini }
2019ef27db87SMehdi Amini 
2020ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2021ef27db87SMehdi Amini     GlobalObject &GO, ArrayRef<uint64_t> Record) {
2022ef27db87SMehdi Amini   assert(Record.size() % 2 == 0);
2023ef27db87SMehdi Amini   for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2024ef27db87SMehdi Amini     auto K = MDKindMap.find(Record[I]);
2025ef27db87SMehdi Amini     if (K == MDKindMap.end())
2026ef27db87SMehdi Amini       return error("Invalid ID");
2027ef27db87SMehdi Amini     MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[I + 1]);
2028ef27db87SMehdi Amini     if (!MD)
2029f3d2453dSTeresa Johnson       return error("Invalid metadata attachment: expect fwd ref to MDNode");
2030ef27db87SMehdi Amini     GO.addMetadata(K->second, *MD);
2031ef27db87SMehdi Amini   }
2032ef27db87SMehdi Amini   return Error::success();
2033ef27db87SMehdi Amini }
2034ef27db87SMehdi Amini 
2035ef27db87SMehdi Amini /// Parse metadata attachments.
2036ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
2037ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
20380e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
20390e828958SJF Bastien     return Err;
2040ef27db87SMehdi Amini 
2041ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
20427b0d1457SMehdi Amini   PlaceholderQueue Placeholders;
2043ef27db87SMehdi Amini 
2044ef27db87SMehdi Amini   while (true) {
20450e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
20460e828958SJF Bastien     if (!MaybeEntry)
20470e828958SJF Bastien       return MaybeEntry.takeError();
20480e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
2049ef27db87SMehdi Amini 
2050ef27db87SMehdi Amini     switch (Entry.Kind) {
2051ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2052ef27db87SMehdi Amini     case BitstreamEntry::Error:
2053ef27db87SMehdi Amini       return error("Malformed block");
2054ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
20557b0d1457SMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
2056ef27db87SMehdi Amini       return Error::success();
2057ef27db87SMehdi Amini     case BitstreamEntry::Record:
2058ef27db87SMehdi Amini       // The interesting case.
2059ef27db87SMehdi Amini       break;
2060ef27db87SMehdi Amini     }
2061ef27db87SMehdi Amini 
2062ef27db87SMehdi Amini     // Read a metadata attachment record.
2063ef27db87SMehdi Amini     Record.clear();
206419ef4fadSMehdi Amini     ++NumMDRecordLoaded;
20650e828958SJF Bastien     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
20660e828958SJF Bastien     if (!MaybeRecord)
20670e828958SJF Bastien       return MaybeRecord.takeError();
20680e828958SJF Bastien     switch (MaybeRecord.get()) {
2069ef27db87SMehdi Amini     default: // Default behavior: ignore.
2070ef27db87SMehdi Amini       break;
2071ef27db87SMehdi Amini     case bitc::METADATA_ATTACHMENT: {
2072ef27db87SMehdi Amini       unsigned RecordLength = Record.size();
2073ef27db87SMehdi Amini       if (Record.empty())
2074ef27db87SMehdi Amini         return error("Invalid record");
2075ef27db87SMehdi Amini       if (RecordLength % 2 == 0) {
2076ef27db87SMehdi Amini         // A function attachment.
2077ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(F, Record))
2078ef27db87SMehdi Amini           return Err;
2079ef27db87SMehdi Amini         continue;
2080ef27db87SMehdi Amini       }
2081ef27db87SMehdi Amini 
2082ef27db87SMehdi Amini       // An instruction attachment.
2083ef27db87SMehdi Amini       Instruction *Inst = InstructionList[Record[0]];
2084ef27db87SMehdi Amini       for (unsigned i = 1; i != RecordLength; i = i + 2) {
2085ef27db87SMehdi Amini         unsigned Kind = Record[i];
2086ef27db87SMehdi Amini         DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
2087ef27db87SMehdi Amini         if (I == MDKindMap.end())
2088ef27db87SMehdi Amini           return error("Invalid ID");
20898662305bSMehdi Amini         if (I->second == LLVMContext::MD_tbaa && StripTBAA)
20908662305bSMehdi Amini           continue;
20918662305bSMehdi Amini 
209219ef4fadSMehdi Amini         auto Idx = Record[i + 1];
209319ef4fadSMehdi Amini         if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2094d5549f3dSMehdi Amini             !MetadataList.lookup(Idx)) {
209519ef4fadSMehdi Amini           // Load the attachment if it is in the lazy-loadable range and hasn't
209619ef4fadSMehdi Amini           // been loaded yet.
209719ef4fadSMehdi Amini           lazyLoadOneMetadata(Idx, Placeholders);
2098d5549f3dSMehdi Amini           resolveForwardRefsAndPlaceholders(Placeholders);
2099d5549f3dSMehdi Amini         }
210019ef4fadSMehdi Amini 
210119ef4fadSMehdi Amini         Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2102ef27db87SMehdi Amini         if (isa<LocalAsMetadata>(Node))
2103ef27db87SMehdi Amini           // Drop the attachment.  This used to be legal, but there's no
2104ef27db87SMehdi Amini           // upgrade path.
2105ef27db87SMehdi Amini           break;
2106ef27db87SMehdi Amini         MDNode *MD = dyn_cast_or_null<MDNode>(Node);
2107ef27db87SMehdi Amini         if (!MD)
2108ef27db87SMehdi Amini           return error("Invalid metadata attachment");
2109ef27db87SMehdi Amini 
2110ef27db87SMehdi Amini         if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2111ef27db87SMehdi Amini           MD = upgradeInstructionLoopAttachment(*MD);
2112ef27db87SMehdi Amini 
2113ef27db87SMehdi Amini         if (I->second == LLVMContext::MD_tbaa) {
2114ef27db87SMehdi Amini           assert(!MD->isTemporary() && "should load MDs before attachments");
2115ef27db87SMehdi Amini           MD = UpgradeTBAANode(*MD);
2116ef27db87SMehdi Amini         }
2117ef27db87SMehdi Amini         Inst->setMetadata(I->second, MD);
2118ef27db87SMehdi Amini       }
2119ef27db87SMehdi Amini       break;
2120ef27db87SMehdi Amini     }
2121ef27db87SMehdi Amini     }
2122ef27db87SMehdi Amini   }
2123ef27db87SMehdi Amini }
2124ef27db87SMehdi Amini 
2125ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
2126ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2127ef27db87SMehdi Amini     SmallVectorImpl<uint64_t> &Record) {
2128ef27db87SMehdi Amini   if (Record.size() < 2)
2129ef27db87SMehdi Amini     return error("Invalid record");
2130ef27db87SMehdi Amini 
2131ef27db87SMehdi Amini   unsigned Kind = Record[0];
2132ef27db87SMehdi Amini   SmallString<8> Name(Record.begin() + 1, Record.end());
2133ef27db87SMehdi Amini 
2134ef27db87SMehdi Amini   unsigned NewKind = TheModule.getMDKindID(Name.str());
2135ef27db87SMehdi Amini   if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2136ef27db87SMehdi Amini     return error("Conflicting METADATA_KIND records");
2137ef27db87SMehdi Amini   return Error::success();
2138ef27db87SMehdi Amini }
2139ef27db87SMehdi Amini 
2140ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
2141ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
21420e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
21430e828958SJF Bastien     return Err;
2144ef27db87SMehdi Amini 
2145ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
2146ef27db87SMehdi Amini 
2147ef27db87SMehdi Amini   // Read all the records.
2148ef27db87SMehdi Amini   while (true) {
21490e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
21500e828958SJF Bastien     if (!MaybeEntry)
21510e828958SJF Bastien       return MaybeEntry.takeError();
21520e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
2153ef27db87SMehdi Amini 
2154ef27db87SMehdi Amini     switch (Entry.Kind) {
2155ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2156ef27db87SMehdi Amini     case BitstreamEntry::Error:
2157ef27db87SMehdi Amini       return error("Malformed block");
2158ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
2159ef27db87SMehdi Amini       return Error::success();
2160ef27db87SMehdi Amini     case BitstreamEntry::Record:
2161ef27db87SMehdi Amini       // The interesting case.
2162ef27db87SMehdi Amini       break;
2163ef27db87SMehdi Amini     }
2164ef27db87SMehdi Amini 
2165ef27db87SMehdi Amini     // Read a record.
2166ef27db87SMehdi Amini     Record.clear();
216719ef4fadSMehdi Amini     ++NumMDRecordLoaded;
21680e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
21690e828958SJF Bastien     if (!MaybeCode)
21700e828958SJF Bastien       return MaybeCode.takeError();
21710e828958SJF Bastien     switch (MaybeCode.get()) {
2172ef27db87SMehdi Amini     default: // Default behavior: ignore.
2173ef27db87SMehdi Amini       break;
2174ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
2175ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
2176ef27db87SMehdi Amini         return Err;
2177ef27db87SMehdi Amini       break;
2178ef27db87SMehdi Amini     }
2179ef27db87SMehdi Amini     }
2180ef27db87SMehdi Amini   }
2181ef27db87SMehdi Amini }
2182ef27db87SMehdi Amini 
2183ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
2184ef27db87SMehdi Amini   Pimpl = std::move(RHS.Pimpl);
2185ef27db87SMehdi Amini   return *this;
2186ef27db87SMehdi Amini }
2187ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2188ec68dd49SMehdi Amini     : Pimpl(std::move(RHS.Pimpl)) {}
2189ef27db87SMehdi Amini 
2190ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
2191ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2192ef27db87SMehdi Amini                                BitcodeReaderValueList &ValueList,
2193a61f5e37STeresa Johnson                                bool IsImporting,
2194ef27db87SMehdi Amini                                std::function<Type *(unsigned)> getTypeByID)
21950eaee545SJonas Devlieghere     : Pimpl(std::make_unique<MetadataLoaderImpl>(
2196061f4a5fSBenjamin Kramer           Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2197ef27db87SMehdi Amini 
2198ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2199ec68dd49SMehdi Amini   return Pimpl->parseMetadata(ModuleLevel);
2200ef27db87SMehdi Amini }
2201ef27db87SMehdi Amini 
2202ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2203ef27db87SMehdi Amini 
2204ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
2205ef27db87SMehdi Amini /// necessary.
22063bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
22073bb4d01dSMehdi Amini   return Pimpl->getMetadataFwdRefOrLoad(Idx);
2208ef27db87SMehdi Amini }
2209ef27db87SMehdi Amini 
2210ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2211ef27db87SMehdi Amini   return Pimpl->lookupSubprogramForFunction(F);
2212ef27db87SMehdi Amini }
2213ef27db87SMehdi Amini 
2214ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
2215ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
2216ef27db87SMehdi Amini   return Pimpl->parseMetadataAttachment(F, InstructionList);
2217ef27db87SMehdi Amini }
2218ef27db87SMehdi Amini 
2219ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
2220ef27db87SMehdi Amini   return Pimpl->parseMetadataKinds();
2221ef27db87SMehdi Amini }
2222ef27db87SMehdi Amini 
22238662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) {
22248662305bSMehdi Amini   return Pimpl->setStripTBAA(StripTBAA);
22258662305bSMehdi Amini }
22268662305bSMehdi Amini 
22278662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
22288662305bSMehdi Amini 
2229ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
2230ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
22316825fb64SAdrian Prantl 
22326825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
22336825fb64SAdrian Prantl   return Pimpl->upgradeDebugIntrinsics(F);
22346825fb64SAdrian Prantl }
2235