1d88c1a5aSDimitry Andric //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2d88c1a5aSDimitry Andric //
3d88c1a5aSDimitry Andric // The LLVM Compiler Infrastructure
4d88c1a5aSDimitry Andric //
5d88c1a5aSDimitry Andric // This file is distributed under the University of Illinois Open Source
6d88c1a5aSDimitry Andric // License. See LICENSE.TXT for details.
7d88c1a5aSDimitry Andric //
8d88c1a5aSDimitry Andric //===----------------------------------------------------------------------===//
9d88c1a5aSDimitry Andric
10d88c1a5aSDimitry Andric #include "MetadataLoader.h"
11d88c1a5aSDimitry Andric #include "ValueList.h"
12d88c1a5aSDimitry Andric
13d88c1a5aSDimitry Andric #include "llvm/ADT/APFloat.h"
14d88c1a5aSDimitry Andric #include "llvm/ADT/APInt.h"
15d88c1a5aSDimitry Andric #include "llvm/ADT/ArrayRef.h"
16d88c1a5aSDimitry Andric #include "llvm/ADT/DenseMap.h"
1795ec533aSDimitry Andric #include "llvm/ADT/DenseSet.h"
18d88c1a5aSDimitry Andric #include "llvm/ADT/None.h"
19d88c1a5aSDimitry Andric #include "llvm/ADT/STLExtras.h"
20d88c1a5aSDimitry Andric #include "llvm/ADT/SmallString.h"
21d88c1a5aSDimitry Andric #include "llvm/ADT/SmallVector.h"
2295ec533aSDimitry Andric #include "llvm/ADT/Statistic.h"
23d88c1a5aSDimitry Andric #include "llvm/ADT/StringRef.h"
24d88c1a5aSDimitry Andric #include "llvm/ADT/Twine.h"
25d88c1a5aSDimitry Andric #include "llvm/Bitcode/BitcodeReader.h"
26d88c1a5aSDimitry Andric #include "llvm/Bitcode/BitstreamReader.h"
27d88c1a5aSDimitry Andric #include "llvm/Bitcode/LLVMBitCodes.h"
28d88c1a5aSDimitry Andric #include "llvm/IR/Argument.h"
29d88c1a5aSDimitry Andric #include "llvm/IR/Attributes.h"
30d88c1a5aSDimitry Andric #include "llvm/IR/AutoUpgrade.h"
31d88c1a5aSDimitry Andric #include "llvm/IR/BasicBlock.h"
32d88c1a5aSDimitry Andric #include "llvm/IR/CallingConv.h"
33d88c1a5aSDimitry Andric #include "llvm/IR/Comdat.h"
34d88c1a5aSDimitry Andric #include "llvm/IR/Constant.h"
35d88c1a5aSDimitry Andric #include "llvm/IR/Constants.h"
36d88c1a5aSDimitry Andric #include "llvm/IR/DebugInfo.h"
37d88c1a5aSDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
38d88c1a5aSDimitry Andric #include "llvm/IR/DebugLoc.h"
39d88c1a5aSDimitry Andric #include "llvm/IR/DerivedTypes.h"
40d88c1a5aSDimitry Andric #include "llvm/IR/DiagnosticPrinter.h"
41d88c1a5aSDimitry Andric #include "llvm/IR/Function.h"
42d88c1a5aSDimitry Andric #include "llvm/IR/GVMaterializer.h"
43d88c1a5aSDimitry Andric #include "llvm/IR/GlobalAlias.h"
44d88c1a5aSDimitry Andric #include "llvm/IR/GlobalIFunc.h"
45d88c1a5aSDimitry Andric #include "llvm/IR/GlobalIndirectSymbol.h"
46d88c1a5aSDimitry Andric #include "llvm/IR/GlobalObject.h"
47d88c1a5aSDimitry Andric #include "llvm/IR/GlobalValue.h"
48d88c1a5aSDimitry Andric #include "llvm/IR/GlobalVariable.h"
49d88c1a5aSDimitry Andric #include "llvm/IR/InlineAsm.h"
50d88c1a5aSDimitry Andric #include "llvm/IR/InstrTypes.h"
51d88c1a5aSDimitry Andric #include "llvm/IR/Instruction.h"
52d88c1a5aSDimitry Andric #include "llvm/IR/Instructions.h"
536bc11b14SDimitry Andric #include "llvm/IR/IntrinsicInst.h"
54db17bf38SDimitry Andric #include "llvm/IR/Intrinsics.h"
55d88c1a5aSDimitry Andric #include "llvm/IR/LLVMContext.h"
56d88c1a5aSDimitry Andric #include "llvm/IR/Module.h"
57d88c1a5aSDimitry Andric #include "llvm/IR/ModuleSummaryIndex.h"
58d88c1a5aSDimitry Andric #include "llvm/IR/OperandTraits.h"
59d88c1a5aSDimitry Andric #include "llvm/IR/TrackingMDRef.h"
60d88c1a5aSDimitry Andric #include "llvm/IR/Type.h"
61d88c1a5aSDimitry Andric #include "llvm/IR/ValueHandle.h"
62d88c1a5aSDimitry Andric #include "llvm/Support/AtomicOrdering.h"
63d88c1a5aSDimitry Andric #include "llvm/Support/Casting.h"
64d88c1a5aSDimitry Andric #include "llvm/Support/CommandLine.h"
65d88c1a5aSDimitry Andric #include "llvm/Support/Compiler.h"
66d88c1a5aSDimitry Andric #include "llvm/Support/Debug.h"
67d88c1a5aSDimitry Andric #include "llvm/Support/Error.h"
68d88c1a5aSDimitry Andric #include "llvm/Support/ErrorHandling.h"
69d88c1a5aSDimitry Andric #include "llvm/Support/ManagedStatic.h"
70d88c1a5aSDimitry Andric #include "llvm/Support/MemoryBuffer.h"
71d88c1a5aSDimitry Andric #include "llvm/Support/raw_ostream.h"
72d88c1a5aSDimitry Andric #include <algorithm>
73d88c1a5aSDimitry Andric #include <cassert>
74d88c1a5aSDimitry Andric #include <cstddef>
75d88c1a5aSDimitry Andric #include <cstdint>
76d88c1a5aSDimitry Andric #include <deque>
77d88c1a5aSDimitry Andric #include <limits>
78d88c1a5aSDimitry Andric #include <map>
79d88c1a5aSDimitry Andric #include <memory>
80d88c1a5aSDimitry Andric #include <string>
81d88c1a5aSDimitry Andric #include <system_error>
82d88c1a5aSDimitry Andric #include <tuple>
83d88c1a5aSDimitry Andric #include <utility>
84d88c1a5aSDimitry Andric #include <vector>
85d88c1a5aSDimitry Andric
86d88c1a5aSDimitry Andric using namespace llvm;
87d88c1a5aSDimitry Andric
8895ec533aSDimitry Andric #define DEBUG_TYPE "bitcode-reader"
8995ec533aSDimitry Andric
9095ec533aSDimitry Andric STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
9195ec533aSDimitry Andric STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
9295ec533aSDimitry Andric STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
9395ec533aSDimitry Andric
94d88c1a5aSDimitry Andric /// Flag whether we need to import full type definitions for ThinLTO.
95d88c1a5aSDimitry Andric /// Currently needed for Darwin and LLDB.
96d88c1a5aSDimitry Andric static cl::opt<bool> ImportFullTypeDefinitions(
97d88c1a5aSDimitry Andric "import-full-type-definitions", cl::init(false), cl::Hidden,
98d88c1a5aSDimitry Andric cl::desc("Import full type definitions for ThinLTO."));
99d88c1a5aSDimitry Andric
10095ec533aSDimitry Andric static cl::opt<bool> DisableLazyLoading(
10195ec533aSDimitry Andric "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
10295ec533aSDimitry Andric cl::desc("Force disable the lazy-loading on-demand of metadata when "
10395ec533aSDimitry Andric "loading bitcode for importing."));
10495ec533aSDimitry Andric
105d88c1a5aSDimitry Andric namespace {
106d88c1a5aSDimitry Andric
unrotateSign(uint64_t U)107d88c1a5aSDimitry Andric static int64_t unrotateSign(uint64_t U) { return U & 1 ? ~(U >> 1) : U >> 1; }
108d88c1a5aSDimitry Andric
109d88c1a5aSDimitry Andric class BitcodeReaderMetadataList {
110d88c1a5aSDimitry Andric /// Array of metadata references.
111d88c1a5aSDimitry Andric ///
112d88c1a5aSDimitry Andric /// Don't use std::vector here. Some versions of libc++ copy (instead of
113d88c1a5aSDimitry Andric /// move) on resize, and TrackingMDRef is very expensive to copy.
114d88c1a5aSDimitry Andric SmallVector<TrackingMDRef, 1> MetadataPtrs;
115d88c1a5aSDimitry Andric
116d88c1a5aSDimitry Andric /// The set of indices in MetadataPtrs above of forward references that were
117d88c1a5aSDimitry Andric /// generated.
118d88c1a5aSDimitry Andric SmallDenseSet<unsigned, 1> ForwardReference;
119d88c1a5aSDimitry Andric
120d88c1a5aSDimitry Andric /// The set of indices in MetadataPtrs above of Metadata that need to be
121d88c1a5aSDimitry Andric /// resolved.
122d88c1a5aSDimitry Andric SmallDenseSet<unsigned, 1> UnresolvedNodes;
123d88c1a5aSDimitry Andric
124d88c1a5aSDimitry Andric /// Structures for resolving old type refs.
125d88c1a5aSDimitry Andric struct {
126d88c1a5aSDimitry Andric SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
127d88c1a5aSDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> Final;
128d88c1a5aSDimitry Andric SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
129d88c1a5aSDimitry Andric SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
130d88c1a5aSDimitry Andric } OldTypeRefs;
131d88c1a5aSDimitry Andric
132d88c1a5aSDimitry Andric LLVMContext &Context;
133d88c1a5aSDimitry Andric
134d88c1a5aSDimitry Andric public:
BitcodeReaderMetadataList(LLVMContext & C)135d88c1a5aSDimitry Andric BitcodeReaderMetadataList(LLVMContext &C) : Context(C) {}
136d88c1a5aSDimitry Andric
137d88c1a5aSDimitry Andric // vector compatibility methods
size() const138d88c1a5aSDimitry Andric unsigned size() const { return MetadataPtrs.size(); }
resize(unsigned N)139d88c1a5aSDimitry Andric void resize(unsigned N) { MetadataPtrs.resize(N); }
push_back(Metadata * MD)140d88c1a5aSDimitry Andric void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
clear()141d88c1a5aSDimitry Andric void clear() { MetadataPtrs.clear(); }
back() const142d88c1a5aSDimitry Andric Metadata *back() const { return MetadataPtrs.back(); }
pop_back()143d88c1a5aSDimitry Andric void pop_back() { MetadataPtrs.pop_back(); }
empty() const144d88c1a5aSDimitry Andric bool empty() const { return MetadataPtrs.empty(); }
145d88c1a5aSDimitry Andric
operator [](unsigned i) const146d88c1a5aSDimitry Andric Metadata *operator[](unsigned i) const {
147d88c1a5aSDimitry Andric assert(i < MetadataPtrs.size());
148d88c1a5aSDimitry Andric return MetadataPtrs[i];
149d88c1a5aSDimitry Andric }
150d88c1a5aSDimitry Andric
lookup(unsigned I) const151d88c1a5aSDimitry Andric Metadata *lookup(unsigned I) const {
152d88c1a5aSDimitry Andric if (I < MetadataPtrs.size())
153d88c1a5aSDimitry Andric return MetadataPtrs[I];
154d88c1a5aSDimitry Andric return nullptr;
155d88c1a5aSDimitry Andric }
156d88c1a5aSDimitry Andric
shrinkTo(unsigned N)157d88c1a5aSDimitry Andric void shrinkTo(unsigned N) {
158d88c1a5aSDimitry Andric assert(N <= size() && "Invalid shrinkTo request!");
159d88c1a5aSDimitry Andric assert(ForwardReference.empty() && "Unexpected forward refs");
160d88c1a5aSDimitry Andric assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
161d88c1a5aSDimitry Andric MetadataPtrs.resize(N);
162d88c1a5aSDimitry Andric }
163d88c1a5aSDimitry Andric
164d88c1a5aSDimitry Andric /// Return the given metadata, creating a replaceable forward reference if
165d88c1a5aSDimitry Andric /// necessary.
166d88c1a5aSDimitry Andric Metadata *getMetadataFwdRef(unsigned Idx);
167d88c1a5aSDimitry Andric
1684ba319b5SDimitry Andric /// Return the given metadata only if it is fully resolved.
169d88c1a5aSDimitry Andric ///
170d88c1a5aSDimitry Andric /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
171d88c1a5aSDimitry Andric /// would give \c false.
172d88c1a5aSDimitry Andric Metadata *getMetadataIfResolved(unsigned Idx);
173d88c1a5aSDimitry Andric
174d88c1a5aSDimitry Andric MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
175d88c1a5aSDimitry Andric void assignValue(Metadata *MD, unsigned Idx);
176d88c1a5aSDimitry Andric void tryToResolveCycles();
hasFwdRefs() const177d88c1a5aSDimitry Andric bool hasFwdRefs() const { return !ForwardReference.empty(); }
getNextFwdRef()17895ec533aSDimitry Andric int getNextFwdRef() {
17995ec533aSDimitry Andric assert(hasFwdRefs());
18095ec533aSDimitry Andric return *ForwardReference.begin();
18195ec533aSDimitry Andric }
182d88c1a5aSDimitry Andric
183d88c1a5aSDimitry Andric /// Upgrade a type that had an MDString reference.
184d88c1a5aSDimitry Andric void addTypeRef(MDString &UUID, DICompositeType &CT);
185d88c1a5aSDimitry Andric
186d88c1a5aSDimitry Andric /// Upgrade a type that had an MDString reference.
187d88c1a5aSDimitry Andric Metadata *upgradeTypeRef(Metadata *MaybeUUID);
188d88c1a5aSDimitry Andric
189d88c1a5aSDimitry Andric /// Upgrade a type ref array that may have MDString references.
190d88c1a5aSDimitry Andric Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
191d88c1a5aSDimitry Andric
192d88c1a5aSDimitry Andric private:
193d88c1a5aSDimitry Andric Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
194d88c1a5aSDimitry Andric };
195d88c1a5aSDimitry Andric
assignValue(Metadata * MD,unsigned Idx)196d88c1a5aSDimitry Andric void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
197d88c1a5aSDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD))
198d88c1a5aSDimitry Andric if (!MDN->isResolved())
199d88c1a5aSDimitry Andric UnresolvedNodes.insert(Idx);
200d88c1a5aSDimitry Andric
201d88c1a5aSDimitry Andric if (Idx == size()) {
202d88c1a5aSDimitry Andric push_back(MD);
203d88c1a5aSDimitry Andric return;
204d88c1a5aSDimitry Andric }
205d88c1a5aSDimitry Andric
206d88c1a5aSDimitry Andric if (Idx >= size())
207d88c1a5aSDimitry Andric resize(Idx + 1);
208d88c1a5aSDimitry Andric
209d88c1a5aSDimitry Andric TrackingMDRef &OldMD = MetadataPtrs[Idx];
210d88c1a5aSDimitry Andric if (!OldMD) {
211d88c1a5aSDimitry Andric OldMD.reset(MD);
212d88c1a5aSDimitry Andric return;
213d88c1a5aSDimitry Andric }
214d88c1a5aSDimitry Andric
215d88c1a5aSDimitry Andric // If there was a forward reference to this value, replace it.
216d88c1a5aSDimitry Andric TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
217d88c1a5aSDimitry Andric PrevMD->replaceAllUsesWith(MD);
218d88c1a5aSDimitry Andric ForwardReference.erase(Idx);
219d88c1a5aSDimitry Andric }
220d88c1a5aSDimitry Andric
getMetadataFwdRef(unsigned Idx)221d88c1a5aSDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
222d88c1a5aSDimitry Andric if (Idx >= size())
223d88c1a5aSDimitry Andric resize(Idx + 1);
224d88c1a5aSDimitry Andric
225d88c1a5aSDimitry Andric if (Metadata *MD = MetadataPtrs[Idx])
226d88c1a5aSDimitry Andric return MD;
227d88c1a5aSDimitry Andric
228d88c1a5aSDimitry Andric // Track forward refs to be resolved later.
229d88c1a5aSDimitry Andric ForwardReference.insert(Idx);
230d88c1a5aSDimitry Andric
231d88c1a5aSDimitry Andric // Create and return a placeholder, which will later be RAUW'd.
23295ec533aSDimitry Andric ++NumMDNodeTemporary;
233d88c1a5aSDimitry Andric Metadata *MD = MDNode::getTemporary(Context, None).release();
234d88c1a5aSDimitry Andric MetadataPtrs[Idx].reset(MD);
235d88c1a5aSDimitry Andric return MD;
236d88c1a5aSDimitry Andric }
237d88c1a5aSDimitry Andric
getMetadataIfResolved(unsigned Idx)238d88c1a5aSDimitry Andric Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
239d88c1a5aSDimitry Andric Metadata *MD = lookup(Idx);
240d88c1a5aSDimitry Andric if (auto *N = dyn_cast_or_null<MDNode>(MD))
241d88c1a5aSDimitry Andric if (!N->isResolved())
242d88c1a5aSDimitry Andric return nullptr;
243d88c1a5aSDimitry Andric return MD;
244d88c1a5aSDimitry Andric }
245d88c1a5aSDimitry Andric
getMDNodeFwdRefOrNull(unsigned Idx)246d88c1a5aSDimitry Andric MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
247d88c1a5aSDimitry Andric return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
248d88c1a5aSDimitry Andric }
249d88c1a5aSDimitry Andric
tryToResolveCycles()250d88c1a5aSDimitry Andric void BitcodeReaderMetadataList::tryToResolveCycles() {
251d88c1a5aSDimitry Andric if (!ForwardReference.empty())
252d88c1a5aSDimitry Andric // Still forward references... can't resolve cycles.
253d88c1a5aSDimitry Andric return;
254d88c1a5aSDimitry Andric
255d88c1a5aSDimitry Andric // Give up on finding a full definition for any forward decls that remain.
256d88c1a5aSDimitry Andric for (const auto &Ref : OldTypeRefs.FwdDecls)
257d88c1a5aSDimitry Andric OldTypeRefs.Final.insert(Ref);
258d88c1a5aSDimitry Andric OldTypeRefs.FwdDecls.clear();
259d88c1a5aSDimitry Andric
260d88c1a5aSDimitry Andric // Upgrade from old type ref arrays. In strange cases, this could add to
261d88c1a5aSDimitry Andric // OldTypeRefs.Unknown.
262d88c1a5aSDimitry Andric for (const auto &Array : OldTypeRefs.Arrays)
263d88c1a5aSDimitry Andric Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
264d88c1a5aSDimitry Andric OldTypeRefs.Arrays.clear();
265d88c1a5aSDimitry Andric
266d88c1a5aSDimitry Andric // Replace old string-based type refs with the resolved node, if possible.
267d88c1a5aSDimitry Andric // If we haven't seen the node, leave it to the verifier to complain about
268d88c1a5aSDimitry Andric // the invalid string reference.
269d88c1a5aSDimitry Andric for (const auto &Ref : OldTypeRefs.Unknown) {
270d88c1a5aSDimitry Andric if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
271d88c1a5aSDimitry Andric Ref.second->replaceAllUsesWith(CT);
272d88c1a5aSDimitry Andric else
273d88c1a5aSDimitry Andric Ref.second->replaceAllUsesWith(Ref.first);
274d88c1a5aSDimitry Andric }
275d88c1a5aSDimitry Andric OldTypeRefs.Unknown.clear();
276d88c1a5aSDimitry Andric
277d88c1a5aSDimitry Andric if (UnresolvedNodes.empty())
278d88c1a5aSDimitry Andric // Nothing to do.
279d88c1a5aSDimitry Andric return;
280d88c1a5aSDimitry Andric
281d88c1a5aSDimitry Andric // Resolve any cycles.
282d88c1a5aSDimitry Andric for (unsigned I : UnresolvedNodes) {
283d88c1a5aSDimitry Andric auto &MD = MetadataPtrs[I];
284d88c1a5aSDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD);
285d88c1a5aSDimitry Andric if (!N)
286d88c1a5aSDimitry Andric continue;
287d88c1a5aSDimitry Andric
288d88c1a5aSDimitry Andric assert(!N->isTemporary() && "Unexpected forward reference");
289d88c1a5aSDimitry Andric N->resolveCycles();
290d88c1a5aSDimitry Andric }
291d88c1a5aSDimitry Andric
292d88c1a5aSDimitry Andric // Make sure we return early again until there's another unresolved ref.
293d88c1a5aSDimitry Andric UnresolvedNodes.clear();
294d88c1a5aSDimitry Andric }
295d88c1a5aSDimitry Andric
addTypeRef(MDString & UUID,DICompositeType & CT)296d88c1a5aSDimitry Andric void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
297d88c1a5aSDimitry Andric DICompositeType &CT) {
298d88c1a5aSDimitry Andric assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
299d88c1a5aSDimitry Andric if (CT.isForwardDecl())
300d88c1a5aSDimitry Andric OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
301d88c1a5aSDimitry Andric else
302d88c1a5aSDimitry Andric OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
303d88c1a5aSDimitry Andric }
304d88c1a5aSDimitry Andric
upgradeTypeRef(Metadata * MaybeUUID)305d88c1a5aSDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
306d88c1a5aSDimitry Andric auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
307d88c1a5aSDimitry Andric if (LLVM_LIKELY(!UUID))
308d88c1a5aSDimitry Andric return MaybeUUID;
309d88c1a5aSDimitry Andric
310d88c1a5aSDimitry Andric if (auto *CT = OldTypeRefs.Final.lookup(UUID))
311d88c1a5aSDimitry Andric return CT;
312d88c1a5aSDimitry Andric
313d88c1a5aSDimitry Andric auto &Ref = OldTypeRefs.Unknown[UUID];
314d88c1a5aSDimitry Andric if (!Ref)
315d88c1a5aSDimitry Andric Ref = MDNode::getTemporary(Context, None);
316d88c1a5aSDimitry Andric return Ref.get();
317d88c1a5aSDimitry Andric }
318d88c1a5aSDimitry Andric
upgradeTypeRefArray(Metadata * MaybeTuple)319d88c1a5aSDimitry Andric Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
320d88c1a5aSDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
321d88c1a5aSDimitry Andric if (!Tuple || Tuple->isDistinct())
322d88c1a5aSDimitry Andric return MaybeTuple;
323d88c1a5aSDimitry Andric
324d88c1a5aSDimitry Andric // Look through the array immediately if possible.
325d88c1a5aSDimitry Andric if (!Tuple->isTemporary())
326d88c1a5aSDimitry Andric return resolveTypeRefArray(Tuple);
327d88c1a5aSDimitry Andric
328d88c1a5aSDimitry Andric // Create and return a placeholder to use for now. Eventually
329d88c1a5aSDimitry Andric // resolveTypeRefArrays() will be resolve this forward reference.
330d88c1a5aSDimitry Andric OldTypeRefs.Arrays.emplace_back(
331d88c1a5aSDimitry Andric std::piecewise_construct, std::forward_as_tuple(Tuple),
332d88c1a5aSDimitry Andric std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
333d88c1a5aSDimitry Andric return OldTypeRefs.Arrays.back().second.get();
334d88c1a5aSDimitry Andric }
335d88c1a5aSDimitry Andric
resolveTypeRefArray(Metadata * MaybeTuple)336d88c1a5aSDimitry Andric Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
337d88c1a5aSDimitry Andric auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
338d88c1a5aSDimitry Andric if (!Tuple || Tuple->isDistinct())
339d88c1a5aSDimitry Andric return MaybeTuple;
340d88c1a5aSDimitry Andric
341d88c1a5aSDimitry Andric // Look through the DITypeRefArray, upgrading each DITypeRef.
342d88c1a5aSDimitry Andric SmallVector<Metadata *, 32> Ops;
343d88c1a5aSDimitry Andric Ops.reserve(Tuple->getNumOperands());
344d88c1a5aSDimitry Andric for (Metadata *MD : Tuple->operands())
345d88c1a5aSDimitry Andric Ops.push_back(upgradeTypeRef(MD));
346d88c1a5aSDimitry Andric
347d88c1a5aSDimitry Andric return MDTuple::get(Context, Ops);
348d88c1a5aSDimitry Andric }
349d88c1a5aSDimitry Andric
350d88c1a5aSDimitry Andric namespace {
351d88c1a5aSDimitry Andric
352d88c1a5aSDimitry Andric class PlaceholderQueue {
353d88c1a5aSDimitry Andric // Placeholders would thrash around when moved, so store in a std::deque
354d88c1a5aSDimitry Andric // instead of some sort of vector.
355d88c1a5aSDimitry Andric std::deque<DistinctMDOperandPlaceholder> PHs;
356d88c1a5aSDimitry Andric
357d88c1a5aSDimitry Andric public:
~PlaceholderQueue()3587a7e6055SDimitry Andric ~PlaceholderQueue() {
3597a7e6055SDimitry Andric assert(empty() && "PlaceholderQueue hasn't been flushed before being destroyed");
3607a7e6055SDimitry Andric }
empty()36195ec533aSDimitry Andric bool empty() { return PHs.empty(); }
362d88c1a5aSDimitry Andric DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
363d88c1a5aSDimitry Andric void flush(BitcodeReaderMetadataList &MetadataList);
36495ec533aSDimitry Andric
36595ec533aSDimitry Andric /// Return the list of temporaries nodes in the queue, these need to be
36695ec533aSDimitry Andric /// loaded before we can flush the queue.
getTemporaries(BitcodeReaderMetadataList & MetadataList,DenseSet<unsigned> & Temporaries)36795ec533aSDimitry Andric void getTemporaries(BitcodeReaderMetadataList &MetadataList,
36895ec533aSDimitry Andric DenseSet<unsigned> &Temporaries) {
36995ec533aSDimitry Andric for (auto &PH : PHs) {
37095ec533aSDimitry Andric auto ID = PH.getID();
37195ec533aSDimitry Andric auto *MD = MetadataList.lookup(ID);
37295ec533aSDimitry Andric if (!MD) {
37395ec533aSDimitry Andric Temporaries.insert(ID);
37495ec533aSDimitry Andric continue;
37595ec533aSDimitry Andric }
37695ec533aSDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD);
37795ec533aSDimitry Andric if (N && N->isTemporary())
37895ec533aSDimitry Andric Temporaries.insert(ID);
37995ec533aSDimitry Andric }
38095ec533aSDimitry Andric }
381d88c1a5aSDimitry Andric };
382d88c1a5aSDimitry Andric
383d88c1a5aSDimitry Andric } // end anonymous namespace
384d88c1a5aSDimitry Andric
getPlaceholderOp(unsigned ID)385d88c1a5aSDimitry Andric DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
386d88c1a5aSDimitry Andric PHs.emplace_back(ID);
387d88c1a5aSDimitry Andric return PHs.back();
388d88c1a5aSDimitry Andric }
389d88c1a5aSDimitry Andric
flush(BitcodeReaderMetadataList & MetadataList)390d88c1a5aSDimitry Andric void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
391d88c1a5aSDimitry Andric while (!PHs.empty()) {
392d88c1a5aSDimitry Andric auto *MD = MetadataList.lookup(PHs.front().getID());
393d88c1a5aSDimitry Andric assert(MD && "Flushing placeholder on unassigned MD");
394d88c1a5aSDimitry Andric #ifndef NDEBUG
395d88c1a5aSDimitry Andric if (auto *MDN = dyn_cast<MDNode>(MD))
396d88c1a5aSDimitry Andric assert(MDN->isResolved() &&
397d88c1a5aSDimitry Andric "Flushing Placeholder while cycles aren't resolved");
398d88c1a5aSDimitry Andric #endif
399d88c1a5aSDimitry Andric PHs.front().replaceUseWith(MD);
400d88c1a5aSDimitry Andric PHs.pop_front();
401d88c1a5aSDimitry Andric }
402d88c1a5aSDimitry Andric }
403d88c1a5aSDimitry Andric
404d88c1a5aSDimitry Andric } // anonynous namespace
405d88c1a5aSDimitry Andric
error(const Twine & Message)40624d58133SDimitry Andric static Error error(const Twine &Message) {
40724d58133SDimitry Andric return make_error<StringError>(
40824d58133SDimitry Andric Message, make_error_code(BitcodeError::CorruptedBitcode));
40924d58133SDimitry Andric }
41024d58133SDimitry Andric
411d88c1a5aSDimitry Andric class MetadataLoader::MetadataLoaderImpl {
412d88c1a5aSDimitry Andric BitcodeReaderMetadataList MetadataList;
413d88c1a5aSDimitry Andric BitcodeReaderValueList &ValueList;
414d88c1a5aSDimitry Andric BitstreamCursor &Stream;
415d88c1a5aSDimitry Andric LLVMContext &Context;
416d88c1a5aSDimitry Andric Module &TheModule;
417d88c1a5aSDimitry Andric std::function<Type *(unsigned)> getTypeByID;
418d88c1a5aSDimitry Andric
41995ec533aSDimitry Andric /// Cursor associated with the lazy-loading of Metadata. This is the easy way
42095ec533aSDimitry Andric /// to keep around the right "context" (Abbrev list) to be able to jump in
42195ec533aSDimitry Andric /// the middle of the metadata block and load any record.
42295ec533aSDimitry Andric BitstreamCursor IndexCursor;
42395ec533aSDimitry Andric
42495ec533aSDimitry Andric /// Index that keeps track of MDString values.
42595ec533aSDimitry Andric std::vector<StringRef> MDStringRef;
42695ec533aSDimitry Andric
42795ec533aSDimitry Andric /// On-demand loading of a single MDString. Requires the index above to be
42895ec533aSDimitry Andric /// populated.
42995ec533aSDimitry Andric MDString *lazyLoadOneMDString(unsigned Idx);
43095ec533aSDimitry Andric
43195ec533aSDimitry Andric /// Index that keeps track of where to find a metadata record in the stream.
43295ec533aSDimitry Andric std::vector<uint64_t> GlobalMetadataBitPosIndex;
43395ec533aSDimitry Andric
43495ec533aSDimitry Andric /// Populate the index above to enable lazily loading of metadata, and load
43595ec533aSDimitry Andric /// the named metadata as well as the transitively referenced global
43695ec533aSDimitry Andric /// Metadata.
43724e2fe98SDimitry Andric Expected<bool> lazyLoadModuleMetadataBlock();
43895ec533aSDimitry Andric
43995ec533aSDimitry Andric /// On-demand loading of a single metadata. Requires the index above to be
44095ec533aSDimitry Andric /// populated.
44195ec533aSDimitry Andric void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
44295ec533aSDimitry Andric
443d88c1a5aSDimitry Andric // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
444d88c1a5aSDimitry Andric // point from SP to CU after a block is completly parsed.
445d88c1a5aSDimitry Andric std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
446d88c1a5aSDimitry Andric
447d88c1a5aSDimitry Andric /// Functions that need to be matched with subprograms when upgrading old
448d88c1a5aSDimitry Andric /// metadata.
449d88c1a5aSDimitry Andric SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
450d88c1a5aSDimitry Andric
451d88c1a5aSDimitry Andric // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
452d88c1a5aSDimitry Andric DenseMap<unsigned, unsigned> MDKindMap;
453d88c1a5aSDimitry Andric
454d88c1a5aSDimitry Andric bool StripTBAA = false;
455d88c1a5aSDimitry Andric bool HasSeenOldLoopTags = false;
4565ca5951eSDimitry Andric bool NeedUpgradeToDIGlobalVariableExpression = false;
4576bc11b14SDimitry Andric bool NeedDeclareExpressionUpgrade = false;
458d88c1a5aSDimitry Andric
459d88c1a5aSDimitry Andric /// True if metadata is being parsed for a module being ThinLTO imported.
460d88c1a5aSDimitry Andric bool IsImporting = false;
461d88c1a5aSDimitry Andric
462d88c1a5aSDimitry Andric Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
463d88c1a5aSDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob,
464d88c1a5aSDimitry Andric unsigned &NextMetadataNo);
46595ec533aSDimitry Andric Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
4667a7e6055SDimitry Andric function_ref<void(StringRef)> CallBack);
467d88c1a5aSDimitry Andric Error parseGlobalObjectAttachment(GlobalObject &GO,
468d88c1a5aSDimitry Andric ArrayRef<uint64_t> Record);
469d88c1a5aSDimitry Andric Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
470d88c1a5aSDimitry Andric
47195ec533aSDimitry Andric void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
47295ec533aSDimitry Andric
47395ec533aSDimitry Andric /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
upgradeCUSubprograms()47495ec533aSDimitry Andric void upgradeCUSubprograms() {
47595ec533aSDimitry Andric for (auto CU_SP : CUSubprograms)
47695ec533aSDimitry Andric if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
47795ec533aSDimitry Andric for (auto &Op : SPs->operands())
478f37b6182SDimitry Andric if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
479f37b6182SDimitry Andric SP->replaceUnit(CU_SP.first);
48095ec533aSDimitry Andric CUSubprograms.clear();
48195ec533aSDimitry Andric }
48295ec533aSDimitry Andric
4835ca5951eSDimitry Andric /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
upgradeCUVariables()4845ca5951eSDimitry Andric void upgradeCUVariables() {
4855ca5951eSDimitry Andric if (!NeedUpgradeToDIGlobalVariableExpression)
4865ca5951eSDimitry Andric return;
4875ca5951eSDimitry Andric
4885ca5951eSDimitry Andric // Upgrade list of variables attached to the CUs.
4895ca5951eSDimitry Andric if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
4905ca5951eSDimitry Andric for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
4915ca5951eSDimitry Andric auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
4925ca5951eSDimitry Andric if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
4935ca5951eSDimitry Andric for (unsigned I = 0; I < GVs->getNumOperands(); I++)
4945ca5951eSDimitry Andric if (auto *GV =
4955ca5951eSDimitry Andric dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
4962cab237bSDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct(
4972cab237bSDimitry Andric Context, GV, DIExpression::get(Context, {}));
4985ca5951eSDimitry Andric GVs->replaceOperandWith(I, DGVE);
4995ca5951eSDimitry Andric }
5005ca5951eSDimitry Andric }
5015ca5951eSDimitry Andric
5025ca5951eSDimitry Andric // Upgrade variables attached to globals.
5035ca5951eSDimitry Andric for (auto &GV : TheModule.globals()) {
5045517e702SDimitry Andric SmallVector<MDNode *, 1> MDs;
5055ca5951eSDimitry Andric GV.getMetadata(LLVMContext::MD_dbg, MDs);
5065ca5951eSDimitry Andric GV.eraseMetadata(LLVMContext::MD_dbg);
5075ca5951eSDimitry Andric for (auto *MD : MDs)
5085ca5951eSDimitry Andric if (auto *DGV = dyn_cast_or_null<DIGlobalVariable>(MD)) {
5092cab237bSDimitry Andric auto *DGVE = DIGlobalVariableExpression::getDistinct(
5102cab237bSDimitry Andric Context, DGV, DIExpression::get(Context, {}));
5115ca5951eSDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
5125ca5951eSDimitry Andric } else
5135ca5951eSDimitry Andric GV.addMetadata(LLVMContext::MD_dbg, *MD);
5145ca5951eSDimitry Andric }
5155ca5951eSDimitry Andric }
5165ca5951eSDimitry Andric
5176bc11b14SDimitry Andric /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5186bc11b14SDimitry Andric /// describes a function argument.
upgradeDeclareExpressions(Function & F)5196bc11b14SDimitry Andric void upgradeDeclareExpressions(Function &F) {
5206bc11b14SDimitry Andric if (!NeedDeclareExpressionUpgrade)
5216bc11b14SDimitry Andric return;
5226bc11b14SDimitry Andric
5236bc11b14SDimitry Andric for (auto &BB : F)
5246bc11b14SDimitry Andric for (auto &I : BB)
5256bc11b14SDimitry Andric if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5266bc11b14SDimitry Andric if (auto *DIExpr = DDI->getExpression())
5276bc11b14SDimitry Andric if (DIExpr->startsWithDeref() &&
5286bc11b14SDimitry Andric dyn_cast_or_null<Argument>(DDI->getAddress())) {
5296bc11b14SDimitry Andric SmallVector<uint64_t, 8> Ops;
5306bc11b14SDimitry Andric Ops.append(std::next(DIExpr->elements_begin()),
5316bc11b14SDimitry Andric DIExpr->elements_end());
5326bc11b14SDimitry Andric auto *E = DIExpression::get(Context, Ops);
5336bc11b14SDimitry Andric DDI->setOperand(2, MetadataAsValue::get(Context, E));
5346bc11b14SDimitry Andric }
5356bc11b14SDimitry Andric }
5366bc11b14SDimitry Andric
53724d58133SDimitry Andric /// Upgrade the expression from previous versions.
upgradeDIExpression(uint64_t FromVersion,MutableArrayRef<uint64_t> & Expr,SmallVectorImpl<uint64_t> & Buffer)53824d58133SDimitry Andric Error upgradeDIExpression(uint64_t FromVersion,
53924d58133SDimitry Andric MutableArrayRef<uint64_t> &Expr,
54024d58133SDimitry Andric SmallVectorImpl<uint64_t> &Buffer) {
54124d58133SDimitry Andric auto N = Expr.size();
54224d58133SDimitry Andric switch (FromVersion) {
54324d58133SDimitry Andric default:
54424d58133SDimitry Andric return error("Invalid record");
54524d58133SDimitry Andric case 0:
54624d58133SDimitry Andric if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
54724d58133SDimitry Andric Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
54824d58133SDimitry Andric LLVM_FALLTHROUGH;
54924d58133SDimitry Andric case 1:
55024d58133SDimitry Andric // Move DW_OP_deref to the end.
55124d58133SDimitry Andric if (N && Expr[0] == dwarf::DW_OP_deref) {
55224d58133SDimitry Andric auto End = Expr.end();
55324d58133SDimitry Andric if (Expr.size() >= 3 &&
55424d58133SDimitry Andric *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
55524d58133SDimitry Andric End = std::prev(End, 3);
55624d58133SDimitry Andric std::move(std::next(Expr.begin()), End, Expr.begin());
55724d58133SDimitry Andric *std::prev(End) = dwarf::DW_OP_deref;
55824d58133SDimitry Andric }
55924d58133SDimitry Andric NeedDeclareExpressionUpgrade = true;
56024d58133SDimitry Andric LLVM_FALLTHROUGH;
56124d58133SDimitry Andric case 2: {
56224d58133SDimitry Andric // Change DW_OP_plus to DW_OP_plus_uconst.
56324d58133SDimitry Andric // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
56424d58133SDimitry Andric auto SubExpr = ArrayRef<uint64_t>(Expr);
56524d58133SDimitry Andric while (!SubExpr.empty()) {
56624d58133SDimitry Andric // Skip past other operators with their operands
56724d58133SDimitry Andric // for this version of the IR, obtained from
56824d58133SDimitry Andric // from historic DIExpression::ExprOperand::getSize().
56924d58133SDimitry Andric size_t HistoricSize;
57024d58133SDimitry Andric switch (SubExpr.front()) {
57124d58133SDimitry Andric default:
57224d58133SDimitry Andric HistoricSize = 1;
57324d58133SDimitry Andric break;
57424d58133SDimitry Andric case dwarf::DW_OP_constu:
57524d58133SDimitry Andric case dwarf::DW_OP_minus:
57624d58133SDimitry Andric case dwarf::DW_OP_plus:
57724d58133SDimitry Andric HistoricSize = 2;
57824d58133SDimitry Andric break;
57924d58133SDimitry Andric case dwarf::DW_OP_LLVM_fragment:
58024d58133SDimitry Andric HistoricSize = 3;
58124d58133SDimitry Andric break;
58224d58133SDimitry Andric }
58324d58133SDimitry Andric
58424d58133SDimitry Andric // If the expression is malformed, make sure we don't
58524d58133SDimitry Andric // copy more elements than we should.
58624d58133SDimitry Andric HistoricSize = std::min(SubExpr.size(), HistoricSize);
58724d58133SDimitry Andric ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize-1);
58824d58133SDimitry Andric
58924d58133SDimitry Andric switch (SubExpr.front()) {
59024d58133SDimitry Andric case dwarf::DW_OP_plus:
59124d58133SDimitry Andric Buffer.push_back(dwarf::DW_OP_plus_uconst);
59224d58133SDimitry Andric Buffer.append(Args.begin(), Args.end());
59324d58133SDimitry Andric break;
59424d58133SDimitry Andric case dwarf::DW_OP_minus:
59524d58133SDimitry Andric Buffer.push_back(dwarf::DW_OP_constu);
59624d58133SDimitry Andric Buffer.append(Args.begin(), Args.end());
59724d58133SDimitry Andric Buffer.push_back(dwarf::DW_OP_minus);
59824d58133SDimitry Andric break;
59924d58133SDimitry Andric default:
60024d58133SDimitry Andric Buffer.push_back(*SubExpr.begin());
60124d58133SDimitry Andric Buffer.append(Args.begin(), Args.end());
60224d58133SDimitry Andric break;
60324d58133SDimitry Andric }
60424d58133SDimitry Andric
60524d58133SDimitry Andric // Continue with remaining elements.
60624d58133SDimitry Andric SubExpr = SubExpr.slice(HistoricSize);
60724d58133SDimitry Andric }
60824d58133SDimitry Andric Expr = MutableArrayRef<uint64_t>(Buffer);
60924d58133SDimitry Andric LLVM_FALLTHROUGH;
61024d58133SDimitry Andric }
61124d58133SDimitry Andric case 3:
61224d58133SDimitry Andric // Up-to-date!
61324d58133SDimitry Andric break;
61424d58133SDimitry Andric }
61524d58133SDimitry Andric
61624d58133SDimitry Andric return Error::success();
61724d58133SDimitry Andric }
61824d58133SDimitry Andric
upgradeDebugInfo()6195ca5951eSDimitry Andric void upgradeDebugInfo() {
6205ca5951eSDimitry Andric upgradeCUSubprograms();
6215ca5951eSDimitry Andric upgradeCUVariables();
6225ca5951eSDimitry Andric }
6235ca5951eSDimitry Andric
624d88c1a5aSDimitry Andric public:
MetadataLoaderImpl(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,std::function<Type * (unsigned)> getTypeByID,bool IsImporting)625d88c1a5aSDimitry Andric MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
626d88c1a5aSDimitry Andric BitcodeReaderValueList &ValueList,
627d88c1a5aSDimitry Andric std::function<Type *(unsigned)> getTypeByID,
628d88c1a5aSDimitry Andric bool IsImporting)
629d88c1a5aSDimitry Andric : MetadataList(TheModule.getContext()), ValueList(ValueList),
630d88c1a5aSDimitry Andric Stream(Stream), Context(TheModule.getContext()), TheModule(TheModule),
6317a7e6055SDimitry Andric getTypeByID(std::move(getTypeByID)), IsImporting(IsImporting) {}
632d88c1a5aSDimitry Andric
633d88c1a5aSDimitry Andric Error parseMetadata(bool ModuleLevel);
634d88c1a5aSDimitry Andric
hasFwdRefs() const635d88c1a5aSDimitry Andric bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
636f8496407SDimitry Andric
getMetadataFwdRefOrLoad(unsigned ID)637f8496407SDimitry Andric Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
638f8496407SDimitry Andric if (ID < MDStringRef.size())
639f8496407SDimitry Andric return lazyLoadOneMDString(ID);
640f8496407SDimitry Andric if (auto *MD = MetadataList.lookup(ID))
641f8496407SDimitry Andric return MD;
642f8496407SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand
643f8496407SDimitry Andric // instead of creating a temporary.
644f8496407SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
645f8496407SDimitry Andric PlaceholderQueue Placeholders;
646f8496407SDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
647f8496407SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
648f8496407SDimitry Andric return MetadataList.lookup(ID);
649f8496407SDimitry Andric }
650f8496407SDimitry Andric return MetadataList.getMetadataFwdRef(ID);
651d88c1a5aSDimitry Andric }
652d88c1a5aSDimitry Andric
lookupSubprogramForFunction(Function * F)653d88c1a5aSDimitry Andric DISubprogram *lookupSubprogramForFunction(Function *F) {
654d88c1a5aSDimitry Andric return FunctionsWithSPs.lookup(F);
655d88c1a5aSDimitry Andric }
656d88c1a5aSDimitry Andric
hasSeenOldLoopTags()657d88c1a5aSDimitry Andric bool hasSeenOldLoopTags() { return HasSeenOldLoopTags; }
658d88c1a5aSDimitry Andric
659d88c1a5aSDimitry Andric Error parseMetadataAttachment(
660d88c1a5aSDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList);
661d88c1a5aSDimitry Andric
662d88c1a5aSDimitry Andric Error parseMetadataKinds();
663d88c1a5aSDimitry Andric
setStripTBAA(bool Value)664d88c1a5aSDimitry Andric void setStripTBAA(bool Value) { StripTBAA = Value; }
isStrippingTBAA()665d88c1a5aSDimitry Andric bool isStrippingTBAA() { return StripTBAA; }
666d88c1a5aSDimitry Andric
size() const667d88c1a5aSDimitry Andric unsigned size() const { return MetadataList.size(); }
shrinkTo(unsigned N)668d88c1a5aSDimitry Andric void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
upgradeDebugIntrinsics(Function & F)6696bc11b14SDimitry Andric void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
670d88c1a5aSDimitry Andric };
671d88c1a5aSDimitry Andric
67224e2fe98SDimitry Andric Expected<bool>
lazyLoadModuleMetadataBlock()67324e2fe98SDimitry Andric MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
67495ec533aSDimitry Andric IndexCursor = Stream;
67595ec533aSDimitry Andric SmallVector<uint64_t, 64> Record;
67695ec533aSDimitry Andric // Get the abbrevs, and preload record positions to make them lazy-loadable.
67795ec533aSDimitry Andric while (true) {
67895ec533aSDimitry Andric BitstreamEntry Entry = IndexCursor.advanceSkippingSubblocks(
67995ec533aSDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd);
68095ec533aSDimitry Andric switch (Entry.Kind) {
68195ec533aSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
68295ec533aSDimitry Andric case BitstreamEntry::Error:
68395ec533aSDimitry Andric return error("Malformed block");
68495ec533aSDimitry Andric case BitstreamEntry::EndBlock: {
68595ec533aSDimitry Andric return true;
68695ec533aSDimitry Andric }
68795ec533aSDimitry Andric case BitstreamEntry::Record: {
68895ec533aSDimitry Andric // The interesting case.
68995ec533aSDimitry Andric ++NumMDRecordLoaded;
69095ec533aSDimitry Andric uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
69195ec533aSDimitry Andric auto Code = IndexCursor.skipRecord(Entry.ID);
69295ec533aSDimitry Andric switch (Code) {
69395ec533aSDimitry Andric case bitc::METADATA_STRINGS: {
69495ec533aSDimitry Andric // Rewind and parse the strings.
69595ec533aSDimitry Andric IndexCursor.JumpToBit(CurrentPos);
69695ec533aSDimitry Andric StringRef Blob;
69795ec533aSDimitry Andric Record.clear();
69895ec533aSDimitry Andric IndexCursor.readRecord(Entry.ID, Record, &Blob);
69995ec533aSDimitry Andric unsigned NumStrings = Record[0];
70095ec533aSDimitry Andric MDStringRef.reserve(NumStrings);
70195ec533aSDimitry Andric auto IndexNextMDString = [&](StringRef Str) {
70295ec533aSDimitry Andric MDStringRef.push_back(Str);
70395ec533aSDimitry Andric };
70495ec533aSDimitry Andric if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
70595ec533aSDimitry Andric return std::move(Err);
70695ec533aSDimitry Andric break;
70795ec533aSDimitry Andric }
70895ec533aSDimitry Andric case bitc::METADATA_INDEX_OFFSET: {
70995ec533aSDimitry Andric // This is the offset to the index, when we see this we skip all the
71095ec533aSDimitry Andric // records and load only an index to these.
71195ec533aSDimitry Andric IndexCursor.JumpToBit(CurrentPos);
71295ec533aSDimitry Andric Record.clear();
71395ec533aSDimitry Andric IndexCursor.readRecord(Entry.ID, Record);
71495ec533aSDimitry Andric if (Record.size() != 2)
71595ec533aSDimitry Andric return error("Invalid record");
71695ec533aSDimitry Andric auto Offset = Record[0] + (Record[1] << 32);
71795ec533aSDimitry Andric auto BeginPos = IndexCursor.GetCurrentBitNo();
71895ec533aSDimitry Andric IndexCursor.JumpToBit(BeginPos + Offset);
71995ec533aSDimitry Andric Entry = IndexCursor.advanceSkippingSubblocks(
72095ec533aSDimitry Andric BitstreamCursor::AF_DontPopBlockAtEnd);
72195ec533aSDimitry Andric assert(Entry.Kind == BitstreamEntry::Record &&
72295ec533aSDimitry Andric "Corrupted bitcode: Expected `Record` when trying to find the "
72395ec533aSDimitry Andric "Metadata index");
72495ec533aSDimitry Andric Record.clear();
72595ec533aSDimitry Andric auto Code = IndexCursor.readRecord(Entry.ID, Record);
72695ec533aSDimitry Andric (void)Code;
72795ec533aSDimitry Andric assert(Code == bitc::METADATA_INDEX && "Corrupted bitcode: Expected "
72895ec533aSDimitry Andric "`METADATA_INDEX` when trying "
72995ec533aSDimitry Andric "to find the Metadata index");
73095ec533aSDimitry Andric
73195ec533aSDimitry Andric // Delta unpack
73295ec533aSDimitry Andric auto CurrentValue = BeginPos;
73395ec533aSDimitry Andric GlobalMetadataBitPosIndex.reserve(Record.size());
73495ec533aSDimitry Andric for (auto &Elt : Record) {
73595ec533aSDimitry Andric CurrentValue += Elt;
73695ec533aSDimitry Andric GlobalMetadataBitPosIndex.push_back(CurrentValue);
73795ec533aSDimitry Andric }
73895ec533aSDimitry Andric break;
73995ec533aSDimitry Andric }
74095ec533aSDimitry Andric case bitc::METADATA_INDEX:
74195ec533aSDimitry Andric // We don't expect to get there, the Index is loaded when we encounter
74295ec533aSDimitry Andric // the offset.
74395ec533aSDimitry Andric return error("Corrupted Metadata block");
74495ec533aSDimitry Andric case bitc::METADATA_NAME: {
74595ec533aSDimitry Andric // Named metadata need to be materialized now and aren't deferred.
74695ec533aSDimitry Andric IndexCursor.JumpToBit(CurrentPos);
74795ec533aSDimitry Andric Record.clear();
74895ec533aSDimitry Andric unsigned Code = IndexCursor.readRecord(Entry.ID, Record);
74995ec533aSDimitry Andric assert(Code == bitc::METADATA_NAME);
75095ec533aSDimitry Andric
75195ec533aSDimitry Andric // Read name of the named metadata.
75295ec533aSDimitry Andric SmallString<8> Name(Record.begin(), Record.end());
75395ec533aSDimitry Andric Code = IndexCursor.ReadCode();
75495ec533aSDimitry Andric
75595ec533aSDimitry Andric // Named Metadata comes in two parts, we expect the name to be followed
75695ec533aSDimitry Andric // by the node
75795ec533aSDimitry Andric Record.clear();
75895ec533aSDimitry Andric unsigned NextBitCode = IndexCursor.readRecord(Code, Record);
75995ec533aSDimitry Andric assert(NextBitCode == bitc::METADATA_NAMED_NODE);
76095ec533aSDimitry Andric (void)NextBitCode;
76195ec533aSDimitry Andric
76295ec533aSDimitry Andric // Read named metadata elements.
76395ec533aSDimitry Andric unsigned Size = Record.size();
76495ec533aSDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
76595ec533aSDimitry Andric for (unsigned i = 0; i != Size; ++i) {
76695ec533aSDimitry Andric // FIXME: We could use a placeholder here, however NamedMDNode are
76795ec533aSDimitry Andric // taking MDNode as operand and not using the Metadata infrastructure.
76895ec533aSDimitry Andric // It is acknowledged by 'TODO: Inherit from Metadata' in the
76995ec533aSDimitry Andric // NamedMDNode class definition.
77095ec533aSDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
771*b5893f02SDimitry Andric assert(MD && "Invalid metadata: expect fwd ref to MDNode");
77295ec533aSDimitry Andric NMD->addOperand(MD);
77395ec533aSDimitry Andric }
77495ec533aSDimitry Andric break;
77595ec533aSDimitry Andric }
77695ec533aSDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
77795ec533aSDimitry Andric // FIXME: we need to do this early because we don't materialize global
77895ec533aSDimitry Andric // value explicitly.
77995ec533aSDimitry Andric IndexCursor.JumpToBit(CurrentPos);
78095ec533aSDimitry Andric Record.clear();
78195ec533aSDimitry Andric IndexCursor.readRecord(Entry.ID, Record);
78295ec533aSDimitry Andric if (Record.size() % 2 == 0)
78395ec533aSDimitry Andric return error("Invalid record");
78495ec533aSDimitry Andric unsigned ValueID = Record[0];
78595ec533aSDimitry Andric if (ValueID >= ValueList.size())
78695ec533aSDimitry Andric return error("Invalid record");
78795ec533aSDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
78895ec533aSDimitry Andric if (Error Err = parseGlobalObjectAttachment(
78995ec533aSDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1)))
79095ec533aSDimitry Andric return std::move(Err);
79195ec533aSDimitry Andric break;
79295ec533aSDimitry Andric }
79395ec533aSDimitry Andric case bitc::METADATA_KIND:
79495ec533aSDimitry Andric case bitc::METADATA_STRING_OLD:
79595ec533aSDimitry Andric case bitc::METADATA_OLD_FN_NODE:
79695ec533aSDimitry Andric case bitc::METADATA_OLD_NODE:
79795ec533aSDimitry Andric case bitc::METADATA_VALUE:
79895ec533aSDimitry Andric case bitc::METADATA_DISTINCT_NODE:
79995ec533aSDimitry Andric case bitc::METADATA_NODE:
80095ec533aSDimitry Andric case bitc::METADATA_LOCATION:
80195ec533aSDimitry Andric case bitc::METADATA_GENERIC_DEBUG:
80295ec533aSDimitry Andric case bitc::METADATA_SUBRANGE:
80395ec533aSDimitry Andric case bitc::METADATA_ENUMERATOR:
80495ec533aSDimitry Andric case bitc::METADATA_BASIC_TYPE:
80595ec533aSDimitry Andric case bitc::METADATA_DERIVED_TYPE:
80695ec533aSDimitry Andric case bitc::METADATA_COMPOSITE_TYPE:
80795ec533aSDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE:
80895ec533aSDimitry Andric case bitc::METADATA_MODULE:
80995ec533aSDimitry Andric case bitc::METADATA_FILE:
81095ec533aSDimitry Andric case bitc::METADATA_COMPILE_UNIT:
81195ec533aSDimitry Andric case bitc::METADATA_SUBPROGRAM:
81295ec533aSDimitry Andric case bitc::METADATA_LEXICAL_BLOCK:
81395ec533aSDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE:
81495ec533aSDimitry Andric case bitc::METADATA_NAMESPACE:
81595ec533aSDimitry Andric case bitc::METADATA_MACRO:
81695ec533aSDimitry Andric case bitc::METADATA_MACRO_FILE:
81795ec533aSDimitry Andric case bitc::METADATA_TEMPLATE_TYPE:
81895ec533aSDimitry Andric case bitc::METADATA_TEMPLATE_VALUE:
81995ec533aSDimitry Andric case bitc::METADATA_GLOBAL_VAR:
82095ec533aSDimitry Andric case bitc::METADATA_LOCAL_VAR:
8214ba319b5SDimitry Andric case bitc::METADATA_LABEL:
82295ec533aSDimitry Andric case bitc::METADATA_EXPRESSION:
82395ec533aSDimitry Andric case bitc::METADATA_OBJC_PROPERTY:
82495ec533aSDimitry Andric case bitc::METADATA_IMPORTED_ENTITY:
82595ec533aSDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR:
82695ec533aSDimitry Andric // We don't expect to see any of these, if we see one, give up on
82795ec533aSDimitry Andric // lazy-loading and fallback.
82895ec533aSDimitry Andric MDStringRef.clear();
82995ec533aSDimitry Andric GlobalMetadataBitPosIndex.clear();
83095ec533aSDimitry Andric return false;
83195ec533aSDimitry Andric }
83295ec533aSDimitry Andric break;
83395ec533aSDimitry Andric }
83495ec533aSDimitry Andric }
83595ec533aSDimitry Andric }
83695ec533aSDimitry Andric }
83795ec533aSDimitry Andric
838d88c1a5aSDimitry Andric /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
839d88c1a5aSDimitry Andric /// module level metadata.
parseMetadata(bool ModuleLevel)840d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
841d88c1a5aSDimitry Andric if (!ModuleLevel && MetadataList.hasFwdRefs())
842d88c1a5aSDimitry Andric return error("Invalid metadata: fwd refs into function blocks");
843d88c1a5aSDimitry Andric
84495ec533aSDimitry Andric // Record the entry position so that we can jump back here and efficiently
84595ec533aSDimitry Andric // skip the whole block in case we lazy-load.
84695ec533aSDimitry Andric auto EntryPos = Stream.GetCurrentBitNo();
84795ec533aSDimitry Andric
848d88c1a5aSDimitry Andric if (Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
849d88c1a5aSDimitry Andric return error("Invalid record");
850d88c1a5aSDimitry Andric
851d88c1a5aSDimitry Andric SmallVector<uint64_t, 64> Record;
852d88c1a5aSDimitry Andric PlaceholderQueue Placeholders;
853d88c1a5aSDimitry Andric
85495ec533aSDimitry Andric // We lazy-load module-level metadata: we build an index for each record, and
85595ec533aSDimitry Andric // then load individual record as needed, starting with the named metadata.
85695ec533aSDimitry Andric if (ModuleLevel && IsImporting && MetadataList.empty() &&
85795ec533aSDimitry Andric !DisableLazyLoading) {
85824e2fe98SDimitry Andric auto SuccessOrErr = lazyLoadModuleMetadataBlock();
85995ec533aSDimitry Andric if (!SuccessOrErr)
86095ec533aSDimitry Andric return SuccessOrErr.takeError();
86195ec533aSDimitry Andric if (SuccessOrErr.get()) {
86295ec533aSDimitry Andric // An index was successfully created and we will be able to load metadata
86395ec533aSDimitry Andric // on-demand.
86495ec533aSDimitry Andric MetadataList.resize(MDStringRef.size() +
86595ec533aSDimitry Andric GlobalMetadataBitPosIndex.size());
86695ec533aSDimitry Andric
86795ec533aSDimitry Andric // Reading the named metadata created forward references and/or
86895ec533aSDimitry Andric // placeholders, that we flush here.
86995ec533aSDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
8705ca5951eSDimitry Andric upgradeDebugInfo();
87195ec533aSDimitry Andric // Return at the beginning of the block, since it is easy to skip it
87295ec533aSDimitry Andric // entirely from there.
87395ec533aSDimitry Andric Stream.ReadBlockEnd(); // Pop the abbrev block context.
87495ec533aSDimitry Andric Stream.JumpToBit(EntryPos);
87595ec533aSDimitry Andric if (Stream.SkipBlock())
87695ec533aSDimitry Andric return error("Invalid record");
87795ec533aSDimitry Andric return Error::success();
87895ec533aSDimitry Andric }
87995ec533aSDimitry Andric // Couldn't load an index, fallback to loading all the block "old-style".
88095ec533aSDimitry Andric }
88195ec533aSDimitry Andric
88295ec533aSDimitry Andric unsigned NextMetadataNo = MetadataList.size();
88395ec533aSDimitry Andric
884d88c1a5aSDimitry Andric // Read all the records.
885d88c1a5aSDimitry Andric while (true) {
886d88c1a5aSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
887d88c1a5aSDimitry Andric
888d88c1a5aSDimitry Andric switch (Entry.Kind) {
889d88c1a5aSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
890d88c1a5aSDimitry Andric case BitstreamEntry::Error:
891d88c1a5aSDimitry Andric return error("Malformed block");
892d88c1a5aSDimitry Andric case BitstreamEntry::EndBlock:
89395ec533aSDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
8945ca5951eSDimitry Andric upgradeDebugInfo();
895d88c1a5aSDimitry Andric return Error::success();
896d88c1a5aSDimitry Andric case BitstreamEntry::Record:
897d88c1a5aSDimitry Andric // The interesting case.
898d88c1a5aSDimitry Andric break;
899d88c1a5aSDimitry Andric }
900d88c1a5aSDimitry Andric
901d88c1a5aSDimitry Andric // Read a record.
902d88c1a5aSDimitry Andric Record.clear();
903d88c1a5aSDimitry Andric StringRef Blob;
90495ec533aSDimitry Andric ++NumMDRecordLoaded;
905d88c1a5aSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record, &Blob);
90695ec533aSDimitry Andric if (Error Err =
90795ec533aSDimitry Andric parseOneMetadata(Record, Code, Placeholders, Blob, NextMetadataNo))
908d88c1a5aSDimitry Andric return Err;
909d88c1a5aSDimitry Andric }
910d88c1a5aSDimitry Andric }
911d88c1a5aSDimitry Andric
lazyLoadOneMDString(unsigned ID)91295ec533aSDimitry Andric MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
91395ec533aSDimitry Andric ++NumMDStringLoaded;
91495ec533aSDimitry Andric if (Metadata *MD = MetadataList.lookup(ID))
91595ec533aSDimitry Andric return cast<MDString>(MD);
91695ec533aSDimitry Andric auto MDS = MDString::get(Context, MDStringRef[ID]);
91795ec533aSDimitry Andric MetadataList.assignValue(MDS, ID);
91895ec533aSDimitry Andric return MDS;
91995ec533aSDimitry Andric }
92095ec533aSDimitry Andric
lazyLoadOneMetadata(unsigned ID,PlaceholderQueue & Placeholders)92195ec533aSDimitry Andric void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
92295ec533aSDimitry Andric unsigned ID, PlaceholderQueue &Placeholders) {
92395ec533aSDimitry Andric assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
92495ec533aSDimitry Andric assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
92595ec533aSDimitry Andric // Lookup first if the metadata hasn't already been loaded.
92695ec533aSDimitry Andric if (auto *MD = MetadataList.lookup(ID)) {
92795ec533aSDimitry Andric auto *N = dyn_cast_or_null<MDNode>(MD);
92894c53d40SDimitry Andric if (!N->isTemporary())
92994c53d40SDimitry Andric return;
93095ec533aSDimitry Andric }
93195ec533aSDimitry Andric SmallVector<uint64_t, 64> Record;
93295ec533aSDimitry Andric StringRef Blob;
93395ec533aSDimitry Andric IndexCursor.JumpToBit(GlobalMetadataBitPosIndex[ID - MDStringRef.size()]);
93495ec533aSDimitry Andric auto Entry = IndexCursor.advanceSkippingSubblocks();
93595ec533aSDimitry Andric ++NumMDRecordLoaded;
93695ec533aSDimitry Andric unsigned Code = IndexCursor.readRecord(Entry.ID, Record, &Blob);
93795ec533aSDimitry Andric if (Error Err = parseOneMetadata(Record, Code, Placeholders, Blob, ID))
93895ec533aSDimitry Andric report_fatal_error("Can't lazyload MD");
93995ec533aSDimitry Andric }
94095ec533aSDimitry Andric
94195ec533aSDimitry Andric /// Ensure that all forward-references and placeholders are resolved.
94295ec533aSDimitry Andric /// Iteratively lazy-loading metadata on-demand if needed.
resolveForwardRefsAndPlaceholders(PlaceholderQueue & Placeholders)94395ec533aSDimitry Andric void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
94495ec533aSDimitry Andric PlaceholderQueue &Placeholders) {
94595ec533aSDimitry Andric DenseSet<unsigned> Temporaries;
94695ec533aSDimitry Andric while (1) {
94795ec533aSDimitry Andric // Populate Temporaries with the placeholders that haven't been loaded yet.
94895ec533aSDimitry Andric Placeholders.getTemporaries(MetadataList, Temporaries);
94995ec533aSDimitry Andric
95095ec533aSDimitry Andric // If we don't have any temporary, or FwdReference, we're done!
95195ec533aSDimitry Andric if (Temporaries.empty() && !MetadataList.hasFwdRefs())
95295ec533aSDimitry Andric break;
95395ec533aSDimitry Andric
95495ec533aSDimitry Andric // First, load all the temporaries. This can add new placeholders or
95595ec533aSDimitry Andric // forward references.
95695ec533aSDimitry Andric for (auto ID : Temporaries)
95795ec533aSDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
95895ec533aSDimitry Andric Temporaries.clear();
95995ec533aSDimitry Andric
96095ec533aSDimitry Andric // Second, load the forward-references. This can also add new placeholders
96195ec533aSDimitry Andric // or forward references.
96295ec533aSDimitry Andric while (MetadataList.hasFwdRefs())
96395ec533aSDimitry Andric lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
96495ec533aSDimitry Andric }
96595ec533aSDimitry Andric // At this point we don't have any forward reference remaining, or temporary
96695ec533aSDimitry Andric // that haven't been loaded. We can safely drop RAUW support and mark cycles
96795ec533aSDimitry Andric // as resolved.
96895ec533aSDimitry Andric MetadataList.tryToResolveCycles();
96995ec533aSDimitry Andric
97095ec533aSDimitry Andric // Finally, everything is in place, we can replace the placeholders operands
97195ec533aSDimitry Andric // with the final node they refer to.
97295ec533aSDimitry Andric Placeholders.flush(MetadataList);
97395ec533aSDimitry Andric }
97495ec533aSDimitry Andric
parseOneMetadata(SmallVectorImpl<uint64_t> & Record,unsigned Code,PlaceholderQueue & Placeholders,StringRef Blob,unsigned & NextMetadataNo)975d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
976d88c1a5aSDimitry Andric SmallVectorImpl<uint64_t> &Record, unsigned Code,
97795ec533aSDimitry Andric PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
978d88c1a5aSDimitry Andric
979d88c1a5aSDimitry Andric bool IsDistinct = false;
980d88c1a5aSDimitry Andric auto getMD = [&](unsigned ID) -> Metadata * {
98195ec533aSDimitry Andric if (ID < MDStringRef.size())
98295ec533aSDimitry Andric return lazyLoadOneMDString(ID);
98394c53d40SDimitry Andric if (!IsDistinct) {
98494c53d40SDimitry Andric if (auto *MD = MetadataList.lookup(ID))
98594c53d40SDimitry Andric return MD;
98694c53d40SDimitry Andric // If lazy-loading is enabled, we try recursively to load the operand
98794c53d40SDimitry Andric // instead of creating a temporary.
98894c53d40SDimitry Andric if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
98994c53d40SDimitry Andric // Create a temporary for the node that is referencing the operand we
99094c53d40SDimitry Andric // will lazy-load. It is needed before recursing in case there are
99194c53d40SDimitry Andric // uniquing cycles.
99294c53d40SDimitry Andric MetadataList.getMetadataFwdRef(NextMetadataNo);
99394c53d40SDimitry Andric lazyLoadOneMetadata(ID, Placeholders);
99494c53d40SDimitry Andric return MetadataList.lookup(ID);
99594c53d40SDimitry Andric }
99694c53d40SDimitry Andric // Return a temporary.
997d88c1a5aSDimitry Andric return MetadataList.getMetadataFwdRef(ID);
99894c53d40SDimitry Andric }
999d88c1a5aSDimitry Andric if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1000d88c1a5aSDimitry Andric return MD;
1001d88c1a5aSDimitry Andric return &Placeholders.getPlaceholderOp(ID);
1002d88c1a5aSDimitry Andric };
1003d88c1a5aSDimitry Andric auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1004d88c1a5aSDimitry Andric if (ID)
1005d88c1a5aSDimitry Andric return getMD(ID - 1);
1006d88c1a5aSDimitry Andric return nullptr;
1007d88c1a5aSDimitry Andric };
1008d88c1a5aSDimitry Andric auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1009d88c1a5aSDimitry Andric if (ID)
1010d88c1a5aSDimitry Andric return MetadataList.getMetadataFwdRef(ID - 1);
1011d88c1a5aSDimitry Andric return nullptr;
1012d88c1a5aSDimitry Andric };
1013d88c1a5aSDimitry Andric auto getMDString = [&](unsigned ID) -> MDString * {
1014d88c1a5aSDimitry Andric // This requires that the ID is not really a forward reference. In
1015d88c1a5aSDimitry Andric // particular, the MDString must already have been resolved.
101695ec533aSDimitry Andric auto MDS = getMDOrNull(ID);
101795ec533aSDimitry Andric return cast_or_null<MDString>(MDS);
1018d88c1a5aSDimitry Andric };
1019d88c1a5aSDimitry Andric
1020d88c1a5aSDimitry Andric // Support for old type refs.
1021d88c1a5aSDimitry Andric auto getDITypeRefOrNull = [&](unsigned ID) {
1022d88c1a5aSDimitry Andric return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1023d88c1a5aSDimitry Andric };
1024d88c1a5aSDimitry Andric
1025d88c1a5aSDimitry Andric #define GET_OR_DISTINCT(CLASS, ARGS) \
1026d88c1a5aSDimitry Andric (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1027d88c1a5aSDimitry Andric
1028d88c1a5aSDimitry Andric switch (Code) {
1029d88c1a5aSDimitry Andric default: // Default behavior: ignore.
1030d88c1a5aSDimitry Andric break;
1031d88c1a5aSDimitry Andric case bitc::METADATA_NAME: {
1032d88c1a5aSDimitry Andric // Read name of the named metadata.
1033d88c1a5aSDimitry Andric SmallString<8> Name(Record.begin(), Record.end());
1034d88c1a5aSDimitry Andric Record.clear();
1035d88c1a5aSDimitry Andric Code = Stream.ReadCode();
1036d88c1a5aSDimitry Andric
103795ec533aSDimitry Andric ++NumMDRecordLoaded;
1038d88c1a5aSDimitry Andric unsigned NextBitCode = Stream.readRecord(Code, Record);
1039d88c1a5aSDimitry Andric if (NextBitCode != bitc::METADATA_NAMED_NODE)
1040d88c1a5aSDimitry Andric return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
1041d88c1a5aSDimitry Andric
1042d88c1a5aSDimitry Andric // Read named metadata elements.
1043d88c1a5aSDimitry Andric unsigned Size = Record.size();
1044d88c1a5aSDimitry Andric NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1045d88c1a5aSDimitry Andric for (unsigned i = 0; i != Size; ++i) {
1046d88c1a5aSDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1047d88c1a5aSDimitry Andric if (!MD)
1048*b5893f02SDimitry Andric return error("Invalid named metadata: expect fwd ref to MDNode");
1049d88c1a5aSDimitry Andric NMD->addOperand(MD);
1050d88c1a5aSDimitry Andric }
1051d88c1a5aSDimitry Andric break;
1052d88c1a5aSDimitry Andric }
1053d88c1a5aSDimitry Andric case bitc::METADATA_OLD_FN_NODE: {
1054d88c1a5aSDimitry Andric // FIXME: Remove in 4.0.
1055d88c1a5aSDimitry Andric // This is a LocalAsMetadata record, the only type of function-local
1056d88c1a5aSDimitry Andric // metadata.
1057d88c1a5aSDimitry Andric if (Record.size() % 2 == 1)
1058d88c1a5aSDimitry Andric return error("Invalid record");
1059d88c1a5aSDimitry Andric
1060d88c1a5aSDimitry Andric // If this isn't a LocalAsMetadata record, we're dropping it. This used
1061d88c1a5aSDimitry Andric // to be legal, but there's no upgrade path.
1062d88c1a5aSDimitry Andric auto dropRecord = [&] {
106398221d2eSDimitry Andric MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
106498221d2eSDimitry Andric NextMetadataNo++;
1065d88c1a5aSDimitry Andric };
1066d88c1a5aSDimitry Andric if (Record.size() != 2) {
1067d88c1a5aSDimitry Andric dropRecord();
1068d88c1a5aSDimitry Andric break;
1069d88c1a5aSDimitry Andric }
1070d88c1a5aSDimitry Andric
1071d88c1a5aSDimitry Andric Type *Ty = getTypeByID(Record[0]);
1072d88c1a5aSDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1073d88c1a5aSDimitry Andric dropRecord();
1074d88c1a5aSDimitry Andric break;
1075d88c1a5aSDimitry Andric }
1076d88c1a5aSDimitry Andric
1077d88c1a5aSDimitry Andric MetadataList.assignValue(
1078d88c1a5aSDimitry Andric LocalAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
107998221d2eSDimitry Andric NextMetadataNo);
108098221d2eSDimitry Andric NextMetadataNo++;
1081d88c1a5aSDimitry Andric break;
1082d88c1a5aSDimitry Andric }
1083d88c1a5aSDimitry Andric case bitc::METADATA_OLD_NODE: {
1084d88c1a5aSDimitry Andric // FIXME: Remove in 4.0.
1085d88c1a5aSDimitry Andric if (Record.size() % 2 == 1)
1086d88c1a5aSDimitry Andric return error("Invalid record");
1087d88c1a5aSDimitry Andric
1088d88c1a5aSDimitry Andric unsigned Size = Record.size();
1089d88c1a5aSDimitry Andric SmallVector<Metadata *, 8> Elts;
1090d88c1a5aSDimitry Andric for (unsigned i = 0; i != Size; i += 2) {
1091d88c1a5aSDimitry Andric Type *Ty = getTypeByID(Record[i]);
1092d88c1a5aSDimitry Andric if (!Ty)
1093d88c1a5aSDimitry Andric return error("Invalid record");
1094d88c1a5aSDimitry Andric if (Ty->isMetadataTy())
1095d88c1a5aSDimitry Andric Elts.push_back(getMD(Record[i + 1]));
1096d88c1a5aSDimitry Andric else if (!Ty->isVoidTy()) {
1097d88c1a5aSDimitry Andric auto *MD =
1098d88c1a5aSDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[i + 1], Ty));
1099d88c1a5aSDimitry Andric assert(isa<ConstantAsMetadata>(MD) &&
1100d88c1a5aSDimitry Andric "Expected non-function-local metadata");
1101d88c1a5aSDimitry Andric Elts.push_back(MD);
1102d88c1a5aSDimitry Andric } else
1103d88c1a5aSDimitry Andric Elts.push_back(nullptr);
1104d88c1a5aSDimitry Andric }
110598221d2eSDimitry Andric MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
110698221d2eSDimitry Andric NextMetadataNo++;
1107d88c1a5aSDimitry Andric break;
1108d88c1a5aSDimitry Andric }
1109d88c1a5aSDimitry Andric case bitc::METADATA_VALUE: {
1110d88c1a5aSDimitry Andric if (Record.size() != 2)
1111d88c1a5aSDimitry Andric return error("Invalid record");
1112d88c1a5aSDimitry Andric
1113d88c1a5aSDimitry Andric Type *Ty = getTypeByID(Record[0]);
1114d88c1a5aSDimitry Andric if (Ty->isMetadataTy() || Ty->isVoidTy())
1115d88c1a5aSDimitry Andric return error("Invalid record");
1116d88c1a5aSDimitry Andric
1117d88c1a5aSDimitry Andric MetadataList.assignValue(
1118d88c1a5aSDimitry Andric ValueAsMetadata::get(ValueList.getValueFwdRef(Record[1], Ty)),
111998221d2eSDimitry Andric NextMetadataNo);
112098221d2eSDimitry Andric NextMetadataNo++;
1121d88c1a5aSDimitry Andric break;
1122d88c1a5aSDimitry Andric }
1123d88c1a5aSDimitry Andric case bitc::METADATA_DISTINCT_NODE:
1124d88c1a5aSDimitry Andric IsDistinct = true;
1125d88c1a5aSDimitry Andric LLVM_FALLTHROUGH;
1126d88c1a5aSDimitry Andric case bitc::METADATA_NODE: {
1127d88c1a5aSDimitry Andric SmallVector<Metadata *, 8> Elts;
1128d88c1a5aSDimitry Andric Elts.reserve(Record.size());
1129d88c1a5aSDimitry Andric for (unsigned ID : Record)
1130d88c1a5aSDimitry Andric Elts.push_back(getMDOrNull(ID));
1131d88c1a5aSDimitry Andric MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1132d88c1a5aSDimitry Andric : MDNode::get(Context, Elts),
113398221d2eSDimitry Andric NextMetadataNo);
113498221d2eSDimitry Andric NextMetadataNo++;
1135d88c1a5aSDimitry Andric break;
1136d88c1a5aSDimitry Andric }
1137d88c1a5aSDimitry Andric case bitc::METADATA_LOCATION: {
1138*b5893f02SDimitry Andric if (Record.size() != 5 && Record.size() != 6)
1139d88c1a5aSDimitry Andric return error("Invalid record");
1140d88c1a5aSDimitry Andric
1141d88c1a5aSDimitry Andric IsDistinct = Record[0];
1142d88c1a5aSDimitry Andric unsigned Line = Record[1];
1143d88c1a5aSDimitry Andric unsigned Column = Record[2];
1144d88c1a5aSDimitry Andric Metadata *Scope = getMD(Record[3]);
1145d88c1a5aSDimitry Andric Metadata *InlinedAt = getMDOrNull(Record[4]);
1146*b5893f02SDimitry Andric bool ImplicitCode = Record.size() == 6 && Record[5];
1147d88c1a5aSDimitry Andric MetadataList.assignValue(
1148*b5893f02SDimitry Andric GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1149*b5893f02SDimitry Andric ImplicitCode)),
115098221d2eSDimitry Andric NextMetadataNo);
115198221d2eSDimitry Andric NextMetadataNo++;
1152d88c1a5aSDimitry Andric break;
1153d88c1a5aSDimitry Andric }
1154d88c1a5aSDimitry Andric case bitc::METADATA_GENERIC_DEBUG: {
1155d88c1a5aSDimitry Andric if (Record.size() < 4)
1156d88c1a5aSDimitry Andric return error("Invalid record");
1157d88c1a5aSDimitry Andric
1158d88c1a5aSDimitry Andric IsDistinct = Record[0];
1159d88c1a5aSDimitry Andric unsigned Tag = Record[1];
1160d88c1a5aSDimitry Andric unsigned Version = Record[2];
1161d88c1a5aSDimitry Andric
1162d88c1a5aSDimitry Andric if (Tag >= 1u << 16 || Version != 0)
1163d88c1a5aSDimitry Andric return error("Invalid record");
1164d88c1a5aSDimitry Andric
1165d88c1a5aSDimitry Andric auto *Header = getMDString(Record[3]);
1166d88c1a5aSDimitry Andric SmallVector<Metadata *, 8> DwarfOps;
1167d88c1a5aSDimitry Andric for (unsigned I = 4, E = Record.size(); I != E; ++I)
1168d88c1a5aSDimitry Andric DwarfOps.push_back(getMDOrNull(Record[I]));
1169d88c1a5aSDimitry Andric MetadataList.assignValue(
1170d88c1a5aSDimitry Andric GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
117198221d2eSDimitry Andric NextMetadataNo);
117298221d2eSDimitry Andric NextMetadataNo++;
1173d88c1a5aSDimitry Andric break;
1174d88c1a5aSDimitry Andric }
1175d88c1a5aSDimitry Andric case bitc::METADATA_SUBRANGE: {
11764ba319b5SDimitry Andric Metadata *Val = nullptr;
11774ba319b5SDimitry Andric // Operand 'count' is interpreted as:
11784ba319b5SDimitry Andric // - Signed integer (version 0)
11794ba319b5SDimitry Andric // - Metadata node (version 1)
11804ba319b5SDimitry Andric switch (Record[0] >> 1) {
11814ba319b5SDimitry Andric case 0:
11824ba319b5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange,
11834ba319b5SDimitry Andric (Context, Record[1], unrotateSign(Record.back())));
11844ba319b5SDimitry Andric break;
11854ba319b5SDimitry Andric case 1:
11864ba319b5SDimitry Andric Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
11874ba319b5SDimitry Andric unrotateSign(Record.back())));
11884ba319b5SDimitry Andric break;
11894ba319b5SDimitry Andric default:
11904ba319b5SDimitry Andric return error("Invalid record: Unsupported version of DISubrange");
11914ba319b5SDimitry Andric }
1192d88c1a5aSDimitry Andric
11934ba319b5SDimitry Andric MetadataList.assignValue(Val, NextMetadataNo);
11944ba319b5SDimitry Andric IsDistinct = Record[0] & 1;
119598221d2eSDimitry Andric NextMetadataNo++;
1196d88c1a5aSDimitry Andric break;
1197d88c1a5aSDimitry Andric }
1198d88c1a5aSDimitry Andric case bitc::METADATA_ENUMERATOR: {
1199d88c1a5aSDimitry Andric if (Record.size() != 3)
1200d88c1a5aSDimitry Andric return error("Invalid record");
1201d88c1a5aSDimitry Andric
12024ba319b5SDimitry Andric IsDistinct = Record[0] & 1;
12034ba319b5SDimitry Andric bool IsUnsigned = Record[0] & 2;
1204d88c1a5aSDimitry Andric MetadataList.assignValue(
1205d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIEnumerator, (Context, unrotateSign(Record[1]),
12064ba319b5SDimitry Andric IsUnsigned, getMDString(Record[2]))),
120798221d2eSDimitry Andric NextMetadataNo);
120898221d2eSDimitry Andric NextMetadataNo++;
1209d88c1a5aSDimitry Andric break;
1210d88c1a5aSDimitry Andric }
1211d88c1a5aSDimitry Andric case bitc::METADATA_BASIC_TYPE: {
1212*b5893f02SDimitry Andric if (Record.size() < 6 || Record.size() > 7)
1213d88c1a5aSDimitry Andric return error("Invalid record");
1214d88c1a5aSDimitry Andric
1215d88c1a5aSDimitry Andric IsDistinct = Record[0];
1216*b5893f02SDimitry Andric DINode::DIFlags Flags = (Record.size() > 6) ?
1217*b5893f02SDimitry Andric static_cast<DINode::DIFlags>(Record[6]) : DINode::FlagZero;
1218*b5893f02SDimitry Andric
1219d88c1a5aSDimitry Andric MetadataList.assignValue(
1220d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIBasicType,
1221d88c1a5aSDimitry Andric (Context, Record[1], getMDString(Record[2]), Record[3],
1222*b5893f02SDimitry Andric Record[4], Record[5], Flags)),
122398221d2eSDimitry Andric NextMetadataNo);
122498221d2eSDimitry Andric NextMetadataNo++;
1225d88c1a5aSDimitry Andric break;
1226d88c1a5aSDimitry Andric }
1227d88c1a5aSDimitry Andric case bitc::METADATA_DERIVED_TYPE: {
12287a7e6055SDimitry Andric if (Record.size() < 12 || Record.size() > 13)
1229d88c1a5aSDimitry Andric return error("Invalid record");
1230d88c1a5aSDimitry Andric
12317a7e6055SDimitry Andric // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
12327a7e6055SDimitry Andric // that there is no DWARF address space associated with DIDerivedType.
12337a7e6055SDimitry Andric Optional<unsigned> DWARFAddressSpace;
12347a7e6055SDimitry Andric if (Record.size() > 12 && Record[12])
12357a7e6055SDimitry Andric DWARFAddressSpace = Record[12] - 1;
12367a7e6055SDimitry Andric
1237d88c1a5aSDimitry Andric IsDistinct = Record[0];
1238d88c1a5aSDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1239d88c1a5aSDimitry Andric MetadataList.assignValue(
1240d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIDerivedType,
1241d88c1a5aSDimitry Andric (Context, Record[1], getMDString(Record[2]),
1242d88c1a5aSDimitry Andric getMDOrNull(Record[3]), Record[4],
1243d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[5]),
1244d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
12457a7e6055SDimitry Andric Record[9], DWARFAddressSpace, Flags,
12467a7e6055SDimitry Andric getDITypeRefOrNull(Record[11]))),
124798221d2eSDimitry Andric NextMetadataNo);
124898221d2eSDimitry Andric NextMetadataNo++;
1249d88c1a5aSDimitry Andric break;
1250d88c1a5aSDimitry Andric }
1251d88c1a5aSDimitry Andric case bitc::METADATA_COMPOSITE_TYPE: {
12524ba319b5SDimitry Andric if (Record.size() < 16 || Record.size() > 17)
1253d88c1a5aSDimitry Andric return error("Invalid record");
1254d88c1a5aSDimitry Andric
1255d88c1a5aSDimitry Andric // If we have a UUID and this is not a forward declaration, lookup the
1256d88c1a5aSDimitry Andric // mapping.
1257d88c1a5aSDimitry Andric IsDistinct = Record[0] & 0x1;
1258d88c1a5aSDimitry Andric bool IsNotUsedInTypeRef = Record[0] >= 2;
1259d88c1a5aSDimitry Andric unsigned Tag = Record[1];
1260d88c1a5aSDimitry Andric MDString *Name = getMDString(Record[2]);
1261d88c1a5aSDimitry Andric Metadata *File = getMDOrNull(Record[3]);
1262d88c1a5aSDimitry Andric unsigned Line = Record[4];
1263d88c1a5aSDimitry Andric Metadata *Scope = getDITypeRefOrNull(Record[5]);
1264d88c1a5aSDimitry Andric Metadata *BaseType = nullptr;
1265d88c1a5aSDimitry Andric uint64_t SizeInBits = Record[7];
1266d88c1a5aSDimitry Andric if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1267d88c1a5aSDimitry Andric return error("Alignment value is too large");
1268d88c1a5aSDimitry Andric uint32_t AlignInBits = Record[8];
1269d88c1a5aSDimitry Andric uint64_t OffsetInBits = 0;
1270d88c1a5aSDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1271d88c1a5aSDimitry Andric Metadata *Elements = nullptr;
1272d88c1a5aSDimitry Andric unsigned RuntimeLang = Record[12];
1273d88c1a5aSDimitry Andric Metadata *VTableHolder = nullptr;
1274d88c1a5aSDimitry Andric Metadata *TemplateParams = nullptr;
12754ba319b5SDimitry Andric Metadata *Discriminator = nullptr;
1276d88c1a5aSDimitry Andric auto *Identifier = getMDString(Record[15]);
1277d88c1a5aSDimitry Andric // If this module is being parsed so that it can be ThinLTO imported
1278d88c1a5aSDimitry Andric // into another module, composite types only need to be imported
1279d88c1a5aSDimitry Andric // as type declarations (unless full type definitions requested).
1280d88c1a5aSDimitry Andric // Create type declarations up front to save memory. Also, buildODRType
1281d88c1a5aSDimitry Andric // handles the case where this is type ODRed with a definition needed
1282d88c1a5aSDimitry Andric // by the importing module, in which case the existing definition is
1283d88c1a5aSDimitry Andric // used.
12848e0f8b8cSDimitry Andric if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1285d88c1a5aSDimitry Andric (Tag == dwarf::DW_TAG_enumeration_type ||
1286d88c1a5aSDimitry Andric Tag == dwarf::DW_TAG_class_type ||
1287d88c1a5aSDimitry Andric Tag == dwarf::DW_TAG_structure_type ||
1288d88c1a5aSDimitry Andric Tag == dwarf::DW_TAG_union_type)) {
1289d88c1a5aSDimitry Andric Flags = Flags | DINode::FlagFwdDecl;
1290d88c1a5aSDimitry Andric } else {
1291d88c1a5aSDimitry Andric BaseType = getDITypeRefOrNull(Record[6]);
1292d88c1a5aSDimitry Andric OffsetInBits = Record[9];
1293d88c1a5aSDimitry Andric Elements = getMDOrNull(Record[11]);
1294d88c1a5aSDimitry Andric VTableHolder = getDITypeRefOrNull(Record[13]);
1295d88c1a5aSDimitry Andric TemplateParams = getMDOrNull(Record[14]);
12964ba319b5SDimitry Andric if (Record.size() > 16)
12974ba319b5SDimitry Andric Discriminator = getMDOrNull(Record[16]);
1298d88c1a5aSDimitry Andric }
1299d88c1a5aSDimitry Andric DICompositeType *CT = nullptr;
1300d88c1a5aSDimitry Andric if (Identifier)
1301d88c1a5aSDimitry Andric CT = DICompositeType::buildODRType(
1302d88c1a5aSDimitry Andric Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1303d88c1a5aSDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
13044ba319b5SDimitry Andric VTableHolder, TemplateParams, Discriminator);
1305d88c1a5aSDimitry Andric
1306d88c1a5aSDimitry Andric // Create a node if we didn't get a lazy ODR type.
1307d88c1a5aSDimitry Andric if (!CT)
1308d88c1a5aSDimitry Andric CT = GET_OR_DISTINCT(DICompositeType,
1309d88c1a5aSDimitry Andric (Context, Tag, Name, File, Line, Scope, BaseType,
1310d88c1a5aSDimitry Andric SizeInBits, AlignInBits, OffsetInBits, Flags,
1311d88c1a5aSDimitry Andric Elements, RuntimeLang, VTableHolder, TemplateParams,
1312*b5893f02SDimitry Andric Identifier, Discriminator));
1313d88c1a5aSDimitry Andric if (!IsNotUsedInTypeRef && Identifier)
1314d88c1a5aSDimitry Andric MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1315d88c1a5aSDimitry Andric
131698221d2eSDimitry Andric MetadataList.assignValue(CT, NextMetadataNo);
131798221d2eSDimitry Andric NextMetadataNo++;
1318d88c1a5aSDimitry Andric break;
1319d88c1a5aSDimitry Andric }
1320d88c1a5aSDimitry Andric case bitc::METADATA_SUBROUTINE_TYPE: {
1321d88c1a5aSDimitry Andric if (Record.size() < 3 || Record.size() > 4)
1322d88c1a5aSDimitry Andric return error("Invalid record");
1323d88c1a5aSDimitry Andric bool IsOldTypeRefArray = Record[0] < 2;
1324d88c1a5aSDimitry Andric unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1325d88c1a5aSDimitry Andric
1326d88c1a5aSDimitry Andric IsDistinct = Record[0] & 0x1;
1327d88c1a5aSDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1328d88c1a5aSDimitry Andric Metadata *Types = getMDOrNull(Record[2]);
1329d88c1a5aSDimitry Andric if (LLVM_UNLIKELY(IsOldTypeRefArray))
1330d88c1a5aSDimitry Andric Types = MetadataList.upgradeTypeRefArray(Types);
1331d88c1a5aSDimitry Andric
1332d88c1a5aSDimitry Andric MetadataList.assignValue(
1333d88c1a5aSDimitry Andric GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
133498221d2eSDimitry Andric NextMetadataNo);
133598221d2eSDimitry Andric NextMetadataNo++;
1336d88c1a5aSDimitry Andric break;
1337d88c1a5aSDimitry Andric }
1338d88c1a5aSDimitry Andric
1339d88c1a5aSDimitry Andric case bitc::METADATA_MODULE: {
1340d88c1a5aSDimitry Andric if (Record.size() != 6)
1341d88c1a5aSDimitry Andric return error("Invalid record");
1342d88c1a5aSDimitry Andric
1343d88c1a5aSDimitry Andric IsDistinct = Record[0];
1344d88c1a5aSDimitry Andric MetadataList.assignValue(
1345d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIModule,
1346d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1]),
1347d88c1a5aSDimitry Andric getMDString(Record[2]), getMDString(Record[3]),
1348d88c1a5aSDimitry Andric getMDString(Record[4]), getMDString(Record[5]))),
134998221d2eSDimitry Andric NextMetadataNo);
135098221d2eSDimitry Andric NextMetadataNo++;
1351d88c1a5aSDimitry Andric break;
1352d88c1a5aSDimitry Andric }
1353d88c1a5aSDimitry Andric
1354d88c1a5aSDimitry Andric case bitc::METADATA_FILE: {
13554ba319b5SDimitry Andric if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1356d88c1a5aSDimitry Andric return error("Invalid record");
1357d88c1a5aSDimitry Andric
1358d88c1a5aSDimitry Andric IsDistinct = Record[0];
13594ba319b5SDimitry Andric Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
13604ba319b5SDimitry Andric // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
13614ba319b5SDimitry Andric // is not present. This matches up with the old internal representation,
13624ba319b5SDimitry Andric // and the old encoding for CSK_None in the ChecksumKind. The new
13634ba319b5SDimitry Andric // representation reserves the value 0 in the ChecksumKind to continue to
13644ba319b5SDimitry Andric // encode None in a backwards-compatible way.
13654ba319b5SDimitry Andric if (Record.size() > 4 && Record[3] && Record[4])
13664ba319b5SDimitry Andric Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
13674ba319b5SDimitry Andric getMDString(Record[4]));
1368d88c1a5aSDimitry Andric MetadataList.assignValue(
1369d88c1a5aSDimitry Andric GET_OR_DISTINCT(
1370d88c1a5aSDimitry Andric DIFile,
13714ba319b5SDimitry Andric (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
13724ba319b5SDimitry Andric Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
13734ba319b5SDimitry Andric : None)),
137498221d2eSDimitry Andric NextMetadataNo);
137598221d2eSDimitry Andric NextMetadataNo++;
1376d88c1a5aSDimitry Andric break;
1377d88c1a5aSDimitry Andric }
1378d88c1a5aSDimitry Andric case bitc::METADATA_COMPILE_UNIT: {
13792cab237bSDimitry Andric if (Record.size() < 14 || Record.size() > 19)
1380d88c1a5aSDimitry Andric return error("Invalid record");
1381d88c1a5aSDimitry Andric
1382d88c1a5aSDimitry Andric // Ignore Record[0], which indicates whether this compile unit is
1383d88c1a5aSDimitry Andric // distinct. It's always distinct.
1384d88c1a5aSDimitry Andric IsDistinct = true;
1385d88c1a5aSDimitry Andric auto *CU = DICompileUnit::getDistinct(
1386d88c1a5aSDimitry Andric Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1387d88c1a5aSDimitry Andric Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1388d88c1a5aSDimitry Andric Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1389d88c1a5aSDimitry Andric getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1390d88c1a5aSDimitry Andric Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1391d88c1a5aSDimitry Andric Record.size() <= 14 ? 0 : Record[14],
13927a7e6055SDimitry Andric Record.size() <= 16 ? true : Record[16],
13932cab237bSDimitry Andric Record.size() <= 17 ? false : Record[17],
1394*b5893f02SDimitry Andric Record.size() <= 18 ? 0 : Record[18],
1395*b5893f02SDimitry Andric Record.size() <= 19 ? 0 : Record[19]);
1396d88c1a5aSDimitry Andric
139798221d2eSDimitry Andric MetadataList.assignValue(CU, NextMetadataNo);
139898221d2eSDimitry Andric NextMetadataNo++;
1399d88c1a5aSDimitry Andric
1400d88c1a5aSDimitry Andric // Move the Upgrade the list of subprograms.
1401d88c1a5aSDimitry Andric if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1402d88c1a5aSDimitry Andric CUSubprograms.push_back({CU, SPs});
1403d88c1a5aSDimitry Andric break;
1404d88c1a5aSDimitry Andric }
1405d88c1a5aSDimitry Andric case bitc::METADATA_SUBPROGRAM: {
1406f37b6182SDimitry Andric if (Record.size() < 18 || Record.size() > 21)
1407d88c1a5aSDimitry Andric return error("Invalid record");
1408d88c1a5aSDimitry Andric
1409*b5893f02SDimitry Andric bool HasSPFlags = Record[0] & 4;
1410*b5893f02SDimitry Andric DISubprogram::DISPFlags SPFlags =
1411*b5893f02SDimitry Andric HasSPFlags
1412*b5893f02SDimitry Andric ? static_cast<DISubprogram::DISPFlags>(Record[9])
1413*b5893f02SDimitry Andric : DISubprogram::toSPFlags(
1414*b5893f02SDimitry Andric /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
1415*b5893f02SDimitry Andric /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11]);
1416*b5893f02SDimitry Andric
1417*b5893f02SDimitry Andric // All definitions should be distinct.
1418*b5893f02SDimitry Andric IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1419d88c1a5aSDimitry Andric // Version 1 has a Function as Record[15].
1420d88c1a5aSDimitry Andric // Version 2 has removed Record[15].
1421d88c1a5aSDimitry Andric // Version 3 has the Unit as Record[15].
1422d88c1a5aSDimitry Andric // Version 4 added thisAdjustment.
1423*b5893f02SDimitry Andric // Version 5 repacked flags into DISPFlags, changing many element numbers.
1424*b5893f02SDimitry Andric bool HasUnit = Record[0] & 2;
1425*b5893f02SDimitry Andric if (!HasSPFlags && HasUnit && Record.size() < 19)
1426d88c1a5aSDimitry Andric return error("Invalid record");
1427*b5893f02SDimitry Andric if (HasSPFlags && !HasUnit)
1428*b5893f02SDimitry Andric return error("Invalid record");
1429*b5893f02SDimitry Andric // Accommodate older formats.
1430*b5893f02SDimitry Andric bool HasFn = false;
1431*b5893f02SDimitry Andric bool HasThisAdj = true;
1432*b5893f02SDimitry Andric bool HasThrownTypes = true;
1433*b5893f02SDimitry Andric unsigned OffsetA = 0;
1434*b5893f02SDimitry Andric unsigned OffsetB = 0;
1435*b5893f02SDimitry Andric if (!HasSPFlags) {
1436*b5893f02SDimitry Andric OffsetA = 2;
1437*b5893f02SDimitry Andric OffsetB = 2;
1438*b5893f02SDimitry Andric if (Record.size() >= 19) {
1439*b5893f02SDimitry Andric HasFn = !HasUnit;
1440*b5893f02SDimitry Andric OffsetB++;
1441*b5893f02SDimitry Andric }
1442*b5893f02SDimitry Andric HasThisAdj = Record.size() >= 20;
1443*b5893f02SDimitry Andric HasThrownTypes = Record.size() >= 21;
1444*b5893f02SDimitry Andric }
1445*b5893f02SDimitry Andric Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1446d88c1a5aSDimitry Andric DISubprogram *SP = GET_OR_DISTINCT(
1447f37b6182SDimitry Andric DISubprogram,
1448f37b6182SDimitry Andric (Context,
1449d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[1]), // scope
1450d88c1a5aSDimitry Andric getMDString(Record[2]), // name
1451d88c1a5aSDimitry Andric getMDString(Record[3]), // linkageName
1452d88c1a5aSDimitry Andric getMDOrNull(Record[4]), // file
1453d88c1a5aSDimitry Andric Record[5], // line
1454d88c1a5aSDimitry Andric getMDOrNull(Record[6]), // type
1455*b5893f02SDimitry Andric Record[7 + OffsetA], // scopeLine
1456*b5893f02SDimitry Andric getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
1457*b5893f02SDimitry Andric Record[10 + OffsetA], // virtualIndex
1458*b5893f02SDimitry Andric HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
1459*b5893f02SDimitry Andric static_cast<DINode::DIFlags>(Record[11 + OffsetA]),// flags
1460*b5893f02SDimitry Andric SPFlags, // SPFlags
1461d88c1a5aSDimitry Andric HasUnit ? CUorFn : nullptr, // unit
1462*b5893f02SDimitry Andric getMDOrNull(Record[13 + OffsetB]), // templateParams
1463*b5893f02SDimitry Andric getMDOrNull(Record[14 + OffsetB]), // declaration
1464*b5893f02SDimitry Andric getMDOrNull(Record[15 + OffsetB]), // retainedNodes
1465*b5893f02SDimitry Andric HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1466*b5893f02SDimitry Andric : nullptr // thrownTypes
1467d88c1a5aSDimitry Andric ));
146898221d2eSDimitry Andric MetadataList.assignValue(SP, NextMetadataNo);
146998221d2eSDimitry Andric NextMetadataNo++;
1470d88c1a5aSDimitry Andric
1471d88c1a5aSDimitry Andric // Upgrade sp->function mapping to function->sp mapping.
1472d88c1a5aSDimitry Andric if (HasFn) {
1473d88c1a5aSDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1474d88c1a5aSDimitry Andric if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1475d88c1a5aSDimitry Andric if (F->isMaterializable())
1476d88c1a5aSDimitry Andric // Defer until materialized; unmaterialized functions may not have
1477d88c1a5aSDimitry Andric // metadata.
1478d88c1a5aSDimitry Andric FunctionsWithSPs[F] = SP;
1479d88c1a5aSDimitry Andric else if (!F->empty())
1480d88c1a5aSDimitry Andric F->setSubprogram(SP);
1481d88c1a5aSDimitry Andric }
1482d88c1a5aSDimitry Andric }
1483d88c1a5aSDimitry Andric break;
1484d88c1a5aSDimitry Andric }
1485d88c1a5aSDimitry Andric case bitc::METADATA_LEXICAL_BLOCK: {
1486d88c1a5aSDimitry Andric if (Record.size() != 5)
1487d88c1a5aSDimitry Andric return error("Invalid record");
1488d88c1a5aSDimitry Andric
1489d88c1a5aSDimitry Andric IsDistinct = Record[0];
1490d88c1a5aSDimitry Andric MetadataList.assignValue(
1491d88c1a5aSDimitry Andric GET_OR_DISTINCT(DILexicalBlock,
1492d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1]),
1493d88c1a5aSDimitry Andric getMDOrNull(Record[2]), Record[3], Record[4])),
149498221d2eSDimitry Andric NextMetadataNo);
149598221d2eSDimitry Andric NextMetadataNo++;
1496d88c1a5aSDimitry Andric break;
1497d88c1a5aSDimitry Andric }
1498d88c1a5aSDimitry Andric case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1499d88c1a5aSDimitry Andric if (Record.size() != 4)
1500d88c1a5aSDimitry Andric return error("Invalid record");
1501d88c1a5aSDimitry Andric
1502d88c1a5aSDimitry Andric IsDistinct = Record[0];
1503d88c1a5aSDimitry Andric MetadataList.assignValue(
1504d88c1a5aSDimitry Andric GET_OR_DISTINCT(DILexicalBlockFile,
1505d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1]),
1506d88c1a5aSDimitry Andric getMDOrNull(Record[2]), Record[3])),
150798221d2eSDimitry Andric NextMetadataNo);
150898221d2eSDimitry Andric NextMetadataNo++;
1509d88c1a5aSDimitry Andric break;
1510d88c1a5aSDimitry Andric }
1511d88c1a5aSDimitry Andric case bitc::METADATA_NAMESPACE: {
1512f37b6182SDimitry Andric // Newer versions of DINamespace dropped file and line.
1513f37b6182SDimitry Andric MDString *Name;
1514f37b6182SDimitry Andric if (Record.size() == 3)
1515f37b6182SDimitry Andric Name = getMDString(Record[2]);
1516f37b6182SDimitry Andric else if (Record.size() == 5)
1517f37b6182SDimitry Andric Name = getMDString(Record[3]);
1518f37b6182SDimitry Andric else
1519d88c1a5aSDimitry Andric return error("Invalid record");
1520d88c1a5aSDimitry Andric
1521d88c1a5aSDimitry Andric IsDistinct = Record[0] & 1;
1522d88c1a5aSDimitry Andric bool ExportSymbols = Record[0] & 2;
1523d88c1a5aSDimitry Andric MetadataList.assignValue(
1524d88c1a5aSDimitry Andric GET_OR_DISTINCT(DINamespace,
1525f37b6182SDimitry Andric (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
152698221d2eSDimitry Andric NextMetadataNo);
152798221d2eSDimitry Andric NextMetadataNo++;
1528d88c1a5aSDimitry Andric break;
1529d88c1a5aSDimitry Andric }
1530d88c1a5aSDimitry Andric case bitc::METADATA_MACRO: {
1531d88c1a5aSDimitry Andric if (Record.size() != 5)
1532d88c1a5aSDimitry Andric return error("Invalid record");
1533d88c1a5aSDimitry Andric
1534d88c1a5aSDimitry Andric IsDistinct = Record[0];
1535d88c1a5aSDimitry Andric MetadataList.assignValue(
1536d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIMacro,
1537d88c1a5aSDimitry Andric (Context, Record[1], Record[2], getMDString(Record[3]),
1538d88c1a5aSDimitry Andric getMDString(Record[4]))),
153998221d2eSDimitry Andric NextMetadataNo);
154098221d2eSDimitry Andric NextMetadataNo++;
1541d88c1a5aSDimitry Andric break;
1542d88c1a5aSDimitry Andric }
1543d88c1a5aSDimitry Andric case bitc::METADATA_MACRO_FILE: {
1544d88c1a5aSDimitry Andric if (Record.size() != 5)
1545d88c1a5aSDimitry Andric return error("Invalid record");
1546d88c1a5aSDimitry Andric
1547d88c1a5aSDimitry Andric IsDistinct = Record[0];
1548d88c1a5aSDimitry Andric MetadataList.assignValue(
1549d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIMacroFile,
1550d88c1a5aSDimitry Andric (Context, Record[1], Record[2], getMDOrNull(Record[3]),
1551d88c1a5aSDimitry Andric getMDOrNull(Record[4]))),
155298221d2eSDimitry Andric NextMetadataNo);
155398221d2eSDimitry Andric NextMetadataNo++;
1554d88c1a5aSDimitry Andric break;
1555d88c1a5aSDimitry Andric }
1556d88c1a5aSDimitry Andric case bitc::METADATA_TEMPLATE_TYPE: {
1557d88c1a5aSDimitry Andric if (Record.size() != 3)
1558d88c1a5aSDimitry Andric return error("Invalid record");
1559d88c1a5aSDimitry Andric
1560d88c1a5aSDimitry Andric IsDistinct = Record[0];
1561d88c1a5aSDimitry Andric MetadataList.assignValue(GET_OR_DISTINCT(DITemplateTypeParameter,
1562d88c1a5aSDimitry Andric (Context, getMDString(Record[1]),
1563d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[2]))),
156498221d2eSDimitry Andric NextMetadataNo);
156598221d2eSDimitry Andric NextMetadataNo++;
1566d88c1a5aSDimitry Andric break;
1567d88c1a5aSDimitry Andric }
1568d88c1a5aSDimitry Andric case bitc::METADATA_TEMPLATE_VALUE: {
1569d88c1a5aSDimitry Andric if (Record.size() != 5)
1570d88c1a5aSDimitry Andric return error("Invalid record");
1571d88c1a5aSDimitry Andric
1572d88c1a5aSDimitry Andric IsDistinct = Record[0];
1573d88c1a5aSDimitry Andric MetadataList.assignValue(
1574d88c1a5aSDimitry Andric GET_OR_DISTINCT(DITemplateValueParameter,
1575d88c1a5aSDimitry Andric (Context, Record[1], getMDString(Record[2]),
1576d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[3]),
1577d88c1a5aSDimitry Andric getMDOrNull(Record[4]))),
157898221d2eSDimitry Andric NextMetadataNo);
157998221d2eSDimitry Andric NextMetadataNo++;
1580d88c1a5aSDimitry Andric break;
1581d88c1a5aSDimitry Andric }
1582d88c1a5aSDimitry Andric case bitc::METADATA_GLOBAL_VAR: {
1583*b5893f02SDimitry Andric if (Record.size() < 11 || Record.size() > 13)
1584d88c1a5aSDimitry Andric return error("Invalid record");
1585d88c1a5aSDimitry Andric
1586d88c1a5aSDimitry Andric IsDistinct = Record[0] & 1;
1587d88c1a5aSDimitry Andric unsigned Version = Record[0] >> 1;
1588d88c1a5aSDimitry Andric
1589*b5893f02SDimitry Andric if (Version == 2) {
1590*b5893f02SDimitry Andric MetadataList.assignValue(
1591*b5893f02SDimitry Andric GET_OR_DISTINCT(
1592*b5893f02SDimitry Andric DIGlobalVariable,
1593*b5893f02SDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1594*b5893f02SDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1595*b5893f02SDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1596*b5893f02SDimitry Andric getMDOrNull(Record[9]), getMDOrNull(Record[10]), Record[11])),
1597*b5893f02SDimitry Andric NextMetadataNo);
1598*b5893f02SDimitry Andric
1599*b5893f02SDimitry Andric NextMetadataNo++;
1600*b5893f02SDimitry Andric } else if (Version == 1) {
1601*b5893f02SDimitry Andric // No upgrade necessary. A null field will be introduced to indicate
1602*b5893f02SDimitry Andric // that no parameter information is available.
1603d88c1a5aSDimitry Andric MetadataList.assignValue(
1604d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIGlobalVariable,
1605d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1]),
1606d88c1a5aSDimitry Andric getMDString(Record[2]), getMDString(Record[3]),
1607d88c1a5aSDimitry Andric getMDOrNull(Record[4]), Record[5],
1608d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1609*b5893f02SDimitry Andric getMDOrNull(Record[10]), nullptr, Record[11])),
161098221d2eSDimitry Andric NextMetadataNo);
1611*b5893f02SDimitry Andric
161298221d2eSDimitry Andric NextMetadataNo++;
1613d88c1a5aSDimitry Andric } else if (Version == 0) {
1614d88c1a5aSDimitry Andric // Upgrade old metadata, which stored a global variable reference or a
1615d88c1a5aSDimitry Andric // ConstantInt here.
16167a7e6055SDimitry Andric NeedUpgradeToDIGlobalVariableExpression = true;
1617d88c1a5aSDimitry Andric Metadata *Expr = getMDOrNull(Record[9]);
1618d88c1a5aSDimitry Andric uint32_t AlignInBits = 0;
1619d88c1a5aSDimitry Andric if (Record.size() > 11) {
1620d88c1a5aSDimitry Andric if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1621d88c1a5aSDimitry Andric return error("Alignment value is too large");
1622d88c1a5aSDimitry Andric AlignInBits = Record[11];
1623d88c1a5aSDimitry Andric }
1624d88c1a5aSDimitry Andric GlobalVariable *Attach = nullptr;
1625d88c1a5aSDimitry Andric if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1626d88c1a5aSDimitry Andric if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1627d88c1a5aSDimitry Andric Attach = GV;
1628d88c1a5aSDimitry Andric Expr = nullptr;
1629d88c1a5aSDimitry Andric } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1630d88c1a5aSDimitry Andric Expr = DIExpression::get(Context,
1631d88c1a5aSDimitry Andric {dwarf::DW_OP_constu, CI->getZExtValue(),
1632d88c1a5aSDimitry Andric dwarf::DW_OP_stack_value});
1633d88c1a5aSDimitry Andric } else {
1634d88c1a5aSDimitry Andric Expr = nullptr;
1635d88c1a5aSDimitry Andric }
1636d88c1a5aSDimitry Andric }
1637d88c1a5aSDimitry Andric DIGlobalVariable *DGV = GET_OR_DISTINCT(
1638d88c1a5aSDimitry Andric DIGlobalVariable,
1639d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1640d88c1a5aSDimitry Andric getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1641d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1642*b5893f02SDimitry Andric getMDOrNull(Record[10]), nullptr, AlignInBits));
1643d88c1a5aSDimitry Andric
16445ca5951eSDimitry Andric DIGlobalVariableExpression *DGVE = nullptr;
16455ca5951eSDimitry Andric if (Attach || Expr)
16462cab237bSDimitry Andric DGVE = DIGlobalVariableExpression::getDistinct(
16472cab237bSDimitry Andric Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
1648d88c1a5aSDimitry Andric if (Attach)
1649d88c1a5aSDimitry Andric Attach->addDebugInfo(DGVE);
16505ca5951eSDimitry Andric
16515ca5951eSDimitry Andric auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
16525ca5951eSDimitry Andric MetadataList.assignValue(MDNode, NextMetadataNo);
16535ca5951eSDimitry Andric NextMetadataNo++;
1654d88c1a5aSDimitry Andric } else
1655d88c1a5aSDimitry Andric return error("Invalid record");
1656d88c1a5aSDimitry Andric
1657d88c1a5aSDimitry Andric break;
1658d88c1a5aSDimitry Andric }
1659d88c1a5aSDimitry Andric case bitc::METADATA_LOCAL_VAR: {
1660d88c1a5aSDimitry Andric // 10th field is for the obseleted 'inlinedAt:' field.
1661d88c1a5aSDimitry Andric if (Record.size() < 8 || Record.size() > 10)
1662d88c1a5aSDimitry Andric return error("Invalid record");
1663d88c1a5aSDimitry Andric
1664d88c1a5aSDimitry Andric IsDistinct = Record[0] & 1;
1665d88c1a5aSDimitry Andric bool HasAlignment = Record[0] & 2;
1666d88c1a5aSDimitry Andric // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1667d88c1a5aSDimitry Andric // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
16687a7e6055SDimitry Andric // this is newer version of record which doesn't have artificial tag.
1669d88c1a5aSDimitry Andric bool HasTag = !HasAlignment && Record.size() > 8;
1670d88c1a5aSDimitry Andric DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1671d88c1a5aSDimitry Andric uint32_t AlignInBits = 0;
1672d88c1a5aSDimitry Andric if (HasAlignment) {
1673d88c1a5aSDimitry Andric if (Record[8 + HasTag] > (uint64_t)std::numeric_limits<uint32_t>::max())
1674d88c1a5aSDimitry Andric return error("Alignment value is too large");
1675d88c1a5aSDimitry Andric AlignInBits = Record[8 + HasTag];
1676d88c1a5aSDimitry Andric }
1677d88c1a5aSDimitry Andric MetadataList.assignValue(
1678d88c1a5aSDimitry Andric GET_OR_DISTINCT(DILocalVariable,
1679d88c1a5aSDimitry Andric (Context, getMDOrNull(Record[1 + HasTag]),
1680d88c1a5aSDimitry Andric getMDString(Record[2 + HasTag]),
1681d88c1a5aSDimitry Andric getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1682d88c1a5aSDimitry Andric getDITypeRefOrNull(Record[5 + HasTag]),
1683d88c1a5aSDimitry Andric Record[6 + HasTag], Flags, AlignInBits)),
168498221d2eSDimitry Andric NextMetadataNo);
168598221d2eSDimitry Andric NextMetadataNo++;
1686d88c1a5aSDimitry Andric break;
1687d88c1a5aSDimitry Andric }
16884ba319b5SDimitry Andric case bitc::METADATA_LABEL: {
16894ba319b5SDimitry Andric if (Record.size() != 5)
16904ba319b5SDimitry Andric return error("Invalid record");
16914ba319b5SDimitry Andric
16924ba319b5SDimitry Andric IsDistinct = Record[0] & 1;
16934ba319b5SDimitry Andric MetadataList.assignValue(
16944ba319b5SDimitry Andric GET_OR_DISTINCT(DILabel,
16954ba319b5SDimitry Andric (Context, getMDOrNull(Record[1]),
16964ba319b5SDimitry Andric getMDString(Record[2]),
16974ba319b5SDimitry Andric getMDOrNull(Record[3]), Record[4])),
16984ba319b5SDimitry Andric NextMetadataNo);
16994ba319b5SDimitry Andric NextMetadataNo++;
17004ba319b5SDimitry Andric break;
17014ba319b5SDimitry Andric }
1702d88c1a5aSDimitry Andric case bitc::METADATA_EXPRESSION: {
1703d88c1a5aSDimitry Andric if (Record.size() < 1)
1704d88c1a5aSDimitry Andric return error("Invalid record");
1705d88c1a5aSDimitry Andric
1706d88c1a5aSDimitry Andric IsDistinct = Record[0] & 1;
17076bc11b14SDimitry Andric uint64_t Version = Record[0] >> 1;
1708d88c1a5aSDimitry Andric auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
170924d58133SDimitry Andric
171024d58133SDimitry Andric SmallVector<uint64_t, 6> Buffer;
171124d58133SDimitry Andric if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
171224d58133SDimitry Andric return Err;
1713d88c1a5aSDimitry Andric
1714d88c1a5aSDimitry Andric MetadataList.assignValue(
171524d58133SDimitry Andric GET_OR_DISTINCT(DIExpression, (Context, Elts)), NextMetadataNo);
171698221d2eSDimitry Andric NextMetadataNo++;
1717d88c1a5aSDimitry Andric break;
1718d88c1a5aSDimitry Andric }
1719d88c1a5aSDimitry Andric case bitc::METADATA_GLOBAL_VAR_EXPR: {
1720d88c1a5aSDimitry Andric if (Record.size() != 3)
1721d88c1a5aSDimitry Andric return error("Invalid record");
1722d88c1a5aSDimitry Andric
1723d88c1a5aSDimitry Andric IsDistinct = Record[0];
17242cab237bSDimitry Andric Metadata *Expr = getMDOrNull(Record[2]);
17252cab237bSDimitry Andric if (!Expr)
17262cab237bSDimitry Andric Expr = DIExpression::get(Context, {});
17272cab237bSDimitry Andric MetadataList.assignValue(
17282cab237bSDimitry Andric GET_OR_DISTINCT(DIGlobalVariableExpression,
17292cab237bSDimitry Andric (Context, getMDOrNull(Record[1]), Expr)),
173098221d2eSDimitry Andric NextMetadataNo);
173198221d2eSDimitry Andric NextMetadataNo++;
1732d88c1a5aSDimitry Andric break;
1733d88c1a5aSDimitry Andric }
1734d88c1a5aSDimitry Andric case bitc::METADATA_OBJC_PROPERTY: {
1735d88c1a5aSDimitry Andric if (Record.size() != 8)
1736d88c1a5aSDimitry Andric return error("Invalid record");
1737d88c1a5aSDimitry Andric
1738d88c1a5aSDimitry Andric IsDistinct = Record[0];
1739d88c1a5aSDimitry Andric MetadataList.assignValue(
1740d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIObjCProperty,
1741d88c1a5aSDimitry Andric (Context, getMDString(Record[1]),
1742d88c1a5aSDimitry Andric getMDOrNull(Record[2]), Record[3],
1743d88c1a5aSDimitry Andric getMDString(Record[4]), getMDString(Record[5]),
1744d88c1a5aSDimitry Andric Record[6], getDITypeRefOrNull(Record[7]))),
174598221d2eSDimitry Andric NextMetadataNo);
174698221d2eSDimitry Andric NextMetadataNo++;
1747d88c1a5aSDimitry Andric break;
1748d88c1a5aSDimitry Andric }
1749d88c1a5aSDimitry Andric case bitc::METADATA_IMPORTED_ENTITY: {
1750b40b48b8SDimitry Andric if (Record.size() != 6 && Record.size() != 7)
1751d88c1a5aSDimitry Andric return error("Invalid record");
1752d88c1a5aSDimitry Andric
1753d88c1a5aSDimitry Andric IsDistinct = Record[0];
1754b40b48b8SDimitry Andric bool HasFile = (Record.size() == 7);
1755d88c1a5aSDimitry Andric MetadataList.assignValue(
1756d88c1a5aSDimitry Andric GET_OR_DISTINCT(DIImportedEntity,
1757d88c1a5aSDimitry Andric (Context, Record[1], getMDOrNull(Record[2]),
1758b40b48b8SDimitry Andric getDITypeRefOrNull(Record[3]),
1759b40b48b8SDimitry Andric HasFile ? getMDOrNull(Record[6]) : nullptr,
1760b40b48b8SDimitry Andric HasFile ? Record[4] : 0, getMDString(Record[5]))),
176198221d2eSDimitry Andric NextMetadataNo);
176298221d2eSDimitry Andric NextMetadataNo++;
1763d88c1a5aSDimitry Andric break;
1764d88c1a5aSDimitry Andric }
1765d88c1a5aSDimitry Andric case bitc::METADATA_STRING_OLD: {
1766d88c1a5aSDimitry Andric std::string String(Record.begin(), Record.end());
1767d88c1a5aSDimitry Andric
1768d88c1a5aSDimitry Andric // Test for upgrading !llvm.loop.
1769d88c1a5aSDimitry Andric HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
177095ec533aSDimitry Andric ++NumMDStringLoaded;
1771d88c1a5aSDimitry Andric Metadata *MD = MDString::get(Context, String);
177298221d2eSDimitry Andric MetadataList.assignValue(MD, NextMetadataNo);
177398221d2eSDimitry Andric NextMetadataNo++;
1774d88c1a5aSDimitry Andric break;
1775d88c1a5aSDimitry Andric }
177695ec533aSDimitry Andric case bitc::METADATA_STRINGS: {
177795ec533aSDimitry Andric auto CreateNextMDString = [&](StringRef Str) {
177895ec533aSDimitry Andric ++NumMDStringLoaded;
177998221d2eSDimitry Andric MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
178098221d2eSDimitry Andric NextMetadataNo++;
178195ec533aSDimitry Andric };
178295ec533aSDimitry Andric if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
1783d88c1a5aSDimitry Andric return Err;
1784d88c1a5aSDimitry Andric break;
178595ec533aSDimitry Andric }
1786d88c1a5aSDimitry Andric case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
1787d88c1a5aSDimitry Andric if (Record.size() % 2 == 0)
1788d88c1a5aSDimitry Andric return error("Invalid record");
1789d88c1a5aSDimitry Andric unsigned ValueID = Record[0];
1790d88c1a5aSDimitry Andric if (ValueID >= ValueList.size())
1791d88c1a5aSDimitry Andric return error("Invalid record");
1792d88c1a5aSDimitry Andric if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
1793d88c1a5aSDimitry Andric if (Error Err = parseGlobalObjectAttachment(
1794d88c1a5aSDimitry Andric *GO, ArrayRef<uint64_t>(Record).slice(1)))
1795d88c1a5aSDimitry Andric return Err;
1796d88c1a5aSDimitry Andric break;
1797d88c1a5aSDimitry Andric }
1798d88c1a5aSDimitry Andric case bitc::METADATA_KIND: {
1799d88c1a5aSDimitry Andric // Support older bitcode files that had METADATA_KIND records in a
1800d88c1a5aSDimitry Andric // block with METADATA_BLOCK_ID.
1801d88c1a5aSDimitry Andric if (Error Err = parseMetadataKindRecord(Record))
1802d88c1a5aSDimitry Andric return Err;
1803d88c1a5aSDimitry Andric break;
1804d88c1a5aSDimitry Andric }
1805d88c1a5aSDimitry Andric }
1806d88c1a5aSDimitry Andric return Error::success();
180795ec533aSDimitry Andric #undef GET_OR_DISTINCT
1808d88c1a5aSDimitry Andric }
1809d88c1a5aSDimitry Andric
parseMetadataStrings(ArrayRef<uint64_t> Record,StringRef Blob,function_ref<void (StringRef)> CallBack)1810d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
181195ec533aSDimitry Andric ArrayRef<uint64_t> Record, StringRef Blob,
18127a7e6055SDimitry Andric function_ref<void(StringRef)> CallBack) {
1813d88c1a5aSDimitry Andric // All the MDStrings in the block are emitted together in a single
1814d88c1a5aSDimitry Andric // record. The strings are concatenated and stored in a blob along with
1815d88c1a5aSDimitry Andric // their sizes.
1816d88c1a5aSDimitry Andric if (Record.size() != 2)
1817d88c1a5aSDimitry Andric return error("Invalid record: metadata strings layout");
1818d88c1a5aSDimitry Andric
1819d88c1a5aSDimitry Andric unsigned NumStrings = Record[0];
1820d88c1a5aSDimitry Andric unsigned StringsOffset = Record[1];
1821d88c1a5aSDimitry Andric if (!NumStrings)
1822d88c1a5aSDimitry Andric return error("Invalid record: metadata strings with no strings");
1823d88c1a5aSDimitry Andric if (StringsOffset > Blob.size())
1824d88c1a5aSDimitry Andric return error("Invalid record: metadata strings corrupt offset");
1825d88c1a5aSDimitry Andric
1826d88c1a5aSDimitry Andric StringRef Lengths = Blob.slice(0, StringsOffset);
1827d88c1a5aSDimitry Andric SimpleBitstreamCursor R(Lengths);
1828d88c1a5aSDimitry Andric
1829d88c1a5aSDimitry Andric StringRef Strings = Blob.drop_front(StringsOffset);
1830d88c1a5aSDimitry Andric do {
1831d88c1a5aSDimitry Andric if (R.AtEndOfStream())
1832d88c1a5aSDimitry Andric return error("Invalid record: metadata strings bad length");
1833d88c1a5aSDimitry Andric
1834d88c1a5aSDimitry Andric unsigned Size = R.ReadVBR(6);
1835d88c1a5aSDimitry Andric if (Strings.size() < Size)
1836d88c1a5aSDimitry Andric return error("Invalid record: metadata strings truncated chars");
1837d88c1a5aSDimitry Andric
183895ec533aSDimitry Andric CallBack(Strings.slice(0, Size));
1839d88c1a5aSDimitry Andric Strings = Strings.drop_front(Size);
1840d88c1a5aSDimitry Andric } while (--NumStrings);
1841d88c1a5aSDimitry Andric
1842d88c1a5aSDimitry Andric return Error::success();
1843d88c1a5aSDimitry Andric }
1844d88c1a5aSDimitry Andric
parseGlobalObjectAttachment(GlobalObject & GO,ArrayRef<uint64_t> Record)1845d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
1846d88c1a5aSDimitry Andric GlobalObject &GO, ArrayRef<uint64_t> Record) {
1847d88c1a5aSDimitry Andric assert(Record.size() % 2 == 0);
1848d88c1a5aSDimitry Andric for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
1849d88c1a5aSDimitry Andric auto K = MDKindMap.find(Record[I]);
1850d88c1a5aSDimitry Andric if (K == MDKindMap.end())
1851d88c1a5aSDimitry Andric return error("Invalid ID");
1852d88c1a5aSDimitry Andric MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[I + 1]);
1853d88c1a5aSDimitry Andric if (!MD)
1854*b5893f02SDimitry Andric return error("Invalid metadata attachment: expect fwd ref to MDNode");
1855d88c1a5aSDimitry Andric GO.addMetadata(K->second, *MD);
1856d88c1a5aSDimitry Andric }
1857d88c1a5aSDimitry Andric return Error::success();
1858d88c1a5aSDimitry Andric }
1859d88c1a5aSDimitry Andric
1860d88c1a5aSDimitry Andric /// Parse metadata attachments.
parseMetadataAttachment(Function & F,const SmallVectorImpl<Instruction * > & InstructionList)1861d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
1862d88c1a5aSDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
1863d88c1a5aSDimitry Andric if (Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
1864d88c1a5aSDimitry Andric return error("Invalid record");
1865d88c1a5aSDimitry Andric
1866d88c1a5aSDimitry Andric SmallVector<uint64_t, 64> Record;
186795ec533aSDimitry Andric PlaceholderQueue Placeholders;
186895ec533aSDimitry Andric
1869d88c1a5aSDimitry Andric while (true) {
1870d88c1a5aSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
1871d88c1a5aSDimitry Andric
1872d88c1a5aSDimitry Andric switch (Entry.Kind) {
1873d88c1a5aSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
1874d88c1a5aSDimitry Andric case BitstreamEntry::Error:
1875d88c1a5aSDimitry Andric return error("Malformed block");
1876d88c1a5aSDimitry Andric case BitstreamEntry::EndBlock:
187795ec533aSDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
1878d88c1a5aSDimitry Andric return Error::success();
1879d88c1a5aSDimitry Andric case BitstreamEntry::Record:
1880d88c1a5aSDimitry Andric // The interesting case.
1881d88c1a5aSDimitry Andric break;
1882d88c1a5aSDimitry Andric }
1883d88c1a5aSDimitry Andric
1884d88c1a5aSDimitry Andric // Read a metadata attachment record.
1885d88c1a5aSDimitry Andric Record.clear();
188695ec533aSDimitry Andric ++NumMDRecordLoaded;
1887d88c1a5aSDimitry Andric switch (Stream.readRecord(Entry.ID, Record)) {
1888d88c1a5aSDimitry Andric default: // Default behavior: ignore.
1889d88c1a5aSDimitry Andric break;
1890d88c1a5aSDimitry Andric case bitc::METADATA_ATTACHMENT: {
1891d88c1a5aSDimitry Andric unsigned RecordLength = Record.size();
1892d88c1a5aSDimitry Andric if (Record.empty())
1893d88c1a5aSDimitry Andric return error("Invalid record");
1894d88c1a5aSDimitry Andric if (RecordLength % 2 == 0) {
1895d88c1a5aSDimitry Andric // A function attachment.
1896d88c1a5aSDimitry Andric if (Error Err = parseGlobalObjectAttachment(F, Record))
1897d88c1a5aSDimitry Andric return Err;
1898d88c1a5aSDimitry Andric continue;
1899d88c1a5aSDimitry Andric }
1900d88c1a5aSDimitry Andric
1901d88c1a5aSDimitry Andric // An instruction attachment.
1902d88c1a5aSDimitry Andric Instruction *Inst = InstructionList[Record[0]];
1903d88c1a5aSDimitry Andric for (unsigned i = 1; i != RecordLength; i = i + 2) {
1904d88c1a5aSDimitry Andric unsigned Kind = Record[i];
1905d88c1a5aSDimitry Andric DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
1906d88c1a5aSDimitry Andric if (I == MDKindMap.end())
1907d88c1a5aSDimitry Andric return error("Invalid ID");
1908d88c1a5aSDimitry Andric if (I->second == LLVMContext::MD_tbaa && StripTBAA)
1909d88c1a5aSDimitry Andric continue;
1910d88c1a5aSDimitry Andric
191195ec533aSDimitry Andric auto Idx = Record[i + 1];
191295ec533aSDimitry Andric if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
191324e2fe98SDimitry Andric !MetadataList.lookup(Idx)) {
191495ec533aSDimitry Andric // Load the attachment if it is in the lazy-loadable range and hasn't
191595ec533aSDimitry Andric // been loaded yet.
191695ec533aSDimitry Andric lazyLoadOneMetadata(Idx, Placeholders);
191724e2fe98SDimitry Andric resolveForwardRefsAndPlaceholders(Placeholders);
191824e2fe98SDimitry Andric }
191995ec533aSDimitry Andric
192095ec533aSDimitry Andric Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
1921d88c1a5aSDimitry Andric if (isa<LocalAsMetadata>(Node))
1922d88c1a5aSDimitry Andric // Drop the attachment. This used to be legal, but there's no
1923d88c1a5aSDimitry Andric // upgrade path.
1924d88c1a5aSDimitry Andric break;
1925d88c1a5aSDimitry Andric MDNode *MD = dyn_cast_or_null<MDNode>(Node);
1926d88c1a5aSDimitry Andric if (!MD)
1927d88c1a5aSDimitry Andric return error("Invalid metadata attachment");
1928d88c1a5aSDimitry Andric
1929d88c1a5aSDimitry Andric if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
1930d88c1a5aSDimitry Andric MD = upgradeInstructionLoopAttachment(*MD);
1931d88c1a5aSDimitry Andric
1932d88c1a5aSDimitry Andric if (I->second == LLVMContext::MD_tbaa) {
1933d88c1a5aSDimitry Andric assert(!MD->isTemporary() && "should load MDs before attachments");
1934d88c1a5aSDimitry Andric MD = UpgradeTBAANode(*MD);
1935d88c1a5aSDimitry Andric }
1936d88c1a5aSDimitry Andric Inst->setMetadata(I->second, MD);
1937d88c1a5aSDimitry Andric }
1938d88c1a5aSDimitry Andric break;
1939d88c1a5aSDimitry Andric }
1940d88c1a5aSDimitry Andric }
1941d88c1a5aSDimitry Andric }
1942d88c1a5aSDimitry Andric }
1943d88c1a5aSDimitry Andric
1944d88c1a5aSDimitry Andric /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
parseMetadataKindRecord(SmallVectorImpl<uint64_t> & Record)1945d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
1946d88c1a5aSDimitry Andric SmallVectorImpl<uint64_t> &Record) {
1947d88c1a5aSDimitry Andric if (Record.size() < 2)
1948d88c1a5aSDimitry Andric return error("Invalid record");
1949d88c1a5aSDimitry Andric
1950d88c1a5aSDimitry Andric unsigned Kind = Record[0];
1951d88c1a5aSDimitry Andric SmallString<8> Name(Record.begin() + 1, Record.end());
1952d88c1a5aSDimitry Andric
1953d88c1a5aSDimitry Andric unsigned NewKind = TheModule.getMDKindID(Name.str());
1954d88c1a5aSDimitry Andric if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
1955d88c1a5aSDimitry Andric return error("Conflicting METADATA_KIND records");
1956d88c1a5aSDimitry Andric return Error::success();
1957d88c1a5aSDimitry Andric }
1958d88c1a5aSDimitry Andric
1959d88c1a5aSDimitry Andric /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
parseMetadataKinds()1960d88c1a5aSDimitry Andric Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
1961d88c1a5aSDimitry Andric if (Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
1962d88c1a5aSDimitry Andric return error("Invalid record");
1963d88c1a5aSDimitry Andric
1964d88c1a5aSDimitry Andric SmallVector<uint64_t, 64> Record;
1965d88c1a5aSDimitry Andric
1966d88c1a5aSDimitry Andric // Read all the records.
1967d88c1a5aSDimitry Andric while (true) {
1968d88c1a5aSDimitry Andric BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
1969d88c1a5aSDimitry Andric
1970d88c1a5aSDimitry Andric switch (Entry.Kind) {
1971d88c1a5aSDimitry Andric case BitstreamEntry::SubBlock: // Handled for us already.
1972d88c1a5aSDimitry Andric case BitstreamEntry::Error:
1973d88c1a5aSDimitry Andric return error("Malformed block");
1974d88c1a5aSDimitry Andric case BitstreamEntry::EndBlock:
1975d88c1a5aSDimitry Andric return Error::success();
1976d88c1a5aSDimitry Andric case BitstreamEntry::Record:
1977d88c1a5aSDimitry Andric // The interesting case.
1978d88c1a5aSDimitry Andric break;
1979d88c1a5aSDimitry Andric }
1980d88c1a5aSDimitry Andric
1981d88c1a5aSDimitry Andric // Read a record.
1982d88c1a5aSDimitry Andric Record.clear();
198395ec533aSDimitry Andric ++NumMDRecordLoaded;
1984d88c1a5aSDimitry Andric unsigned Code = Stream.readRecord(Entry.ID, Record);
1985d88c1a5aSDimitry Andric switch (Code) {
1986d88c1a5aSDimitry Andric default: // Default behavior: ignore.
1987d88c1a5aSDimitry Andric break;
1988d88c1a5aSDimitry Andric case bitc::METADATA_KIND: {
1989d88c1a5aSDimitry Andric if (Error Err = parseMetadataKindRecord(Record))
1990d88c1a5aSDimitry Andric return Err;
1991d88c1a5aSDimitry Andric break;
1992d88c1a5aSDimitry Andric }
1993d88c1a5aSDimitry Andric }
1994d88c1a5aSDimitry Andric }
1995d88c1a5aSDimitry Andric }
1996d88c1a5aSDimitry Andric
operator =(MetadataLoader && RHS)1997d88c1a5aSDimitry Andric MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
1998d88c1a5aSDimitry Andric Pimpl = std::move(RHS.Pimpl);
1999d88c1a5aSDimitry Andric return *this;
2000d88c1a5aSDimitry Andric }
MetadataLoader(MetadataLoader && RHS)2001d88c1a5aSDimitry Andric MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2002d88c1a5aSDimitry Andric : Pimpl(std::move(RHS.Pimpl)) {}
2003d88c1a5aSDimitry Andric
2004d88c1a5aSDimitry Andric MetadataLoader::~MetadataLoader() = default;
MetadataLoader(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,bool IsImporting,std::function<Type * (unsigned)> getTypeByID)2005d88c1a5aSDimitry Andric MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2006d88c1a5aSDimitry Andric BitcodeReaderValueList &ValueList,
2007d88c1a5aSDimitry Andric bool IsImporting,
2008d88c1a5aSDimitry Andric std::function<Type *(unsigned)> getTypeByID)
20097a7e6055SDimitry Andric : Pimpl(llvm::make_unique<MetadataLoaderImpl>(
20107a7e6055SDimitry Andric Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2011d88c1a5aSDimitry Andric
parseMetadata(bool ModuleLevel)2012d88c1a5aSDimitry Andric Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2013d88c1a5aSDimitry Andric return Pimpl->parseMetadata(ModuleLevel);
2014d88c1a5aSDimitry Andric }
2015d88c1a5aSDimitry Andric
hasFwdRefs() const2016d88c1a5aSDimitry Andric bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2017d88c1a5aSDimitry Andric
2018d88c1a5aSDimitry Andric /// Return the given metadata, creating a replaceable forward reference if
2019d88c1a5aSDimitry Andric /// necessary.
getMetadataFwdRefOrLoad(unsigned Idx)2020f8496407SDimitry Andric Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
2021f8496407SDimitry Andric return Pimpl->getMetadataFwdRefOrLoad(Idx);
2022d88c1a5aSDimitry Andric }
2023d88c1a5aSDimitry Andric
lookupSubprogramForFunction(Function * F)2024d88c1a5aSDimitry Andric DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2025d88c1a5aSDimitry Andric return Pimpl->lookupSubprogramForFunction(F);
2026d88c1a5aSDimitry Andric }
2027d88c1a5aSDimitry Andric
parseMetadataAttachment(Function & F,const SmallVectorImpl<Instruction * > & InstructionList)2028d88c1a5aSDimitry Andric Error MetadataLoader::parseMetadataAttachment(
2029d88c1a5aSDimitry Andric Function &F, const SmallVectorImpl<Instruction *> &InstructionList) {
2030d88c1a5aSDimitry Andric return Pimpl->parseMetadataAttachment(F, InstructionList);
2031d88c1a5aSDimitry Andric }
2032d88c1a5aSDimitry Andric
parseMetadataKinds()2033d88c1a5aSDimitry Andric Error MetadataLoader::parseMetadataKinds() {
2034d88c1a5aSDimitry Andric return Pimpl->parseMetadataKinds();
2035d88c1a5aSDimitry Andric }
2036d88c1a5aSDimitry Andric
setStripTBAA(bool StripTBAA)2037d88c1a5aSDimitry Andric void MetadataLoader::setStripTBAA(bool StripTBAA) {
2038d88c1a5aSDimitry Andric return Pimpl->setStripTBAA(StripTBAA);
2039d88c1a5aSDimitry Andric }
2040d88c1a5aSDimitry Andric
isStrippingTBAA()2041d88c1a5aSDimitry Andric bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
2042d88c1a5aSDimitry Andric
size() const2043d88c1a5aSDimitry Andric unsigned MetadataLoader::size() const { return Pimpl->size(); }
shrinkTo(unsigned N)2044d88c1a5aSDimitry Andric void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
20456bc11b14SDimitry Andric
upgradeDebugIntrinsics(Function & F)20466bc11b14SDimitry Andric void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
20476bc11b14SDimitry Andric return Pimpl->upgradeDebugIntrinsics(F);
20486bc11b14SDimitry Andric }
2049