LLVM 22.0.0git
Metadata.cpp
Go to the documentation of this file.
1//===- Metadata.cpp - Implement Metadata classes --------------------------===//
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// This file implements the Metadata classes.
10//
11//===----------------------------------------------------------------------===//
12
13#include "llvm/IR/Metadata.h"
14#include "LLVMContextImpl.h"
15#include "MetadataImpl.h"
16#include "llvm/ADT/APFloat.h"
17#include "llvm/ADT/APInt.h"
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/DenseSet.h"
20#include "llvm/ADT/STLExtras.h"
21#include "llvm/ADT/SetVector.h"
23#include "llvm/ADT/SmallSet.h"
25#include "llvm/ADT/StringMap.h"
26#include "llvm/ADT/StringRef.h"
27#include "llvm/ADT/Twine.h"
28#include "llvm/IR/Argument.h"
29#include "llvm/IR/BasicBlock.h"
30#include "llvm/IR/Constant.h"
33#include "llvm/IR/Constants.h"
35#include "llvm/IR/DebugLoc.h"
37#include "llvm/IR/Function.h"
40#include "llvm/IR/Instruction.h"
41#include "llvm/IR/LLVMContext.h"
42#include "llvm/IR/MDBuilder.h"
43#include "llvm/IR/Module.h"
46#include "llvm/IR/Type.h"
47#include "llvm/IR/Value.h"
51#include <cassert>
52#include <cstddef>
53#include <cstdint>
54#include <type_traits>
55#include <utility>
56#include <vector>
57
58using namespace llvm;
59
60MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
61 : Value(Ty, MetadataAsValueVal), MD(MD) {
62 track();
63}
64
69
70/// Canonicalize metadata arguments to intrinsics.
71///
72/// To support bitcode upgrades (and assembly semantic sugar) for \a
73/// MetadataAsValue, we need to canonicalize certain metadata.
74///
75/// - nullptr is replaced by an empty MDNode.
76/// - An MDNode with a single null operand is replaced by an empty MDNode.
77/// - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
78///
79/// This maintains readability of bitcode from when metadata was a type of
80/// value, and these bridges were unnecessary.
82 Metadata *MD) {
83 if (!MD)
84 // !{}
85 return MDNode::get(Context, {});
86
87 // Return early if this isn't a single-operand MDNode.
88 auto *N = dyn_cast<MDNode>(MD);
89 if (!N || N->getNumOperands() != 1)
90 return MD;
91
92 if (!N->getOperand(0))
93 // !{}
94 return MDNode::get(Context, {});
95
96 if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0)))
97 // Look through the MDNode.
98 return C;
99
100 return MD;
101}
102
103MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) {
104 MD = canonicalizeMetadataForValue(Context, MD);
105 auto *&Entry = Context.pImpl->MetadataAsValues[MD];
106 if (!Entry)
107 Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD);
108 return Entry;
109}
110
112 Metadata *MD) {
113 MD = canonicalizeMetadataForValue(Context, MD);
114 auto &Store = Context.pImpl->MetadataAsValues;
115 return Store.lookup(MD);
116}
117
118void MetadataAsValue::handleChangedMetadata(Metadata *MD) {
119 LLVMContext &Context = getContext();
120 MD = canonicalizeMetadataForValue(Context, MD);
121 auto &Store = Context.pImpl->MetadataAsValues;
122
123 // Stop tracking the old metadata.
124 Store.erase(this->MD);
125 untrack();
126 this->MD = nullptr;
127
128 // Start tracking MD, or RAUW if necessary.
129 auto *&Entry = Store[MD];
130 if (Entry) {
131 replaceAllUsesWith(Entry);
132 delete this;
133 return;
134 }
135
136 this->MD = MD;
137 track();
138 Entry = this;
139}
140
141void MetadataAsValue::track() {
142 if (MD)
143 MetadataTracking::track(&MD, *MD, *this);
144}
145
146void MetadataAsValue::untrack() {
147 if (MD)
149}
150
152 return static_cast<DbgVariableRecord *>(this);
153}
155 return static_cast<const DbgVariableRecord *>(this);
156}
157
159 // NOTE: We could inform the "owner" that a value has changed through
160 // getOwner, if needed.
161 auto OldMD = static_cast<Metadata **>(Old);
162 ptrdiff_t Idx = std::distance(&*DebugValues.begin(), OldMD);
163 // If replacing a ValueAsMetadata with a nullptr, replace it with a
164 // PoisonValue instead.
165 if (OldMD && isa<ValueAsMetadata>(*OldMD) && !New) {
166 auto *OldVAM = cast<ValueAsMetadata>(*OldMD);
167 New = ValueAsMetadata::get(PoisonValue::get(OldVAM->getValue()->getType()));
168 }
169 resetDebugValue(Idx, New);
170}
171
172void DebugValueUser::trackDebugValue(size_t Idx) {
173 assert(Idx < 3 && "Invalid debug value index.");
174 Metadata *&MD = DebugValues[Idx];
175 if (MD)
176 MetadataTracking::track(&MD, *MD, *this);
177}
178
179void DebugValueUser::trackDebugValues() {
180 for (Metadata *&MD : DebugValues)
181 if (MD)
182 MetadataTracking::track(&MD, *MD, *this);
183}
184
185void DebugValueUser::untrackDebugValue(size_t Idx) {
186 assert(Idx < 3 && "Invalid debug value index.");
187 Metadata *&MD = DebugValues[Idx];
188 if (MD)
190}
191
192void DebugValueUser::untrackDebugValues() {
193 for (Metadata *&MD : DebugValues)
194 if (MD)
196}
197
198void DebugValueUser::retrackDebugValues(DebugValueUser &X) {
199 assert(DebugValueUser::operator==(X) && "Expected values to match");
200 for (const auto &[MD, XMD] : zip(DebugValues, X.DebugValues))
201 if (XMD)
203 X.DebugValues.fill(nullptr);
204}
205
206bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
207 assert(Ref && "Expected live reference");
208 assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
209 "Reference without owner must be direct");
210 if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
211 R->addRef(Ref, Owner);
212 return true;
213 }
214 if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
215 assert(!PH->Use && "Placeholders can only be used once");
216 assert(!Owner && "Unexpected callback to owner");
217 PH->Use = static_cast<Metadata **>(Ref);
218 return true;
219 }
220 return false;
221}
222
224 assert(Ref && "Expected live reference");
225 if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
226 R->dropRef(Ref);
227 else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
228 PH->Use = nullptr;
229}
230
231bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
232 assert(Ref && "Expected live reference");
233 assert(New && "Expected live reference");
234 assert(Ref != New && "Expected change");
235 if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
236 R->moveRef(Ref, New, MD);
237 return true;
238 }
240 "Unexpected move of an MDOperand");
241 assert(!isReplaceable(MD) &&
242 "Expected un-replaceable metadata, since we didn't move a reference");
243 return false;
244}
245
247 return ReplaceableMetadataImpl::isReplaceable(MD);
248}
249
252 for (auto Pair : UseMap) {
253 OwnerTy Owner = Pair.second.first;
254 if (Owner.isNull())
255 continue;
256 if (!isa<Metadata *>(Owner))
257 continue;
258 Metadata *OwnerMD = cast<Metadata *>(Owner);
259 if (OwnerMD->getMetadataID() == Metadata::DIArgListKind)
260 MDUsersWithID.push_back(&UseMap[Pair.first]);
261 }
262 llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) {
263 return UserA->second < UserB->second;
264 });
266 for (auto *UserWithID : MDUsersWithID)
267 MDUsers.push_back(cast<Metadata *>(UserWithID->first));
268 return MDUsers;
269}
270
274 for (auto Pair : UseMap) {
275 OwnerTy Owner = Pair.second.first;
276 if (Owner.isNull())
277 continue;
278 if (!isa<DebugValueUser *>(Owner))
279 continue;
280 DVRUsersWithID.push_back(&UseMap[Pair.first]);
281 }
282 // Order DbgVariableRecord users in reverse-creation order. Normal dbg.value
283 // users of MetadataAsValues are ordered by their UseList, i.e. reverse order
284 // of when they were added: we need to replicate that here. The structure of
285 // debug-info output depends on the ordering of intrinsics, thus we need
286 // to keep them consistent for comparisons sake.
287 llvm::sort(DVRUsersWithID, [](auto UserA, auto UserB) {
288 return UserA->second > UserB->second;
289 });
291 for (auto UserWithID : DVRUsersWithID)
292 DVRUsers.push_back(cast<DebugValueUser *>(UserWithID->first)->getUser());
293 return DVRUsers;
294}
295
296void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
297 bool WasInserted =
298 UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
299 .second;
300 (void)WasInserted;
301 assert(WasInserted && "Expected to add a reference");
302
303 ++NextIndex;
304 assert(NextIndex != 0 && "Unexpected overflow");
305}
306
307void ReplaceableMetadataImpl::dropRef(void *Ref) {
308 bool WasErased = UseMap.erase(Ref);
309 (void)WasErased;
310 assert(WasErased && "Expected to drop a reference");
311}
312
313void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
314 const Metadata &MD) {
315 auto I = UseMap.find(Ref);
316 assert(I != UseMap.end() && "Expected to move a reference");
317 auto OwnerAndIndex = I->second;
318 UseMap.erase(I);
319 bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
320 (void)WasInserted;
321 assert(WasInserted && "Expected to add a reference");
322
323 // Check that the references are direct if there's no owner.
324 (void)MD;
325 assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
326 "Reference without owner must be direct");
327 assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
328 "Reference without owner must be direct");
329}
330
332 if (!C.isUsedByMetadata()) {
333 return;
334 }
335
336 LLVMContext &Context = C.getType()->getContext();
337 auto &Store = Context.pImpl->ValuesAsMetadata;
338 auto I = Store.find(&C);
339 ValueAsMetadata *MD = I->second;
340 using UseTy =
341 std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
342 // Copy out uses and update value of Constant used by debug info metadata with
343 // poison below
344 SmallVector<UseTy, 8> Uses(MD->UseMap.begin(), MD->UseMap.end());
345
346 for (const auto &Pair : Uses) {
347 MetadataTracking::OwnerTy Owner = Pair.second.first;
348 if (!Owner)
349 continue;
350 // Check for MetadataAsValue.
351 if (isa<MetadataAsValue *>(Owner)) {
352 cast<MetadataAsValue *>(Owner)->handleChangedMetadata(
354 continue;
355 }
356 if (!isa<Metadata *>(Owner))
357 continue;
358 auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
359 if (!OwnerMD)
360 continue;
361 if (isa<DINode>(OwnerMD)) {
362 OwnerMD->handleChangedOperand(
363 Pair.first, ValueAsMetadata::get(PoisonValue::get(C.getType())));
364 }
365 }
366}
367
369 if (UseMap.empty())
370 return;
371
372 // Copy out uses since UseMap will get touched below.
373 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
374 SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
375 llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
376 return L.second.second < R.second.second;
377 });
378 for (const auto &Pair : Uses) {
379 // Check that this Ref hasn't disappeared after RAUW (when updating a
380 // previous Ref).
381 if (!UseMap.count(Pair.first))
382 continue;
383
384 OwnerTy Owner = Pair.second.first;
385 if (!Owner) {
386 // Update unowned tracking references directly.
387 Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
388 Ref = MD;
389 if (MD)
391 UseMap.erase(Pair.first);
392 continue;
393 }
394
395 // Check for MetadataAsValue.
396 if (isa<MetadataAsValue *>(Owner)) {
397 cast<MetadataAsValue *>(Owner)->handleChangedMetadata(MD);
398 continue;
399 }
400
401 if (auto *DVU = dyn_cast<DebugValueUser *>(Owner)) {
402 DVU->handleChangedValue(Pair.first, MD);
403 continue;
404 }
405
406 // There's a Metadata owner -- dispatch.
407 Metadata *OwnerMD = cast<Metadata *>(Owner);
408 switch (OwnerMD->getMetadataID()) {
409#define HANDLE_METADATA_LEAF(CLASS) \
410 case Metadata::CLASS##Kind: \
411 cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
412 continue;
413#include "llvm/IR/Metadata.def"
414 default:
415 llvm_unreachable("Invalid metadata subclass");
416 }
417 }
418 assert(UseMap.empty() && "Expected all uses to be replaced");
419}
420
422 if (UseMap.empty())
423 return;
424
425 if (!ResolveUsers) {
426 UseMap.clear();
427 return;
428 }
429
430 // Copy out uses since UseMap could get touched below.
431 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
432 SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
433 llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
434 return L.second.second < R.second.second;
435 });
436 UseMap.clear();
437 for (const auto &Pair : Uses) {
438 auto Owner = Pair.second.first;
439 if (!Owner)
440 continue;
441 if (!isa<Metadata *>(Owner))
442 continue;
443
444 // Resolve MDNodes that point at this.
445 auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
446 if (!OwnerMD)
447 continue;
448 if (OwnerMD->isResolved())
449 continue;
450 OwnerMD->decrementUnresolvedOperandCount();
451 }
452}
453
454// Special handing of DIArgList is required in the RemoveDIs project, see
455// commentry in DIArgList::handleChangedOperand for details. Hidden behind
456// conditional compilation to avoid a compile time regression.
457ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
458 if (auto *N = dyn_cast<MDNode>(&MD)) {
459 return !N->isResolved() || N->isAlwaysReplaceable()
460 ? N->Context.getOrCreateReplaceableUses()
461 : nullptr;
462 }
463 if (auto ArgList = dyn_cast<DIArgList>(&MD))
464 return ArgList;
465 return dyn_cast<ValueAsMetadata>(&MD);
466}
467
468ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
469 if (auto *N = dyn_cast<MDNode>(&MD)) {
470 return !N->isResolved() || N->isAlwaysReplaceable()
471 ? N->Context.getReplaceableUses()
472 : nullptr;
473 }
474 if (auto ArgList = dyn_cast<DIArgList>(&MD))
475 return ArgList;
476 return dyn_cast<ValueAsMetadata>(&MD);
477}
478
479bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
480 if (auto *N = dyn_cast<MDNode>(&MD))
481 return !N->isResolved() || N->isAlwaysReplaceable();
482 return isa<ValueAsMetadata>(&MD) || isa<DIArgList>(&MD);
483}
484
486 assert(V && "Expected value");
487 if (auto *A = dyn_cast<Argument>(V)) {
488 if (auto *Fn = A->getParent())
489 return Fn->getSubprogram();
490 return nullptr;
491 }
492
493 if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
494 if (auto *Fn = BB->getParent())
495 return Fn->getSubprogram();
496 return nullptr;
497 }
498
499 return nullptr;
500}
501
503 assert(V && "Unexpected null Value");
504
505 auto &Context = V->getContext();
506 auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
507 if (!Entry) {
509 "Expected constant or function-local value");
510 assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
511 V->IsUsedByMD = true;
512 if (auto *C = dyn_cast<Constant>(V))
513 Entry = new ConstantAsMetadata(C);
514 else
515 Entry = new LocalAsMetadata(V);
516 }
517
518 return Entry;
519}
520
522 assert(V && "Unexpected null Value");
523 return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
524}
525
527 assert(V && "Expected valid value");
528
529 auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
530 auto I = Store.find(V);
531 if (I == Store.end())
532 return;
533
534 // Remove old entry from the map.
535 ValueAsMetadata *MD = I->second;
536 assert(MD && "Expected valid metadata");
537 assert(MD->getValue() == V && "Expected valid mapping");
538 Store.erase(I);
539
540 // Delete the metadata.
541 MD->replaceAllUsesWith(nullptr);
542 delete MD;
543}
544
546 assert(From && "Expected valid value");
547 assert(To && "Expected valid value");
548 assert(From != To && "Expected changed value");
549 assert(&From->getContext() == &To->getContext() && "Expected same context");
550
551 LLVMContext &Context = From->getType()->getContext();
552 auto &Store = Context.pImpl->ValuesAsMetadata;
553 auto I = Store.find(From);
554 if (I == Store.end()) {
555 assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
556 return;
557 }
558
559 // Remove old entry from the map.
560 assert(From->IsUsedByMD && "Expected From to be used by metadata");
561 From->IsUsedByMD = false;
562 ValueAsMetadata *MD = I->second;
563 assert(MD && "Expected valid metadata");
564 assert(MD->getValue() == From && "Expected valid mapping");
565 Store.erase(I);
566
567 if (isa<LocalAsMetadata>(MD)) {
568 if (auto *C = dyn_cast<Constant>(To)) {
569 // Local became a constant.
571 delete MD;
572 return;
573 }
576 // DISubprogram changed.
577 MD->replaceAllUsesWith(nullptr);
578 delete MD;
579 return;
580 }
581 } else if (!isa<Constant>(To)) {
582 // Changed to function-local value.
583 MD->replaceAllUsesWith(nullptr);
584 delete MD;
585 return;
586 }
587
588 auto *&Entry = Store[To];
589 if (Entry) {
590 // The target already exists.
591 MD->replaceAllUsesWith(Entry);
592 delete MD;
593 return;
594 }
595
596 // Update MD in place (and update the map entry).
597 assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
598 To->IsUsedByMD = true;
599 MD->V = To;
600 Entry = MD;
601}
602
603//===----------------------------------------------------------------------===//
604// MDString implementation.
605//
606
607MDString *MDString::get(LLVMContext &Context, StringRef Str) {
608 auto &Store = Context.pImpl->MDStringCache;
609 auto I = Store.try_emplace(Str);
610 auto &MapEntry = I.first->getValue();
611 if (!I.second)
612 return &MapEntry;
613 MapEntry.Entry = &*I.first;
614 return &MapEntry;
615}
616
618 assert(Entry && "Expected to find string map entry");
619 return Entry->first();
621
622//===----------------------------------------------------------------------===//
623// MDNode implementation.
624//
626// Assert that the MDNode types will not be unaligned by the objects
627// prepended to them.
628#define HANDLE_MDNODE_LEAF(CLASS) \
629 static_assert( \
630 alignof(uint64_t) >= alignof(CLASS), \
631 "Alignment is insufficient after objects prepended to " #CLASS);
632#include "llvm/IR/Metadata.def"
633
634void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
635 // uint64_t is the most aligned type we need support (ensured by static_assert
636 // above)
637 size_t AllocSize =
638 alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
639 char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
640 Header *H = new (Mem + AllocSize - sizeof(Header)) Header(NumOps, Storage);
641 return reinterpret_cast<void *>(H + 1);
642}
643
644void MDNode::operator delete(void *N) {
645 Header *H = reinterpret_cast<Header *>(N) - 1;
646 void *Mem = H->getAllocation();
647 H->~Header();
648 ::operator delete(Mem);
649}
650
653 : Metadata(ID, Storage), Context(Context) {
654 unsigned Op = 0;
655 for (Metadata *MD : Ops1)
656 setOperand(Op++, MD);
657 for (Metadata *MD : Ops2)
658 setOperand(Op++, MD);
659
660 if (!isUniqued())
661 return;
662
663 // Count the unresolved operands. If there are any, RAUW support will be
664 // added lazily on first reference.
665 countUnresolvedOperands();
666}
667
668TempMDNode MDNode::clone() const {
669 switch (getMetadataID()) {
670 default:
671 llvm_unreachable("Invalid MDNode subclass");
672#define HANDLE_MDNODE_LEAF(CLASS) \
673 case CLASS##Kind: \
674 return cast<CLASS>(this)->cloneImpl();
675#include "llvm/IR/Metadata.def"
676 }
677}
678
679MDNode::Header::Header(size_t NumOps, StorageType Storage) {
680 IsLarge = isLarge(NumOps);
681 IsResizable = isResizable(Storage);
682 SmallSize = getSmallSize(NumOps, IsResizable, IsLarge);
683 if (IsLarge) {
684 SmallNumOps = 0;
685 new (getLargePtr()) LargeStorageVector();
686 getLarge().resize(NumOps);
687 return;
688 }
689 SmallNumOps = NumOps;
690 MDOperand *O = reinterpret_cast<MDOperand *>(this) - SmallSize;
691 for (MDOperand *E = O + SmallSize; O != E;)
692 (void)new (O++) MDOperand();
693}
694
695MDNode::Header::~Header() {
696 if (IsLarge) {
697 getLarge().~LargeStorageVector();
698 return;
699 }
700 MDOperand *O = reinterpret_cast<MDOperand *>(this);
701 for (MDOperand *E = O - SmallSize; O != E; --O)
702 (O - 1)->~MDOperand();
703}
704
705void *MDNode::Header::getSmallPtr() {
706 static_assert(alignof(MDOperand) <= alignof(Header),
707 "MDOperand too strongly aligned");
708 return reinterpret_cast<char *>(const_cast<Header *>(this)) -
709 sizeof(MDOperand) * SmallSize;
710}
711
712void MDNode::Header::resize(size_t NumOps) {
713 assert(IsResizable && "Node is not resizable");
714 if (operands().size() == NumOps)
715 return;
716
717 if (IsLarge)
718 getLarge().resize(NumOps);
719 else if (NumOps <= SmallSize)
720 resizeSmall(NumOps);
721 else
722 resizeSmallToLarge(NumOps);
723}
724
725void MDNode::Header::resizeSmall(size_t NumOps) {
726 assert(!IsLarge && "Expected a small MDNode");
727 assert(NumOps <= SmallSize && "NumOps too large for small resize");
728
729 MutableArrayRef<MDOperand> ExistingOps = operands();
730 assert(NumOps != ExistingOps.size() && "Expected a different size");
731
732 int NumNew = (int)NumOps - (int)ExistingOps.size();
733 MDOperand *O = ExistingOps.end();
734 for (int I = 0, E = NumNew; I < E; ++I)
735 (O++)->reset();
736 for (int I = 0, E = NumNew; I > E; --I)
737 (--O)->reset();
738 SmallNumOps = NumOps;
739 assert(O == operands().end() && "Operands not (un)initialized until the end");
740}
741
742void MDNode::Header::resizeSmallToLarge(size_t NumOps) {
743 assert(!IsLarge && "Expected a small MDNode");
744 assert(NumOps > SmallSize && "Expected NumOps to be larger than allocation");
745 LargeStorageVector NewOps;
746 NewOps.resize(NumOps);
747 llvm::move(operands(), NewOps.begin());
748 resizeSmall(0);
749 new (getLargePtr()) LargeStorageVector(std::move(NewOps));
750 IsLarge = true;
751}
752
754 if (auto *N = dyn_cast_or_null<MDNode>(Op))
755 return !N->isResolved();
756 return false;
757}
758
759void MDNode::countUnresolvedOperands() {
760 assert(getNumUnresolved() == 0 && "Expected unresolved ops to be uncounted");
761 assert(isUniqued() && "Expected this to be uniqued");
763}
764
765void MDNode::makeUniqued() {
766 assert(isTemporary() && "Expected this to be temporary");
767 assert(!isResolved() && "Expected this to be unresolved");
768
769 // Enable uniquing callbacks.
770 for (auto &Op : mutable_operands())
771 Op.reset(Op.get(), this);
772
773 // Make this 'uniqued'.
775 countUnresolvedOperands();
776 if (!getNumUnresolved()) {
777 dropReplaceableUses();
778 assert(isResolved() && "Expected this to be resolved");
779 }
780
781 assert(isUniqued() && "Expected this to be uniqued");
782}
783
784void MDNode::makeDistinct() {
785 assert(isTemporary() && "Expected this to be temporary");
786 assert(!isResolved() && "Expected this to be unresolved");
787
788 // Drop RAUW support and store as a distinct node.
789 dropReplaceableUses();
791
792 assert(isDistinct() && "Expected this to be distinct");
793 assert(isResolved() && "Expected this to be resolved");
794}
795
797 assert(isUniqued() && "Expected this to be uniqued");
798 assert(!isResolved() && "Expected this to be unresolved");
799
801 dropReplaceableUses();
802
803 assert(isResolved() && "Expected this to be resolved");
804}
805
806void MDNode::dropReplaceableUses() {
807 assert(!getNumUnresolved() && "Unexpected unresolved operand");
808
809 // Drop any RAUW support.
810 if (Context.hasReplaceableUses())
811 Context.takeReplaceableUses()->resolveAllUses();
812}
813
814void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
815 assert(isUniqued() && "Expected this to be uniqued");
816 assert(getNumUnresolved() != 0 && "Expected unresolved operands");
817
818 // Check if an operand was resolved.
819 if (!isOperandUnresolved(Old)) {
820 if (isOperandUnresolved(New))
821 // An operand was un-resolved!
823 } else if (!isOperandUnresolved(New))
824 decrementUnresolvedOperandCount();
825}
826
827void MDNode::decrementUnresolvedOperandCount() {
828 assert(!isResolved() && "Expected this to be unresolved");
829 if (isTemporary())
830 return;
831
832 assert(isUniqued() && "Expected this to be uniqued");
834 if (getNumUnresolved())
835 return;
836
837 // Last unresolved operand has just been resolved.
838 dropReplaceableUses();
839 assert(isResolved() && "Expected this to become resolved");
840}
841
843 if (isResolved())
844 return;
845
846 // Resolve this node immediately.
847 resolve();
848
849 // Resolve all operands.
850 for (const auto &Op : operands()) {
852 if (!N)
853 continue;
854
855 assert(!N->isTemporary() &&
856 "Expected all forward declarations to be resolved");
857 if (!N->isResolved())
858 N->resolveCycles();
859 }
860}
861
862static bool hasSelfReference(MDNode *N) {
863 return llvm::is_contained(N->operands(), N);
864}
865
866MDNode *MDNode::replaceWithPermanentImpl() {
867 switch (getMetadataID()) {
868 default:
869 // If this type isn't uniquable, replace with a distinct node.
870 return replaceWithDistinctImpl();
871
872#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
873 case CLASS##Kind: \
874 break;
875#include "llvm/IR/Metadata.def"
876 }
877
878 // Even if this type is uniquable, self-references have to be distinct.
879 if (hasSelfReference(this))
880 return replaceWithDistinctImpl();
881 return replaceWithUniquedImpl();
882}
883
884MDNode *MDNode::replaceWithUniquedImpl() {
885 // Try to uniquify in place.
886 MDNode *UniquedNode = uniquify();
887
888 if (UniquedNode == this) {
889 makeUniqued();
890 return this;
891 }
892
893 // Collision, so RAUW instead.
894 replaceAllUsesWith(UniquedNode);
895 deleteAsSubclass();
896 return UniquedNode;
897}
898
899MDNode *MDNode::replaceWithDistinctImpl() {
900 makeDistinct();
901 return this;
902}
903
904void MDTuple::recalculateHash() {
905 setHash(MDTupleInfo::KeyTy::calculateHash(this));
906}
907
909 for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
910 setOperand(I, nullptr);
911 if (Context.hasReplaceableUses()) {
912 Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
913 (void)Context.takeReplaceableUses();
914 }
915}
916
917void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
918 unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
919 assert(Op < getNumOperands() && "Expected valid operand");
920
921 if (!isUniqued()) {
922 // This node is not uniqued. Just set the operand and be done with it.
923 setOperand(Op, New);
924 return;
925 }
926
927 // This node is uniqued.
928 eraseFromStore();
929
930 Metadata *Old = getOperand(Op);
931 setOperand(Op, New);
932
933 // Drop uniquing for self-reference cycles and deleted constants.
934 if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
935 if (!isResolved())
936 resolve();
938 return;
939 }
940
941 // Re-unique the node.
942 auto *Uniqued = uniquify();
943 if (Uniqued == this) {
944 if (!isResolved())
945 resolveAfterOperandChange(Old, New);
946 return;
947 }
948
949 // Collision.
950 if (!isResolved()) {
951 // Still unresolved, so RAUW.
952 //
953 // First, clear out all operands to prevent any recursion (similar to
954 // dropAllReferences(), but we still need the use-list).
955 for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
956 setOperand(O, nullptr);
957 if (Context.hasReplaceableUses())
958 Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
959 deleteAsSubclass();
960 return;
961 }
962
963 // Store in non-uniqued form if RAUW isn't possible.
965}
966
967void MDNode::deleteAsSubclass() {
968 switch (getMetadataID()) {
969 default:
970 llvm_unreachable("Invalid subclass of MDNode");
971#define HANDLE_MDNODE_LEAF(CLASS) \
972 case CLASS##Kind: \
973 delete cast<CLASS>(this); \
974 break;
975#include "llvm/IR/Metadata.def"
976 }
977}
978
979template <class T, class InfoT>
981 if (T *U = getUniqued(Store, N))
982 return U;
983
984 Store.insert(N);
985 return N;
986}
987
988template <class NodeTy> struct MDNode::HasCachedHash {
989 template <class U>
990 using check = decltype(static_cast<void (U::*)(unsigned)>(&U::setHash));
991
993};
994
995MDNode *MDNode::uniquify() {
996 assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
997
998 // Try to insert into uniquing store.
999 switch (getMetadataID()) {
1000 default:
1001 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1002#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1003 case CLASS##Kind: { \
1004 CLASS *SubclassThis = cast<CLASS>(this); \
1005 std::bool_constant<HasCachedHash<CLASS>::value> ShouldRecalculateHash; \
1006 dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \
1007 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
1008 }
1009#include "llvm/IR/Metadata.def"
1010 }
1011}
1012
1013void MDNode::eraseFromStore() {
1014 switch (getMetadataID()) {
1015 default:
1016 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1017#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1018 case CLASS##Kind: \
1019 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
1020 break;
1021#include "llvm/IR/Metadata.def"
1022 }
1023}
1024
1025MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1026 StorageType Storage, bool ShouldCreate) {
1027 unsigned Hash = 0;
1028 if (Storage == Uniqued) {
1029 MDTupleInfo::KeyTy Key(MDs);
1030 if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
1031 return N;
1032 if (!ShouldCreate)
1033 return nullptr;
1034 Hash = Key.getHash();
1035 } else {
1036 assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
1037 }
1038
1039 return storeImpl(new (MDs.size(), Storage)
1040 MDTuple(Context, Storage, Hash, MDs),
1041 Storage, Context.pImpl->MDTuples);
1042}
1043
1045 assert(N->isTemporary() && "Expected temporary node");
1046 N->replaceAllUsesWith(nullptr);
1047 N->deleteAsSubclass();
1048}
1049
1051 assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
1052 assert(!getNumUnresolved() && "Unexpected unresolved nodes");
1053 Storage = Distinct;
1054 assert(isResolved() && "Expected this to be resolved");
1055
1056 // Reset the hash.
1057 switch (getMetadataID()) {
1058 default:
1059 llvm_unreachable("Invalid subclass of MDNode");
1060#define HANDLE_MDNODE_LEAF(CLASS) \
1061 case CLASS##Kind: { \
1062 std::bool_constant<HasCachedHash<CLASS>::value> ShouldResetHash; \
1063 dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \
1064 break; \
1065 }
1066#include "llvm/IR/Metadata.def"
1067 }
1068
1069 getContext().pImpl->DistinctMDNodes.push_back(this);
1070}
1071
1073 if (getOperand(I) == New)
1074 return;
1075
1076 if (!isUniqued()) {
1077 setOperand(I, New);
1078 return;
1079 }
1080
1081 handleChangedOperand(mutable_begin() + I, New);
1082}
1083
1084void MDNode::setOperand(unsigned I, Metadata *New) {
1085 assert(I < getNumOperands());
1086 mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
1087}
1088
1089/// Get a node or a self-reference that looks like it.
1090///
1091/// Special handling for finding self-references, for use by \a
1092/// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
1093/// when self-referencing nodes were still uniqued. If the first operand has
1094/// the same operands as \c Ops, return the first operand instead.
1097 if (!Ops.empty())
1099 if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
1100 for (unsigned I = 1, E = Ops.size(); I != E; ++I)
1101 if (Ops[I] != N->getOperand(I))
1102 return MDNode::get(Context, Ops);
1103 return N;
1104 }
1105
1106 return MDNode::get(Context, Ops);
1107}
1108
1110 if (!A)
1111 return B;
1112 if (!B)
1113 return A;
1114
1115 SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
1116 MDs.insert(B->op_begin(), B->op_end());
1117
1118 // FIXME: This preserves long-standing behaviour, but is it really the right
1119 // behaviour? Or was that an unintended side-effect of node uniquing?
1120 return getOrSelfReference(A->getContext(), MDs.getArrayRef());
1121}
1122
1124 if (!A || !B)
1125 return nullptr;
1126
1127 SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
1128 SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
1129 MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); });
1130
1131 // FIXME: This preserves long-standing behaviour, but is it really the right
1132 // behaviour? Or was that an unintended side-effect of node uniquing?
1133 return getOrSelfReference(A->getContext(), MDs.getArrayRef());
1134}
1135
1137 if (!A || !B)
1138 return nullptr;
1139
1140 // Take the intersection of domains then union the scopes
1141 // within those domains
1143 SmallPtrSet<const MDNode *, 16> IntersectDomains;
1145 for (const MDOperand &MDOp : A->operands())
1146 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1147 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1148 ADomains.insert(Domain);
1149
1150 for (const MDOperand &MDOp : B->operands())
1151 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1152 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1153 if (ADomains.contains(Domain)) {
1154 IntersectDomains.insert(Domain);
1155 MDs.insert(MDOp);
1156 }
1157
1158 for (const MDOperand &MDOp : A->operands())
1159 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1160 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1161 if (IntersectDomains.contains(Domain))
1162 MDs.insert(MDOp);
1163
1164 return MDs.empty() ? nullptr
1165 : getOrSelfReference(A->getContext(), MDs.getArrayRef());
1166}
1167
1169 if (!A || !B)
1170 return nullptr;
1171
1172 APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
1173 APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
1174 if (AVal < BVal)
1175 return A;
1176 return B;
1177}
1178
1179// Call instructions with branch weights are only used in SamplePGO as
1180// documented in
1181/// https://llvm.org/docs/BranchWeightMetadata.html#callinst).
1182MDNode *MDNode::mergeDirectCallProfMetadata(MDNode *A, MDNode *B,
1183 const Instruction *AInstr,
1184 const Instruction *BInstr) {
1185 assert(A && B && AInstr && BInstr && "Caller should guarantee");
1186 auto &Ctx = AInstr->getContext();
1187 MDBuilder MDHelper(Ctx);
1188
1189 // LLVM IR verifier verifies !prof metadata has at least 2 operands.
1190 assert(A->getNumOperands() >= 2 && B->getNumOperands() >= 2 &&
1191 "!prof annotations should have no less than 2 operands");
1192 MDString *AMDS = dyn_cast<MDString>(A->getOperand(0));
1193 MDString *BMDS = dyn_cast<MDString>(B->getOperand(0));
1194 // LLVM IR verfier verifies first operand is MDString.
1195 assert(AMDS != nullptr && BMDS != nullptr &&
1196 "first operand should be a non-null MDString");
1197 StringRef AProfName = AMDS->getString();
1198 StringRef BProfName = BMDS->getString();
1199 if (AProfName == MDProfLabels::BranchWeights &&
1200 BProfName == MDProfLabels::BranchWeights) {
1202 A->getOperand(getBranchWeightOffset(A)));
1204 B->getOperand(getBranchWeightOffset(B)));
1205 assert(AInstrWeight && BInstrWeight && "verified by LLVM verifier");
1206 return MDNode::get(Ctx,
1207 {MDHelper.createString(MDProfLabels::BranchWeights),
1208 MDHelper.createConstant(ConstantInt::get(
1209 Type::getInt64Ty(Ctx),
1210 SaturatingAdd(AInstrWeight->getZExtValue(),
1211 BInstrWeight->getZExtValue())))});
1212 }
1213 return nullptr;
1214}
1215
1216// Pass in both instructions and nodes. Instruction information (e.g.,
1217// instruction type) helps interpret profiles and make implementation clearer.
1219 const Instruction *AInstr,
1220 const Instruction *BInstr) {
1221 // Check that it is legal to merge prof metadata based on the opcode.
1222 auto IsLegal = [](const Instruction &I) -> bool {
1223 switch (I.getOpcode()) {
1224 case Instruction::Invoke:
1225 case Instruction::Br:
1226 case Instruction::Switch:
1227 case Instruction::Call:
1228 case Instruction::IndirectBr:
1229 case Instruction::Select:
1230 case Instruction::CallBr:
1231 return true;
1232 default:
1233 return false;
1234 }
1235 };
1236 if (AInstr && !IsLegal(*AInstr))
1237 return nullptr;
1238 if (BInstr && !IsLegal(*BInstr))
1239 return nullptr;
1240
1241 if (!(A && B)) {
1242 return A ? A : B;
1243 }
1244
1245 assert(AInstr->getMetadata(LLVMContext::MD_prof) == A &&
1246 "Caller should guarantee");
1247 assert(BInstr->getMetadata(LLVMContext::MD_prof) == B &&
1248 "Caller should guarantee");
1249
1250 const CallInst *ACall = dyn_cast<CallInst>(AInstr);
1251 const CallInst *BCall = dyn_cast<CallInst>(BInstr);
1252
1253 // Both ACall and BCall are direct callsites.
1254 if (ACall && BCall && ACall->getCalledFunction() &&
1255 BCall->getCalledFunction())
1256 return mergeDirectCallProfMetadata(A, B, AInstr, BInstr);
1257
1258 // The rest of the cases are not implemented but could be added
1259 // when there are use cases.
1260 return nullptr;
1261}
1262
1263static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
1264 return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
1265}
1266
1267static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
1268 return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
1269}
1270
1273 ConstantRange NewRange(Low->getValue(), High->getValue());
1274 unsigned Size = EndPoints.size();
1275 const APInt &LB = EndPoints[Size - 2]->getValue();
1276 const APInt &LE = EndPoints[Size - 1]->getValue();
1277 ConstantRange LastRange(LB, LE);
1278 if (canBeMerged(NewRange, LastRange)) {
1279 ConstantRange Union = LastRange.unionWith(NewRange);
1280 Type *Ty = High->getType();
1281 EndPoints[Size - 2] =
1282 cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
1283 EndPoints[Size - 1] =
1284 cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
1285 return true;
1286 }
1287 return false;
1288}
1289
1292 if (!EndPoints.empty())
1293 if (tryMergeRange(EndPoints, Low, High))
1294 return;
1295
1296 EndPoints.push_back(Low);
1297 EndPoints.push_back(High);
1298}
1299
1301 // Drop the callee_type metadata if either of the call instructions do not
1302 // have it.
1303 if (!A || !B)
1304 return nullptr;
1306 SmallPtrSet<Metadata *, 8> MergedCallees;
1307 auto AddUniqueCallees = [&AB, &MergedCallees](const MDNode *N) {
1308 for (Metadata *MD : N->operands()) {
1309 if (MergedCallees.insert(MD).second)
1310 AB.push_back(MD);
1311 }
1312 };
1313 AddUniqueCallees(A);
1314 AddUniqueCallees(B);
1315 return MDNode::get(A->getContext(), AB);
1316}
1317
1319 // Given two ranges, we want to compute the union of the ranges. This
1320 // is slightly complicated by having to combine the intervals and merge
1321 // the ones that overlap.
1322
1323 if (!A || !B)
1324 return nullptr;
1325
1326 if (A == B)
1327 return A;
1328
1329 // First, walk both lists in order of the lower boundary of each interval.
1330 // At each step, try to merge the new interval to the last one we added.
1332 unsigned AI = 0;
1333 unsigned BI = 0;
1334 unsigned AN = A->getNumOperands() / 2;
1335 unsigned BN = B->getNumOperands() / 2;
1336 while (AI < AN && BI < BN) {
1337 ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
1338 ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
1339
1340 if (ALow->getValue().slt(BLow->getValue())) {
1341 addRange(EndPoints, ALow,
1342 mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1343 ++AI;
1344 } else {
1345 addRange(EndPoints, BLow,
1346 mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1347 ++BI;
1348 }
1349 }
1350 while (AI < AN) {
1351 addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
1352 mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1353 ++AI;
1354 }
1355 while (BI < BN) {
1356 addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
1357 mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1358 ++BI;
1359 }
1360
1361 // We haven't handled wrap in the previous merge,
1362 // if we have at least 2 ranges (4 endpoints) we have to try to merge
1363 // the last and first ones.
1364 unsigned Size = EndPoints.size();
1365 if (Size > 2) {
1366 ConstantInt *FB = EndPoints[0];
1367 ConstantInt *FE = EndPoints[1];
1368 if (tryMergeRange(EndPoints, FB, FE)) {
1369 for (unsigned i = 0; i < Size - 2; ++i) {
1370 EndPoints[i] = EndPoints[i + 2];
1371 }
1372 EndPoints.resize(Size - 2);
1373 }
1374 }
1375
1376 // If in the end we have a single range, it is possible that it is now the
1377 // full range. Just drop the metadata in that case.
1378 if (EndPoints.size() == 2) {
1379 ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
1380 if (Range.isFullSet())
1381 return nullptr;
1382 }
1383
1385 MDs.reserve(EndPoints.size());
1386 for (auto *I : EndPoints)
1388 return MDNode::get(A->getContext(), MDs);
1389}
1390
1392 if (!A || !B)
1393 return nullptr;
1394
1395 if (A == B)
1396 return A;
1397
1398 SmallVector<ConstantRange> RangeListA, RangeListB;
1399 for (unsigned I = 0, E = A->getNumOperands() / 2; I != E; ++I) {
1400 auto *LowA = mdconst::extract<ConstantInt>(A->getOperand(2 * I + 0));
1401 auto *HighA = mdconst::extract<ConstantInt>(A->getOperand(2 * I + 1));
1402 RangeListA.push_back(ConstantRange(LowA->getValue(), HighA->getValue()));
1403 }
1404
1405 for (unsigned I = 0, E = B->getNumOperands() / 2; I != E; ++I) {
1406 auto *LowB = mdconst::extract<ConstantInt>(B->getOperand(2 * I + 0));
1407 auto *HighB = mdconst::extract<ConstantInt>(B->getOperand(2 * I + 1));
1408 RangeListB.push_back(ConstantRange(LowB->getValue(), HighB->getValue()));
1409 }
1410
1411 ConstantRangeList CRLA(RangeListA);
1412 ConstantRangeList CRLB(RangeListB);
1413 ConstantRangeList Result = CRLA.intersectWith(CRLB);
1414 if (Result.empty())
1415 return nullptr;
1416
1418 for (const ConstantRange &CR : Result) {
1420 ConstantInt::get(A->getContext(), CR.getLower())));
1422 ConstantInt::get(A->getContext(), CR.getUpper())));
1423 }
1424
1425 return MDNode::get(A->getContext(), MDs);
1426}
1427
1429 if (!A || !B)
1430 return nullptr;
1431
1432 ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
1433 ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
1434 if (AVal->getZExtValue() < BVal->getZExtValue())
1435 return A;
1436 return B;
1437}
1438
1439//===----------------------------------------------------------------------===//
1440// NamedMDNode implementation.
1441//
1442
1446
1447NamedMDNode::NamedMDNode(const Twine &N)
1448 : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
1449
1452 delete &getNMDOps(Operands);
1453}
1454
1456 return (unsigned)getNMDOps(Operands).size();
1457}
1458
1460 assert(i < getNumOperands() && "Invalid Operand number!");
1461 auto *N = getNMDOps(Operands)[i].get();
1462 return cast_or_null<MDNode>(N);
1463}
1464
1465void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
1466
1467void NamedMDNode::setOperand(unsigned I, MDNode *New) {
1468 assert(I < getNumOperands() && "Invalid operand number");
1469 getNMDOps(Operands)[I].reset(New);
1470}
1471
1473
1474void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
1475
1477
1478//===----------------------------------------------------------------------===//
1479// Instruction Metadata method implementations.
1480//
1481
1483 for (const auto &A : Attachments)
1484 if (A.MDKind == ID)
1485 return A.Node;
1486 return nullptr;
1487}
1488
1489void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
1490 for (const auto &A : Attachments)
1491 if (A.MDKind == ID)
1492 Result.push_back(A.Node);
1493}
1494
1496 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1497 for (const auto &A : Attachments)
1498 Result.emplace_back(A.MDKind, A.Node);
1499
1500 // Sort the resulting array so it is stable with respect to metadata IDs. We
1501 // need to preserve the original insertion order though.
1502 if (Result.size() > 1)
1503 llvm::stable_sort(Result, less_first());
1504}
1505
1506void MDAttachments::set(unsigned ID, MDNode *MD) {
1507 erase(ID);
1508 if (MD)
1509 insert(ID, *MD);
1510}
1511
1512void MDAttachments::insert(unsigned ID, MDNode &MD) {
1513 Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1514}
1515
1516bool MDAttachments::erase(unsigned ID) {
1517 if (empty())
1518 return false;
1519
1520 // Common case is one value.
1521 if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1522 Attachments.pop_back();
1523 return true;
1524 }
1525
1526 auto OldSize = Attachments.size();
1527 llvm::erase_if(Attachments,
1528 [ID](const Attachment &A) { return A.MDKind == ID; });
1529 return OldSize != Attachments.size();
1530}
1531
1533 if (!hasMetadata())
1534 return nullptr;
1535 unsigned KindID = getContext().getMDKindID(Kind);
1536 return getMetadataImpl(KindID);
1537}
1538
1539MDNode *Value::getMetadataImpl(unsigned KindID) const {
1540 const LLVMContext &Ctx = getContext();
1541 const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
1542 return Attachements.lookup(KindID);
1543}
1544
1545void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1546 if (hasMetadata())
1547 getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
1548}
1549
1551 if (hasMetadata())
1552 getMetadata(getContext().getMDKindID(Kind), MDs);
1553}
1554
1556 SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1557 if (hasMetadata()) {
1558 assert(getContext().pImpl->ValueMetadata.count(this) &&
1559 "bit out of sync with hash table");
1560 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1561 Info.getAll(MDs);
1562 }
1563}
1564
1565void Value::setMetadata(unsigned KindID, MDNode *Node) {
1567
1568 // Handle the case when we're adding/updating metadata on a value.
1569 if (Node) {
1571 assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1572 if (Info.empty())
1573 HasMetadata = true;
1574 Info.set(KindID, Node);
1575 return;
1576 }
1577
1578 // Otherwise, we're removing metadata from an instruction.
1579 assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1580 "bit out of sync with hash table");
1581 if (!HasMetadata)
1582 return; // Nothing to remove!
1583 MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1584
1585 // Handle removal of an existing value.
1586 Info.erase(KindID);
1587 if (!Info.empty())
1588 return;
1589 getContext().pImpl->ValueMetadata.erase(this);
1590 HasMetadata = false;
1591}
1592
1594 if (!Node && !HasMetadata)
1595 return;
1596 setMetadata(getContext().getMDKindID(Kind), Node);
1597}
1598
1599void Value::addMetadata(unsigned KindID, MDNode &MD) {
1601 if (!HasMetadata)
1602 HasMetadata = true;
1603 getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1604}
1605
1607 addMetadata(getContext().getMDKindID(Kind), MD);
1608}
1609
1610bool Value::eraseMetadata(unsigned KindID) {
1611 // Nothing to unset.
1612 if (!HasMetadata)
1613 return false;
1614
1615 MDAttachments &Store = getContext().pImpl->ValueMetadata.find(this)->second;
1616 bool Changed = Store.erase(KindID);
1617 if (Store.empty())
1618 clearMetadata();
1619 return Changed;
1620}
1621
1622void Value::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1623 if (!HasMetadata)
1624 return;
1625
1626 auto &MetadataStore = getContext().pImpl->ValueMetadata;
1627 MDAttachments &Info = MetadataStore.find(this)->second;
1628 assert(!Info.empty() && "bit out of sync with hash table");
1629 Info.remove_if([Pred](const MDAttachments::Attachment &I) {
1630 return Pred(I.MDKind, I.Node);
1631 });
1632
1633 if (Info.empty())
1634 clearMetadata();
1635}
1636
1638 if (!HasMetadata)
1639 return;
1640 assert(getContext().pImpl->ValueMetadata.count(this) &&
1641 "bit out of sync with hash table");
1642 getContext().pImpl->ValueMetadata.erase(this);
1643 HasMetadata = false;
1644}
1645
1647 if (!Node && !hasMetadata())
1648 return;
1649 setMetadata(getContext().getMDKindID(Kind), Node);
1650}
1651
1652MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
1653 const LLVMContext &Ctx = getContext();
1654 unsigned KindID = Ctx.getMDKindID(Kind);
1655 if (KindID == LLVMContext::MD_dbg)
1656 return DbgLoc.getAsMDNode();
1657 return Value::getMetadata(KindID);
1658}
1659
1660void Instruction::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1661 if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
1662 DbgLoc = {};
1663
1665}
1666
1668 if (!Value::hasMetadata())
1669 return; // Nothing to remove!
1670
1671 SmallSet<unsigned, 32> KnownSet(llvm::from_range, KnownIDs);
1672
1673 // A DIAssignID attachment is debug metadata, don't drop it.
1674 KnownSet.insert(LLVMContext::MD_DIAssignID);
1675
1676 Value::eraseMetadataIf([&KnownSet](unsigned MDKind, MDNode *Node) {
1677 return !KnownSet.count(MDKind);
1678 });
1679}
1680
1681void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1682 auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1683 if (const DIAssignID *CurrentID =
1684 cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1685 // Nothing to do if the ID isn't changing.
1686 if (ID == CurrentID)
1687 return;
1688
1689 // Unmap this instruction from its current ID.
1690 auto InstrsIt = IDToInstrs.find(CurrentID);
1691 assert(InstrsIt != IDToInstrs.end() &&
1692 "Expect existing attachment to be mapped");
1693
1694 auto &InstVec = InstrsIt->second;
1695 auto *InstIt = llvm::find(InstVec, this);
1696 assert(InstIt != InstVec.end() &&
1697 "Expect instruction to be mapped to attachment");
1698 // The vector contains a ptr to this. If this is the only element in the
1699 // vector, remove the ID:vector entry, otherwise just remove the
1700 // instruction from the vector.
1701 if (InstVec.size() == 1)
1702 IDToInstrs.erase(InstrsIt);
1703 else
1704 InstVec.erase(InstIt);
1705 }
1706
1707 // Map this instruction to the new ID.
1708 if (ID)
1709 IDToInstrs[ID].push_back(this);
1710}
1711
1712void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
1713 if (!Node && !hasMetadata())
1714 return;
1715
1716 // Handle 'dbg' as a special case since it is not stored in the hash table.
1717 if (KindID == LLVMContext::MD_dbg) {
1718 DbgLoc = DebugLoc(Node);
1719 return;
1720 }
1721
1722 // Update DIAssignID to Instruction(s) mapping.
1723 if (KindID == LLVMContext::MD_DIAssignID) {
1724 // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1725 // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1726 // having a dedicated assert helps make this obvious.
1727 assert((!Node || !Node->isTemporary()) &&
1728 "Temporary DIAssignIDs are invalid");
1729 updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1730 }
1731
1732 Value::setMetadata(KindID, Node);
1733}
1734
1737 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1738 SmallSetVector<StringRef, 2> AnnotationsSet(Annotations.begin(),
1739 Annotations.end());
1740 auto *Tuple = cast<MDTuple>(Existing);
1741 for (auto &N : Tuple->operands()) {
1742 if (isa<MDString>(N.get())) {
1743 Names.push_back(N);
1744 continue;
1745 }
1746 auto *MDAnnotationTuple = cast<MDTuple>(N);
1747 if (any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](auto &Op) {
1748 return AnnotationsSet.contains(cast<MDString>(Op)->getString());
1749 }))
1750 return;
1751 Names.push_back(N);
1752 }
1753 }
1754
1755 MDBuilder MDB(getContext());
1756 SmallVector<Metadata *> MDAnnotationStrings;
1757 for (StringRef Annotation : Annotations)
1758 MDAnnotationStrings.push_back(MDB.createString(Annotation));
1759 MDNode *InfoTuple = MDTuple::get(getContext(), MDAnnotationStrings);
1760 Names.push_back(InfoTuple);
1761 MDNode *MD = MDTuple::get(getContext(), Names);
1762 setMetadata(LLVMContext::MD_annotation, MD);
1763}
1764
1767 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1768 auto *Tuple = cast<MDTuple>(Existing);
1769 for (auto &N : Tuple->operands()) {
1770 if (isa<MDString>(N.get()) &&
1771 cast<MDString>(N.get())->getString() == Name)
1772 return;
1773 Names.push_back(N.get());
1774 }
1775 }
1776
1777 MDBuilder MDB(getContext());
1778 Names.push_back(MDB.createString(Name));
1779 MDNode *MD = MDTuple::get(getContext(), Names);
1780 setMetadata(LLVMContext::MD_annotation, MD);
1781}
1782
1784 AAMDNodes Result;
1785 // Not using Instruction::hasMetadata() because we're not interested in
1786 // DebugInfoMetadata.
1787 if (Value::hasMetadata()) {
1788 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1789 Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1790 Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1791 Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1792 Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1793 Result.NoAliasAddrSpace = Info.lookup(LLVMContext::MD_noalias_addrspace);
1794 }
1795 return Result;
1796}
1797
1799 setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1800 setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
1801 setMetadata(LLVMContext::MD_alias_scope, N.Scope);
1802 setMetadata(LLVMContext::MD_noalias, N.NoAlias);
1803 setMetadata(LLVMContext::MD_noalias_addrspace, N.NoAliasAddrSpace);
1804}
1805
1807 setMetadata(llvm::LLVMContext::MD_nosanitize,
1809}
1810
1811void Instruction::getAllMetadataImpl(
1812 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1813 Result.clear();
1814
1815 // Handle 'dbg' as a special case since it is not stored in the hash table.
1816 if (DbgLoc) {
1817 Result.push_back(
1818 std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
1819 }
1820 Value::getAllMetadata(Result);
1821}
1822
1824 assert(
1825 (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1826 getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1827 getOpcode() == Instruction::IndirectBr ||
1828 getOpcode() == Instruction::Switch) &&
1829 "Looking for branch weights on something besides branch");
1830
1831 return ::extractProfTotalWeight(*this, TotalVal);
1832}
1833
1836 Other->getAllMetadata(MDs);
1837 for (auto &MD : MDs) {
1838 // We need to adjust the type metadata offset.
1839 if (Offset != 0 && MD.first == LLVMContext::MD_type) {
1840 auto *OffsetConst = cast<ConstantInt>(
1841 cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
1842 Metadata *TypeId = MD.second->getOperand(1);
1843 auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
1844 OffsetConst->getType(), OffsetConst->getValue() + Offset));
1845 addMetadata(LLVMContext::MD_type,
1846 *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
1847 continue;
1848 }
1849 // If an offset adjustment was specified we need to modify the DIExpression
1850 // to prepend the adjustment:
1851 // !DIExpression(DW_OP_plus, Offset, [original expr])
1852 auto *Attachment = MD.second;
1853 if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1855 DIExpression *E = nullptr;
1856 if (!GV) {
1857 auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
1858 GV = GVE->getVariable();
1859 E = GVE->getExpression();
1860 }
1861 ArrayRef<uint64_t> OrigElements;
1862 if (E)
1863 OrigElements = E->getElements();
1864 std::vector<uint64_t> Elements(OrigElements.size() + 2);
1865 Elements[0] = dwarf::DW_OP_plus_uconst;
1866 Elements[1] = Offset;
1867 llvm::copy(OrigElements, Elements.begin() + 2);
1868 E = DIExpression::get(getContext(), Elements);
1869 Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
1870 }
1871 addMetadata(MD.first, *Attachment);
1872 }
1873}
1874
1877 LLVMContext::MD_type,
1879 {ConstantAsMetadata::get(ConstantInt::get(
1881 TypeID}));
1882}
1883
1885 // Remove any existing vcall visibility metadata first in case we are
1886 // updating.
1887 eraseMetadata(LLVMContext::MD_vcall_visibility);
1888 addMetadata(LLVMContext::MD_vcall_visibility,
1890 {ConstantAsMetadata::get(ConstantInt::get(
1892}
1893
1895 if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
1897 cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
1898 ->getZExtValue();
1899 assert(Val <= 2 && "unknown vcall visibility!");
1900 return (VCallVisibility)Val;
1901 }
1903}
1904
1906 setMetadata(LLVMContext::MD_dbg, SP);
1907}
1908
1910 return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
1911}
1912
1914 if (DISubprogram *SP = getSubprogram()) {
1915 if (DICompileUnit *CU = SP->getUnit()) {
1916 return CU->getDebugInfoForProfiling();
1917 }
1918 }
1919 return false;
1920}
1921
1923 addMetadata(LLVMContext::MD_dbg, *GV);
1924}
1925
1929 getMetadata(LLVMContext::MD_dbg, MDs);
1930 for (MDNode *MD : MDs)
1932}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
This file defines the StringMap class.
This file declares a class to represent arbitrary precision floating point values and provide a varie...
This file implements a class to represent arbitrary precision integral constant values and operations...
static const Function * getParent(const Value *V)
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
static Domain getDomain(const ConstantRange &CR)
dxil translate DXIL Translate Metadata
This file defines the DenseSet and SmallDenseSet classes.
Module.h This file contains the declarations for the Module class.
const size_t AbstractManglingParser< Derived, Alloc >::NumOps
const AbstractManglingParser< Derived, Alloc >::OperatorInfo AbstractManglingParser< Derived, Alloc >::Ops[]
#define I(x, y, z)
Definition MD5.cpp:58
#define H(x, y, z)
Definition MD5.cpp:57
mir Rename Register Operands
static DISubprogram * getLocalFunctionMetadata(Value *V)
Definition Metadata.cpp:485
static Metadata * canonicalizeMetadataForValue(LLVMContext &Context, Metadata *MD)
Canonicalize metadata arguments to intrinsics.
Definition Metadata.cpp:81
static bool isOperandUnresolved(Metadata *Op)
Definition Metadata.cpp:753
static bool hasSelfReference(MDNode *N)
Definition Metadata.cpp:862
static void addRange(SmallVectorImpl< ConstantInt * > &EndPoints, ConstantInt *Low, ConstantInt *High)
static SmallVector< TrackingMDRef, 4 > & getNMDOps(void *Operands)
static bool canBeMerged(const ConstantRange &A, const ConstantRange &B)
static T * uniquifyImpl(T *N, DenseSet< T *, InfoT > &Store)
Definition Metadata.cpp:980
static bool isContiguous(const ConstantRange &A, const ConstantRange &B)
static MDNode * getOrSelfReference(LLVMContext &Context, ArrayRef< Metadata * > Ops)
Get a node or a self-reference that looks like it.
static bool tryMergeRange(SmallVectorImpl< ConstantInt * > &EndPoints, ConstantInt *Low, ConstantInt *High)
This file contains the declarations for metadata subclasses.
#define T
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
uint64_t High
This file contains the declarations for profiling metadata utility functions.
Remove Loads Into Fake Uses
This file contains some templates that are useful if you are working with the STL at all.
This file implements a set that has insertion order iteration characteristics.
This file defines the SmallPtrSet class.
This file defines the SmallSet class.
This file defines the SmallVector class.
static TableGen::Emitter::OptClass< SkeletonEmitter > X("gen-skeleton-class", "Generate example skeleton class")
Class for arbitrary precision integers.
Definition APInt.h:78
bool slt(const APInt &RHS) const
Signed less than comparison.
Definition APInt.h:1130
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
Definition Metadata.h:1589
Annotations lets you mark points and ranges inside source code, for tests:
Definition Annotations.h:53
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition ArrayRef.h:41
size_t size() const
size - Get the array size.
Definition ArrayRef.h:147
LLVM Basic Block Representation.
Definition BasicBlock.h:62
Function * getCalledFunction() const
Returns the function called, or null if this is an indirect function invocation or the function signa...
This class represents a function call, abstracting a target machine's calling convention.
static ConstantAsMetadata * get(Constant *C)
Definition Metadata.h:535
This is the shared class of boolean and integer constants.
Definition Constants.h:87
uint64_t getZExtValue() const
Return the constant as a 64-bit unsigned integer value after it has been zero extended as appropriate...
Definition Constants.h:163
const APInt & getValue() const
Return the constant as an APInt value reference.
Definition Constants.h:154
This class represents a list of constant ranges.
LLVM_ABI ConstantRangeList intersectWith(const ConstantRangeList &CRL) const
Return the range list that results from the intersection of this ConstantRangeList with another Const...
This class represents a range of values.
LLVM_ABI ConstantRange unionWith(const ConstantRange &CR, PreferredRangeType Type=Smallest) const
Return the range that results from the union of this range with another range.
This is an important base class in LLVM.
Definition Constant.h:43
DWARF expression.
A pair of DIGlobalVariable and DIExpression.
Subprogram description. Uses SubclassData1.
Record of a variable value-assignment, aka a non instruction representation of the dbg....
MDNode * getAsMDNode() const
Return this as a bar MDNode.
Definition DebugLoc.h:291
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
Definition Metadata.h:219
LLVM_ABI void handleChangedValue(void *Old, Metadata *NewDebugValue)
To be called by ReplaceableMetadataImpl::replaceAllUsesWith, where Old is a pointer to one of the poi...
Definition Metadata.cpp:158
std::array< Metadata *, 3 > DebugValues
Definition Metadata.h:225
void resetDebugValue(size_t Idx, Metadata *DebugValue)
Definition Metadata.h:280
LLVM_ABI DbgVariableRecord * getUser()
Definition Metadata.cpp:151
Implements a dense probed hash-table based set.
Definition DenseSet.h:269
void setSubprogram(DISubprogram *SP)
Set the attached subprogram.
DISubprogram * getSubprogram() const
Get the attached subprogram.
bool shouldEmitDebugInfoForProfiling() const
Returns true if we should emit debug info for profiling.
LLVM_ABI void addTypeMetadata(unsigned Offset, Metadata *TypeID)
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
GlobalObject(Type *Ty, ValueTy VTy, AllocInfo AllocInfo, LinkageTypes Linkage, const Twine &Name, unsigned AddressSpace=0)
LLVM_ABI void copyMetadata(const GlobalObject *Src, unsigned Offset)
Copy metadata from Src, adjusting offsets by Offset.
LLVM_ABI VCallVisibility getVCallVisibility() const
LLVM_ABI bool eraseMetadata(unsigned KindID)
Erase all metadata attachments with the given kind.
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition Value.h:576
LLVM_ABI void setVCallVisibilityMetadata(VCallVisibility Visibility)
LLVM_ABI void getDebugInfo(SmallVectorImpl< DIGlobalVariableExpression * > &GVs) const
Fill the vector with all debug info attachements.
LLVM_ABI void addDebugInfo(DIGlobalVariableExpression *GV)
Attach a DIGlobalVariableExpression.
LLVM_ABI void setAAMetadata(const AAMDNodes &N)
Sets the AA metadata on this instruction from the AAMDNodes structure.
LLVM_ABI bool extractProfTotalWeight(uint64_t &TotalVal) const
Retrieve total raw weight values of a branch.
bool hasMetadata() const
Return true if this instruction has any metadata attached to it.
LLVM_ABI void addAnnotationMetadata(StringRef Annotation)
Adds an !annotation metadata node with Annotation to this instruction.
MDNode * getMetadata(unsigned KindID) const
Get the metadata of given kind attached to this Instruction.
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set the metadata of the specified kind to the specified node.
LLVM_ABI void setNoSanitizeMetadata()
Sets the nosanitize metadata on this instruction.
LLVM_ABI void dropUnknownNonDebugMetadata(ArrayRef< unsigned > KnownIDs={})
Drop all unknown metadata except for debug locations.
LLVM_ABI AAMDNodes getAAMetadata() const
Returns the AA metadata for this instruction.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
LLVM_ABI void eraseMetadataIf(function_ref< bool(unsigned, MDNode *)> Pred)
Erase all metadata that matches the predicate.
DenseMap< Metadata *, MetadataAsValue * > MetadataAsValues
DenseMap< DIAssignID *, SmallVector< Instruction *, 1 > > AssignmentIDToInstrs
Map DIAssignID -> Instructions with that attachment.
std::vector< MDNode * > DistinctMDNodes
DenseMap< const Value *, MDAttachments > ValueMetadata
Collection of metadata used in this context.
This is an important class for using LLVM in a threaded context.
Definition LLVMContext.h:68
LLVM_ABI unsigned getMDKindID(StringRef Name) const
getMDKindID - Return a unique non-zero ID for the specified metadata kind.
LLVMContextImpl *const pImpl
Definition LLVMContext.h:70
Multimap-like storage for metadata attachments.
void insert(unsigned ID, MDNode &MD)
Adds an attachment to a particular node.
void get(unsigned ID, SmallVectorImpl< MDNode * > &Result) const
Appends all attachments with the given ID to Result in insertion order.
void getAll(SmallVectorImpl< std::pair< unsigned, MDNode * > > &Result) const
Appends all attachments for the global to Result, sorting by attachment ID.
void set(unsigned ID, MDNode *MD)
Set an attachment to a particular node.
MDNode * lookup(unsigned ID) const
Returns the first attachment with the given ID or nullptr if no such attachment exists.
bool erase(unsigned ID)
Remove attachments with the given ID.
LLVM_ABI MDString * createString(StringRef Str)
Return the given string as metadata.
Definition MDBuilder.cpp:21
Metadata node.
Definition Metadata.h:1077
static LLVM_ABI MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
LLVM_ABI void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
LLVM_ABI void resolveCycles()
Resolve cycles.
Definition Metadata.cpp:842
mutable_op_range mutable_operands()
Definition Metadata.h:1215
static LLVM_ABI MDNode * getMergedCalleeTypeMetadata(const MDNode *A, const MDNode *B)
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition Metadata.h:1281
static LLVM_ABI MDNode * concatenate(MDNode *A, MDNode *B)
Methods for metadata merging.
static LLVM_ABI void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
LLVM_ABI void resolve()
Resolve a unique, unresolved node.
Definition Metadata.cpp:796
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1445
static LLVM_ABI MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
LLVM_ABI void storeDistinctInContext()
bool isTemporary() const
Definition Metadata.h:1261
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1443
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1565
static LLVM_ABI MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
bool isUniqued() const
Definition Metadata.h:1259
static LLVM_ABI MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
void setNumUnresolved(unsigned N)
Definition Metadata.h:1368
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1451
MDOperand * mutable_begin()
Definition Metadata.h:1210
LLVM_ABI MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
Definition Metadata.cpp:651
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
Definition Metadata.cpp:668
static LLVM_ABI MDNode * getMostGenericRange(MDNode *A, MDNode *B)
bool isDistinct() const
Definition Metadata.h:1260
LLVM_ABI void setOperand(unsigned I, Metadata *New)
Set an operand.
bool isResolved() const
Check if node is fully resolved.
Definition Metadata.h:1257
op_iterator op_begin() const
Definition Metadata.h:1435
static LLVM_ABI MDNode * intersect(MDNode *A, MDNode *B)
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
Definition Metadata.h:1241
LLVM_ABI void dropAllReferences()
Definition Metadata.cpp:908
static LLVM_ABI MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
unsigned getNumUnresolved() const
Definition Metadata.h:1366
Tracking metadata reference owned by Metadata.
Definition Metadata.h:899
A single uniqued string.
Definition Metadata.h:720
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:617
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:607
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1522
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:103
static LLVM_ABI MetadataAsValue * getIfExists(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:111
LLVM_ABI ~MetadataAsValue()
Definition Metadata.cpp:65
static LLVM_ABI bool isReplaceable(const Metadata &MD)
Check whether metadata is replaceable.
Definition Metadata.cpp:246
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
Definition Metadata.h:356
PointerUnion< MetadataAsValue *, Metadata *, DebugValueUser * > OwnerTy
Definition Metadata.h:375
static bool retrack(Metadata *&MD, Metadata *&New)
Move tracking from one reference to another.
Definition Metadata.h:367
static bool track(Metadata *&MD)
Track the reference to metadata.
Definition Metadata.h:322
Root of the metadata hierarchy.
Definition Metadata.h:63
StorageType
Active type of storage.
Definition Metadata.h:71
unsigned char Storage
Storage flag for non-uniqued, otherwise unowned, metadata.
Definition Metadata.h:74
unsigned getMetadataID() const
Definition Metadata.h:103
Metadata(unsigned ID, StorageType Storage)
Definition Metadata.h:87
void eraseNamedMetadata(NamedMDNode *NMD)
Remove the given NamedMDNode from this module and delete it.
Definition Module.cpp:317
iterator end() const
Definition ArrayRef.h:348
LLVM_ABI void setOperand(unsigned I, MDNode *New)
LLVM_ABI ~NamedMDNode()
LLVM_ABI StringRef getName() const
void dropAllReferences()
Remove all uses and clear node vector.
Definition Metadata.h:1818
LLVM_ABI void eraseFromParent()
Drop all references and remove the node from parent module.
LLVM_ABI MDNode * getOperand(unsigned i) const
LLVM_ABI unsigned getNumOperands() const
LLVM_ABI void clearOperands()
Drop all references to this node's operands.
Module * getParent()
Get the module that holds this named metadata collection.
Definition Metadata.h:1823
LLVM_ABI void addOperand(MDNode *M)
bool isNull() const
Test if the pointer held in the union is null, regardless of which type it is.
static LLVM_ABI PoisonValue * get(Type *T)
Static factory methods - Return an 'poison' object of the specified type.
Shared implementation of use-lists for replaceable metadata.
Definition Metadata.h:389
static LLVM_ABI void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Definition Metadata.cpp:331
LLVM_ABI void replaceAllUsesWith(Metadata *MD)
Replace all uses of this with MD.
Definition Metadata.cpp:368
LLVM_ABI SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Returns the list of all DbgVariableRecord users of this.
Definition Metadata.cpp:272
LLVM_ABI void resolveAllUses(bool ResolveUsers=true)
Resolve all uses of this.
Definition Metadata.cpp:421
LLVM_ABI SmallVector< Metadata * > getAllArgListUsers()
Returns the list of all DIArgList users of this.
Definition Metadata.cpp:250
MetadataTracking::OwnerTy OwnerTy
Definition Metadata.h:393
ArrayRef< value_type > getArrayRef() const
Definition SetVector.h:90
bool remove_if(UnaryPredicate P)
Remove items from the set vector based on a predicate function.
Definition SetVector.h:247
bool empty() const
Determine if the SetVector is empty or not.
Definition SetVector.h:99
bool insert(const value_type &X)
Insert a new element into the SetVector.
Definition SetVector.h:168
size_type count(ConstPtrType Ptr) const
count - Return 1 if the specified pointer is in the set, 0 otherwise.
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool contains(ConstPtrType Ptr) const
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements.
A SetVector that performs no allocations if smaller than a certain size.
Definition SetVector.h:356
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
Definition SmallSet.h:133
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.
Definition SmallSet.h:175
std::pair< const_iterator, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
Definition SmallSet.h:181
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
void reserve(size_type N)
void resize(size_type N)
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
Definition StringRef.h:55
The instances of the Type class are immutable: once they are created, they are never changed.
Definition Type.h:45
static LLVM_ABI IntegerType * getInt64Ty(LLVMContext &C)
Definition Type.cpp:298
static LLVM_ABI Type * getMetadataTy(LLVMContext &C)
Definition Type.cpp:287
LLVMContext & getContext() const
Return the LLVMContext in which this type was uniqued.
Definition Type.h:128
Use & Op()
Definition User.h:196
Value wrapper in the Metadata hierarchy.
Definition Metadata.h:457
void replaceAllUsesWith(Metadata *MD)
Handle collisions after Value::replaceAllUsesWith().
Definition Metadata.h:517
static LLVM_ABI void handleDeletion(Value *V)
Definition Metadata.cpp:526
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:502
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:521
static LLVM_ABI void handleRAUW(Value *From, Value *To)
Definition Metadata.cpp:545
ValueAsMetadata(unsigned ID, Value *V)
Definition Metadata.h:469
Value * getValue() const
Definition Metadata.h:497
LLVM Value Representation.
Definition Value.h:75
Type * getType() const
All values are typed, get the type of this value.
Definition Value.h:256
unsigned IsUsedByMD
Definition Value.h:112
bool hasMetadata() const
Return true if this value has any metadata attached to it.
Definition Value.h:602
LLVM_ABI void setMetadata(unsigned KindID, MDNode *Node)
Set a particular kind of metadata attachment.
LLVM_ABI void replaceAllUsesWith(Value *V)
Change all uses of this to point to a new Value.
Definition Value.cpp:546
LLVM_ABI void getAllMetadata(SmallVectorImpl< std::pair< unsigned, MDNode * > > &MDs) const
Appends all metadata attached to this value to MDs, sorting by KindID.
LLVM_ABI MDNode * getMetadataImpl(unsigned KindID) const
Get metadata for the given kind, if any.
LLVM_ABI bool eraseMetadata(unsigned KindID)
Erase all metadata attachments with the given kind.
unsigned HasMetadata
Definition Value.h:114
LLVM_ABI void addMetadata(unsigned KindID, MDNode &MD)
Add a metadata attachment.
LLVM_ABI void eraseMetadataIf(function_ref< bool(unsigned, MDNode *)> Pred)
Erase all metadata attachments matching the given predicate.
LLVM_ABI LLVMContext & getContext() const
All values hold a context through their type.
Definition Value.cpp:1101
LLVM_ABI void clearMetadata()
Erase all metadata attached to this Value.
MDNode * getMetadata(unsigned KindID) const
Get the current metadata attachments for the given kind, if any.
Definition Value.h:576
An efficient, type-erasing, non-owning reference to a callable.
Changed
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition CallingConv.h:34
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition Metadata.h:694
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:666
iterator end() const
Definition BasicBlock.h:89
This is an optimization pass for GlobalISel generic memory operations.
@ Low
Lower the current thread's priority such that it does not affect foreground tasks significantly.
Definition Threading.h:262
@ Offset
Definition DWP.cpp:477
detail::zippy< detail::zip_shortest, T, U, Args... > zip(T &&t, U &&u, Args &&...args)
zip iterator for two or more iteratable types.
Definition STLExtras.h:831
void stable_sort(R &&Range)
Definition STLExtras.h:2038
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1731
TypedTrackingMDRef< MDNode > TrackingMDNodeRef
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:1657
LLVM_ABI unsigned getBranchWeightOffset(const MDNode *ProfileData)
Return the offset to the first branch weight data.
static T * getUniqued(DenseSet< T *, InfoT > &Store, const typename InfoT::KeyTy &Key)
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:649
constexpr from_range_t from_range
auto dyn_cast_if_present(const Y &Val)
dyn_cast_if_present<X> - Functionally identical to dyn_cast, except that a null (or none in the case ...
Definition Casting.h:738
auto cast_or_null(const Y &Val)
Definition Casting.h:720
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:759
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1712
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1624
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:548
LLVM_ATTRIBUTE_VISIBILITY_DEFAULT AnalysisKey InnerAnalysisManagerProxy< AnalysisManagerT, IRUnitT, ExtraArgTs... >::Key
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
@ Ref
The access may reference the value stored in memory.
Definition ModRef.h:32
@ Other
Any other memory.
Definition ModRef.h:68
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition Alignment.h:155
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1815
typename detail::detector< void, Op, Args... >::value_t is_detected
Detects if a given trait holds for some set of arguments 'Args'.
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:1847
auto count_if(R &&Range, UnaryPredicate P)
Wrapper function around std::count_if to count the number of times an element satisfying a given pred...
Definition STLExtras.h:1941
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:565
void erase_if(Container &C, UnaryPredicate P)
Provide a container algorithm similar to C++ Library Fundamentals v2's erase_if which is equivalent t...
Definition STLExtras.h:2100
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1877
std::enable_if_t< std::is_unsigned_v< T >, T > SaturatingAdd(T X, T Y, bool *ResultOverflowed=nullptr)
Add two unsigned integers, X and Y, of type T.
Definition MathExtras.h:620
#define N
static constexpr bool value
Definition Metadata.cpp:992
decltype(static_cast< void(U::*)(unsigned)>(&U::setHash)) check
Definition Metadata.cpp:990
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:760
static LLVM_ABI const char * BranchWeights
Function object to check whether the first component of a container supported by std::get (like std::...
Definition STLExtras.h:1427