1ef27db87SMehdi Amini //===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2ef27db87SMehdi Amini //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6ef27db87SMehdi Amini //
7ef27db87SMehdi Amini //===----------------------------------------------------------------------===//
8ef27db87SMehdi Amini
9ef27db87SMehdi Amini #include "MetadataLoader.h"
10ef27db87SMehdi Amini #include "ValueList.h"
11ef27db87SMehdi Amini
12ef27db87SMehdi Amini #include "llvm/ADT/APInt.h"
13ef27db87SMehdi Amini #include "llvm/ADT/ArrayRef.h"
141237c149Sserge-sans-paille #include "llvm/ADT/BitmaskEnum.h"
15ef27db87SMehdi Amini #include "llvm/ADT/DenseMap.h"
1619ef4fadSMehdi Amini #include "llvm/ADT/DenseSet.h"
17ef27db87SMehdi Amini #include "llvm/ADT/None.h"
181237c149Sserge-sans-paille #include "llvm/ADT/Optional.h"
191237c149Sserge-sans-paille #include "llvm/ADT/STLFunctionalExtras.h"
20ef27db87SMehdi Amini #include "llvm/ADT/SmallString.h"
211237c149Sserge-sans-paille #include "llvm/ADT/SmallVector.h"
2219ef4fadSMehdi Amini #include "llvm/ADT/Statistic.h"
23ef27db87SMehdi Amini #include "llvm/ADT/StringRef.h"
24ef27db87SMehdi Amini #include "llvm/ADT/Twine.h"
251237c149Sserge-sans-paille #include "llvm/ADT/ilist_iterator.h"
261237c149Sserge-sans-paille #include "llvm/ADT/iterator_range.h"
27ffe8720aSserge-sans-paille #include "llvm/BinaryFormat/Dwarf.h"
28ef27db87SMehdi Amini #include "llvm/Bitcode/BitcodeReader.h"
29ef27db87SMehdi Amini #include "llvm/Bitcode/LLVMBitCodes.h"
3008ed2160SItay Bookstein #include "llvm/Bitstream/BitstreamReader.h"
31ef27db87SMehdi Amini #include "llvm/IR/AutoUpgrade.h"
32ef27db87SMehdi Amini #include "llvm/IR/BasicBlock.h"
33ef27db87SMehdi Amini #include "llvm/IR/Constants.h"
34ef27db87SMehdi Amini #include "llvm/IR/DebugInfoMetadata.h"
35ef27db87SMehdi Amini #include "llvm/IR/Function.h"
36ef27db87SMehdi Amini #include "llvm/IR/GlobalObject.h"
37ef27db87SMehdi Amini #include "llvm/IR/GlobalVariable.h"
38ef27db87SMehdi Amini #include "llvm/IR/Instruction.h"
396825fb64SAdrian Prantl #include "llvm/IR/IntrinsicInst.h"
40ef27db87SMehdi Amini #include "llvm/IR/LLVMContext.h"
411237c149Sserge-sans-paille #include "llvm/IR/Metadata.h"
42ef27db87SMehdi Amini #include "llvm/IR/Module.h"
43ef27db87SMehdi Amini #include "llvm/IR/TrackingMDRef.h"
44ef27db87SMehdi Amini #include "llvm/IR/Type.h"
45ef27db87SMehdi Amini #include "llvm/Support/Casting.h"
46ef27db87SMehdi Amini #include "llvm/Support/CommandLine.h"
47ef27db87SMehdi Amini #include "llvm/Support/Compiler.h"
48ef27db87SMehdi Amini #include "llvm/Support/ErrorHandling.h"
491237c149Sserge-sans-paille #include "llvm/Support/type_traits.h"
501237c149Sserge-sans-paille
51ef27db87SMehdi Amini #include <algorithm>
52ef27db87SMehdi Amini #include <cassert>
53ef27db87SMehdi Amini #include <cstddef>
54ef27db87SMehdi Amini #include <cstdint>
55ef27db87SMehdi Amini #include <deque>
561237c149Sserge-sans-paille #include <iterator>
57ef27db87SMehdi Amini #include <limits>
58ef27db87SMehdi Amini #include <string>
59ef27db87SMehdi Amini #include <tuple>
601237c149Sserge-sans-paille #include <type_traits>
61ef27db87SMehdi Amini #include <utility>
62ef27db87SMehdi Amini #include <vector>
631237c149Sserge-sans-paille namespace llvm {
641237c149Sserge-sans-paille class Argument;
651237c149Sserge-sans-paille }
66ef27db87SMehdi Amini
67ef27db87SMehdi Amini using namespace llvm;
68ef27db87SMehdi Amini
6919ef4fadSMehdi Amini #define DEBUG_TYPE "bitcode-reader"
7019ef4fadSMehdi Amini
7119ef4fadSMehdi Amini STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
7219ef4fadSMehdi Amini STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
7319ef4fadSMehdi Amini STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
7419ef4fadSMehdi Amini
75a61f5e37STeresa Johnson /// Flag whether we need to import full type definitions for ThinLTO.
76a61f5e37STeresa Johnson /// Currently needed for Darwin and LLDB.
77a61f5e37STeresa Johnson static cl::opt<bool> ImportFullTypeDefinitions(
78a61f5e37STeresa Johnson "import-full-type-definitions", cl::init(false), cl::Hidden,
79a61f5e37STeresa Johnson cl::desc("Import full type definitions for ThinLTO."));
80a61f5e37STeresa Johnson
8119ef4fadSMehdi Amini static cl::opt<bool> DisableLazyLoading(
8219ef4fadSMehdi Amini "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
8319ef4fadSMehdi Amini cl::desc("Force disable the lazy-loading on-demand of metadata when "
8419ef4fadSMehdi Amini "loading bitcode for importing."));
8519ef4fadSMehdi Amini
86ef27db87SMehdi Amini namespace {
87ef27db87SMehdi Amini
unrotateSign(uint64_t U)88aa49be49SSimon Pilgrim static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
89ef27db87SMehdi Amini
90ef27db87SMehdi Amini class BitcodeReaderMetadataList {
91ef27db87SMehdi Amini /// Array of metadata references.
92ef27db87SMehdi Amini ///
93ef27db87SMehdi Amini /// Don't use std::vector here. Some versions of libc++ copy (instead of
94ef27db87SMehdi Amini /// move) on resize, and TrackingMDRef is very expensive to copy.
95ef27db87SMehdi Amini SmallVector<TrackingMDRef, 1> MetadataPtrs;
96ef27db87SMehdi Amini
97690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of forward references that were
98690952d1SMehdi Amini /// generated.
99690952d1SMehdi Amini SmallDenseSet<unsigned, 1> ForwardReference;
100690952d1SMehdi Amini
101690952d1SMehdi Amini /// The set of indices in MetadataPtrs above of Metadata that need to be
102690952d1SMehdi Amini /// resolved.
103690952d1SMehdi Amini SmallDenseSet<unsigned, 1> UnresolvedNodes;
104690952d1SMehdi Amini
105ef27db87SMehdi Amini /// Structures for resolving old type refs.
106ef27db87SMehdi Amini struct {
107ef27db87SMehdi Amini SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
108ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> Final;
109ef27db87SMehdi Amini SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
110ef27db87SMehdi Amini SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
111ef27db87SMehdi Amini } OldTypeRefs;
112ef27db87SMehdi Amini
113ef27db87SMehdi Amini LLVMContext &Context;
114ef27db87SMehdi Amini
115864474c9SFlorian Hahn /// Maximum number of valid references. Forward references exceeding the
116864474c9SFlorian Hahn /// maximum must be invalid.
117864474c9SFlorian Hahn unsigned RefsUpperBound;
118864474c9SFlorian Hahn
119ef27db87SMehdi Amini public:
BitcodeReaderMetadataList(LLVMContext & C,size_t RefsUpperBound)120864474c9SFlorian Hahn BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
121864474c9SFlorian Hahn : Context(C),
122864474c9SFlorian Hahn RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
123864474c9SFlorian Hahn RefsUpperBound)) {}
124ef27db87SMehdi Amini
125ef27db87SMehdi Amini // vector compatibility methods
size() const126ef27db87SMehdi Amini unsigned size() const { return MetadataPtrs.size(); }
resize(unsigned N)127ef27db87SMehdi Amini void resize(unsigned N) { MetadataPtrs.resize(N); }
push_back(Metadata * MD)128ef27db87SMehdi Amini void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
clear()129ef27db87SMehdi Amini void clear() { MetadataPtrs.clear(); }
back() const130ef27db87SMehdi Amini Metadata *back() const { return MetadataPtrs.back(); }
pop_back()131ef27db87SMehdi Amini void pop_back() { MetadataPtrs.pop_back(); }
empty() const132ef27db87SMehdi Amini bool empty() const { return MetadataPtrs.empty(); }
133ef27db87SMehdi Amini
operator [](unsigned i) const134ef27db87SMehdi Amini Metadata *operator[](unsigned i) const {
135ef27db87SMehdi Amini assert(i < MetadataPtrs.size());
136ef27db87SMehdi Amini return MetadataPtrs[i];
137ef27db87SMehdi Amini }
138ef27db87SMehdi Amini
lookup(unsigned I) const139ef27db87SMehdi Amini Metadata *lookup(unsigned I) const {
140ef27db87SMehdi Amini if (I < MetadataPtrs.size())
141ef27db87SMehdi Amini return MetadataPtrs[I];
142ef27db87SMehdi Amini return nullptr;
143ef27db87SMehdi Amini }
144ef27db87SMehdi Amini
shrinkTo(unsigned N)145ef27db87SMehdi Amini void shrinkTo(unsigned N) {
146ef27db87SMehdi Amini assert(N <= size() && "Invalid shrinkTo request!");
147690952d1SMehdi Amini assert(ForwardReference.empty() && "Unexpected forward refs");
148690952d1SMehdi Amini assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
149ef27db87SMehdi Amini MetadataPtrs.resize(N);
150ef27db87SMehdi Amini }
151ef27db87SMehdi Amini
152ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
153ef27db87SMehdi Amini /// necessary.
154ef27db87SMehdi Amini Metadata *getMetadataFwdRef(unsigned Idx);
155ef27db87SMehdi Amini
1568f976ba0SHiroshi Inoue /// Return the given metadata only if it is fully resolved.
157ef27db87SMehdi Amini ///
158ef27db87SMehdi Amini /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
159ef27db87SMehdi Amini /// would give \c false.
160ef27db87SMehdi Amini Metadata *getMetadataIfResolved(unsigned Idx);
161ef27db87SMehdi Amini
162ef27db87SMehdi Amini MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
163ef27db87SMehdi Amini void assignValue(Metadata *MD, unsigned Idx);
164ef27db87SMehdi Amini void tryToResolveCycles();
hasFwdRefs() const165690952d1SMehdi Amini bool hasFwdRefs() const { return !ForwardReference.empty(); }
getNextFwdRef()16619ef4fadSMehdi Amini int getNextFwdRef() {
16719ef4fadSMehdi Amini assert(hasFwdRefs());
16819ef4fadSMehdi Amini return *ForwardReference.begin();
16919ef4fadSMehdi Amini }
170ef27db87SMehdi Amini
171ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference.
172ef27db87SMehdi Amini void addTypeRef(MDString &UUID, DICompositeType &CT);
173ef27db87SMehdi Amini
174ef27db87SMehdi Amini /// Upgrade a type that had an MDString reference.
175ef27db87SMehdi Amini Metadata *upgradeTypeRef(Metadata *MaybeUUID);
176ef27db87SMehdi Amini
177ef27db87SMehdi Amini /// Upgrade a type ref array that may have MDString references.
178ef27db87SMehdi Amini Metadata *upgradeTypeRefArray(Metadata *MaybeTuple);
179ef27db87SMehdi Amini
180ef27db87SMehdi Amini private:
181ef27db87SMehdi Amini Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
182ef27db87SMehdi Amini };
183ef27db87SMehdi Amini
assignValue(Metadata * MD,unsigned Idx)184ef27db87SMehdi Amini void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
185690952d1SMehdi Amini if (auto *MDN = dyn_cast<MDNode>(MD))
186690952d1SMehdi Amini if (!MDN->isResolved())
187690952d1SMehdi Amini UnresolvedNodes.insert(Idx);
188690952d1SMehdi Amini
189ef27db87SMehdi Amini if (Idx == size()) {
190ef27db87SMehdi Amini push_back(MD);
191ef27db87SMehdi Amini return;
192ef27db87SMehdi Amini }
193ef27db87SMehdi Amini
194ef27db87SMehdi Amini if (Idx >= size())
195ef27db87SMehdi Amini resize(Idx + 1);
196ef27db87SMehdi Amini
197ef27db87SMehdi Amini TrackingMDRef &OldMD = MetadataPtrs[Idx];
198ef27db87SMehdi Amini if (!OldMD) {
199ef27db87SMehdi Amini OldMD.reset(MD);
200ef27db87SMehdi Amini return;
201ef27db87SMehdi Amini }
202ef27db87SMehdi Amini
203ef27db87SMehdi Amini // If there was a forward reference to this value, replace it.
204ef27db87SMehdi Amini TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
205ef27db87SMehdi Amini PrevMD->replaceAllUsesWith(MD);
206690952d1SMehdi Amini ForwardReference.erase(Idx);
207ef27db87SMehdi Amini }
208ef27db87SMehdi Amini
getMetadataFwdRef(unsigned Idx)209ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
210864474c9SFlorian Hahn // Bail out for a clearly invalid value.
211864474c9SFlorian Hahn if (Idx >= RefsUpperBound)
212864474c9SFlorian Hahn return nullptr;
213864474c9SFlorian Hahn
214ef27db87SMehdi Amini if (Idx >= size())
215ef27db87SMehdi Amini resize(Idx + 1);
216ef27db87SMehdi Amini
217ef27db87SMehdi Amini if (Metadata *MD = MetadataPtrs[Idx])
218ef27db87SMehdi Amini return MD;
219ef27db87SMehdi Amini
220ef27db87SMehdi Amini // Track forward refs to be resolved later.
221690952d1SMehdi Amini ForwardReference.insert(Idx);
222ef27db87SMehdi Amini
223ef27db87SMehdi Amini // Create and return a placeholder, which will later be RAUW'd.
22419ef4fadSMehdi Amini ++NumMDNodeTemporary;
225ef27db87SMehdi Amini Metadata *MD = MDNode::getTemporary(Context, None).release();
226ef27db87SMehdi Amini MetadataPtrs[Idx].reset(MD);
227ef27db87SMehdi Amini return MD;
228ef27db87SMehdi Amini }
229ef27db87SMehdi Amini
getMetadataIfResolved(unsigned Idx)230ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
231ef27db87SMehdi Amini Metadata *MD = lookup(Idx);
232ef27db87SMehdi Amini if (auto *N = dyn_cast_or_null<MDNode>(MD))
233ef27db87SMehdi Amini if (!N->isResolved())
234ef27db87SMehdi Amini return nullptr;
235ef27db87SMehdi Amini return MD;
236ef27db87SMehdi Amini }
237ef27db87SMehdi Amini
getMDNodeFwdRefOrNull(unsigned Idx)238ef27db87SMehdi Amini MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
239ef27db87SMehdi Amini return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
240ef27db87SMehdi Amini }
241ef27db87SMehdi Amini
tryToResolveCycles()242ef27db87SMehdi Amini void BitcodeReaderMetadataList::tryToResolveCycles() {
243690952d1SMehdi Amini if (!ForwardReference.empty())
244ef27db87SMehdi Amini // Still forward references... can't resolve cycles.
245ef27db87SMehdi Amini return;
246ef27db87SMehdi Amini
247ef27db87SMehdi Amini // Give up on finding a full definition for any forward decls that remain.
248ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.FwdDecls)
249ef27db87SMehdi Amini OldTypeRefs.Final.insert(Ref);
250ef27db87SMehdi Amini OldTypeRefs.FwdDecls.clear();
251ef27db87SMehdi Amini
252ef27db87SMehdi Amini // Upgrade from old type ref arrays. In strange cases, this could add to
253ef27db87SMehdi Amini // OldTypeRefs.Unknown.
254690952d1SMehdi Amini for (const auto &Array : OldTypeRefs.Arrays)
255ef27db87SMehdi Amini Array.second->replaceAllUsesWith(resolveTypeRefArray(Array.first.get()));
256ef27db87SMehdi Amini OldTypeRefs.Arrays.clear();
257ef27db87SMehdi Amini
258ef27db87SMehdi Amini // Replace old string-based type refs with the resolved node, if possible.
259ef27db87SMehdi Amini // If we haven't seen the node, leave it to the verifier to complain about
260ef27db87SMehdi Amini // the invalid string reference.
261ef27db87SMehdi Amini for (const auto &Ref : OldTypeRefs.Unknown) {
262ef27db87SMehdi Amini if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
263ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(CT);
264ef27db87SMehdi Amini else
265ef27db87SMehdi Amini Ref.second->replaceAllUsesWith(Ref.first);
266ef27db87SMehdi Amini }
267ef27db87SMehdi Amini OldTypeRefs.Unknown.clear();
268ef27db87SMehdi Amini
269690952d1SMehdi Amini if (UnresolvedNodes.empty())
270ef27db87SMehdi Amini // Nothing to do.
271ef27db87SMehdi Amini return;
272ef27db87SMehdi Amini
273ef27db87SMehdi Amini // Resolve any cycles.
274690952d1SMehdi Amini for (unsigned I : UnresolvedNodes) {
275ef27db87SMehdi Amini auto &MD = MetadataPtrs[I];
276ef27db87SMehdi Amini auto *N = dyn_cast_or_null<MDNode>(MD);
277ef27db87SMehdi Amini if (!N)
278ef27db87SMehdi Amini continue;
279ef27db87SMehdi Amini
280ef27db87SMehdi Amini assert(!N->isTemporary() && "Unexpected forward reference");
281ef27db87SMehdi Amini N->resolveCycles();
282ef27db87SMehdi Amini }
283ef27db87SMehdi Amini
284690952d1SMehdi Amini // Make sure we return early again until there's another unresolved ref.
285690952d1SMehdi Amini UnresolvedNodes.clear();
286ef27db87SMehdi Amini }
287ef27db87SMehdi Amini
addTypeRef(MDString & UUID,DICompositeType & CT)288ef27db87SMehdi Amini void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
289ef27db87SMehdi Amini DICompositeType &CT) {
290ef27db87SMehdi Amini assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
291ef27db87SMehdi Amini if (CT.isForwardDecl())
292ef27db87SMehdi Amini OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
293ef27db87SMehdi Amini else
294ef27db87SMehdi Amini OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
295ef27db87SMehdi Amini }
296ef27db87SMehdi Amini
upgradeTypeRef(Metadata * MaybeUUID)297ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
298ef27db87SMehdi Amini auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
299ef27db87SMehdi Amini if (LLVM_LIKELY(!UUID))
300ef27db87SMehdi Amini return MaybeUUID;
301ef27db87SMehdi Amini
302ef27db87SMehdi Amini if (auto *CT = OldTypeRefs.Final.lookup(UUID))
303ef27db87SMehdi Amini return CT;
304ef27db87SMehdi Amini
305ef27db87SMehdi Amini auto &Ref = OldTypeRefs.Unknown[UUID];
306ef27db87SMehdi Amini if (!Ref)
307ef27db87SMehdi Amini Ref = MDNode::getTemporary(Context, None);
308ef27db87SMehdi Amini return Ref.get();
309ef27db87SMehdi Amini }
310ef27db87SMehdi Amini
upgradeTypeRefArray(Metadata * MaybeTuple)311ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::upgradeTypeRefArray(Metadata *MaybeTuple) {
312ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
313ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct())
314ef27db87SMehdi Amini return MaybeTuple;
315ef27db87SMehdi Amini
316ef27db87SMehdi Amini // Look through the array immediately if possible.
317ef27db87SMehdi Amini if (!Tuple->isTemporary())
318ef27db87SMehdi Amini return resolveTypeRefArray(Tuple);
319ef27db87SMehdi Amini
320ef27db87SMehdi Amini // Create and return a placeholder to use for now. Eventually
321ef27db87SMehdi Amini // resolveTypeRefArrays() will be resolve this forward reference.
322ef27db87SMehdi Amini OldTypeRefs.Arrays.emplace_back(
323ef27db87SMehdi Amini std::piecewise_construct, std::forward_as_tuple(Tuple),
324ef27db87SMehdi Amini std::forward_as_tuple(MDTuple::getTemporary(Context, None)));
325ef27db87SMehdi Amini return OldTypeRefs.Arrays.back().second.get();
326ef27db87SMehdi Amini }
327ef27db87SMehdi Amini
resolveTypeRefArray(Metadata * MaybeTuple)328ef27db87SMehdi Amini Metadata *BitcodeReaderMetadataList::resolveTypeRefArray(Metadata *MaybeTuple) {
329ef27db87SMehdi Amini auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
330ef27db87SMehdi Amini if (!Tuple || Tuple->isDistinct())
331ef27db87SMehdi Amini return MaybeTuple;
332ef27db87SMehdi Amini
333da82ce99SFangrui Song // Look through the DITypeRefArray, upgrading each DIType *.
334ef27db87SMehdi Amini SmallVector<Metadata *, 32> Ops;
335ef27db87SMehdi Amini Ops.reserve(Tuple->getNumOperands());
336ef27db87SMehdi Amini for (Metadata *MD : Tuple->operands())
337ef27db87SMehdi Amini Ops.push_back(upgradeTypeRef(MD));
338ef27db87SMehdi Amini
339ef27db87SMehdi Amini return MDTuple::get(Context, Ops);
340ef27db87SMehdi Amini }
341ef27db87SMehdi Amini
342ef27db87SMehdi Amini namespace {
343ef27db87SMehdi Amini
344ef27db87SMehdi Amini class PlaceholderQueue {
345ef27db87SMehdi Amini // Placeholders would thrash around when moved, so store in a std::deque
346ef27db87SMehdi Amini // instead of some sort of vector.
347ef27db87SMehdi Amini std::deque<DistinctMDOperandPlaceholder> PHs;
348ef27db87SMehdi Amini
349ef27db87SMehdi Amini public:
~PlaceholderQueue()35027379892SMehdi Amini ~PlaceholderQueue() {
351665b4138SLuís Ferreira assert(empty() &&
352665b4138SLuís Ferreira "PlaceholderQueue hasn't been flushed before being destroyed");
35327379892SMehdi Amini }
empty() const354bd76f372SSimon Pilgrim bool empty() const { return PHs.empty(); }
355ef27db87SMehdi Amini DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
356ef27db87SMehdi Amini void flush(BitcodeReaderMetadataList &MetadataList);
35719ef4fadSMehdi Amini
35819ef4fadSMehdi Amini /// Return the list of temporaries nodes in the queue, these need to be
35919ef4fadSMehdi Amini /// loaded before we can flush the queue.
getTemporaries(BitcodeReaderMetadataList & MetadataList,DenseSet<unsigned> & Temporaries)36019ef4fadSMehdi Amini void getTemporaries(BitcodeReaderMetadataList &MetadataList,
36119ef4fadSMehdi Amini DenseSet<unsigned> &Temporaries) {
36219ef4fadSMehdi Amini for (auto &PH : PHs) {
36319ef4fadSMehdi Amini auto ID = PH.getID();
36419ef4fadSMehdi Amini auto *MD = MetadataList.lookup(ID);
36519ef4fadSMehdi Amini if (!MD) {
36619ef4fadSMehdi Amini Temporaries.insert(ID);
36719ef4fadSMehdi Amini continue;
36819ef4fadSMehdi Amini }
36919ef4fadSMehdi Amini auto *N = dyn_cast_or_null<MDNode>(MD);
37019ef4fadSMehdi Amini if (N && N->isTemporary())
37119ef4fadSMehdi Amini Temporaries.insert(ID);
37219ef4fadSMehdi Amini }
37319ef4fadSMehdi Amini }
374ef27db87SMehdi Amini };
375ef27db87SMehdi Amini
376ef27db87SMehdi Amini } // end anonymous namespace
377ef27db87SMehdi Amini
getPlaceholderOp(unsigned ID)378ef27db87SMehdi Amini DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
379ef27db87SMehdi Amini PHs.emplace_back(ID);
380ef27db87SMehdi Amini return PHs.back();
381ef27db87SMehdi Amini }
382ef27db87SMehdi Amini
flush(BitcodeReaderMetadataList & MetadataList)383ef27db87SMehdi Amini void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
384ef27db87SMehdi Amini while (!PHs.empty()) {
3854f90ee00SMehdi Amini auto *MD = MetadataList.lookup(PHs.front().getID());
3864f90ee00SMehdi Amini assert(MD && "Flushing placeholder on unassigned MD");
3875ae6170fSMehdi Amini #ifndef NDEBUG
3884f90ee00SMehdi Amini if (auto *MDN = dyn_cast<MDNode>(MD))
3895ae6170fSMehdi Amini assert(MDN->isResolved() &&
3905ae6170fSMehdi Amini "Flushing Placeholder while cycles aren't resolved");
3915ae6170fSMehdi Amini #endif
3925ae6170fSMehdi Amini PHs.front().replaceUseWith(MD);
393ef27db87SMehdi Amini PHs.pop_front();
394ef27db87SMehdi Amini }
395ef27db87SMehdi Amini }
396ef27db87SMehdi Amini
397d68904f9SJames Henderson } // anonymous namespace
398ef27db87SMehdi Amini
error(const Twine & Message)399ffc498dfSFlorian Hahn static Error error(const Twine &Message) {
400ffc498dfSFlorian Hahn return make_error<StringError>(
401ffc498dfSFlorian Hahn Message, make_error_code(BitcodeError::CorruptedBitcode));
402ffc498dfSFlorian Hahn }
403ffc498dfSFlorian Hahn
404ef27db87SMehdi Amini class MetadataLoader::MetadataLoaderImpl {
405ef27db87SMehdi Amini BitcodeReaderMetadataList MetadataList;
406ef27db87SMehdi Amini BitcodeReaderValueList &ValueList;
407ef27db87SMehdi Amini BitstreamCursor &Stream;
408ef27db87SMehdi Amini LLVMContext &Context;
409ef27db87SMehdi Amini Module &TheModule;
410ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID;
411ef27db87SMehdi Amini
41219ef4fadSMehdi Amini /// Cursor associated with the lazy-loading of Metadata. This is the easy way
41319ef4fadSMehdi Amini /// to keep around the right "context" (Abbrev list) to be able to jump in
41419ef4fadSMehdi Amini /// the middle of the metadata block and load any record.
41519ef4fadSMehdi Amini BitstreamCursor IndexCursor;
41619ef4fadSMehdi Amini
41719ef4fadSMehdi Amini /// Index that keeps track of MDString values.
41819ef4fadSMehdi Amini std::vector<StringRef> MDStringRef;
41919ef4fadSMehdi Amini
42019ef4fadSMehdi Amini /// On-demand loading of a single MDString. Requires the index above to be
42119ef4fadSMehdi Amini /// populated.
42219ef4fadSMehdi Amini MDString *lazyLoadOneMDString(unsigned Idx);
42319ef4fadSMehdi Amini
42419ef4fadSMehdi Amini /// Index that keeps track of where to find a metadata record in the stream.
42519ef4fadSMehdi Amini std::vector<uint64_t> GlobalMetadataBitPosIndex;
42619ef4fadSMehdi Amini
427c27ab339STeresa Johnson /// Cursor position of the start of the global decl attachments, to enable
428c27ab339STeresa Johnson /// loading using the index built for lazy loading, instead of forward
429c27ab339STeresa Johnson /// references.
430c27ab339STeresa Johnson uint64_t GlobalDeclAttachmentPos = 0;
431c27ab339STeresa Johnson
432c27ab339STeresa Johnson #ifndef NDEBUG
43395875d24SZarko Todorovski /// Baisic correctness check that we end up parsing all of the global decl
43495875d24SZarko Todorovski /// attachments.
435c27ab339STeresa Johnson unsigned NumGlobalDeclAttachSkipped = 0;
436c27ab339STeresa Johnson unsigned NumGlobalDeclAttachParsed = 0;
437c27ab339STeresa Johnson #endif
438c27ab339STeresa Johnson
439c27ab339STeresa Johnson /// Load the global decl attachments, using the index built for lazy loading.
440c27ab339STeresa Johnson Expected<bool> loadGlobalDeclAttachments();
441c27ab339STeresa Johnson
44219ef4fadSMehdi Amini /// Populate the index above to enable lazily loading of metadata, and load
44319ef4fadSMehdi Amini /// the named metadata as well as the transitively referenced global
44419ef4fadSMehdi Amini /// Metadata.
44542ef1990SMehdi Amini Expected<bool> lazyLoadModuleMetadataBlock();
44619ef4fadSMehdi Amini
44719ef4fadSMehdi Amini /// On-demand loading of a single metadata. Requires the index above to be
44819ef4fadSMehdi Amini /// populated.
44919ef4fadSMehdi Amini void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
45019ef4fadSMehdi Amini
4519f926f70SMehdi Amini // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
4529f926f70SMehdi Amini // point from SP to CU after a block is completly parsed.
4539f926f70SMehdi Amini std::vector<std::pair<DICompileUnit *, Metadata *>> CUSubprograms;
4549f926f70SMehdi Amini
455ef27db87SMehdi Amini /// Functions that need to be matched with subprograms when upgrading old
456ef27db87SMehdi Amini /// metadata.
457ef27db87SMehdi Amini SmallDenseMap<Function *, DISubprogram *, 16> FunctionsWithSPs;
458ef27db87SMehdi Amini
459ef27db87SMehdi Amini // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
460ef27db87SMehdi Amini DenseMap<unsigned, unsigned> MDKindMap;
461ef27db87SMehdi Amini
4628662305bSMehdi Amini bool StripTBAA = false;
463ef27db87SMehdi Amini bool HasSeenOldLoopTags = false;
464e37d3144SAdrian Prantl bool NeedUpgradeToDIGlobalVariableExpression = false;
4656825fb64SAdrian Prantl bool NeedDeclareExpressionUpgrade = false;
466ef27db87SMehdi Amini
467ec68dd49SMehdi Amini /// True if metadata is being parsed for a module being ThinLTO imported.
468ec68dd49SMehdi Amini bool IsImporting = false;
469ec68dd49SMehdi Amini
4709f926f70SMehdi Amini Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
4719f926f70SMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob,
472ef27db87SMehdi Amini unsigned &NextMetadataNo);
47319ef4fadSMehdi Amini Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
474061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack);
475ef27db87SMehdi Amini Error parseGlobalObjectAttachment(GlobalObject &GO,
476ef27db87SMehdi Amini ArrayRef<uint64_t> Record);
477ef27db87SMehdi Amini Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
478ef27db87SMehdi Amini
47919ef4fadSMehdi Amini void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
48019ef4fadSMehdi Amini
48119ef4fadSMehdi Amini /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
upgradeCUSubprograms()48219ef4fadSMehdi Amini void upgradeCUSubprograms() {
48319ef4fadSMehdi Amini for (auto CU_SP : CUSubprograms)
48419ef4fadSMehdi Amini if (auto *SPs = dyn_cast_or_null<MDTuple>(CU_SP.second))
48519ef4fadSMehdi Amini for (auto &Op : SPs->operands())
4869d2f019fSAdrian Prantl if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
4879d2f019fSAdrian Prantl SP->replaceUnit(CU_SP.first);
48819ef4fadSMehdi Amini CUSubprograms.clear();
48919ef4fadSMehdi Amini }
49019ef4fadSMehdi Amini
491e37d3144SAdrian Prantl /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
upgradeCUVariables()492e37d3144SAdrian Prantl void upgradeCUVariables() {
493e37d3144SAdrian Prantl if (!NeedUpgradeToDIGlobalVariableExpression)
494e37d3144SAdrian Prantl return;
495e37d3144SAdrian Prantl
496e37d3144SAdrian Prantl // Upgrade list of variables attached to the CUs.
497e37d3144SAdrian Prantl if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
498e37d3144SAdrian Prantl for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
499e37d3144SAdrian Prantl auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
500e37d3144SAdrian Prantl if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
501e37d3144SAdrian Prantl for (unsigned I = 0; I < GVs->getNumOperands(); I++)
502e37d3144SAdrian Prantl if (auto *GV =
503e37d3144SAdrian Prantl dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
50405782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct(
50505782218SAdrian Prantl Context, GV, DIExpression::get(Context, {}));
506e37d3144SAdrian Prantl GVs->replaceOperandWith(I, DGVE);
507e37d3144SAdrian Prantl }
508e37d3144SAdrian Prantl }
509e37d3144SAdrian Prantl
510e37d3144SAdrian Prantl // Upgrade variables attached to globals.
511e37d3144SAdrian Prantl for (auto &GV : TheModule.globals()) {
51256a08b40SDavide Italiano SmallVector<MDNode *, 1> MDs;
513e37d3144SAdrian Prantl GV.getMetadata(LLVMContext::MD_dbg, MDs);
514e37d3144SAdrian Prantl GV.eraseMetadata(LLVMContext::MD_dbg);
515e37d3144SAdrian Prantl for (auto *MD : MDs)
5162bb217b5SSimon Pilgrim if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
51705782218SAdrian Prantl auto *DGVE = DIGlobalVariableExpression::getDistinct(
51805782218SAdrian Prantl Context, DGV, DIExpression::get(Context, {}));
519e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
520e37d3144SAdrian Prantl } else
521e37d3144SAdrian Prantl GV.addMetadata(LLVMContext::MD_dbg, *MD);
522e37d3144SAdrian Prantl }
523e37d3144SAdrian Prantl }
524e37d3144SAdrian Prantl
5256825fb64SAdrian Prantl /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
5266825fb64SAdrian Prantl /// describes a function argument.
upgradeDeclareExpressions(Function & F)5276825fb64SAdrian Prantl void upgradeDeclareExpressions(Function &F) {
5286825fb64SAdrian Prantl if (!NeedDeclareExpressionUpgrade)
5296825fb64SAdrian Prantl return;
5306825fb64SAdrian Prantl
5316825fb64SAdrian Prantl for (auto &BB : F)
5326825fb64SAdrian Prantl for (auto &I : BB)
5336825fb64SAdrian Prantl if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
5346825fb64SAdrian Prantl if (auto *DIExpr = DDI->getExpression())
5356825fb64SAdrian Prantl if (DIExpr->startsWithDeref() &&
536d243cbf8SKazu Hirata isa_and_nonnull<Argument>(DDI->getAddress())) {
5376825fb64SAdrian Prantl SmallVector<uint64_t, 8> Ops;
5386825fb64SAdrian Prantl Ops.append(std::next(DIExpr->elements_begin()),
5396825fb64SAdrian Prantl DIExpr->elements_end());
540e5d958c4Sgbtozers DDI->setExpression(DIExpression::get(Context, Ops));
5416825fb64SAdrian Prantl }
5426825fb64SAdrian Prantl }
5436825fb64SAdrian Prantl
544ffc498dfSFlorian Hahn /// Upgrade the expression from previous versions.
upgradeDIExpression(uint64_t FromVersion,MutableArrayRef<uint64_t> & Expr,SmallVectorImpl<uint64_t> & Buffer)54505963a3dSArthur Eubanks Error upgradeDIExpression(uint64_t FromVersion,
546ffc498dfSFlorian Hahn MutableArrayRef<uint64_t> &Expr,
547ffc498dfSFlorian Hahn SmallVectorImpl<uint64_t> &Buffer) {
548ffc498dfSFlorian Hahn auto N = Expr.size();
549ffc498dfSFlorian Hahn switch (FromVersion) {
550ffc498dfSFlorian Hahn default:
551ffc498dfSFlorian Hahn return error("Invalid record");
552ffc498dfSFlorian Hahn case 0:
553ffc498dfSFlorian Hahn if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
554ffc498dfSFlorian Hahn Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
555ffc498dfSFlorian Hahn LLVM_FALLTHROUGH;
556ffc498dfSFlorian Hahn case 1:
557ffc498dfSFlorian Hahn // Move DW_OP_deref to the end.
558ffc498dfSFlorian Hahn if (N && Expr[0] == dwarf::DW_OP_deref) {
559ffc498dfSFlorian Hahn auto End = Expr.end();
560ffc498dfSFlorian Hahn if (Expr.size() >= 3 &&
561ffc498dfSFlorian Hahn *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
562ffc498dfSFlorian Hahn End = std::prev(End, 3);
563ffc498dfSFlorian Hahn std::move(std::next(Expr.begin()), End, Expr.begin());
564ffc498dfSFlorian Hahn *std::prev(End) = dwarf::DW_OP_deref;
565ffc498dfSFlorian Hahn }
566ffc498dfSFlorian Hahn NeedDeclareExpressionUpgrade = true;
567ffc498dfSFlorian Hahn LLVM_FALLTHROUGH;
568ffc498dfSFlorian Hahn case 2: {
569ffc498dfSFlorian Hahn // Change DW_OP_plus to DW_OP_plus_uconst.
570ffc498dfSFlorian Hahn // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
571ffc498dfSFlorian Hahn auto SubExpr = ArrayRef<uint64_t>(Expr);
572ffc498dfSFlorian Hahn while (!SubExpr.empty()) {
573ffc498dfSFlorian Hahn // Skip past other operators with their operands
574ffc498dfSFlorian Hahn // for this version of the IR, obtained from
575ffc498dfSFlorian Hahn // from historic DIExpression::ExprOperand::getSize().
576ffc498dfSFlorian Hahn size_t HistoricSize;
577ffc498dfSFlorian Hahn switch (SubExpr.front()) {
578ffc498dfSFlorian Hahn default:
579ffc498dfSFlorian Hahn HistoricSize = 1;
580ffc498dfSFlorian Hahn break;
581ffc498dfSFlorian Hahn case dwarf::DW_OP_constu:
582ffc498dfSFlorian Hahn case dwarf::DW_OP_minus:
583ffc498dfSFlorian Hahn case dwarf::DW_OP_plus:
584ffc498dfSFlorian Hahn HistoricSize = 2;
585ffc498dfSFlorian Hahn break;
586ffc498dfSFlorian Hahn case dwarf::DW_OP_LLVM_fragment:
587ffc498dfSFlorian Hahn HistoricSize = 3;
588ffc498dfSFlorian Hahn break;
589ffc498dfSFlorian Hahn }
590ffc498dfSFlorian Hahn
591ffc498dfSFlorian Hahn // If the expression is malformed, make sure we don't
592ffc498dfSFlorian Hahn // copy more elements than we should.
593ffc498dfSFlorian Hahn HistoricSize = std::min(SubExpr.size(), HistoricSize);
594ffc498dfSFlorian Hahn ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1);
595ffc498dfSFlorian Hahn
596ffc498dfSFlorian Hahn switch (SubExpr.front()) {
597ffc498dfSFlorian Hahn case dwarf::DW_OP_plus:
598ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_plus_uconst);
599ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end());
600ffc498dfSFlorian Hahn break;
601ffc498dfSFlorian Hahn case dwarf::DW_OP_minus:
602ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_constu);
603ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end());
604ffc498dfSFlorian Hahn Buffer.push_back(dwarf::DW_OP_minus);
605ffc498dfSFlorian Hahn break;
606ffc498dfSFlorian Hahn default:
607ffc498dfSFlorian Hahn Buffer.push_back(*SubExpr.begin());
608ffc498dfSFlorian Hahn Buffer.append(Args.begin(), Args.end());
609ffc498dfSFlorian Hahn break;
610ffc498dfSFlorian Hahn }
611ffc498dfSFlorian Hahn
612ffc498dfSFlorian Hahn // Continue with remaining elements.
613ffc498dfSFlorian Hahn SubExpr = SubExpr.slice(HistoricSize);
614ffc498dfSFlorian Hahn }
615ffc498dfSFlorian Hahn Expr = MutableArrayRef<uint64_t>(Buffer);
616ffc498dfSFlorian Hahn LLVM_FALLTHROUGH;
617ffc498dfSFlorian Hahn }
618ffc498dfSFlorian Hahn case 3:
619ffc498dfSFlorian Hahn // Up-to-date!
620ffc498dfSFlorian Hahn break;
621ffc498dfSFlorian Hahn }
622ffc498dfSFlorian Hahn
623ffc498dfSFlorian Hahn return Error::success();
624ffc498dfSFlorian Hahn }
625ffc498dfSFlorian Hahn
upgradeDebugInfo()626e37d3144SAdrian Prantl void upgradeDebugInfo() {
627e37d3144SAdrian Prantl upgradeCUSubprograms();
628e37d3144SAdrian Prantl upgradeCUVariables();
629e37d3144SAdrian Prantl }
630e37d3144SAdrian Prantl
631ef27db87SMehdi Amini public:
MetadataLoaderImpl(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,std::function<Type * (unsigned)> getTypeByID,bool IsImporting)632ef27db87SMehdi Amini MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule,
633ef27db87SMehdi Amini BitcodeReaderValueList &ValueList,
634ec68dd49SMehdi Amini std::function<Type *(unsigned)> getTypeByID,
635ec68dd49SMehdi Amini bool IsImporting)
636864474c9SFlorian Hahn : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
637864474c9SFlorian Hahn ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
638864474c9SFlorian Hahn TheModule(TheModule), getTypeByID(std::move(getTypeByID)),
639864474c9SFlorian Hahn IsImporting(IsImporting) {}
640ef27db87SMehdi Amini
641ec68dd49SMehdi Amini Error parseMetadata(bool ModuleLevel);
642ef27db87SMehdi Amini
hasFwdRefs() const643ef27db87SMehdi Amini bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
6443bb4d01dSMehdi Amini
getMetadataFwdRefOrLoad(unsigned ID)6453bb4d01dSMehdi Amini Metadata *getMetadataFwdRefOrLoad(unsigned ID) {
6463bb4d01dSMehdi Amini if (ID < MDStringRef.size())
6473bb4d01dSMehdi Amini return lazyLoadOneMDString(ID);
6483bb4d01dSMehdi Amini if (auto *MD = MetadataList.lookup(ID))
6493bb4d01dSMehdi Amini return MD;
6503bb4d01dSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand
6513bb4d01dSMehdi Amini // instead of creating a temporary.
6523bb4d01dSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
6533bb4d01dSMehdi Amini PlaceholderQueue Placeholders;
6543bb4d01dSMehdi Amini lazyLoadOneMetadata(ID, Placeholders);
6553bb4d01dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders);
6563bb4d01dSMehdi Amini return MetadataList.lookup(ID);
6573bb4d01dSMehdi Amini }
6583bb4d01dSMehdi Amini return MetadataList.getMetadataFwdRef(ID);
659ef27db87SMehdi Amini }
660ef27db87SMehdi Amini
lookupSubprogramForFunction(Function * F)661ef27db87SMehdi Amini DISubprogram *lookupSubprogramForFunction(Function *F) {
662ef27db87SMehdi Amini return FunctionsWithSPs.lookup(F);
663ef27db87SMehdi Amini }
664ef27db87SMehdi Amini
hasSeenOldLoopTags() const665bd76f372SSimon Pilgrim bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
666ef27db87SMehdi Amini
6671237c149Sserge-sans-paille Error parseMetadataAttachment(Function &F,
6681237c149Sserge-sans-paille ArrayRef<Instruction *> InstructionList);
669ef27db87SMehdi Amini
670ef27db87SMehdi Amini Error parseMetadataKinds();
671ef27db87SMehdi Amini
setStripTBAA(bool Value)6728662305bSMehdi Amini void setStripTBAA(bool Value) { StripTBAA = Value; }
isStrippingTBAA() const673bd76f372SSimon Pilgrim bool isStrippingTBAA() const { return StripTBAA; }
6748662305bSMehdi Amini
size() const675ef27db87SMehdi Amini unsigned size() const { return MetadataList.size(); }
shrinkTo(unsigned N)676ef27db87SMehdi Amini void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
upgradeDebugIntrinsics(Function & F)6776825fb64SAdrian Prantl void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
678ef27db87SMehdi Amini };
679ef27db87SMehdi Amini
68042ef1990SMehdi Amini Expected<bool>
lazyLoadModuleMetadataBlock()68142ef1990SMehdi Amini MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
68219ef4fadSMehdi Amini IndexCursor = Stream;
68319ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record;
684c27ab339STeresa Johnson GlobalDeclAttachmentPos = 0;
68519ef4fadSMehdi Amini // Get the abbrevs, and preload record positions to make them lazy-loadable.
68619ef4fadSMehdi Amini while (true) {
687c27ab339STeresa Johnson uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
688b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
689b12a864cSDuncan P. N. Exon Smith if (Error E =
690b12a864cSDuncan P. N. Exon Smith IndexCursor
691b12a864cSDuncan P. N. Exon Smith .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
692b12a864cSDuncan P. N. Exon Smith .moveInto(Entry))
693b12a864cSDuncan P. N. Exon Smith return std::move(E);
6940e828958SJF Bastien
69519ef4fadSMehdi Amini switch (Entry.Kind) {
69619ef4fadSMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already.
69719ef4fadSMehdi Amini case BitstreamEntry::Error:
69819ef4fadSMehdi Amini return error("Malformed block");
69919ef4fadSMehdi Amini case BitstreamEntry::EndBlock: {
70019ef4fadSMehdi Amini return true;
70119ef4fadSMehdi Amini }
70219ef4fadSMehdi Amini case BitstreamEntry::Record: {
70319ef4fadSMehdi Amini // The interesting case.
70419ef4fadSMehdi Amini ++NumMDRecordLoaded;
70519ef4fadSMehdi Amini uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
706b12a864cSDuncan P. N. Exon Smith unsigned Code;
707b12a864cSDuncan P. N. Exon Smith if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
708b12a864cSDuncan P. N. Exon Smith return std::move(E);
70919ef4fadSMehdi Amini switch (Code) {
71019ef4fadSMehdi Amini case bitc::METADATA_STRINGS: {
71119ef4fadSMehdi Amini // Rewind and parse the strings.
7120e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos))
713c55cf4afSBill Wendling return std::move(Err);
71419ef4fadSMehdi Amini StringRef Blob;
71519ef4fadSMehdi Amini Record.clear();
7160e828958SJF Bastien if (Expected<unsigned> MaybeRecord =
7170e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record, &Blob))
7180e828958SJF Bastien ;
7190e828958SJF Bastien else
7200e828958SJF Bastien return MaybeRecord.takeError();
72119ef4fadSMehdi Amini unsigned NumStrings = Record[0];
72219ef4fadSMehdi Amini MDStringRef.reserve(NumStrings);
72319ef4fadSMehdi Amini auto IndexNextMDString = [&](StringRef Str) {
72419ef4fadSMehdi Amini MDStringRef.push_back(Str);
72519ef4fadSMehdi Amini };
72619ef4fadSMehdi Amini if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
727c55cf4afSBill Wendling return std::move(Err);
72819ef4fadSMehdi Amini break;
72919ef4fadSMehdi Amini }
73019ef4fadSMehdi Amini case bitc::METADATA_INDEX_OFFSET: {
73119ef4fadSMehdi Amini // This is the offset to the index, when we see this we skip all the
73219ef4fadSMehdi Amini // records and load only an index to these.
7330e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos))
734c55cf4afSBill Wendling return std::move(Err);
73519ef4fadSMehdi Amini Record.clear();
7360e828958SJF Bastien if (Expected<unsigned> MaybeRecord =
7370e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record))
7380e828958SJF Bastien ;
7390e828958SJF Bastien else
7400e828958SJF Bastien return MaybeRecord.takeError();
74119ef4fadSMehdi Amini if (Record.size() != 2)
74219ef4fadSMehdi Amini return error("Invalid record");
74319ef4fadSMehdi Amini auto Offset = Record[0] + (Record[1] << 32);
74419ef4fadSMehdi Amini auto BeginPos = IndexCursor.GetCurrentBitNo();
7450e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
746c55cf4afSBill Wendling return std::move(Err);
7470e828958SJF Bastien Expected<BitstreamEntry> MaybeEntry =
7480e828958SJF Bastien IndexCursor.advanceSkippingSubblocks(
74919ef4fadSMehdi Amini BitstreamCursor::AF_DontPopBlockAtEnd);
7500e828958SJF Bastien if (!MaybeEntry)
7510e828958SJF Bastien return MaybeEntry.takeError();
7520e828958SJF Bastien Entry = MaybeEntry.get();
75319ef4fadSMehdi Amini assert(Entry.Kind == BitstreamEntry::Record &&
75419ef4fadSMehdi Amini "Corrupted bitcode: Expected `Record` when trying to find the "
75519ef4fadSMehdi Amini "Metadata index");
75619ef4fadSMehdi Amini Record.clear();
7570e828958SJF Bastien if (Expected<unsigned> MaybeCode =
7580e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record))
7590e828958SJF Bastien assert(MaybeCode.get() == bitc::METADATA_INDEX &&
7600e828958SJF Bastien "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
7610e828958SJF Bastien "find the Metadata index");
7620e828958SJF Bastien else
7630e828958SJF Bastien return MaybeCode.takeError();
76419ef4fadSMehdi Amini // Delta unpack
76519ef4fadSMehdi Amini auto CurrentValue = BeginPos;
76619ef4fadSMehdi Amini GlobalMetadataBitPosIndex.reserve(Record.size());
76719ef4fadSMehdi Amini for (auto &Elt : Record) {
76819ef4fadSMehdi Amini CurrentValue += Elt;
76919ef4fadSMehdi Amini GlobalMetadataBitPosIndex.push_back(CurrentValue);
77019ef4fadSMehdi Amini }
77119ef4fadSMehdi Amini break;
77219ef4fadSMehdi Amini }
77319ef4fadSMehdi Amini case bitc::METADATA_INDEX:
77419ef4fadSMehdi Amini // We don't expect to get there, the Index is loaded when we encounter
77519ef4fadSMehdi Amini // the offset.
77619ef4fadSMehdi Amini return error("Corrupted Metadata block");
77719ef4fadSMehdi Amini case bitc::METADATA_NAME: {
77819ef4fadSMehdi Amini // Named metadata need to be materialized now and aren't deferred.
7790e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(CurrentPos))
780c55cf4afSBill Wendling return std::move(Err);
78119ef4fadSMehdi Amini Record.clear();
7820e828958SJF Bastien
7830e828958SJF Bastien unsigned Code;
7840e828958SJF Bastien if (Expected<unsigned> MaybeCode =
7850e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record)) {
7860e828958SJF Bastien Code = MaybeCode.get();
78719ef4fadSMehdi Amini assert(Code == bitc::METADATA_NAME);
7880e828958SJF Bastien } else
7890e828958SJF Bastien return MaybeCode.takeError();
79019ef4fadSMehdi Amini
79119ef4fadSMehdi Amini // Read name of the named metadata.
79219ef4fadSMehdi Amini SmallString<8> Name(Record.begin(), Record.end());
7930e828958SJF Bastien if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
7940e828958SJF Bastien Code = MaybeCode.get();
7950e828958SJF Bastien else
7960e828958SJF Bastien return MaybeCode.takeError();
79719ef4fadSMehdi Amini
79819ef4fadSMehdi Amini // Named Metadata comes in two parts, we expect the name to be followed
79919ef4fadSMehdi Amini // by the node
80019ef4fadSMehdi Amini Record.clear();
8010e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode =
8020e828958SJF Bastien IndexCursor.readRecord(Code, Record))
8030e828958SJF Bastien assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
8040e828958SJF Bastien else
8050e828958SJF Bastien return MaybeNextBitCode.takeError();
80619ef4fadSMehdi Amini
80719ef4fadSMehdi Amini // Read named metadata elements.
80819ef4fadSMehdi Amini unsigned Size = Record.size();
80919ef4fadSMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
81019ef4fadSMehdi Amini for (unsigned i = 0; i != Size; ++i) {
81119ef4fadSMehdi Amini // FIXME: We could use a placeholder here, however NamedMDNode are
81219ef4fadSMehdi Amini // taking MDNode as operand and not using the Metadata infrastructure.
81319ef4fadSMehdi Amini // It is acknowledged by 'TODO: Inherit from Metadata' in the
81419ef4fadSMehdi Amini // NamedMDNode class definition.
81519ef4fadSMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
816f3d2453dSTeresa Johnson assert(MD && "Invalid metadata: expect fwd ref to MDNode");
81719ef4fadSMehdi Amini NMD->addOperand(MD);
81819ef4fadSMehdi Amini }
81919ef4fadSMehdi Amini break;
82019ef4fadSMehdi Amini }
82119ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
822c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos)
823c27ab339STeresa Johnson GlobalDeclAttachmentPos = SavedPos;
824c27ab339STeresa Johnson #ifndef NDEBUG
825c27ab339STeresa Johnson NumGlobalDeclAttachSkipped++;
826c27ab339STeresa Johnson #endif
82719ef4fadSMehdi Amini break;
82819ef4fadSMehdi Amini }
82919ef4fadSMehdi Amini case bitc::METADATA_KIND:
83019ef4fadSMehdi Amini case bitc::METADATA_STRING_OLD:
83119ef4fadSMehdi Amini case bitc::METADATA_OLD_FN_NODE:
83219ef4fadSMehdi Amini case bitc::METADATA_OLD_NODE:
83319ef4fadSMehdi Amini case bitc::METADATA_VALUE:
83419ef4fadSMehdi Amini case bitc::METADATA_DISTINCT_NODE:
83519ef4fadSMehdi Amini case bitc::METADATA_NODE:
83619ef4fadSMehdi Amini case bitc::METADATA_LOCATION:
83719ef4fadSMehdi Amini case bitc::METADATA_GENERIC_DEBUG:
83819ef4fadSMehdi Amini case bitc::METADATA_SUBRANGE:
83919ef4fadSMehdi Amini case bitc::METADATA_ENUMERATOR:
84019ef4fadSMehdi Amini case bitc::METADATA_BASIC_TYPE:
841f91d18eaSSourabh Singh Tomar case bitc::METADATA_STRING_TYPE:
84219ef4fadSMehdi Amini case bitc::METADATA_DERIVED_TYPE:
84319ef4fadSMehdi Amini case bitc::METADATA_COMPOSITE_TYPE:
84419ef4fadSMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE:
84519ef4fadSMehdi Amini case bitc::METADATA_MODULE:
84619ef4fadSMehdi Amini case bitc::METADATA_FILE:
84719ef4fadSMehdi Amini case bitc::METADATA_COMPILE_UNIT:
84819ef4fadSMehdi Amini case bitc::METADATA_SUBPROGRAM:
84919ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK:
85019ef4fadSMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE:
85119ef4fadSMehdi Amini case bitc::METADATA_NAMESPACE:
8526ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK:
85319ef4fadSMehdi Amini case bitc::METADATA_MACRO:
85419ef4fadSMehdi Amini case bitc::METADATA_MACRO_FILE:
85519ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_TYPE:
85619ef4fadSMehdi Amini case bitc::METADATA_TEMPLATE_VALUE:
85719ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR:
85819ef4fadSMehdi Amini case bitc::METADATA_LOCAL_VAR:
8592c864551SShiva Chen case bitc::METADATA_LABEL:
86019ef4fadSMehdi Amini case bitc::METADATA_EXPRESSION:
86119ef4fadSMehdi Amini case bitc::METADATA_OBJC_PROPERTY:
86219ef4fadSMehdi Amini case bitc::METADATA_IMPORTED_ENTITY:
86319ef4fadSMehdi Amini case bitc::METADATA_GLOBAL_VAR_EXPR:
864a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE:
86519ef4fadSMehdi Amini // We don't expect to see any of these, if we see one, give up on
86619ef4fadSMehdi Amini // lazy-loading and fallback.
86719ef4fadSMehdi Amini MDStringRef.clear();
86819ef4fadSMehdi Amini GlobalMetadataBitPosIndex.clear();
86919ef4fadSMehdi Amini return false;
87019ef4fadSMehdi Amini }
87119ef4fadSMehdi Amini break;
87219ef4fadSMehdi Amini }
87319ef4fadSMehdi Amini }
87419ef4fadSMehdi Amini }
87519ef4fadSMehdi Amini }
87619ef4fadSMehdi Amini
877c27ab339STeresa Johnson // Load the global decl attachments after building the lazy loading index.
878c27ab339STeresa Johnson // We don't load them "lazily" - all global decl attachments must be
879c27ab339STeresa Johnson // parsed since they aren't materialized on demand. However, by delaying
880c27ab339STeresa Johnson // their parsing until after the index is created, we can use the index
881c27ab339STeresa Johnson // instead of creating temporaries.
loadGlobalDeclAttachments()882c27ab339STeresa Johnson Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
883c27ab339STeresa Johnson // Nothing to do if we didn't find any of these metadata records.
884c27ab339STeresa Johnson if (!GlobalDeclAttachmentPos)
885c27ab339STeresa Johnson return true;
886c27ab339STeresa Johnson // Use a temporary cursor so that we don't mess up the main Stream cursor or
887c27ab339STeresa Johnson // the lazy loading IndexCursor (which holds the necessary abbrev ids).
888c27ab339STeresa Johnson BitstreamCursor TempCursor = Stream;
889c27ab339STeresa Johnson SmallVector<uint64_t, 64> Record;
890c27ab339STeresa Johnson // Jump to the position before the first global decl attachment, so we can
891c27ab339STeresa Johnson // scan for the first BitstreamEntry record.
892c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
893c27ab339STeresa Johnson return std::move(Err);
894c27ab339STeresa Johnson while (true) {
895b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
896b12a864cSDuncan P. N. Exon Smith if (Error E =
897b12a864cSDuncan P. N. Exon Smith TempCursor
898b12a864cSDuncan P. N. Exon Smith .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
899b12a864cSDuncan P. N. Exon Smith .moveInto(Entry))
900b12a864cSDuncan P. N. Exon Smith return std::move(E);
901c27ab339STeresa Johnson
902c27ab339STeresa Johnson switch (Entry.Kind) {
903c27ab339STeresa Johnson case BitstreamEntry::SubBlock: // Handled for us already.
904c27ab339STeresa Johnson case BitstreamEntry::Error:
905c27ab339STeresa Johnson return error("Malformed block");
906c27ab339STeresa Johnson case BitstreamEntry::EndBlock:
90795875d24SZarko Todorovski // Check that we parsed them all.
908c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
909c27ab339STeresa Johnson return true;
910c27ab339STeresa Johnson case BitstreamEntry::Record:
911c27ab339STeresa Johnson break;
912c27ab339STeresa Johnson }
913c27ab339STeresa Johnson uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
914c27ab339STeresa Johnson Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
915c27ab339STeresa Johnson if (!MaybeCode)
916c27ab339STeresa Johnson return MaybeCode.takeError();
917c27ab339STeresa Johnson if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
918c27ab339STeresa Johnson // Anything other than a global decl attachment signals the end of
91995875d24SZarko Todorovski // these records. Check that we parsed them all.
920c27ab339STeresa Johnson assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
921c27ab339STeresa Johnson return true;
922c27ab339STeresa Johnson }
923c27ab339STeresa Johnson #ifndef NDEBUG
924c27ab339STeresa Johnson NumGlobalDeclAttachParsed++;
925c27ab339STeresa Johnson #endif
926c27ab339STeresa Johnson // FIXME: we need to do this early because we don't materialize global
927c27ab339STeresa Johnson // value explicitly.
928c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos))
929c27ab339STeresa Johnson return std::move(Err);
930c27ab339STeresa Johnson Record.clear();
931c27ab339STeresa Johnson if (Expected<unsigned> MaybeRecord =
932c27ab339STeresa Johnson TempCursor.readRecord(Entry.ID, Record))
933c27ab339STeresa Johnson ;
934c27ab339STeresa Johnson else
935c27ab339STeresa Johnson return MaybeRecord.takeError();
936c27ab339STeresa Johnson if (Record.size() % 2 == 0)
937c27ab339STeresa Johnson return error("Invalid record");
938c27ab339STeresa Johnson unsigned ValueID = Record[0];
939c27ab339STeresa Johnson if (ValueID >= ValueList.size())
940c27ab339STeresa Johnson return error("Invalid record");
941c27ab339STeresa Johnson if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
942c27ab339STeresa Johnson // Need to save and restore the current position since
943c27ab339STeresa Johnson // parseGlobalObjectAttachment will resolve all forward references which
944c27ab339STeresa Johnson // would require parsing from locations stored in the index.
945c27ab339STeresa Johnson CurrentPos = TempCursor.GetCurrentBitNo();
946c27ab339STeresa Johnson if (Error Err = parseGlobalObjectAttachment(
947c27ab339STeresa Johnson *GO, ArrayRef<uint64_t>(Record).slice(1)))
948c27ab339STeresa Johnson return std::move(Err);
949c27ab339STeresa Johnson if (Error Err = TempCursor.JumpToBit(CurrentPos))
950c27ab339STeresa Johnson return std::move(Err);
951c27ab339STeresa Johnson }
952c27ab339STeresa Johnson }
953c27ab339STeresa Johnson }
954c27ab339STeresa Johnson
955ef27db87SMehdi Amini /// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
956ef27db87SMehdi Amini /// module level metadata.
parseMetadata(bool ModuleLevel)957ec68dd49SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadata(bool ModuleLevel) {
958ef27db87SMehdi Amini if (!ModuleLevel && MetadataList.hasFwdRefs())
959ef27db87SMehdi Amini return error("Invalid metadata: fwd refs into function blocks");
960ef27db87SMehdi Amini
96119ef4fadSMehdi Amini // Record the entry position so that we can jump back here and efficiently
96219ef4fadSMehdi Amini // skip the whole block in case we lazy-load.
96319ef4fadSMehdi Amini auto EntryPos = Stream.GetCurrentBitNo();
96419ef4fadSMehdi Amini
9650e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
9660e828958SJF Bastien return Err;
967ef27db87SMehdi Amini
968ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record;
969ef27db87SMehdi Amini PlaceholderQueue Placeholders;
9709f926f70SMehdi Amini
97119ef4fadSMehdi Amini // We lazy-load module-level metadata: we build an index for each record, and
97219ef4fadSMehdi Amini // then load individual record as needed, starting with the named metadata.
97319ef4fadSMehdi Amini if (ModuleLevel && IsImporting && MetadataList.empty() &&
97419ef4fadSMehdi Amini !DisableLazyLoading) {
97542ef1990SMehdi Amini auto SuccessOrErr = lazyLoadModuleMetadataBlock();
97619ef4fadSMehdi Amini if (!SuccessOrErr)
97719ef4fadSMehdi Amini return SuccessOrErr.takeError();
97819ef4fadSMehdi Amini if (SuccessOrErr.get()) {
97919ef4fadSMehdi Amini // An index was successfully created and we will be able to load metadata
98019ef4fadSMehdi Amini // on-demand.
98119ef4fadSMehdi Amini MetadataList.resize(MDStringRef.size() +
98219ef4fadSMehdi Amini GlobalMetadataBitPosIndex.size());
98319ef4fadSMehdi Amini
984c27ab339STeresa Johnson // Now that we have built the index, load the global decl attachments
985c27ab339STeresa Johnson // that were deferred during that process. This avoids creating
986c27ab339STeresa Johnson // temporaries.
987c27ab339STeresa Johnson SuccessOrErr = loadGlobalDeclAttachments();
988c27ab339STeresa Johnson if (!SuccessOrErr)
989c27ab339STeresa Johnson return SuccessOrErr.takeError();
990c27ab339STeresa Johnson assert(SuccessOrErr.get());
991c27ab339STeresa Johnson
99219ef4fadSMehdi Amini // Reading the named metadata created forward references and/or
99319ef4fadSMehdi Amini // placeholders, that we flush here.
99419ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders);
995e37d3144SAdrian Prantl upgradeDebugInfo();
99619ef4fadSMehdi Amini // Return at the beginning of the block, since it is easy to skip it
99719ef4fadSMehdi Amini // entirely from there.
99819ef4fadSMehdi Amini Stream.ReadBlockEnd(); // Pop the abbrev block context.
9990e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(EntryPos))
10000e828958SJF Bastien return Err;
10010e828958SJF Bastien if (Error Err = Stream.SkipBlock()) {
10020e828958SJF Bastien // FIXME this drops the error on the floor, which
10030e828958SJF Bastien // ThinLTO/X86/debuginfo-cu-import.ll relies on.
10040e828958SJF Bastien consumeError(std::move(Err));
10050e828958SJF Bastien return Error::success();
10060e828958SJF Bastien }
100719ef4fadSMehdi Amini return Error::success();
100819ef4fadSMehdi Amini }
100919ef4fadSMehdi Amini // Couldn't load an index, fallback to loading all the block "old-style".
101019ef4fadSMehdi Amini }
101119ef4fadSMehdi Amini
101219ef4fadSMehdi Amini unsigned NextMetadataNo = MetadataList.size();
101319ef4fadSMehdi Amini
10149f926f70SMehdi Amini // Read all the records.
10159f926f70SMehdi Amini while (true) {
1016b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
1017b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1018b12a864cSDuncan P. N. Exon Smith return E;
10199f926f70SMehdi Amini
10209f926f70SMehdi Amini switch (Entry.Kind) {
10219f926f70SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already.
10229f926f70SMehdi Amini case BitstreamEntry::Error:
10239f926f70SMehdi Amini return error("Malformed block");
10249f926f70SMehdi Amini case BitstreamEntry::EndBlock:
102519ef4fadSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders);
1026e37d3144SAdrian Prantl upgradeDebugInfo();
10279f926f70SMehdi Amini return Error::success();
10289f926f70SMehdi Amini case BitstreamEntry::Record:
10299f926f70SMehdi Amini // The interesting case.
10309f926f70SMehdi Amini break;
10319f926f70SMehdi Amini }
10329f926f70SMehdi Amini
10339f926f70SMehdi Amini // Read a record.
10349f926f70SMehdi Amini Record.clear();
10359f926f70SMehdi Amini StringRef Blob;
103619ef4fadSMehdi Amini ++NumMDRecordLoaded;
10370e828958SJF Bastien if (Expected<unsigned> MaybeCode =
10380e828958SJF Bastien Stream.readRecord(Entry.ID, Record, &Blob)) {
10390e828958SJF Bastien if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
10400e828958SJF Bastien Blob, NextMetadataNo))
10419f926f70SMehdi Amini return Err;
10420e828958SJF Bastien } else
10430e828958SJF Bastien return MaybeCode.takeError();
10449f926f70SMehdi Amini }
10459f926f70SMehdi Amini }
10469f926f70SMehdi Amini
lazyLoadOneMDString(unsigned ID)104719ef4fadSMehdi Amini MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
104819ef4fadSMehdi Amini ++NumMDStringLoaded;
104919ef4fadSMehdi Amini if (Metadata *MD = MetadataList.lookup(ID))
105019ef4fadSMehdi Amini return cast<MDString>(MD);
105119ef4fadSMehdi Amini auto MDS = MDString::get(Context, MDStringRef[ID]);
105219ef4fadSMehdi Amini MetadataList.assignValue(MDS, ID);
105319ef4fadSMehdi Amini return MDS;
105419ef4fadSMehdi Amini }
105519ef4fadSMehdi Amini
lazyLoadOneMetadata(unsigned ID,PlaceholderQueue & Placeholders)105619ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
105719ef4fadSMehdi Amini unsigned ID, PlaceholderQueue &Placeholders) {
105819ef4fadSMehdi Amini assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
105919ef4fadSMehdi Amini assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
106019ef4fadSMehdi Amini // Lookup first if the metadata hasn't already been loaded.
106119ef4fadSMehdi Amini if (auto *MD = MetadataList.lookup(ID)) {
106287399997SSimon Pilgrim auto *N = cast<MDNode>(MD);
106367d2cc1fSMehdi Amini if (!N->isTemporary())
106467d2cc1fSMehdi Amini return;
106519ef4fadSMehdi Amini }
106619ef4fadSMehdi Amini SmallVector<uint64_t, 64> Record;
106719ef4fadSMehdi Amini StringRef Blob;
10680e828958SJF Bastien if (Error Err = IndexCursor.JumpToBit(
10690e828958SJF Bastien GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
10700e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed jumping: " +
107121661607SSimon Pilgrim Twine(toString(std::move(Err))));
1072b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
1073b12a864cSDuncan P. N. Exon Smith if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
10740e828958SJF Bastien // FIXME this drops the error on the floor.
10750e828958SJF Bastien report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
1076b12a864cSDuncan P. N. Exon Smith Twine(toString(std::move(E))));
107719ef4fadSMehdi Amini ++NumMDRecordLoaded;
10780e828958SJF Bastien if (Expected<unsigned> MaybeCode =
10790e828958SJF Bastien IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
10800e828958SJF Bastien if (Error Err =
10810e828958SJF Bastien parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
10820e828958SJF Bastien report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
108321661607SSimon Pilgrim Twine(toString(std::move(Err))));
10840e828958SJF Bastien } else
108521661607SSimon Pilgrim report_fatal_error("Can't lazyload MD: " +
108621661607SSimon Pilgrim Twine(toString(MaybeCode.takeError())));
108719ef4fadSMehdi Amini }
108819ef4fadSMehdi Amini
108919ef4fadSMehdi Amini /// Ensure that all forward-references and placeholders are resolved.
109019ef4fadSMehdi Amini /// Iteratively lazy-loading metadata on-demand if needed.
resolveForwardRefsAndPlaceholders(PlaceholderQueue & Placeholders)109119ef4fadSMehdi Amini void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
109219ef4fadSMehdi Amini PlaceholderQueue &Placeholders) {
109319ef4fadSMehdi Amini DenseSet<unsigned> Temporaries;
10942aed0813SKazu Hirata while (true) {
109519ef4fadSMehdi Amini // Populate Temporaries with the placeholders that haven't been loaded yet.
109619ef4fadSMehdi Amini Placeholders.getTemporaries(MetadataList, Temporaries);
109719ef4fadSMehdi Amini
109819ef4fadSMehdi Amini // If we don't have any temporary, or FwdReference, we're done!
109919ef4fadSMehdi Amini if (Temporaries.empty() && !MetadataList.hasFwdRefs())
110019ef4fadSMehdi Amini break;
110119ef4fadSMehdi Amini
110219ef4fadSMehdi Amini // First, load all the temporaries. This can add new placeholders or
110319ef4fadSMehdi Amini // forward references.
110419ef4fadSMehdi Amini for (auto ID : Temporaries)
110519ef4fadSMehdi Amini lazyLoadOneMetadata(ID, Placeholders);
110619ef4fadSMehdi Amini Temporaries.clear();
110719ef4fadSMehdi Amini
110819ef4fadSMehdi Amini // Second, load the forward-references. This can also add new placeholders
110919ef4fadSMehdi Amini // or forward references.
111019ef4fadSMehdi Amini while (MetadataList.hasFwdRefs())
111119ef4fadSMehdi Amini lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
111219ef4fadSMehdi Amini }
111319ef4fadSMehdi Amini // At this point we don't have any forward reference remaining, or temporary
111419ef4fadSMehdi Amini // that haven't been loaded. We can safely drop RAUW support and mark cycles
111519ef4fadSMehdi Amini // as resolved.
111619ef4fadSMehdi Amini MetadataList.tryToResolveCycles();
111719ef4fadSMehdi Amini
111819ef4fadSMehdi Amini // Finally, everything is in place, we can replace the placeholders operands
111919ef4fadSMehdi Amini // with the final node they refer to.
112019ef4fadSMehdi Amini Placeholders.flush(MetadataList);
112119ef4fadSMehdi Amini }
112219ef4fadSMehdi Amini
parseOneMetadata(SmallVectorImpl<uint64_t> & Record,unsigned Code,PlaceholderQueue & Placeholders,StringRef Blob,unsigned & NextMetadataNo)11239f926f70SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
11249f926f70SMehdi Amini SmallVectorImpl<uint64_t> &Record, unsigned Code,
112519ef4fadSMehdi Amini PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
11269f926f70SMehdi Amini
11279f926f70SMehdi Amini bool IsDistinct = false;
1128ef27db87SMehdi Amini auto getMD = [&](unsigned ID) -> Metadata * {
112919ef4fadSMehdi Amini if (ID < MDStringRef.size())
113019ef4fadSMehdi Amini return lazyLoadOneMDString(ID);
113167d2cc1fSMehdi Amini if (!IsDistinct) {
113267d2cc1fSMehdi Amini if (auto *MD = MetadataList.lookup(ID))
113367d2cc1fSMehdi Amini return MD;
113467d2cc1fSMehdi Amini // If lazy-loading is enabled, we try recursively to load the operand
113567d2cc1fSMehdi Amini // instead of creating a temporary.
113667d2cc1fSMehdi Amini if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
113767d2cc1fSMehdi Amini // Create a temporary for the node that is referencing the operand we
113867d2cc1fSMehdi Amini // will lazy-load. It is needed before recursing in case there are
113967d2cc1fSMehdi Amini // uniquing cycles.
114067d2cc1fSMehdi Amini MetadataList.getMetadataFwdRef(NextMetadataNo);
114167d2cc1fSMehdi Amini lazyLoadOneMetadata(ID, Placeholders);
114267d2cc1fSMehdi Amini return MetadataList.lookup(ID);
114367d2cc1fSMehdi Amini }
114467d2cc1fSMehdi Amini // Return a temporary.
1145ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID);
114667d2cc1fSMehdi Amini }
1147ef27db87SMehdi Amini if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1148ef27db87SMehdi Amini return MD;
1149ef27db87SMehdi Amini return &Placeholders.getPlaceholderOp(ID);
1150ef27db87SMehdi Amini };
1151ef27db87SMehdi Amini auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1152ef27db87SMehdi Amini if (ID)
1153ef27db87SMehdi Amini return getMD(ID - 1);
1154ef27db87SMehdi Amini return nullptr;
1155ef27db87SMehdi Amini };
1156ef27db87SMehdi Amini auto getMDOrNullWithoutPlaceholders = [&](unsigned ID) -> Metadata * {
1157ef27db87SMehdi Amini if (ID)
1158ef27db87SMehdi Amini return MetadataList.getMetadataFwdRef(ID - 1);
1159ef27db87SMehdi Amini return nullptr;
1160ef27db87SMehdi Amini };
1161ef27db87SMehdi Amini auto getMDString = [&](unsigned ID) -> MDString * {
1162ef27db87SMehdi Amini // This requires that the ID is not really a forward reference. In
1163ef27db87SMehdi Amini // particular, the MDString must already have been resolved.
116419ef4fadSMehdi Amini auto MDS = getMDOrNull(ID);
116519ef4fadSMehdi Amini return cast_or_null<MDString>(MDS);
1166ef27db87SMehdi Amini };
1167ef27db87SMehdi Amini
1168ef27db87SMehdi Amini // Support for old type refs.
1169ef27db87SMehdi Amini auto getDITypeRefOrNull = [&](unsigned ID) {
1170ef27db87SMehdi Amini return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1171ef27db87SMehdi Amini };
1172ef27db87SMehdi Amini
1173ef27db87SMehdi Amini #define GET_OR_DISTINCT(CLASS, ARGS) \
1174ef27db87SMehdi Amini (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1175ef27db87SMehdi Amini
1176ef27db87SMehdi Amini switch (Code) {
1177ef27db87SMehdi Amini default: // Default behavior: ignore.
1178ef27db87SMehdi Amini break;
1179ef27db87SMehdi Amini case bitc::METADATA_NAME: {
1180ef27db87SMehdi Amini // Read name of the named metadata.
1181ef27db87SMehdi Amini SmallString<8> Name(Record.begin(), Record.end());
1182ef27db87SMehdi Amini Record.clear();
1183b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.ReadCode().moveInto(Code))
1184b12a864cSDuncan P. N. Exon Smith return E;
1185ef27db87SMehdi Amini
118619ef4fadSMehdi Amini ++NumMDRecordLoaded;
11870e828958SJF Bastien if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
11880e828958SJF Bastien if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1189ef27db87SMehdi Amini return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
11900e828958SJF Bastien } else
11910e828958SJF Bastien return MaybeNextBitCode.takeError();
1192ef27db87SMehdi Amini
1193ef27db87SMehdi Amini // Read named metadata elements.
1194ef27db87SMehdi Amini unsigned Size = Record.size();
1195ef27db87SMehdi Amini NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1196ef27db87SMehdi Amini for (unsigned i = 0; i != Size; ++i) {
1197ef27db87SMehdi Amini MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1198ef27db87SMehdi Amini if (!MD)
1199f3d2453dSTeresa Johnson return error("Invalid named metadata: expect fwd ref to MDNode");
1200ef27db87SMehdi Amini NMD->addOperand(MD);
1201ef27db87SMehdi Amini }
1202ef27db87SMehdi Amini break;
1203ef27db87SMehdi Amini }
1204ef27db87SMehdi Amini case bitc::METADATA_OLD_FN_NODE: {
12054abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files.
1206ef27db87SMehdi Amini // This is a LocalAsMetadata record, the only type of function-local
1207ef27db87SMehdi Amini // metadata.
1208ef27db87SMehdi Amini if (Record.size() % 2 == 1)
1209ef27db87SMehdi Amini return error("Invalid record");
1210ef27db87SMehdi Amini
1211ef27db87SMehdi Amini // If this isn't a LocalAsMetadata record, we're dropping it. This used
1212ef27db87SMehdi Amini // to be legal, but there's no upgrade path.
1213ef27db87SMehdi Amini auto dropRecord = [&] {
1214c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, None), NextMetadataNo);
1215c05c9db3SIvan Krasin NextMetadataNo++;
1216ef27db87SMehdi Amini };
1217ef27db87SMehdi Amini if (Record.size() != 2) {
1218ef27db87SMehdi Amini dropRecord();
1219ef27db87SMehdi Amini break;
1220ef27db87SMehdi Amini }
1221ef27db87SMehdi Amini
1222b6eafba2SNikita Popov unsigned TyID = Record[0];
1223b6eafba2SNikita Popov Type *Ty = getTypeByID(TyID);
1224ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy()) {
1225ef27db87SMehdi Amini dropRecord();
1226ef27db87SMehdi Amini break;
1227ef27db87SMehdi Amini }
1228ef27db87SMehdi Amini
1229*159feac1SNikita Popov Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
1230*159feac1SNikita Popov /*ConstExprInsertBB*/ nullptr);
1231*159feac1SNikita Popov if (!V)
1232*159feac1SNikita Popov return error("Invalid value reference from old fn metadata");
1233*159feac1SNikita Popov
1234*159feac1SNikita Popov MetadataList.assignValue(LocalAsMetadata::get(V), NextMetadataNo);
1235c05c9db3SIvan Krasin NextMetadataNo++;
1236ef27db87SMehdi Amini break;
1237ef27db87SMehdi Amini }
1238ef27db87SMehdi Amini case bitc::METADATA_OLD_NODE: {
12394abf0243SMehdi Amini // Deprecated, but still needed to read old bitcode files.
1240ef27db87SMehdi Amini if (Record.size() % 2 == 1)
1241ef27db87SMehdi Amini return error("Invalid record");
1242ef27db87SMehdi Amini
1243ef27db87SMehdi Amini unsigned Size = Record.size();
1244ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts;
1245ef27db87SMehdi Amini for (unsigned i = 0; i != Size; i += 2) {
1246b6eafba2SNikita Popov unsigned TyID = Record[i];
1247b6eafba2SNikita Popov Type *Ty = getTypeByID(TyID);
1248ef27db87SMehdi Amini if (!Ty)
1249ef27db87SMehdi Amini return error("Invalid record");
1250ef27db87SMehdi Amini if (Ty->isMetadataTy())
1251ef27db87SMehdi Amini Elts.push_back(getMD(Record[i + 1]));
1252ef27db87SMehdi Amini else if (!Ty->isVoidTy()) {
1253*159feac1SNikita Popov Value *V = ValueList.getValueFwdRef(Record[i + 1], Ty, TyID,
1254*159feac1SNikita Popov /*ConstExprInsertBB*/ nullptr);
1255*159feac1SNikita Popov if (!V)
1256*159feac1SNikita Popov return error("Invalid value reference from old metadata");
1257*159feac1SNikita Popov auto *MD = ValueAsMetadata::get(V);
1258ef27db87SMehdi Amini assert(isa<ConstantAsMetadata>(MD) &&
1259ef27db87SMehdi Amini "Expected non-function-local metadata");
1260ef27db87SMehdi Amini Elts.push_back(MD);
1261ef27db87SMehdi Amini } else
1262ef27db87SMehdi Amini Elts.push_back(nullptr);
1263ef27db87SMehdi Amini }
1264c05c9db3SIvan Krasin MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1265c05c9db3SIvan Krasin NextMetadataNo++;
1266ef27db87SMehdi Amini break;
1267ef27db87SMehdi Amini }
1268ef27db87SMehdi Amini case bitc::METADATA_VALUE: {
1269ef27db87SMehdi Amini if (Record.size() != 2)
1270ef27db87SMehdi Amini return error("Invalid record");
1271ef27db87SMehdi Amini
1272b6eafba2SNikita Popov unsigned TyID = Record[0];
1273b6eafba2SNikita Popov Type *Ty = getTypeByID(TyID);
1274ef27db87SMehdi Amini if (Ty->isMetadataTy() || Ty->isVoidTy())
1275ef27db87SMehdi Amini return error("Invalid record");
1276ef27db87SMehdi Amini
1277*159feac1SNikita Popov Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
1278*159feac1SNikita Popov /*ConstExprInsertBB*/ nullptr);
1279*159feac1SNikita Popov if (!V)
1280*159feac1SNikita Popov return error("Invalid value reference from metadata");
1281*159feac1SNikita Popov
1282*159feac1SNikita Popov MetadataList.assignValue(ValueAsMetadata::get(V), NextMetadataNo);
1283c05c9db3SIvan Krasin NextMetadataNo++;
1284ef27db87SMehdi Amini break;
1285ef27db87SMehdi Amini }
1286ef27db87SMehdi Amini case bitc::METADATA_DISTINCT_NODE:
1287ef27db87SMehdi Amini IsDistinct = true;
1288ef27db87SMehdi Amini LLVM_FALLTHROUGH;
1289ef27db87SMehdi Amini case bitc::METADATA_NODE: {
1290ef27db87SMehdi Amini SmallVector<Metadata *, 8> Elts;
1291ef27db87SMehdi Amini Elts.reserve(Record.size());
1292ef27db87SMehdi Amini for (unsigned ID : Record)
1293ef27db87SMehdi Amini Elts.push_back(getMDOrNull(ID));
1294ef27db87SMehdi Amini MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1295ef27db87SMehdi Amini : MDNode::get(Context, Elts),
1296c05c9db3SIvan Krasin NextMetadataNo);
1297c05c9db3SIvan Krasin NextMetadataNo++;
1298ef27db87SMehdi Amini break;
1299ef27db87SMehdi Amini }
1300ef27db87SMehdi Amini case bitc::METADATA_LOCATION: {
1301386ad01cSVedant Kumar if (Record.size() != 5 && Record.size() != 6)
1302ef27db87SMehdi Amini return error("Invalid record");
1303ef27db87SMehdi Amini
1304ef27db87SMehdi Amini IsDistinct = Record[0];
1305ef27db87SMehdi Amini unsigned Line = Record[1];
1306ef27db87SMehdi Amini unsigned Column = Record[2];
1307ef27db87SMehdi Amini Metadata *Scope = getMD(Record[3]);
1308ef27db87SMehdi Amini Metadata *InlinedAt = getMDOrNull(Record[4]);
1309386ad01cSVedant Kumar bool ImplicitCode = Record.size() == 6 && Record[5];
1310ef27db87SMehdi Amini MetadataList.assignValue(
1311eb7f6020SCalixte Denizet GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1312eb7f6020SCalixte Denizet ImplicitCode)),
1313c05c9db3SIvan Krasin NextMetadataNo);
1314c05c9db3SIvan Krasin NextMetadataNo++;
1315ef27db87SMehdi Amini break;
1316ef27db87SMehdi Amini }
1317ef27db87SMehdi Amini case bitc::METADATA_GENERIC_DEBUG: {
1318ef27db87SMehdi Amini if (Record.size() < 4)
1319ef27db87SMehdi Amini return error("Invalid record");
1320ef27db87SMehdi Amini
1321ef27db87SMehdi Amini IsDistinct = Record[0];
1322ef27db87SMehdi Amini unsigned Tag = Record[1];
1323ef27db87SMehdi Amini unsigned Version = Record[2];
1324ef27db87SMehdi Amini
1325ef27db87SMehdi Amini if (Tag >= 1u << 16 || Version != 0)
1326ef27db87SMehdi Amini return error("Invalid record");
1327ef27db87SMehdi Amini
1328ef27db87SMehdi Amini auto *Header = getMDString(Record[3]);
1329ef27db87SMehdi Amini SmallVector<Metadata *, 8> DwarfOps;
1330ef27db87SMehdi Amini for (unsigned I = 4, E = Record.size(); I != E; ++I)
1331ef27db87SMehdi Amini DwarfOps.push_back(getMDOrNull(Record[I]));
1332ef27db87SMehdi Amini MetadataList.assignValue(
1333ef27db87SMehdi Amini GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1334c05c9db3SIvan Krasin NextMetadataNo);
1335c05c9db3SIvan Krasin NextMetadataNo++;
1336ef27db87SMehdi Amini break;
1337ef27db87SMehdi Amini }
1338ef27db87SMehdi Amini case bitc::METADATA_SUBRANGE: {
1339fdf40917SSander de Smalen Metadata *Val = nullptr;
1340fdf40917SSander de Smalen // Operand 'count' is interpreted as:
1341fdf40917SSander de Smalen // - Signed integer (version 0)
1342fdf40917SSander de Smalen // - Metadata node (version 1)
1343d20bf5a7SAlok Kumar Sharma // Operand 'lowerBound' is interpreted as:
1344d20bf5a7SAlok Kumar Sharma // - Signed integer (version 0 and 1)
1345d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2)
1346d20bf5a7SAlok Kumar Sharma // Operands 'upperBound' and 'stride' are interpreted as:
1347d20bf5a7SAlok Kumar Sharma // - Metadata node (version 2)
1348fdf40917SSander de Smalen switch (Record[0] >> 1) {
1349fdf40917SSander de Smalen case 0:
1350fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange,
1351d20bf5a7SAlok Kumar Sharma (Context, Record[1], unrotateSign(Record[2])));
1352fdf40917SSander de Smalen break;
1353fdf40917SSander de Smalen case 1:
1354fdf40917SSander de Smalen Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1355d20bf5a7SAlok Kumar Sharma unrotateSign(Record[2])));
1356d20bf5a7SAlok Kumar Sharma break;
1357d20bf5a7SAlok Kumar Sharma case 2:
1358d20bf5a7SAlok Kumar Sharma Val = GET_OR_DISTINCT(
1359d20bf5a7SAlok Kumar Sharma DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1360d20bf5a7SAlok Kumar Sharma getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1361fdf40917SSander de Smalen break;
1362fdf40917SSander de Smalen default:
1363fdf40917SSander de Smalen return error("Invalid record: Unsupported version of DISubrange");
1364fdf40917SSander de Smalen }
1365ef27db87SMehdi Amini
1366fdf40917SSander de Smalen MetadataList.assignValue(Val, NextMetadataNo);
1367fdf40917SSander de Smalen IsDistinct = Record[0] & 1;
1368c05c9db3SIvan Krasin NextMetadataNo++;
1369ef27db87SMehdi Amini break;
1370ef27db87SMehdi Amini }
1371a6dd01afSAlok Kumar Sharma case bitc::METADATA_GENERIC_SUBRANGE: {
1372a6dd01afSAlok Kumar Sharma Metadata *Val = nullptr;
1373a6dd01afSAlok Kumar Sharma Val = GET_OR_DISTINCT(DIGenericSubrange,
1374a6dd01afSAlok Kumar Sharma (Context, getMDOrNull(Record[1]),
1375a6dd01afSAlok Kumar Sharma getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1376a6dd01afSAlok Kumar Sharma getMDOrNull(Record[4])));
1377a6dd01afSAlok Kumar Sharma
1378a6dd01afSAlok Kumar Sharma MetadataList.assignValue(Val, NextMetadataNo);
1379a6dd01afSAlok Kumar Sharma IsDistinct = Record[0] & 1;
1380a6dd01afSAlok Kumar Sharma NextMetadataNo++;
1381a6dd01afSAlok Kumar Sharma break;
1382a6dd01afSAlok Kumar Sharma }
1383ef27db87SMehdi Amini case bitc::METADATA_ENUMERATOR: {
1384aad3d578SLemonBoy if (Record.size() < 3)
1385ef27db87SMehdi Amini return error("Invalid record");
1386ef27db87SMehdi Amini
138708dc66efSMomchil Velikov IsDistinct = Record[0] & 1;
138808dc66efSMomchil Velikov bool IsUnsigned = Record[0] & 2;
1389aad3d578SLemonBoy bool IsBigInt = Record[0] & 4;
1390aad3d578SLemonBoy APInt Value;
1391aad3d578SLemonBoy
1392aad3d578SLemonBoy if (IsBigInt) {
1393aad3d578SLemonBoy const uint64_t BitWidth = Record[1];
1394aad3d578SLemonBoy const size_t NumWords = Record.size() - 3;
1395aad3d578SLemonBoy Value = readWideAPInt(makeArrayRef(&Record[3], NumWords), BitWidth);
1396aad3d578SLemonBoy } else
1397aad3d578SLemonBoy Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1398aad3d578SLemonBoy
1399ef27db87SMehdi Amini MetadataList.assignValue(
1400aad3d578SLemonBoy GET_OR_DISTINCT(DIEnumerator,
1401aad3d578SLemonBoy (Context, Value, IsUnsigned, getMDString(Record[2]))),
1402c05c9db3SIvan Krasin NextMetadataNo);
1403c05c9db3SIvan Krasin NextMetadataNo++;
1404ef27db87SMehdi Amini break;
1405ef27db87SMehdi Amini }
1406ef27db87SMehdi Amini case bitc::METADATA_BASIC_TYPE: {
140755f42629SAdrian Prantl if (Record.size() < 6 || Record.size() > 7)
1408ef27db87SMehdi Amini return error("Invalid record");
1409ef27db87SMehdi Amini
1410ef27db87SMehdi Amini IsDistinct = Record[0];
1411665b4138SLuís Ferreira DINode::DIFlags Flags = (Record.size() > 6)
1412665b4138SLuís Ferreira ? static_cast<DINode::DIFlags>(Record[6])
1413665b4138SLuís Ferreira : DINode::FlagZero;
141455f42629SAdrian Prantl
1415ef27db87SMehdi Amini MetadataList.assignValue(
1416ef27db87SMehdi Amini GET_OR_DISTINCT(DIBasicType,
14179f926f70SMehdi Amini (Context, Record[1], getMDString(Record[2]), Record[3],
141855f42629SAdrian Prantl Record[4], Record[5], Flags)),
1419c05c9db3SIvan Krasin NextMetadataNo);
1420c05c9db3SIvan Krasin NextMetadataNo++;
1421ef27db87SMehdi Amini break;
1422ef27db87SMehdi Amini }
1423f91d18eaSSourabh Singh Tomar case bitc::METADATA_STRING_TYPE: {
142428bfa57aSChih-Ping Chen if (Record.size() > 9 || Record.size() < 8)
1425f91d18eaSSourabh Singh Tomar return error("Invalid record");
1426f91d18eaSSourabh Singh Tomar
1427f91d18eaSSourabh Singh Tomar IsDistinct = Record[0];
142828bfa57aSChih-Ping Chen bool SizeIs8 = Record.size() == 8;
142928bfa57aSChih-Ping Chen // StringLocationExp (i.e. Record[5]) is added at a later time
143028bfa57aSChih-Ping Chen // than the other fields. The code here enables backward compatibility.
143128bfa57aSChih-Ping Chen Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
143228bfa57aSChih-Ping Chen unsigned Offset = SizeIs8 ? 5 : 6;
1433f91d18eaSSourabh Singh Tomar MetadataList.assignValue(
1434f91d18eaSSourabh Singh Tomar GET_OR_DISTINCT(DIStringType,
1435f91d18eaSSourabh Singh Tomar (Context, Record[1], getMDString(Record[2]),
1436f91d18eaSSourabh Singh Tomar getMDOrNull(Record[3]), getMDOrNull(Record[4]),
143728bfa57aSChih-Ping Chen StringLocationExp, Record[Offset], Record[Offset + 1],
143828bfa57aSChih-Ping Chen Record[Offset + 2])),
1439f91d18eaSSourabh Singh Tomar NextMetadataNo);
1440f91d18eaSSourabh Singh Tomar NextMetadataNo++;
1441f91d18eaSSourabh Singh Tomar break;
1442f91d18eaSSourabh Singh Tomar }
1443ef27db87SMehdi Amini case bitc::METADATA_DERIVED_TYPE: {
1444430e2238SYonghong Song if (Record.size() < 12 || Record.size() > 14)
1445ef27db87SMehdi Amini return error("Invalid record");
1446ef27db87SMehdi Amini
1447d5561e0aSKonstantin Zhuravlyov // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1448d5561e0aSKonstantin Zhuravlyov // that there is no DWARF address space associated with DIDerivedType.
1449d5561e0aSKonstantin Zhuravlyov Optional<unsigned> DWARFAddressSpace;
1450d5561e0aSKonstantin Zhuravlyov if (Record.size() > 12 && Record[12])
1451d5561e0aSKonstantin Zhuravlyov DWARFAddressSpace = Record[12] - 1;
1452d5561e0aSKonstantin Zhuravlyov
1453430e2238SYonghong Song Metadata *Annotations = nullptr;
1454430e2238SYonghong Song if (Record.size() > 13 && Record[13])
1455430e2238SYonghong Song Annotations = getMDOrNull(Record[13]);
1456430e2238SYonghong Song
1457ef27db87SMehdi Amini IsDistinct = Record[0];
1458ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1459ef27db87SMehdi Amini MetadataList.assignValue(
1460ef27db87SMehdi Amini GET_OR_DISTINCT(DIDerivedType,
1461ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]),
1462ef27db87SMehdi Amini getMDOrNull(Record[3]), Record[4],
1463ef27db87SMehdi Amini getDITypeRefOrNull(Record[5]),
1464ef27db87SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1465d5561e0aSKonstantin Zhuravlyov Record[9], DWARFAddressSpace, Flags,
1466430e2238SYonghong Song getDITypeRefOrNull(Record[11]), Annotations)),
1467c05c9db3SIvan Krasin NextMetadataNo);
1468c05c9db3SIvan Krasin NextMetadataNo++;
1469ef27db87SMehdi Amini break;
1470ef27db87SMehdi Amini }
1471ef27db87SMehdi Amini case bitc::METADATA_COMPOSITE_TYPE: {
14720b32dca1SYonghong Song if (Record.size() < 16 || Record.size() > 22)
1473ef27db87SMehdi Amini return error("Invalid record");
1474ef27db87SMehdi Amini
1475ef27db87SMehdi Amini // If we have a UUID and this is not a forward declaration, lookup the
1476ef27db87SMehdi Amini // mapping.
1477ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1;
1478ef27db87SMehdi Amini bool IsNotUsedInTypeRef = Record[0] >= 2;
1479ef27db87SMehdi Amini unsigned Tag = Record[1];
1480ef27db87SMehdi Amini MDString *Name = getMDString(Record[2]);
1481ef27db87SMehdi Amini Metadata *File = getMDOrNull(Record[3]);
1482ef27db87SMehdi Amini unsigned Line = Record[4];
1483ef27db87SMehdi Amini Metadata *Scope = getDITypeRefOrNull(Record[5]);
1484a61f5e37STeresa Johnson Metadata *BaseType = nullptr;
1485ef27db87SMehdi Amini uint64_t SizeInBits = Record[7];
1486ef27db87SMehdi Amini if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1487ef27db87SMehdi Amini return error("Alignment value is too large");
1488ef27db87SMehdi Amini uint32_t AlignInBits = Record[8];
1489a61f5e37STeresa Johnson uint64_t OffsetInBits = 0;
1490ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1491a61f5e37STeresa Johnson Metadata *Elements = nullptr;
1492ef27db87SMehdi Amini unsigned RuntimeLang = Record[12];
1493a61f5e37STeresa Johnson Metadata *VTableHolder = nullptr;
1494a61f5e37STeresa Johnson Metadata *TemplateParams = nullptr;
14958c59921cSAdrian Prantl Metadata *Discriminator = nullptr;
14964042ada1SAlok Kumar Sharma Metadata *DataLocation = nullptr;
14972d10258aSAlok Kumar Sharma Metadata *Associated = nullptr;
14982d10258aSAlok Kumar Sharma Metadata *Allocated = nullptr;
149996bd4d34SAlok Kumar Sharma Metadata *Rank = nullptr;
15000b32dca1SYonghong Song Metadata *Annotations = nullptr;
1501ef27db87SMehdi Amini auto *Identifier = getMDString(Record[15]);
1502a61f5e37STeresa Johnson // If this module is being parsed so that it can be ThinLTO imported
1503a61f5e37STeresa Johnson // into another module, composite types only need to be imported
1504a61f5e37STeresa Johnson // as type declarations (unless full type definitions requested).
1505a61f5e37STeresa Johnson // Create type declarations up front to save memory. Also, buildODRType
1506a61f5e37STeresa Johnson // handles the case where this is type ODRed with a definition needed
1507a61f5e37STeresa Johnson // by the importing module, in which case the existing definition is
1508a61f5e37STeresa Johnson // used.
15095a8dba5bSTeresa Johnson if (IsImporting && !ImportFullTypeDefinitions && Identifier &&
1510a61f5e37STeresa Johnson (Tag == dwarf::DW_TAG_enumeration_type ||
1511a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_class_type ||
1512a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_structure_type ||
1513a61f5e37STeresa Johnson Tag == dwarf::DW_TAG_union_type)) {
1514a61f5e37STeresa Johnson Flags = Flags | DINode::FlagFwdDecl;
15156302a914SDavid Blaikie if (Name) {
15166302a914SDavid Blaikie // This is a hack around preserving template parameters for simplified
15176302a914SDavid Blaikie // template names - it should probably be replaced with a
15186302a914SDavid Blaikie // DICompositeType flag specifying whether template parameters are
15196302a914SDavid Blaikie // required on declarations of this type.
15206302a914SDavid Blaikie StringRef NameStr = Name->getString();
15216b306233SDavid Blaikie if (!NameStr.contains('<') || NameStr.startswith("_STN|"))
15226302a914SDavid Blaikie TemplateParams = getMDOrNull(Record[14]);
15236302a914SDavid Blaikie }
1524a61f5e37STeresa Johnson } else {
1525a61f5e37STeresa Johnson BaseType = getDITypeRefOrNull(Record[6]);
1526a61f5e37STeresa Johnson OffsetInBits = Record[9];
1527a61f5e37STeresa Johnson Elements = getMDOrNull(Record[11]);
1528a61f5e37STeresa Johnson VTableHolder = getDITypeRefOrNull(Record[13]);
1529a61f5e37STeresa Johnson TemplateParams = getMDOrNull(Record[14]);
15308c59921cSAdrian Prantl if (Record.size() > 16)
15318c59921cSAdrian Prantl Discriminator = getMDOrNull(Record[16]);
15324042ada1SAlok Kumar Sharma if (Record.size() > 17)
15334042ada1SAlok Kumar Sharma DataLocation = getMDOrNull(Record[17]);
15342d10258aSAlok Kumar Sharma if (Record.size() > 19) {
15352d10258aSAlok Kumar Sharma Associated = getMDOrNull(Record[18]);
15362d10258aSAlok Kumar Sharma Allocated = getMDOrNull(Record[19]);
15372d10258aSAlok Kumar Sharma }
153896bd4d34SAlok Kumar Sharma if (Record.size() > 20) {
153996bd4d34SAlok Kumar Sharma Rank = getMDOrNull(Record[20]);
154096bd4d34SAlok Kumar Sharma }
15410b32dca1SYonghong Song if (Record.size() > 21) {
15420b32dca1SYonghong Song Annotations = getMDOrNull(Record[21]);
15430b32dca1SYonghong Song }
1544a61f5e37STeresa Johnson }
1545ef27db87SMehdi Amini DICompositeType *CT = nullptr;
1546ef27db87SMehdi Amini if (Identifier)
1547ef27db87SMehdi Amini CT = DICompositeType::buildODRType(
1548ef27db87SMehdi Amini Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1549ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
15502d10258aSAlok Kumar Sharma VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
15510b32dca1SYonghong Song Allocated, Rank, Annotations);
1552ef27db87SMehdi Amini
1553ef27db87SMehdi Amini // Create a node if we didn't get a lazy ODR type.
1554ef27db87SMehdi Amini if (!CT)
1555ef27db87SMehdi Amini CT = GET_OR_DISTINCT(DICompositeType,
1556ef27db87SMehdi Amini (Context, Tag, Name, File, Line, Scope, BaseType,
1557ef27db87SMehdi Amini SizeInBits, AlignInBits, OffsetInBits, Flags,
15589f926f70SMehdi Amini Elements, RuntimeLang, VTableHolder, TemplateParams,
15592d10258aSAlok Kumar Sharma Identifier, Discriminator, DataLocation, Associated,
15600b32dca1SYonghong Song Allocated, Rank, Annotations));
1561ef27db87SMehdi Amini if (!IsNotUsedInTypeRef && Identifier)
1562ef27db87SMehdi Amini MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1563ef27db87SMehdi Amini
1564c05c9db3SIvan Krasin MetadataList.assignValue(CT, NextMetadataNo);
1565c05c9db3SIvan Krasin NextMetadataNo++;
1566ef27db87SMehdi Amini break;
1567ef27db87SMehdi Amini }
1568ef27db87SMehdi Amini case bitc::METADATA_SUBROUTINE_TYPE: {
1569ef27db87SMehdi Amini if (Record.size() < 3 || Record.size() > 4)
1570ef27db87SMehdi Amini return error("Invalid record");
1571ef27db87SMehdi Amini bool IsOldTypeRefArray = Record[0] < 2;
1572ef27db87SMehdi Amini unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1573ef27db87SMehdi Amini
1574ef27db87SMehdi Amini IsDistinct = Record[0] & 0x1;
1575ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1576ef27db87SMehdi Amini Metadata *Types = getMDOrNull(Record[2]);
1577ef27db87SMehdi Amini if (LLVM_UNLIKELY(IsOldTypeRefArray))
1578ef27db87SMehdi Amini Types = MetadataList.upgradeTypeRefArray(Types);
1579ef27db87SMehdi Amini
1580ef27db87SMehdi Amini MetadataList.assignValue(
1581ef27db87SMehdi Amini GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1582c05c9db3SIvan Krasin NextMetadataNo);
1583c05c9db3SIvan Krasin NextMetadataNo++;
1584ef27db87SMehdi Amini break;
1585ef27db87SMehdi Amini }
1586ef27db87SMehdi Amini
1587ef27db87SMehdi Amini case bitc::METADATA_MODULE: {
15885f75dcf5SChih-Ping Chen if (Record.size() < 5 || Record.size() > 9)
1589ef27db87SMehdi Amini return error("Invalid record");
1590ef27db87SMehdi Amini
15915f75dcf5SChih-Ping Chen unsigned Offset = Record.size() >= 8 ? 2 : 1;
1592ef27db87SMehdi Amini IsDistinct = Record[0];
1593ef27db87SMehdi Amini MetadataList.assignValue(
1594e59744fdSSourabh Singh Tomar GET_OR_DISTINCT(
1595e59744fdSSourabh Singh Tomar DIModule,
15965f75dcf5SChih-Ping Chen (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
1597e59744fdSSourabh Singh Tomar getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1598e59744fdSSourabh Singh Tomar getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1599e59744fdSSourabh Singh Tomar getMDString(Record[4 + Offset]),
16005f75dcf5SChih-Ping Chen Record.size() <= 7 ? 0 : Record[7],
16015f75dcf5SChih-Ping Chen Record.size() <= 8 ? false : Record[8])),
1602c05c9db3SIvan Krasin NextMetadataNo);
1603c05c9db3SIvan Krasin NextMetadataNo++;
1604ef27db87SMehdi Amini break;
1605ef27db87SMehdi Amini }
1606ef27db87SMehdi Amini
1607ef27db87SMehdi Amini case bitc::METADATA_FILE: {
160816c7bdafSScott Linder if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1609ef27db87SMehdi Amini return error("Invalid record");
1610ef27db87SMehdi Amini
1611ef27db87SMehdi Amini IsDistinct = Record[0];
16127160384dSScott Linder Optional<DIFile::ChecksumInfo<MDString *>> Checksum;
16137160384dSScott Linder // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
16147160384dSScott Linder // is not present. This matches up with the old internal representation,
16157160384dSScott Linder // and the old encoding for CSK_None in the ChecksumKind. The new
16167160384dSScott Linder // representation reserves the value 0 in the ChecksumKind to continue to
16177160384dSScott Linder // encode None in a backwards-compatible way.
161816c7bdafSScott Linder if (Record.size() > 4 && Record[3] && Record[4])
16197160384dSScott Linder Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
16207160384dSScott Linder getMDString(Record[4]));
1621ef27db87SMehdi Amini MetadataList.assignValue(
16229f926f70SMehdi Amini GET_OR_DISTINCT(
16237faeecc8SAmjad Aboud DIFile,
162416c7bdafSScott Linder (Context, getMDString(Record[1]), getMDString(Record[2]), Checksum,
162516c7bdafSScott Linder Record.size() > 5 ? Optional<MDString *>(getMDString(Record[5]))
162616c7bdafSScott Linder : None)),
1627c05c9db3SIvan Krasin NextMetadataNo);
1628c05c9db3SIvan Krasin NextMetadataNo++;
1629ef27db87SMehdi Amini break;
1630ef27db87SMehdi Amini }
1631ef27db87SMehdi Amini case bitc::METADATA_COMPILE_UNIT: {
1632e4e7e447SAdrian Prantl if (Record.size() < 14 || Record.size() > 22)
1633ef27db87SMehdi Amini return error("Invalid record");
1634ef27db87SMehdi Amini
1635ef27db87SMehdi Amini // Ignore Record[0], which indicates whether this compile unit is
1636ef27db87SMehdi Amini // distinct. It's always distinct.
1637ef27db87SMehdi Amini IsDistinct = true;
1638ef27db87SMehdi Amini auto *CU = DICompileUnit::getDistinct(
1639ef27db87SMehdi Amini Context, Record[1], getMDOrNull(Record[2]), getMDString(Record[3]),
1640ef27db87SMehdi Amini Record[4], getMDString(Record[5]), Record[6], getMDString(Record[7]),
1641ef27db87SMehdi Amini Record[8], getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1642ef27db87SMehdi Amini getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1643ef27db87SMehdi Amini Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1644ef27db87SMehdi Amini Record.size() <= 14 ? 0 : Record[14],
16450944a8c2SDehao Chen Record.size() <= 16 ? true : Record[16],
1646b52e2366SPeter Collingbourne Record.size() <= 17 ? false : Record[17],
1647bb279116SDavid Blaikie Record.size() <= 18 ? 0 : Record[18],
16482aed0813SKazu Hirata Record.size() <= 19 ? false : Record[19],
1649e4e7e447SAdrian Prantl Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1650e4e7e447SAdrian Prantl Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1651ef27db87SMehdi Amini
1652c05c9db3SIvan Krasin MetadataList.assignValue(CU, NextMetadataNo);
1653c05c9db3SIvan Krasin NextMetadataNo++;
1654ef27db87SMehdi Amini
1655ef27db87SMehdi Amini // Move the Upgrade the list of subprograms.
1656ef27db87SMehdi Amini if (Metadata *SPs = getMDOrNullWithoutPlaceholders(Record[11]))
1657ef27db87SMehdi Amini CUSubprograms.push_back({CU, SPs});
1658ef27db87SMehdi Amini break;
1659ef27db87SMehdi Amini }
1660ef27db87SMehdi Amini case bitc::METADATA_SUBPROGRAM: {
16611d12b885SAdrian Prantl if (Record.size() < 18 || Record.size() > 21)
1662ef27db87SMehdi Amini return error("Invalid record");
1663ef27db87SMehdi Amini
1664adcdc1bdSPaul Robinson bool HasSPFlags = Record[0] & 4;
166538a61873SPetar Jovanovic
166638a61873SPetar Jovanovic DINode::DIFlags Flags;
166738a61873SPetar Jovanovic DISubprogram::DISPFlags SPFlags;
166838a61873SPetar Jovanovic if (!HasSPFlags)
166938a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
167038a61873SPetar Jovanovic else {
167138a61873SPetar Jovanovic Flags = static_cast<DINode::DIFlags>(Record[11]);
167238a61873SPetar Jovanovic SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
167338a61873SPetar Jovanovic }
167438a61873SPetar Jovanovic
167538a61873SPetar Jovanovic // Support for old metadata when
167638a61873SPetar Jovanovic // subprogram specific flags are placed in DIFlags.
167738a61873SPetar Jovanovic const unsigned DIFlagMainSubprogram = 1 << 21;
167838a61873SPetar Jovanovic bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
167938a61873SPetar Jovanovic if (HasOldMainSubprogramFlag)
168038a61873SPetar Jovanovic // Remove old DIFlagMainSubprogram from DIFlags.
168138a61873SPetar Jovanovic // Note: This assumes that any future use of bit 21 defaults to it
168238a61873SPetar Jovanovic // being 0.
168338a61873SPetar Jovanovic Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
168438a61873SPetar Jovanovic
168538a61873SPetar Jovanovic if (HasOldMainSubprogramFlag && HasSPFlags)
168638a61873SPetar Jovanovic SPFlags |= DISubprogram::SPFlagMainSubprogram;
168738a61873SPetar Jovanovic else if (!HasSPFlags)
168838a61873SPetar Jovanovic SPFlags = DISubprogram::toSPFlags(
1689adcdc1bdSPaul Robinson /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
169038a61873SPetar Jovanovic /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
1691435a5a36SKazu Hirata /*IsMainSubprogram=*/HasOldMainSubprogramFlag);
1692adcdc1bdSPaul Robinson
1693adcdc1bdSPaul Robinson // All definitions should be distinct.
1694adcdc1bdSPaul Robinson IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
1695ef27db87SMehdi Amini // Version 1 has a Function as Record[15].
1696ef27db87SMehdi Amini // Version 2 has removed Record[15].
1697ef27db87SMehdi Amini // Version 3 has the Unit as Record[15].
1698ef27db87SMehdi Amini // Version 4 added thisAdjustment.
1699adcdc1bdSPaul Robinson // Version 5 repacked flags into DISPFlags, changing many element numbers.
1700adcdc1bdSPaul Robinson bool HasUnit = Record[0] & 2;
1701adcdc1bdSPaul Robinson if (!HasSPFlags && HasUnit && Record.size() < 19)
1702ef27db87SMehdi Amini return error("Invalid record");
1703adcdc1bdSPaul Robinson if (HasSPFlags && !HasUnit)
1704adcdc1bdSPaul Robinson return error("Invalid record");
1705adcdc1bdSPaul Robinson // Accommodate older formats.
1706adcdc1bdSPaul Robinson bool HasFn = false;
1707adcdc1bdSPaul Robinson bool HasThisAdj = true;
1708adcdc1bdSPaul Robinson bool HasThrownTypes = true;
1709d383df32SYonghong Song bool HasAnnotations = false;
1710eab6e94fSChih-Ping Chen bool HasTargetFuncName = false;
1711adcdc1bdSPaul Robinson unsigned OffsetA = 0;
1712adcdc1bdSPaul Robinson unsigned OffsetB = 0;
1713adcdc1bdSPaul Robinson if (!HasSPFlags) {
1714adcdc1bdSPaul Robinson OffsetA = 2;
1715adcdc1bdSPaul Robinson OffsetB = 2;
1716adcdc1bdSPaul Robinson if (Record.size() >= 19) {
1717adcdc1bdSPaul Robinson HasFn = !HasUnit;
1718adcdc1bdSPaul Robinson OffsetB++;
1719adcdc1bdSPaul Robinson }
1720adcdc1bdSPaul Robinson HasThisAdj = Record.size() >= 20;
1721adcdc1bdSPaul Robinson HasThrownTypes = Record.size() >= 21;
1722d383df32SYonghong Song } else {
1723d383df32SYonghong Song HasAnnotations = Record.size() >= 19;
1724eab6e94fSChih-Ping Chen HasTargetFuncName = Record.size() >= 20;
1725adcdc1bdSPaul Robinson }
1726adcdc1bdSPaul Robinson Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
1727ef27db87SMehdi Amini DISubprogram *SP = GET_OR_DISTINCT(
17281d12b885SAdrian Prantl DISubprogram,
17291d12b885SAdrian Prantl (Context,
1730ef27db87SMehdi Amini getDITypeRefOrNull(Record[1]), // scope
1731ef27db87SMehdi Amini getMDString(Record[2]), // name
1732ef27db87SMehdi Amini getMDString(Record[3]), // linkageName
1733ef27db87SMehdi Amini getMDOrNull(Record[4]), // file
1734ef27db87SMehdi Amini Record[5], // line
1735ef27db87SMehdi Amini getMDOrNull(Record[6]), // type
1736adcdc1bdSPaul Robinson Record[7 + OffsetA], // scopeLine
1737adcdc1bdSPaul Robinson getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
1738adcdc1bdSPaul Robinson Record[10 + OffsetA], // virtualIndex
1739adcdc1bdSPaul Robinson HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
174038a61873SPetar Jovanovic Flags, // flags
1741cda54210SPaul Robinson SPFlags, // SPFlags
1742ef27db87SMehdi Amini HasUnit ? CUorFn : nullptr, // unit
1743adcdc1bdSPaul Robinson getMDOrNull(Record[13 + OffsetB]), // templateParams
1744adcdc1bdSPaul Robinson getMDOrNull(Record[14 + OffsetB]), // declaration
1745adcdc1bdSPaul Robinson getMDOrNull(Record[15 + OffsetB]), // retainedNodes
1746adcdc1bdSPaul Robinson HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
1747d383df32SYonghong Song : nullptr, // thrownTypes
1748d383df32SYonghong Song HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
1749eab6e94fSChih-Ping Chen : nullptr, // annotations
1750eab6e94fSChih-Ping Chen HasTargetFuncName ? getMDString(Record[19 + OffsetB])
1751eab6e94fSChih-Ping Chen : nullptr // targetFuncName
1752ef27db87SMehdi Amini ));
1753c05c9db3SIvan Krasin MetadataList.assignValue(SP, NextMetadataNo);
1754c05c9db3SIvan Krasin NextMetadataNo++;
1755ef27db87SMehdi Amini
1756ef27db87SMehdi Amini // Upgrade sp->function mapping to function->sp mapping.
1757ef27db87SMehdi Amini if (HasFn) {
1758ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
1759ef27db87SMehdi Amini if (auto *F = dyn_cast<Function>(CMD->getValue())) {
1760ef27db87SMehdi Amini if (F->isMaterializable())
1761ef27db87SMehdi Amini // Defer until materialized; unmaterialized functions may not have
1762ef27db87SMehdi Amini // metadata.
1763ef27db87SMehdi Amini FunctionsWithSPs[F] = SP;
1764ef27db87SMehdi Amini else if (!F->empty())
1765ef27db87SMehdi Amini F->setSubprogram(SP);
1766ef27db87SMehdi Amini }
1767ef27db87SMehdi Amini }
1768ef27db87SMehdi Amini break;
1769ef27db87SMehdi Amini }
1770ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK: {
1771ef27db87SMehdi Amini if (Record.size() != 5)
1772ef27db87SMehdi Amini return error("Invalid record");
1773ef27db87SMehdi Amini
1774ef27db87SMehdi Amini IsDistinct = Record[0];
1775ef27db87SMehdi Amini MetadataList.assignValue(
1776ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlock,
1777ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]),
1778ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3], Record[4])),
1779c05c9db3SIvan Krasin NextMetadataNo);
1780c05c9db3SIvan Krasin NextMetadataNo++;
1781ef27db87SMehdi Amini break;
1782ef27db87SMehdi Amini }
1783ef27db87SMehdi Amini case bitc::METADATA_LEXICAL_BLOCK_FILE: {
1784ef27db87SMehdi Amini if (Record.size() != 4)
1785ef27db87SMehdi Amini return error("Invalid record");
1786ef27db87SMehdi Amini
1787ef27db87SMehdi Amini IsDistinct = Record[0];
1788ef27db87SMehdi Amini MetadataList.assignValue(
1789ef27db87SMehdi Amini GET_OR_DISTINCT(DILexicalBlockFile,
1790ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]),
1791ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3])),
1792c05c9db3SIvan Krasin NextMetadataNo);
1793c05c9db3SIvan Krasin NextMetadataNo++;
1794ef27db87SMehdi Amini break;
1795ef27db87SMehdi Amini }
17966ed5706aSAdrian Prantl case bitc::METADATA_COMMON_BLOCK: {
17976ed5706aSAdrian Prantl IsDistinct = Record[0] & 1;
17986ed5706aSAdrian Prantl MetadataList.assignValue(
17996ed5706aSAdrian Prantl GET_OR_DISTINCT(DICommonBlock,
18006ed5706aSAdrian Prantl (Context, getMDOrNull(Record[1]),
18016ed5706aSAdrian Prantl getMDOrNull(Record[2]), getMDString(Record[3]),
18026ed5706aSAdrian Prantl getMDOrNull(Record[4]), Record[5])),
18036ed5706aSAdrian Prantl NextMetadataNo);
18046ed5706aSAdrian Prantl NextMetadataNo++;
18056ed5706aSAdrian Prantl break;
18066ed5706aSAdrian Prantl }
1807ef27db87SMehdi Amini case bitc::METADATA_NAMESPACE: {
1808fed4f399SAdrian Prantl // Newer versions of DINamespace dropped file and line.
1809fed4f399SAdrian Prantl MDString *Name;
1810fed4f399SAdrian Prantl if (Record.size() == 3)
1811fed4f399SAdrian Prantl Name = getMDString(Record[2]);
1812fed4f399SAdrian Prantl else if (Record.size() == 5)
1813fed4f399SAdrian Prantl Name = getMDString(Record[3]);
1814fed4f399SAdrian Prantl else
1815ef27db87SMehdi Amini return error("Invalid record");
1816ef27db87SMehdi Amini
1817ef27db87SMehdi Amini IsDistinct = Record[0] & 1;
1818ef27db87SMehdi Amini bool ExportSymbols = Record[0] & 2;
1819ef27db87SMehdi Amini MetadataList.assignValue(
1820ef27db87SMehdi Amini GET_OR_DISTINCT(DINamespace,
1821fed4f399SAdrian Prantl (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
1822c05c9db3SIvan Krasin NextMetadataNo);
1823c05c9db3SIvan Krasin NextMetadataNo++;
1824ef27db87SMehdi Amini break;
1825ef27db87SMehdi Amini }
1826ef27db87SMehdi Amini case bitc::METADATA_MACRO: {
1827ef27db87SMehdi Amini if (Record.size() != 5)
1828ef27db87SMehdi Amini return error("Invalid record");
1829ef27db87SMehdi Amini
1830ef27db87SMehdi Amini IsDistinct = Record[0];
1831ef27db87SMehdi Amini MetadataList.assignValue(
1832ef27db87SMehdi Amini GET_OR_DISTINCT(DIMacro,
18339f926f70SMehdi Amini (Context, Record[1], Record[2], getMDString(Record[3]),
18349f926f70SMehdi Amini getMDString(Record[4]))),
1835c05c9db3SIvan Krasin NextMetadataNo);
1836c05c9db3SIvan Krasin NextMetadataNo++;
1837ef27db87SMehdi Amini break;
1838ef27db87SMehdi Amini }
1839ef27db87SMehdi Amini case bitc::METADATA_MACRO_FILE: {
1840ef27db87SMehdi Amini if (Record.size() != 5)
1841ef27db87SMehdi Amini return error("Invalid record");
1842ef27db87SMehdi Amini
1843ef27db87SMehdi Amini IsDistinct = Record[0];
1844ef27db87SMehdi Amini MetadataList.assignValue(
1845ef27db87SMehdi Amini GET_OR_DISTINCT(DIMacroFile,
18469f926f70SMehdi Amini (Context, Record[1], Record[2], getMDOrNull(Record[3]),
18479f926f70SMehdi Amini getMDOrNull(Record[4]))),
1848c05c9db3SIvan Krasin NextMetadataNo);
1849c05c9db3SIvan Krasin NextMetadataNo++;
1850ef27db87SMehdi Amini break;
1851ef27db87SMehdi Amini }
1852ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_TYPE: {
18537a42babeSAwanish Pandey if (Record.size() < 3 || Record.size() > 4)
1854ef27db87SMehdi Amini return error("Invalid record");
1855ef27db87SMehdi Amini
1856ef27db87SMehdi Amini IsDistinct = Record[0];
18577a42babeSAwanish Pandey MetadataList.assignValue(
18587a42babeSAwanish Pandey GET_OR_DISTINCT(DITemplateTypeParameter,
1859ef27db87SMehdi Amini (Context, getMDString(Record[1]),
18607a42babeSAwanish Pandey getDITypeRefOrNull(Record[2]),
18617a42babeSAwanish Pandey (Record.size() == 4) ? getMDOrNull(Record[3])
18627a42babeSAwanish Pandey : getMDOrNull(false))),
1863c05c9db3SIvan Krasin NextMetadataNo);
1864c05c9db3SIvan Krasin NextMetadataNo++;
1865ef27db87SMehdi Amini break;
1866ef27db87SMehdi Amini }
1867ef27db87SMehdi Amini case bitc::METADATA_TEMPLATE_VALUE: {
18687a42babeSAwanish Pandey if (Record.size() < 5 || Record.size() > 6)
1869ef27db87SMehdi Amini return error("Invalid record");
1870ef27db87SMehdi Amini
1871ef27db87SMehdi Amini IsDistinct = Record[0];
18727a42babeSAwanish Pandey
1873ef27db87SMehdi Amini MetadataList.assignValue(
18747a42babeSAwanish Pandey GET_OR_DISTINCT(
18757a42babeSAwanish Pandey DITemplateValueParameter,
1876ef27db87SMehdi Amini (Context, Record[1], getMDString(Record[2]),
1877ef27db87SMehdi Amini getDITypeRefOrNull(Record[3]),
18787a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
18797a42babeSAwanish Pandey (Record.size() == 6) ? getMDOrNull(Record[5])
18807a42babeSAwanish Pandey : getMDOrNull(Record[4]))),
1881c05c9db3SIvan Krasin NextMetadataNo);
1882c05c9db3SIvan Krasin NextMetadataNo++;
1883ef27db87SMehdi Amini break;
1884ef27db87SMehdi Amini }
1885ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_VAR: {
1886f8ab35a4SMatthew Voss if (Record.size() < 11 || Record.size() > 13)
1887ef27db87SMehdi Amini return error("Invalid record");
1888ef27db87SMehdi Amini
1889bceaaa96SAdrian Prantl IsDistinct = Record[0] & 1;
1890bceaaa96SAdrian Prantl unsigned Version = Record[0] >> 1;
1891ef27db87SMehdi Amini
1892f8ab35a4SMatthew Voss if (Version == 2) {
189330c28848SYonghong Song Metadata *Annotations = nullptr;
189430c28848SYonghong Song if (Record.size() > 12)
189530c28848SYonghong Song Annotations = getMDOrNull(Record[12]);
189630c28848SYonghong Song
1897f8ab35a4SMatthew Voss MetadataList.assignValue(
1898665b4138SLuís Ferreira GET_OR_DISTINCT(DIGlobalVariable,
1899665b4138SLuís Ferreira (Context, getMDOrNull(Record[1]),
1900665b4138SLuís Ferreira getMDString(Record[2]), getMDString(Record[3]),
1901665b4138SLuís Ferreira getMDOrNull(Record[4]), Record[5],
1902f8ab35a4SMatthew Voss getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1903665b4138SLuís Ferreira getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1904665b4138SLuís Ferreira Record[11], Annotations)),
1905f8ab35a4SMatthew Voss NextMetadataNo);
1906f8ab35a4SMatthew Voss
1907f8ab35a4SMatthew Voss NextMetadataNo++;
1908f8ab35a4SMatthew Voss } else if (Version == 1) {
1909f8ab35a4SMatthew Voss // No upgrade necessary. A null field will be introduced to indicate
1910f8ab35a4SMatthew Voss // that no parameter information is available.
1911bceaaa96SAdrian Prantl MetadataList.assignValue(
1912665b4138SLuís Ferreira GET_OR_DISTINCT(
1913665b4138SLuís Ferreira DIGlobalVariable,
1914665b4138SLuís Ferreira (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1915665b4138SLuís Ferreira getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
19169f926f70SMehdi Amini getDITypeRefOrNull(Record[6]), Record[7], Record[8],
1917665b4138SLuís Ferreira getMDOrNull(Record[10]), nullptr, Record[11], nullptr)),
1918c05c9db3SIvan Krasin NextMetadataNo);
1919f8ab35a4SMatthew Voss
1920c05c9db3SIvan Krasin NextMetadataNo++;
1921bceaaa96SAdrian Prantl } else if (Version == 0) {
1922ef27db87SMehdi Amini // Upgrade old metadata, which stored a global variable reference or a
1923ef27db87SMehdi Amini // ConstantInt here.
1924a5bf2d70SAdrian Prantl NeedUpgradeToDIGlobalVariableExpression = true;
1925ef27db87SMehdi Amini Metadata *Expr = getMDOrNull(Record[9]);
1926ef27db87SMehdi Amini uint32_t AlignInBits = 0;
1927ef27db87SMehdi Amini if (Record.size() > 11) {
1928ef27db87SMehdi Amini if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
1929ef27db87SMehdi Amini return error("Alignment value is too large");
1930ef27db87SMehdi Amini AlignInBits = Record[11];
1931ef27db87SMehdi Amini }
1932ef27db87SMehdi Amini GlobalVariable *Attach = nullptr;
1933ef27db87SMehdi Amini if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
1934ef27db87SMehdi Amini if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
1935ef27db87SMehdi Amini Attach = GV;
1936ef27db87SMehdi Amini Expr = nullptr;
1937ef27db87SMehdi Amini } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
1938ef27db87SMehdi Amini Expr = DIExpression::get(Context,
1939ef27db87SMehdi Amini {dwarf::DW_OP_constu, CI->getZExtValue(),
1940ef27db87SMehdi Amini dwarf::DW_OP_stack_value});
1941ef27db87SMehdi Amini } else {
1942ef27db87SMehdi Amini Expr = nullptr;
1943ef27db87SMehdi Amini }
1944ef27db87SMehdi Amini }
1945ef27db87SMehdi Amini DIGlobalVariable *DGV = GET_OR_DISTINCT(
1946ef27db87SMehdi Amini DIGlobalVariable,
1947ef27db87SMehdi Amini (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
1948ef27db87SMehdi Amini getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
1949bceaaa96SAdrian Prantl getDITypeRefOrNull(Record[6]), Record[7], Record[8],
195030c28848SYonghong Song getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));
195103c6d31aSAdrian Prantl
1952e37d3144SAdrian Prantl DIGlobalVariableExpression *DGVE = nullptr;
1953e37d3144SAdrian Prantl if (Attach || Expr)
195405782218SAdrian Prantl DGVE = DIGlobalVariableExpression::getDistinct(
195505782218SAdrian Prantl Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
195673ec0656SAdrian Prantl if (Attach)
1957bceaaa96SAdrian Prantl Attach->addDebugInfo(DGVE);
1958e37d3144SAdrian Prantl
1959e37d3144SAdrian Prantl auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
1960e37d3144SAdrian Prantl MetadataList.assignValue(MDNode, NextMetadataNo);
1961e37d3144SAdrian Prantl NextMetadataNo++;
1962bceaaa96SAdrian Prantl } else
1963bceaaa96SAdrian Prantl return error("Invalid record");
196473ec0656SAdrian Prantl
1965ef27db87SMehdi Amini break;
1966ef27db87SMehdi Amini }
1967ef27db87SMehdi Amini case bitc::METADATA_LOCAL_VAR: {
1968ef27db87SMehdi Amini // 10th field is for the obseleted 'inlinedAt:' field.
1969ef27db87SMehdi Amini if (Record.size() < 8 || Record.size() > 10)
1970ef27db87SMehdi Amini return error("Invalid record");
1971ef27db87SMehdi Amini
1972ef27db87SMehdi Amini IsDistinct = Record[0] & 1;
1973ef27db87SMehdi Amini bool HasAlignment = Record[0] & 2;
1974ef27db87SMehdi Amini // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
1975ef27db87SMehdi Amini // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
197668168d17SSimon Pilgrim // this is newer version of record which doesn't have artificial tag.
1977ef27db87SMehdi Amini bool HasTag = !HasAlignment && Record.size() > 8;
1978ef27db87SMehdi Amini DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
1979ef27db87SMehdi Amini uint32_t AlignInBits = 0;
19801bebc31cSYonghong Song Metadata *Annotations = nullptr;
1981ef27db87SMehdi Amini if (HasAlignment) {
19821bebc31cSYonghong Song if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1983ef27db87SMehdi Amini return error("Alignment value is too large");
19841bebc31cSYonghong Song AlignInBits = Record[8];
19851bebc31cSYonghong Song if (Record.size() > 9)
19861bebc31cSYonghong Song Annotations = getMDOrNull(Record[9]);
1987ef27db87SMehdi Amini }
19881bebc31cSYonghong Song
1989ef27db87SMehdi Amini MetadataList.assignValue(
1990ef27db87SMehdi Amini GET_OR_DISTINCT(DILocalVariable,
1991ef27db87SMehdi Amini (Context, getMDOrNull(Record[1 + HasTag]),
1992ef27db87SMehdi Amini getMDString(Record[2 + HasTag]),
1993ef27db87SMehdi Amini getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
1994ef27db87SMehdi Amini getDITypeRefOrNull(Record[5 + HasTag]),
1995665b4138SLuís Ferreira Record[6 + HasTag], Flags, AlignInBits, Annotations)),
1996c05c9db3SIvan Krasin NextMetadataNo);
1997c05c9db3SIvan Krasin NextMetadataNo++;
1998ef27db87SMehdi Amini break;
1999ef27db87SMehdi Amini }
20002c864551SShiva Chen case bitc::METADATA_LABEL: {
20012c864551SShiva Chen if (Record.size() != 5)
20022c864551SShiva Chen return error("Invalid record");
20032c864551SShiva Chen
20042c864551SShiva Chen IsDistinct = Record[0] & 1;
20052c864551SShiva Chen MetadataList.assignValue(
2006665b4138SLuís Ferreira GET_OR_DISTINCT(DILabel, (Context, getMDOrNull(Record[1]),
20072c864551SShiva Chen getMDString(Record[2]),
20082c864551SShiva Chen getMDOrNull(Record[3]), Record[4])),
20092c864551SShiva Chen NextMetadataNo);
20102c864551SShiva Chen NextMetadataNo++;
20112c864551SShiva Chen break;
20122c864551SShiva Chen }
2013ef27db87SMehdi Amini case bitc::METADATA_EXPRESSION: {
2014ef27db87SMehdi Amini if (Record.size() < 1)
2015ef27db87SMehdi Amini return error("Invalid record");
2016ef27db87SMehdi Amini
2017ef27db87SMehdi Amini IsDistinct = Record[0] & 1;
20186825fb64SAdrian Prantl uint64_t Version = Record[0] >> 1;
2019ef27db87SMehdi Amini auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
2020ffc498dfSFlorian Hahn
2021ffc498dfSFlorian Hahn SmallVector<uint64_t, 6> Buffer;
202205963a3dSArthur Eubanks if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
2023ffc498dfSFlorian Hahn return Err;
2024ef27db87SMehdi Amini
2025665b4138SLuís Ferreira MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)),
2026665b4138SLuís Ferreira NextMetadataNo);
2027c05c9db3SIvan Krasin NextMetadataNo++;
2028ef27db87SMehdi Amini break;
2029ef27db87SMehdi Amini }
2030bceaaa96SAdrian Prantl case bitc::METADATA_GLOBAL_VAR_EXPR: {
2031bceaaa96SAdrian Prantl if (Record.size() != 3)
2032bceaaa96SAdrian Prantl return error("Invalid record");
2033bceaaa96SAdrian Prantl
2034bceaaa96SAdrian Prantl IsDistinct = Record[0];
203505782218SAdrian Prantl Metadata *Expr = getMDOrNull(Record[2]);
203605782218SAdrian Prantl if (!Expr)
203705782218SAdrian Prantl Expr = DIExpression::get(Context, {});
203805782218SAdrian Prantl MetadataList.assignValue(
203905782218SAdrian Prantl GET_OR_DISTINCT(DIGlobalVariableExpression,
204005782218SAdrian Prantl (Context, getMDOrNull(Record[1]), Expr)),
2041c05c9db3SIvan Krasin NextMetadataNo);
2042c05c9db3SIvan Krasin NextMetadataNo++;
2043bceaaa96SAdrian Prantl break;
2044bceaaa96SAdrian Prantl }
2045ef27db87SMehdi Amini case bitc::METADATA_OBJC_PROPERTY: {
2046ef27db87SMehdi Amini if (Record.size() != 8)
2047ef27db87SMehdi Amini return error("Invalid record");
2048ef27db87SMehdi Amini
2049ef27db87SMehdi Amini IsDistinct = Record[0];
2050ef27db87SMehdi Amini MetadataList.assignValue(
2051ef27db87SMehdi Amini GET_OR_DISTINCT(DIObjCProperty,
2052ef27db87SMehdi Amini (Context, getMDString(Record[1]),
2053ef27db87SMehdi Amini getMDOrNull(Record[2]), Record[3],
2054ef27db87SMehdi Amini getMDString(Record[4]), getMDString(Record[5]),
2055ef27db87SMehdi Amini Record[6], getDITypeRefOrNull(Record[7]))),
2056c05c9db3SIvan Krasin NextMetadataNo);
2057c05c9db3SIvan Krasin NextMetadataNo++;
2058ef27db87SMehdi Amini break;
2059ef27db87SMehdi Amini }
2060ef27db87SMehdi Amini case bitc::METADATA_IMPORTED_ENTITY: {
2061ea93ca60SNikita Popov if (Record.size() < 6 || Record.size() > 8)
2062ea93ca60SNikita Popov return error("Invalid DIImportedEntity record");
2063ef27db87SMehdi Amini
2064ef27db87SMehdi Amini IsDistinct = Record[0];
2065a5b72abcSAlok Kumar Sharma bool HasFile = (Record.size() >= 7);
2066a5b72abcSAlok Kumar Sharma bool HasElements = (Record.size() >= 8);
2067ef27db87SMehdi Amini MetadataList.assignValue(
2068ef27db87SMehdi Amini GET_OR_DISTINCT(DIImportedEntity,
2069ef27db87SMehdi Amini (Context, Record[1], getMDOrNull(Record[2]),
2070d63bfd21SAdrian Prantl getDITypeRefOrNull(Record[3]),
2071d63bfd21SAdrian Prantl HasFile ? getMDOrNull(Record[6]) : nullptr,
2072a5b72abcSAlok Kumar Sharma HasFile ? Record[4] : 0, getMDString(Record[5]),
2073a5b72abcSAlok Kumar Sharma HasElements ? getMDOrNull(Record[7]) : nullptr)),
2074c05c9db3SIvan Krasin NextMetadataNo);
2075c05c9db3SIvan Krasin NextMetadataNo++;
2076ef27db87SMehdi Amini break;
2077ef27db87SMehdi Amini }
2078ef27db87SMehdi Amini case bitc::METADATA_STRING_OLD: {
2079ef27db87SMehdi Amini std::string String(Record.begin(), Record.end());
2080ef27db87SMehdi Amini
2081ef27db87SMehdi Amini // Test for upgrading !llvm.loop.
2082ef27db87SMehdi Amini HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
208319ef4fadSMehdi Amini ++NumMDStringLoaded;
2084ef27db87SMehdi Amini Metadata *MD = MDString::get(Context, String);
2085c05c9db3SIvan Krasin MetadataList.assignValue(MD, NextMetadataNo);
2086c05c9db3SIvan Krasin NextMetadataNo++;
2087ef27db87SMehdi Amini break;
2088ef27db87SMehdi Amini }
208919ef4fadSMehdi Amini case bitc::METADATA_STRINGS: {
209019ef4fadSMehdi Amini auto CreateNextMDString = [&](StringRef Str) {
209119ef4fadSMehdi Amini ++NumMDStringLoaded;
2092c05c9db3SIvan Krasin MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
2093c05c9db3SIvan Krasin NextMetadataNo++;
209419ef4fadSMehdi Amini };
209519ef4fadSMehdi Amini if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2096ef27db87SMehdi Amini return Err;
2097ef27db87SMehdi Amini break;
209819ef4fadSMehdi Amini }
2099ef27db87SMehdi Amini case bitc::METADATA_GLOBAL_DECL_ATTACHMENT: {
2100ef27db87SMehdi Amini if (Record.size() % 2 == 0)
2101ef27db87SMehdi Amini return error("Invalid record");
2102ef27db87SMehdi Amini unsigned ValueID = Record[0];
2103ef27db87SMehdi Amini if (ValueID >= ValueList.size())
2104ef27db87SMehdi Amini return error("Invalid record");
2105ef27db87SMehdi Amini if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
2106ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment(
2107ef27db87SMehdi Amini *GO, ArrayRef<uint64_t>(Record).slice(1)))
2108ef27db87SMehdi Amini return Err;
2109ef27db87SMehdi Amini break;
2110ef27db87SMehdi Amini }
2111ef27db87SMehdi Amini case bitc::METADATA_KIND: {
2112ef27db87SMehdi Amini // Support older bitcode files that had METADATA_KIND records in a
2113ef27db87SMehdi Amini // block with METADATA_BLOCK_ID.
2114ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record))
2115ef27db87SMehdi Amini return Err;
2116ef27db87SMehdi Amini break;
2117ef27db87SMehdi Amini }
211865600cb2Sgbtozers case bitc::METADATA_ARG_LIST: {
211965600cb2Sgbtozers SmallVector<ValueAsMetadata *, 4> Elts;
212065600cb2Sgbtozers Elts.reserve(Record.size());
2121e5d844b5SStephen Tozer for (uint64_t Elt : Record) {
2122e5d844b5SStephen Tozer Metadata *MD = getMD(Elt);
2123e5d844b5SStephen Tozer if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())
2124e5d844b5SStephen Tozer return error(
2125e5d844b5SStephen Tozer "Invalid record: DIArgList should not contain forward refs");
2126e5d844b5SStephen Tozer if (!isa<ValueAsMetadata>(MD))
2127e5d844b5SStephen Tozer return error("Invalid record");
2128e5d844b5SStephen Tozer Elts.push_back(cast<ValueAsMetadata>(MD));
2129e5d844b5SStephen Tozer }
213065600cb2Sgbtozers
213165600cb2Sgbtozers MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);
213265600cb2Sgbtozers NextMetadataNo++;
213365600cb2Sgbtozers break;
213465600cb2Sgbtozers }
2135ef27db87SMehdi Amini }
21369f926f70SMehdi Amini return Error::success();
213719ef4fadSMehdi Amini #undef GET_OR_DISTINCT
2138ef27db87SMehdi Amini }
2139ef27db87SMehdi Amini
parseMetadataStrings(ArrayRef<uint64_t> Record,StringRef Blob,function_ref<void (StringRef)> CallBack)2140ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
214119ef4fadSMehdi Amini ArrayRef<uint64_t> Record, StringRef Blob,
2142061f4a5fSBenjamin Kramer function_ref<void(StringRef)> CallBack) {
2143ef27db87SMehdi Amini // All the MDStrings in the block are emitted together in a single
2144ef27db87SMehdi Amini // record. The strings are concatenated and stored in a blob along with
2145ef27db87SMehdi Amini // their sizes.
2146ef27db87SMehdi Amini if (Record.size() != 2)
2147ef27db87SMehdi Amini return error("Invalid record: metadata strings layout");
2148ef27db87SMehdi Amini
2149ef27db87SMehdi Amini unsigned NumStrings = Record[0];
2150ef27db87SMehdi Amini unsigned StringsOffset = Record[1];
2151ef27db87SMehdi Amini if (!NumStrings)
2152ef27db87SMehdi Amini return error("Invalid record: metadata strings with no strings");
2153ef27db87SMehdi Amini if (StringsOffset > Blob.size())
2154ef27db87SMehdi Amini return error("Invalid record: metadata strings corrupt offset");
2155ef27db87SMehdi Amini
2156ef27db87SMehdi Amini StringRef Lengths = Blob.slice(0, StringsOffset);
2157ef27db87SMehdi Amini SimpleBitstreamCursor R(Lengths);
2158ef27db87SMehdi Amini
2159ef27db87SMehdi Amini StringRef Strings = Blob.drop_front(StringsOffset);
2160ef27db87SMehdi Amini do {
2161ef27db87SMehdi Amini if (R.AtEndOfStream())
2162ef27db87SMehdi Amini return error("Invalid record: metadata strings bad length");
2163ef27db87SMehdi Amini
2164b12a864cSDuncan P. N. Exon Smith uint32_t Size;
2165b12a864cSDuncan P. N. Exon Smith if (Error E = R.ReadVBR(6).moveInto(Size))
2166b12a864cSDuncan P. N. Exon Smith return E;
2167ef27db87SMehdi Amini if (Strings.size() < Size)
2168ef27db87SMehdi Amini return error("Invalid record: metadata strings truncated chars");
2169ef27db87SMehdi Amini
217019ef4fadSMehdi Amini CallBack(Strings.slice(0, Size));
2171ef27db87SMehdi Amini Strings = Strings.drop_front(Size);
2172ef27db87SMehdi Amini } while (--NumStrings);
2173ef27db87SMehdi Amini
2174ef27db87SMehdi Amini return Error::success();
2175ef27db87SMehdi Amini }
2176ef27db87SMehdi Amini
parseGlobalObjectAttachment(GlobalObject & GO,ArrayRef<uint64_t> Record)2177ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2178ef27db87SMehdi Amini GlobalObject &GO, ArrayRef<uint64_t> Record) {
2179ef27db87SMehdi Amini assert(Record.size() % 2 == 0);
2180ef27db87SMehdi Amini for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2181ef27db87SMehdi Amini auto K = MDKindMap.find(Record[I]);
2182ef27db87SMehdi Amini if (K == MDKindMap.end())
2183ef27db87SMehdi Amini return error("Invalid ID");
2184c27ab339STeresa Johnson MDNode *MD =
2185c27ab339STeresa Johnson dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));
2186ef27db87SMehdi Amini if (!MD)
2187f3d2453dSTeresa Johnson return error("Invalid metadata attachment: expect fwd ref to MDNode");
2188ef27db87SMehdi Amini GO.addMetadata(K->second, *MD);
2189ef27db87SMehdi Amini }
2190ef27db87SMehdi Amini return Error::success();
2191ef27db87SMehdi Amini }
2192ef27db87SMehdi Amini
2193ef27db87SMehdi Amini /// Parse metadata attachments.
parseMetadataAttachment(Function & F,ArrayRef<Instruction * > InstructionList)2194ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataAttachment(
21951237c149Sserge-sans-paille Function &F, ArrayRef<Instruction *> InstructionList) {
21960e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
21970e828958SJF Bastien return Err;
2198ef27db87SMehdi Amini
2199ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record;
22007b0d1457SMehdi Amini PlaceholderQueue Placeholders;
2201ef27db87SMehdi Amini
2202ef27db87SMehdi Amini while (true) {
2203b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
2204b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2205b12a864cSDuncan P. N. Exon Smith return E;
2206ef27db87SMehdi Amini
2207ef27db87SMehdi Amini switch (Entry.Kind) {
2208ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already.
2209ef27db87SMehdi Amini case BitstreamEntry::Error:
2210ef27db87SMehdi Amini return error("Malformed block");
2211ef27db87SMehdi Amini case BitstreamEntry::EndBlock:
22127b0d1457SMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders);
2213ef27db87SMehdi Amini return Error::success();
2214ef27db87SMehdi Amini case BitstreamEntry::Record:
2215ef27db87SMehdi Amini // The interesting case.
2216ef27db87SMehdi Amini break;
2217ef27db87SMehdi Amini }
2218ef27db87SMehdi Amini
2219ef27db87SMehdi Amini // Read a metadata attachment record.
2220ef27db87SMehdi Amini Record.clear();
222119ef4fadSMehdi Amini ++NumMDRecordLoaded;
22220e828958SJF Bastien Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
22230e828958SJF Bastien if (!MaybeRecord)
22240e828958SJF Bastien return MaybeRecord.takeError();
22250e828958SJF Bastien switch (MaybeRecord.get()) {
2226ef27db87SMehdi Amini default: // Default behavior: ignore.
2227ef27db87SMehdi Amini break;
2228ef27db87SMehdi Amini case bitc::METADATA_ATTACHMENT: {
2229ef27db87SMehdi Amini unsigned RecordLength = Record.size();
2230ef27db87SMehdi Amini if (Record.empty())
2231ef27db87SMehdi Amini return error("Invalid record");
2232ef27db87SMehdi Amini if (RecordLength % 2 == 0) {
2233ef27db87SMehdi Amini // A function attachment.
2234ef27db87SMehdi Amini if (Error Err = parseGlobalObjectAttachment(F, Record))
2235ef27db87SMehdi Amini return Err;
2236ef27db87SMehdi Amini continue;
2237ef27db87SMehdi Amini }
2238ef27db87SMehdi Amini
2239ef27db87SMehdi Amini // An instruction attachment.
2240ef27db87SMehdi Amini Instruction *Inst = InstructionList[Record[0]];
2241ef27db87SMehdi Amini for (unsigned i = 1; i != RecordLength; i = i + 2) {
2242ef27db87SMehdi Amini unsigned Kind = Record[i];
2243ef27db87SMehdi Amini DenseMap<unsigned, unsigned>::iterator I = MDKindMap.find(Kind);
2244ef27db87SMehdi Amini if (I == MDKindMap.end())
2245ef27db87SMehdi Amini return error("Invalid ID");
22468662305bSMehdi Amini if (I->second == LLVMContext::MD_tbaa && StripTBAA)
22478662305bSMehdi Amini continue;
22488662305bSMehdi Amini
224919ef4fadSMehdi Amini auto Idx = Record[i + 1];
225019ef4fadSMehdi Amini if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2251d5549f3dSMehdi Amini !MetadataList.lookup(Idx)) {
225219ef4fadSMehdi Amini // Load the attachment if it is in the lazy-loadable range and hasn't
225319ef4fadSMehdi Amini // been loaded yet.
225419ef4fadSMehdi Amini lazyLoadOneMetadata(Idx, Placeholders);
2255d5549f3dSMehdi Amini resolveForwardRefsAndPlaceholders(Placeholders);
2256d5549f3dSMehdi Amini }
225719ef4fadSMehdi Amini
225819ef4fadSMehdi Amini Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2259ef27db87SMehdi Amini if (isa<LocalAsMetadata>(Node))
2260ef27db87SMehdi Amini // Drop the attachment. This used to be legal, but there's no
2261ef27db87SMehdi Amini // upgrade path.
2262ef27db87SMehdi Amini break;
2263ef27db87SMehdi Amini MDNode *MD = dyn_cast_or_null<MDNode>(Node);
2264ef27db87SMehdi Amini if (!MD)
2265ef27db87SMehdi Amini return error("Invalid metadata attachment");
2266ef27db87SMehdi Amini
2267ef27db87SMehdi Amini if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2268ef27db87SMehdi Amini MD = upgradeInstructionLoopAttachment(*MD);
2269ef27db87SMehdi Amini
2270ef27db87SMehdi Amini if (I->second == LLVMContext::MD_tbaa) {
2271ef27db87SMehdi Amini assert(!MD->isTemporary() && "should load MDs before attachments");
2272ef27db87SMehdi Amini MD = UpgradeTBAANode(*MD);
2273ef27db87SMehdi Amini }
2274ef27db87SMehdi Amini Inst->setMetadata(I->second, MD);
2275ef27db87SMehdi Amini }
2276ef27db87SMehdi Amini break;
2277ef27db87SMehdi Amini }
2278ef27db87SMehdi Amini }
2279ef27db87SMehdi Amini }
2280ef27db87SMehdi Amini }
2281ef27db87SMehdi Amini
2282ef27db87SMehdi Amini /// Parse a single METADATA_KIND record, inserting result in MDKindMap.
parseMetadataKindRecord(SmallVectorImpl<uint64_t> & Record)2283ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2284ef27db87SMehdi Amini SmallVectorImpl<uint64_t> &Record) {
2285ef27db87SMehdi Amini if (Record.size() < 2)
2286ef27db87SMehdi Amini return error("Invalid record");
2287ef27db87SMehdi Amini
2288ef27db87SMehdi Amini unsigned Kind = Record[0];
2289ef27db87SMehdi Amini SmallString<8> Name(Record.begin() + 1, Record.end());
2290ef27db87SMehdi Amini
2291ef27db87SMehdi Amini unsigned NewKind = TheModule.getMDKindID(Name.str());
2292ef27db87SMehdi Amini if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2293ef27db87SMehdi Amini return error("Conflicting METADATA_KIND records");
2294ef27db87SMehdi Amini return Error::success();
2295ef27db87SMehdi Amini }
2296ef27db87SMehdi Amini
2297ef27db87SMehdi Amini /// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
parseMetadataKinds()2298ef27db87SMehdi Amini Error MetadataLoader::MetadataLoaderImpl::parseMetadataKinds() {
22990e828958SJF Bastien if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
23000e828958SJF Bastien return Err;
2301ef27db87SMehdi Amini
2302ef27db87SMehdi Amini SmallVector<uint64_t, 64> Record;
2303ef27db87SMehdi Amini
2304ef27db87SMehdi Amini // Read all the records.
2305ef27db87SMehdi Amini while (true) {
2306b12a864cSDuncan P. N. Exon Smith BitstreamEntry Entry;
2307b12a864cSDuncan P. N. Exon Smith if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2308b12a864cSDuncan P. N. Exon Smith return E;
2309ef27db87SMehdi Amini
2310ef27db87SMehdi Amini switch (Entry.Kind) {
2311ef27db87SMehdi Amini case BitstreamEntry::SubBlock: // Handled for us already.
2312ef27db87SMehdi Amini case BitstreamEntry::Error:
2313ef27db87SMehdi Amini return error("Malformed block");
2314ef27db87SMehdi Amini case BitstreamEntry::EndBlock:
2315ef27db87SMehdi Amini return Error::success();
2316ef27db87SMehdi Amini case BitstreamEntry::Record:
2317ef27db87SMehdi Amini // The interesting case.
2318ef27db87SMehdi Amini break;
2319ef27db87SMehdi Amini }
2320ef27db87SMehdi Amini
2321ef27db87SMehdi Amini // Read a record.
2322ef27db87SMehdi Amini Record.clear();
232319ef4fadSMehdi Amini ++NumMDRecordLoaded;
23240e828958SJF Bastien Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
23250e828958SJF Bastien if (!MaybeCode)
23260e828958SJF Bastien return MaybeCode.takeError();
23270e828958SJF Bastien switch (MaybeCode.get()) {
2328ef27db87SMehdi Amini default: // Default behavior: ignore.
2329ef27db87SMehdi Amini break;
2330ef27db87SMehdi Amini case bitc::METADATA_KIND: {
2331ef27db87SMehdi Amini if (Error Err = parseMetadataKindRecord(Record))
2332ef27db87SMehdi Amini return Err;
2333ef27db87SMehdi Amini break;
2334ef27db87SMehdi Amini }
2335ef27db87SMehdi Amini }
2336ef27db87SMehdi Amini }
2337ef27db87SMehdi Amini }
2338ef27db87SMehdi Amini
operator =(MetadataLoader && RHS)2339ef27db87SMehdi Amini MetadataLoader &MetadataLoader::operator=(MetadataLoader &&RHS) {
2340ef27db87SMehdi Amini Pimpl = std::move(RHS.Pimpl);
2341ef27db87SMehdi Amini return *this;
2342ef27db87SMehdi Amini }
MetadataLoader(MetadataLoader && RHS)2343ef27db87SMehdi Amini MetadataLoader::MetadataLoader(MetadataLoader &&RHS)
2344ec68dd49SMehdi Amini : Pimpl(std::move(RHS.Pimpl)) {}
2345ef27db87SMehdi Amini
2346ef27db87SMehdi Amini MetadataLoader::~MetadataLoader() = default;
MetadataLoader(BitstreamCursor & Stream,Module & TheModule,BitcodeReaderValueList & ValueList,bool IsImporting,std::function<Type * (unsigned)> getTypeByID)2347ef27db87SMehdi Amini MetadataLoader::MetadataLoader(BitstreamCursor &Stream, Module &TheModule,
2348ef27db87SMehdi Amini BitcodeReaderValueList &ValueList,
2349a61f5e37STeresa Johnson bool IsImporting,
2350ef27db87SMehdi Amini std::function<Type *(unsigned)> getTypeByID)
23510eaee545SJonas Devlieghere : Pimpl(std::make_unique<MetadataLoaderImpl>(
2352061f4a5fSBenjamin Kramer Stream, TheModule, ValueList, std::move(getTypeByID), IsImporting)) {}
2353ef27db87SMehdi Amini
parseMetadata(bool ModuleLevel)2354ef27db87SMehdi Amini Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2355ec68dd49SMehdi Amini return Pimpl->parseMetadata(ModuleLevel);
2356ef27db87SMehdi Amini }
2357ef27db87SMehdi Amini
hasFwdRefs() const2358ef27db87SMehdi Amini bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2359ef27db87SMehdi Amini
2360ef27db87SMehdi Amini /// Return the given metadata, creating a replaceable forward reference if
2361ef27db87SMehdi Amini /// necessary.
getMetadataFwdRefOrLoad(unsigned Idx)23623bb4d01dSMehdi Amini Metadata *MetadataLoader::getMetadataFwdRefOrLoad(unsigned Idx) {
23633bb4d01dSMehdi Amini return Pimpl->getMetadataFwdRefOrLoad(Idx);
2364ef27db87SMehdi Amini }
2365ef27db87SMehdi Amini
lookupSubprogramForFunction(Function * F)2366ef27db87SMehdi Amini DISubprogram *MetadataLoader::lookupSubprogramForFunction(Function *F) {
2367ef27db87SMehdi Amini return Pimpl->lookupSubprogramForFunction(F);
2368ef27db87SMehdi Amini }
2369ef27db87SMehdi Amini
parseMetadataAttachment(Function & F,ArrayRef<Instruction * > InstructionList)2370ef27db87SMehdi Amini Error MetadataLoader::parseMetadataAttachment(
23711237c149Sserge-sans-paille Function &F, ArrayRef<Instruction *> InstructionList) {
2372ef27db87SMehdi Amini return Pimpl->parseMetadataAttachment(F, InstructionList);
2373ef27db87SMehdi Amini }
2374ef27db87SMehdi Amini
parseMetadataKinds()2375ef27db87SMehdi Amini Error MetadataLoader::parseMetadataKinds() {
2376ef27db87SMehdi Amini return Pimpl->parseMetadataKinds();
2377ef27db87SMehdi Amini }
2378ef27db87SMehdi Amini
setStripTBAA(bool StripTBAA)23798662305bSMehdi Amini void MetadataLoader::setStripTBAA(bool StripTBAA) {
23808662305bSMehdi Amini return Pimpl->setStripTBAA(StripTBAA);
23818662305bSMehdi Amini }
23828662305bSMehdi Amini
isStrippingTBAA()23838662305bSMehdi Amini bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
23848662305bSMehdi Amini
size() const2385ef27db87SMehdi Amini unsigned MetadataLoader::size() const { return Pimpl->size(); }
shrinkTo(unsigned N)2386ef27db87SMehdi Amini void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
23876825fb64SAdrian Prantl
upgradeDebugIntrinsics(Function & F)23886825fb64SAdrian Prantl void MetadataLoader::upgradeDebugIntrinsics(Function &F) {
23896825fb64SAdrian Prantl return Pimpl->upgradeDebugIntrinsics(F);
23906825fb64SAdrian Prantl }
2391