LLVM 24.0.0git
MetadataLoader.cpp
Go to the documentation of this file.
1//===- MetadataLoader.cpp - Internal BitcodeReader implementation ---------===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#include "MetadataLoader.h"
10#include "ValueList.h"
11
12#include "llvm/ADT/APInt.h"
13#include "llvm/ADT/ArrayRef.h"
15#include "llvm/ADT/DenseMap.h"
16#include "llvm/ADT/DenseSet.h"
18#include "llvm/ADT/SetVector.h"
21#include "llvm/ADT/Statistic.h"
22#include "llvm/ADT/StringRef.h"
23#include "llvm/ADT/Twine.h"
28#include "llvm/IR/Argument.h"
29#include "llvm/IR/AutoUpgrade.h"
30#include "llvm/IR/BasicBlock.h"
31#include "llvm/IR/Constants.h"
33#include "llvm/IR/Function.h"
36#include "llvm/IR/Instruction.h"
38#include "llvm/IR/LLVMContext.h"
39#include "llvm/IR/Metadata.h"
40#include "llvm/IR/Module.h"
42#include "llvm/IR/Type.h"
48
49#include <algorithm>
50#include <cassert>
51#include <cstddef>
52#include <cstdint>
53#include <deque>
54#include <iterator>
55#include <limits>
56#include <map>
57#include <optional>
58#include <string>
59#include <tuple>
60#include <utility>
61#include <vector>
62
63using namespace llvm;
64
65#define DEBUG_TYPE "bitcode-reader"
66
67STATISTIC(NumMDStringLoaded, "Number of MDStrings loaded");
68STATISTIC(NumMDNodeTemporary, "Number of MDNode::Temporary created");
69STATISTIC(NumMDRecordLoaded, "Number of Metadata records loaded");
70
71/// Flag whether we need to import full type definitions for ThinLTO.
72/// Currently needed for Darwin and LLDB.
74 "import-full-type-definitions", cl::init(false), cl::Hidden,
75 cl::desc("Import full type definitions for ThinLTO."));
76
78 "disable-ondemand-mds-loading", cl::init(false), cl::Hidden,
79 cl::desc("Force disable the lazy-loading on-demand of metadata when "
80 "loading bitcode for importing."));
81
82namespace {
83
84class BitcodeReaderMetadataList {
85 /// Array of metadata references.
86 ///
87 /// Don't use std::vector here. Some versions of libc++ copy (instead of
88 /// move) on resize, and TrackingMDRef is very expensive to copy.
90
91 /// The set of indices in MetadataPtrs above of forward references that were
92 /// generated.
93 SmallDenseSet<unsigned, 1> ForwardReference;
94
95 /// The set of indices in MetadataPtrs above of Metadata that need to be
96 /// resolved.
97 SmallDenseSet<unsigned, 1> UnresolvedNodes;
98
99 /// Structures for resolving old type refs.
100 struct {
105 } OldTypeRefs;
106
107 LLVMContext &Context;
108
109 /// Maximum number of valid references. Forward references exceeding the
110 /// maximum must be invalid.
111 unsigned RefsUpperBound;
112
113public:
114 BitcodeReaderMetadataList(LLVMContext &C, size_t RefsUpperBound)
115 : Context(C),
116 RefsUpperBound(std::min((size_t)std::numeric_limits<unsigned>::max(),
117 RefsUpperBound)) {}
118
119 using const_iterator = SmallVector<TrackingMDRef, 1>::const_iterator;
120
121 // vector compatibility methods
122 unsigned size() const { return MetadataPtrs.size(); }
123 void resize(unsigned N) { MetadataPtrs.resize(N); }
124 void push_back(Metadata *MD) { MetadataPtrs.emplace_back(MD); }
125 void clear() { MetadataPtrs.clear(); }
126 Metadata *back() const { return MetadataPtrs.back(); }
127 void pop_back() { MetadataPtrs.pop_back(); }
128 bool empty() const { return MetadataPtrs.empty(); }
129 const_iterator begin() const { return MetadataPtrs.begin(); }
130 const_iterator end() const { return MetadataPtrs.end(); }
131
132 Metadata *operator[](unsigned i) const { return MetadataPtrs[i]; }
133
134 Metadata *lookup(unsigned I) const {
135 if (I < MetadataPtrs.size())
136 return MetadataPtrs[I];
137 return nullptr;
138 }
139
140 void shrinkTo(unsigned N) {
141 assert(N <= size() && "Invalid shrinkTo request!");
142 assert(ForwardReference.empty() && "Unexpected forward refs");
143 assert(UnresolvedNodes.empty() && "Unexpected unresolved node");
144 MetadataPtrs.resize(N);
145 }
146
147 /// Return the given metadata, creating a replaceable forward reference if
148 /// necessary.
149 Metadata *getMetadataFwdRef(unsigned Idx);
150
151 /// Return the given metadata only if it is fully resolved.
152 ///
153 /// Gives the same result as \a lookup(), unless \a MDNode::isResolved()
154 /// would give \c false.
155 Metadata *getMetadataIfResolved(unsigned Idx);
156
157 MDNode *getMDNodeFwdRefOrNull(unsigned Idx);
158 void assignValue(Metadata *MD, unsigned Idx);
159 void tryToResolveCycles();
160 bool hasFwdRefs() const { return !ForwardReference.empty(); }
161 int getNextFwdRef() {
162 assert(hasFwdRefs());
163 return *ForwardReference.begin();
164 }
165
166 /// Upgrade a type that had an MDString reference.
167 void addTypeRef(MDString &UUID, DICompositeType &CT);
168
169 /// Upgrade a type that had an MDString reference.
170 Metadata *upgradeTypeRef(Metadata *MaybeUUID);
171
172 /// Upgrade a type array that may have MDString references.
173 Metadata *upgradeTypeArray(Metadata *MaybeTuple);
174
175private:
176 Metadata *resolveTypeArray(Metadata *MaybeTuple);
177};
178} // namespace
179
180static int64_t unrotateSign(uint64_t U) { return (U & 1) ? ~(U >> 1) : U >> 1; }
181
182void BitcodeReaderMetadataList::assignValue(Metadata *MD, unsigned Idx) {
183 if (auto *MDN = dyn_cast<MDNode>(MD))
184 if (!MDN->isResolved())
185 UnresolvedNodes.insert(Idx);
186
187 if (Idx == size()) {
188 push_back(MD);
189 return;
190 }
191
192 if (Idx >= size())
193 resize(Idx + 1);
194
195 TrackingMDRef &OldMD = MetadataPtrs[Idx];
196 if (!OldMD) {
197 OldMD.reset(MD);
198 return;
199 }
200
201 // If there was a forward reference to this value, replace it.
202 TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));
203 PrevMD->replaceAllUsesWith(MD);
204 ForwardReference.erase(Idx);
205}
206
207Metadata *BitcodeReaderMetadataList::getMetadataFwdRef(unsigned Idx) {
208 // Bail out for a clearly invalid value.
209 if (Idx >= RefsUpperBound)
210 return nullptr;
211
212 if (Idx >= size())
213 resize(Idx + 1);
214
215 if (Metadata *MD = MetadataPtrs[Idx])
216 return MD;
217
218 // Track forward refs to be resolved later.
219 ForwardReference.insert(Idx);
220
221 // Create and return a placeholder, which will later be RAUW'd.
222 ++NumMDNodeTemporary;
224 MetadataPtrs[Idx].reset(MD);
225 return MD;
226}
227
228Metadata *BitcodeReaderMetadataList::getMetadataIfResolved(unsigned Idx) {
229 Metadata *MD = lookup(Idx);
230 if (auto *N = dyn_cast_or_null<MDNode>(MD))
231 if (!N->isResolved())
232 return nullptr;
233 return MD;
234}
235
236MDNode *BitcodeReaderMetadataList::getMDNodeFwdRefOrNull(unsigned Idx) {
237 return dyn_cast_or_null<MDNode>(getMetadataFwdRef(Idx));
238}
239
240void BitcodeReaderMetadataList::tryToResolveCycles() {
241 if (!ForwardReference.empty())
242 // Still forward references... can't resolve cycles.
243 return;
244
245 // Give up on finding a full definition for any forward decls that remain.
246 for (const auto &Ref : OldTypeRefs.FwdDecls)
247 OldTypeRefs.Final.insert(Ref);
248 OldTypeRefs.FwdDecls.clear();
249
250 // Upgrade from old type ref arrays. In strange cases, this could add to
251 // OldTypeRefs.Unknown.
252 for (const auto &Array : OldTypeRefs.Arrays)
253 Array.second->replaceAllUsesWith(resolveTypeArray(Array.first.get()));
254 OldTypeRefs.Arrays.clear();
255
256 // Replace old string-based type refs with the resolved node, if possible.
257 // If we haven't seen the node, leave it to the verifier to complain about
258 // the invalid string reference.
259 for (const auto &Ref : OldTypeRefs.Unknown) {
260 if (DICompositeType *CT = OldTypeRefs.Final.lookup(Ref.first))
261 Ref.second->replaceAllUsesWith(CT);
262 else
263 Ref.second->replaceAllUsesWith(Ref.first);
264 }
265 OldTypeRefs.Unknown.clear();
266
267 if (UnresolvedNodes.empty())
268 // Nothing to do.
269 return;
270
271 // Resolve any cycles.
272 for (unsigned I : UnresolvedNodes) {
273 auto &MD = MetadataPtrs[I];
274 auto *N = dyn_cast_or_null<MDNode>(MD);
275 if (!N)
276 continue;
277
278 assert(!N->isTemporary() && "Unexpected forward reference");
279 N->resolveCycles();
280 }
281
282 // Make sure we return early again until there's another unresolved ref.
283 UnresolvedNodes.clear();
284}
285
286void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
287 DICompositeType &CT) {
288 assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
289 if (CT.isForwardDecl())
290 OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
291 else
292 OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
293}
294
295Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
296 auto *UUID = dyn_cast_or_null<MDString>(MaybeUUID);
297 if (LLVM_LIKELY(!UUID))
298 return MaybeUUID;
299
300 if (auto *CT = OldTypeRefs.Final.lookup(UUID))
301 return CT;
302
303 auto &Ref = OldTypeRefs.Unknown[UUID];
304 if (!Ref)
306 return Ref.get();
307}
308
309Metadata *BitcodeReaderMetadataList::upgradeTypeArray(Metadata *MaybeTuple) {
310 auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
311 if (!Tuple || Tuple->isDistinct())
312 return MaybeTuple;
313
314 // Look through the array immediately if possible.
315 if (!Tuple->isTemporary())
316 return resolveTypeArray(Tuple);
317
318 // Create and return a placeholder to use for now. Eventually
319 // resolveTypeArrays() will be resolve this forward reference.
320 OldTypeRefs.Arrays.emplace_back(
321 std::piecewise_construct, std::forward_as_tuple(Tuple),
322 std::forward_as_tuple(MDTuple::getTemporary(Context, {})));
323 return OldTypeRefs.Arrays.back().second.get();
324}
325
326Metadata *BitcodeReaderMetadataList::resolveTypeArray(Metadata *MaybeTuple) {
327 auto *Tuple = dyn_cast_or_null<MDTuple>(MaybeTuple);
328 if (!Tuple || Tuple->isDistinct())
329 return MaybeTuple;
330
331 // Look through the DITypeArray, upgrading each DIType *.
333 Ops.reserve(Tuple->getNumOperands());
334 for (Metadata *MD : Tuple->operands())
335 Ops.push_back(upgradeTypeRef(MD));
336
337 return MDTuple::get(Context, Ops);
338}
339
340namespace {
341
342class PlaceholderQueue {
343 // Placeholders would thrash around when moved, so store in a std::deque
344 // instead of some sort of vector.
345 std::deque<DistinctMDOperandPlaceholder> PHs;
346
347public:
348 ~PlaceholderQueue() {
349 assert(empty() &&
350 "PlaceholderQueue hasn't been flushed before being destroyed");
351 }
352 bool empty() const { return PHs.empty(); }
353 DistinctMDOperandPlaceholder &getPlaceholderOp(unsigned ID);
354 void flush(BitcodeReaderMetadataList &MetadataList);
355
356 /// Return the list of temporaries nodes in the queue, these need to be
357 /// loaded before we can flush the queue.
358 void getTemporaries(BitcodeReaderMetadataList &MetadataList,
359 DenseSet<unsigned> &Temporaries) {
360 for (auto &PH : PHs) {
361 auto ID = PH.getID();
362 auto *MD = MetadataList.lookup(ID);
363 if (!MD) {
364 Temporaries.insert(ID);
365 continue;
366 }
367 auto *N = dyn_cast_or_null<MDNode>(MD);
368 if (N && N->isTemporary())
369 Temporaries.insert(ID);
370 }
371 }
372};
373
374} // end anonymous namespace
375
376DistinctMDOperandPlaceholder &PlaceholderQueue::getPlaceholderOp(unsigned ID) {
377 PHs.emplace_back(ID);
378 return PHs.back();
379}
380
381void PlaceholderQueue::flush(BitcodeReaderMetadataList &MetadataList) {
382 while (!PHs.empty()) {
383 auto *MD = MetadataList.lookup(PHs.front().getID());
384 assert(MD && "Flushing placeholder on unassigned MD");
385#ifndef NDEBUG
386 if (auto *MDN = dyn_cast<MDNode>(MD))
387 assert(MDN->isResolved() &&
388 "Flushing Placeholder while cycles aren't resolved");
389#endif
390 PHs.front().replaceUseWith(MD);
391 PHs.pop_front();
392 }
393}
394
395static Error error(const Twine &Message) {
398}
399
401 BitcodeReaderMetadataList MetadataList;
402 BitcodeReaderValueList &ValueList;
403 BitstreamCursor &Stream;
404 LLVMContext &Context;
405 Module &TheModule;
406 MetadataLoaderCallbacks Callbacks;
407
408 /// Cursor associated with the lazy-loading of Metadata. This is the easy way
409 /// to keep around the right "context" (Abbrev list) to be able to jump in
410 /// the middle of the metadata block and load any record.
411 BitstreamCursor IndexCursor;
412
413 /// Index that keeps track of MDString values.
414 std::vector<StringRef> MDStringRef;
415
416 /// On-demand loading of a single MDString. Requires the index above to be
417 /// populated.
418 MDString *lazyLoadOneMDString(unsigned Idx);
419
420 /// Index that keeps track of where to find a metadata record in the stream.
421 std::vector<uint64_t> GlobalMetadataBitPosIndex;
422
423 /// Cursor position of the start of the global decl attachments, to enable
424 /// loading using the index built for lazy loading, instead of forward
425 /// references.
426 uint64_t GlobalDeclAttachmentPos = 0;
427
428#ifndef NDEBUG
429 /// Baisic correctness check that we end up parsing all of the global decl
430 /// attachments.
431 unsigned NumGlobalDeclAttachSkipped = 0;
432 unsigned NumGlobalDeclAttachParsed = 0;
433#endif
434
435 /// Load the global decl attachments, using the index built for lazy loading.
436 Expected<bool> loadGlobalDeclAttachments();
437
438 /// Populate the index above to enable lazily loading of metadata, and load
439 /// the named metadata as well as the transitively referenced global
440 /// Metadata.
441 Expected<bool> lazyLoadModuleMetadataBlock();
442
443 /// On-demand loading of a single metadata. Requires the index above to be
444 /// populated.
445 void lazyLoadOneMetadata(unsigned Idx, PlaceholderQueue &Placeholders);
446
447 // Keep mapping of seens pair of old-style CU <-> SP, and update pointers to
448 // point from SP to CU after a block is completly parsed.
449 std::vector<std::pair<DICompileUnit *, unsigned>> CUSubprograms;
450
451 /// Functions that need to be matched with subprograms when upgrading old
452 /// metadata.
454
455 /// retainedNodes of these subprograms should be cleaned up from incorrectly
456 /// scoped local types.
457 /// See \ref DISubprogram::cleanupRetainedNodes.
458 SmallVector<DISubprogram *> NewDistinctSPs;
459
460 // Map the bitcode's custom MDKind ID to the Module's MDKind ID.
462
463 bool StripTBAA = false;
464 bool HasSeenOldLoopTags = false;
465 bool NeedUpgradeToDIGlobalVariableExpression = false;
466 bool NeedDeclareExpressionUpgrade = false;
467
468 /// Map DIGlobalVariable to generated DIGlobalVariable, if any.
470 GlobalVariableExpression;
471
472 /// Map DILocalScope to the enclosing DISubprogram, if any.
474
475 /// True if metadata is being parsed for a module being ThinLTO imported.
476 bool IsImporting = false;
477
478 Error parseOneMetadata(SmallVectorImpl<uint64_t> &Record, unsigned Code,
479 PlaceholderQueue &Placeholders, StringRef Blob,
480 unsigned &NextMetadataNo);
481 Error parseMetadataStrings(ArrayRef<uint64_t> Record, StringRef Blob,
482 function_ref<void(StringRef)> CallBack);
483 Error parseGlobalObjectAttachment(GlobalObject &GO,
485 Error parseMetadataKindRecord(SmallVectorImpl<uint64_t> &Record);
486
487 void resolveForwardRefsAndPlaceholders(PlaceholderQueue &Placeholders);
488
489 /// Upgrade old-style CU <-> SP pointers to point from SP to CU.
490 void upgradeCUSubprograms() {
491 for (auto CU_SP : CUSubprograms)
492 if (auto *SPs =
493 dyn_cast_or_null<MDTuple>(MetadataList.lookup(CU_SP.second - 1)))
494 for (auto &Op : SPs->operands())
495 if (auto *SP = dyn_cast_or_null<DISubprogram>(Op))
496 SP->replaceUnit(CU_SP.first);
497 CUSubprograms.clear();
498 }
499
500 /// Upgrade old-style bare DIGlobalVariables to DIGlobalVariableExpressions.
501 void upgradeCUVariables() {
502 if (!NeedUpgradeToDIGlobalVariableExpression)
503 return;
504
505 // Upgrade list of variables attached to the CUs.
506 if (NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu"))
507 for (unsigned I = 0, E = CUNodes->getNumOperands(); I != E; ++I) {
508 auto *CU = cast<DICompileUnit>(CUNodes->getOperand(I));
509 if (auto *GVs = dyn_cast_or_null<MDTuple>(CU->getRawGlobalVariables()))
510 for (unsigned I = 0; I < GVs->getNumOperands(); I++)
511 if (auto *GV =
512 dyn_cast_or_null<DIGlobalVariable>(GVs->getOperand(I))) {
513 DIGlobalVariableExpression *&DGVE = GlobalVariableExpression[GV];
514 if (!DGVE) {
516 Context, GV, DIExpression::get(Context, {}));
517 }
518 GVs->replaceOperandWith(I, DGVE);
519 }
520 }
521
522 // Upgrade variables attached to globals.
523 for (auto &GV : TheModule.globals()) {
525 GV.getMetadata(LLVMContext::MD_dbg, MDs);
526 GV.eraseMetadata(LLVMContext::MD_dbg);
527 for (auto *MD : MDs)
528 if (auto *DGV = dyn_cast<DIGlobalVariable>(MD)) {
529 DIGlobalVariableExpression *&DGVE = GlobalVariableExpression[DGV];
530 if (!DGVE) {
532 Context, DGV, DIExpression::get(Context, {}));
533 }
534 GV.addMetadata(LLVMContext::MD_dbg, *DGVE);
535 } else
536 GV.addMetadata(LLVMContext::MD_dbg, *MD);
537 }
538 }
539
540 DISubprogram *findEnclosingSubprogram(DILocalScope *S) {
541 if (!S)
542 return nullptr;
543 if (auto *SP = ParentSubprogram[S]) {
544 return SP;
545 }
546
547 DILocalScope *InitialScope = S;
549 while (S && !isa<DISubprogram>(S)) {
551 if (!Visited.insert(S).second)
552 break;
553 }
554
555 return ParentSubprogram[InitialScope] =
557 }
558
559 /// Map SP -> {Metadata} to store CU locals that should be attached to
560 /// subprogram retainedNodes list during CU upgrade.
561 using SPToEntitiesMap =
563
564 /// Retrieve the CU operand at position ListIndex, treat it as an MDTuple, and
565 /// remove all local debug info nodes from it. Fill SPToEntities map with
566 /// removed local nodes.
567 template <typename NodeT>
568 void upgradeOneCULocalsList(SPToEntitiesMap &SPToEntities, DICompileUnit *CU,
569 unsigned ListIndex) {
570 MDTuple *List = cast_if_present<MDTuple>(CU->getOperand(ListIndex));
571 if (!List)
572 return;
573
574 if (llvm::all_of(List->operands(), [](Metadata *MD) {
575 return !isa_and_nonnull<DILocalScope>(getScope(cast<NodeT>(MD)));
576 }))
577 return;
578
580 for (Metadata *MD : List->operands()) {
581 DILocalScope *LS =
583 if (!LS)
584 MDs.push_back(MD);
585 else if (auto *SP = findEnclosingSubprogram(LS))
586 SPToEntities[SP].push_back(MD);
587 }
588
589 CU->replaceOperandWith(ListIndex, MDNode::get(CU->getContext(), MDs));
590 }
591
592 /// Move function-local entities from DICompileUnit's 'imports',
593 /// 'enums', and 'globals' fields to DISubprogram's retainedNodes.
594 void upgradeCULocals() {
595 NamedMDNode *CUNodes = TheModule.getNamedMetadata("llvm.dbg.cu");
596 if (!CUNodes)
597 return;
598
599 SPToEntitiesMap SPToEntities;
600 for (MDNode *N : CUNodes->operands()) {
602 if (!CU)
603 continue;
604
605 // Remove all static local variables from CU's globals list.
606 upgradeOneCULocalsList<DIGlobalVariableExpression>(SPToEntities, CU, 6);
607 // Remove all local imports from CU's imports list.
608 upgradeOneCULocalsList<DIImportedEntity>(SPToEntities, CU, 7);
609 // Remove all local types from CU's enums list.
610 upgradeOneCULocalsList<DICompositeType>(SPToEntities, CU, 4);
611
612 // Retain local entities removed from the CU in their corresponding
613 // subprograms.
614 for (auto &[SP, Nodes] : SPToEntities)
615 SP->retainNodes(Nodes.begin(), Nodes.end());
616 SPToEntities.clear();
617 }
618
619 ParentSubprogram.clear();
620 }
621
622 /// Remove a leading DW_OP_deref from DIExpressions in a dbg.declare that
623 /// describes a function argument.
624 void upgradeDeclareExpressions(Function &F) {
625 if (!NeedDeclareExpressionUpgrade)
626 return;
627
628 auto UpdateDeclareIfNeeded = [&](auto *Declare) {
629 auto *DIExpr = Declare->getExpression();
630 if (!DIExpr || !DIExpr->startsWithDeref() ||
631 !isa_and_nonnull<Argument>(Declare->getAddress()))
632 return;
634 Ops.append(std::next(DIExpr->elements_begin()), DIExpr->elements_end());
635 Declare->setExpression(DIExpression::get(Context, Ops));
636 };
637
638 for (auto &BB : F)
639 for (auto &I : BB) {
640 for (DbgVariableRecord &DVR : filterDbgVars(I.getDbgRecordRange())) {
641 if (DVR.isDbgDeclare())
642 UpdateDeclareIfNeeded(&DVR);
643 }
644 if (auto *DDI = dyn_cast<DbgDeclareInst>(&I))
645 UpdateDeclareIfNeeded(DDI);
646 }
647 }
648
649 /// Upgrade the expression from previous versions.
650 Error upgradeDIExpression(uint64_t FromVersion,
653 auto N = Expr.size();
654 switch (FromVersion) {
655 default:
656 return error("Invalid record");
657 case 0:
658 if (N >= 3 && Expr[N - 3] == dwarf::DW_OP_bit_piece)
659 Expr[N - 3] = dwarf::DW_OP_LLVM_fragment;
660 [[fallthrough]];
661 case 1:
662 // Move DW_OP_deref to the end.
663 if (N && Expr[0] == dwarf::DW_OP_deref) {
664 auto End = Expr.end();
665 if (Expr.size() >= 3 &&
666 *std::prev(End, 3) == dwarf::DW_OP_LLVM_fragment)
667 End = std::prev(End, 3);
668 std::move(std::next(Expr.begin()), End, Expr.begin());
669 *std::prev(End) = dwarf::DW_OP_deref;
670 }
671 NeedDeclareExpressionUpgrade = true;
672 [[fallthrough]];
673 case 2: {
674 // Change DW_OP_plus to DW_OP_plus_uconst.
675 // Change DW_OP_minus to DW_OP_uconst, DW_OP_minus
676 auto SubExpr = ArrayRef<uint64_t>(Expr);
677 while (!SubExpr.empty()) {
678 // Skip past other operators with their operands
679 // for this version of the IR, obtained from
680 // from historic DIExpression::ExprOperand::getSize().
681 size_t HistoricSize;
682 switch (SubExpr.front()) {
683 default:
684 HistoricSize = 1;
685 break;
686 case dwarf::DW_OP_constu:
687 case dwarf::DW_OP_minus:
688 case dwarf::DW_OP_plus:
689 HistoricSize = 2;
690 break;
692 HistoricSize = 3;
693 break;
694 }
695
696 // If the expression is malformed, make sure we don't
697 // copy more elements than we should.
698 HistoricSize = std::min(SubExpr.size(), HistoricSize);
699 ArrayRef<uint64_t> Args = SubExpr.slice(1, HistoricSize - 1);
700
701 switch (SubExpr.front()) {
702 case dwarf::DW_OP_plus:
703 Buffer.push_back(dwarf::DW_OP_plus_uconst);
704 Buffer.append(Args.begin(), Args.end());
705 break;
706 case dwarf::DW_OP_minus:
707 Buffer.push_back(dwarf::DW_OP_constu);
708 Buffer.append(Args.begin(), Args.end());
709 Buffer.push_back(dwarf::DW_OP_minus);
710 break;
711 default:
712 Buffer.push_back(*SubExpr.begin());
713 Buffer.append(Args.begin(), Args.end());
714 break;
715 }
716
717 // Continue with remaining elements.
718 SubExpr = SubExpr.slice(HistoricSize);
719 }
720 Expr = MutableArrayRef<uint64_t>(Buffer);
721 [[fallthrough]];
722 }
723 case 3:
724 // Up-to-date!
725 break;
726 }
727
728 return Error::success();
729 }
730
731 /// Specifies which kind of debug info upgrade should be performed.
732 ///
733 /// The upgrade of compile units' enums: and imports: fields is performed
734 /// only when module level metadata block is loaded (i.e. all elements of
735 /// "llvm.dbg.cu" named metadata node are loaded).
736 enum class DebugInfoUpgradeMode {
737 /// No debug info upgrade.
738 None,
739 /// Debug info upgrade after loading function-level metadata block.
740 Partial,
741 /// Debug info upgrade after loading module-level metadata block.
742 ModuleLevel,
743 };
744
745 void upgradeDebugInfo(DebugInfoUpgradeMode Mode) {
746 if (Mode == DebugInfoUpgradeMode::None)
747 return;
748 upgradeCUSubprograms();
749 upgradeCUVariables();
750 if (Mode == DebugInfoUpgradeMode::ModuleLevel)
751 upgradeCULocals();
752 }
753
754 /// Prepare loaded metadata nodes to be used by loader clients.
755 void resolveLoadedMetadata(PlaceholderQueue &Placeholders,
756 DebugInfoUpgradeMode DIUpgradeMode) {
757 resolveForwardRefsAndPlaceholders(Placeholders);
758 upgradeDebugInfo(DIUpgradeMode);
760 LLVM_DEBUG(llvm::dbgs() << "Resolved loaded metadata. Cleaned up "
761 << NewDistinctSPs.size() << " subprogram(s).\n");
762 NewDistinctSPs.clear();
763 }
764
765 void callMDTypeCallback(Metadata **Val, unsigned TypeID);
766
767public:
769 BitcodeReaderValueList &ValueList,
770 MetadataLoaderCallbacks Callbacks, bool IsImporting)
771 : MetadataList(TheModule.getContext(), Stream.SizeInBytes()),
772 ValueList(ValueList), Stream(Stream), Context(TheModule.getContext()),
773 TheModule(TheModule), Callbacks(std::move(Callbacks)),
774 IsImporting(IsImporting) {}
775
776 Error parseMetadata(bool ModuleLevel);
777
778 bool hasFwdRefs() const { return MetadataList.hasFwdRefs(); }
779
781 if (ID < MDStringRef.size())
782 return lazyLoadOneMDString(ID);
783 if (auto *MD = MetadataList.lookup(ID))
784 return MD;
785 // If lazy-loading is enabled, we try recursively to load the operand
786 // instead of creating a temporary.
787 if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
788 PlaceholderQueue Placeholders;
789 lazyLoadOneMetadata(ID, Placeholders);
790 LLVM_DEBUG(llvm::dbgs() << "\nLazy metadata loading: ");
791 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
792 return MetadataList.lookup(ID);
793 }
794 return MetadataList.getMetadataFwdRef(ID);
795 }
796
798 return FunctionsWithSPs.lookup(F);
799 }
800
801 bool hasSeenOldLoopTags() const { return HasSeenOldLoopTags; }
802
804 ArrayRef<Instruction *> InstructionList);
805
807
808 void setStripTBAA(bool Value) { StripTBAA = Value; }
809 bool isStrippingTBAA() const { return StripTBAA; }
810
811 unsigned size() const { return MetadataList.size(); }
812 void shrinkTo(unsigned N) { MetadataList.shrinkTo(N); }
813 void upgradeDebugIntrinsics(Function &F) { upgradeDeclareExpressions(F); }
814};
815
817MetadataLoader::MetadataLoaderImpl::lazyLoadModuleMetadataBlock() {
818 IndexCursor = Stream;
820 GlobalDeclAttachmentPos = 0;
821 // Get the abbrevs, and preload record positions to make them lazy-loadable.
822 while (true) {
823 uint64_t SavedPos = IndexCursor.GetCurrentBitNo();
824 BitstreamEntry Entry;
825 if (Error E =
826 IndexCursor
827 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
828 .moveInto(Entry))
829 return std::move(E);
830
831 switch (Entry.Kind) {
832 case BitstreamEntry::SubBlock: // Handled for us already.
834 return error("Malformed block");
836 return true;
837 }
839 // The interesting case.
840 ++NumMDRecordLoaded;
841 uint64_t CurrentPos = IndexCursor.GetCurrentBitNo();
842 unsigned Code;
843 if (Error E = IndexCursor.skipRecord(Entry.ID).moveInto(Code))
844 return std::move(E);
845 switch (Code) {
847 // Rewind and parse the strings.
848 if (Error Err = IndexCursor.JumpToBit(CurrentPos))
849 return std::move(Err);
850 StringRef Blob;
851 Record.clear();
852 if (Expected<unsigned> MaybeRecord =
853 IndexCursor.readRecord(Entry.ID, Record, &Blob))
854 ;
855 else
856 return MaybeRecord.takeError();
857 unsigned NumStrings = Record[0];
858 MDStringRef.reserve(NumStrings);
859 auto IndexNextMDString = [&](StringRef Str) {
860 MDStringRef.push_back(Str);
861 };
862 if (auto Err = parseMetadataStrings(Record, Blob, IndexNextMDString))
863 return std::move(Err);
864 break;
865 }
867 // This is the offset to the index, when we see this we skip all the
868 // records and load only an index to these.
869 if (Error Err = IndexCursor.JumpToBit(CurrentPos))
870 return std::move(Err);
871 Record.clear();
872 if (Expected<unsigned> MaybeRecord =
873 IndexCursor.readRecord(Entry.ID, Record))
874 ;
875 else
876 return MaybeRecord.takeError();
877 if (Record.size() != 2)
878 return error("Invalid record");
879 auto Offset = Record[0] + (Record[1] << 32);
880 auto BeginPos = IndexCursor.GetCurrentBitNo();
881 if (Error Err = IndexCursor.JumpToBit(BeginPos + Offset))
882 return std::move(Err);
883 Expected<BitstreamEntry> MaybeEntry =
884 IndexCursor.advanceSkippingSubblocks(
886 if (!MaybeEntry)
887 return MaybeEntry.takeError();
888 Entry = MaybeEntry.get();
890 "Corrupted bitcode: Expected `Record` when trying to find the "
891 "Metadata index");
892 Record.clear();
893 if (Expected<unsigned> MaybeCode =
894 IndexCursor.readRecord(Entry.ID, Record))
895 assert(MaybeCode.get() == bitc::METADATA_INDEX &&
896 "Corrupted bitcode: Expected `METADATA_INDEX` when trying to "
897 "find the Metadata index");
898 else
899 return MaybeCode.takeError();
900 // Delta unpack
901 auto CurrentValue = BeginPos;
902 GlobalMetadataBitPosIndex.reserve(Record.size());
903 for (auto &Elt : Record) {
904 CurrentValue += Elt;
905 GlobalMetadataBitPosIndex.push_back(CurrentValue);
906 }
907 break;
908 }
910 // We don't expect to get there, the Index is loaded when we encounter
911 // the offset.
912 return error("Corrupted Metadata block");
913 case bitc::METADATA_NAME: {
914 // Named metadata need to be materialized now and aren't deferred.
915 if (Error Err = IndexCursor.JumpToBit(CurrentPos))
916 return std::move(Err);
917 Record.clear();
918
919 unsigned Code;
920 if (Expected<unsigned> MaybeCode =
921 IndexCursor.readRecord(Entry.ID, Record)) {
922 Code = MaybeCode.get();
924 } else
925 return MaybeCode.takeError();
926
927 // Read name of the named metadata.
928 SmallString<8> Name(Record.begin(), Record.end());
929 if (Expected<unsigned> MaybeCode = IndexCursor.ReadCode())
930 Code = MaybeCode.get();
931 else
932 return MaybeCode.takeError();
933
934 // Named Metadata comes in two parts, we expect the name to be followed
935 // by the node
936 Record.clear();
937 if (Expected<unsigned> MaybeNextBitCode =
938 IndexCursor.readRecord(Code, Record))
939 assert(MaybeNextBitCode.get() == bitc::METADATA_NAMED_NODE);
940 else
941 return MaybeNextBitCode.takeError();
942
943 // Read named metadata elements.
944 unsigned Size = Record.size();
945 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
946 for (unsigned i = 0; i != Size; ++i) {
947 // FIXME: We could use a placeholder here, however NamedMDNode are
948 // taking MDNode as operand and not using the Metadata infrastructure.
949 // It is acknowledged by 'TODO: Inherit from Metadata' in the
950 // NamedMDNode class definition.
951 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
952 assert(MD && "Invalid metadata: expect fwd ref to MDNode");
953 NMD->addOperand(MD);
954 }
955 break;
956 }
958 if (!GlobalDeclAttachmentPos)
959 GlobalDeclAttachmentPos = SavedPos;
960#ifndef NDEBUG
961 NumGlobalDeclAttachSkipped++;
962#endif
963 break;
964 }
1003 // We don't expect to see any of these, if we see one, give up on
1004 // lazy-loading and fallback.
1005 MDStringRef.clear();
1006 GlobalMetadataBitPosIndex.clear();
1007 return false;
1008 }
1009 break;
1010 }
1011 }
1012 }
1013}
1014
1015// Load the global decl attachments after building the lazy loading index.
1016// We don't load them "lazily" - all global decl attachments must be
1017// parsed since they aren't materialized on demand. However, by delaying
1018// their parsing until after the index is created, we can use the index
1019// instead of creating temporaries.
1020Expected<bool> MetadataLoader::MetadataLoaderImpl::loadGlobalDeclAttachments() {
1021 // Nothing to do if we didn't find any of these metadata records.
1022 if (!GlobalDeclAttachmentPos)
1023 return true;
1024 // Use a temporary cursor so that we don't mess up the main Stream cursor or
1025 // the lazy loading IndexCursor (which holds the necessary abbrev ids).
1026 BitstreamCursor TempCursor = Stream;
1027 SmallVector<uint64_t, 64> Record;
1028 // Jump to the position before the first global decl attachment, so we can
1029 // scan for the first BitstreamEntry record.
1030 if (Error Err = TempCursor.JumpToBit(GlobalDeclAttachmentPos))
1031 return std::move(Err);
1032 while (true) {
1033 BitstreamEntry Entry;
1034 if (Error E =
1035 TempCursor
1036 .advanceSkippingSubblocks(BitstreamCursor::AF_DontPopBlockAtEnd)
1037 .moveInto(Entry))
1038 return std::move(E);
1039
1040 switch (Entry.Kind) {
1041 case BitstreamEntry::SubBlock: // Handled for us already.
1043 return error("Malformed block");
1045 // Check that we parsed them all.
1046 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1047 return true;
1049 break;
1050 }
1051 uint64_t CurrentPos = TempCursor.GetCurrentBitNo();
1052 Expected<unsigned> MaybeCode = TempCursor.skipRecord(Entry.ID);
1053 if (!MaybeCode)
1054 return MaybeCode.takeError();
1055 if (MaybeCode.get() != bitc::METADATA_GLOBAL_DECL_ATTACHMENT) {
1056 // Anything other than a global decl attachment signals the end of
1057 // these records. Check that we parsed them all.
1058 assert(NumGlobalDeclAttachSkipped == NumGlobalDeclAttachParsed);
1059 return true;
1060 }
1061#ifndef NDEBUG
1062 NumGlobalDeclAttachParsed++;
1063#endif
1064 // FIXME: we need to do this early because we don't materialize global
1065 // value explicitly.
1066 if (Error Err = TempCursor.JumpToBit(CurrentPos))
1067 return std::move(Err);
1068 Record.clear();
1069 if (Expected<unsigned> MaybeRecord =
1070 TempCursor.readRecord(Entry.ID, Record))
1071 ;
1072 else
1073 return MaybeRecord.takeError();
1074 if (Record.size() % 2 == 0)
1075 return error("Invalid record");
1076 unsigned ValueID = Record[0];
1077 if (ValueID >= ValueList.size())
1078 return error("Invalid record");
1079 if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID])) {
1080 // Need to save and restore the current position since
1081 // parseGlobalObjectAttachment will resolve all forward references which
1082 // would require parsing from locations stored in the index.
1083 CurrentPos = TempCursor.GetCurrentBitNo();
1084 if (Error Err = parseGlobalObjectAttachment(
1085 *GO, ArrayRef<uint64_t>(Record).slice(1)))
1086 return std::move(Err);
1087 if (Error Err = TempCursor.JumpToBit(CurrentPos))
1088 return std::move(Err);
1089 }
1090 }
1091}
1092
1093void MetadataLoader::MetadataLoaderImpl::callMDTypeCallback(Metadata **Val,
1094 unsigned TypeID) {
1095 if (Callbacks.MDType) {
1096 (*Callbacks.MDType)(Val, TypeID, Callbacks.GetTypeByID,
1097 Callbacks.GetContainedTypeID);
1098 }
1099}
1100
1101/// Parse a METADATA_BLOCK. If ModuleLevel is true then we are parsing
1102/// module level metadata.
1104 llvm::TimeTraceScope timeScope("Parse metadata");
1105 if (!ModuleLevel && MetadataList.hasFwdRefs())
1106 return error("Invalid metadata: fwd refs into function blocks");
1107
1108 // Record the entry position so that we can jump back here and efficiently
1109 // skip the whole block in case we lazy-load.
1110 auto EntryPos = Stream.GetCurrentBitNo();
1111
1112 if (Error Err = Stream.EnterSubBlock(bitc::METADATA_BLOCK_ID))
1113 return Err;
1114
1116 PlaceholderQueue Placeholders;
1117 auto DIUpgradeMode = ModuleLevel ? DebugInfoUpgradeMode::ModuleLevel
1118 : DebugInfoUpgradeMode::Partial;
1119
1120 // We lazy-load module-level metadata: we build an index for each record, and
1121 // then load individual record as needed, starting with the named metadata.
1122 if (ModuleLevel && IsImporting && MetadataList.empty() &&
1124 auto SuccessOrErr = lazyLoadModuleMetadataBlock();
1125 if (!SuccessOrErr)
1126 return SuccessOrErr.takeError();
1127 if (SuccessOrErr.get()) {
1128 // An index was successfully created and we will be able to load metadata
1129 // on-demand.
1130 MetadataList.resize(MDStringRef.size() +
1131 GlobalMetadataBitPosIndex.size());
1132
1133 // Now that we have built the index, load the global decl attachments
1134 // that were deferred during that process. This avoids creating
1135 // temporaries.
1136 SuccessOrErr = loadGlobalDeclAttachments();
1137 if (!SuccessOrErr)
1138 return SuccessOrErr.takeError();
1139 assert(SuccessOrErr.get());
1140
1141 // Reading the named metadata created forward references and/or
1142 // placeholders, that we flush here.
1143 LLVM_DEBUG(llvm::dbgs() << "\nNamed metadata loading: ");
1144 resolveLoadedMetadata(Placeholders, DIUpgradeMode);
1145 // Return at the beginning of the block, since it is easy to skip it
1146 // entirely from there.
1147 Stream.ReadBlockEnd(); // Pop the abbrev block context.
1148 if (Error Err = IndexCursor.JumpToBit(EntryPos))
1149 return Err;
1150 if (Error Err = Stream.SkipBlock()) {
1151 // FIXME this drops the error on the floor, which
1152 // ThinLTO/X86/debuginfo-cu-import.ll relies on.
1153 consumeError(std::move(Err));
1154 return Error::success();
1155 }
1156 return Error::success();
1157 }
1158 // Couldn't load an index, fallback to loading all the block "old-style".
1159 }
1160
1161 unsigned NextMetadataNo = MetadataList.size();
1162
1163 // Read all the records.
1164 while (true) {
1165 BitstreamEntry Entry;
1166 if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
1167 return E;
1168
1169 switch (Entry.Kind) {
1170 case BitstreamEntry::SubBlock: // Handled for us already.
1172 return error("Malformed block");
1174 LLVM_DEBUG(llvm::dbgs() << "\nEager metadata loading: ");
1175 resolveLoadedMetadata(Placeholders, DIUpgradeMode);
1176 return Error::success();
1178 // The interesting case.
1179 break;
1180 }
1181
1182 // Read a record.
1183 Record.clear();
1184 StringRef Blob;
1185 ++NumMDRecordLoaded;
1186 if (Expected<unsigned> MaybeCode =
1187 Stream.readRecord(Entry.ID, Record, &Blob)) {
1188 if (Error Err = parseOneMetadata(Record, MaybeCode.get(), Placeholders,
1189 Blob, NextMetadataNo))
1190 return Err;
1191 } else
1192 return MaybeCode.takeError();
1193 }
1194}
1195
1196MDString *MetadataLoader::MetadataLoaderImpl::lazyLoadOneMDString(unsigned ID) {
1197 ++NumMDStringLoaded;
1198 if (Metadata *MD = MetadataList.lookup(ID))
1199 return cast<MDString>(MD);
1200 auto MDS = MDString::get(Context, MDStringRef[ID]);
1201 MetadataList.assignValue(MDS, ID);
1202 return MDS;
1203}
1204
1205void MetadataLoader::MetadataLoaderImpl::lazyLoadOneMetadata(
1206 unsigned ID, PlaceholderQueue &Placeholders) {
1207 assert(ID < (MDStringRef.size()) + GlobalMetadataBitPosIndex.size());
1208 assert(ID >= MDStringRef.size() && "Unexpected lazy-loading of MDString");
1209 // Lookup first if the metadata hasn't already been loaded.
1210 if (auto *MD = MetadataList.lookup(ID)) {
1211 auto *N = dyn_cast<MDNode>(MD);
1212 // If the node is not an MDNode, or if it is not temporary, then
1213 // we're done.
1214 if (!N || !N->isTemporary())
1215 return;
1216 }
1218 StringRef Blob;
1219 if (Error Err = IndexCursor.JumpToBit(
1220 GlobalMetadataBitPosIndex[ID - MDStringRef.size()]))
1221 report_fatal_error("lazyLoadOneMetadata failed jumping: " +
1222 Twine(toString(std::move(Err))));
1223 BitstreamEntry Entry;
1224 if (Error E = IndexCursor.advanceSkippingSubblocks().moveInto(Entry))
1225 // FIXME this drops the error on the floor.
1226 report_fatal_error("lazyLoadOneMetadata failed advanceSkippingSubblocks: " +
1227 Twine(toString(std::move(E))));
1228 ++NumMDRecordLoaded;
1229 if (Expected<unsigned> MaybeCode =
1230 IndexCursor.readRecord(Entry.ID, Record, &Blob)) {
1231 if (Error Err =
1232 parseOneMetadata(Record, MaybeCode.get(), Placeholders, Blob, ID))
1233 report_fatal_error("Can't lazyload MD, parseOneMetadata: " +
1234 Twine(toString(std::move(Err))));
1235 } else
1236 report_fatal_error("Can't lazyload MD: " +
1237 Twine(toString(MaybeCode.takeError())));
1238}
1239
1240/// Ensure that all forward-references and placeholders are resolved.
1241/// Iteratively lazy-loading metadata on-demand if needed.
1242void MetadataLoader::MetadataLoaderImpl::resolveForwardRefsAndPlaceholders(
1243 PlaceholderQueue &Placeholders) {
1244 DenseSet<unsigned> Temporaries;
1245 while (true) {
1246 // Populate Temporaries with the placeholders that haven't been loaded yet.
1247 Placeholders.getTemporaries(MetadataList, Temporaries);
1248
1249 // If we don't have any temporary, or FwdReference, we're done!
1250 if (Temporaries.empty() && !MetadataList.hasFwdRefs())
1251 break;
1252
1253 // First, load all the temporaries. This can add new placeholders or
1254 // forward references.
1255 for (auto ID : Temporaries)
1256 lazyLoadOneMetadata(ID, Placeholders);
1257 Temporaries.clear();
1258
1259 // Second, load the forward-references. This can also add new placeholders
1260 // or forward references.
1261 while (MetadataList.hasFwdRefs())
1262 lazyLoadOneMetadata(MetadataList.getNextFwdRef(), Placeholders);
1263 }
1264 // At this point we don't have any forward reference remaining, or temporary
1265 // that haven't been loaded. We can safely drop RAUW support and mark cycles
1266 // as resolved.
1267 MetadataList.tryToResolveCycles();
1268
1269 // Finally, everything is in place, we can replace the placeholders operands
1270 // with the final node they refer to.
1271 Placeholders.flush(MetadataList);
1272}
1273
1274static Value *getValueFwdRef(BitcodeReaderValueList &ValueList, unsigned Idx,
1275 Type *Ty, unsigned TyID) {
1276 Value *V = ValueList.getValueFwdRef(Idx, Ty, TyID,
1277 /*ConstExprInsertBB*/ nullptr);
1278 if (V)
1279 return V;
1280
1281 // This is a reference to a no longer supported constant expression.
1282 // Pretend that the constant was deleted, which will replace metadata
1283 // references with poison.
1284 // TODO: This is a rather indirect check. It would be more elegant to use
1285 // a separate ErrorInfo for constant materialization failure and thread
1286 // the error reporting through getValueFwdRef().
1287 if (Idx < ValueList.size() && ValueList[Idx] &&
1288 ValueList[Idx]->getType() == Ty)
1289 return PoisonValue::get(Ty);
1290
1291 return nullptr;
1292}
1293
1294Error MetadataLoader::MetadataLoaderImpl::parseOneMetadata(
1295 SmallVectorImpl<uint64_t> &Record, unsigned Code,
1296 PlaceholderQueue &Placeholders, StringRef Blob, unsigned &NextMetadataNo) {
1297
1298 bool IsDistinct = false;
1299 auto getMD = [&](unsigned ID) -> Metadata * {
1300 if (ID < MDStringRef.size())
1301 return lazyLoadOneMDString(ID);
1302 if (!IsDistinct) {
1303 if (auto *MD = MetadataList.lookup(ID))
1304 return MD;
1305 // If lazy-loading is enabled, we try recursively to load the operand
1306 // instead of creating a temporary.
1307 if (ID < (MDStringRef.size() + GlobalMetadataBitPosIndex.size())) {
1308 // Create a temporary for the node that is referencing the operand we
1309 // will lazy-load. It is needed before recursing in case there are
1310 // uniquing cycles.
1311 MetadataList.getMetadataFwdRef(NextMetadataNo);
1312 lazyLoadOneMetadata(ID, Placeholders);
1313 return MetadataList.lookup(ID);
1314 }
1315 // Return a temporary.
1316 return MetadataList.getMetadataFwdRef(ID);
1317 }
1318 if (auto *MD = MetadataList.getMetadataIfResolved(ID))
1319 return MD;
1320 return &Placeholders.getPlaceholderOp(ID);
1321 };
1322 auto getMDOrNull = [&](unsigned ID) -> Metadata * {
1323 if (ID)
1324 return getMD(ID - 1);
1325 return nullptr;
1326 };
1327 auto getMDString = [&](unsigned ID) -> MDString * {
1328 // This requires that the ID is not really a forward reference. In
1329 // particular, the MDString must already have been resolved.
1330 auto MDS = getMDOrNull(ID);
1331 return cast_or_null<MDString>(MDS);
1332 };
1333
1334 // Support for old type refs.
1335 auto getDITypeRefOrNull = [&](unsigned ID) {
1336 return MetadataList.upgradeTypeRef(getMDOrNull(ID));
1337 };
1338
1339 auto getMetadataOrConstant = [&](bool IsMetadata,
1340 uint64_t Entry) -> Metadata * {
1341 if (IsMetadata)
1342 return getMDOrNull(Entry);
1344 ConstantInt::get(Type::getInt64Ty(Context), Entry));
1345 };
1346
1347#define GET_OR_DISTINCT(CLASS, ARGS) \
1348 (IsDistinct ? CLASS::getDistinct ARGS : CLASS::get ARGS)
1349
1350 switch (Code) {
1351 default: // Default behavior: ignore.
1352 break;
1353 case bitc::METADATA_NAME: {
1354 // Read name of the named metadata.
1355 SmallString<8> Name(Record.begin(), Record.end());
1356 Record.clear();
1357 if (Error E = Stream.ReadCode().moveInto(Code))
1358 return E;
1359
1360 ++NumMDRecordLoaded;
1361 if (Expected<unsigned> MaybeNextBitCode = Stream.readRecord(Code, Record)) {
1362 if (MaybeNextBitCode.get() != bitc::METADATA_NAMED_NODE)
1363 return error("METADATA_NAME not followed by METADATA_NAMED_NODE");
1364 } else
1365 return MaybeNextBitCode.takeError();
1366
1367 // Read named metadata elements.
1368 unsigned Size = Record.size();
1369 NamedMDNode *NMD = TheModule.getOrInsertNamedMetadata(Name);
1370 for (unsigned i = 0; i != Size; ++i) {
1371 MDNode *MD = MetadataList.getMDNodeFwdRefOrNull(Record[i]);
1372 if (!MD)
1373 return error("Invalid named metadata: expect fwd ref to MDNode");
1374 NMD->addOperand(MD);
1375 }
1376 break;
1377 }
1379 // Deprecated, but still needed to read old bitcode files.
1380 // This is a LocalAsMetadata record, the only type of function-local
1381 // metadata.
1382 if (Record.size() % 2 == 1)
1383 return error("Invalid record");
1384
1385 // If this isn't a LocalAsMetadata record, we're dropping it. This used
1386 // to be legal, but there's no upgrade path.
1387 auto dropRecord = [&] {
1388 MetadataList.assignValue(MDNode::get(Context, {}), NextMetadataNo);
1389 NextMetadataNo++;
1390 };
1391 if (Record.size() != 2) {
1392 dropRecord();
1393 break;
1394 }
1395
1396 unsigned TyID = Record[0];
1397 Type *Ty = Callbacks.GetTypeByID(TyID);
1398 if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy()) {
1399 dropRecord();
1400 break;
1401 }
1402
1403 Value *V = ValueList.getValueFwdRef(Record[1], Ty, TyID,
1404 /*ConstExprInsertBB*/ nullptr);
1405 if (!V)
1406 return error("Invalid value reference from old fn metadata");
1407
1408 MetadataList.assignValue(LocalAsMetadata::get(V), NextMetadataNo);
1409 NextMetadataNo++;
1410 break;
1411 }
1413 // Deprecated, but still needed to read old bitcode files.
1414 if (Record.size() % 2 == 1)
1415 return error("Invalid record");
1416
1417 unsigned Size = Record.size();
1419 for (unsigned i = 0; i != Size; i += 2) {
1420 unsigned TyID = Record[i];
1421 Type *Ty = Callbacks.GetTypeByID(TyID);
1422 if (!Ty)
1423 return error("Invalid record");
1424 if (Ty->isMetadataTy())
1425 Elts.push_back(getMD(Record[i + 1]));
1426 else if (!Ty->isVoidTy()) {
1427 Value *V = getValueFwdRef(ValueList, Record[i + 1], Ty, TyID);
1428 if (!V)
1429 return error("Invalid value reference from old metadata");
1432 "Expected non-function-local metadata");
1433 callMDTypeCallback(&MD, TyID);
1434 Elts.push_back(MD);
1435 } else
1436 Elts.push_back(nullptr);
1437 }
1438 MetadataList.assignValue(MDNode::get(Context, Elts), NextMetadataNo);
1439 NextMetadataNo++;
1440 break;
1441 }
1442 case bitc::METADATA_VALUE: {
1443 if (Record.size() != 2)
1444 return error("Invalid record");
1445
1446 unsigned TyID = Record[0];
1447 Type *Ty = Callbacks.GetTypeByID(TyID);
1448 if (!Ty || Ty->isMetadataTy() || Ty->isVoidTy())
1449 return error("Invalid record");
1450
1451 Value *V = getValueFwdRef(ValueList, Record[1], Ty, TyID);
1452 if (!V)
1453 return error("Invalid value reference from metadata");
1454
1456 callMDTypeCallback(&MD, TyID);
1457 MetadataList.assignValue(MD, NextMetadataNo);
1458 NextMetadataNo++;
1459 break;
1460 }
1462 IsDistinct = true;
1463 [[fallthrough]];
1464 case bitc::METADATA_NODE: {
1466 Elts.reserve(Record.size());
1467 for (unsigned ID : Record)
1468 Elts.push_back(getMDOrNull(ID));
1469 MetadataList.assignValue(IsDistinct ? MDNode::getDistinct(Context, Elts)
1470 : MDNode::get(Context, Elts),
1471 NextMetadataNo);
1472 NextMetadataNo++;
1473 break;
1474 }
1476 // 5: inlinedAt, 6: isImplicit, 8: Key Instructions fields.
1477 if (Record.size() != 5 && Record.size() != 6 && Record.size() != 8)
1478 return error("Invalid record");
1479
1480 IsDistinct = Record[0];
1481 unsigned Line = Record[1];
1482 unsigned Column = Record[2];
1483 Metadata *Scope = getMD(Record[3]);
1484 Metadata *InlinedAt = getMDOrNull(Record[4]);
1485 bool ImplicitCode = Record.size() >= 6 && Record[5];
1486 uint64_t AtomGroup = Record.size() == 8 ? Record[6] : 0;
1487 uint8_t AtomRank = Record.size() == 8 ? Record[7] : 0;
1488 MetadataList.assignValue(
1489 GET_OR_DISTINCT(DILocation, (Context, Line, Column, Scope, InlinedAt,
1490 ImplicitCode, AtomGroup, AtomRank)),
1491 NextMetadataNo);
1492 NextMetadataNo++;
1493 break;
1494 }
1496 if (Record.size() < 4)
1497 return error("Invalid record");
1498
1499 IsDistinct = Record[0];
1500 unsigned Tag = Record[1];
1501 unsigned Version = Record[2];
1502
1503 if (Tag >= 1u << 16 || Version != 0)
1504 return error("Invalid record");
1505
1506 auto *Header = getMDString(Record[3]);
1508 for (unsigned I = 4, E = Record.size(); I != E; ++I)
1509 DwarfOps.push_back(getMDOrNull(Record[I]));
1510 MetadataList.assignValue(
1511 GET_OR_DISTINCT(GenericDINode, (Context, Tag, Header, DwarfOps)),
1512 NextMetadataNo);
1513 NextMetadataNo++;
1514 break;
1515 }
1517 Metadata *Val = nullptr;
1518 // Operand 'count' is interpreted as:
1519 // - Signed integer (version 0)
1520 // - Metadata node (version 1)
1521 // Operand 'lowerBound' is interpreted as:
1522 // - Signed integer (version 0 and 1)
1523 // - Metadata node (version 2)
1524 // Operands 'upperBound' and 'stride' are interpreted as:
1525 // - Metadata node (version 2)
1526 switch (Record[0] >> 1) {
1527 case 0:
1528 Val = GET_OR_DISTINCT(DISubrange,
1529 (Context, Record[1], unrotateSign(Record[2])));
1530 break;
1531 case 1:
1532 Val = GET_OR_DISTINCT(DISubrange, (Context, getMDOrNull(Record[1]),
1533 unrotateSign(Record[2])));
1534 break;
1535 case 2:
1536 Val = GET_OR_DISTINCT(
1537 DISubrange, (Context, getMDOrNull(Record[1]), getMDOrNull(Record[2]),
1538 getMDOrNull(Record[3]), getMDOrNull(Record[4])));
1539 break;
1540 default:
1541 return error("Invalid record: Unsupported version of DISubrange");
1542 }
1543
1544 MetadataList.assignValue(Val, NextMetadataNo);
1545 IsDistinct = Record[0] & 1;
1546 NextMetadataNo++;
1547 break;
1548 }
1550 Metadata *Val = nullptr;
1551 Val = GET_OR_DISTINCT(DIGenericSubrange,
1552 (Context, getMDOrNull(Record[1]),
1553 getMDOrNull(Record[2]), getMDOrNull(Record[3]),
1554 getMDOrNull(Record[4])));
1555
1556 MetadataList.assignValue(Val, NextMetadataNo);
1557 IsDistinct = Record[0] & 1;
1558 NextMetadataNo++;
1559 break;
1560 }
1562 if (Record.size() < 3)
1563 return error("Invalid record");
1564
1565 IsDistinct = Record[0] & 1;
1566 bool IsUnsigned = Record[0] & 2;
1567 bool IsBigInt = Record[0] & 4;
1568 APInt Value;
1569
1570 if (IsBigInt) {
1571 const uint64_t BitWidth = Record[1];
1572 const size_t NumWords = Record.size() - 3;
1573 Value = readWideAPInt(ArrayRef(&Record[3], NumWords), BitWidth);
1574 } else
1575 Value = APInt(64, unrotateSign(Record[1]), !IsUnsigned);
1576
1577 MetadataList.assignValue(
1578 GET_OR_DISTINCT(DIEnumerator,
1579 (Context, Value, IsUnsigned, getMDString(Record[2]))),
1580 NextMetadataNo);
1581 NextMetadataNo++;
1582 break;
1583 }
1585 if (Record.size() < 6 || Record.size() > 12)
1586 return error("Invalid record");
1587
1588 IsDistinct = Record[0] & 1;
1589 bool SizeIsMetadata = Record[0] & 2;
1590 DINode::DIFlags Flags = (Record.size() > 6)
1591 ? static_cast<DINode::DIFlags>(Record[6])
1592 : DINode::FlagZero;
1593 uint32_t NumExtraInhabitants = (Record.size() > 7) ? Record[7] : 0;
1594 uint32_t DataSizeInBits = (Record.size() > 8) ? Record[8] : 0;
1595 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1596 Metadata *File = nullptr;
1597 unsigned LineNo = 0;
1598 Metadata *Scope = nullptr;
1599 if (Record.size() > 9) {
1600 File = getMDOrNull(Record[9]);
1601 LineNo = Record[10];
1602 Scope = getMDOrNull(Record[11]);
1603 }
1604 MetadataList.assignValue(
1605 GET_OR_DISTINCT(DIBasicType,
1606 (Context, Record[1], getMDString(Record[2]), File,
1607 LineNo, Scope, SizeInBits, Record[4], Record[5],
1608 NumExtraInhabitants, DataSizeInBits, Flags)),
1609 NextMetadataNo);
1610 NextMetadataNo++;
1611 break;
1612 }
1614 if (Record.size() < 11)
1615 return error("Invalid record");
1616
1617 IsDistinct = Record[0] & 1;
1618 bool SizeIsMetadata = Record[0] & 2;
1619 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[6]);
1620
1621 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[3]);
1622
1623 size_t Offset = 9;
1624
1625 auto ReadWideInt = [&]() {
1627 unsigned NumWords = Encoded >> 32;
1628 unsigned BitWidth = Encoded & 0xffffffff;
1629 auto Value = readWideAPInt(ArrayRef(&Record[Offset], NumWords), BitWidth);
1630 Offset += NumWords;
1631 return Value;
1632 };
1633
1634 APInt Numerator = ReadWideInt();
1635 APInt Denominator = ReadWideInt();
1636
1637 Metadata *File = nullptr;
1638 unsigned LineNo = 0;
1639 Metadata *Scope = nullptr;
1640
1641 if (Offset + 3 == Record.size()) {
1642 File = getMDOrNull(Record[Offset]);
1643 LineNo = Record[Offset + 1];
1644 Scope = getMDOrNull(Record[Offset + 2]);
1645 } else if (Offset != Record.size())
1646 return error("Invalid record");
1647
1648 MetadataList.assignValue(
1649 GET_OR_DISTINCT(DIFixedPointType,
1650 (Context, Record[1], getMDString(Record[2]), File,
1651 LineNo, Scope, SizeInBits, Record[4], Record[5], Flags,
1652 Record[7], Record[8], Numerator, Denominator)),
1653 NextMetadataNo);
1654 NextMetadataNo++;
1655 break;
1656 }
1658 if (Record.size() > 9 || Record.size() < 8)
1659 return error("Invalid record");
1660
1661 IsDistinct = Record[0] & 1;
1662 bool SizeIsMetadata = Record[0] & 2;
1663 bool SizeIs8 = Record.size() == 8;
1664 // StringLocationExp (i.e. Record[5]) is added at a later time
1665 // than the other fields. The code here enables backward compatibility.
1666 Metadata *StringLocationExp = SizeIs8 ? nullptr : getMDOrNull(Record[5]);
1667 unsigned Offset = SizeIs8 ? 5 : 6;
1668 Metadata *SizeInBits =
1669 getMetadataOrConstant(SizeIsMetadata, Record[Offset]);
1670
1671 MetadataList.assignValue(
1672 GET_OR_DISTINCT(DIStringType,
1673 (Context, Record[1], getMDString(Record[2]),
1674 getMDOrNull(Record[3]), getMDOrNull(Record[4]),
1675 StringLocationExp, SizeInBits, Record[Offset + 1],
1676 Record[Offset + 2])),
1677 NextMetadataNo);
1678 NextMetadataNo++;
1679 break;
1680 }
1682 if (Record.size() < 12 || Record.size() > 15)
1683 return error("Invalid record");
1684
1685 // DWARF address space is encoded as N->getDWARFAddressSpace() + 1. 0 means
1686 // that there is no DWARF address space associated with DIDerivedType.
1687 std::optional<unsigned> DWARFAddressSpace;
1688 if (Record.size() > 12 && Record[12])
1689 DWARFAddressSpace = Record[12] - 1;
1690
1691 Metadata *Annotations = nullptr;
1692 std::optional<DIDerivedType::PtrAuthData> PtrAuthData;
1693
1694 // Only look for annotations/ptrauth if both are allocated.
1695 // If not, we can't tell which was intended to be embedded, as both ptrauth
1696 // and annotations have been expected at Record[13] at various times.
1697 if (Record.size() > 14) {
1698 if (Record[13])
1699 Annotations = getMDOrNull(Record[13]);
1700 if (Record[14])
1701 PtrAuthData.emplace(Record[14]);
1702 }
1703
1704 IsDistinct = Record[0] & 1;
1705 bool SizeIsMetadata = Record[0] & 2;
1706 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1707
1708 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1709 Metadata *OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1710
1711 MetadataList.assignValue(
1712 GET_OR_DISTINCT(DIDerivedType,
1713 (Context, Record[1], getMDString(Record[2]),
1714 getMDOrNull(Record[3]), Record[4],
1715 getDITypeRefOrNull(Record[5]),
1716 getDITypeRefOrNull(Record[6]), SizeInBits, Record[8],
1717 OffsetInBits, DWARFAddressSpace, PtrAuthData, Flags,
1718 getDITypeRefOrNull(Record[11]), Annotations)),
1719 NextMetadataNo);
1720 NextMetadataNo++;
1721 break;
1722 }
1724 if (Record.size() != 13)
1725 return error("Invalid record");
1726
1727 IsDistinct = Record[0] & 1;
1728 bool SizeIsMetadata = Record[0] & 2;
1729 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7]);
1730
1731 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[5]);
1732
1733 MetadataList.assignValue(
1734 GET_OR_DISTINCT(DISubrangeType,
1735 (Context, getMDString(Record[1]),
1736 getMDOrNull(Record[2]), Record[3],
1737 getMDOrNull(Record[4]), SizeInBits, Record[6], Flags,
1738 getDITypeRefOrNull(Record[8]), getMDOrNull(Record[9]),
1739 getMDOrNull(Record[10]), getMDOrNull(Record[11]),
1740 getMDOrNull(Record[12]))),
1741 NextMetadataNo);
1742 NextMetadataNo++;
1743 break;
1744 }
1746 if (Record.size() < 16 || Record.size() > 26)
1747 return error("Invalid record");
1748
1749 // If we have a UUID and this is not a forward declaration, lookup the
1750 // mapping.
1751 IsDistinct = Record[0] & 0x1;
1752 bool IsNotUsedInTypeRef = Record[0] & 2;
1753 bool SizeIsMetadata = Record[0] & 4;
1754 unsigned Tag = Record[1];
1755 MDString *Name = getMDString(Record[2]);
1756 Metadata *File = getMDOrNull(Record[3]);
1757 unsigned Line = Record[4];
1758 Metadata *Scope = getDITypeRefOrNull(Record[5]);
1759 Metadata *BaseType = nullptr;
1760 if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
1761 return error("Alignment value is too large");
1762 uint32_t AlignInBits = Record[8];
1763 Metadata *OffsetInBits = nullptr;
1764 uint32_t NumExtraInhabitants = (Record.size() > 22) ? Record[22] : 0;
1765 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[10]);
1766 Metadata *Elements = nullptr;
1767 unsigned RuntimeLang = Record[12];
1768 std::optional<uint32_t> EnumKind;
1769
1770 Metadata *VTableHolder = nullptr;
1771 Metadata *TemplateParams = nullptr;
1772 Metadata *Discriminator = nullptr;
1773 Metadata *DataLocation = nullptr;
1774 Metadata *Associated = nullptr;
1775 Metadata *Allocated = nullptr;
1776 Metadata *Rank = nullptr;
1777 Metadata *Annotations = nullptr;
1778 Metadata *Specification = nullptr;
1779 Metadata *BitStride = nullptr;
1780 auto *Identifier = getMDString(Record[15]);
1781 // If this module is being parsed so that it can be ThinLTO imported
1782 // into another module, composite types only need to be imported as
1783 // type declarations (unless full type definitions are requested).
1784 // Create type declarations up front to save memory. This is only
1785 // done for types which have an Identifier, and are therefore
1786 // subject to the ODR.
1787 //
1788 // buildODRType handles the case where this is type ODRed with a
1789 // definition needed by the importing module, in which case the
1790 // existing definition is used.
1791 //
1792 // We always import full definitions for anonymous composite types,
1793 // as without a name, debuggers cannot easily resolve a declaration
1794 // to its definition.
1795 if (IsImporting && !ImportFullTypeDefinitions && Identifier && Name &&
1796 (Tag == dwarf::DW_TAG_enumeration_type ||
1797 Tag == dwarf::DW_TAG_class_type ||
1798 Tag == dwarf::DW_TAG_structure_type ||
1799 Tag == dwarf::DW_TAG_union_type)) {
1800 Flags = Flags | DINode::FlagFwdDecl;
1801 // This is a hack around preserving template parameters for simplified
1802 // template names - it should probably be replaced with a
1803 // DICompositeType flag specifying whether template parameters are
1804 // required on declarations of this type.
1805 StringRef NameStr = Name->getString();
1806 if (!NameStr.contains('<') || NameStr.starts_with("_STN|"))
1807 TemplateParams = getMDOrNull(Record[14]);
1808 } else {
1809 BaseType = getDITypeRefOrNull(Record[6]);
1810
1811 OffsetInBits = getMetadataOrConstant(SizeIsMetadata, Record[9]);
1812
1813 Elements = getMDOrNull(Record[11]);
1814 VTableHolder = getDITypeRefOrNull(Record[13]);
1815 TemplateParams = getMDOrNull(Record[14]);
1816 if (Record.size() > 16)
1817 Discriminator = getMDOrNull(Record[16]);
1818 if (Record.size() > 17)
1819 DataLocation = getMDOrNull(Record[17]);
1820 if (Record.size() > 19) {
1821 Associated = getMDOrNull(Record[18]);
1822 Allocated = getMDOrNull(Record[19]);
1823 }
1824 if (Record.size() > 20) {
1825 Rank = getMDOrNull(Record[20]);
1826 }
1827 if (Record.size() > 21) {
1828 Annotations = getMDOrNull(Record[21]);
1829 }
1830 if (Record.size() > 23) {
1831 Specification = getMDOrNull(Record[23]);
1832 }
1833 if (Record.size() > 25)
1834 BitStride = getMDOrNull(Record[25]);
1835 }
1836
1837 if (Record.size() > 24 && Record[24] != dwarf::DW_APPLE_ENUM_KIND_invalid)
1838 EnumKind = Record[24];
1839
1840 Metadata *SizeInBits = getMetadataOrConstant(SizeIsMetadata, Record[7]);
1841
1842 DICompositeType *CT = nullptr;
1843 if (Identifier)
1845 Context, *Identifier, Tag, Name, File, Line, Scope, BaseType,
1846 SizeInBits, AlignInBits, OffsetInBits, Specification,
1847 NumExtraInhabitants, Flags, Elements, RuntimeLang, EnumKind,
1848 VTableHolder, TemplateParams, Discriminator, DataLocation, Associated,
1849 Allocated, Rank, Annotations, BitStride);
1850
1851 // Create a node if we didn't get a lazy ODR type.
1852 if (!CT)
1853 CT = GET_OR_DISTINCT(
1854 DICompositeType,
1855 (Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
1856 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, EnumKind,
1857 VTableHolder, TemplateParams, Identifier, Discriminator,
1858 DataLocation, Associated, Allocated, Rank, Annotations,
1859 Specification, NumExtraInhabitants, BitStride));
1860 if (!IsNotUsedInTypeRef && Identifier)
1861 MetadataList.addTypeRef(*Identifier, *cast<DICompositeType>(CT));
1862
1863 MetadataList.assignValue(CT, NextMetadataNo);
1864 NextMetadataNo++;
1865 break;
1866 }
1868 if (Record.size() < 3 || Record.size() > 4)
1869 return error("Invalid record");
1870 bool IsOldTypeArray = Record[0] < 2;
1871 unsigned CC = (Record.size() > 3) ? Record[3] : 0;
1872
1873 IsDistinct = Record[0] & 0x1;
1874 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[1]);
1875 Metadata *Types = getMDOrNull(Record[2]);
1876 if (LLVM_UNLIKELY(IsOldTypeArray))
1877 Types = MetadataList.upgradeTypeArray(Types);
1878
1879 MetadataList.assignValue(
1880 GET_OR_DISTINCT(DISubroutineType, (Context, Flags, CC, Types)),
1881 NextMetadataNo);
1882 NextMetadataNo++;
1883 break;
1884 }
1885
1886 case bitc::METADATA_MODULE: {
1887 if (Record.size() < 5 || Record.size() > 9)
1888 return error("Invalid record");
1889
1890 unsigned Offset = Record.size() >= 8 ? 2 : 1;
1891 IsDistinct = Record[0];
1892 MetadataList.assignValue(
1894 DIModule,
1895 (Context, Record.size() >= 8 ? getMDOrNull(Record[1]) : nullptr,
1896 getMDOrNull(Record[0 + Offset]), getMDString(Record[1 + Offset]),
1897 getMDString(Record[2 + Offset]), getMDString(Record[3 + Offset]),
1898 getMDString(Record[4 + Offset]),
1899 Record.size() <= 7 ? 0 : Record[7],
1900 Record.size() <= 8 ? false : Record[8])),
1901 NextMetadataNo);
1902 NextMetadataNo++;
1903 break;
1904 }
1905
1906 case bitc::METADATA_FILE: {
1907 if (Record.size() != 3 && Record.size() != 5 && Record.size() != 6)
1908 return error("Invalid record");
1909
1910 IsDistinct = Record[0];
1911 std::optional<DIFile::ChecksumInfo<MDString *>> Checksum;
1912 // The BitcodeWriter writes null bytes into Record[3:4] when the Checksum
1913 // is not present. This matches up with the old internal representation,
1914 // and the old encoding for CSK_None in the ChecksumKind. The new
1915 // representation reserves the value 0 in the ChecksumKind to continue to
1916 // encode None in a backwards-compatible way.
1917 if (Record.size() > 4 && Record[3] && Record[4])
1918 Checksum.emplace(static_cast<DIFile::ChecksumKind>(Record[3]),
1919 getMDString(Record[4]));
1920 MetadataList.assignValue(
1921 GET_OR_DISTINCT(DIFile,
1922 (Context, getMDString(Record[1]),
1923 getMDString(Record[2]), Checksum,
1924 Record.size() > 5 ? getMDString(Record[5]) : nullptr)),
1925 NextMetadataNo);
1926 NextMetadataNo++;
1927 break;
1928 }
1930 if (Record.size() < 14 || Record.size() > 24)
1931 return error("Invalid record");
1932
1933 // Ignore Record[0], which indicates whether this compile unit is
1934 // distinct. It's always distinct.
1935 IsDistinct = true;
1936
1937 const auto LangVersionMask = (uint64_t(1) << 63);
1938 const bool HasVersionedLanguage = Record[1] & LangVersionMask;
1939 const uint32_t LanguageVersion = Record.size() > 22 ? Record[22] : 0;
1940 // The dialect field is written by writeDICompileUnit as a small enum
1941 // value (see dwarf::LanguageDialectAttribute). Reject out-of-range
1942 // values rather than silently truncating to uint16_t; this keeps the
1943 // writer/reader invariant symmetric and surfaces malformed inputs.
1944 // Value 0 means "no dialect specified".
1945 if (Record.size() > 23 &&
1946 Record[23] > static_cast<uint64_t>(dwarf::DW_LLVM_LANG_DIALECT_max))
1947 return error("Invalid DICompileUnit dialect value");
1948 const uint16_t Dialect =
1949 Record.size() > 23 ? static_cast<uint16_t>(Record[23]) : uint16_t(0);
1950
1951 auto *CU = DICompileUnit::getDistinct(
1952 Context,
1953 HasVersionedLanguage
1954 ? DISourceLanguageName(Record[1] & ~LangVersionMask,
1955 LanguageVersion, Dialect)
1956 : DISourceLanguageName(Record[1], Dialect),
1957 getMDOrNull(Record[2]), getMDString(Record[3]), Record[4],
1958 getMDString(Record[5]), Record[6], getMDString(Record[7]), Record[8],
1959 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
1960 getMDOrNull(Record[12]), getMDOrNull(Record[13]),
1961 Record.size() <= 15 ? nullptr : getMDOrNull(Record[15]),
1962 Record.size() <= 14 ? 0 : Record[14],
1963 Record.size() <= 16 ? true : Record[16],
1964 Record.size() <= 17 ? false : Record[17],
1965 Record.size() <= 18 ? 0 : Record[18],
1966 Record.size() <= 19 ? false : Record[19],
1967 // Keep these guarded for backwards-compatibility with older bitcode
1968 // records. Keep this index layout in sync with writeDICompileUnit:
1969 // index 20 is sysroot, 21 is SDK, 22 is source-language version, and
1970 // 23 is dialect (read above as raw enum value, where 0 means unset).
1971 Record.size() <= 20 ? nullptr : getMDString(Record[20]),
1972 Record.size() <= 21 ? nullptr : getMDString(Record[21]));
1973
1974 MetadataList.assignValue(CU, NextMetadataNo);
1975 NextMetadataNo++;
1976
1977 // Move the Upgrade the list of subprograms.
1978 if (Record[11])
1979 CUSubprograms.push_back({CU, Record[11]});
1980 break;
1981 }
1983 if (Record.size() < 18 || Record.size() > 22)
1984 return error("Invalid record");
1985
1986 bool HasSPFlags = Record[0] & 4;
1987
1990 if (!HasSPFlags)
1991 Flags = static_cast<DINode::DIFlags>(Record[11 + 2]);
1992 else {
1993 Flags = static_cast<DINode::DIFlags>(Record[11]);
1994 SPFlags = static_cast<DISubprogram::DISPFlags>(Record[9]);
1995 }
1996
1997 // Support for old metadata when
1998 // subprogram specific flags are placed in DIFlags.
1999 const unsigned DIFlagMainSubprogram = 1 << 21;
2000 bool HasOldMainSubprogramFlag = Flags & DIFlagMainSubprogram;
2001 if (HasOldMainSubprogramFlag)
2002 // Remove old DIFlagMainSubprogram from DIFlags.
2003 // Note: This assumes that any future use of bit 21 defaults to it
2004 // being 0.
2005 Flags &= ~static_cast<DINode::DIFlags>(DIFlagMainSubprogram);
2006
2007 if (HasOldMainSubprogramFlag && HasSPFlags)
2008 SPFlags |= DISubprogram::SPFlagMainSubprogram;
2009 else if (!HasSPFlags)
2010 SPFlags = DISubprogram::toSPFlags(
2011 /*IsLocalToUnit=*/Record[7], /*IsDefinition=*/Record[8],
2012 /*IsOptimized=*/Record[14], /*Virtuality=*/Record[11],
2013 /*IsMainSubprogram=*/HasOldMainSubprogramFlag);
2014
2015 // All definitions should be distinct.
2016 IsDistinct = (Record[0] & 1) || (SPFlags & DISubprogram::SPFlagDefinition);
2017 // Version 1 has a Function as Record[15].
2018 // Version 2 has removed Record[15].
2019 // Version 3 has the Unit as Record[15].
2020 // Version 4 added thisAdjustment.
2021 // Version 5 repacked flags into DISPFlags, changing many element numbers.
2022 bool HasUnit = Record[0] & 2;
2023 if (!HasSPFlags && HasUnit && Record.size() < 19)
2024 return error("Invalid record");
2025 if (HasSPFlags && !HasUnit)
2026 return error("Invalid record");
2027 // Accommodate older formats.
2028 bool HasFn = false;
2029 bool HasThisAdj = true;
2030 bool HasThrownTypes = true;
2031 bool HasAnnotations = false;
2032 bool HasTargetFuncName = false;
2033 unsigned OffsetA = 0;
2034 unsigned OffsetB = 0;
2035 // Key instructions won't be enabled in old-format bitcode, so only
2036 // check it if HasSPFlags is true.
2037 bool UsesKeyInstructions = false;
2038 if (!HasSPFlags) {
2039 OffsetA = 2;
2040 OffsetB = 2;
2041 if (Record.size() >= 19) {
2042 HasFn = !HasUnit;
2043 OffsetB++;
2044 }
2045 HasThisAdj = Record.size() >= 20;
2046 HasThrownTypes = Record.size() >= 21;
2047 } else {
2048 HasAnnotations = Record.size() >= 19;
2049 HasTargetFuncName = Record.size() >= 20;
2050 UsesKeyInstructions = Record.size() >= 21 ? Record[20] : 0;
2051 }
2052
2053 Metadata *CUorFn = getMDOrNull(Record[12 + OffsetB]);
2054 DISubprogram *SP = GET_OR_DISTINCT(
2055 DISubprogram,
2056 (Context,
2057 getDITypeRefOrNull(Record[1]), // scope
2058 getMDString(Record[2]), // name
2059 getMDString(Record[3]), // linkageName
2060 getMDOrNull(Record[4]), // file
2061 Record[5], // line
2062 getMDOrNull(Record[6]), // type
2063 Record[7 + OffsetA], // scopeLine
2064 getDITypeRefOrNull(Record[8 + OffsetA]), // containingType
2065 Record[10 + OffsetA], // virtualIndex
2066 HasThisAdj ? Record[16 + OffsetB] : 0, // thisAdjustment
2067 Flags, // flags
2068 SPFlags, // SPFlags
2069 HasUnit ? CUorFn : nullptr, // unit
2070 getMDOrNull(Record[13 + OffsetB]), // templateParams
2071 getMDOrNull(Record[14 + OffsetB]), // declaration
2072 getMDOrNull(Record[15 + OffsetB]), // retainedNodes
2073 HasThrownTypes ? getMDOrNull(Record[17 + OffsetB])
2074 : nullptr, // thrownTypes
2075 HasAnnotations ? getMDOrNull(Record[18 + OffsetB])
2076 : nullptr, // annotations
2077 HasTargetFuncName ? getMDString(Record[19 + OffsetB])
2078 : nullptr, // targetFuncName
2079 UsesKeyInstructions));
2080 MetadataList.assignValue(SP, NextMetadataNo);
2081 NextMetadataNo++;
2082
2083 if (IsDistinct)
2084 NewDistinctSPs.push_back(SP);
2085
2086 // Upgrade sp->function mapping to function->sp mapping.
2087 if (HasFn) {
2088 if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(CUorFn))
2089 if (auto *F = dyn_cast<Function>(CMD->getValue())) {
2090 if (F->isMaterializable())
2091 // Defer until materialized; unmaterialized functions may not have
2092 // metadata.
2093 FunctionsWithSPs[F] = SP;
2094 else if (!F->empty())
2095 F->setSubprogram(SP);
2096 }
2097 }
2098 break;
2099 }
2101 if (Record.size() != 5)
2102 return error("Invalid record");
2103
2104 IsDistinct = Record[0];
2105 MetadataList.assignValue(
2106 GET_OR_DISTINCT(DILexicalBlock,
2107 (Context, getMDOrNull(Record[1]),
2108 getMDOrNull(Record[2]), Record[3], Record[4])),
2109 NextMetadataNo);
2110 NextMetadataNo++;
2111 break;
2112 }
2114 if (Record.size() != 4)
2115 return error("Invalid record");
2116
2117 IsDistinct = Record[0];
2118 MetadataList.assignValue(
2119 GET_OR_DISTINCT(DILexicalBlockFile,
2120 (Context, getMDOrNull(Record[1]),
2121 getMDOrNull(Record[2]), Record[3])),
2122 NextMetadataNo);
2123 NextMetadataNo++;
2124 break;
2125 }
2127 IsDistinct = Record[0] & 1;
2128 MetadataList.assignValue(
2129 GET_OR_DISTINCT(DICommonBlock,
2130 (Context, getMDOrNull(Record[1]),
2131 getMDOrNull(Record[2]), getMDString(Record[3]),
2132 getMDOrNull(Record[4]), Record[5])),
2133 NextMetadataNo);
2134 NextMetadataNo++;
2135 break;
2136 }
2138 // Newer versions of DINamespace dropped file and line.
2139 MDString *Name;
2140 if (Record.size() == 3)
2141 Name = getMDString(Record[2]);
2142 else if (Record.size() == 5)
2143 Name = getMDString(Record[3]);
2144 else
2145 return error("Invalid record");
2146
2147 IsDistinct = Record[0] & 1;
2148 bool ExportSymbols = Record[0] & 2;
2149 MetadataList.assignValue(
2150 GET_OR_DISTINCT(DINamespace,
2151 (Context, getMDOrNull(Record[1]), Name, ExportSymbols)),
2152 NextMetadataNo);
2153 NextMetadataNo++;
2154 break;
2155 }
2156 case bitc::METADATA_MACRO: {
2157 if (Record.size() != 5)
2158 return error("Invalid record");
2159
2160 IsDistinct = Record[0];
2161 MetadataList.assignValue(
2162 GET_OR_DISTINCT(DIMacro,
2163 (Context, Record[1], Record[2], getMDString(Record[3]),
2164 getMDString(Record[4]))),
2165 NextMetadataNo);
2166 NextMetadataNo++;
2167 break;
2168 }
2170 if (Record.size() != 5)
2171 return error("Invalid record");
2172
2173 IsDistinct = Record[0];
2174 MetadataList.assignValue(
2175 GET_OR_DISTINCT(DIMacroFile,
2176 (Context, Record[1], Record[2], getMDOrNull(Record[3]),
2177 getMDOrNull(Record[4]))),
2178 NextMetadataNo);
2179 NextMetadataNo++;
2180 break;
2181 }
2183 if (Record.size() < 3 || Record.size() > 4)
2184 return error("Invalid record");
2185
2186 IsDistinct = Record[0];
2187 MetadataList.assignValue(
2188 GET_OR_DISTINCT(DITemplateTypeParameter,
2189 (Context, getMDString(Record[1]),
2190 getDITypeRefOrNull(Record[2]),
2191 (Record.size() == 4) ? getMDOrNull(Record[3])
2192 : getMDOrNull(false))),
2193 NextMetadataNo);
2194 NextMetadataNo++;
2195 break;
2196 }
2198 if (Record.size() < 5 || Record.size() > 6)
2199 return error("Invalid record");
2200
2201 IsDistinct = Record[0];
2202
2203 MetadataList.assignValue(
2205 DITemplateValueParameter,
2206 (Context, Record[1], getMDString(Record[2]),
2207 getDITypeRefOrNull(Record[3]),
2208 (Record.size() == 6) ? getMDOrNull(Record[4]) : getMDOrNull(false),
2209 (Record.size() == 6) ? getMDOrNull(Record[5])
2210 : getMDOrNull(Record[4]))),
2211 NextMetadataNo);
2212 NextMetadataNo++;
2213 break;
2214 }
2216 if (Record.size() < 11 || Record.size() > 13)
2217 return error("Invalid record");
2218
2219 IsDistinct = Record[0] & 1;
2220 unsigned Version = Record[0] >> 1;
2221
2222 if (Version == 2) {
2223 Metadata *Annotations = nullptr;
2224 if (Record.size() > 12)
2225 Annotations = getMDOrNull(Record[12]);
2226
2227 MetadataList.assignValue(
2228 GET_OR_DISTINCT(DIGlobalVariable,
2229 (Context, getMDOrNull(Record[1]),
2230 getMDString(Record[2]), getMDString(Record[3]),
2231 getMDOrNull(Record[4]), Record[5],
2232 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2233 getMDOrNull(Record[9]), getMDOrNull(Record[10]),
2234 Record[11], Annotations)),
2235 NextMetadataNo);
2236
2237 NextMetadataNo++;
2238 } else if (Version == 1) {
2239 // No upgrade necessary. A null field will be introduced to indicate
2240 // that no parameter information is available.
2241 MetadataList.assignValue(
2243 DIGlobalVariable,
2244 (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2245 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2246 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2247 getMDOrNull(Record[10]), nullptr, Record[11], nullptr)),
2248 NextMetadataNo);
2249
2250 NextMetadataNo++;
2251 } else if (Version == 0) {
2252 // Upgrade old metadata, which stored a global variable reference or a
2253 // ConstantInt here.
2254 NeedUpgradeToDIGlobalVariableExpression = true;
2255 Metadata *Expr = getMDOrNull(Record[9]);
2256 uint32_t AlignInBits = 0;
2257 if (Record.size() > 11) {
2258 if (Record[11] > (uint64_t)std::numeric_limits<uint32_t>::max())
2259 return error("Alignment value is too large");
2260 AlignInBits = Record[11];
2261 }
2262 GlobalVariable *Attach = nullptr;
2263 if (auto *CMD = dyn_cast_or_null<ConstantAsMetadata>(Expr)) {
2264 if (auto *GV = dyn_cast<GlobalVariable>(CMD->getValue())) {
2265 Attach = GV;
2266 Expr = nullptr;
2267 } else if (auto *CI = dyn_cast<ConstantInt>(CMD->getValue())) {
2268 Expr = DIExpression::get(Context,
2269 {dwarf::DW_OP_constu, CI->getZExtValue(),
2270 dwarf::DW_OP_stack_value});
2271 } else {
2272 Expr = nullptr;
2273 }
2274 }
2275 DIGlobalVariable *DGV = GET_OR_DISTINCT(
2276 DIGlobalVariable,
2277 (Context, getMDOrNull(Record[1]), getMDString(Record[2]),
2278 getMDString(Record[3]), getMDOrNull(Record[4]), Record[5],
2279 getDITypeRefOrNull(Record[6]), Record[7], Record[8],
2280 getMDOrNull(Record[10]), nullptr, AlignInBits, nullptr));
2281
2282 DIGlobalVariableExpression *&DGVE = GlobalVariableExpression[DGV];
2283 if (Attach || Expr) {
2284 if (!DGVE) {
2285 DGVE = DIGlobalVariableExpression::getDistinct(
2286 Context, DGV, Expr ? Expr : DIExpression::get(Context, {}));
2287 }
2288 }
2289 if (Attach)
2290 Attach->addDebugInfo(DGVE);
2291
2292 auto *MDNode = Expr ? cast<Metadata>(DGVE) : cast<Metadata>(DGV);
2293 MetadataList.assignValue(MDNode, NextMetadataNo);
2294 NextMetadataNo++;
2295 } else
2296 return error("Invalid record");
2297
2298 break;
2299 }
2301 if (Record.size() != 1)
2302 return error("Invalid DIAssignID record.");
2303
2304 IsDistinct = Record[0] & 1;
2305 if (!IsDistinct)
2306 return error("Invalid DIAssignID record. Must be distinct");
2307
2308 MetadataList.assignValue(DIAssignID::getDistinct(Context), NextMetadataNo);
2309 NextMetadataNo++;
2310 break;
2311 }
2313 // 10th field is for the obseleted 'inlinedAt:' field.
2314 if (Record.size() < 8 || Record.size() > 10)
2315 return error("Invalid record");
2316
2317 IsDistinct = Record[0] & 1;
2318 bool HasAlignment = Record[0] & 2;
2319 // 2nd field used to be an artificial tag, either DW_TAG_auto_variable or
2320 // DW_TAG_arg_variable, if we have alignment flag encoded it means, that
2321 // this is newer version of record which doesn't have artificial tag.
2322 bool HasTag = !HasAlignment && Record.size() > 8;
2323 DINode::DIFlags Flags = static_cast<DINode::DIFlags>(Record[7 + HasTag]);
2324 uint32_t AlignInBits = 0;
2325 Metadata *Annotations = nullptr;
2326 if (HasAlignment) {
2327 if (Record[8] > (uint64_t)std::numeric_limits<uint32_t>::max())
2328 return error("Alignment value is too large");
2329 AlignInBits = Record[8];
2330 if (Record.size() > 9)
2331 Annotations = getMDOrNull(Record[9]);
2332 }
2333
2334 MetadataList.assignValue(
2335 GET_OR_DISTINCT(DILocalVariable,
2336 (Context, getMDOrNull(Record[1 + HasTag]),
2337 getMDString(Record[2 + HasTag]),
2338 getMDOrNull(Record[3 + HasTag]), Record[4 + HasTag],
2339 getDITypeRefOrNull(Record[5 + HasTag]),
2340 Record[6 + HasTag], Flags, AlignInBits, Annotations)),
2341 NextMetadataNo);
2342 NextMetadataNo++;
2343 break;
2344 }
2345 case bitc::METADATA_LABEL: {
2346 if (Record.size() < 5 || Record.size() > 7)
2347 return error("Invalid record");
2348
2349 IsDistinct = Record[0] & 1;
2350 uint64_t Line = Record[4];
2351 uint64_t Column = Record.size() > 5 ? Record[5] : 0;
2352 bool IsArtificial = Record[0] & 2;
2353 std::optional<unsigned> CoroSuspendIdx;
2354 if (Record.size() > 6) {
2355 uint64_t RawSuspendIdx = Record[6];
2356 if (RawSuspendIdx != std::numeric_limits<uint64_t>::max()) {
2357 if (RawSuspendIdx > (uint64_t)std::numeric_limits<unsigned>::max())
2358 return error("CoroSuspendIdx value is too large");
2359 CoroSuspendIdx = RawSuspendIdx;
2360 }
2361 }
2362
2363 MetadataList.assignValue(
2364 GET_OR_DISTINCT(DILabel,
2365 (Context, getMDOrNull(Record[1]),
2366 getMDString(Record[2]), getMDOrNull(Record[3]), Line,
2367 Column, IsArtificial, CoroSuspendIdx)),
2368 NextMetadataNo);
2369 NextMetadataNo++;
2370 break;
2371 }
2373 if (Record.size() < 1)
2374 return error("Invalid record");
2375
2376 IsDistinct = Record[0] & 1;
2377 uint64_t Version = Record[0] >> 1;
2378 auto Elts = MutableArrayRef<uint64_t>(Record).slice(1);
2379
2381 if (Error Err = upgradeDIExpression(Version, Elts, Buffer))
2382 return Err;
2383
2384 MetadataList.assignValue(GET_OR_DISTINCT(DIExpression, (Context, Elts)),
2385 NextMetadataNo);
2386 NextMetadataNo++;
2387 break;
2388 }
2390 if (Record.size() != 3)
2391 return error("Invalid record");
2392
2393 IsDistinct = Record[0];
2394 Metadata *Expr = getMDOrNull(Record[2]);
2395 if (!Expr)
2396 Expr = DIExpression::get(Context, {});
2397 MetadataList.assignValue(
2398 GET_OR_DISTINCT(DIGlobalVariableExpression,
2399 (Context, getMDOrNull(Record[1]), Expr)),
2400 NextMetadataNo);
2401 NextMetadataNo++;
2402 break;
2403 }
2405 if (Record.size() != 8)
2406 return error("Invalid record");
2407
2408 IsDistinct = Record[0];
2409 MetadataList.assignValue(
2410 GET_OR_DISTINCT(DIObjCProperty,
2411 (Context, getMDString(Record[1]),
2412 getMDOrNull(Record[2]), Record[3],
2413 /*GetterName=*/getMDString(Record[5]),
2414 /*SetterName=*/getMDString(Record[4]), Record[6],
2415 getDITypeRefOrNull(Record[7]))),
2416 NextMetadataNo);
2417 NextMetadataNo++;
2418 break;
2419 }
2421 if (Record.size() != 6)
2422 return error("Invalid record");
2423
2424 IsDistinct = Record[0];
2425 MetadataList.assignValue(
2426 GET_OR_DISTINCT(DIProperty, (Context, getMDString(Record[1]),
2427 getMDOrNull(Record[2]), Record[3],
2428 getDITypeRefOrNull(Record[4]),
2429 getMDOrNull(Record[5]))),
2430 NextMetadataNo);
2431 NextMetadataNo++;
2432 break;
2433 }
2435 if (Record.size() < 6 || Record.size() > 8)
2436 return error("Invalid DIImportedEntity record");
2437
2438 IsDistinct = Record[0];
2439 bool HasFile = (Record.size() >= 7);
2440 bool HasElements = (Record.size() >= 8);
2441 MetadataList.assignValue(
2442 GET_OR_DISTINCT(DIImportedEntity,
2443 (Context, Record[1], getMDOrNull(Record[2]),
2444 getDITypeRefOrNull(Record[3]),
2445 HasFile ? getMDOrNull(Record[6]) : nullptr,
2446 HasFile ? Record[4] : 0, getMDString(Record[5]),
2447 HasElements ? getMDOrNull(Record[7]) : nullptr)),
2448 NextMetadataNo);
2449 NextMetadataNo++;
2450 break;
2451 }
2453 std::string String(Record.begin(), Record.end());
2454
2455 // Test for upgrading !llvm.loop.
2456 HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(String);
2457 ++NumMDStringLoaded;
2459 MetadataList.assignValue(MD, NextMetadataNo);
2460 NextMetadataNo++;
2461 break;
2462 }
2464 auto CreateNextMDString = [&](StringRef Str) {
2465 // Modern bitcode encodes MDStrings via this bulk record, so mirror the
2466 // METADATA_STRING check above to arm the loop-attachment upgrader.
2467 HasSeenOldLoopTags |= mayBeOldLoopAttachmentTag(Str);
2468 ++NumMDStringLoaded;
2469 MetadataList.assignValue(MDString::get(Context, Str), NextMetadataNo);
2470 NextMetadataNo++;
2471 };
2472 if (Error Err = parseMetadataStrings(Record, Blob, CreateNextMDString))
2473 return Err;
2474 break;
2475 }
2477 if (Record.size() % 2 == 0)
2478 return error("Invalid record");
2479 unsigned ValueID = Record[0];
2480 if (ValueID >= ValueList.size())
2481 return error("Invalid record");
2482 if (auto *GO = dyn_cast<GlobalObject>(ValueList[ValueID]))
2483 if (Error Err = parseGlobalObjectAttachment(
2484 *GO, ArrayRef<uint64_t>(Record).slice(1)))
2485 return Err;
2486 break;
2487 }
2488 case bitc::METADATA_KIND: {
2489 // Support older bitcode files that had METADATA_KIND records in a
2490 // block with METADATA_BLOCK_ID.
2491 if (Error Err = parseMetadataKindRecord(Record))
2492 return Err;
2493 break;
2494 }
2497 Elts.reserve(Record.size());
2498 for (uint64_t Elt : Record) {
2499 Metadata *MD = getMD(Elt);
2500 if (isa<MDNode>(MD) && cast<MDNode>(MD)->isTemporary())
2501 return error(
2502 "Invalid record: DIArgList should not contain forward refs");
2503 if (!isa<ValueAsMetadata>(MD))
2504 return error("Invalid record");
2506 }
2507
2508 MetadataList.assignValue(DIArgList::get(Context, Elts), NextMetadataNo);
2509 NextMetadataNo++;
2510 break;
2511 }
2512 }
2513 return Error::success();
2514#undef GET_OR_DISTINCT
2515}
2516
2517Error MetadataLoader::MetadataLoaderImpl::parseMetadataStrings(
2518 ArrayRef<uint64_t> Record, StringRef Blob,
2519 function_ref<void(StringRef)> CallBack) {
2520 // All the MDStrings in the block are emitted together in a single
2521 // record. The strings are concatenated and stored in a blob along with
2522 // their sizes.
2523 if (Record.size() != 2)
2524 return error("Invalid record: metadata strings layout");
2525
2526 unsigned NumStrings = Record[0];
2527 unsigned StringsOffset = Record[1];
2528 if (!NumStrings)
2529 return error("Invalid record: metadata strings with no strings");
2530 if (StringsOffset > Blob.size())
2531 return error("Invalid record: metadata strings corrupt offset");
2532
2533 StringRef Lengths = Blob.slice(0, StringsOffset);
2534 SimpleBitstreamCursor R(Lengths);
2535
2536 StringRef Strings = Blob.drop_front(StringsOffset);
2537 do {
2538 if (R.AtEndOfStream())
2539 return error("Invalid record: metadata strings bad length");
2540
2541 uint32_t Size;
2542 if (Error E = R.ReadVBR(6).moveInto(Size))
2543 return E;
2544 if (Strings.size() < Size)
2545 return error("Invalid record: metadata strings truncated chars");
2546
2547 CallBack(Strings.slice(0, Size));
2548 Strings = Strings.drop_front(Size);
2549 } while (--NumStrings);
2550
2551 return Error::success();
2552}
2553
2554Error MetadataLoader::MetadataLoaderImpl::parseGlobalObjectAttachment(
2555 GlobalObject &GO, ArrayRef<uint64_t> Record) {
2556 assert(Record.size() % 2 == 0);
2557 for (unsigned I = 0, E = Record.size(); I != E; I += 2) {
2558 auto K = MDKindMap.find(Record[I]);
2559 if (K == MDKindMap.end())
2560 return error("Invalid ID");
2561 MDNode *MD =
2562 dyn_cast_or_null<MDNode>(getMetadataFwdRefOrLoad(Record[I + 1]));
2563 if (!MD)
2564 return error("Invalid metadata attachment: expect fwd ref to MDNode");
2565 GO.addMetadata(K->second, *MD);
2566 }
2567 return Error::success();
2568}
2569
2570/// Parse metadata attachments.
2572 Function &F, ArrayRef<Instruction *> InstructionList) {
2573 if (Error Err = Stream.EnterSubBlock(bitc::METADATA_ATTACHMENT_ID))
2574 return Err;
2575
2577 PlaceholderQueue Placeholders;
2578
2579 while (true) {
2580 BitstreamEntry Entry;
2581 if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2582 return E;
2583
2584 switch (Entry.Kind) {
2585 case BitstreamEntry::SubBlock: // Handled for us already.
2587 return error("Malformed block");
2589 LLVM_DEBUG(llvm::dbgs() << "\nAttachment metadata loading: ");
2590 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2591 return Error::success();
2593 // The interesting case.
2594 break;
2595 }
2596
2597 // Read a metadata attachment record.
2598 Record.clear();
2599 ++NumMDRecordLoaded;
2600 Expected<unsigned> MaybeRecord = Stream.readRecord(Entry.ID, Record);
2601 if (!MaybeRecord)
2602 return MaybeRecord.takeError();
2603 switch (MaybeRecord.get()) {
2604 default: // Default behavior: ignore.
2605 break;
2607 unsigned RecordLength = Record.size();
2608 if (Record.empty())
2609 return error("Invalid record");
2610 if (RecordLength % 2 == 0) {
2611 // A function attachment.
2612 if (Error Err = parseGlobalObjectAttachment(F, Record))
2613 return Err;
2614 continue;
2615 }
2616
2617 // An instruction attachment.
2618 Instruction *Inst = InstructionList[Record[0]];
2619 for (unsigned i = 1; i != RecordLength; i = i + 2) {
2620 unsigned Kind = Record[i];
2621 auto I = MDKindMap.find(Kind);
2622 if (I == MDKindMap.end())
2623 return error("Invalid ID");
2624 if (I->second == LLVMContext::MD_tbaa && StripTBAA)
2625 continue;
2626
2627 auto Idx = Record[i + 1];
2628 if (Idx < (MDStringRef.size() + GlobalMetadataBitPosIndex.size()) &&
2629 !MetadataList.lookup(Idx)) {
2630 // Load the attachment if it is in the lazy-loadable range and hasn't
2631 // been loaded yet.
2632 lazyLoadOneMetadata(Idx, Placeholders);
2633 LLVM_DEBUG(llvm::dbgs() << "\nLazy attachment metadata loading: ");
2634 resolveLoadedMetadata(Placeholders, DebugInfoUpgradeMode::None);
2635 }
2636
2637 Metadata *Node = MetadataList.getMetadataFwdRef(Idx);
2639 // Drop the attachment. This used to be legal, but there's no
2640 // upgrade path.
2641 break;
2643 if (!MD)
2644 return error("Invalid metadata attachment");
2645
2646 if (HasSeenOldLoopTags && I->second == LLVMContext::MD_loop)
2648
2649 if (I->second == LLVMContext::MD_tbaa) {
2650 assert(!MD->isTemporary() && "should load MDs before attachments");
2651 MD = UpgradeTBAANode(*MD);
2652 }
2653 Inst->setMetadata(I->second, MD);
2654 }
2655 break;
2656 }
2657 }
2658 }
2659}
2660
2661/// Parse a single METADATA_KIND record, inserting result in MDKindMap.
2662Error MetadataLoader::MetadataLoaderImpl::parseMetadataKindRecord(
2664 if (Record.size() < 2)
2665 return error("Invalid record");
2666
2667 unsigned Kind = Record[0];
2668 SmallString<8> Name(Record.begin() + 1, Record.end());
2669
2670 unsigned NewKind = TheModule.getMDKindID(Name.str());
2671 if (!MDKindMap.insert(std::make_pair(Kind, NewKind)).second)
2672 return error("Conflicting METADATA_KIND records");
2673 return Error::success();
2674}
2675
2676/// Parse the metadata kinds out of the METADATA_KIND_BLOCK.
2678 if (Error Err = Stream.EnterSubBlock(bitc::METADATA_KIND_BLOCK_ID))
2679 return Err;
2680
2682
2683 // Read all the records.
2684 while (true) {
2685 BitstreamEntry Entry;
2686 if (Error E = Stream.advanceSkippingSubblocks().moveInto(Entry))
2687 return E;
2688
2689 switch (Entry.Kind) {
2690 case BitstreamEntry::SubBlock: // Handled for us already.
2692 return error("Malformed block");
2694 return Error::success();
2696 // The interesting case.
2697 break;
2698 }
2699
2700 // Read a record.
2701 Record.clear();
2702 ++NumMDRecordLoaded;
2703 Expected<unsigned> MaybeCode = Stream.readRecord(Entry.ID, Record);
2704 if (!MaybeCode)
2705 return MaybeCode.takeError();
2706 switch (MaybeCode.get()) {
2707 default: // Default behavior: ignore.
2708 break;
2709 case bitc::METADATA_KIND: {
2710 if (Error Err = parseMetadataKindRecord(Record))
2711 return Err;
2712 break;
2713 }
2714 }
2715 }
2716}
2717
2719 Pimpl = std::move(RHS.Pimpl);
2720 return *this;
2721}
2723 : Pimpl(std::move(RHS.Pimpl)) {}
2724
2727 BitcodeReaderValueList &ValueList,
2728 bool IsImporting,
2729 MetadataLoaderCallbacks Callbacks)
2730 : Pimpl(std::make_unique<MetadataLoaderImpl>(
2731 Stream, TheModule, ValueList, std::move(Callbacks), IsImporting)) {}
2732
2733Error MetadataLoader::parseMetadata(bool ModuleLevel) {
2734 return Pimpl->parseMetadata(ModuleLevel);
2735}
2736
2737bool MetadataLoader::hasFwdRefs() const { return Pimpl->hasFwdRefs(); }
2738
2739/// Return the given metadata, creating a replaceable forward reference if
2740/// necessary.
2742 return Pimpl->getMetadataFwdRefOrLoad(Idx);
2743}
2744
2746 return Pimpl->lookupSubprogramForFunction(F);
2747}
2748
2750 Function &F, ArrayRef<Instruction *> InstructionList) {
2751 return Pimpl->parseMetadataAttachment(F, InstructionList);
2752}
2753
2755 return Pimpl->parseMetadataKinds();
2756}
2757
2758void MetadataLoader::setStripTBAA(bool StripTBAA) {
2759 return Pimpl->setStripTBAA(StripTBAA);
2760}
2761
2762bool MetadataLoader::isStrippingTBAA() { return Pimpl->isStrippingTBAA(); }
2763
2764unsigned MetadataLoader::size() const { return Pimpl->size(); }
2765void MetadataLoader::shrinkTo(unsigned N) { return Pimpl->shrinkTo(N); }
2766
2768 return Pimpl->upgradeDebugIntrinsics(F);
2769}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
unsigned uint64_t
This file implements a class to represent arbitrary precision integral constant values and operations...
static GCRegistry::Add< ShadowStackGC > C("shadow-stack", "Very portable GC for uncooperative code generators")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
#define LLVM_UNLIKELY(EXPR)
Definition Compiler.h:344
#define LLVM_LIKELY(EXPR)
Definition Compiler.h:343
This file contains the declarations for the subclasses of Constant, which represent the different fla...
dxil translate DXIL Translate Metadata
This file defines the DenseMap class.
This file defines the DenseSet and SmallDenseSet classes.
This file contains constants used for implementing Dwarf debug support.
Module.h This file contains the declarations for the Module class.
static bool lookup(const GsymReader &GR, GsymDataExtractor &Data, uint64_t &Offset, uint64_t BaseAddr, uint64_t Addr, SourceLocations &SrcLocs, llvm::Error &Err)
A Lookup helper functions.
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define GET_OR_DISTINCT(CLASS, ARGS)
#define F(x, y, z)
Definition MD5.cpp:54
#define I(x, y, z)
Definition MD5.cpp:57
static cl::opt< bool > DisableLazyLoading("disable-ondemand-mds-loading", cl::init(false), cl::Hidden, cl::desc("Force disable the lazy-loading on-demand of metadata when " "loading bitcode for importing."))
static Value * getValueFwdRef(BitcodeReaderValueList &ValueList, unsigned Idx, Type *Ty, unsigned TyID)
static int64_t unrotateSign(uint64_t U)
static cl::opt< bool > ImportFullTypeDefinitions("import-full-type-definitions", cl::init(false), cl::Hidden, cl::desc("Import full type definitions for ThinLTO."))
Flag whether we need to import full type definitions for ThinLTO.
This file contains the declarations for metadata subclasses.
Type::TypeID TypeID
Func getContext().diagnose(DiagnosticInfoUnsupported(Func
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
static bool parseMetadata(const StringRef &Input, uint64_t &FunctionHash, uint32_t &Attributes)
Parse Input that contains metadata.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallString class.
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
Definition Statistic.h:171
#define LLVM_DEBUG(...)
Definition Debug.h:119
#define error(X)
std::pair< llvm::MachO::Target, std::string > UUID
Metadata * getMetadataFwdRefOrLoad(unsigned ID)
Error parseMetadataAttachment(Function &F, ArrayRef< Instruction * > InstructionList)
Parse metadata attachments.
MetadataLoaderImpl(BitstreamCursor &Stream, Module &TheModule, BitcodeReaderValueList &ValueList, MetadataLoaderCallbacks Callbacks, bool IsImporting)
Error parseMetadataKinds()
Parse the metadata kinds out of the METADATA_KIND_BLOCK.
Error parseMetadata(bool ModuleLevel)
Parse a METADATA_BLOCK.
DISubprogram * lookupSubprogramForFunction(Function *F)
Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:40
size_t size() const
Get the array size.
Definition ArrayRef.h:141
Value * getValueFwdRef(unsigned Idx, Type *Ty, unsigned TyID, BasicBlock *ConstExprInsertBB)
Definition ValueList.cpp:50
unsigned size() const
Definition ValueList.h:48
This represents a position within a bitcode file, implemented on top of a SimpleBitstreamCursor.
Error JumpToBit(uint64_t BitNo)
Reset the stream to the specified bit number.
uint64_t GetCurrentBitNo() const
Return the bit # of the bit we are reading.
LLVM_ABI Expected< unsigned > readRecord(unsigned AbbrevID, SmallVectorImpl< uint64_t > &Vals, StringRef *Blob=nullptr)
LLVM_ABI Expected< unsigned > skipRecord(unsigned AbbrevID)
Read the current record and discard it, returning the code for the record.
@ AF_DontPopBlockAtEnd
If this flag is used, the advance() method does not automatically pop the block scope when the end of...
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:537
static LLVM_ABI DIArgList * get(LLVMContext &Context, ArrayRef< ValueAsMetadata * > Args)
static DIAssignID * getDistinct(LLVMContext &Context)
static LLVM_ABI DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, Metadata *SizeInBits, uint32_t AlignInBits, Metadata *OffsetInBits, Metadata *Specification, uint32_t NumExtraInhabitants, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, std::optional< uint32_t > EnumKind, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, Metadata *Rank, Metadata *Annotations, Metadata *BitStride)
Build a DICompositeType with the given ODR identifier.
MDString * getRawIdentifier() const
ChecksumKind
Which algorithm (e.g.
A pair of DIGlobalVariable and DIExpression.
A scope for locals.
DIFlags
Debug info flags.
LLVM_ABI DIScope * getScope() const
Subprogram description. Uses SubclassData1.
LLVM_ABI void cleanupRetainedNodes()
When IR modules are merged, typically during LTO, the merged module may contain several types having ...
static LLVM_ABI DISPFlags toSPFlags(bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false)
DISPFlags
Debug info subprogram flags.
bool isForwardDecl() const
Record of a variable value-assignment, aka a non instruction representation of the dbg....
Implements a dense probed hash-table based set.
Definition DenseSet.h:281
Lightweight error class with error context and mandatory checking.
Definition Error.h:159
static ErrorSuccess success()
Create a success value.
Definition Error.h:336
Tagged union holding either a T or a Error.
Definition Error.h:485
Error takeError()
Take ownership of the stored error.
Definition Error.h:612
reference get()
Returns a reference to the stored T value.
Definition Error.h:582
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
static LocalAsMetadata * get(Value *Local)
Definition Metadata.h:563
Metadata node.
Definition Metadata.h:1069
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1575
bool isTemporary() const
Definition Metadata.h:1253
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1579
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1567
A single uniqued string.
Definition Metadata.h:722
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:615
Tuple of metadata.
Definition Metadata.h:1484
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1513
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition Metadata.h:1533
MetadataLoader(BitstreamCursor &Stream, Module &TheModule, BitcodeReaderValueList &ValueList, bool IsImporting, MetadataLoaderCallbacks Callbacks)
Metadata * getMetadataFwdRefOrLoad(unsigned Idx)
Return the given metadata, creating a replaceable forward reference if necessary.
void upgradeDebugIntrinsics(Function &F)
Perform bitcode upgrades on llvm.dbg.* calls.
void shrinkTo(unsigned N)
Error parseMetadataKinds()
Parse a METADATA_KIND block for the current module.
void setStripTBAA(bool StripTBAA=true)
Set the mode to strip TBAA metadata on load.
bool isStrippingTBAA()
Return true if the Loader is stripping TBAA metadata.
Error parseMetadataAttachment(Function &F, ArrayRef< Instruction * > InstructionList)
Parse a METADATA_ATTACHMENT block for a function.
DISubprogram * lookupSubprogramForFunction(Function *F)
Return the DISubprogram metadata for a Function if any, null otherwise.
MetadataLoader & operator=(MetadataLoader &&)
Root of the metadata hierarchy.
Definition Metadata.h:64
A Module instance is used to store all the information related to an LLVM module.
Definition Module.h:67
Represent a mutable reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:294
iterator end() const
Definition ArrayRef.h:339
iterator begin() const
Definition ArrayRef.h:338
A tuple of MDNodes.
Definition Metadata.h:1755
iterator_range< op_iterator > operands()
Definition Metadata.h:1851
LLVM_ABI void addOperand(MDNode *M)
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Implements a dense probed hash-table based set with some number of buckets stored inline.
Definition DenseSet.h:293
SmallString - A SmallString is just a SmallVector with methods and accessors that make it work better...
Definition SmallString.h:26
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void append(ItTy in_start, ItTy in_end)
Add the specified range to the end of the SmallVector.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Represent a constant reference to a string, i.e.
Definition StringRef.h:56
bool starts_with(StringRef Prefix) const
Check if this string starts with the given Prefix.
Definition StringRef.h:258
StringRef drop_front(size_t N=1) const
Return a StringRef equal to 'this' but with the first N elements dropped.
Definition StringRef.h:635
StringRef slice(size_t Start, size_t End) const
Return a reference to the substring from [Start, End).
Definition StringRef.h:720
constexpr size_t size() const
Get the string size.
Definition StringRef.h:144
bool contains(StringRef Other) const
Return true if the given string is a substring of *this, and false otherwise.
Definition StringRef.h:446
The TimeTraceScope is a helper class to call the begin and end functions of the time trace profiler.
Metadata * get() const
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition Twine.h:82
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:46
bool isVoidTy() const
Return true if this is 'void'.
Definition Type.h:141
bool isMetadataTy() const
Return true if this is 'metadata'.
Definition Type.h:233
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:510
LLVM Value Representation.
Definition Value.h:75
std::pair< iterator, bool > insert(const ValueT &V)
Definition DenseSet.h:209
An efficient, type-erasing, non-owning reference to a callable.
constexpr char LanguageVersion[]
Key for Kernel::Metadata::mLanguageVersion.
@ Entry
Definition COFF.h:862
@ METADATA_COMMON_BLOCK
@ METADATA_TEMPLATE_VALUE
@ METADATA_LEXICAL_BLOCK_FILE
@ METADATA_INDEX_OFFSET
@ METADATA_LEXICAL_BLOCK
@ METADATA_SUBROUTINE_TYPE
@ METADATA_GLOBAL_DECL_ATTACHMENT
@ METADATA_OBJC_PROPERTY
@ METADATA_IMPORTED_ENTITY
@ METADATA_GENERIC_SUBRANGE
@ METADATA_COMPILE_UNIT
@ METADATA_COMPOSITE_TYPE
@ METADATA_FIXED_POINT_TYPE
@ METADATA_DERIVED_TYPE
@ METADATA_SUBRANGE_TYPE
@ METADATA_TEMPLATE_TYPE
@ METADATA_GLOBAL_VAR_EXPR
@ METADATA_DISTINCT_NODE
@ METADATA_GENERIC_DEBUG
@ METADATA_KIND_BLOCK_ID
@ METADATA_ATTACHMENT_ID
initializer< Ty > init(const Ty &Val)
@ DW_LLVM_LANG_DIALECT_max
Definition Dwarf.h:212
@ DW_OP_LLVM_fragment
Only used in LLVM metadata.
Definition Dwarf.h:144
@ DW_APPLE_ENUM_KIND_invalid
Enum kind for invalid results.
Definition Dwarf.h:51
NodeAddr< CodeNode * > Code
Definition RDFGraph.h:388
bool empty() const
Definition BasicBlock.h:101
iterator end() const
Definition BasicBlock.h:89
LLVM_ABI Instruction & back() const
LLVM_ABI iterator begin() const
This is an optimization pass for GlobalISel generic memory operations.
@ Offset
Definition DWP.cpp:578
auto cast_if_present(const Y &Val)
cast_if_present<X> - Functionally identical to cast, except that a null value is accepted.
Definition Casting.h:683
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1739
auto size(R &&Range, std::enable_if_t< std::is_base_of< std::random_access_iterator_tag, typename std::iterator_traits< decltype(Range.begin())>::iterator_category >::value, void > *=nullptr)
Get the size of a range.
Definition STLExtras.h:1669
std::error_code make_error_code(BitcodeError E)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:643
constexpr NextUseDistance min(NextUseDistance A, NextUseDistance B)
LLVM_ABI MDNode * upgradeInstructionLoopAttachment(MDNode &N)
Upgrade the loop attachment metadata node.
auto cast_or_null(const Y &Val)
Definition Casting.h:714
bool isa_and_nonnull(const Y &Val)
Definition Casting.h:676
RelativeUniformCounterPtr ValuesPtrExpr VTableAddr Value
Definition InstrProf.h:143
static const DIScope * getScope(const NodeT *N)
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:753
bool mayBeOldLoopAttachmentTag(StringRef Name)
Check whether a string looks like an old loop attachment tag.
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
Definition Debug.cpp:209
LLVM_ABI void report_fatal_error(Error Err, bool gen_crash_diag=true)
Definition Error.cpp:163
class LLVM_GSL_OWNER SmallVector
Forward declaration of SmallVector so that calculateSmallVectorDefaultInlinedElements can reference s...
bool isa(const From &Val)
isa<X> - Return true if the parameter to the template is an instance of one of the template type argu...
Definition Casting.h:547
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
Error make_error(ArgTs &&... Args)
Make a Error instance representing failure using the given error info type.
Definition Error.h:340
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
constexpr NextUseDistance max(NextUseDistance A, NextUseDistance B)
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::string toString(const APInt &I, unsigned Radix, bool Signed, bool formatAsCLiteral=false, bool UpperCase=true, bool InsertSeparators=false)
constexpr unsigned BitWidth
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1917
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:559
LLVM_ABI APInt readWideAPInt(ArrayRef< uint64_t > Vals, unsigned TypeBits)
LLVM_ABI MDNode * UpgradeTBAANode(MDNode &TBAANode)
If the given TBAA tag uses the scalar TBAA format, create a new node corresponding to the upgrade to ...
static auto filterDbgVars(iterator_range< simple_ilist< DbgRecord >::iterator > R)
Filter the DbgRecord range to DbgVariableRecord types only and downcast.
void consumeError(Error Err)
Consume a Error without doing anything.
Definition Error.h:1106
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:878
#define N
When advancing through a bitstream cursor, each advance can discover a few different kinds of entries...