1ef27db87SMehdi Amini //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2ef27db87SMehdi Amini //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef27db87SMehdi Amini //
7ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
8ef27db87SMehdi Amini 
9ef27db87SMehdi Amini #include "MetadataLoader.h"
10ef27db87SMehdi Amini #include "ValueList.h"
11ef27db87SMehdi Amini 
12ef27db87SMehdi Amini #include "llvm/ADT/APFloat.h"
13ef27db87SMehdi Amini #include "llvm/ADT/APInt.h"
14ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h"
15ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h"
1619ef4fadSMehdi Amini #include "llvm/ADT/DenseSet.h"
17ef27db87SMehdi Amini #include "llvm/ADT/None.h"
18ef27db87SMehdi Amini #include "llvm/ADT/STLExtras.h"
19ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h"
2019ef4fadSMehdi Amini #include "llvm/ADT/Statistic.h"
21ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h"
22ef27db87SMehdi Amini #include "llvm/ADT/Twine.h"
23ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
24e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h"
25ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
26ef27db87SMehdi Amini #include "llvm/IR/Argument.h"
27ef27db87SMehdi Amini #include "llvm/IR/Attributes.h"
28ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
29ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
30ef27db87SMehdi Amini #include "llvm/IR/CallingConv.h"
31ef27db87SMehdi Amini #include "llvm/IR/Comdat.h"
32ef27db87SMehdi Amini #include "llvm/IR/Constant.h"
33ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
34ef27db87SMehdi Amini #include "llvm/IR/DebugInfo.h"
35ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
36ef27db87SMehdi Amini #include "llvm/IR/DebugLoc.h"
37ef27db87SMehdi Amini #include "llvm/IR/DerivedTypes.h"
38ef27db87SMehdi Amini #include "llvm/IR/DiagnosticPrinter.h"
39ef27db87SMehdi Amini #include "llvm/IR/Function.h"
40ef27db87SMehdi Amini #include "llvm/IR/GVMaterializer.h"
41ef27db87SMehdi Amini #include "llvm/IR/GlobalAlias.h"
42ef27db87SMehdi Amini #include "llvm/IR/GlobalIFunc.h"
43ef27db87SMehdi Amini #include "llvm/IR/GlobalIndirectSymbol.h"
44ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
45ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h"
46ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
47ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h"
48ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h"
49ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
50ef27db87SMehdi Amini #include "llvm/IR/Instructions.h"
516825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h"
526bda14b3SChandler Carruth #include "llvm/IR/Intrinsics.h"
53ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
54ef27db87SMehdi Amini #include "llvm/IR/Module.h"
55ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h"
56ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h"
57ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
58ef27db87SMehdi Amini #include "llvm/IR/Type.h"
59ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h"
60ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h"
61ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
62ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
63ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
64ef27db87SMehdi Amini #include "llvm/Support/Debug.h"
65ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
66ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h"
67ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h"
68ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h"
69ef27db87SMehdi Amini #include <algorithm>
70ef27db87SMehdi Amini #include <cassert>
71ef27db87SMehdi Amini #include <cstddef>
72ef27db87SMehdi Amini #include <cstdint>
73ef27db87SMehdi Amini #include <deque>
74ef27db87SMehdi Amini #include <limits>
75ef27db87SMehdi Amini #include <map>
76ef27db87SMehdi Amini #include <string>
77ef27db87SMehdi Amini #include <system_error>
78ef27db87SMehdi Amini #include <tuple>
79ef27db87SMehdi Amini #include <utility>
80ef27db87SMehdi Amini #include <vector>
81ef27db87SMehdi Amini 
82ef27db87SMehdi Amini using namespace llvm;
83ef27db87SMehdi Amini 
8419ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader"
8519ef4fadSMehdi Amini 
8619ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
8719ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
8819ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
8919ef4fadSMehdi Amini 
90a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO.
91a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB.
92a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions(
93a61f5e37STeresa Johnson     "import-full-type-definitions", cl::init(false), cl::Hidden,
94a61f5e37STeresa Johnson     cl::desc("Import full type definitions for ThinLTO."));
95a61f5e37STeresa Johnson 
9619ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading(
9719ef4fadSMehdi Amini     "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
9819ef4fadSMehdi Amini     cl::desc("Force disable the lazy-loading on-demand of metadata when "
9919ef4fadSMehdi Amini              "loading bitcode for importing."));
10019ef4fadSMehdi Amini 
101ef27db87SMehdi Amini namespace {
102ef27db87SMehdi Amini 
103aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
104ef27db87SMehdi Amini 
105ef27db87SMehdi Amini class BitcodeReaderMetadataList {
106ef27db87SMehdi Amini   /// Array of metadata references.
107ef27db87SMehdi Amini   ///
108ef27db87SMehdi Amini   /// Don't use std::vector here.  Some versions of libc++ copy (instead of
109ef27db87SMehdi Amini   /// move) on resize, and TrackingMDRef is very expensive to copy.
110ef27db87SMehdi Amini   SmallVector<TrackingMDRef, 1> MetadataPtrs;
111ef27db87SMehdi Amini 
112690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of forward references that were
113690952d1SMehdi Amini   /// generated.
114690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> ForwardReference;
115690952d1SMehdi Amini 
116690952d1SMehdi Amini   /// The set of indices in MetadataPtrs above of Metadata that need to be
117690952d1SMehdi Amini   /// resolved.
118690952d1SMehdi Amini   SmallDenseSet<unsigned, 1> UnresolvedNodes;
119690952d1SMehdi Amini 
120ef27db87SMehdi Amini   /// Structures for resolving old type refs.
121ef27db87SMehdi Amini   struct {
122ef27db87SMehdi Amini     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
123ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
124ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
125ef27db87SMehdi Amini     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
126ef27db87SMehdi Amini   } OldTypeRefs;
127ef27db87SMehdi Amini 
128ef27db87SMehdi Amini   LLVMContext &Context;
129ef27db87SMehdi Amini 
130864474c9SFlorian Hahn   /// Maximum number of valid references. Forward references exceeding the
131864474c9SFlorian Hahn   /// maximum must be invalid.
132864474c9SFlorian Hahn   unsigned RefsUpperBound;
133864474c9SFlorian Hahn 
134ef27db87SMehdi Amini public:
135864474c9SFlorian Hahn   BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
136864474c9SFlorian Hahn       : Context(C),
137864474c9SFlorian Hahn         RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
138864474c9SFlorian Hahn                                 RefsUpperBound)) {}
139ef27db87SMehdi Amini 
140ef27db87SMehdi Amini   // vector compatibility methods
141ef27db87SMehdi Amini   unsigned size() const { return MetadataPtrs.size(); }
142ef27db87SMehdi Amini   void resize(unsigned N) { MetadataPtrs.resize(N); }
143ef27db87SMehdi Amini   void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
144ef27db87SMehdi Amini   void clear() { MetadataPtrs.clear(); }
145ef27db87SMehdi Amini   Metadata *back() const { return MetadataPtrs.back(); }
146ef27db87SMehdi Amini   void pop_back() { MetadataPtrs.pop_back(); }
147ef27db87SMehdi Amini   bool empty() const { return MetadataPtrs.empty(); }
148ef27db87SMehdi Amini 
149ef27db87SMehdi Amini   Metadata *operator[](unsigned i) const {
150ef27db87SMehdi Amini     assert(i < MetadataPtrs.size());
151ef27db87SMehdi Amini     return MetadataPtrs[i];
152ef27db87SMehdi Amini   }
153ef27db87SMehdi Amini 
154ef27db87SMehdi Amini   Metadata *lookup(unsigned I) const {
155ef27db87SMehdi Amini     if (I < MetadataPtrs.size())
156ef27db87SMehdi Amini       return MetadataPtrs[I];
157ef27db87SMehdi Amini     return nullptr;
158ef27db87SMehdi Amini   }
159ef27db87SMehdi Amini 
160ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
161ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
162690952d1SMehdi Amini     assert(ForwardReference.empty() && "Unexpected forward refs");
163690952d1SMehdi Amini     assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
164ef27db87SMehdi Amini     MetadataPtrs.resize(N);
165ef27db87SMehdi Amini   }
166ef27db87SMehdi Amini 
167ef27db87SMehdi Amini   /// Return the given metadata, creating a replaceable forward reference if
168ef27db87SMehdi Amini   /// necessary.
169ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx);
170ef27db87SMehdi Amini 
1718f976ba0SHiroshi Inoue   /// Return the given metadata only if it is fully resolved.
172ef27db87SMehdi Amini   ///
173ef27db87SMehdi Amini   /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
174ef27db87SMehdi Amini   /// would give \c false.
175ef27db87SMehdi Amini   Metadata *getMetadataIfResolved(unsigned Idx);
176ef27db87SMehdi Amini 
177ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
178ef27db87SMehdi Amini   void assignValue(Metadata *MD, unsigned Idx);
179ef27db87SMehdi Amini   void tryToResolveCycles();
180690952d1SMehdi Amini   bool hasFwdRefs() const { return !ForwardReference.empty(); }
18119ef4fadSMehdi Amini   int getNextFwdRef() {
18219ef4fadSMehdi Amini     assert(hasFwdRefs());
18319ef4fadSMehdi Amini     return *ForwardReference.begin();
18419ef4fadSMehdi Amini   }
185ef27db87SMehdi Amini 
186ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
187ef27db87SMehdi Amini   void addTypeRef(MDString &UUID, DICompositeType &CT);
188ef27db87SMehdi Amini 
189ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
190ef27db87SMehdi Amini   Metadata *upgradeTypeRef(Metadata *MaybeUUID);
191ef27db87SMehdi Amini 
192ef27db87SMehdi Amini   /// Upgrade a type ref array that may have MDString references.
193ef27db87SMehdi Amini   Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
194ef27db87SMehdi Amini 
195ef27db87SMehdi Amini private:
196ef27db87SMehdi Amini   Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
197ef27db87SMehdi Amini };
198ef27db87SMehdi Amini 
199ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
200690952d1SMehdi Amini   if (auto *MDN = dyn_cast<MDNode>(MD))
201690952d1SMehdi Amini     if (!MDN->isResolved())
202690952d1SMehdi Amini       UnresolvedNodes.insert(Idx);
203690952d1SMehdi Amini 
204ef27db87SMehdi Amini   if (Idx == size()) {
205ef27db87SMehdi Amini     push_back(MD);
206ef27db87SMehdi Amini     return;
207ef27db87SMehdi Amini   }
208ef27db87SMehdi Amini 
209ef27db87SMehdi Amini   if (Idx >= size())
210ef27db87SMehdi Amini     resize(Idx + 1);
211ef27db87SMehdi Amini 
212ef27db87SMehdi Amini   TrackingMDRef &OldMD = MetadataPtrs[Idx];
213ef27db87SMehdi Amini   if (!OldMD) {
214ef27db87SMehdi Amini     OldMD.reset(MD);
215ef27db87SMehdi Amini     return;
216ef27db87SMehdi Amini   }
217ef27db87SMehdi Amini 
218ef27db87SMehdi Amini   // If there was a forward reference to this value, replace it.
219ef27db87SMehdi Amini   TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
220ef27db87SMehdi Amini   PrevMD->replaceAllUsesWith(MD);
221690952d1SMehdi Amini   ForwardReference.erase(Idx);
222ef27db87SMehdi Amini }
223ef27db87SMehdi Amini 
224ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
225864474c9SFlorian Hahn   // Bail out for a clearly invalid value.
226864474c9SFlorian Hahn   if (Idx >= RefsUpperBound)
227864474c9SFlorian Hahn     return nullptr;
228864474c9SFlorian Hahn 
229ef27db87SMehdi Amini   if (Idx >= size())
230ef27db87SMehdi Amini     resize(Idx + 1);
231ef27db87SMehdi Amini 
232ef27db87SMehdi Amini   if (Metadata *MD = MetadataPtrs[Idx])
233ef27db87SMehdi Amini     return MD;
234ef27db87SMehdi Amini 
235ef27db87SMehdi Amini   // Track forward refs to be resolved later.
236690952d1SMehdi Amini   ForwardReference.insert(Idx);
237ef27db87SMehdi Amini 
238ef27db87SMehdi Amini   // Create and return a placeholder, which will later be RAUW'd.
23919ef4fadSMehdi Amini   ++NumMDNodeTemporary;
240ef27db87SMehdi Amini   Metadata *MD = MDNode::getTemporary(Context, None).release();
241ef27db87SMehdi Amini   MetadataPtrs[Idx].reset(MD);
242ef27db87SMehdi Amini   return MD;
243ef27db87SMehdi Amini }
244ef27db87SMehdi Amini 
245ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
246ef27db87SMehdi Amini   Metadata *MD = lookup(Idx);
247ef27db87SMehdi Amini   if (auto *N = dyn_cast_or_null<MDNode>(MD))
248ef27db87SMehdi Amini     if (!N->isResolved())
249ef27db87SMehdi Amini       return nullptr;
250ef27db87SMehdi Amini   return MD;
251ef27db87SMehdi Amini }
252ef27db87SMehdi Amini 
253ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
254ef27db87SMehdi Amini   return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
255ef27db87SMehdi Amini }
256ef27db87SMehdi Amini 
257ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
258690952d1SMehdi Amini   if (!ForwardReference.empty())
259ef27db87SMehdi Amini     // Still forward references... can't resolve cycles.
260ef27db87SMehdi Amini     return;
261ef27db87SMehdi Amini 
262ef27db87SMehdi Amini   // Give up on finding a full definition for any forward decls that remain.
263ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.FwdDecls)
264ef27db87SMehdi Amini     OldTypeRefs.Final.insert(Ref);
265ef27db87SMehdi Amini   OldTypeRefs.FwdDecls.clear();
266ef27db87SMehdi Amini 
267ef27db87SMehdi Amini   // Upgrade from old type ref arrays.  In strange cases, this could add to
268ef27db87SMehdi Amini   // OldTypeRefs.Unknown.
269690952d1SMehdi Amini   for (const auto &Array : OldTypeRefs.Arrays)
270ef27db87SMehdi Amini     Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
271ef27db87SMehdi Amini   OldTypeRefs.Arrays.clear();
272ef27db87SMehdi Amini 
273ef27db87SMehdi Amini   // Replace old string-based type refs with the resolved node, if possible.
274ef27db87SMehdi Amini   // If we haven't seen the node, leave it to the verifier to complain about
275ef27db87SMehdi Amini   // the invalid string reference.
276ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.Unknown) {
277ef27db87SMehdi Amini     if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
278ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(CT);
279ef27db87SMehdi Amini     else
280ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(Ref.first);
281ef27db87SMehdi Amini   }
282ef27db87SMehdi Amini   OldTypeRefs.Unknown.clear();
283ef27db87SMehdi Amini 
284690952d1SMehdi Amini   if (UnresolvedNodes.empty())
285ef27db87SMehdi Amini     // Nothing to do.
286ef27db87SMehdi Amini     return;
287ef27db87SMehdi Amini 
288ef27db87SMehdi Amini   // Resolve any cycles.
289690952d1SMehdi Amini   for (unsigned I : UnresolvedNodes) {
290ef27db87SMehdi Amini     auto &MD = MetadataPtrs[I];
291ef27db87SMehdi Amini     auto *N = dyn_cast_or_null<MDNode>(MD);
292ef27db87SMehdi Amini     if (!N)
293ef27db87SMehdi Amini       continue;
294ef27db87SMehdi Amini 
295ef27db87SMehdi Amini     assert(!N->isTemporary() && "Unexpected forward reference");
296ef27db87SMehdi Amini     N->resolveCycles();
297ef27db87SMehdi Amini   }
298ef27db87SMehdi Amini 
299690952d1SMehdi Amini   // Make sure we return early again until there's another unresolved ref.
300690952d1SMehdi Amini   UnresolvedNodes.clear();
301ef27db87SMehdi Amini }
302ef27db87SMehdi Amini 
303ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
304ef27db87SMehdi Amini                                            DICompositeType &CT) {
305ef27db87SMehdi Amini   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
306ef27db87SMehdi Amini   if (CT.isForwardDecl())
307ef27db87SMehdi Amini     OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
308ef27db87SMehdi Amini   else
309ef27db87SMehdi Amini     OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
310ef27db87SMehdi Amini }
311ef27db87SMehdi Amini 
312ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
313ef27db87SMehdi Amini   auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
314ef27db87SMehdi Amini   if (LLVM_LIKELY(!UUID))
315ef27db87SMehdi Amini     return MaybeUUID;
316ef27db87SMehdi Amini 
317ef27db87SMehdi Amini   if (auto *CT = OldTypeRefs.Final.lookup(UUID))
318ef27db87SMehdi Amini     return CT;
319ef27db87SMehdi Amini 
320ef27db87SMehdi Amini   auto &Ref = OldTypeRefs.Unknown[UUID];
321ef27db87SMehdi Amini   if (!Ref)
322ef27db87SMehdi Amini     Ref = MDNode::getTemporary(Context, None);
323ef27db87SMehdi Amini   return Ref.get();
324ef27db87SMehdi Amini }
325ef27db87SMehdi Amini 
326ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
327ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
328ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
329ef27db87SMehdi Amini     return MaybeTuple;
330ef27db87SMehdi Amini 
331ef27db87SMehdi Amini   // Look through the array immediately if possible.
332ef27db87SMehdi Amini   if (!Tuple->isTemporary())
333ef27db87SMehdi Amini     return resolveTypeRefArray(Tuple);
334ef27db87SMehdi Amini 
335ef27db87SMehdi Amini   // Create and return a placeholder to use for now.  Eventually
336ef27db87SMehdi Amini   // resolveTypeRefArrays() will be resolve this forward reference.
337ef27db87SMehdi Amini   OldTypeRefs.Arrays.emplace_back(
338ef27db87SMehdi Amini       std::piecewise_construct, std::forward_as_tuple(Tuple),
339ef27db87SMehdi Amini       std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
340ef27db87SMehdi Amini   return OldTypeRefs.Arrays.back().second.get();
341ef27db87SMehdi Amini }
342ef27db87SMehdi Amini 
343ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
344ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
345ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
346ef27db87SMehdi Amini     return MaybeTuple;
347ef27db87SMehdi Amini 
348da82ce99SFangrui Song   // Look through the DITypeRefArray, upgrading each DIType *.
349ef27db87SMehdi Amini   SmallVector<Metadata *, 32> Ops;
350ef27db87SMehdi Amini   Ops.reserve(Tuple->getNumOperands());
351ef27db87SMehdi Amini   for (Metadata *MD : Tuple->operands())
352ef27db87SMehdi Amini     Ops.push_back(upgradeTypeRef(MD));
353ef27db87SMehdi Amini 
354ef27db87SMehdi Amini   return MDTuple::get(Context, Ops);
355ef27db87SMehdi Amini }
356ef27db87SMehdi Amini 
357ef27db87SMehdi Amini namespace {
358ef27db87SMehdi Amini 
359ef27db87SMehdi Amini class PlaceholderQueue {
360ef27db87SMehdi Amini   // Placeholders would thrash around when moved, so store in a std::deque
361ef27db87SMehdi Amini   // instead of some sort of vector.
362ef27db87SMehdi Amini   std::deque<DistinctMDOperandPlaceholder> PHs;
363ef27db87SMehdi Amini 
364ef27db87SMehdi Amini public:
36527379892SMehdi Amini   ~PlaceholderQueue() {
36627379892SMehdi Amini     assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed");
36727379892SMehdi Amini   }
36819ef4fadSMehdi Amini   bool empty() { return PHs.empty(); }
369ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
370ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
37119ef4fadSMehdi Amini 
37219ef4fadSMehdi Amini   /// Return the list of temporaries nodes in the queue, these need to be
37319ef4fadSMehdi Amini   /// loaded before we can flush the queue.
37419ef4fadSMehdi Amini   void getTemporaries(BitcodeReaderMetadataList &MetadataList,
37519ef4fadSMehdi Amini                       DenseSet<unsigned> &Temporaries) {
37619ef4fadSMehdi Amini     for (auto &PH : PHs) {
37719ef4fadSMehdi Amini       auto ID = PH.getID();
37819ef4fadSMehdi Amini       auto *MD = MetadataList.lookup(ID);
37919ef4fadSMehdi Amini       if (!MD) {
38019ef4fadSMehdi Amini         Temporaries.insert(ID);
38119ef4fadSMehdi Amini         continue;
38219ef4fadSMehdi Amini       }
38319ef4fadSMehdi Amini       auto *N = dyn_cast_or_null<MDNode>(MD);
38419ef4fadSMehdi Amini       if (N && N->isTemporary())
38519ef4fadSMehdi Amini         Temporaries.insert(ID);
38619ef4fadSMehdi Amini     }
38719ef4fadSMehdi Amini   }
388ef27db87SMehdi Amini };
389ef27db87SMehdi Amini 
390ef27db87SMehdi Amini } // end anonymous namespace
391ef27db87SMehdi Amini 
392ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
393ef27db87SMehdi Amini   PHs.emplace_back(ID);
394ef27db87SMehdi Amini   return PHs.back();
395ef27db87SMehdi Amini }
396ef27db87SMehdi Amini 
397ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
398ef27db87SMehdi Amini   while (!PHs.empty()) {
3994f90ee00SMehdi Amini     auto *MD = MetadataList.lookup(PHs.front().getID());
4004f90ee00SMehdi Amini     assert(MD && "Flushing placeholder on unassigned MD");
4015ae6170fSMehdi Amini #ifndef NDEBUG
4024f90ee00SMehdi Amini     if (auto *MDN = dyn_cast<MDNode>(MD))
4035ae6170fSMehdi Amini       assert(MDN->isResolved() &&
4045ae6170fSMehdi Amini              "Flushing Placeholder while cycles aren't resolved");
4055ae6170fSMehdi Amini #endif
4065ae6170fSMehdi Amini     PHs.front().replaceUseWith(MD);
407ef27db87SMehdi Amini     PHs.pop_front();
408ef27db87SMehdi Amini   }
409ef27db87SMehdi Amini }
410ef27db87SMehdi Amini 
411d68904f9SJames Henderson } // anonymous namespace
412ef27db87SMehdi Amini 
413ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
414ffc498dfSFlorian Hahn   return make_error<StringError>(
415ffc498dfSFlorian Hahn       Message, make_error_code(BitcodeError::CorruptedBitcode));
416ffc498dfSFlorian Hahn }
417ffc498dfSFlorian Hahn 
418ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
419ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
420ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
421ef27db87SMehdi Amini   BitstreamCursor &Stream;
422ef27db87SMehdi Amini   LLVMContext &Context;
423ef27db87SMehdi Amini   Module &TheModule;
424ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
425ef27db87SMehdi Amini 
42619ef4fadSMehdi Amini   /// Cursor associated with the lazy-loading of Metadata. This is the easy way
42719ef4fadSMehdi Amini   /// to keep around the right "context" (Abbrev list) to be able to jump in
42819ef4fadSMehdi Amini   /// the middle of the metadata block and load any record.
42919ef4fadSMehdi Amini   BitstreamCursor IndexCursor;
43019ef4fadSMehdi Amini 
43119ef4fadSMehdi Amini   /// Index that keeps track of MDString values.
43219ef4fadSMehdi Amini   std::vector<StringRef> MDStringRef;
43319ef4fadSMehdi Amini 
43419ef4fadSMehdi Amini   /// On-demand loading of a single MDString. Requires the index above to be
43519ef4fadSMehdi Amini   /// populated.
43619ef4fadSMehdi Amini   MDString *lazyLoadOneMDString(unsigned Idx);
43719ef4fadSMehdi Amini 
43819ef4fadSMehdi Amini   /// Index that keeps track of where to find a metadata record in the stream.
43919ef4fadSMehdi Amini   std::vector<uint64_t> GlobalMetadataBitPosIndex;
44019ef4fadSMehdi Amini 
44119ef4fadSMehdi Amini   /// Populate the index above to enable lazily loading of metadata, and load
44219ef4fadSMehdi Amini   /// the named metadata as well as the transitively referenced global
44319ef4fadSMehdi Amini   /// Metadata.
44442ef1990SMehdi Amini   Expected<bool> lazyLoadModuleMetadataBlock();
44519ef4fadSMehdi Amini 
44619ef4fadSMehdi Amini   /// On-demand loading of a single metadata. Requires the index above to be
44719ef4fadSMehdi Amini   /// populated.
44819ef4fadSMehdi Amini   void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
44919ef4fadSMehdi Amini 
4509f926f70SMehdi Amini   // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4519f926f70SMehdi Amini   // point from SP to CU after a block is completly parsed.
4529f926f70SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4539f926f70SMehdi Amini 
454ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
455ef27db87SMehdi Amini   /// metadata.
456ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
457ef27db87SMehdi Amini 
458ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
459ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
460ef27db87SMehdi Amini 
4618662305bSMehdi Amini   bool StripTBAA = false;
462ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
463e37d3144SAdrian Prantl   bool NeedUpgradeToDIGlobalVariableExpression = false;
4646825fb64SAdrian Prantl   bool NeedDeclareExpressionUpgrade = false;
465ef27db87SMehdi Amini 
466ec68dd49SMehdi Amini   /// True if metadata is being parsed for a module being ThinLTO imported.
467ec68dd49SMehdi Amini   bool IsImporting = false;
468ec68dd49SMehdi Amini 
4699f926f70SMehdi Amini   Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4709f926f70SMehdi Amini                          PlaceholderQueue &Placeholders, StringRef Blob,
471ef27db87SMehdi Amini                          unsigned &NextMetadataNo);
47219ef4fadSMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
473061f4a5fSBenjamin Kramer                              function_ref<void(StringRef)> CallBack);
474ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
475ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
476ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
477ef27db87SMehdi Amini 
47819ef4fadSMehdi Amini   void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
47919ef4fadSMehdi Amini 
48019ef4fadSMehdi Amini   /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
48119ef4fadSMehdi Amini   void upgradeCUSubprograms() {
48219ef4fadSMehdi Amini     for (auto CU_SP : CUSubprograms)
48319ef4fadSMehdi Amini       if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
48419ef4fadSMehdi Amini         for (auto &Op : SPs->operands())
4859d2f019fSAdrian Prantl           if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
4869d2f019fSAdrian Prantl             SP->replaceUnit(CU_SP.first);
48719ef4fadSMehdi Amini     CUSubprograms.clear();
48819ef4fadSMehdi Amini   }
48919ef4fadSMehdi Amini 
490e37d3144SAdrian Prantl   /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
491e37d3144SAdrian Prantl   void upgradeCUVariables() {
492e37d3144SAdrian Prantl     if (!NeedUpgradeToDIGlobalVariableExpression)
493e37d3144SAdrian Prantl       return;
494e37d3144SAdrian Prantl 
495e37d3144SAdrian Prantl     // Upgrade list of variables attached to the CUs.
496e37d3144SAdrian Prantl     if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
497e37d3144SAdrian Prantl       for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
498e37d3144SAdrian Prantl         auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
499e37d3144SAdrian Prantl         if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
500e37d3144SAdrian Prantl           for (unsigned I = 0; I < GVs->getNumOperands(); I++)
501e37d3144SAdrian Prantl             if (auto *GV =
502e37d3144SAdrian Prantl                     dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
50305782218SAdrian Prantl               auto *DGVE = DIGlobalVariableExpression::getDistinct(
50405782218SAdrian Prantl                   Context, GV, DIExpression::get(Context, {}));
505e37d3144SAdrian Prantl               GVs->replaceOperandWith(I, DGVE);
506e37d3144SAdrian Prantl             }
507e37d3144SAdrian Prantl       }
508e37d3144SAdrian Prantl 
509e37d3144SAdrian Prantl     // Upgrade variables attached to globals.
510e37d3144SAdrian Prantl     for (auto &GV : TheModule.globals()) {
51156a08b40SDavide Italiano       SmallVector<MDNode *, 1> MDs;
512e37d3144SAdrian Prantl       GV.getMetadata(LLVMContext::MD_dbg, MDs);
513e37d3144SAdrian Prantl       GV.eraseMetadata(LLVMContext::MD_dbg);
514e37d3144SAdrian Prantl       for (auto *MD : MDs)
5152bb217b5SSimon Pilgrim         if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
51605782218SAdrian Prantl           auto *DGVE = DIGlobalVariableExpression::getDistinct(
51705782218SAdrian Prantl               Context, DGV, DIExpression::get(Context, {}));
518e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
519e37d3144SAdrian Prantl         } else
520e37d3144SAdrian Prantl           GV.addMetadata(LLVMContext::MD_dbg, *MD);
521e37d3144SAdrian Prantl     }
522e37d3144SAdrian Prantl   }
523e37d3144SAdrian Prantl 
5246825fb64SAdrian Prantl   /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5256825fb64SAdrian Prantl   /// describes a function argument.
5266825fb64SAdrian Prantl   void upgradeDeclareExpressions(Function &F) {
5276825fb64SAdrian Prantl     if (!NeedDeclareExpressionUpgrade)
5286825fb64SAdrian Prantl       return;
5296825fb64SAdrian Prantl 
5306825fb64SAdrian Prantl     for (auto &BB : F)
5316825fb64SAdrian Prantl       for (auto &I : BB)
5326825fb64SAdrian Prantl         if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5336825fb64SAdrian Prantl           if (auto *DIExpr = DDI->getExpression())
5346825fb64SAdrian Prantl             if (DIExpr->startsWithDeref() &&
5356825fb64SAdrian Prantl                 dyn_cast_or_null<Argument>(DDI->getAddress())) {
5366825fb64SAdrian Prantl               SmallVector<uint64_t, 8> Ops;
5376825fb64SAdrian Prantl               Ops.append(std::next(DIExpr->elements_begin()),
5386825fb64SAdrian Prantl                          DIExpr->elements_end());
5396825fb64SAdrian Prantl               auto *E = DIExpression::get(Context, Ops);
5406825fb64SAdrian Prantl               DDI->setOperand(2, MetadataAsValue::get(Context, E));
5416825fb64SAdrian Prantl             }
5426825fb64SAdrian Prantl   }
5436825fb64SAdrian Prantl 
544ffc498dfSFlorian Hahn   /// Upgrade the expression from previous versions.
545ffc498dfSFlorian Hahn   Error upgradeDIExpression(uint64_t FromVersion,
546ffc498dfSFlorian Hahn                             MutableArrayRef<uint64_t> &Expr,
547ffc498dfSFlorian Hahn                             SmallVectorImpl<uint64_t> &Buffer) {
548ffc498dfSFlorian Hahn     auto N = Expr.size();
549ffc498dfSFlorian Hahn     switch (FromVersion) {
550ffc498dfSFlorian Hahn     default:
551ffc498dfSFlorian Hahn       return error("Invalid record");
552ffc498dfSFlorian Hahn     case 0:
553ffc498dfSFlorian Hahn       if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
554ffc498dfSFlorian Hahn         Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
555ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
556ffc498dfSFlorian Hahn     case 1:
557ffc498dfSFlorian Hahn       // Move DW_OP_deref to the end.
558ffc498dfSFlorian Hahn       if (N && Expr[0] == dwarf::DW_OP_deref) {
559ffc498dfSFlorian Hahn         auto End = Expr.end();
560ffc498dfSFlorian Hahn         if (Expr.size() >= 3 &&
561ffc498dfSFlorian Hahn             *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
562ffc498dfSFlorian Hahn           End = std::prev(End, 3);
563ffc498dfSFlorian Hahn         std::move(std::next(Expr.begin()), End, Expr.begin());
564ffc498dfSFlorian Hahn         *std::prev(End) = dwarf::DW_OP_deref;
565ffc498dfSFlorian Hahn       }
566ffc498dfSFlorian Hahn       NeedDeclareExpressionUpgrade = true;
567ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
568ffc498dfSFlorian Hahn     case 2: {
569ffc498dfSFlorian Hahn       // Change DW_OP_plus to DW_OP_plus_uconst.
570ffc498dfSFlorian Hahn       // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
571ffc498dfSFlorian Hahn       auto SubExpr = ArrayRef<uint64_t>(Expr);
572ffc498dfSFlorian Hahn       while (!SubExpr.empty()) {
573ffc498dfSFlorian Hahn         // Skip past other operators with their operands
574ffc498dfSFlorian Hahn         // for this version of the IR, obtained from
575ffc498dfSFlorian Hahn         // from historic DIExpression::ExprOperand::getSize().
576ffc498dfSFlorian Hahn         size_t HistoricSize;
577ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
578ffc498dfSFlorian Hahn         default:
579ffc498dfSFlorian Hahn           HistoricSize = 1;
580ffc498dfSFlorian Hahn           break;
581ffc498dfSFlorian Hahn         case dwarf::DW_OP_constu:
582ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
583ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
584ffc498dfSFlorian Hahn           HistoricSize = 2;
585ffc498dfSFlorian Hahn           break;
586ffc498dfSFlorian Hahn         case dwarf::DW_OP_LLVM_fragment:
587ffc498dfSFlorian Hahn           HistoricSize = 3;
588ffc498dfSFlorian Hahn           break;
589ffc498dfSFlorian Hahn         }
590ffc498dfSFlorian Hahn 
591ffc498dfSFlorian Hahn         // If the expression is malformed, make sure we don't
592ffc498dfSFlorian Hahn         // copy more elements than we should.
593ffc498dfSFlorian Hahn         HistoricSize = std::min(SubExpr.size(), HistoricSize);
594ffc498dfSFlorian Hahn         ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1);
595ffc498dfSFlorian Hahn 
596ffc498dfSFlorian Hahn         switch (SubExpr.front()) {
597ffc498dfSFlorian Hahn         case dwarf::DW_OP_plus:
598ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_plus_uconst);
599ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
600ffc498dfSFlorian Hahn           break;
601ffc498dfSFlorian Hahn         case dwarf::DW_OP_minus:
602ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_constu);
603ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
604ffc498dfSFlorian Hahn           Buffer.push_back(dwarf::DW_OP_minus);
605ffc498dfSFlorian Hahn           break;
606ffc498dfSFlorian Hahn         default:
607ffc498dfSFlorian Hahn           Buffer.push_back(*SubExpr.begin());
608ffc498dfSFlorian Hahn           Buffer.append(Args.begin(), Args.end());
609ffc498dfSFlorian Hahn           break;
610ffc498dfSFlorian Hahn         }
611ffc498dfSFlorian Hahn 
612ffc498dfSFlorian Hahn         // Continue with remaining elements.
613ffc498dfSFlorian Hahn         SubExpr = SubExpr.slice(HistoricSize);
614ffc498dfSFlorian Hahn       }
615ffc498dfSFlorian Hahn       Expr = MutableArrayRef<uint64_t>(Buffer);
616ffc498dfSFlorian Hahn       LLVM_FALLTHROUGH;
617ffc498dfSFlorian Hahn     }
618ffc498dfSFlorian Hahn     case 3:
619ffc498dfSFlorian Hahn       // Up-to-date!
620ffc498dfSFlorian Hahn       break;
621ffc498dfSFlorian Hahn     }
622ffc498dfSFlorian Hahn 
623ffc498dfSFlorian Hahn     return Error::success();
624ffc498dfSFlorian Hahn   }
625ffc498dfSFlorian Hahn 
626e37d3144SAdrian Prantl   void upgradeDebugInfo() {
627e37d3144SAdrian Prantl     upgradeCUSubprograms();
628e37d3144SAdrian Prantl     upgradeCUVariables();
629e37d3144SAdrian Prantl   }
630e37d3144SAdrian Prantl 
631ef27db87SMehdi Amini public:
632ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
633ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
634ec68dd49SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID,
635ec68dd49SMehdi Amini                      bool IsImporting)
636864474c9SFlorian Hahn       : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
637864474c9SFlorian Hahn         ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
638864474c9SFlorian Hahn         TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
639864474c9SFlorian Hahn         IsImporting(IsImporting) {}
640ef27db87SMehdi Amini 
641ec68dd49SMehdi Amini   Error parseMetadata(bool ModuleLevel);
642ef27db87SMehdi Amini 
643ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6443bb4d01dSMehdi Amini 
6453bb4d01dSMehdi Amini   Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6463bb4d01dSMehdi Amini     if (ID < MDStringRef.size())
6473bb4d01dSMehdi Amini       return lazyLoadOneMDString(ID);
6483bb4d01dSMehdi Amini     if (auto *MD = MetadataList.lookup(ID))
6493bb4d01dSMehdi Amini       return MD;
6503bb4d01dSMehdi Amini     // If lazy-loading is enabled, we try recursively to load the operand
6513bb4d01dSMehdi Amini     // instead of creating a temporary.
6523bb4d01dSMehdi Amini     if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6533bb4d01dSMehdi Amini       PlaceholderQueue Placeholders;
6543bb4d01dSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
6553bb4d01dSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
6563bb4d01dSMehdi Amini       return MetadataList.lookup(ID);
6573bb4d01dSMehdi Amini     }
6583bb4d01dSMehdi Amini     return MetadataList.getMetadataFwdRef(ID);
659ef27db87SMehdi Amini   }
660ef27db87SMehdi Amini 
661ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
662ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
663ef27db87SMehdi Amini   }
664ef27db87SMehdi Amini 
665ef27db87SMehdi Amini   bool hasSeenOldLoopTags() { return HasSeenOldLoopTags; }
666ef27db87SMehdi Amini 
667ef27db87SMehdi Amini   Error parseMetadataAttachment(
668ef27db87SMehdi Amini       Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
669ef27db87SMehdi Amini 
670ef27db87SMehdi Amini   Error parseMetadataKinds();
671ef27db87SMehdi Amini 
6728662305bSMehdi Amini   void setStripTBAA(bool Value) { StripTBAA = Value; }
6738662305bSMehdi Amini   bool isStrippingTBAA() { return StripTBAA; }
6748662305bSMehdi Amini 
675ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
676ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
6776825fb64SAdrian Prantl   void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
678ef27db87SMehdi Amini };
679ef27db87SMehdi Amini 
68042ef1990SMehdi Amini Expected<bool>
68142ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
68219ef4fadSMehdi Amini   IndexCursor = Stream;
68319ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
68419ef4fadSMehdi Amini   // Get the abbrevs, and preload record positions to make them lazy-loadable.
68519ef4fadSMehdi Amini   while (true) {
6860e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks(
68719ef4fadSMehdi Amini         BitstreamCursor::AF_DontPopBlockAtEnd);
6880e828958SJF Bastien     if (!MaybeEntry)
6890e828958SJF Bastien       return MaybeEntry.takeError();
6900e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
6910e828958SJF Bastien 
69219ef4fadSMehdi Amini     switch (Entry.Kind) {
69319ef4fadSMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
69419ef4fadSMehdi Amini     case BitstreamEntry::Error:
69519ef4fadSMehdi Amini       return error("Malformed block");
69619ef4fadSMehdi Amini     case BitstreamEntry::EndBlock: {
69719ef4fadSMehdi Amini       return true;
69819ef4fadSMehdi Amini     }
69919ef4fadSMehdi Amini     case BitstreamEntry::Record: {
70019ef4fadSMehdi Amini       // The interesting case.
70119ef4fadSMehdi Amini       ++NumMDRecordLoaded;
70219ef4fadSMehdi Amini       uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
7030e828958SJF Bastien       Expected<unsigned> MaybeCode = IndexCursor.skipRecord(Entry.ID);
7040e828958SJF Bastien       if (!MaybeCode)
7050e828958SJF Bastien         return MaybeCode.takeError();
7060e828958SJF Bastien       unsigned Code = MaybeCode.get();
70719ef4fadSMehdi Amini       switch (Code) {
70819ef4fadSMehdi Amini       case bitc::METADATA_STRINGS: {
70919ef4fadSMehdi Amini         // Rewind and parse the strings.
7100e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
711c55cf4afSBill Wendling           return std::move(Err);
71219ef4fadSMehdi Amini         StringRef Blob;
71319ef4fadSMehdi Amini         Record.clear();
7140e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7150e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record, &Blob))
7160e828958SJF Bastien           ;
7170e828958SJF Bastien         else
7180e828958SJF Bastien           return MaybeRecord.takeError();
71919ef4fadSMehdi Amini         unsigned NumStrings = Record[0];
72019ef4fadSMehdi Amini         MDStringRef.reserve(NumStrings);
72119ef4fadSMehdi Amini         auto IndexNextMDString = [&](StringRef Str) {
72219ef4fadSMehdi Amini           MDStringRef.push_back(Str);
72319ef4fadSMehdi Amini         };
72419ef4fadSMehdi Amini         if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
725c55cf4afSBill Wendling           return std::move(Err);
72619ef4fadSMehdi Amini         break;
72719ef4fadSMehdi Amini       }
72819ef4fadSMehdi Amini       case bitc::METADATA_INDEX_OFFSET: {
72919ef4fadSMehdi Amini         // This is the offset to the index, when we see this we skip all the
73019ef4fadSMehdi Amini         // records and load only an index to these.
7310e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
732c55cf4afSBill Wendling           return std::move(Err);
73319ef4fadSMehdi Amini         Record.clear();
7340e828958SJF Bastien         if (Expected<unsigned> MaybeRecord =
7350e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7360e828958SJF Bastien           ;
7370e828958SJF Bastien         else
7380e828958SJF Bastien           return MaybeRecord.takeError();
73919ef4fadSMehdi Amini         if (Record.size() != 2)
74019ef4fadSMehdi Amini           return error("Invalid record");
74119ef4fadSMehdi Amini         auto Offset = Record[0] + (Record[1] << 32);
74219ef4fadSMehdi Amini         auto BeginPos = IndexCursor.GetCurrentBitNo();
7430e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
744c55cf4afSBill Wendling           return std::move(Err);
7450e828958SJF Bastien         Expected<BitstreamEntry> MaybeEntry =
7460e828958SJF Bastien             IndexCursor.advanceSkippingSubblocks(
74719ef4fadSMehdi Amini                 BitstreamCursor::AF_DontPopBlockAtEnd);
7480e828958SJF Bastien         if (!MaybeEntry)
7490e828958SJF Bastien           return MaybeEntry.takeError();
7500e828958SJF Bastien         Entry = MaybeEntry.get();
75119ef4fadSMehdi Amini         assert(Entry.Kind == BitstreamEntry::Record &&
75219ef4fadSMehdi Amini                "Corrupted bitcode: Expected `Record` when trying to find the "
75319ef4fadSMehdi Amini                "Metadata index");
75419ef4fadSMehdi Amini         Record.clear();
7550e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7560e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record))
7570e828958SJF Bastien           assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7580e828958SJF Bastien                  "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7590e828958SJF Bastien                  "find the Metadata index");
7600e828958SJF Bastien         else
7610e828958SJF Bastien           return MaybeCode.takeError();
76219ef4fadSMehdi Amini         // Delta unpack
76319ef4fadSMehdi Amini         auto CurrentValue = BeginPos;
76419ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.reserve(Record.size());
76519ef4fadSMehdi Amini         for (auto &Elt : Record) {
76619ef4fadSMehdi Amini           CurrentValue += Elt;
76719ef4fadSMehdi Amini           GlobalMetadataBitPosIndex.push_back(CurrentValue);
76819ef4fadSMehdi Amini         }
76919ef4fadSMehdi Amini         break;
77019ef4fadSMehdi Amini       }
77119ef4fadSMehdi Amini       case bitc::METADATA_INDEX:
77219ef4fadSMehdi Amini         // We don't expect to get there, the Index is loaded when we encounter
77319ef4fadSMehdi Amini         // the offset.
77419ef4fadSMehdi Amini         return error("Corrupted Metadata block");
77519ef4fadSMehdi Amini       case bitc::METADATA_NAME: {
77619ef4fadSMehdi Amini         // Named metadata need to be materialized now and aren't deferred.
7770e828958SJF Bastien         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
778c55cf4afSBill Wendling           return std::move(Err);
77919ef4fadSMehdi Amini         Record.clear();
7800e828958SJF Bastien 
7810e828958SJF Bastien         unsigned Code;
7820e828958SJF Bastien         if (Expected<unsigned> MaybeCode =
7830e828958SJF Bastien                 IndexCursor.readRecord(Entry.ID, Record)) {
7840e828958SJF Bastien           Code = MaybeCode.get();
78519ef4fadSMehdi Amini           assert(Code == bitc::METADATA_NAME);
7860e828958SJF Bastien         } else
7870e828958SJF Bastien           return MaybeCode.takeError();
78819ef4fadSMehdi Amini 
78919ef4fadSMehdi Amini         // Read name of the named metadata.
79019ef4fadSMehdi Amini         SmallString<8> Name(Record.begin(), Record.end());
7910e828958SJF Bastien         if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
7920e828958SJF Bastien           Code = MaybeCode.get();
7930e828958SJF Bastien         else
7940e828958SJF Bastien           return MaybeCode.takeError();
79519ef4fadSMehdi Amini 
79619ef4fadSMehdi Amini         // Named Metadata comes in two parts, we expect the name to be followed
79719ef4fadSMehdi Amini         // by the node
79819ef4fadSMehdi Amini         Record.clear();
7990e828958SJF Bastien         if (Expected<unsigned> MaybeNextBitCode =
8000e828958SJF Bastien                 IndexCursor.readRecord(Code, Record))
8010e828958SJF Bastien           assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8020e828958SJF Bastien         else
8030e828958SJF Bastien           return MaybeNextBitCode.takeError();
80419ef4fadSMehdi Amini 
80519ef4fadSMehdi Amini         // Read named metadata elements.
80619ef4fadSMehdi Amini         unsigned Size = Record.size();
80719ef4fadSMehdi Amini         NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
80819ef4fadSMehdi Amini         for (unsigned i = 0; i != Size; ++i) {
80919ef4fadSMehdi Amini           // FIXME: We could use a placeholder here, however NamedMDNode are
81019ef4fadSMehdi Amini           // taking MDNode as operand and not using the Metadata infrastructure.
81119ef4fadSMehdi Amini           // It is acknowledged by 'TODO: Inherit from Metadata' in the
81219ef4fadSMehdi Amini           // NamedMDNode class definition.
81319ef4fadSMehdi Amini           MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
814f3d2453dSTeresa Johnson           assert(MD && "Invalid metadata: expect fwd ref to MDNode");
81519ef4fadSMehdi Amini           NMD->addOperand(MD);
81619ef4fadSMehdi Amini         }
81719ef4fadSMehdi Amini         break;
81819ef4fadSMehdi Amini       }
81919ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
820*01b9debaSFangrui Song         // FIXME: we need to do this early because we don't materialize global
821*01b9debaSFangrui Song         // value explicitly.
822*01b9debaSFangrui Song         if (Error Err = IndexCursor.JumpToBit(CurrentPos))
823*01b9debaSFangrui Song           return std::move(Err);
824*01b9debaSFangrui Song         Record.clear();
825*01b9debaSFangrui Song         if (Expected<unsigned> MaybeRecord =
826*01b9debaSFangrui Song                 IndexCursor.readRecord(Entry.ID, Record))
827*01b9debaSFangrui Song           ;
828*01b9debaSFangrui Song         else
829*01b9debaSFangrui Song           return MaybeRecord.takeError();
830*01b9debaSFangrui Song         if (Record.size() % 2 == 0)
831*01b9debaSFangrui Song           return error("Invalid record");
832*01b9debaSFangrui Song         unsigned ValueID = Record[0];
833*01b9debaSFangrui Song         if (ValueID >= ValueList.size())
834*01b9debaSFangrui Song           return error("Invalid record");
835*01b9debaSFangrui Song         if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
836*01b9debaSFangrui Song           if (Error Err = parseGlobalObjectAttachment(
837*01b9debaSFangrui Song                   *GO, ArrayRef<uint64_t>(Record).slice(1)))
838*01b9debaSFangrui Song             return std::move(Err);
83919ef4fadSMehdi Amini         break;
84019ef4fadSMehdi Amini       }
84119ef4fadSMehdi Amini       case bitc::METADATA_KIND:
84219ef4fadSMehdi Amini       case bitc::METADATA_STRING_OLD:
84319ef4fadSMehdi Amini       case bitc::METADATA_OLD_FN_NODE:
84419ef4fadSMehdi Amini       case bitc::METADATA_OLD_NODE:
84519ef4fadSMehdi Amini       case bitc::METADATA_VALUE:
84619ef4fadSMehdi Amini       case bitc::METADATA_DISTINCT_NODE:
84719ef4fadSMehdi Amini       case bitc::METADATA_NODE:
84819ef4fadSMehdi Amini       case bitc::METADATA_LOCATION:
84919ef4fadSMehdi Amini       case bitc::METADATA_GENERIC_DEBUG:
85019ef4fadSMehdi Amini       case bitc::METADATA_SUBRANGE:
85119ef4fadSMehdi Amini       case bitc::METADATA_ENUMERATOR:
85219ef4fadSMehdi Amini       case bitc::METADATA_BASIC_TYPE:
853f91d18eaSSourabh Singh Tomar       case bitc::METADATA_STRING_TYPE:
85419ef4fadSMehdi Amini       case bitc::METADATA_DERIVED_TYPE:
85519ef4fadSMehdi Amini       case bitc::METADATA_COMPOSITE_TYPE:
85619ef4fadSMehdi Amini       case bitc::METADATA_SUBROUTINE_TYPE:
85719ef4fadSMehdi Amini       case bitc::METADATA_MODULE:
85819ef4fadSMehdi Amini       case bitc::METADATA_FILE:
85919ef4fadSMehdi Amini       case bitc::METADATA_COMPILE_UNIT:
86019ef4fadSMehdi Amini       case bitc::METADATA_SUBPROGRAM:
86119ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK:
86219ef4fadSMehdi Amini       case bitc::METADATA_LEXICAL_BLOCK_FILE:
86319ef4fadSMehdi Amini       case bitc::METADATA_NAMESPACE:
8646ed5706aSAdrian Prantl       case bitc::METADATA_COMMON_BLOCK:
86519ef4fadSMehdi Amini       case bitc::METADATA_MACRO:
86619ef4fadSMehdi Amini       case bitc::METADATA_MACRO_FILE:
86719ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_TYPE:
86819ef4fadSMehdi Amini       case bitc::METADATA_TEMPLATE_VALUE:
86919ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR:
87019ef4fadSMehdi Amini       case bitc::METADATA_LOCAL_VAR:
8712c864551SShiva Chen       case bitc::METADATA_LABEL:
87219ef4fadSMehdi Amini       case bitc::METADATA_EXPRESSION:
87319ef4fadSMehdi Amini       case bitc::METADATA_OBJC_PROPERTY:
87419ef4fadSMehdi Amini       case bitc::METADATA_IMPORTED_ENTITY:
87519ef4fadSMehdi Amini       case bitc::METADATA_GLOBAL_VAR_EXPR:
87619ef4fadSMehdi Amini         // We don't expect to see any of these, if we see one, give up on
87719ef4fadSMehdi Amini         // lazy-loading and fallback.
87819ef4fadSMehdi Amini         MDStringRef.clear();
87919ef4fadSMehdi Amini         GlobalMetadataBitPosIndex.clear();
88019ef4fadSMehdi Amini         return false;
88119ef4fadSMehdi Amini       }
88219ef4fadSMehdi Amini       break;
88319ef4fadSMehdi Amini     }
88419ef4fadSMehdi Amini     }
88519ef4fadSMehdi Amini   }
88619ef4fadSMehdi Amini }
88719ef4fadSMehdi Amini 
888ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
889ef27db87SMehdi Amini /// module level metadata.
890ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
891ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
892ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
893ef27db87SMehdi Amini 
89419ef4fadSMehdi Amini   // Record the entry position so that we can jump back here and efficiently
89519ef4fadSMehdi Amini   // skip the whole block in case we lazy-load.
89619ef4fadSMehdi Amini   auto EntryPos = Stream.GetCurrentBitNo();
89719ef4fadSMehdi Amini 
8980e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
8990e828958SJF Bastien     return Err;
900ef27db87SMehdi Amini 
901ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
902ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
9039f926f70SMehdi Amini 
90419ef4fadSMehdi Amini   // We lazy-load module-level metadata: we build an index for each record, and
90519ef4fadSMehdi Amini   // then load individual record as needed, starting with the named metadata.
90619ef4fadSMehdi Amini   if (ModuleLevel && IsImporting && MetadataList.empty() &&
90719ef4fadSMehdi Amini       !DisableLazyLoading) {
90842ef1990SMehdi Amini     auto SuccessOrErr = lazyLoadModuleMetadataBlock();
90919ef4fadSMehdi Amini     if (!SuccessOrErr)
91019ef4fadSMehdi Amini       return SuccessOrErr.takeError();
91119ef4fadSMehdi Amini     if (SuccessOrErr.get()) {
91219ef4fadSMehdi Amini       // An index was successfully created and we will be able to load metadata
91319ef4fadSMehdi Amini       // on-demand.
91419ef4fadSMehdi Amini       MetadataList.resize(MDStringRef.size() +
91519ef4fadSMehdi Amini                           GlobalMetadataBitPosIndex.size());
91619ef4fadSMehdi Amini 
91719ef4fadSMehdi Amini       // Reading the named metadata created forward references and/or
91819ef4fadSMehdi Amini       // placeholders, that we flush here.
91919ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
920e37d3144SAdrian Prantl       upgradeDebugInfo();
92119ef4fadSMehdi Amini       // Return at the beginning of the block, since it is easy to skip it
92219ef4fadSMehdi Amini       // entirely from there.
92319ef4fadSMehdi Amini       Stream.ReadBlockEnd(); // Pop the abbrev block context.
9240e828958SJF Bastien       if (Error Err = IndexCursor.JumpToBit(EntryPos))
9250e828958SJF Bastien         return Err;
9260e828958SJF Bastien       if (Error Err = Stream.SkipBlock()) {
9270e828958SJF Bastien         // FIXME this drops the error on the floor, which
9280e828958SJF Bastien         // ThinLTO/X86/debuginfo-cu-import.ll relies on.
9290e828958SJF Bastien         consumeError(std::move(Err));
9300e828958SJF Bastien         return Error::success();
9310e828958SJF Bastien       }
93219ef4fadSMehdi Amini       return Error::success();
93319ef4fadSMehdi Amini     }
93419ef4fadSMehdi Amini     // Couldn't load an index, fallback to loading all the block "old-style".
93519ef4fadSMehdi Amini   }
93619ef4fadSMehdi Amini 
93719ef4fadSMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
93819ef4fadSMehdi Amini 
9399f926f70SMehdi Amini   // Read all the records.
9409f926f70SMehdi Amini   while (true) {
9410e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
9420e828958SJF Bastien     if (!MaybeEntry)
9430e828958SJF Bastien       return MaybeEntry.takeError();
9440e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
9459f926f70SMehdi Amini 
9469f926f70SMehdi Amini     switch (Entry.Kind) {
9479f926f70SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
9489f926f70SMehdi Amini     case BitstreamEntry::Error:
9499f926f70SMehdi Amini       return error("Malformed block");
9509f926f70SMehdi Amini     case BitstreamEntry::EndBlock:
95119ef4fadSMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
952e37d3144SAdrian Prantl       upgradeDebugInfo();
9539f926f70SMehdi Amini       return Error::success();
9549f926f70SMehdi Amini     case BitstreamEntry::Record:
9559f926f70SMehdi Amini       // The interesting case.
9569f926f70SMehdi Amini       break;
9579f926f70SMehdi Amini     }
9589f926f70SMehdi Amini 
9599f926f70SMehdi Amini     // Read a record.
9609f926f70SMehdi Amini     Record.clear();
9619f926f70SMehdi Amini     StringRef Blob;
96219ef4fadSMehdi Amini     ++NumMDRecordLoaded;
9630e828958SJF Bastien     if (Expected<unsigned> MaybeCode =
9640e828958SJF Bastien             Stream.readRecord(Entry.ID, Record, &Blob)) {
9650e828958SJF Bastien       if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
9660e828958SJF Bastien                                        Blob, NextMetadataNo))
9679f926f70SMehdi Amini         return Err;
9680e828958SJF Bastien     } else
9690e828958SJF Bastien       return MaybeCode.takeError();
9709f926f70SMehdi Amini   }
9719f926f70SMehdi Amini }
9729f926f70SMehdi Amini 
97319ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
97419ef4fadSMehdi Amini   ++NumMDStringLoaded;
97519ef4fadSMehdi Amini   if (Metadata *MD = MetadataList.lookup(ID))
97619ef4fadSMehdi Amini     return cast<MDString>(MD);
97719ef4fadSMehdi Amini   auto MDS = MDString::get(Context, MDStringRef[ID]);
97819ef4fadSMehdi Amini   MetadataList.assignValue(MDS, ID);
97919ef4fadSMehdi Amini   return MDS;
98019ef4fadSMehdi Amini }
98119ef4fadSMehdi Amini 
98219ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
98319ef4fadSMehdi Amini     unsigned ID, PlaceholderQueue &Placeholders) {
98419ef4fadSMehdi Amini   assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
98519ef4fadSMehdi Amini   assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
98619ef4fadSMehdi Amini   // Lookup first if the metadata hasn't already been loaded.
98719ef4fadSMehdi Amini   if (auto *MD = MetadataList.lookup(ID)) {
98887399997SSimon Pilgrim     auto *N = cast<MDNode>(MD);
98967d2cc1fSMehdi Amini     if (!N->isTemporary())
99067d2cc1fSMehdi Amini       return;
99119ef4fadSMehdi Amini   }
99219ef4fadSMehdi Amini   SmallVector<uint64_t, 64> Record;
99319ef4fadSMehdi Amini   StringRef Blob;
9940e828958SJF Bastien   if (Error Err = IndexCursor.JumpToBit(
9950e828958SJF Bastien           GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
9960e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed jumping: " +
9970e828958SJF Bastien                        toString(std::move(Err)));
9980e828958SJF Bastien   Expected<BitstreamEntry> MaybeEntry = IndexCursor.advanceSkippingSubblocks();
9990e828958SJF Bastien   if (!MaybeEntry)
10000e828958SJF Bastien     // FIXME this drops the error on the floor.
10010e828958SJF Bastien     report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
10020e828958SJF Bastien                        toString(MaybeEntry.takeError()));
10030e828958SJF Bastien   BitstreamEntry Entry = MaybeEntry.get();
100419ef4fadSMehdi Amini   ++NumMDRecordLoaded;
10050e828958SJF Bastien   if (Expected<unsigned> MaybeCode =
10060e828958SJF Bastien           IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10070e828958SJF Bastien     if (Error Err =
10080e828958SJF Bastien             parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10090e828958SJF Bastien       report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
10100e828958SJF Bastien                          toString(std::move(Err)));
10110e828958SJF Bastien   } else
10120e828958SJF Bastien     report_fatal_error("Can't lazyload MD: " + toString(MaybeCode.takeError()));
101319ef4fadSMehdi Amini }
101419ef4fadSMehdi Amini 
101519ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
101619ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
101719ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
101819ef4fadSMehdi Amini     PlaceholderQueue &Placeholders) {
101919ef4fadSMehdi Amini   DenseSet<unsigned> Temporaries;
102019ef4fadSMehdi Amini   while (1) {
102119ef4fadSMehdi Amini     // Populate Temporaries with the placeholders that haven't been loaded yet.
102219ef4fadSMehdi Amini     Placeholders.getTemporaries(MetadataList, Temporaries);
102319ef4fadSMehdi Amini 
102419ef4fadSMehdi Amini     // If we don't have any temporary, or FwdReference, we're done!
102519ef4fadSMehdi Amini     if (Temporaries.empty() && !MetadataList.hasFwdRefs())
102619ef4fadSMehdi Amini       break;
102719ef4fadSMehdi Amini 
102819ef4fadSMehdi Amini     // First, load all the temporaries. This can add new placeholders or
102919ef4fadSMehdi Amini     // forward references.
103019ef4fadSMehdi Amini     for (auto ID : Temporaries)
103119ef4fadSMehdi Amini       lazyLoadOneMetadata(ID, Placeholders);
103219ef4fadSMehdi Amini     Temporaries.clear();
103319ef4fadSMehdi Amini 
103419ef4fadSMehdi Amini     // Second, load the forward-references. This can also add new placeholders
103519ef4fadSMehdi Amini     // or forward references.
103619ef4fadSMehdi Amini     while (MetadataList.hasFwdRefs())
103719ef4fadSMehdi Amini       lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
103819ef4fadSMehdi Amini   }
103919ef4fadSMehdi Amini   // At this point we don't have any forward reference remaining, or temporary
104019ef4fadSMehdi Amini   // that haven't been loaded. We can safely drop RAUW support and mark cycles
104119ef4fadSMehdi Amini   // as resolved.
104219ef4fadSMehdi Amini   MetadataList.tryToResolveCycles();
104319ef4fadSMehdi Amini 
104419ef4fadSMehdi Amini   // Finally, everything is in place, we can replace the placeholders operands
104519ef4fadSMehdi Amini   // with the final node they refer to.
104619ef4fadSMehdi Amini   Placeholders.flush(MetadataList);
104719ef4fadSMehdi Amini }
104819ef4fadSMehdi Amini 
10499f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
10509f926f70SMehdi Amini     SmallVectorImpl<uint64_t> &Record, unsigned Code,
105119ef4fadSMehdi Amini     PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
10529f926f70SMehdi Amini 
10539f926f70SMehdi Amini   bool IsDistinct = false;
1054ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
105519ef4fadSMehdi Amini     if (ID < MDStringRef.size())
105619ef4fadSMehdi Amini       return lazyLoadOneMDString(ID);
105767d2cc1fSMehdi Amini     if (!IsDistinct) {
105867d2cc1fSMehdi Amini       if (auto *MD = MetadataList.lookup(ID))
105967d2cc1fSMehdi Amini         return MD;
106067d2cc1fSMehdi Amini       // If lazy-loading is enabled, we try recursively to load the operand
106167d2cc1fSMehdi Amini       // instead of creating a temporary.
106267d2cc1fSMehdi Amini       if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
106367d2cc1fSMehdi Amini         // Create a temporary for the node that is referencing the operand we
106467d2cc1fSMehdi Amini         // will lazy-load. It is needed before recursing in case there are
106567d2cc1fSMehdi Amini         // uniquing cycles.
106667d2cc1fSMehdi Amini         MetadataList.getMetadataFwdRef(NextMetadataNo);
106767d2cc1fSMehdi Amini         lazyLoadOneMetadata(ID, Placeholders);
106867d2cc1fSMehdi Amini         return MetadataList.lookup(ID);
106967d2cc1fSMehdi Amini       }
107067d2cc1fSMehdi Amini       // Return a temporary.
1071ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
107267d2cc1fSMehdi Amini     }
1073ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1074ef27db87SMehdi Amini       return MD;
1075ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
1076ef27db87SMehdi Amini   };
1077ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1078ef27db87SMehdi Amini     if (ID)
1079ef27db87SMehdi Amini       return getMD(ID - 1);
1080ef27db87SMehdi Amini     return nullptr;
1081ef27db87SMehdi Amini   };
1082ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1083ef27db87SMehdi Amini     if (ID)
1084ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
1085ef27db87SMehdi Amini     return nullptr;
1086ef27db87SMehdi Amini   };
1087ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
1088ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
1089ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
109019ef4fadSMehdi Amini     auto MDS = getMDOrNull(ID);
109119ef4fadSMehdi Amini     return cast_or_null<MDString>(MDS);
1092ef27db87SMehdi Amini   };
1093ef27db87SMehdi Amini 
1094ef27db87SMehdi Amini   // Support for old type refs.
1095ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
1096ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1097ef27db87SMehdi Amini   };
1098ef27db87SMehdi Amini 
1099ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
1100ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1101ef27db87SMehdi Amini 
1102ef27db87SMehdi Amini   switch (Code) {
1103ef27db87SMehdi Amini   default: // Default behavior: ignore.
1104ef27db87SMehdi Amini     break;
1105ef27db87SMehdi Amini   case bitc::METADATA_NAME: {
1106ef27db87SMehdi Amini     // Read name of the named metadata.
1107ef27db87SMehdi Amini     SmallString<8> Name(Record.begin(), Record.end());
1108ef27db87SMehdi Amini     Record.clear();
11090e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.ReadCode();
11100e828958SJF Bastien     if (!MaybeCode)
11110e828958SJF Bastien       return MaybeCode.takeError();
11120e828958SJF Bastien     Code = MaybeCode.get();
1113ef27db87SMehdi Amini 
111419ef4fadSMehdi Amini     ++NumMDRecordLoaded;
11150e828958SJF Bastien     if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
11160e828958SJF Bastien       if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1117ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
11180e828958SJF Bastien     } else
11190e828958SJF Bastien       return MaybeNextBitCode.takeError();
1120ef27db87SMehdi Amini 
1121ef27db87SMehdi Amini     // Read named metadata elements.
1122ef27db87SMehdi Amini     unsigned Size = Record.size();
1123ef27db87SMehdi Amini     NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1124ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; ++i) {
1125ef27db87SMehdi Amini       MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1126ef27db87SMehdi Amini       if (!MD)
1127f3d2453dSTeresa Johnson         return error("Invalid named metadata: expect fwd ref to MDNode");
1128ef27db87SMehdi Amini       NMD->addOperand(MD);
1129ef27db87SMehdi Amini     }
1130ef27db87SMehdi Amini     break;
1131ef27db87SMehdi Amini   }
1132ef27db87SMehdi Amini   case bitc::METADATA_OLD_FN_NODE: {
11334abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1134ef27db87SMehdi Amini     // This is a LocalAsMetadata record, the only type of function-local
1135ef27db87SMehdi Amini     // metadata.
1136ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1137ef27db87SMehdi Amini       return error("Invalid record");
1138ef27db87SMehdi Amini 
1139ef27db87SMehdi Amini     // If this isn't a LocalAsMetadata record, we're dropping it.  This used
1140ef27db87SMehdi Amini     // to be legal, but there's no upgrade path.
1141ef27db87SMehdi Amini     auto dropRecord = [&] {
1142c05c9db3SIvan Krasin       MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1143c05c9db3SIvan Krasin       NextMetadataNo++;
1144ef27db87SMehdi Amini     };
1145ef27db87SMehdi Amini     if (Record.size() != 2) {
1146ef27db87SMehdi Amini       dropRecord();
1147ef27db87SMehdi Amini       break;
1148ef27db87SMehdi Amini     }
1149ef27db87SMehdi Amini 
1150ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1151ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1152ef27db87SMehdi Amini       dropRecord();
1153ef27db87SMehdi Amini       break;
1154ef27db87SMehdi Amini     }
1155ef27db87SMehdi Amini 
1156ef27db87SMehdi Amini     MetadataList.assignValue(
1157ef27db87SMehdi Amini         LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1158c05c9db3SIvan Krasin         NextMetadataNo);
1159c05c9db3SIvan Krasin     NextMetadataNo++;
1160ef27db87SMehdi Amini     break;
1161ef27db87SMehdi Amini   }
1162ef27db87SMehdi Amini   case bitc::METADATA_OLD_NODE: {
11634abf0243SMehdi Amini     // Deprecated, but still needed to read old bitcode files.
1164ef27db87SMehdi Amini     if (Record.size() % 2 == 1)
1165ef27db87SMehdi Amini       return error("Invalid record");
1166ef27db87SMehdi Amini 
1167ef27db87SMehdi Amini     unsigned Size = Record.size();
1168ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1169ef27db87SMehdi Amini     for (unsigned i = 0; i != Size; i += 2) {
1170ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[i]);
1171ef27db87SMehdi Amini       if (!Ty)
1172ef27db87SMehdi Amini         return error("Invalid record");
1173ef27db87SMehdi Amini       if (Ty->isMetadataTy())
1174ef27db87SMehdi Amini         Elts.push_back(getMD(Record[i + 1]));
1175ef27db87SMehdi Amini       else if (!Ty->isVoidTy()) {
1176ef27db87SMehdi Amini         auto *MD =
1177ef27db87SMehdi Amini             ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1178ef27db87SMehdi Amini         assert(isa<ConstantAsMetadata>(MD) &&
1179ef27db87SMehdi Amini                "Expected non-function-local metadata");
1180ef27db87SMehdi Amini         Elts.push_back(MD);
1181ef27db87SMehdi Amini       } else
1182ef27db87SMehdi Amini         Elts.push_back(nullptr);
1183ef27db87SMehdi Amini     }
1184c05c9db3SIvan Krasin     MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1185c05c9db3SIvan Krasin     NextMetadataNo++;
1186ef27db87SMehdi Amini     break;
1187ef27db87SMehdi Amini   }
1188ef27db87SMehdi Amini   case bitc::METADATA_VALUE: {
1189ef27db87SMehdi Amini     if (Record.size() != 2)
1190ef27db87SMehdi Amini       return error("Invalid record");
1191ef27db87SMehdi Amini 
1192ef27db87SMehdi Amini     Type *Ty = getTypeByID(Record[0]);
1193ef27db87SMehdi Amini     if (Ty->isMetadataTy() || Ty->isVoidTy())
1194ef27db87SMehdi Amini       return error("Invalid record");
1195ef27db87SMehdi Amini 
1196ef27db87SMehdi Amini     MetadataList.assignValue(
1197ef27db87SMehdi Amini         ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
1198c05c9db3SIvan Krasin         NextMetadataNo);
1199c05c9db3SIvan Krasin     NextMetadataNo++;
1200ef27db87SMehdi Amini     break;
1201ef27db87SMehdi Amini   }
1202ef27db87SMehdi Amini   case bitc::METADATA_DISTINCT_NODE:
1203ef27db87SMehdi Amini     IsDistinct = true;
1204ef27db87SMehdi Amini     LLVM_FALLTHROUGH;
1205ef27db87SMehdi Amini   case bitc::METADATA_NODE: {
1206ef27db87SMehdi Amini     SmallVector<Metadata *, 8> Elts;
1207ef27db87SMehdi Amini     Elts.reserve(Record.size());
1208ef27db87SMehdi Amini     for (unsigned ID : Record)
1209ef27db87SMehdi Amini       Elts.push_back(getMDOrNull(ID));
1210ef27db87SMehdi Amini     MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1211ef27db87SMehdi Amini                                         : MDNode::get(Context, Elts),
1212c05c9db3SIvan Krasin                              NextMetadataNo);
1213c05c9db3SIvan Krasin     NextMetadataNo++;
1214ef27db87SMehdi Amini     break;
1215ef27db87SMehdi Amini   }
1216ef27db87SMehdi Amini   case bitc::METADATA_LOCATION: {
1217386ad01cSVedant Kumar     if (Record.size() != 5 && Record.size() != 6)
1218ef27db87SMehdi Amini       return error("Invalid record");
1219ef27db87SMehdi Amini 
1220ef27db87SMehdi Amini     IsDistinct = Record[0];
1221ef27db87SMehdi Amini     unsigned Line = Record[1];
1222ef27db87SMehdi Amini     unsigned Column = Record[2];
1223ef27db87SMehdi Amini     Metadata *Scope = getMD(Record[3]);
1224ef27db87SMehdi Amini     Metadata *InlinedAt = getMDOrNull(Record[4]);
1225386ad01cSVedant Kumar     bool ImplicitCode = Record.size() == 6 && Record[5];
1226ef27db87SMehdi Amini     MetadataList.assignValue(
1227eb7f6020SCalixte Denizet         GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1228eb7f6020SCalixte Denizet                                      ImplicitCode)),
1229c05c9db3SIvan Krasin         NextMetadataNo);
1230c05c9db3SIvan Krasin     NextMetadataNo++;
1231ef27db87SMehdi Amini     break;
1232ef27db87SMehdi Amini   }
1233ef27db87SMehdi Amini   case bitc::METADATA_GENERIC_DEBUG: {
1234ef27db87SMehdi Amini     if (Record.size() < 4)
1235ef27db87SMehdi Amini       return error("Invalid record");
1236ef27db87SMehdi Amini 
1237ef27db87SMehdi Amini     IsDistinct = Record[0];
1238ef27db87SMehdi Amini     unsigned Tag = Record[1];
1239ef27db87SMehdi Amini     unsigned Version = Record[2];
1240ef27db87SMehdi Amini 
1241ef27db87SMehdi Amini     if (Tag >= 1u << 16 || Version != 0)
1242ef27db87SMehdi Amini       return error("Invalid record");
1243ef27db87SMehdi Amini 
1244ef27db87SMehdi Amini     auto *Header = getMDString(Record[3]);
1245ef27db87SMehdi Amini     SmallVector<Metadata *, 8> DwarfOps;
1246ef27db87SMehdi Amini     for (unsigned I = 4, E = Record.size(); I != E; ++I)
1247ef27db87SMehdi Amini       DwarfOps.push_back(getMDOrNull(Record[I]));
1248ef27db87SMehdi Amini     MetadataList.assignValue(
1249ef27db87SMehdi Amini         GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1250c05c9db3SIvan Krasin         NextMetadataNo);
1251c05c9db3SIvan Krasin     NextMetadataNo++;
1252ef27db87SMehdi Amini     break;
1253ef27db87SMehdi Amini   }
1254ef27db87SMehdi Amini   case bitc::METADATA_SUBRANGE: {
1255fdf40917SSander de Smalen     Metadata *Val = nullptr;
1256fdf40917SSander de Smalen     // Operand 'count' is interpreted as:
1257fdf40917SSander de Smalen     // - Signed integer (version 0)
1258fdf40917SSander de Smalen     // - Metadata node  (version 1)
1259d20bf5a7SAlok Kumar Sharma     // Operand 'lowerBound' is interpreted as:
1260d20bf5a7SAlok Kumar Sharma     // - Signed integer (version 0 and 1)
1261d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1262d20bf5a7SAlok Kumar Sharma     // Operands 'upperBound' and 'stride' are interpreted as:
1263d20bf5a7SAlok Kumar Sharma     // - Metadata node  (version 2)
1264fdf40917SSander de Smalen     switch (Record[0] >> 1) {
1265fdf40917SSander de Smalen     case 0:
1266fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange,
1267d20bf5a7SAlok Kumar Sharma                             (Context, Record[1], unrotateSign(Record[2])));
1268fdf40917SSander de Smalen       break;
1269fdf40917SSander de Smalen     case 1:
1270fdf40917SSander de Smalen       Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1271d20bf5a7SAlok Kumar Sharma                                          unrotateSign(Record[2])));
1272d20bf5a7SAlok Kumar Sharma       break;
1273d20bf5a7SAlok Kumar Sharma     case 2:
1274d20bf5a7SAlok Kumar Sharma       Val = GET_OR_DISTINCT(
1275d20bf5a7SAlok Kumar Sharma           DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1276d20bf5a7SAlok Kumar Sharma                        getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1277fdf40917SSander de Smalen       break;
1278fdf40917SSander de Smalen     default:
1279fdf40917SSander de Smalen       return error("Invalid record: Unsupported version of DISubrange");
1280fdf40917SSander de Smalen     }
1281ef27db87SMehdi Amini 
1282fdf40917SSander de Smalen     MetadataList.assignValue(Val, NextMetadataNo);
1283fdf40917SSander de Smalen     IsDistinct = Record[0] & 1;
1284c05c9db3SIvan Krasin     NextMetadataNo++;
1285ef27db87SMehdi Amini     break;
1286ef27db87SMehdi Amini   }
1287ef27db87SMehdi Amini   case bitc::METADATA_ENUMERATOR: {
1288aad3d578SLemonBoy     if (Record.size() < 3)
1289ef27db87SMehdi Amini       return error("Invalid record");
1290ef27db87SMehdi Amini 
129108dc66efSMomchil Velikov     IsDistinct = Record[0] & 1;
129208dc66efSMomchil Velikov     bool IsUnsigned = Record[0] & 2;
1293aad3d578SLemonBoy     bool IsBigInt = Record[0] & 4;
1294aad3d578SLemonBoy     APInt Value;
1295aad3d578SLemonBoy 
1296aad3d578SLemonBoy     if (IsBigInt) {
1297aad3d578SLemonBoy       const uint64_t BitWidth = Record[1];
1298aad3d578SLemonBoy       const size_t NumWords = Record.size() - 3;
1299aad3d578SLemonBoy       Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1300aad3d578SLemonBoy     } else
1301aad3d578SLemonBoy       Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1302aad3d578SLemonBoy 
1303ef27db87SMehdi Amini     MetadataList.assignValue(
1304aad3d578SLemonBoy         GET_OR_DISTINCT(DIEnumerator,
1305aad3d578SLemonBoy                         (Context, Value, IsUnsigned, getMDString(Record[2]))),
1306c05c9db3SIvan Krasin         NextMetadataNo);
1307c05c9db3SIvan Krasin     NextMetadataNo++;
1308ef27db87SMehdi Amini     break;
1309ef27db87SMehdi Amini   }
1310ef27db87SMehdi Amini   case bitc::METADATA_BASIC_TYPE: {
131155f42629SAdrian Prantl     if (Record.size() < 6 || Record.size() > 7)
1312ef27db87SMehdi Amini       return error("Invalid record");
1313ef27db87SMehdi Amini 
1314ef27db87SMehdi Amini     IsDistinct = Record[0];
131555f42629SAdrian Prantl     DINode::DIFlags Flags = (Record.size() > 6) ?
131655f42629SAdrian Prantl                     static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero;
131755f42629SAdrian Prantl 
1318ef27db87SMehdi Amini     MetadataList.assignValue(
1319ef27db87SMehdi Amini         GET_OR_DISTINCT(DIBasicType,
13209f926f70SMehdi Amini                         (Context, Record[1], getMDString(Record[2]), Record[3],
132155f42629SAdrian Prantl                          Record[4], Record[5], Flags)),
1322c05c9db3SIvan Krasin         NextMetadataNo);
1323c05c9db3SIvan Krasin     NextMetadataNo++;
1324ef27db87SMehdi Amini     break;
1325ef27db87SMehdi Amini   }
1326f91d18eaSSourabh Singh Tomar   case bitc::METADATA_STRING_TYPE: {
1327f91d18eaSSourabh Singh Tomar     if (Record.size() != 8)
1328f91d18eaSSourabh Singh Tomar       return error("Invalid record");
1329f91d18eaSSourabh Singh Tomar 
1330f91d18eaSSourabh Singh Tomar     IsDistinct = Record[0];
1331f91d18eaSSourabh Singh Tomar     MetadataList.assignValue(
1332f91d18eaSSourabh Singh Tomar         GET_OR_DISTINCT(DIStringType,
1333f91d18eaSSourabh Singh Tomar                         (Context, Record[1], getMDString(Record[2]),
1334f91d18eaSSourabh Singh Tomar                          getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1335f91d18eaSSourabh Singh Tomar                          Record[5], Record[6], Record[7])),
1336f91d18eaSSourabh Singh Tomar         NextMetadataNo);
1337f91d18eaSSourabh Singh Tomar     NextMetadataNo++;
1338f91d18eaSSourabh Singh Tomar     break;
1339f91d18eaSSourabh Singh Tomar   }
1340ef27db87SMehdi Amini   case bitc::METADATA_DERIVED_TYPE: {
1341d5561e0aSKonstantin Zhuravlyov     if (Record.size() < 12 || Record.size() > 13)
1342ef27db87SMehdi Amini       return error("Invalid record");
1343ef27db87SMehdi Amini 
1344d5561e0aSKonstantin Zhuravlyov     // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1345d5561e0aSKonstantin Zhuravlyov     // that there is no DWARF address space associated with DIDerivedType.
1346d5561e0aSKonstantin Zhuravlyov     Optional<unsigned> DWARFAddressSpace;
1347d5561e0aSKonstantin Zhuravlyov     if (Record.size() > 12 && Record[12])
1348d5561e0aSKonstantin Zhuravlyov       DWARFAddressSpace = Record[12] - 1;
1349d5561e0aSKonstantin Zhuravlyov 
1350ef27db87SMehdi Amini     IsDistinct = Record[0];
1351ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1352ef27db87SMehdi Amini     MetadataList.assignValue(
1353ef27db87SMehdi Amini         GET_OR_DISTINCT(DIDerivedType,
1354ef27db87SMehdi Amini                         (Context, Record[1], getMDString(Record[2]),
1355ef27db87SMehdi Amini                          getMDOrNull(Record[3]), Record[4],
1356ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5]),
1357ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1358d5561e0aSKonstantin Zhuravlyov                          Record[9], DWARFAddressSpace, Flags,
1359d5561e0aSKonstantin Zhuravlyov                          getDITypeRefOrNull(Record[11]))),
1360c05c9db3SIvan Krasin         NextMetadataNo);
1361c05c9db3SIvan Krasin     NextMetadataNo++;
1362ef27db87SMehdi Amini     break;
1363ef27db87SMehdi Amini   }
1364ef27db87SMehdi Amini   case bitc::METADATA_COMPOSITE_TYPE: {
13652d10258aSAlok Kumar Sharma     if (Record.size() < 16 || Record.size() > 20)
1366ef27db87SMehdi Amini       return error("Invalid record");
1367ef27db87SMehdi Amini 
1368ef27db87SMehdi Amini     // If we have a UUID and this is not a forward declaration, lookup the
1369ef27db87SMehdi Amini     // mapping.
1370ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1371ef27db87SMehdi Amini     bool IsNotUsedInTypeRef = Record[0] >= 2;
1372ef27db87SMehdi Amini     unsigned Tag = Record[1];
1373ef27db87SMehdi Amini     MDString *Name = getMDString(Record[2]);
1374ef27db87SMehdi Amini     Metadata *File = getMDOrNull(Record[3]);
1375ef27db87SMehdi Amini     unsigned Line = Record[4];
1376ef27db87SMehdi Amini     Metadata *Scope = getDITypeRefOrNull(Record[5]);
1377a61f5e37STeresa Johnson     Metadata *BaseType = nullptr;
1378ef27db87SMehdi Amini     uint64_t SizeInBits = Record[7];
1379ef27db87SMehdi Amini     if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1380ef27db87SMehdi Amini       return error("Alignment value is too large");
1381ef27db87SMehdi Amini     uint32_t AlignInBits = Record[8];
1382a61f5e37STeresa Johnson     uint64_t OffsetInBits = 0;
1383ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1384a61f5e37STeresa Johnson     Metadata *Elements = nullptr;
1385ef27db87SMehdi Amini     unsigned RuntimeLang = Record[12];
1386a61f5e37STeresa Johnson     Metadata *VTableHolder = nullptr;
1387a61f5e37STeresa Johnson     Metadata *TemplateParams = nullptr;
13888c59921cSAdrian Prantl     Metadata *Discriminator = nullptr;
13894042ada1SAlok Kumar Sharma     Metadata *DataLocation = nullptr;
13902d10258aSAlok Kumar Sharma     Metadata *Associated = nullptr;
13912d10258aSAlok Kumar Sharma     Metadata *Allocated = nullptr;
1392ef27db87SMehdi Amini     auto *Identifier = getMDString(Record[15]);
1393a61f5e37STeresa Johnson     // If this module is being parsed so that it can be ThinLTO imported
1394a61f5e37STeresa Johnson     // into another module, composite types only need to be imported
1395a61f5e37STeresa Johnson     // as type declarations (unless full type definitions requested).
1396a61f5e37STeresa Johnson     // Create type declarations up front to save memory. Also, buildODRType
1397a61f5e37STeresa Johnson     // handles the case where this is type ODRed with a definition needed
1398a61f5e37STeresa Johnson     // by the importing module, in which case the existing definition is
1399a61f5e37STeresa Johnson     // used.
14005a8dba5bSTeresa Johnson     if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1401a61f5e37STeresa Johnson         (Tag == dwarf::DW_TAG_enumeration_type ||
1402a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_class_type ||
1403a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_structure_type ||
1404a61f5e37STeresa Johnson          Tag == dwarf::DW_TAG_union_type)) {
1405a61f5e37STeresa Johnson       Flags = Flags | DINode::FlagFwdDecl;
1406a61f5e37STeresa Johnson     } else {
1407a61f5e37STeresa Johnson       BaseType = getDITypeRefOrNull(Record[6]);
1408a61f5e37STeresa Johnson       OffsetInBits = Record[9];
1409a61f5e37STeresa Johnson       Elements = getMDOrNull(Record[11]);
1410a61f5e37STeresa Johnson       VTableHolder = getDITypeRefOrNull(Record[13]);
1411a61f5e37STeresa Johnson       TemplateParams = getMDOrNull(Record[14]);
14128c59921cSAdrian Prantl       if (Record.size() > 16)
14138c59921cSAdrian Prantl         Discriminator = getMDOrNull(Record[16]);
14144042ada1SAlok Kumar Sharma       if (Record.size() > 17)
14154042ada1SAlok Kumar Sharma         DataLocation = getMDOrNull(Record[17]);
14162d10258aSAlok Kumar Sharma       if (Record.size() > 19) {
14172d10258aSAlok Kumar Sharma         Associated = getMDOrNull(Record[18]);
14182d10258aSAlok Kumar Sharma         Allocated = getMDOrNull(Record[19]);
14192d10258aSAlok Kumar Sharma       }
1420a61f5e37STeresa Johnson     }
1421ef27db87SMehdi Amini     DICompositeType *CT = nullptr;
1422ef27db87SMehdi Amini     if (Identifier)
1423ef27db87SMehdi Amini       CT = DICompositeType::buildODRType(
1424ef27db87SMehdi Amini           Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1425ef27db87SMehdi Amini           SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
14262d10258aSAlok Kumar Sharma           VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
14272d10258aSAlok Kumar Sharma           Allocated);
1428ef27db87SMehdi Amini 
1429ef27db87SMehdi Amini     // Create a node if we didn't get a lazy ODR type.
1430ef27db87SMehdi Amini     if (!CT)
1431ef27db87SMehdi Amini       CT = GET_OR_DISTINCT(DICompositeType,
1432ef27db87SMehdi Amini                            (Context, Tag, Name, File, Line, Scope, BaseType,
1433ef27db87SMehdi Amini                             SizeInBits, AlignInBits, OffsetInBits, Flags,
14349f926f70SMehdi Amini                             Elements, RuntimeLang, VTableHolder, TemplateParams,
14352d10258aSAlok Kumar Sharma                             Identifier, Discriminator, DataLocation, Associated,
14362d10258aSAlok Kumar Sharma                             Allocated));
1437ef27db87SMehdi Amini     if (!IsNotUsedInTypeRef && Identifier)
1438ef27db87SMehdi Amini       MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1439ef27db87SMehdi Amini 
1440c05c9db3SIvan Krasin     MetadataList.assignValue(CT, NextMetadataNo);
1441c05c9db3SIvan Krasin     NextMetadataNo++;
1442ef27db87SMehdi Amini     break;
1443ef27db87SMehdi Amini   }
1444ef27db87SMehdi Amini   case bitc::METADATA_SUBROUTINE_TYPE: {
1445ef27db87SMehdi Amini     if (Record.size() < 3 || Record.size() > 4)
1446ef27db87SMehdi Amini       return error("Invalid record");
1447ef27db87SMehdi Amini     bool IsOldTypeRefArray = Record[0] < 2;
1448ef27db87SMehdi Amini     unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1449ef27db87SMehdi Amini 
1450ef27db87SMehdi Amini     IsDistinct = Record[0] & 0x1;
1451ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1452ef27db87SMehdi Amini     Metadata *Types = getMDOrNull(Record[2]);
1453ef27db87SMehdi Amini     if (LLVM_UNLIKELY(IsOldTypeRefArray))
1454ef27db87SMehdi Amini       Types = MetadataList.upgradeTypeRefArray(Types);
1455ef27db87SMehdi Amini 
1456ef27db87SMehdi Amini     MetadataList.assignValue(
1457ef27db87SMehdi Amini         GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1458c05c9db3SIvan Krasin         NextMetadataNo);
1459c05c9db3SIvan Krasin     NextMetadataNo++;
1460ef27db87SMehdi Amini     break;
1461ef27db87SMehdi Amini   }
1462ef27db87SMehdi Amini 
1463ef27db87SMehdi Amini   case bitc::METADATA_MODULE: {
1464e59744fdSSourabh Singh Tomar     if (Record.size() < 5 || Record.size() > 8)
1465ef27db87SMehdi Amini       return error("Invalid record");
1466ef27db87SMehdi Amini 
1467e59744fdSSourabh Singh Tomar     unsigned Offset = Record.size() >= 7 ? 2 : 1;
1468ef27db87SMehdi Amini     IsDistinct = Record[0];
1469ef27db87SMehdi Amini     MetadataList.assignValue(
1470e59744fdSSourabh Singh Tomar         GET_OR_DISTINCT(
1471e59744fdSSourabh Singh Tomar             DIModule,
1472e59744fdSSourabh Singh Tomar             (Context, Record.size() >= 7 ? getMDOrNull(Record[1]) : nullptr,
1473e59744fdSSourabh Singh Tomar              getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1474e59744fdSSourabh Singh Tomar              getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1475e59744fdSSourabh Singh Tomar              getMDString(Record[4 + Offset]),
1476e59744fdSSourabh Singh Tomar              Record.size() <= 7 ? 0 : Record[7])),
1477c05c9db3SIvan Krasin         NextMetadataNo);
1478c05c9db3SIvan Krasin     NextMetadataNo++;
1479ef27db87SMehdi Amini     break;
1480ef27db87SMehdi Amini   }
1481ef27db87SMehdi Amini 
1482ef27db87SMehdi Amini   case bitc::METADATA_FILE: {
148316c7bdafSScott Linder     if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1484ef27db87SMehdi Amini       return error("Invalid record");
1485ef27db87SMehdi Amini 
1486ef27db87SMehdi Amini     IsDistinct = Record[0];
14877160384dSScott Linder     Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
14887160384dSScott Linder     // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
14897160384dSScott Linder     // is not present. This matches up with the old internal representation,
14907160384dSScott Linder     // and the old encoding for CSK_None in the ChecksumKind. The new
14917160384dSScott Linder     // representation reserves the value 0 in the ChecksumKind to continue to
14927160384dSScott Linder     // encode None in a backwards-compatible way.
149316c7bdafSScott Linder     if (Record.size() > 4 && Record[3] && Record[4])
14947160384dSScott Linder       Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
14957160384dSScott Linder                        getMDString(Record[4]));
1496ef27db87SMehdi Amini     MetadataList.assignValue(
14979f926f70SMehdi Amini         GET_OR_DISTINCT(
14987faeecc8SAmjad Aboud             DIFile,
149916c7bdafSScott Linder             (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
150016c7bdafSScott Linder              Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
150116c7bdafSScott Linder                                : None)),
1502c05c9db3SIvan Krasin         NextMetadataNo);
1503c05c9db3SIvan Krasin     NextMetadataNo++;
1504ef27db87SMehdi Amini     break;
1505ef27db87SMehdi Amini   }
1506ef27db87SMehdi Amini   case bitc::METADATA_COMPILE_UNIT: {
1507e4e7e447SAdrian Prantl     if (Record.size() < 14 || Record.size() > 22)
1508ef27db87SMehdi Amini       return error("Invalid record");
1509ef27db87SMehdi Amini 
1510ef27db87SMehdi Amini     // Ignore Record[0], which indicates whether this compile unit is
1511ef27db87SMehdi Amini     // distinct.  It's always distinct.
1512ef27db87SMehdi Amini     IsDistinct = true;
1513ef27db87SMehdi Amini     auto *CU = DICompileUnit::getDistinct(
1514ef27db87SMehdi Amini         Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1515ef27db87SMehdi Amini         Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1516ef27db87SMehdi Amini         Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1517ef27db87SMehdi Amini         getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1518ef27db87SMehdi Amini         Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1519ef27db87SMehdi Amini         Record.size() <= 14 ? 0 : Record[14],
15200944a8c2SDehao Chen         Record.size() <= 16 ? true : Record[16],
1521b52e2366SPeter Collingbourne         Record.size() <= 17 ? false : Record[17],
1522bb279116SDavid Blaikie         Record.size() <= 18 ? 0 : Record[18],
1523ab093bfeSDavid Blaikie         Record.size() <= 19 ? 0 : Record[19],
1524e4e7e447SAdrian Prantl         Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1525e4e7e447SAdrian Prantl         Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1526ef27db87SMehdi Amini 
1527c05c9db3SIvan Krasin     MetadataList.assignValue(CU, NextMetadataNo);
1528c05c9db3SIvan Krasin     NextMetadataNo++;
1529ef27db87SMehdi Amini 
1530ef27db87SMehdi Amini     // Move the Upgrade the list of subprograms.
1531ef27db87SMehdi Amini     if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1532ef27db87SMehdi Amini       CUSubprograms.push_back({CU, SPs});
1533ef27db87SMehdi Amini     break;
1534ef27db87SMehdi Amini   }
1535ef27db87SMehdi Amini   case bitc::METADATA_SUBPROGRAM: {
15361d12b885SAdrian Prantl     if (Record.size() < 18 || Record.size() > 21)
1537ef27db87SMehdi Amini       return error("Invalid record");
1538ef27db87SMehdi Amini 
1539adcdc1bdSPaul Robinson     bool HasSPFlags = Record[0] & 4;
154038a61873SPetar Jovanovic 
154138a61873SPetar Jovanovic     DINode::DIFlags Flags;
154238a61873SPetar Jovanovic     DISubprogram::DISPFlags SPFlags;
154338a61873SPetar Jovanovic     if (!HasSPFlags)
154438a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
154538a61873SPetar Jovanovic     else {
154638a61873SPetar Jovanovic       Flags = static_cast<DINode::DIFlags>(Record[11]);
154738a61873SPetar Jovanovic       SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
154838a61873SPetar Jovanovic     }
154938a61873SPetar Jovanovic 
155038a61873SPetar Jovanovic     // Support for old metadata when
155138a61873SPetar Jovanovic     // subprogram specific flags are placed in DIFlags.
155238a61873SPetar Jovanovic     const unsigned DIFlagMainSubprogram = 1 << 21;
155338a61873SPetar Jovanovic     bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
155438a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag)
155538a61873SPetar Jovanovic       // Remove old DIFlagMainSubprogram from DIFlags.
155638a61873SPetar Jovanovic       // Note: This assumes that any future use of bit 21 defaults to it
155738a61873SPetar Jovanovic       // being 0.
155838a61873SPetar Jovanovic       Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
155938a61873SPetar Jovanovic 
156038a61873SPetar Jovanovic     if (HasOldMainSubprogramFlag && HasSPFlags)
156138a61873SPetar Jovanovic       SPFlags |= DISubprogram::SPFlagMainSubprogram;
156238a61873SPetar Jovanovic     else if (!HasSPFlags)
156338a61873SPetar Jovanovic       SPFlags = DISubprogram::toSPFlags(
1564adcdc1bdSPaul Robinson                     /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
156538a61873SPetar Jovanovic                     /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
156638a61873SPetar Jovanovic                     /*DIFlagMainSubprogram*/HasOldMainSubprogramFlag);
1567adcdc1bdSPaul Robinson 
1568adcdc1bdSPaul Robinson     // All definitions should be distinct.
1569adcdc1bdSPaul Robinson     IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1570ef27db87SMehdi Amini     // Version 1 has a Function as Record[15].
1571ef27db87SMehdi Amini     // Version 2 has removed Record[15].
1572ef27db87SMehdi Amini     // Version 3 has the Unit as Record[15].
1573ef27db87SMehdi Amini     // Version 4 added thisAdjustment.
1574adcdc1bdSPaul Robinson     // Version 5 repacked flags into DISPFlags, changing many element numbers.
1575adcdc1bdSPaul Robinson     bool HasUnit = Record[0] & 2;
1576adcdc1bdSPaul Robinson     if (!HasSPFlags && HasUnit && Record.size() < 19)
1577ef27db87SMehdi Amini       return error("Invalid record");
1578adcdc1bdSPaul Robinson     if (HasSPFlags && !HasUnit)
1579adcdc1bdSPaul Robinson       return error("Invalid record");
1580adcdc1bdSPaul Robinson     // Accommodate older formats.
1581adcdc1bdSPaul Robinson     bool HasFn = false;
1582adcdc1bdSPaul Robinson     bool HasThisAdj = true;
1583adcdc1bdSPaul Robinson     bool HasThrownTypes = true;
1584adcdc1bdSPaul Robinson     unsigned OffsetA = 0;
1585adcdc1bdSPaul Robinson     unsigned OffsetB = 0;
1586adcdc1bdSPaul Robinson     if (!HasSPFlags) {
1587adcdc1bdSPaul Robinson       OffsetA = 2;
1588adcdc1bdSPaul Robinson       OffsetB = 2;
1589adcdc1bdSPaul Robinson       if (Record.size() >= 19) {
1590adcdc1bdSPaul Robinson         HasFn = !HasUnit;
1591adcdc1bdSPaul Robinson         OffsetB++;
1592adcdc1bdSPaul Robinson       }
1593adcdc1bdSPaul Robinson       HasThisAdj = Record.size() >= 20;
1594adcdc1bdSPaul Robinson       HasThrownTypes = Record.size() >= 21;
1595adcdc1bdSPaul Robinson     }
1596adcdc1bdSPaul Robinson     Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1597ef27db87SMehdi Amini     DISubprogram *SP = GET_OR_DISTINCT(
15981d12b885SAdrian Prantl         DISubprogram,
15991d12b885SAdrian Prantl         (Context,
1600ef27db87SMehdi Amini          getDITypeRefOrNull(Record[1]),                     // scope
1601ef27db87SMehdi Amini          getMDString(Record[2]),                            // name
1602ef27db87SMehdi Amini          getMDString(Record[3]),                            // linkageName
1603ef27db87SMehdi Amini          getMDOrNull(Record[4]),                            // file
1604ef27db87SMehdi Amini          Record[5],                                         // line
1605ef27db87SMehdi Amini          getMDOrNull(Record[6]),                            // type
1606adcdc1bdSPaul Robinson          Record[7 + OffsetA],                               // scopeLine
1607adcdc1bdSPaul Robinson          getDITypeRefOrNull(Record[8 + OffsetA]),           // containingType
1608adcdc1bdSPaul Robinson          Record[10 + OffsetA],                              // virtualIndex
1609adcdc1bdSPaul Robinson          HasThisAdj ? Record[16 + OffsetB] : 0,             // thisAdjustment
161038a61873SPetar Jovanovic          Flags,                                             // flags
1611cda54210SPaul Robinson          SPFlags,                                           // SPFlags
1612ef27db87SMehdi Amini          HasUnit ? CUorFn : nullptr,                        // unit
1613adcdc1bdSPaul Robinson          getMDOrNull(Record[13 + OffsetB]),                 // templateParams
1614adcdc1bdSPaul Robinson          getMDOrNull(Record[14 + OffsetB]),                 // declaration
1615adcdc1bdSPaul Robinson          getMDOrNull(Record[15 + OffsetB]),                 // retainedNodes
1616adcdc1bdSPaul Robinson          HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1617adcdc1bdSPaul Robinson                         : nullptr                           // thrownTypes
1618ef27db87SMehdi Amini          ));
1619c05c9db3SIvan Krasin     MetadataList.assignValue(SP, NextMetadataNo);
1620c05c9db3SIvan Krasin     NextMetadataNo++;
1621ef27db87SMehdi Amini 
1622ef27db87SMehdi Amini     // Upgrade sp->function mapping to function->sp mapping.
1623ef27db87SMehdi Amini     if (HasFn) {
1624ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1625ef27db87SMehdi Amini         if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1626ef27db87SMehdi Amini           if (F->isMaterializable())
1627ef27db87SMehdi Amini             // Defer until materialized; unmaterialized functions may not have
1628ef27db87SMehdi Amini             // metadata.
1629ef27db87SMehdi Amini             FunctionsWithSPs[F] = SP;
1630ef27db87SMehdi Amini           else if (!F->empty())
1631ef27db87SMehdi Amini             F->setSubprogram(SP);
1632ef27db87SMehdi Amini         }
1633ef27db87SMehdi Amini     }
1634ef27db87SMehdi Amini     break;
1635ef27db87SMehdi Amini   }
1636ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK: {
1637ef27db87SMehdi Amini     if (Record.size() != 5)
1638ef27db87SMehdi Amini       return error("Invalid record");
1639ef27db87SMehdi Amini 
1640ef27db87SMehdi Amini     IsDistinct = Record[0];
1641ef27db87SMehdi Amini     MetadataList.assignValue(
1642ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlock,
1643ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1644ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3], Record[4])),
1645c05c9db3SIvan Krasin         NextMetadataNo);
1646c05c9db3SIvan Krasin     NextMetadataNo++;
1647ef27db87SMehdi Amini     break;
1648ef27db87SMehdi Amini   }
1649ef27db87SMehdi Amini   case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1650ef27db87SMehdi Amini     if (Record.size() != 4)
1651ef27db87SMehdi Amini       return error("Invalid record");
1652ef27db87SMehdi Amini 
1653ef27db87SMehdi Amini     IsDistinct = Record[0];
1654ef27db87SMehdi Amini     MetadataList.assignValue(
1655ef27db87SMehdi Amini         GET_OR_DISTINCT(DILexicalBlockFile,
1656ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1]),
1657ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3])),
1658c05c9db3SIvan Krasin         NextMetadataNo);
1659c05c9db3SIvan Krasin     NextMetadataNo++;
1660ef27db87SMehdi Amini     break;
1661ef27db87SMehdi Amini   }
16626ed5706aSAdrian Prantl   case bitc::METADATA_COMMON_BLOCK: {
16636ed5706aSAdrian Prantl     IsDistinct = Record[0] & 1;
16646ed5706aSAdrian Prantl     MetadataList.assignValue(
16656ed5706aSAdrian Prantl         GET_OR_DISTINCT(DICommonBlock,
16666ed5706aSAdrian Prantl                         (Context, getMDOrNull(Record[1]),
16676ed5706aSAdrian Prantl                          getMDOrNull(Record[2]), getMDString(Record[3]),
16686ed5706aSAdrian Prantl                          getMDOrNull(Record[4]), Record[5])),
16696ed5706aSAdrian Prantl         NextMetadataNo);
16706ed5706aSAdrian Prantl     NextMetadataNo++;
16716ed5706aSAdrian Prantl     break;
16726ed5706aSAdrian Prantl   }
1673ef27db87SMehdi Amini   case bitc::METADATA_NAMESPACE: {
1674fed4f399SAdrian Prantl     // Newer versions of DINamespace dropped file and line.
1675fed4f399SAdrian Prantl     MDString *Name;
1676fed4f399SAdrian Prantl     if (Record.size() == 3)
1677fed4f399SAdrian Prantl       Name = getMDString(Record[2]);
1678fed4f399SAdrian Prantl     else if (Record.size() == 5)
1679fed4f399SAdrian Prantl       Name = getMDString(Record[3]);
1680fed4f399SAdrian Prantl     else
1681ef27db87SMehdi Amini       return error("Invalid record");
1682ef27db87SMehdi Amini 
1683ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1684ef27db87SMehdi Amini     bool ExportSymbols = Record[0] & 2;
1685ef27db87SMehdi Amini     MetadataList.assignValue(
1686ef27db87SMehdi Amini         GET_OR_DISTINCT(DINamespace,
1687fed4f399SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1688c05c9db3SIvan Krasin         NextMetadataNo);
1689c05c9db3SIvan Krasin     NextMetadataNo++;
1690ef27db87SMehdi Amini     break;
1691ef27db87SMehdi Amini   }
1692ef27db87SMehdi Amini   case bitc::METADATA_MACRO: {
1693ef27db87SMehdi Amini     if (Record.size() != 5)
1694ef27db87SMehdi Amini       return error("Invalid record");
1695ef27db87SMehdi Amini 
1696ef27db87SMehdi Amini     IsDistinct = Record[0];
1697ef27db87SMehdi Amini     MetadataList.assignValue(
1698ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacro,
16999f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDString(Record[3]),
17009f926f70SMehdi Amini                          getMDString(Record[4]))),
1701c05c9db3SIvan Krasin         NextMetadataNo);
1702c05c9db3SIvan Krasin     NextMetadataNo++;
1703ef27db87SMehdi Amini     break;
1704ef27db87SMehdi Amini   }
1705ef27db87SMehdi Amini   case bitc::METADATA_MACRO_FILE: {
1706ef27db87SMehdi Amini     if (Record.size() != 5)
1707ef27db87SMehdi Amini       return error("Invalid record");
1708ef27db87SMehdi Amini 
1709ef27db87SMehdi Amini     IsDistinct = Record[0];
1710ef27db87SMehdi Amini     MetadataList.assignValue(
1711ef27db87SMehdi Amini         GET_OR_DISTINCT(DIMacroFile,
17129f926f70SMehdi Amini                         (Context, Record[1], Record[2], getMDOrNull(Record[3]),
17139f926f70SMehdi Amini                          getMDOrNull(Record[4]))),
1714c05c9db3SIvan Krasin         NextMetadataNo);
1715c05c9db3SIvan Krasin     NextMetadataNo++;
1716ef27db87SMehdi Amini     break;
1717ef27db87SMehdi Amini   }
1718ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_TYPE: {
17197a42babeSAwanish Pandey     if (Record.size() < 3 || Record.size() > 4)
1720ef27db87SMehdi Amini       return error("Invalid record");
1721ef27db87SMehdi Amini 
1722ef27db87SMehdi Amini     IsDistinct = Record[0];
17237a42babeSAwanish Pandey     MetadataList.assignValue(
17247a42babeSAwanish Pandey         GET_OR_DISTINCT(DITemplateTypeParameter,
1725ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
17267a42babeSAwanish Pandey                          getDITypeRefOrNull(Record[2]),
17277a42babeSAwanish Pandey                          (Record.size() == 4) ? getMDOrNull(Record[3])
17287a42babeSAwanish Pandey                                               : getMDOrNull(false))),
1729c05c9db3SIvan Krasin         NextMetadataNo);
1730c05c9db3SIvan Krasin     NextMetadataNo++;
1731ef27db87SMehdi Amini     break;
1732ef27db87SMehdi Amini   }
1733ef27db87SMehdi Amini   case bitc::METADATA_TEMPLATE_VALUE: {
17347a42babeSAwanish Pandey     if (Record.size() < 5 || Record.size() > 6)
1735ef27db87SMehdi Amini       return error("Invalid record");
1736ef27db87SMehdi Amini 
1737ef27db87SMehdi Amini     IsDistinct = Record[0];
17387a42babeSAwanish Pandey 
1739ef27db87SMehdi Amini     MetadataList.assignValue(
17407a42babeSAwanish Pandey         GET_OR_DISTINCT(
17417a42babeSAwanish Pandey             DITemplateValueParameter,
1742ef27db87SMehdi Amini             (Context, Record[1], getMDString(Record[2]),
1743ef27db87SMehdi Amini              getDITypeRefOrNull(Record[3]),
17447a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
17457a42babeSAwanish Pandey              (Record.size() == 6) ? getMDOrNull(Record[5])
17467a42babeSAwanish Pandey                                   : getMDOrNull(Record[4]))),
1747c05c9db3SIvan Krasin         NextMetadataNo);
1748c05c9db3SIvan Krasin     NextMetadataNo++;
1749ef27db87SMehdi Amini     break;
1750ef27db87SMehdi Amini   }
1751ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_VAR: {
1752f8ab35a4SMatthew Voss     if (Record.size() < 11 || Record.size() > 13)
1753ef27db87SMehdi Amini       return error("Invalid record");
1754ef27db87SMehdi Amini 
1755bceaaa96SAdrian Prantl     IsDistinct = Record[0] & 1;
1756bceaaa96SAdrian Prantl     unsigned Version = Record[0] >> 1;
1757ef27db87SMehdi Amini 
1758f8ab35a4SMatthew Voss     if (Version == 2) {
1759f8ab35a4SMatthew Voss       MetadataList.assignValue(
1760f8ab35a4SMatthew Voss           GET_OR_DISTINCT(
1761f8ab35a4SMatthew Voss               DIGlobalVariable,
1762f8ab35a4SMatthew Voss               (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1763f8ab35a4SMatthew Voss                getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1764f8ab35a4SMatthew Voss                getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1765f8ab35a4SMatthew Voss                getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])),
1766f8ab35a4SMatthew Voss           NextMetadataNo);
1767f8ab35a4SMatthew Voss 
1768f8ab35a4SMatthew Voss       NextMetadataNo++;
1769f8ab35a4SMatthew Voss     } else if (Version == 1) {
1770f8ab35a4SMatthew Voss       // No upgrade necessary. A null field will be introduced to indicate
1771f8ab35a4SMatthew Voss       // that no parameter information is available.
1772bceaaa96SAdrian Prantl       MetadataList.assignValue(
1773bceaaa96SAdrian Prantl           GET_OR_DISTINCT(DIGlobalVariable,
1774bceaaa96SAdrian Prantl                           (Context, getMDOrNull(Record[1]),
1775bceaaa96SAdrian Prantl                            getMDString(Record[2]), getMDString(Record[3]),
1776bceaaa96SAdrian Prantl                            getMDOrNull(Record[4]), Record[5],
17779f926f70SMehdi Amini                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1778f8ab35a4SMatthew Voss                            getMDOrNull(Record[10]), nullptr, Record[11])),
1779c05c9db3SIvan Krasin           NextMetadataNo);
1780f8ab35a4SMatthew Voss 
1781c05c9db3SIvan Krasin       NextMetadataNo++;
1782bceaaa96SAdrian Prantl     } else if (Version == 0) {
1783ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
1784ef27db87SMehdi Amini       // ConstantInt here.
1785a5bf2d70SAdrian Prantl       NeedUpgradeToDIGlobalVariableExpression = true;
1786ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
1787ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1788ef27db87SMehdi Amini       if (Record.size() > 11) {
1789ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1790ef27db87SMehdi Amini           return error("Alignment value is too large");
1791ef27db87SMehdi Amini         AlignInBits = Record[11];
1792ef27db87SMehdi Amini       }
1793ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
1794ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1795ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1796ef27db87SMehdi Amini           Attach = GV;
1797ef27db87SMehdi Amini           Expr = nullptr;
1798ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1799ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
1800ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
1801ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
1802ef27db87SMehdi Amini         } else {
1803ef27db87SMehdi Amini           Expr = nullptr;
1804ef27db87SMehdi Amini         }
1805ef27db87SMehdi Amini       }
1806ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
1807ef27db87SMehdi Amini           DIGlobalVariable,
1808ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1809ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1810bceaaa96SAdrian Prantl            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1811f8ab35a4SMatthew Voss            getMDOrNull(Record[10]), nullptr, AlignInBits));
181203c6d31aSAdrian Prantl 
1813e37d3144SAdrian Prantl       DIGlobalVariableExpression *DGVE = nullptr;
1814e37d3144SAdrian Prantl       if (Attach || Expr)
181505782218SAdrian Prantl         DGVE = DIGlobalVariableExpression::getDistinct(
181605782218SAdrian Prantl             Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
181773ec0656SAdrian Prantl       if (Attach)
1818bceaaa96SAdrian Prantl         Attach->addDebugInfo(DGVE);
1819e37d3144SAdrian Prantl 
1820e37d3144SAdrian Prantl       auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1821e37d3144SAdrian Prantl       MetadataList.assignValue(MDNode, NextMetadataNo);
1822e37d3144SAdrian Prantl       NextMetadataNo++;
1823bceaaa96SAdrian Prantl     } else
1824bceaaa96SAdrian Prantl       return error("Invalid record");
182573ec0656SAdrian Prantl 
1826ef27db87SMehdi Amini     break;
1827ef27db87SMehdi Amini   }
1828ef27db87SMehdi Amini   case bitc::METADATA_LOCAL_VAR: {
1829ef27db87SMehdi Amini     // 10th field is for the obseleted 'inlinedAt:' field.
1830ef27db87SMehdi Amini     if (Record.size() < 8 || Record.size() > 10)
1831ef27db87SMehdi Amini       return error("Invalid record");
1832ef27db87SMehdi Amini 
1833ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
1834ef27db87SMehdi Amini     bool HasAlignment = Record[0] & 2;
1835ef27db87SMehdi Amini     // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1836ef27db87SMehdi Amini     // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
183768168d17SSimon Pilgrim     // this is newer version of record which doesn't have artificial tag.
1838ef27db87SMehdi Amini     bool HasTag = !HasAlignment && Record.size() > 8;
1839ef27db87SMehdi Amini     DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1840ef27db87SMehdi Amini     uint32_t AlignInBits = 0;
1841ef27db87SMehdi Amini     if (HasAlignment) {
1842ef27db87SMehdi Amini       if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max())
1843ef27db87SMehdi Amini         return error("Alignment value is too large");
1844ef27db87SMehdi Amini       AlignInBits = Record[8 + HasTag];
1845ef27db87SMehdi Amini     }
1846ef27db87SMehdi Amini     MetadataList.assignValue(
1847ef27db87SMehdi Amini         GET_OR_DISTINCT(DILocalVariable,
1848ef27db87SMehdi Amini                         (Context, getMDOrNull(Record[1 + HasTag]),
1849ef27db87SMehdi Amini                          getMDString(Record[2 + HasTag]),
1850ef27db87SMehdi Amini                          getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1851ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[5 + HasTag]),
1852ef27db87SMehdi Amini                          Record[6 + HasTag], Flags, AlignInBits)),
1853c05c9db3SIvan Krasin         NextMetadataNo);
1854c05c9db3SIvan Krasin     NextMetadataNo++;
1855ef27db87SMehdi Amini     break;
1856ef27db87SMehdi Amini   }
18572c864551SShiva Chen   case bitc::METADATA_LABEL: {
18582c864551SShiva Chen     if (Record.size() != 5)
18592c864551SShiva Chen       return error("Invalid record");
18602c864551SShiva Chen 
18612c864551SShiva Chen     IsDistinct = Record[0] & 1;
18622c864551SShiva Chen     MetadataList.assignValue(
18632c864551SShiva Chen         GET_OR_DISTINCT(DILabel,
18642c864551SShiva Chen                         (Context, getMDOrNull(Record[1]),
18652c864551SShiva Chen                          getMDString(Record[2]),
18662c864551SShiva Chen                          getMDOrNull(Record[3]), Record[4])),
18672c864551SShiva Chen         NextMetadataNo);
18682c864551SShiva Chen     NextMetadataNo++;
18692c864551SShiva Chen     break;
18702c864551SShiva Chen   }
1871ef27db87SMehdi Amini   case bitc::METADATA_EXPRESSION: {
1872ef27db87SMehdi Amini     if (Record.size() < 1)
1873ef27db87SMehdi Amini       return error("Invalid record");
1874ef27db87SMehdi Amini 
1875ef27db87SMehdi Amini     IsDistinct = Record[0] & 1;
18766825fb64SAdrian Prantl     uint64_t Version = Record[0] >> 1;
1877ef27db87SMehdi Amini     auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
1878ffc498dfSFlorian Hahn 
1879ffc498dfSFlorian Hahn     SmallVector<uint64_t, 6> Buffer;
1880ffc498dfSFlorian Hahn     if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
1881ffc498dfSFlorian Hahn       return Err;
1882ef27db87SMehdi Amini 
1883ef27db87SMehdi Amini     MetadataList.assignValue(
1884ffc498dfSFlorian Hahn         GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo);
1885c05c9db3SIvan Krasin     NextMetadataNo++;
1886ef27db87SMehdi Amini     break;
1887ef27db87SMehdi Amini   }
1888bceaaa96SAdrian Prantl   case bitc::METADATA_GLOBAL_VAR_EXPR: {
1889bceaaa96SAdrian Prantl     if (Record.size() != 3)
1890bceaaa96SAdrian Prantl       return error("Invalid record");
1891bceaaa96SAdrian Prantl 
1892bceaaa96SAdrian Prantl     IsDistinct = Record[0];
189305782218SAdrian Prantl     Metadata *Expr = getMDOrNull(Record[2]);
189405782218SAdrian Prantl     if (!Expr)
189505782218SAdrian Prantl       Expr = DIExpression::get(Context, {});
189605782218SAdrian Prantl     MetadataList.assignValue(
189705782218SAdrian Prantl         GET_OR_DISTINCT(DIGlobalVariableExpression,
189805782218SAdrian Prantl                         (Context, getMDOrNull(Record[1]), Expr)),
1899c05c9db3SIvan Krasin         NextMetadataNo);
1900c05c9db3SIvan Krasin     NextMetadataNo++;
1901bceaaa96SAdrian Prantl     break;
1902bceaaa96SAdrian Prantl   }
1903ef27db87SMehdi Amini   case bitc::METADATA_OBJC_PROPERTY: {
1904ef27db87SMehdi Amini     if (Record.size() != 8)
1905ef27db87SMehdi Amini       return error("Invalid record");
1906ef27db87SMehdi Amini 
1907ef27db87SMehdi Amini     IsDistinct = Record[0];
1908ef27db87SMehdi Amini     MetadataList.assignValue(
1909ef27db87SMehdi Amini         GET_OR_DISTINCT(DIObjCProperty,
1910ef27db87SMehdi Amini                         (Context, getMDString(Record[1]),
1911ef27db87SMehdi Amini                          getMDOrNull(Record[2]), Record[3],
1912ef27db87SMehdi Amini                          getMDString(Record[4]), getMDString(Record[5]),
1913ef27db87SMehdi Amini                          Record[6], getDITypeRefOrNull(Record[7]))),
1914c05c9db3SIvan Krasin         NextMetadataNo);
1915c05c9db3SIvan Krasin     NextMetadataNo++;
1916ef27db87SMehdi Amini     break;
1917ef27db87SMehdi Amini   }
1918ef27db87SMehdi Amini   case bitc::METADATA_IMPORTED_ENTITY: {
1919d63bfd21SAdrian Prantl     if (Record.size() != 6 && Record.size() != 7)
1920ef27db87SMehdi Amini       return error("Invalid record");
1921ef27db87SMehdi Amini 
1922ef27db87SMehdi Amini     IsDistinct = Record[0];
1923d63bfd21SAdrian Prantl     bool HasFile = (Record.size() == 7);
1924ef27db87SMehdi Amini     MetadataList.assignValue(
1925ef27db87SMehdi Amini         GET_OR_DISTINCT(DIImportedEntity,
1926ef27db87SMehdi Amini                         (Context, Record[1], getMDOrNull(Record[2]),
1927d63bfd21SAdrian Prantl                          getDITypeRefOrNull(Record[3]),
1928d63bfd21SAdrian Prantl                          HasFile ? getMDOrNull(Record[6]) : nullptr,
1929d63bfd21SAdrian Prantl                          HasFile ? Record[4] : 0, getMDString(Record[5]))),
1930c05c9db3SIvan Krasin         NextMetadataNo);
1931c05c9db3SIvan Krasin     NextMetadataNo++;
1932ef27db87SMehdi Amini     break;
1933ef27db87SMehdi Amini   }
1934ef27db87SMehdi Amini   case bitc::METADATA_STRING_OLD: {
1935ef27db87SMehdi Amini     std::string String(Record.begin(), Record.end());
1936ef27db87SMehdi Amini 
1937ef27db87SMehdi Amini     // Test for upgrading !llvm.loop.
1938ef27db87SMehdi Amini     HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
193919ef4fadSMehdi Amini     ++NumMDStringLoaded;
1940ef27db87SMehdi Amini     Metadata *MD = MDString::get(Context, String);
1941c05c9db3SIvan Krasin     MetadataList.assignValue(MD, NextMetadataNo);
1942c05c9db3SIvan Krasin     NextMetadataNo++;
1943ef27db87SMehdi Amini     break;
1944ef27db87SMehdi Amini   }
194519ef4fadSMehdi Amini   case bitc::METADATA_STRINGS: {
194619ef4fadSMehdi Amini     auto CreateNextMDString = [&](StringRef Str) {
194719ef4fadSMehdi Amini       ++NumMDStringLoaded;
1948c05c9db3SIvan Krasin       MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
1949c05c9db3SIvan Krasin       NextMetadataNo++;
195019ef4fadSMehdi Amini     };
195119ef4fadSMehdi Amini     if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
1952ef27db87SMehdi Amini       return Err;
1953ef27db87SMehdi Amini     break;
195419ef4fadSMehdi Amini   }
1955ef27db87SMehdi Amini   case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
1956ef27db87SMehdi Amini     if (Record.size() % 2 == 0)
1957ef27db87SMehdi Amini       return error("Invalid record");
1958ef27db87SMehdi Amini     unsigned ValueID = Record[0];
1959ef27db87SMehdi Amini     if (ValueID >= ValueList.size())
1960ef27db87SMehdi Amini       return error("Invalid record");
1961ef27db87SMehdi Amini     if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
1962ef27db87SMehdi Amini       if (Error Err = parseGlobalObjectAttachment(
1963ef27db87SMehdi Amini               *GO, ArrayRef<uint64_t>(Record).slice(1)))
1964ef27db87SMehdi Amini         return Err;
1965ef27db87SMehdi Amini     break;
1966ef27db87SMehdi Amini   }
1967ef27db87SMehdi Amini   case bitc::METADATA_KIND: {
1968ef27db87SMehdi Amini     // Support older bitcode files that had METADATA_KIND records in a
1969ef27db87SMehdi Amini     // block with METADATA_BLOCK_ID.
1970ef27db87SMehdi Amini     if (Error Err = parseMetadataKindRecord(Record))
1971ef27db87SMehdi Amini       return Err;
1972ef27db87SMehdi Amini     break;
1973ef27db87SMehdi Amini   }
1974ef27db87SMehdi Amini   }
19759f926f70SMehdi Amini   return Error::success();
197619ef4fadSMehdi Amini #undef GET_OR_DISTINCT
1977ef27db87SMehdi Amini }
1978ef27db87SMehdi Amini 
1979ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
198019ef4fadSMehdi Amini     ArrayRef<uint64_t> Record, StringRef Blob,
1981061f4a5fSBenjamin Kramer     function_ref<void(StringRef)> CallBack) {
1982ef27db87SMehdi Amini   // All the MDStrings in the block are emitted together in a single
1983ef27db87SMehdi Amini   // record.  The strings are concatenated and stored in a blob along with
1984ef27db87SMehdi Amini   // their sizes.
1985ef27db87SMehdi Amini   if (Record.size() != 2)
1986ef27db87SMehdi Amini     return error("Invalid record: metadata strings layout");
1987ef27db87SMehdi Amini 
1988ef27db87SMehdi Amini   unsigned NumStrings = Record[0];
1989ef27db87SMehdi Amini   unsigned StringsOffset = Record[1];
1990ef27db87SMehdi Amini   if (!NumStrings)
1991ef27db87SMehdi Amini     return error("Invalid record: metadata strings with no strings");
1992ef27db87SMehdi Amini   if (StringsOffset > Blob.size())
1993ef27db87SMehdi Amini     return error("Invalid record: metadata strings corrupt offset");
1994ef27db87SMehdi Amini 
1995ef27db87SMehdi Amini   StringRef Lengths = Blob.slice(0, StringsOffset);
1996ef27db87SMehdi Amini   SimpleBitstreamCursor R(Lengths);
1997ef27db87SMehdi Amini 
1998ef27db87SMehdi Amini   StringRef Strings = Blob.drop_front(StringsOffset);
1999ef27db87SMehdi Amini   do {
2000ef27db87SMehdi Amini     if (R.AtEndOfStream())
2001ef27db87SMehdi Amini       return error("Invalid record: metadata strings bad length");
2002ef27db87SMehdi Amini 
20030e828958SJF Bastien     Expected<uint32_t> MaybeSize = R.ReadVBR(6);
20040e828958SJF Bastien     if (!MaybeSize)
20050e828958SJF Bastien       return MaybeSize.takeError();
20060e828958SJF Bastien     uint32_t Size = MaybeSize.get();
2007ef27db87SMehdi Amini     if (Strings.size() < Size)
2008ef27db87SMehdi Amini       return error("Invalid record: metadata strings truncated chars");
2009ef27db87SMehdi Amini 
201019ef4fadSMehdi Amini     CallBack(Strings.slice(0, Size));
2011ef27db87SMehdi Amini     Strings = Strings.drop_front(Size);
2012ef27db87SMehdi Amini   } while (--NumStrings);
2013ef27db87SMehdi Amini 
2014ef27db87SMehdi Amini   return Error::success();
2015ef27db87SMehdi Amini }
2016ef27db87SMehdi Amini 
2017ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2018ef27db87SMehdi Amini     GlobalObject &GO, ArrayRef<uint64_t> Record) {
2019ef27db87SMehdi Amini   assert(Record.size() % 2 == 0);
2020ef27db87SMehdi Amini   for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2021ef27db87SMehdi Amini     auto K = MDKindMap.find(Record[I]);
2022ef27db87SMehdi Amini     if (K == MDKindMap.end())
2023ef27db87SMehdi Amini       return error("Invalid ID");
2024*01b9debaSFangrui Song     MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[I + 1]);
2025ef27db87SMehdi Amini     if (!MD)
2026f3d2453dSTeresa Johnson       return error("Invalid metadata attachment: expect fwd ref to MDNode");
2027ef27db87SMehdi Amini     GO.addMetadata(K->second, *MD);
2028ef27db87SMehdi Amini   }
2029ef27db87SMehdi Amini   return Error::success();
2030ef27db87SMehdi Amini }
2031ef27db87SMehdi Amini 
2032ef27db87SMehdi Amini /// Parse metadata attachments.
2033ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
2034ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
20350e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
20360e828958SJF Bastien     return Err;
2037ef27db87SMehdi Amini 
2038ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
20397b0d1457SMehdi Amini   PlaceholderQueue Placeholders;
2040ef27db87SMehdi Amini 
2041ef27db87SMehdi Amini   while (true) {
20420e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
20430e828958SJF Bastien     if (!MaybeEntry)
20440e828958SJF Bastien       return MaybeEntry.takeError();
20450e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
2046ef27db87SMehdi Amini 
2047ef27db87SMehdi Amini     switch (Entry.Kind) {
2048ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2049ef27db87SMehdi Amini     case BitstreamEntry::Error:
2050ef27db87SMehdi Amini       return error("Malformed block");
2051ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
20527b0d1457SMehdi Amini       resolveForwardRefsAndPlaceholders(Placeholders);
2053ef27db87SMehdi Amini       return Error::success();
2054ef27db87SMehdi Amini     case BitstreamEntry::Record:
2055ef27db87SMehdi Amini       // The interesting case.
2056ef27db87SMehdi Amini       break;
2057ef27db87SMehdi Amini     }
2058ef27db87SMehdi Amini 
2059ef27db87SMehdi Amini     // Read a metadata attachment record.
2060ef27db87SMehdi Amini     Record.clear();
206119ef4fadSMehdi Amini     ++NumMDRecordLoaded;
20620e828958SJF Bastien     Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
20630e828958SJF Bastien     if (!MaybeRecord)
20640e828958SJF Bastien       return MaybeRecord.takeError();
20650e828958SJF Bastien     switch (MaybeRecord.get()) {
2066ef27db87SMehdi Amini     default: // Default behavior: ignore.
2067ef27db87SMehdi Amini       break;
2068ef27db87SMehdi Amini     case bitc::METADATA_ATTACHMENT: {
2069ef27db87SMehdi Amini       unsigned RecordLength = Record.size();
2070ef27db87SMehdi Amini       if (Record.empty())
2071ef27db87SMehdi Amini         return error("Invalid record");
2072ef27db87SMehdi Amini       if (RecordLength % 2 == 0) {
2073ef27db87SMehdi Amini         // A function attachment.
2074ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(F, Record))
2075ef27db87SMehdi Amini           return Err;
2076ef27db87SMehdi Amini         continue;
2077ef27db87SMehdi Amini       }
2078ef27db87SMehdi Amini 
2079ef27db87SMehdi Amini       // An instruction attachment.
2080ef27db87SMehdi Amini       Instruction *Inst = InstructionList[Record[0]];
2081ef27db87SMehdi Amini       for (unsigned i = 1; i != RecordLength; i = i + 2) {
2082ef27db87SMehdi Amini         unsigned Kind = Record[i];
2083ef27db87SMehdi Amini         DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
2084ef27db87SMehdi Amini         if (I == MDKindMap.end())
2085ef27db87SMehdi Amini           return error("Invalid ID");
20868662305bSMehdi Amini         if (I->second == LLVMContext::MD_tbaa && StripTBAA)
20878662305bSMehdi Amini           continue;
20888662305bSMehdi Amini 
208919ef4fadSMehdi Amini         auto Idx = Record[i + 1];
209019ef4fadSMehdi Amini         if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2091d5549f3dSMehdi Amini             !MetadataList.lookup(Idx)) {
209219ef4fadSMehdi Amini           // Load the attachment if it is in the lazy-loadable range and hasn't
209319ef4fadSMehdi Amini           // been loaded yet.
209419ef4fadSMehdi Amini           lazyLoadOneMetadata(Idx, Placeholders);
2095d5549f3dSMehdi Amini           resolveForwardRefsAndPlaceholders(Placeholders);
2096d5549f3dSMehdi Amini         }
209719ef4fadSMehdi Amini 
209819ef4fadSMehdi Amini         Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2099ef27db87SMehdi Amini         if (isa<LocalAsMetadata>(Node))
2100ef27db87SMehdi Amini           // Drop the attachment.  This used to be legal, but there's no
2101ef27db87SMehdi Amini           // upgrade path.
2102ef27db87SMehdi Amini           break;
2103ef27db87SMehdi Amini         MDNode *MD = dyn_cast_or_null<MDNode>(Node);
2104ef27db87SMehdi Amini         if (!MD)
2105ef27db87SMehdi Amini           return error("Invalid metadata attachment");
2106ef27db87SMehdi Amini 
2107ef27db87SMehdi Amini         if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2108ef27db87SMehdi Amini           MD = upgradeInstructionLoopAttachment(*MD);
2109ef27db87SMehdi Amini 
2110ef27db87SMehdi Amini         if (I->second == LLVMContext::MD_tbaa) {
2111ef27db87SMehdi Amini           assert(!MD->isTemporary() && "should load MDs before attachments");
2112ef27db87SMehdi Amini           MD = UpgradeTBAANode(*MD);
2113ef27db87SMehdi Amini         }
2114ef27db87SMehdi Amini         Inst->setMetadata(I->second, MD);
2115ef27db87SMehdi Amini       }
2116ef27db87SMehdi Amini       break;
2117ef27db87SMehdi Amini     }
2118ef27db87SMehdi Amini     }
2119ef27db87SMehdi Amini   }
2120ef27db87SMehdi Amini }
2121ef27db87SMehdi Amini 
2122ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
2123ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2124ef27db87SMehdi Amini     SmallVectorImpl<uint64_t> &Record) {
2125ef27db87SMehdi Amini   if (Record.size() < 2)
2126ef27db87SMehdi Amini     return error("Invalid record");
2127ef27db87SMehdi Amini 
2128ef27db87SMehdi Amini   unsigned Kind = Record[0];
2129ef27db87SMehdi Amini   SmallString<8> Name(Record.begin() + 1, Record.end());
2130ef27db87SMehdi Amini 
2131ef27db87SMehdi Amini   unsigned NewKind = TheModule.getMDKindID(Name.str());
2132ef27db87SMehdi Amini   if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2133ef27db87SMehdi Amini     return error("Conflicting METADATA_KIND records");
2134ef27db87SMehdi Amini   return Error::success();
2135ef27db87SMehdi Amini }
2136ef27db87SMehdi Amini 
2137ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
2138ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
21390e828958SJF Bastien   if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
21400e828958SJF Bastien     return Err;
2141ef27db87SMehdi Amini 
2142ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
2143ef27db87SMehdi Amini 
2144ef27db87SMehdi Amini   // Read all the records.
2145ef27db87SMehdi Amini   while (true) {
21460e828958SJF Bastien     Expected<BitstreamEntry> MaybeEntry = Stream.advanceSkippingSubblocks();
21470e828958SJF Bastien     if (!MaybeEntry)
21480e828958SJF Bastien       return MaybeEntry.takeError();
21490e828958SJF Bastien     BitstreamEntry Entry = MaybeEntry.get();
2150ef27db87SMehdi Amini 
2151ef27db87SMehdi Amini     switch (Entry.Kind) {
2152ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
2153ef27db87SMehdi Amini     case BitstreamEntry::Error:
2154ef27db87SMehdi Amini       return error("Malformed block");
2155ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
2156ef27db87SMehdi Amini       return Error::success();
2157ef27db87SMehdi Amini     case BitstreamEntry::Record:
2158ef27db87SMehdi Amini       // The interesting case.
2159ef27db87SMehdi Amini       break;
2160ef27db87SMehdi Amini     }
2161ef27db87SMehdi Amini 
2162ef27db87SMehdi Amini     // Read a record.
2163ef27db87SMehdi Amini     Record.clear();
216419ef4fadSMehdi Amini     ++NumMDRecordLoaded;
21650e828958SJF Bastien     Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
21660e828958SJF Bastien     if (!MaybeCode)
21670e828958SJF Bastien       return MaybeCode.takeError();
21680e828958SJF Bastien     switch (MaybeCode.get()) {
2169ef27db87SMehdi Amini     default: // Default behavior: ignore.
2170ef27db87SMehdi Amini       break;
2171ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
2172ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
2173ef27db87SMehdi Amini         return Err;
2174ef27db87SMehdi Amini       break;
2175ef27db87SMehdi Amini     }
2176ef27db87SMehdi Amini     }
2177ef27db87SMehdi Amini   }
2178ef27db87SMehdi Amini }
2179ef27db87SMehdi Amini 
2180ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
2181ef27db87SMehdi Amini   Pimpl = std::move(RHS.Pimpl);
2182ef27db87SMehdi Amini   return *this;
2183ef27db87SMehdi Amini }
2184ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2185ec68dd49SMehdi Amini     : Pimpl(std::move(RHS.Pimpl)) {}
2186ef27db87SMehdi Amini 
2187ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
2188ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2189ef27db87SMehdi Amini                                BitcodeReaderValueList &ValueList,
2190a61f5e37STeresa Johnson                                bool IsImporting,
2191ef27db87SMehdi Amini                                std::function<Type *(unsigned)> getTypeByID)
21920eaee545SJonas Devlieghere     : Pimpl(std::make_unique<MetadataLoaderImpl>(
2193061f4a5fSBenjamin Kramer           Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2194ef27db87SMehdi Amini 
2195ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2196ec68dd49SMehdi Amini   return Pimpl->parseMetadata(ModuleLevel);
2197ef27db87SMehdi Amini }
2198ef27db87SMehdi Amini 
2199ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2200ef27db87SMehdi Amini 
2201ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
2202ef27db87SMehdi Amini /// necessary.
22033bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
22043bb4d01dSMehdi Amini   return Pimpl->getMetadataFwdRefOrLoad(Idx);
2205ef27db87SMehdi Amini }
2206ef27db87SMehdi Amini 
2207ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2208ef27db87SMehdi Amini   return Pimpl->lookupSubprogramForFunction(F);
2209ef27db87SMehdi Amini }
2210ef27db87SMehdi Amini 
2211ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
2212ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
2213ef27db87SMehdi Amini   return Pimpl->parseMetadataAttachment(F, InstructionList);
2214ef27db87SMehdi Amini }
2215ef27db87SMehdi Amini 
2216ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
2217ef27db87SMehdi Amini   return Pimpl->parseMetadataKinds();
2218ef27db87SMehdi Amini }
2219ef27db87SMehdi Amini 
22208662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) {
22218662305bSMehdi Amini   return Pimpl->setStripTBAA(StripTBAA);
22228662305bSMehdi Amini }
22238662305bSMehdi Amini 
22248662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
22258662305bSMehdi Amini 
2226ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
2227ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
22286825fb64SAdrian Prantl 
22296825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
22306825fb64SAdrian Prantl   return Pimpl->upgradeDebugIntrinsics(F);
22316825fb64SAdrian Prantl }
2232