1*ef27db87SMehdi Amini //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2*ef27db87SMehdi Amini //
3*ef27db87SMehdi Amini //                     The LLVM Compiler Infrastructure
4*ef27db87SMehdi Amini //
5*ef27db87SMehdi Amini // This file is distributed under the University of Illinois Open Source
6*ef27db87SMehdi Amini // License. See LICENSE.TXT for details.
7*ef27db87SMehdi Amini //
8*ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
9*ef27db87SMehdi Amini 
10*ef27db87SMehdi Amini #include "MetadataLoader.h"
11*ef27db87SMehdi Amini #include "ValueList.h"
12*ef27db87SMehdi Amini 
13*ef27db87SMehdi Amini #include "llvm/ADT/APFloat.h"
14*ef27db87SMehdi Amini #include "llvm/ADT/APInt.h"
15*ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h"
16*ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h"
17*ef27db87SMehdi Amini #include "llvm/ADT/None.h"
18*ef27db87SMehdi Amini #include "llvm/ADT/STLExtras.h"
19*ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h"
20*ef27db87SMehdi Amini #include "llvm/ADT/SmallVector.h"
21*ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h"
22*ef27db87SMehdi Amini #include "llvm/ADT/Triple.h"
23*ef27db87SMehdi Amini #include "llvm/ADT/Twine.h"
24*ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
25*ef27db87SMehdi Amini #include "llvm/Bitcode/BitstreamReader.h"
26*ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
27*ef27db87SMehdi Amini #include "llvm/IR/Argument.h"
28*ef27db87SMehdi Amini #include "llvm/IR/Attributes.h"
29*ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
30*ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
31*ef27db87SMehdi Amini #include "llvm/IR/CallSite.h"
32*ef27db87SMehdi Amini #include "llvm/IR/CallingConv.h"
33*ef27db87SMehdi Amini #include "llvm/IR/Comdat.h"
34*ef27db87SMehdi Amini #include "llvm/IR/Constant.h"
35*ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
36*ef27db87SMehdi Amini #include "llvm/IR/DebugInfo.h"
37*ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
38*ef27db87SMehdi Amini #include "llvm/IR/DebugLoc.h"
39*ef27db87SMehdi Amini #include "llvm/IR/DerivedTypes.h"
40*ef27db87SMehdi Amini #include "llvm/IR/DiagnosticInfo.h"
41*ef27db87SMehdi Amini #include "llvm/IR/DiagnosticPrinter.h"
42*ef27db87SMehdi Amini #include "llvm/IR/Function.h"
43*ef27db87SMehdi Amini #include "llvm/IR/GVMaterializer.h"
44*ef27db87SMehdi Amini #include "llvm/IR/GlobalAlias.h"
45*ef27db87SMehdi Amini #include "llvm/IR/GlobalIFunc.h"
46*ef27db87SMehdi Amini #include "llvm/IR/GlobalIndirectSymbol.h"
47*ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
48*ef27db87SMehdi Amini #include "llvm/IR/GlobalValue.h"
49*ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
50*ef27db87SMehdi Amini #include "llvm/IR/InlineAsm.h"
51*ef27db87SMehdi Amini #include "llvm/IR/InstrTypes.h"
52*ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
53*ef27db87SMehdi Amini #include "llvm/IR/Instructions.h"
54*ef27db87SMehdi Amini #include "llvm/IR/Intrinsics.h"
55*ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
56*ef27db87SMehdi Amini #include "llvm/IR/Module.h"
57*ef27db87SMehdi Amini #include "llvm/IR/ModuleSummaryIndex.h"
58*ef27db87SMehdi Amini #include "llvm/IR/OperandTraits.h"
59*ef27db87SMehdi Amini #include "llvm/IR/Operator.h"
60*ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
61*ef27db87SMehdi Amini #include "llvm/IR/Type.h"
62*ef27db87SMehdi Amini #include "llvm/IR/ValueHandle.h"
63*ef27db87SMehdi Amini #include "llvm/Support/AtomicOrdering.h"
64*ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
65*ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
66*ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
67*ef27db87SMehdi Amini #include "llvm/Support/Debug.h"
68*ef27db87SMehdi Amini #include "llvm/Support/Error.h"
69*ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
70*ef27db87SMehdi Amini #include "llvm/Support/ManagedStatic.h"
71*ef27db87SMehdi Amini #include "llvm/Support/MemoryBuffer.h"
72*ef27db87SMehdi Amini #include "llvm/Support/raw_ostream.h"
73*ef27db87SMehdi Amini #include <algorithm>
74*ef27db87SMehdi Amini #include <cassert>
75*ef27db87SMehdi Amini #include <cstddef>
76*ef27db87SMehdi Amini #include <cstdint>
77*ef27db87SMehdi Amini #include <deque>
78*ef27db87SMehdi Amini #include <limits>
79*ef27db87SMehdi Amini #include <map>
80*ef27db87SMehdi Amini #include <memory>
81*ef27db87SMehdi Amini #include <string>
82*ef27db87SMehdi Amini #include <system_error>
83*ef27db87SMehdi Amini #include <tuple>
84*ef27db87SMehdi Amini #include <utility>
85*ef27db87SMehdi Amini #include <vector>
86*ef27db87SMehdi Amini 
87*ef27db87SMehdi Amini using namespace llvm;
88*ef27db87SMehdi Amini 
89*ef27db87SMehdi Amini namespace {
90*ef27db87SMehdi Amini 
91*ef27db87SMehdi Amini static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; }
92*ef27db87SMehdi Amini 
93*ef27db87SMehdi Amini class BitcodeReaderMetadataList {
94*ef27db87SMehdi Amini   unsigned NumFwdRefs;
95*ef27db87SMehdi Amini   bool AnyFwdRefs;
96*ef27db87SMehdi Amini   unsigned MinFwdRef;
97*ef27db87SMehdi Amini   unsigned MaxFwdRef;
98*ef27db87SMehdi Amini 
99*ef27db87SMehdi Amini   /// Array of metadata references.
100*ef27db87SMehdi Amini   ///
101*ef27db87SMehdi Amini   /// Don't use std::vector here.  Some versions of libc++ copy (instead of
102*ef27db87SMehdi Amini   /// move) on resize, and TrackingMDRef is very expensive to copy.
103*ef27db87SMehdi Amini   SmallVector<TrackingMDRef, 1> MetadataPtrs;
104*ef27db87SMehdi Amini 
105*ef27db87SMehdi Amini   /// Structures for resolving old type refs.
106*ef27db87SMehdi Amini   struct {
107*ef27db87SMehdi Amini     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
108*ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
109*ef27db87SMehdi Amini     SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
110*ef27db87SMehdi Amini     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
111*ef27db87SMehdi Amini   } OldTypeRefs;
112*ef27db87SMehdi Amini 
113*ef27db87SMehdi Amini   LLVMContext &Context;
114*ef27db87SMehdi Amini 
115*ef27db87SMehdi Amini public:
116*ef27db87SMehdi Amini   BitcodeReaderMetadataList(LLVMContext &C)
117*ef27db87SMehdi Amini       : NumFwdRefs(0), AnyFwdRefs(false), Context(C) {}
118*ef27db87SMehdi Amini 
119*ef27db87SMehdi Amini   // vector compatibility methods
120*ef27db87SMehdi Amini   unsigned size() const { return MetadataPtrs.size(); }
121*ef27db87SMehdi Amini   void resize(unsigned N) { MetadataPtrs.resize(N); }
122*ef27db87SMehdi Amini   void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
123*ef27db87SMehdi Amini   void clear() { MetadataPtrs.clear(); }
124*ef27db87SMehdi Amini   Metadata *back() const { return MetadataPtrs.back(); }
125*ef27db87SMehdi Amini   void pop_back() { MetadataPtrs.pop_back(); }
126*ef27db87SMehdi Amini   bool empty() const { return MetadataPtrs.empty(); }
127*ef27db87SMehdi Amini 
128*ef27db87SMehdi Amini   Metadata *operator[](unsigned i) const {
129*ef27db87SMehdi Amini     assert(i < MetadataPtrs.size());
130*ef27db87SMehdi Amini     return MetadataPtrs[i];
131*ef27db87SMehdi Amini   }
132*ef27db87SMehdi Amini 
133*ef27db87SMehdi Amini   Metadata *lookup(unsigned I) const {
134*ef27db87SMehdi Amini     if (I < MetadataPtrs.size())
135*ef27db87SMehdi Amini       return MetadataPtrs[I];
136*ef27db87SMehdi Amini     return nullptr;
137*ef27db87SMehdi Amini   }
138*ef27db87SMehdi Amini 
139*ef27db87SMehdi Amini   void shrinkTo(unsigned N) {
140*ef27db87SMehdi Amini     assert(N <= size() && "Invalid shrinkTo request!");
141*ef27db87SMehdi Amini     assert(!AnyFwdRefs && "Unexpected forward refs");
142*ef27db87SMehdi Amini     MetadataPtrs.resize(N);
143*ef27db87SMehdi Amini   }
144*ef27db87SMehdi Amini 
145*ef27db87SMehdi Amini   /// Return the given metadata, creating a replaceable forward reference if
146*ef27db87SMehdi Amini   /// necessary.
147*ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx);
148*ef27db87SMehdi Amini 
149*ef27db87SMehdi Amini   /// Return the the given metadata only if it is fully resolved.
150*ef27db87SMehdi Amini   ///
151*ef27db87SMehdi Amini   /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
152*ef27db87SMehdi Amini   /// would give \c false.
153*ef27db87SMehdi Amini   Metadata *getMetadataIfResolved(unsigned Idx);
154*ef27db87SMehdi Amini 
155*ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
156*ef27db87SMehdi Amini   void assignValue(Metadata *MD, unsigned Idx);
157*ef27db87SMehdi Amini   void tryToResolveCycles();
158*ef27db87SMehdi Amini   bool hasFwdRefs() const { return AnyFwdRefs; }
159*ef27db87SMehdi Amini 
160*ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
161*ef27db87SMehdi Amini   void addTypeRef(MDString &UUID, DICompositeType &CT);
162*ef27db87SMehdi Amini 
163*ef27db87SMehdi Amini   /// Upgrade a type that had an MDString reference.
164*ef27db87SMehdi Amini   Metadata *upgradeTypeRef(Metadata *MaybeUUID);
165*ef27db87SMehdi Amini 
166*ef27db87SMehdi Amini   /// Upgrade a type ref array that may have MDString references.
167*ef27db87SMehdi Amini   Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
168*ef27db87SMehdi Amini 
169*ef27db87SMehdi Amini private:
170*ef27db87SMehdi Amini   Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
171*ef27db87SMehdi Amini };
172*ef27db87SMehdi Amini 
173*ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
174*ef27db87SMehdi Amini   if (Idx == size()) {
175*ef27db87SMehdi Amini     push_back(MD);
176*ef27db87SMehdi Amini     return;
177*ef27db87SMehdi Amini   }
178*ef27db87SMehdi Amini 
179*ef27db87SMehdi Amini   if (Idx >= size())
180*ef27db87SMehdi Amini     resize(Idx + 1);
181*ef27db87SMehdi Amini 
182*ef27db87SMehdi Amini   TrackingMDRef &OldMD = MetadataPtrs[Idx];
183*ef27db87SMehdi Amini   if (!OldMD) {
184*ef27db87SMehdi Amini     OldMD.reset(MD);
185*ef27db87SMehdi Amini     return;
186*ef27db87SMehdi Amini   }
187*ef27db87SMehdi Amini 
188*ef27db87SMehdi Amini   // If there was a forward reference to this value, replace it.
189*ef27db87SMehdi Amini   TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
190*ef27db87SMehdi Amini   PrevMD->replaceAllUsesWith(MD);
191*ef27db87SMehdi Amini   --NumFwdRefs;
192*ef27db87SMehdi Amini }
193*ef27db87SMehdi Amini 
194*ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
195*ef27db87SMehdi Amini   if (Idx >= size())
196*ef27db87SMehdi Amini     resize(Idx + 1);
197*ef27db87SMehdi Amini 
198*ef27db87SMehdi Amini   if (Metadata *MD = MetadataPtrs[Idx])
199*ef27db87SMehdi Amini     return MD;
200*ef27db87SMehdi Amini 
201*ef27db87SMehdi Amini   // Track forward refs to be resolved later.
202*ef27db87SMehdi Amini   if (AnyFwdRefs) {
203*ef27db87SMehdi Amini     MinFwdRef = std::min(MinFwdRef, Idx);
204*ef27db87SMehdi Amini     MaxFwdRef = std::max(MaxFwdRef, Idx);
205*ef27db87SMehdi Amini   } else {
206*ef27db87SMehdi Amini     AnyFwdRefs = true;
207*ef27db87SMehdi Amini     MinFwdRef = MaxFwdRef = Idx;
208*ef27db87SMehdi Amini   }
209*ef27db87SMehdi Amini   ++NumFwdRefs;
210*ef27db87SMehdi Amini 
211*ef27db87SMehdi Amini   // Create and return a placeholder, which will later be RAUW'd.
212*ef27db87SMehdi Amini   Metadata *MD = MDNode::getTemporary(Context, None).release();
213*ef27db87SMehdi Amini   MetadataPtrs[Idx].reset(MD);
214*ef27db87SMehdi Amini   return MD;
215*ef27db87SMehdi Amini }
216*ef27db87SMehdi Amini 
217*ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
218*ef27db87SMehdi Amini   Metadata *MD = lookup(Idx);
219*ef27db87SMehdi Amini   if (auto *N = dyn_cast_or_null<MDNode>(MD))
220*ef27db87SMehdi Amini     if (!N->isResolved())
221*ef27db87SMehdi Amini       return nullptr;
222*ef27db87SMehdi Amini   return MD;
223*ef27db87SMehdi Amini }
224*ef27db87SMehdi Amini 
225*ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
226*ef27db87SMehdi Amini   return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
227*ef27db87SMehdi Amini }
228*ef27db87SMehdi Amini 
229*ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
230*ef27db87SMehdi Amini   if (NumFwdRefs)
231*ef27db87SMehdi Amini     // Still forward references... can't resolve cycles.
232*ef27db87SMehdi Amini     return;
233*ef27db87SMehdi Amini 
234*ef27db87SMehdi Amini   bool DidReplaceTypeRefs = false;
235*ef27db87SMehdi Amini 
236*ef27db87SMehdi Amini   // Give up on finding a full definition for any forward decls that remain.
237*ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.FwdDecls)
238*ef27db87SMehdi Amini     OldTypeRefs.Final.insert(Ref);
239*ef27db87SMehdi Amini   OldTypeRefs.FwdDecls.clear();
240*ef27db87SMehdi Amini 
241*ef27db87SMehdi Amini   // Upgrade from old type ref arrays.  In strange cases, this could add to
242*ef27db87SMehdi Amini   // OldTypeRefs.Unknown.
243*ef27db87SMehdi Amini   for (const auto &Array : OldTypeRefs.Arrays) {
244*ef27db87SMehdi Amini     DidReplaceTypeRefs = true;
245*ef27db87SMehdi Amini     Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
246*ef27db87SMehdi Amini   }
247*ef27db87SMehdi Amini   OldTypeRefs.Arrays.clear();
248*ef27db87SMehdi Amini 
249*ef27db87SMehdi Amini   // Replace old string-based type refs with the resolved node, if possible.
250*ef27db87SMehdi Amini   // If we haven't seen the node, leave it to the verifier to complain about
251*ef27db87SMehdi Amini   // the invalid string reference.
252*ef27db87SMehdi Amini   for (const auto &Ref : OldTypeRefs.Unknown) {
253*ef27db87SMehdi Amini     DidReplaceTypeRefs = true;
254*ef27db87SMehdi Amini     if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
255*ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(CT);
256*ef27db87SMehdi Amini     else
257*ef27db87SMehdi Amini       Ref.second->replaceAllUsesWith(Ref.first);
258*ef27db87SMehdi Amini   }
259*ef27db87SMehdi Amini   OldTypeRefs.Unknown.clear();
260*ef27db87SMehdi Amini 
261*ef27db87SMehdi Amini   // Make sure all the upgraded types are resolved.
262*ef27db87SMehdi Amini   if (DidReplaceTypeRefs) {
263*ef27db87SMehdi Amini     AnyFwdRefs = true;
264*ef27db87SMehdi Amini     MinFwdRef = 0;
265*ef27db87SMehdi Amini     MaxFwdRef = MetadataPtrs.size() - 1;
266*ef27db87SMehdi Amini   }
267*ef27db87SMehdi Amini 
268*ef27db87SMehdi Amini   if (!AnyFwdRefs)
269*ef27db87SMehdi Amini     // Nothing to do.
270*ef27db87SMehdi Amini     return;
271*ef27db87SMehdi Amini 
272*ef27db87SMehdi Amini   // Resolve any cycles.
273*ef27db87SMehdi Amini   for (unsigned I = MinFwdRef, E = MaxFwdRef + 1; I != E; ++I) {
274*ef27db87SMehdi Amini     auto &MD = MetadataPtrs[I];
275*ef27db87SMehdi Amini     auto *N = dyn_cast_or_null<MDNode>(MD);
276*ef27db87SMehdi Amini     if (!N)
277*ef27db87SMehdi Amini       continue;
278*ef27db87SMehdi Amini 
279*ef27db87SMehdi Amini     assert(!N->isTemporary() && "Unexpected forward reference");
280*ef27db87SMehdi Amini     N->resolveCycles();
281*ef27db87SMehdi Amini   }
282*ef27db87SMehdi Amini 
283*ef27db87SMehdi Amini   // Make sure we return early again until there's another forward ref.
284*ef27db87SMehdi Amini   AnyFwdRefs = false;
285*ef27db87SMehdi Amini }
286*ef27db87SMehdi Amini 
287*ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
288*ef27db87SMehdi Amini                                            DICompositeType &CT) {
289*ef27db87SMehdi Amini   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
290*ef27db87SMehdi Amini   if (CT.isForwardDecl())
291*ef27db87SMehdi Amini     OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
292*ef27db87SMehdi Amini   else
293*ef27db87SMehdi Amini     OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
294*ef27db87SMehdi Amini }
295*ef27db87SMehdi Amini 
296*ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
297*ef27db87SMehdi Amini   auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
298*ef27db87SMehdi Amini   if (LLVM_LIKELY(!UUID))
299*ef27db87SMehdi Amini     return MaybeUUID;
300*ef27db87SMehdi Amini 
301*ef27db87SMehdi Amini   if (auto *CT = OldTypeRefs.Final.lookup(UUID))
302*ef27db87SMehdi Amini     return CT;
303*ef27db87SMehdi Amini 
304*ef27db87SMehdi Amini   auto &Ref = OldTypeRefs.Unknown[UUID];
305*ef27db87SMehdi Amini   if (!Ref)
306*ef27db87SMehdi Amini     Ref = MDNode::getTemporary(Context, None);
307*ef27db87SMehdi Amini   return Ref.get();
308*ef27db87SMehdi Amini }
309*ef27db87SMehdi Amini 
310*ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
311*ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
312*ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
313*ef27db87SMehdi Amini     return MaybeTuple;
314*ef27db87SMehdi Amini 
315*ef27db87SMehdi Amini   // Look through the array immediately if possible.
316*ef27db87SMehdi Amini   if (!Tuple->isTemporary())
317*ef27db87SMehdi Amini     return resolveTypeRefArray(Tuple);
318*ef27db87SMehdi Amini 
319*ef27db87SMehdi Amini   // Create and return a placeholder to use for now.  Eventually
320*ef27db87SMehdi Amini   // resolveTypeRefArrays() will be resolve this forward reference.
321*ef27db87SMehdi Amini   OldTypeRefs.Arrays.emplace_back(
322*ef27db87SMehdi Amini       std::piecewise_construct, std::forward_as_tuple(Tuple),
323*ef27db87SMehdi Amini       std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
324*ef27db87SMehdi Amini   return OldTypeRefs.Arrays.back().second.get();
325*ef27db87SMehdi Amini }
326*ef27db87SMehdi Amini 
327*ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
328*ef27db87SMehdi Amini   auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
329*ef27db87SMehdi Amini   if (!Tuple || Tuple->isDistinct())
330*ef27db87SMehdi Amini     return MaybeTuple;
331*ef27db87SMehdi Amini 
332*ef27db87SMehdi Amini   // Look through the DITypeRefArray, upgrading each DITypeRef.
333*ef27db87SMehdi Amini   SmallVector<Metadata *, 32> Ops;
334*ef27db87SMehdi Amini   Ops.reserve(Tuple->getNumOperands());
335*ef27db87SMehdi Amini   for (Metadata *MD : Tuple->operands())
336*ef27db87SMehdi Amini     Ops.push_back(upgradeTypeRef(MD));
337*ef27db87SMehdi Amini 
338*ef27db87SMehdi Amini   return MDTuple::get(Context, Ops);
339*ef27db87SMehdi Amini }
340*ef27db87SMehdi Amini 
341*ef27db87SMehdi Amini namespace {
342*ef27db87SMehdi Amini 
343*ef27db87SMehdi Amini class PlaceholderQueue {
344*ef27db87SMehdi Amini   // Placeholders would thrash around when moved, so store in a std::deque
345*ef27db87SMehdi Amini   // instead of some sort of vector.
346*ef27db87SMehdi Amini   std::deque<DistinctMDOperandPlaceholder> PHs;
347*ef27db87SMehdi Amini 
348*ef27db87SMehdi Amini public:
349*ef27db87SMehdi Amini   DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
350*ef27db87SMehdi Amini   void flush(BitcodeReaderMetadataList &MetadataList);
351*ef27db87SMehdi Amini };
352*ef27db87SMehdi Amini 
353*ef27db87SMehdi Amini } // end anonymous namespace
354*ef27db87SMehdi Amini 
355*ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
356*ef27db87SMehdi Amini   PHs.emplace_back(ID);
357*ef27db87SMehdi Amini   return PHs.back();
358*ef27db87SMehdi Amini }
359*ef27db87SMehdi Amini 
360*ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
361*ef27db87SMehdi Amini   while (!PHs.empty()) {
362*ef27db87SMehdi Amini     PHs.front().replaceUseWith(
363*ef27db87SMehdi Amini         MetadataList.getMetadataFwdRef(PHs.front().getID()));
364*ef27db87SMehdi Amini     PHs.pop_front();
365*ef27db87SMehdi Amini   }
366*ef27db87SMehdi Amini }
367*ef27db87SMehdi Amini 
368*ef27db87SMehdi Amini } // anonynous namespace
369*ef27db87SMehdi Amini 
370*ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
371*ef27db87SMehdi Amini   BitcodeReaderMetadataList MetadataList;
372*ef27db87SMehdi Amini   BitcodeReaderValueList &ValueList;
373*ef27db87SMehdi Amini   BitstreamCursor &Stream;
374*ef27db87SMehdi Amini   LLVMContext &Context;
375*ef27db87SMehdi Amini   Module &TheModule;
376*ef27db87SMehdi Amini   std::function<Type *(unsigned)> getTypeByID;
377*ef27db87SMehdi Amini 
378*ef27db87SMehdi Amini   /// Functions that need to be matched with subprograms when upgrading old
379*ef27db87SMehdi Amini   /// metadata.
380*ef27db87SMehdi Amini   SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
381*ef27db87SMehdi Amini 
382*ef27db87SMehdi Amini   // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
383*ef27db87SMehdi Amini   DenseMap<unsigned, unsigned> MDKindMap;
384*ef27db87SMehdi Amini 
385*ef27db87SMehdi Amini   bool HasSeenOldLoopTags = false;
386*ef27db87SMehdi Amini 
387*ef27db87SMehdi Amini   Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
388*ef27db87SMehdi Amini                              unsigned &NextMetadataNo);
389*ef27db87SMehdi Amini   Error parseGlobalObjectAttachment(GlobalObject &GO,
390*ef27db87SMehdi Amini                                     ArrayRef<uint64_t> Record);
391*ef27db87SMehdi Amini   Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
392*ef27db87SMehdi Amini 
393*ef27db87SMehdi Amini public:
394*ef27db87SMehdi Amini   MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
395*ef27db87SMehdi Amini                      BitcodeReaderValueList &ValueList,
396*ef27db87SMehdi Amini                      std::function<Type *(unsigned)> getTypeByID)
397*ef27db87SMehdi Amini       : MetadataList(TheModule.getContext()), ValueList(ValueList),
398*ef27db87SMehdi Amini         Stream(Stream), Context(TheModule.getContext()), TheModule(TheModule),
399*ef27db87SMehdi Amini         getTypeByID(getTypeByID) {}
400*ef27db87SMehdi Amini 
401*ef27db87SMehdi Amini   Error parseMetadata(bool ModuleLevel);
402*ef27db87SMehdi Amini 
403*ef27db87SMehdi Amini   bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
404*ef27db87SMehdi Amini   Metadata *getMetadataFwdRef(unsigned Idx) {
405*ef27db87SMehdi Amini     return MetadataList.getMetadataFwdRef(Idx);
406*ef27db87SMehdi Amini   }
407*ef27db87SMehdi Amini 
408*ef27db87SMehdi Amini   MDNode *getMDNodeFwdRefOrNull(unsigned Idx) {
409*ef27db87SMehdi Amini     return MetadataList.getMDNodeFwdRefOrNull(Idx);
410*ef27db87SMehdi Amini   }
411*ef27db87SMehdi Amini 
412*ef27db87SMehdi Amini   DISubprogram *lookupSubprogramForFunction(Function *F) {
413*ef27db87SMehdi Amini     return FunctionsWithSPs.lookup(F);
414*ef27db87SMehdi Amini   }
415*ef27db87SMehdi Amini 
416*ef27db87SMehdi Amini   bool hasSeenOldLoopTags() { return HasSeenOldLoopTags; }
417*ef27db87SMehdi Amini 
418*ef27db87SMehdi Amini   Error parseMetadataAttachment(
419*ef27db87SMehdi Amini       Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
420*ef27db87SMehdi Amini 
421*ef27db87SMehdi Amini   Error parseMetadataKinds();
422*ef27db87SMehdi Amini 
423*ef27db87SMehdi Amini   unsigned size() const { return MetadataList.size(); }
424*ef27db87SMehdi Amini   void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
425*ef27db87SMehdi Amini };
426*ef27db87SMehdi Amini 
427*ef27db87SMehdi Amini Error error(const Twine &Message) {
428*ef27db87SMehdi Amini   return make_error<StringError>(
429*ef27db87SMehdi Amini       Message, make_error_code(BitcodeError::CorruptedBitcode));
430*ef27db87SMehdi Amini }
431*ef27db87SMehdi Amini 
432*ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
433*ef27db87SMehdi Amini /// module level metadata.
434*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
435*ef27db87SMehdi Amini   if (!ModuleLevel && MetadataList.hasFwdRefs())
436*ef27db87SMehdi Amini     return error("Invalid metadata: fwd refs into function blocks");
437*ef27db87SMehdi Amini 
438*ef27db87SMehdi Amini   if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
439*ef27db87SMehdi Amini     return error("Invalid record");
440*ef27db87SMehdi Amini 
441*ef27db87SMehdi Amini   unsigned NextMetadataNo = MetadataList.size();
442*ef27db87SMehdi Amini   std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
443*ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
444*ef27db87SMehdi Amini 
445*ef27db87SMehdi Amini   PlaceholderQueue Placeholders;
446*ef27db87SMehdi Amini   bool IsDistinct;
447*ef27db87SMehdi Amini   auto getMD = [&](unsigned ID) -> Metadata * {
448*ef27db87SMehdi Amini     if (!IsDistinct)
449*ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID);
450*ef27db87SMehdi Amini     if (auto *MD = MetadataList.getMetadataIfResolved(ID))
451*ef27db87SMehdi Amini       return MD;
452*ef27db87SMehdi Amini     return &Placeholders.getPlaceholderOp(ID);
453*ef27db87SMehdi Amini   };
454*ef27db87SMehdi Amini   auto getMDOrNull = [&](unsigned ID) -> Metadata * {
455*ef27db87SMehdi Amini     if (ID)
456*ef27db87SMehdi Amini       return getMD(ID - 1);
457*ef27db87SMehdi Amini     return nullptr;
458*ef27db87SMehdi Amini   };
459*ef27db87SMehdi Amini   auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
460*ef27db87SMehdi Amini     if (ID)
461*ef27db87SMehdi Amini       return MetadataList.getMetadataFwdRef(ID - 1);
462*ef27db87SMehdi Amini     return nullptr;
463*ef27db87SMehdi Amini   };
464*ef27db87SMehdi Amini   auto getMDString = [&](unsigned ID) -> MDString * {
465*ef27db87SMehdi Amini     // This requires that the ID is not really a forward reference.  In
466*ef27db87SMehdi Amini     // particular, the MDString must already have been resolved.
467*ef27db87SMehdi Amini     return cast_or_null<MDString>(getMDOrNull(ID));
468*ef27db87SMehdi Amini   };
469*ef27db87SMehdi Amini 
470*ef27db87SMehdi Amini   // Support for old type refs.
471*ef27db87SMehdi Amini   auto getDITypeRefOrNull = [&](unsigned ID) {
472*ef27db87SMehdi Amini     return MetadataList.upgradeTypeRef(getMDOrNull(ID));
473*ef27db87SMehdi Amini   };
474*ef27db87SMehdi Amini 
475*ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS)                                           \
476*ef27db87SMehdi Amini   (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
477*ef27db87SMehdi Amini 
478*ef27db87SMehdi Amini   // Read all the records.
479*ef27db87SMehdi Amini   while (true) {
480*ef27db87SMehdi Amini     BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
481*ef27db87SMehdi Amini 
482*ef27db87SMehdi Amini     switch (Entry.Kind) {
483*ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
484*ef27db87SMehdi Amini     case BitstreamEntry::Error:
485*ef27db87SMehdi Amini       return error("Malformed block");
486*ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
487*ef27db87SMehdi Amini       // Upgrade old-style CU <-> SP pointers to point from SP to CU.
488*ef27db87SMehdi Amini       for (auto CU_SP : CUSubprograms)
489*ef27db87SMehdi Amini         if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
490*ef27db87SMehdi Amini           for (auto &Op : SPs->operands())
491*ef27db87SMehdi Amini             if (auto *SP = dyn_cast_or_null<MDNode>(Op))
492*ef27db87SMehdi Amini               SP->replaceOperandWith(7, CU_SP.first);
493*ef27db87SMehdi Amini 
494*ef27db87SMehdi Amini       MetadataList.tryToResolveCycles();
495*ef27db87SMehdi Amini       Placeholders.flush(MetadataList);
496*ef27db87SMehdi Amini       return Error::success();
497*ef27db87SMehdi Amini     case BitstreamEntry::Record:
498*ef27db87SMehdi Amini       // The interesting case.
499*ef27db87SMehdi Amini       break;
500*ef27db87SMehdi Amini     }
501*ef27db87SMehdi Amini 
502*ef27db87SMehdi Amini     // Read a record.
503*ef27db87SMehdi Amini     Record.clear();
504*ef27db87SMehdi Amini     StringRef Blob;
505*ef27db87SMehdi Amini     unsigned Code = Stream.readRecord(Entry.ID, Record, &Blob);
506*ef27db87SMehdi Amini     IsDistinct = false;
507*ef27db87SMehdi Amini     switch (Code) {
508*ef27db87SMehdi Amini     default: // Default behavior: ignore.
509*ef27db87SMehdi Amini       break;
510*ef27db87SMehdi Amini     case bitc::METADATA_NAME: {
511*ef27db87SMehdi Amini       // Read name of the named metadata.
512*ef27db87SMehdi Amini       SmallString<8> Name(Record.begin(), Record.end());
513*ef27db87SMehdi Amini       Record.clear();
514*ef27db87SMehdi Amini       Code = Stream.ReadCode();
515*ef27db87SMehdi Amini 
516*ef27db87SMehdi Amini       unsigned NextBitCode = Stream.readRecord(Code, Record);
517*ef27db87SMehdi Amini       if (NextBitCode != bitc::METADATA_NAMED_NODE)
518*ef27db87SMehdi Amini         return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
519*ef27db87SMehdi Amini 
520*ef27db87SMehdi Amini       // Read named metadata elements.
521*ef27db87SMehdi Amini       unsigned Size = Record.size();
522*ef27db87SMehdi Amini       NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
523*ef27db87SMehdi Amini       for (unsigned i = 0; i != Size; ++i) {
524*ef27db87SMehdi Amini         MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
525*ef27db87SMehdi Amini         if (!MD)
526*ef27db87SMehdi Amini           return error("Invalid record");
527*ef27db87SMehdi Amini         NMD->addOperand(MD);
528*ef27db87SMehdi Amini       }
529*ef27db87SMehdi Amini       break;
530*ef27db87SMehdi Amini     }
531*ef27db87SMehdi Amini     case bitc::METADATA_OLD_FN_NODE: {
532*ef27db87SMehdi Amini       // FIXME: Remove in 4.0.
533*ef27db87SMehdi Amini       // This is a LocalAsMetadata record, the only type of function-local
534*ef27db87SMehdi Amini       // metadata.
535*ef27db87SMehdi Amini       if (Record.size() % 2 == 1)
536*ef27db87SMehdi Amini         return error("Invalid record");
537*ef27db87SMehdi Amini 
538*ef27db87SMehdi Amini       // If this isn't a LocalAsMetadata record, we're dropping it.  This used
539*ef27db87SMehdi Amini       // to be legal, but there's no upgrade path.
540*ef27db87SMehdi Amini       auto dropRecord = [&] {
541*ef27db87SMehdi Amini         MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo++);
542*ef27db87SMehdi Amini       };
543*ef27db87SMehdi Amini       if (Record.size() != 2) {
544*ef27db87SMehdi Amini         dropRecord();
545*ef27db87SMehdi Amini         break;
546*ef27db87SMehdi Amini       }
547*ef27db87SMehdi Amini 
548*ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[0]);
549*ef27db87SMehdi Amini       if (Ty->isMetadataTy() || Ty->isVoidTy()) {
550*ef27db87SMehdi Amini         dropRecord();
551*ef27db87SMehdi Amini         break;
552*ef27db87SMehdi Amini       }
553*ef27db87SMehdi Amini 
554*ef27db87SMehdi Amini       MetadataList.assignValue(
555*ef27db87SMehdi Amini           LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
556*ef27db87SMehdi Amini           NextMetadataNo++);
557*ef27db87SMehdi Amini       break;
558*ef27db87SMehdi Amini     }
559*ef27db87SMehdi Amini     case bitc::METADATA_OLD_NODE: {
560*ef27db87SMehdi Amini       // FIXME: Remove in 4.0.
561*ef27db87SMehdi Amini       if (Record.size() % 2 == 1)
562*ef27db87SMehdi Amini         return error("Invalid record");
563*ef27db87SMehdi Amini 
564*ef27db87SMehdi Amini       unsigned Size = Record.size();
565*ef27db87SMehdi Amini       SmallVector<Metadata *, 8> Elts;
566*ef27db87SMehdi Amini       for (unsigned i = 0; i != Size; i += 2) {
567*ef27db87SMehdi Amini         Type *Ty = getTypeByID(Record[i]);
568*ef27db87SMehdi Amini         if (!Ty)
569*ef27db87SMehdi Amini           return error("Invalid record");
570*ef27db87SMehdi Amini         if (Ty->isMetadataTy())
571*ef27db87SMehdi Amini           Elts.push_back(getMD(Record[i + 1]));
572*ef27db87SMehdi Amini         else if (!Ty->isVoidTy()) {
573*ef27db87SMehdi Amini           auto *MD =
574*ef27db87SMehdi Amini               ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
575*ef27db87SMehdi Amini           assert(isa<ConstantAsMetadata>(MD) &&
576*ef27db87SMehdi Amini                  "Expected non-function-local metadata");
577*ef27db87SMehdi Amini           Elts.push_back(MD);
578*ef27db87SMehdi Amini         } else
579*ef27db87SMehdi Amini           Elts.push_back(nullptr);
580*ef27db87SMehdi Amini       }
581*ef27db87SMehdi Amini       MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo++);
582*ef27db87SMehdi Amini       break;
583*ef27db87SMehdi Amini     }
584*ef27db87SMehdi Amini     case bitc::METADATA_VALUE: {
585*ef27db87SMehdi Amini       if (Record.size() != 2)
586*ef27db87SMehdi Amini         return error("Invalid record");
587*ef27db87SMehdi Amini 
588*ef27db87SMehdi Amini       Type *Ty = getTypeByID(Record[0]);
589*ef27db87SMehdi Amini       if (Ty->isMetadataTy() || Ty->isVoidTy())
590*ef27db87SMehdi Amini         return error("Invalid record");
591*ef27db87SMehdi Amini 
592*ef27db87SMehdi Amini       MetadataList.assignValue(
593*ef27db87SMehdi Amini           ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
594*ef27db87SMehdi Amini           NextMetadataNo++);
595*ef27db87SMehdi Amini       break;
596*ef27db87SMehdi Amini     }
597*ef27db87SMehdi Amini     case bitc::METADATA_DISTINCT_NODE:
598*ef27db87SMehdi Amini       IsDistinct = true;
599*ef27db87SMehdi Amini       LLVM_FALLTHROUGH;
600*ef27db87SMehdi Amini     case bitc::METADATA_NODE: {
601*ef27db87SMehdi Amini       SmallVector<Metadata *, 8> Elts;
602*ef27db87SMehdi Amini       Elts.reserve(Record.size());
603*ef27db87SMehdi Amini       for (unsigned ID : Record)
604*ef27db87SMehdi Amini         Elts.push_back(getMDOrNull(ID));
605*ef27db87SMehdi Amini       MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
606*ef27db87SMehdi Amini                                           : MDNode::get(Context, Elts),
607*ef27db87SMehdi Amini                                NextMetadataNo++);
608*ef27db87SMehdi Amini       break;
609*ef27db87SMehdi Amini     }
610*ef27db87SMehdi Amini     case bitc::METADATA_LOCATION: {
611*ef27db87SMehdi Amini       if (Record.size() != 5)
612*ef27db87SMehdi Amini         return error("Invalid record");
613*ef27db87SMehdi Amini 
614*ef27db87SMehdi Amini       IsDistinct = Record[0];
615*ef27db87SMehdi Amini       unsigned Line = Record[1];
616*ef27db87SMehdi Amini       unsigned Column = Record[2];
617*ef27db87SMehdi Amini       Metadata *Scope = getMD(Record[3]);
618*ef27db87SMehdi Amini       Metadata *InlinedAt = getMDOrNull(Record[4]);
619*ef27db87SMehdi Amini       MetadataList.assignValue(
620*ef27db87SMehdi Amini           GET_OR_DISTINCT(DILocation,
621*ef27db87SMehdi Amini                           (Context, Line, Column, Scope, InlinedAt)),
622*ef27db87SMehdi Amini           NextMetadataNo++);
623*ef27db87SMehdi Amini       break;
624*ef27db87SMehdi Amini     }
625*ef27db87SMehdi Amini     case bitc::METADATA_GENERIC_DEBUG: {
626*ef27db87SMehdi Amini       if (Record.size() < 4)
627*ef27db87SMehdi Amini         return error("Invalid record");
628*ef27db87SMehdi Amini 
629*ef27db87SMehdi Amini       IsDistinct = Record[0];
630*ef27db87SMehdi Amini       unsigned Tag = Record[1];
631*ef27db87SMehdi Amini       unsigned Version = Record[2];
632*ef27db87SMehdi Amini 
633*ef27db87SMehdi Amini       if (Tag >= 1u << 16 || Version != 0)
634*ef27db87SMehdi Amini         return error("Invalid record");
635*ef27db87SMehdi Amini 
636*ef27db87SMehdi Amini       auto *Header = getMDString(Record[3]);
637*ef27db87SMehdi Amini       SmallVector<Metadata *, 8> DwarfOps;
638*ef27db87SMehdi Amini       for (unsigned I = 4, E = Record.size(); I != E; ++I)
639*ef27db87SMehdi Amini         DwarfOps.push_back(getMDOrNull(Record[I]));
640*ef27db87SMehdi Amini       MetadataList.assignValue(
641*ef27db87SMehdi Amini           GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
642*ef27db87SMehdi Amini           NextMetadataNo++);
643*ef27db87SMehdi Amini       break;
644*ef27db87SMehdi Amini     }
645*ef27db87SMehdi Amini     case bitc::METADATA_SUBRANGE: {
646*ef27db87SMehdi Amini       if (Record.size() != 3)
647*ef27db87SMehdi Amini         return error("Invalid record");
648*ef27db87SMehdi Amini 
649*ef27db87SMehdi Amini       IsDistinct = Record[0];
650*ef27db87SMehdi Amini       MetadataList.assignValue(
651*ef27db87SMehdi Amini           GET_OR_DISTINCT(DISubrange,
652*ef27db87SMehdi Amini                           (Context, Record[1], unrotateSign(Record[2]))),
653*ef27db87SMehdi Amini           NextMetadataNo++);
654*ef27db87SMehdi Amini       break;
655*ef27db87SMehdi Amini     }
656*ef27db87SMehdi Amini     case bitc::METADATA_ENUMERATOR: {
657*ef27db87SMehdi Amini       if (Record.size() != 3)
658*ef27db87SMehdi Amini         return error("Invalid record");
659*ef27db87SMehdi Amini 
660*ef27db87SMehdi Amini       IsDistinct = Record[0];
661*ef27db87SMehdi Amini       MetadataList.assignValue(
662*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIEnumerator, (Context, unrotateSign(Record[1]),
663*ef27db87SMehdi Amini                                          getMDString(Record[2]))),
664*ef27db87SMehdi Amini           NextMetadataNo++);
665*ef27db87SMehdi Amini       break;
666*ef27db87SMehdi Amini     }
667*ef27db87SMehdi Amini     case bitc::METADATA_BASIC_TYPE: {
668*ef27db87SMehdi Amini       if (Record.size() != 6)
669*ef27db87SMehdi Amini         return error("Invalid record");
670*ef27db87SMehdi Amini 
671*ef27db87SMehdi Amini       IsDistinct = Record[0];
672*ef27db87SMehdi Amini       MetadataList.assignValue(
673*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIBasicType,
674*ef27db87SMehdi Amini                           (Context, Record[1], getMDString(Record[2]),
675*ef27db87SMehdi Amini                            Record[3], Record[4], Record[5])),
676*ef27db87SMehdi Amini           NextMetadataNo++);
677*ef27db87SMehdi Amini       break;
678*ef27db87SMehdi Amini     }
679*ef27db87SMehdi Amini     case bitc::METADATA_DERIVED_TYPE: {
680*ef27db87SMehdi Amini       if (Record.size() != 12)
681*ef27db87SMehdi Amini         return error("Invalid record");
682*ef27db87SMehdi Amini 
683*ef27db87SMehdi Amini       IsDistinct = Record[0];
684*ef27db87SMehdi Amini       DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
685*ef27db87SMehdi Amini       MetadataList.assignValue(
686*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIDerivedType,
687*ef27db87SMehdi Amini                           (Context, Record[1], getMDString(Record[2]),
688*ef27db87SMehdi Amini                            getMDOrNull(Record[3]), Record[4],
689*ef27db87SMehdi Amini                            getDITypeRefOrNull(Record[5]),
690*ef27db87SMehdi Amini                            getDITypeRefOrNull(Record[6]), Record[7], Record[8],
691*ef27db87SMehdi Amini                            Record[9], Flags, getDITypeRefOrNull(Record[11]))),
692*ef27db87SMehdi Amini           NextMetadataNo++);
693*ef27db87SMehdi Amini       break;
694*ef27db87SMehdi Amini     }
695*ef27db87SMehdi Amini     case bitc::METADATA_COMPOSITE_TYPE: {
696*ef27db87SMehdi Amini       if (Record.size() != 16)
697*ef27db87SMehdi Amini         return error("Invalid record");
698*ef27db87SMehdi Amini 
699*ef27db87SMehdi Amini       // If we have a UUID and this is not a forward declaration, lookup the
700*ef27db87SMehdi Amini       // mapping.
701*ef27db87SMehdi Amini       IsDistinct = Record[0] & 0x1;
702*ef27db87SMehdi Amini       bool IsNotUsedInTypeRef = Record[0] >= 2;
703*ef27db87SMehdi Amini       unsigned Tag = Record[1];
704*ef27db87SMehdi Amini       MDString *Name = getMDString(Record[2]);
705*ef27db87SMehdi Amini       Metadata *File = getMDOrNull(Record[3]);
706*ef27db87SMehdi Amini       unsigned Line = Record[4];
707*ef27db87SMehdi Amini       Metadata *Scope = getDITypeRefOrNull(Record[5]);
708*ef27db87SMehdi Amini       Metadata *BaseType = getDITypeRefOrNull(Record[6]);
709*ef27db87SMehdi Amini       uint64_t SizeInBits = Record[7];
710*ef27db87SMehdi Amini       if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
711*ef27db87SMehdi Amini         return error("Alignment value is too large");
712*ef27db87SMehdi Amini       uint32_t AlignInBits = Record[8];
713*ef27db87SMehdi Amini       uint64_t OffsetInBits = Record[9];
714*ef27db87SMehdi Amini       DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
715*ef27db87SMehdi Amini       Metadata *Elements = getMDOrNull(Record[11]);
716*ef27db87SMehdi Amini       unsigned RuntimeLang = Record[12];
717*ef27db87SMehdi Amini       Metadata *VTableHolder = getDITypeRefOrNull(Record[13]);
718*ef27db87SMehdi Amini       Metadata *TemplateParams = getMDOrNull(Record[14]);
719*ef27db87SMehdi Amini       auto *Identifier = getMDString(Record[15]);
720*ef27db87SMehdi Amini       DICompositeType *CT = nullptr;
721*ef27db87SMehdi Amini       if (Identifier)
722*ef27db87SMehdi Amini         CT = DICompositeType::buildODRType(
723*ef27db87SMehdi Amini             Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
724*ef27db87SMehdi Amini             SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
725*ef27db87SMehdi Amini             VTableHolder, TemplateParams);
726*ef27db87SMehdi Amini 
727*ef27db87SMehdi Amini       // Create a node if we didn't get a lazy ODR type.
728*ef27db87SMehdi Amini       if (!CT)
729*ef27db87SMehdi Amini         CT = GET_OR_DISTINCT(DICompositeType,
730*ef27db87SMehdi Amini                              (Context, Tag, Name, File, Line, Scope, BaseType,
731*ef27db87SMehdi Amini                               SizeInBits, AlignInBits, OffsetInBits, Flags,
732*ef27db87SMehdi Amini                               Elements, RuntimeLang, VTableHolder,
733*ef27db87SMehdi Amini                               TemplateParams, Identifier));
734*ef27db87SMehdi Amini       if (!IsNotUsedInTypeRef && Identifier)
735*ef27db87SMehdi Amini         MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
736*ef27db87SMehdi Amini 
737*ef27db87SMehdi Amini       MetadataList.assignValue(CT, NextMetadataNo++);
738*ef27db87SMehdi Amini       break;
739*ef27db87SMehdi Amini     }
740*ef27db87SMehdi Amini     case bitc::METADATA_SUBROUTINE_TYPE: {
741*ef27db87SMehdi Amini       if (Record.size() < 3 || Record.size() > 4)
742*ef27db87SMehdi Amini         return error("Invalid record");
743*ef27db87SMehdi Amini       bool IsOldTypeRefArray = Record[0] < 2;
744*ef27db87SMehdi Amini       unsigned CC = (Record.size() > 3) ? Record[3] : 0;
745*ef27db87SMehdi Amini 
746*ef27db87SMehdi Amini       IsDistinct = Record[0] & 0x1;
747*ef27db87SMehdi Amini       DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
748*ef27db87SMehdi Amini       Metadata *Types = getMDOrNull(Record[2]);
749*ef27db87SMehdi Amini       if (LLVM_UNLIKELY(IsOldTypeRefArray))
750*ef27db87SMehdi Amini         Types = MetadataList.upgradeTypeRefArray(Types);
751*ef27db87SMehdi Amini 
752*ef27db87SMehdi Amini       MetadataList.assignValue(
753*ef27db87SMehdi Amini           GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
754*ef27db87SMehdi Amini           NextMetadataNo++);
755*ef27db87SMehdi Amini       break;
756*ef27db87SMehdi Amini     }
757*ef27db87SMehdi Amini 
758*ef27db87SMehdi Amini     case bitc::METADATA_MODULE: {
759*ef27db87SMehdi Amini       if (Record.size() != 6)
760*ef27db87SMehdi Amini         return error("Invalid record");
761*ef27db87SMehdi Amini 
762*ef27db87SMehdi Amini       IsDistinct = Record[0];
763*ef27db87SMehdi Amini       MetadataList.assignValue(
764*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIModule,
765*ef27db87SMehdi Amini                           (Context, getMDOrNull(Record[1]),
766*ef27db87SMehdi Amini                            getMDString(Record[2]), getMDString(Record[3]),
767*ef27db87SMehdi Amini                            getMDString(Record[4]), getMDString(Record[5]))),
768*ef27db87SMehdi Amini           NextMetadataNo++);
769*ef27db87SMehdi Amini       break;
770*ef27db87SMehdi Amini     }
771*ef27db87SMehdi Amini 
772*ef27db87SMehdi Amini     case bitc::METADATA_FILE: {
773*ef27db87SMehdi Amini       if (Record.size() != 3)
774*ef27db87SMehdi Amini         return error("Invalid record");
775*ef27db87SMehdi Amini 
776*ef27db87SMehdi Amini       IsDistinct = Record[0];
777*ef27db87SMehdi Amini       MetadataList.assignValue(
778*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIFile, (Context, getMDString(Record[1]),
779*ef27db87SMehdi Amini                                    getMDString(Record[2]))),
780*ef27db87SMehdi Amini           NextMetadataNo++);
781*ef27db87SMehdi Amini       break;
782*ef27db87SMehdi Amini     }
783*ef27db87SMehdi Amini     case bitc::METADATA_COMPILE_UNIT: {
784*ef27db87SMehdi Amini       if (Record.size() < 14 || Record.size() > 17)
785*ef27db87SMehdi Amini         return error("Invalid record");
786*ef27db87SMehdi Amini 
787*ef27db87SMehdi Amini       // Ignore Record[0], which indicates whether this compile unit is
788*ef27db87SMehdi Amini       // distinct.  It's always distinct.
789*ef27db87SMehdi Amini       IsDistinct = true;
790*ef27db87SMehdi Amini       auto *CU = DICompileUnit::getDistinct(
791*ef27db87SMehdi Amini           Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
792*ef27db87SMehdi Amini           Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
793*ef27db87SMehdi Amini           Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
794*ef27db87SMehdi Amini           getMDOrNull(Record[12]), getMDOrNull(Record[13]),
795*ef27db87SMehdi Amini           Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
796*ef27db87SMehdi Amini           Record.size() <= 14 ? 0 : Record[14],
797*ef27db87SMehdi Amini           Record.size() <= 16 ? true : Record[16]);
798*ef27db87SMehdi Amini 
799*ef27db87SMehdi Amini       MetadataList.assignValue(CU, NextMetadataNo++);
800*ef27db87SMehdi Amini 
801*ef27db87SMehdi Amini       // Move the Upgrade the list of subprograms.
802*ef27db87SMehdi Amini       if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
803*ef27db87SMehdi Amini         CUSubprograms.push_back({CU, SPs});
804*ef27db87SMehdi Amini       break;
805*ef27db87SMehdi Amini     }
806*ef27db87SMehdi Amini     case bitc::METADATA_SUBPROGRAM: {
807*ef27db87SMehdi Amini       if (Record.size() < 18 || Record.size() > 20)
808*ef27db87SMehdi Amini         return error("Invalid record");
809*ef27db87SMehdi Amini 
810*ef27db87SMehdi Amini       IsDistinct =
811*ef27db87SMehdi Amini           (Record[0] & 1) || Record[8]; // All definitions should be distinct.
812*ef27db87SMehdi Amini       // Version 1 has a Function as Record[15].
813*ef27db87SMehdi Amini       // Version 2 has removed Record[15].
814*ef27db87SMehdi Amini       // Version 3 has the Unit as Record[15].
815*ef27db87SMehdi Amini       // Version 4 added thisAdjustment.
816*ef27db87SMehdi Amini       bool HasUnit = Record[0] >= 2;
817*ef27db87SMehdi Amini       if (HasUnit && Record.size() < 19)
818*ef27db87SMehdi Amini         return error("Invalid record");
819*ef27db87SMehdi Amini       Metadata *CUorFn = getMDOrNull(Record[15]);
820*ef27db87SMehdi Amini       unsigned Offset = Record.size() >= 19 ? 1 : 0;
821*ef27db87SMehdi Amini       bool HasFn = Offset && !HasUnit;
822*ef27db87SMehdi Amini       bool HasThisAdj = Record.size() >= 20;
823*ef27db87SMehdi Amini       DISubprogram *SP = GET_OR_DISTINCT(
824*ef27db87SMehdi Amini           DISubprogram, (Context,
825*ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[1]),  // scope
826*ef27db87SMehdi Amini                          getMDString(Record[2]),         // name
827*ef27db87SMehdi Amini                          getMDString(Record[3]),         // linkageName
828*ef27db87SMehdi Amini                          getMDOrNull(Record[4]),         // file
829*ef27db87SMehdi Amini                          Record[5],                      // line
830*ef27db87SMehdi Amini                          getMDOrNull(Record[6]),         // type
831*ef27db87SMehdi Amini                          Record[7],                      // isLocal
832*ef27db87SMehdi Amini                          Record[8],                      // isDefinition
833*ef27db87SMehdi Amini                          Record[9],                      // scopeLine
834*ef27db87SMehdi Amini                          getDITypeRefOrNull(Record[10]), // containingType
835*ef27db87SMehdi Amini                          Record[11],                     // virtuality
836*ef27db87SMehdi Amini                          Record[12],                     // virtualIndex
837*ef27db87SMehdi Amini                          HasThisAdj ? Record[19] : 0,    // thisAdjustment
838*ef27db87SMehdi Amini                          static_cast<DINode::DIFlags>(Record[13] // flags
839*ef27db87SMehdi Amini                                                       ),
840*ef27db87SMehdi Amini                          Record[14],                       // isOptimized
841*ef27db87SMehdi Amini                          HasUnit ? CUorFn : nullptr,       // unit
842*ef27db87SMehdi Amini                          getMDOrNull(Record[15 + Offset]), // templateParams
843*ef27db87SMehdi Amini                          getMDOrNull(Record[16 + Offset]), // declaration
844*ef27db87SMehdi Amini                          getMDOrNull(Record[17 + Offset])  // variables
845*ef27db87SMehdi Amini                          ));
846*ef27db87SMehdi Amini       MetadataList.assignValue(SP, NextMetadataNo++);
847*ef27db87SMehdi Amini 
848*ef27db87SMehdi Amini       // Upgrade sp->function mapping to function->sp mapping.
849*ef27db87SMehdi Amini       if (HasFn) {
850*ef27db87SMehdi Amini         if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
851*ef27db87SMehdi Amini           if (auto *F = dyn_cast<Function>(CMD->getValue())) {
852*ef27db87SMehdi Amini             if (F->isMaterializable())
853*ef27db87SMehdi Amini               // Defer until materialized; unmaterialized functions may not have
854*ef27db87SMehdi Amini               // metadata.
855*ef27db87SMehdi Amini               FunctionsWithSPs[F] = SP;
856*ef27db87SMehdi Amini             else if (!F->empty())
857*ef27db87SMehdi Amini               F->setSubprogram(SP);
858*ef27db87SMehdi Amini           }
859*ef27db87SMehdi Amini       }
860*ef27db87SMehdi Amini       break;
861*ef27db87SMehdi Amini     }
862*ef27db87SMehdi Amini     case bitc::METADATA_LEXICAL_BLOCK: {
863*ef27db87SMehdi Amini       if (Record.size() != 5)
864*ef27db87SMehdi Amini         return error("Invalid record");
865*ef27db87SMehdi Amini 
866*ef27db87SMehdi Amini       IsDistinct = Record[0];
867*ef27db87SMehdi Amini       MetadataList.assignValue(
868*ef27db87SMehdi Amini           GET_OR_DISTINCT(DILexicalBlock,
869*ef27db87SMehdi Amini                           (Context, getMDOrNull(Record[1]),
870*ef27db87SMehdi Amini                            getMDOrNull(Record[2]), Record[3], Record[4])),
871*ef27db87SMehdi Amini           NextMetadataNo++);
872*ef27db87SMehdi Amini       break;
873*ef27db87SMehdi Amini     }
874*ef27db87SMehdi Amini     case bitc::METADATA_LEXICAL_BLOCK_FILE: {
875*ef27db87SMehdi Amini       if (Record.size() != 4)
876*ef27db87SMehdi Amini         return error("Invalid record");
877*ef27db87SMehdi Amini 
878*ef27db87SMehdi Amini       IsDistinct = Record[0];
879*ef27db87SMehdi Amini       MetadataList.assignValue(
880*ef27db87SMehdi Amini           GET_OR_DISTINCT(DILexicalBlockFile,
881*ef27db87SMehdi Amini                           (Context, getMDOrNull(Record[1]),
882*ef27db87SMehdi Amini                            getMDOrNull(Record[2]), Record[3])),
883*ef27db87SMehdi Amini           NextMetadataNo++);
884*ef27db87SMehdi Amini       break;
885*ef27db87SMehdi Amini     }
886*ef27db87SMehdi Amini     case bitc::METADATA_NAMESPACE: {
887*ef27db87SMehdi Amini       if (Record.size() != 5)
888*ef27db87SMehdi Amini         return error("Invalid record");
889*ef27db87SMehdi Amini 
890*ef27db87SMehdi Amini       IsDistinct = Record[0] & 1;
891*ef27db87SMehdi Amini       bool ExportSymbols = Record[0] & 2;
892*ef27db87SMehdi Amini       MetadataList.assignValue(
893*ef27db87SMehdi Amini           GET_OR_DISTINCT(DINamespace,
894*ef27db87SMehdi Amini                           (Context, getMDOrNull(Record[1]),
895*ef27db87SMehdi Amini                            getMDOrNull(Record[2]), getMDString(Record[3]),
896*ef27db87SMehdi Amini                            Record[4], ExportSymbols)),
897*ef27db87SMehdi Amini           NextMetadataNo++);
898*ef27db87SMehdi Amini       break;
899*ef27db87SMehdi Amini     }
900*ef27db87SMehdi Amini     case bitc::METADATA_MACRO: {
901*ef27db87SMehdi Amini       if (Record.size() != 5)
902*ef27db87SMehdi Amini         return error("Invalid record");
903*ef27db87SMehdi Amini 
904*ef27db87SMehdi Amini       IsDistinct = Record[0];
905*ef27db87SMehdi Amini       MetadataList.assignValue(
906*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIMacro,
907*ef27db87SMehdi Amini                           (Context, Record[1], Record[2],
908*ef27db87SMehdi Amini                            getMDString(Record[3]), getMDString(Record[4]))),
909*ef27db87SMehdi Amini           NextMetadataNo++);
910*ef27db87SMehdi Amini       break;
911*ef27db87SMehdi Amini     }
912*ef27db87SMehdi Amini     case bitc::METADATA_MACRO_FILE: {
913*ef27db87SMehdi Amini       if (Record.size() != 5)
914*ef27db87SMehdi Amini         return error("Invalid record");
915*ef27db87SMehdi Amini 
916*ef27db87SMehdi Amini       IsDistinct = Record[0];
917*ef27db87SMehdi Amini       MetadataList.assignValue(
918*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIMacroFile,
919*ef27db87SMehdi Amini                           (Context, Record[1], Record[2],
920*ef27db87SMehdi Amini                            getMDOrNull(Record[3]), getMDOrNull(Record[4]))),
921*ef27db87SMehdi Amini           NextMetadataNo++);
922*ef27db87SMehdi Amini       break;
923*ef27db87SMehdi Amini     }
924*ef27db87SMehdi Amini     case bitc::METADATA_TEMPLATE_TYPE: {
925*ef27db87SMehdi Amini       if (Record.size() != 3)
926*ef27db87SMehdi Amini         return error("Invalid record");
927*ef27db87SMehdi Amini 
928*ef27db87SMehdi Amini       IsDistinct = Record[0];
929*ef27db87SMehdi Amini       MetadataList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter,
930*ef27db87SMehdi Amini                                                (Context, getMDString(Record[1]),
931*ef27db87SMehdi Amini                                                 getDITypeRefOrNull(Record[2]))),
932*ef27db87SMehdi Amini                                NextMetadataNo++);
933*ef27db87SMehdi Amini       break;
934*ef27db87SMehdi Amini     }
935*ef27db87SMehdi Amini     case bitc::METADATA_TEMPLATE_VALUE: {
936*ef27db87SMehdi Amini       if (Record.size() != 5)
937*ef27db87SMehdi Amini         return error("Invalid record");
938*ef27db87SMehdi Amini 
939*ef27db87SMehdi Amini       IsDistinct = Record[0];
940*ef27db87SMehdi Amini       MetadataList.assignValue(
941*ef27db87SMehdi Amini           GET_OR_DISTINCT(DITemplateValueParameter,
942*ef27db87SMehdi Amini                           (Context, Record[1], getMDString(Record[2]),
943*ef27db87SMehdi Amini                            getDITypeRefOrNull(Record[3]),
944*ef27db87SMehdi Amini                            getMDOrNull(Record[4]))),
945*ef27db87SMehdi Amini           NextMetadataNo++);
946*ef27db87SMehdi Amini       break;
947*ef27db87SMehdi Amini     }
948*ef27db87SMehdi Amini     case bitc::METADATA_GLOBAL_VAR: {
949*ef27db87SMehdi Amini       if (Record.size() < 11 || Record.size() > 12)
950*ef27db87SMehdi Amini         return error("Invalid record");
951*ef27db87SMehdi Amini 
952*ef27db87SMehdi Amini       IsDistinct = Record[0];
953*ef27db87SMehdi Amini 
954*ef27db87SMehdi Amini       // Upgrade old metadata, which stored a global variable reference or a
955*ef27db87SMehdi Amini       // ConstantInt here.
956*ef27db87SMehdi Amini       Metadata *Expr = getMDOrNull(Record[9]);
957*ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
958*ef27db87SMehdi Amini       if (Record.size() > 11) {
959*ef27db87SMehdi Amini         if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
960*ef27db87SMehdi Amini           return error("Alignment value is too large");
961*ef27db87SMehdi Amini         AlignInBits = Record[11];
962*ef27db87SMehdi Amini       }
963*ef27db87SMehdi Amini       GlobalVariable *Attach = nullptr;
964*ef27db87SMehdi Amini       if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
965*ef27db87SMehdi Amini         if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
966*ef27db87SMehdi Amini           Attach = GV;
967*ef27db87SMehdi Amini           Expr = nullptr;
968*ef27db87SMehdi Amini         } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
969*ef27db87SMehdi Amini           Expr = DIExpression::get(Context,
970*ef27db87SMehdi Amini                                    {dwarf::DW_OP_constu, CI->getZExtValue(),
971*ef27db87SMehdi Amini                                     dwarf::DW_OP_stack_value});
972*ef27db87SMehdi Amini         } else {
973*ef27db87SMehdi Amini           Expr = nullptr;
974*ef27db87SMehdi Amini         }
975*ef27db87SMehdi Amini       }
976*ef27db87SMehdi Amini 
977*ef27db87SMehdi Amini       DIGlobalVariable *DGV = GET_OR_DISTINCT(
978*ef27db87SMehdi Amini           DIGlobalVariable,
979*ef27db87SMehdi Amini           (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
980*ef27db87SMehdi Amini            getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
981*ef27db87SMehdi Amini            getDITypeRefOrNull(Record[6]), Record[7], Record[8], Expr,
982*ef27db87SMehdi Amini            getMDOrNull(Record[10]), AlignInBits));
983*ef27db87SMehdi Amini       MetadataList.assignValue(DGV, NextMetadataNo++);
984*ef27db87SMehdi Amini 
985*ef27db87SMehdi Amini       if (Attach)
986*ef27db87SMehdi Amini         Attach->addDebugInfo(DGV);
987*ef27db87SMehdi Amini 
988*ef27db87SMehdi Amini       break;
989*ef27db87SMehdi Amini     }
990*ef27db87SMehdi Amini     case bitc::METADATA_LOCAL_VAR: {
991*ef27db87SMehdi Amini       // 10th field is for the obseleted 'inlinedAt:' field.
992*ef27db87SMehdi Amini       if (Record.size() < 8 || Record.size() > 10)
993*ef27db87SMehdi Amini         return error("Invalid record");
994*ef27db87SMehdi Amini 
995*ef27db87SMehdi Amini       IsDistinct = Record[0] & 1;
996*ef27db87SMehdi Amini       bool HasAlignment = Record[0] & 2;
997*ef27db87SMehdi Amini       // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
998*ef27db87SMehdi Amini       // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
999*ef27db87SMehdi Amini       // this is newer version of record which doesn't have artifical tag.
1000*ef27db87SMehdi Amini       bool HasTag = !HasAlignment && Record.size() > 8;
1001*ef27db87SMehdi Amini       DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1002*ef27db87SMehdi Amini       uint32_t AlignInBits = 0;
1003*ef27db87SMehdi Amini       if (HasAlignment) {
1004*ef27db87SMehdi Amini         if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max())
1005*ef27db87SMehdi Amini           return error("Alignment value is too large");
1006*ef27db87SMehdi Amini         AlignInBits = Record[8 + HasTag];
1007*ef27db87SMehdi Amini       }
1008*ef27db87SMehdi Amini       MetadataList.assignValue(
1009*ef27db87SMehdi Amini           GET_OR_DISTINCT(DILocalVariable,
1010*ef27db87SMehdi Amini                           (Context, getMDOrNull(Record[1 + HasTag]),
1011*ef27db87SMehdi Amini                            getMDString(Record[2 + HasTag]),
1012*ef27db87SMehdi Amini                            getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1013*ef27db87SMehdi Amini                            getDITypeRefOrNull(Record[5 + HasTag]),
1014*ef27db87SMehdi Amini                            Record[6 + HasTag], Flags, AlignInBits)),
1015*ef27db87SMehdi Amini           NextMetadataNo++);
1016*ef27db87SMehdi Amini       break;
1017*ef27db87SMehdi Amini     }
1018*ef27db87SMehdi Amini     case bitc::METADATA_EXPRESSION: {
1019*ef27db87SMehdi Amini       if (Record.size() < 1)
1020*ef27db87SMehdi Amini         return error("Invalid record");
1021*ef27db87SMehdi Amini 
1022*ef27db87SMehdi Amini       IsDistinct = Record[0] & 1;
1023*ef27db87SMehdi Amini       bool HasOpFragment = Record[0] & 2;
1024*ef27db87SMehdi Amini       auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
1025*ef27db87SMehdi Amini       if (!HasOpFragment)
1026*ef27db87SMehdi Amini         if (unsigned N = Elts.size())
1027*ef27db87SMehdi Amini           if (N >= 3 && Elts[N - 3] == dwarf::DW_OP_bit_piece)
1028*ef27db87SMehdi Amini             Elts[N - 3] = dwarf::DW_OP_LLVM_fragment;
1029*ef27db87SMehdi Amini 
1030*ef27db87SMehdi Amini       MetadataList.assignValue(
1031*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIExpression,
1032*ef27db87SMehdi Amini                           (Context, makeArrayRef(Record).slice(1))),
1033*ef27db87SMehdi Amini           NextMetadataNo++);
1034*ef27db87SMehdi Amini       break;
1035*ef27db87SMehdi Amini     }
1036*ef27db87SMehdi Amini     case bitc::METADATA_OBJC_PROPERTY: {
1037*ef27db87SMehdi Amini       if (Record.size() != 8)
1038*ef27db87SMehdi Amini         return error("Invalid record");
1039*ef27db87SMehdi Amini 
1040*ef27db87SMehdi Amini       IsDistinct = Record[0];
1041*ef27db87SMehdi Amini       MetadataList.assignValue(
1042*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIObjCProperty,
1043*ef27db87SMehdi Amini                           (Context, getMDString(Record[1]),
1044*ef27db87SMehdi Amini                            getMDOrNull(Record[2]), Record[3],
1045*ef27db87SMehdi Amini                            getMDString(Record[4]), getMDString(Record[5]),
1046*ef27db87SMehdi Amini                            Record[6], getDITypeRefOrNull(Record[7]))),
1047*ef27db87SMehdi Amini           NextMetadataNo++);
1048*ef27db87SMehdi Amini       break;
1049*ef27db87SMehdi Amini     }
1050*ef27db87SMehdi Amini     case bitc::METADATA_IMPORTED_ENTITY: {
1051*ef27db87SMehdi Amini       if (Record.size() != 6)
1052*ef27db87SMehdi Amini         return error("Invalid record");
1053*ef27db87SMehdi Amini 
1054*ef27db87SMehdi Amini       IsDistinct = Record[0];
1055*ef27db87SMehdi Amini       MetadataList.assignValue(
1056*ef27db87SMehdi Amini           GET_OR_DISTINCT(DIImportedEntity,
1057*ef27db87SMehdi Amini                           (Context, Record[1], getMDOrNull(Record[2]),
1058*ef27db87SMehdi Amini                            getDITypeRefOrNull(Record[3]), Record[4],
1059*ef27db87SMehdi Amini                            getMDString(Record[5]))),
1060*ef27db87SMehdi Amini           NextMetadataNo++);
1061*ef27db87SMehdi Amini       break;
1062*ef27db87SMehdi Amini     }
1063*ef27db87SMehdi Amini     case bitc::METADATA_STRING_OLD: {
1064*ef27db87SMehdi Amini       std::string String(Record.begin(), Record.end());
1065*ef27db87SMehdi Amini 
1066*ef27db87SMehdi Amini       // Test for upgrading !llvm.loop.
1067*ef27db87SMehdi Amini       HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
1068*ef27db87SMehdi Amini 
1069*ef27db87SMehdi Amini       Metadata *MD = MDString::get(Context, String);
1070*ef27db87SMehdi Amini       MetadataList.assignValue(MD, NextMetadataNo++);
1071*ef27db87SMehdi Amini       break;
1072*ef27db87SMehdi Amini     }
1073*ef27db87SMehdi Amini     case bitc::METADATA_STRINGS:
1074*ef27db87SMehdi Amini       if (Error Err = parseMetadataStrings(Record, Blob, NextMetadataNo))
1075*ef27db87SMehdi Amini         return Err;
1076*ef27db87SMehdi Amini       break;
1077*ef27db87SMehdi Amini     case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
1078*ef27db87SMehdi Amini       if (Record.size() % 2 == 0)
1079*ef27db87SMehdi Amini         return error("Invalid record");
1080*ef27db87SMehdi Amini       unsigned ValueID = Record[0];
1081*ef27db87SMehdi Amini       if (ValueID >= ValueList.size())
1082*ef27db87SMehdi Amini         return error("Invalid record");
1083*ef27db87SMehdi Amini       if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
1084*ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(
1085*ef27db87SMehdi Amini                 *GO, ArrayRef<uint64_t>(Record).slice(1)))
1086*ef27db87SMehdi Amini           return Err;
1087*ef27db87SMehdi Amini       break;
1088*ef27db87SMehdi Amini     }
1089*ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
1090*ef27db87SMehdi Amini       // Support older bitcode files that had METADATA_KIND records in a
1091*ef27db87SMehdi Amini       // block with METADATA_BLOCK_ID.
1092*ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
1093*ef27db87SMehdi Amini         return Err;
1094*ef27db87SMehdi Amini       break;
1095*ef27db87SMehdi Amini     }
1096*ef27db87SMehdi Amini     }
1097*ef27db87SMehdi Amini   }
1098*ef27db87SMehdi Amini #undef GET_OR_DISTINCT
1099*ef27db87SMehdi Amini }
1100*ef27db87SMehdi Amini 
1101*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
1102*ef27db87SMehdi Amini     ArrayRef<uint64_t> Record, StringRef Blob, unsigned &NextMetadataNo) {
1103*ef27db87SMehdi Amini   // All the MDStrings in the block are emitted together in a single
1104*ef27db87SMehdi Amini   // record.  The strings are concatenated and stored in a blob along with
1105*ef27db87SMehdi Amini   // their sizes.
1106*ef27db87SMehdi Amini   if (Record.size() != 2)
1107*ef27db87SMehdi Amini     return error("Invalid record: metadata strings layout");
1108*ef27db87SMehdi Amini 
1109*ef27db87SMehdi Amini   unsigned NumStrings = Record[0];
1110*ef27db87SMehdi Amini   unsigned StringsOffset = Record[1];
1111*ef27db87SMehdi Amini   if (!NumStrings)
1112*ef27db87SMehdi Amini     return error("Invalid record: metadata strings with no strings");
1113*ef27db87SMehdi Amini   if (StringsOffset > Blob.size())
1114*ef27db87SMehdi Amini     return error("Invalid record: metadata strings corrupt offset");
1115*ef27db87SMehdi Amini 
1116*ef27db87SMehdi Amini   StringRef Lengths = Blob.slice(0, StringsOffset);
1117*ef27db87SMehdi Amini   SimpleBitstreamCursor R(Lengths);
1118*ef27db87SMehdi Amini 
1119*ef27db87SMehdi Amini   StringRef Strings = Blob.drop_front(StringsOffset);
1120*ef27db87SMehdi Amini   do {
1121*ef27db87SMehdi Amini     if (R.AtEndOfStream())
1122*ef27db87SMehdi Amini       return error("Invalid record: metadata strings bad length");
1123*ef27db87SMehdi Amini 
1124*ef27db87SMehdi Amini     unsigned Size = R.ReadVBR(6);
1125*ef27db87SMehdi Amini     if (Strings.size() < Size)
1126*ef27db87SMehdi Amini       return error("Invalid record: metadata strings truncated chars");
1127*ef27db87SMehdi Amini 
1128*ef27db87SMehdi Amini     MetadataList.assignValue(MDString::get(Context, Strings.slice(0, Size)),
1129*ef27db87SMehdi Amini                              NextMetadataNo++);
1130*ef27db87SMehdi Amini     Strings = Strings.drop_front(Size);
1131*ef27db87SMehdi Amini   } while (--NumStrings);
1132*ef27db87SMehdi Amini 
1133*ef27db87SMehdi Amini   return Error::success();
1134*ef27db87SMehdi Amini }
1135*ef27db87SMehdi Amini 
1136*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
1137*ef27db87SMehdi Amini     GlobalObject &GO, ArrayRef<uint64_t> Record) {
1138*ef27db87SMehdi Amini   assert(Record.size() % 2 == 0);
1139*ef27db87SMehdi Amini   for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
1140*ef27db87SMehdi Amini     auto K = MDKindMap.find(Record[I]);
1141*ef27db87SMehdi Amini     if (K == MDKindMap.end())
1142*ef27db87SMehdi Amini       return error("Invalid ID");
1143*ef27db87SMehdi Amini     MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[I + 1]);
1144*ef27db87SMehdi Amini     if (!MD)
1145*ef27db87SMehdi Amini       return error("Invalid metadata attachment");
1146*ef27db87SMehdi Amini     GO.addMetadata(K->second, *MD);
1147*ef27db87SMehdi Amini   }
1148*ef27db87SMehdi Amini   return Error::success();
1149*ef27db87SMehdi Amini }
1150*ef27db87SMehdi Amini 
1151*ef27db87SMehdi Amini /// Parse metadata attachments.
1152*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
1153*ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
1154*ef27db87SMehdi Amini   if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
1155*ef27db87SMehdi Amini     return error("Invalid record");
1156*ef27db87SMehdi Amini 
1157*ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
1158*ef27db87SMehdi Amini 
1159*ef27db87SMehdi Amini   while (true) {
1160*ef27db87SMehdi Amini     BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
1161*ef27db87SMehdi Amini 
1162*ef27db87SMehdi Amini     switch (Entry.Kind) {
1163*ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
1164*ef27db87SMehdi Amini     case BitstreamEntry::Error:
1165*ef27db87SMehdi Amini       return error("Malformed block");
1166*ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
1167*ef27db87SMehdi Amini       return Error::success();
1168*ef27db87SMehdi Amini     case BitstreamEntry::Record:
1169*ef27db87SMehdi Amini       // The interesting case.
1170*ef27db87SMehdi Amini       break;
1171*ef27db87SMehdi Amini     }
1172*ef27db87SMehdi Amini 
1173*ef27db87SMehdi Amini     // Read a metadata attachment record.
1174*ef27db87SMehdi Amini     Record.clear();
1175*ef27db87SMehdi Amini     switch (Stream.readRecord(Entry.ID, Record)) {
1176*ef27db87SMehdi Amini     default: // Default behavior: ignore.
1177*ef27db87SMehdi Amini       break;
1178*ef27db87SMehdi Amini     case bitc::METADATA_ATTACHMENT: {
1179*ef27db87SMehdi Amini       unsigned RecordLength = Record.size();
1180*ef27db87SMehdi Amini       if (Record.empty())
1181*ef27db87SMehdi Amini         return error("Invalid record");
1182*ef27db87SMehdi Amini       if (RecordLength % 2 == 0) {
1183*ef27db87SMehdi Amini         // A function attachment.
1184*ef27db87SMehdi Amini         if (Error Err = parseGlobalObjectAttachment(F, Record))
1185*ef27db87SMehdi Amini           return Err;
1186*ef27db87SMehdi Amini         continue;
1187*ef27db87SMehdi Amini       }
1188*ef27db87SMehdi Amini 
1189*ef27db87SMehdi Amini       // An instruction attachment.
1190*ef27db87SMehdi Amini       Instruction *Inst = InstructionList[Record[0]];
1191*ef27db87SMehdi Amini       for (unsigned i = 1; i != RecordLength; i = i + 2) {
1192*ef27db87SMehdi Amini         unsigned Kind = Record[i];
1193*ef27db87SMehdi Amini         DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
1194*ef27db87SMehdi Amini         if (I == MDKindMap.end())
1195*ef27db87SMehdi Amini           return error("Invalid ID");
1196*ef27db87SMehdi Amini         Metadata *Node = MetadataList.getMetadataFwdRef(Record[i + 1]);
1197*ef27db87SMehdi Amini         if (isa<LocalAsMetadata>(Node))
1198*ef27db87SMehdi Amini           // Drop the attachment.  This used to be legal, but there's no
1199*ef27db87SMehdi Amini           // upgrade path.
1200*ef27db87SMehdi Amini           break;
1201*ef27db87SMehdi Amini         MDNode *MD = dyn_cast_or_null<MDNode>(Node);
1202*ef27db87SMehdi Amini         if (!MD)
1203*ef27db87SMehdi Amini           return error("Invalid metadata attachment");
1204*ef27db87SMehdi Amini 
1205*ef27db87SMehdi Amini         if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
1206*ef27db87SMehdi Amini           MD = upgradeInstructionLoopAttachment(*MD);
1207*ef27db87SMehdi Amini 
1208*ef27db87SMehdi Amini         if (I->second == LLVMContext::MD_tbaa) {
1209*ef27db87SMehdi Amini           assert(!MD->isTemporary() && "should load MDs before attachments");
1210*ef27db87SMehdi Amini           MD = UpgradeTBAANode(*MD);
1211*ef27db87SMehdi Amini         }
1212*ef27db87SMehdi Amini         Inst->setMetadata(I->second, MD);
1213*ef27db87SMehdi Amini       }
1214*ef27db87SMehdi Amini       break;
1215*ef27db87SMehdi Amini     }
1216*ef27db87SMehdi Amini     }
1217*ef27db87SMehdi Amini   }
1218*ef27db87SMehdi Amini }
1219*ef27db87SMehdi Amini 
1220*ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
1221*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
1222*ef27db87SMehdi Amini     SmallVectorImpl<uint64_t> &Record) {
1223*ef27db87SMehdi Amini   if (Record.size() < 2)
1224*ef27db87SMehdi Amini     return error("Invalid record");
1225*ef27db87SMehdi Amini 
1226*ef27db87SMehdi Amini   unsigned Kind = Record[0];
1227*ef27db87SMehdi Amini   SmallString<8> Name(Record.begin() + 1, Record.end());
1228*ef27db87SMehdi Amini 
1229*ef27db87SMehdi Amini   unsigned NewKind = TheModule.getMDKindID(Name.str());
1230*ef27db87SMehdi Amini   if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
1231*ef27db87SMehdi Amini     return error("Conflicting METADATA_KIND records");
1232*ef27db87SMehdi Amini   return Error::success();
1233*ef27db87SMehdi Amini }
1234*ef27db87SMehdi Amini 
1235*ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
1236*ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
1237*ef27db87SMehdi Amini   if (Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
1238*ef27db87SMehdi Amini     return error("Invalid record");
1239*ef27db87SMehdi Amini 
1240*ef27db87SMehdi Amini   SmallVector<uint64_t, 64> Record;
1241*ef27db87SMehdi Amini 
1242*ef27db87SMehdi Amini   // Read all the records.
1243*ef27db87SMehdi Amini   while (true) {
1244*ef27db87SMehdi Amini     BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
1245*ef27db87SMehdi Amini 
1246*ef27db87SMehdi Amini     switch (Entry.Kind) {
1247*ef27db87SMehdi Amini     case BitstreamEntry::SubBlock: // Handled for us already.
1248*ef27db87SMehdi Amini     case BitstreamEntry::Error:
1249*ef27db87SMehdi Amini       return error("Malformed block");
1250*ef27db87SMehdi Amini     case BitstreamEntry::EndBlock:
1251*ef27db87SMehdi Amini       return Error::success();
1252*ef27db87SMehdi Amini     case BitstreamEntry::Record:
1253*ef27db87SMehdi Amini       // The interesting case.
1254*ef27db87SMehdi Amini       break;
1255*ef27db87SMehdi Amini     }
1256*ef27db87SMehdi Amini 
1257*ef27db87SMehdi Amini     // Read a record.
1258*ef27db87SMehdi Amini     Record.clear();
1259*ef27db87SMehdi Amini     unsigned Code = Stream.readRecord(Entry.ID, Record);
1260*ef27db87SMehdi Amini     switch (Code) {
1261*ef27db87SMehdi Amini     default: // Default behavior: ignore.
1262*ef27db87SMehdi Amini       break;
1263*ef27db87SMehdi Amini     case bitc::METADATA_KIND: {
1264*ef27db87SMehdi Amini       if (Error Err = parseMetadataKindRecord(Record))
1265*ef27db87SMehdi Amini         return Err;
1266*ef27db87SMehdi Amini       break;
1267*ef27db87SMehdi Amini     }
1268*ef27db87SMehdi Amini     }
1269*ef27db87SMehdi Amini   }
1270*ef27db87SMehdi Amini }
1271*ef27db87SMehdi Amini 
1272*ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
1273*ef27db87SMehdi Amini   Pimpl = std::move(RHS.Pimpl);
1274*ef27db87SMehdi Amini   return *this;
1275*ef27db87SMehdi Amini }
1276*ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
1277*ef27db87SMehdi Amini     : Pimpl(std::move(RHS.Pimpl)) {}
1278*ef27db87SMehdi Amini 
1279*ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
1280*ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
1281*ef27db87SMehdi Amini                                BitcodeReaderValueList &ValueList,
1282*ef27db87SMehdi Amini                                std::function<Type *(unsigned)> getTypeByID)
1283*ef27db87SMehdi Amini     : Pimpl(make_unique<MetadataLoaderImpl>(Stream, TheModule, ValueList,
1284*ef27db87SMehdi Amini                                             getTypeByID)) {}
1285*ef27db87SMehdi Amini 
1286*ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
1287*ef27db87SMehdi Amini   return Pimpl->parseMetadata(ModuleLevel);
1288*ef27db87SMehdi Amini }
1289*ef27db87SMehdi Amini 
1290*ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
1291*ef27db87SMehdi Amini 
1292*ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
1293*ef27db87SMehdi Amini /// necessary.
1294*ef27db87SMehdi Amini Metadata *MetadataLoader::getMetadataFwdRef(unsigned Idx) {
1295*ef27db87SMehdi Amini   return Pimpl->getMetadataFwdRef(Idx);
1296*ef27db87SMehdi Amini }
1297*ef27db87SMehdi Amini 
1298*ef27db87SMehdi Amini MDNode *MetadataLoader::getMDNodeFwdRefOrNull(unsigned Idx) {
1299*ef27db87SMehdi Amini   return Pimpl->getMDNodeFwdRefOrNull(Idx);
1300*ef27db87SMehdi Amini }
1301*ef27db87SMehdi Amini 
1302*ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
1303*ef27db87SMehdi Amini   return Pimpl->lookupSubprogramForFunction(F);
1304*ef27db87SMehdi Amini }
1305*ef27db87SMehdi Amini 
1306*ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
1307*ef27db87SMehdi Amini     Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
1308*ef27db87SMehdi Amini   return Pimpl->parseMetadataAttachment(F, InstructionList);
1309*ef27db87SMehdi Amini }
1310*ef27db87SMehdi Amini 
1311*ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
1312*ef27db87SMehdi Amini   return Pimpl->parseMetadataKinds();
1313*ef27db87SMehdi Amini }
1314*ef27db87SMehdi Amini 
1315*ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
1316*ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
1317