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 using Yes = char[1];
990 using No = char[2];
991 template <class U, U Val> struct SFINAE {};
992
993 template <class U>
994 static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *);
995 template <class U> static No &check(...);
996
997 static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes);
998};
999
1000MDNode *MDNode::uniquify() {
1001 assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
1002
1003 // Try to insert into uniquing store.
1004 switch (getMetadataID()) {
1005 default:
1006 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1007#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1008 case CLASS##Kind: { \
1009 CLASS *SubclassThis = cast<CLASS>(this); \
1010 std::bool_constant<HasCachedHash<CLASS>::value> ShouldRecalculateHash; \
1011 dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \
1012 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
1013 }
1014#include "llvm/IR/Metadata.def"
1015 }
1016}
1017
1018void MDNode::eraseFromStore() {
1019 switch (getMetadataID()) {
1020 default:
1021 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1022#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1023 case CLASS##Kind: \
1024 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
1025 break;
1026#include "llvm/IR/Metadata.def"
1027 }
1028}
1029
1030MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1031 StorageType Storage, bool ShouldCreate) {
1032 unsigned Hash = 0;
1033 if (Storage == Uniqued) {
1034 MDTupleInfo::KeyTy Key(MDs);
1035 if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
1036 return N;
1037 if (!ShouldCreate)
1038 return nullptr;
1039 Hash = Key.getHash();
1040 } else {
1041 assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
1042 }
1043
1044 return storeImpl(new (MDs.size(), Storage)
1045 MDTuple(Context, Storage, Hash, MDs),
1046 Storage, Context.pImpl->MDTuples);
1047}
1048
1050 assert(N->isTemporary() && "Expected temporary node");
1051 N->replaceAllUsesWith(nullptr);
1052 N->deleteAsSubclass();
1053}
1054
1056 assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
1057 assert(!getNumUnresolved() && "Unexpected unresolved nodes");
1058 Storage = Distinct;
1059 assert(isResolved() && "Expected this to be resolved");
1060
1061 // Reset the hash.
1062 switch (getMetadataID()) {
1063 default:
1064 llvm_unreachable("Invalid subclass of MDNode");
1065#define HANDLE_MDNODE_LEAF(CLASS) \
1066 case CLASS##Kind: { \
1067 std::bool_constant<HasCachedHash<CLASS>::value> ShouldResetHash; \
1068 dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \
1069 break; \
1070 }
1071#include "llvm/IR/Metadata.def"
1072 }
1073
1074 getContext().pImpl->DistinctMDNodes.push_back(this);
1075}
1076
1078 if (getOperand(I) == New)
1079 return;
1080
1081 if (!isUniqued()) {
1082 setOperand(I, New);
1083 return;
1084 }
1085
1086 handleChangedOperand(mutable_begin() + I, New);
1087}
1088
1089void MDNode::setOperand(unsigned I, Metadata *New) {
1090 assert(I < getNumOperands());
1091 mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
1092}
1093
1094/// Get a node or a self-reference that looks like it.
1095///
1096/// Special handling for finding self-references, for use by \a
1097/// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
1098/// when self-referencing nodes were still uniqued. If the first operand has
1099/// the same operands as \c Ops, return the first operand instead.
1102 if (!Ops.empty())
1104 if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
1105 for (unsigned I = 1, E = Ops.size(); I != E; ++I)
1106 if (Ops[I] != N->getOperand(I))
1107 return MDNode::get(Context, Ops);
1108 return N;
1109 }
1110
1111 return MDNode::get(Context, Ops);
1112}
1113
1115 if (!A)
1116 return B;
1117 if (!B)
1118 return A;
1119
1120 SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
1121 MDs.insert(B->op_begin(), B->op_end());
1122
1123 // FIXME: This preserves long-standing behaviour, but is it really the right
1124 // behaviour? Or was that an unintended side-effect of node uniquing?
1125 return getOrSelfReference(A->getContext(), MDs.getArrayRef());
1126}
1127
1129 if (!A || !B)
1130 return nullptr;
1131
1132 SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
1133 SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
1134 MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); });
1135
1136 // FIXME: This preserves long-standing behaviour, but is it really the right
1137 // behaviour? Or was that an unintended side-effect of node uniquing?
1138 return getOrSelfReference(A->getContext(), MDs.getArrayRef());
1139}
1140
1142 if (!A || !B)
1143 return nullptr;
1144
1145 // Take the intersection of domains then union the scopes
1146 // within those domains
1148 SmallPtrSet<const MDNode *, 16> IntersectDomains;
1150 for (const MDOperand &MDOp : A->operands())
1151 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1152 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1153 ADomains.insert(Domain);
1154
1155 for (const MDOperand &MDOp : B->operands())
1156 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1157 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1158 if (ADomains.contains(Domain)) {
1159 IntersectDomains.insert(Domain);
1160 MDs.insert(MDOp);
1161 }
1162
1163 for (const MDOperand &MDOp : A->operands())
1164 if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1165 if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1166 if (IntersectDomains.contains(Domain))
1167 MDs.insert(MDOp);
1168
1169 return MDs.empty() ? nullptr
1170 : getOrSelfReference(A->getContext(), MDs.getArrayRef());
1171}
1172
1174 if (!A || !B)
1175 return nullptr;
1176
1177 APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
1178 APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
1179 if (AVal < BVal)
1180 return A;
1181 return B;
1182}
1183
1184// Call instructions with branch weights are only used in SamplePGO as
1185// documented in
1186/// https://llvm.org/docs/BranchWeightMetadata.html#callinst).
1187MDNode *MDNode::mergeDirectCallProfMetadata(MDNode *A, MDNode *B,
1188 const Instruction *AInstr,
1189 const Instruction *BInstr) {
1190 assert(A && B && AInstr && BInstr && "Caller should guarantee");
1191 auto &Ctx = AInstr->getContext();
1192 MDBuilder MDHelper(Ctx);
1193
1194 // LLVM IR verifier verifies !prof metadata has at least 2 operands.
1195 assert(A->getNumOperands() >= 2 && B->getNumOperands() >= 2 &&
1196 "!prof annotations should have no less than 2 operands");
1197 MDString *AMDS = dyn_cast<MDString>(A->getOperand(0));
1198 MDString *BMDS = dyn_cast<MDString>(B->getOperand(0));
1199 // LLVM IR verfier verifies first operand is MDString.
1200 assert(AMDS != nullptr && BMDS != nullptr &&
1201 "first operand should be a non-null MDString");
1202 StringRef AProfName = AMDS->getString();
1203 StringRef BProfName = BMDS->getString();
1204 if (AProfName == MDProfLabels::BranchWeights &&
1205 BProfName == MDProfLabels::BranchWeights) {
1207 A->getOperand(getBranchWeightOffset(A)));
1209 B->getOperand(getBranchWeightOffset(B)));
1210 assert(AInstrWeight && BInstrWeight && "verified by LLVM verifier");
1211 return MDNode::get(Ctx,
1212 {MDHelper.createString(MDProfLabels::BranchWeights),
1213 MDHelper.createConstant(ConstantInt::get(
1214 Type::getInt64Ty(Ctx),
1215 SaturatingAdd(AInstrWeight->getZExtValue(),
1216 BInstrWeight->getZExtValue())))});
1217 }
1218 return nullptr;
1219}
1220
1221// Pass in both instructions and nodes. Instruction information (e.g.,
1222// instruction type) helps interpret profiles and make implementation clearer.
1224 const Instruction *AInstr,
1225 const Instruction *BInstr) {
1226 // Check that it is legal to merge prof metadata based on the opcode.
1227 auto IsLegal = [](const Instruction &I) -> bool {
1228 switch (I.getOpcode()) {
1229 case Instruction::Invoke:
1230 case Instruction::Br:
1231 case Instruction::Switch:
1232 case Instruction::Call:
1233 case Instruction::IndirectBr:
1234 case Instruction::Select:
1235 case Instruction::CallBr:
1236 return true;
1237 default:
1238 return false;
1239 }
1240 };
1241 if (AInstr && !IsLegal(*AInstr))
1242 return nullptr;
1243 if (BInstr && !IsLegal(*BInstr))
1244 return nullptr;
1245
1246 if (!(A && B)) {
1247 return A ? A : B;
1248 }
1249
1250 assert(AInstr->getMetadata(LLVMContext::MD_prof) == A &&
1251 "Caller should guarantee");
1252 assert(BInstr->getMetadata(LLVMContext::MD_prof) == B &&
1253 "Caller should guarantee");
1254
1255 const CallInst *ACall = dyn_cast<CallInst>(AInstr);
1256 const CallInst *BCall = dyn_cast<CallInst>(BInstr);
1257
1258 // Both ACall and BCall are direct callsites.
1259 if (ACall && BCall && ACall->getCalledFunction() &&
1260 BCall->getCalledFunction())
1261 return mergeDirectCallProfMetadata(A, B, AInstr, BInstr);
1262
1263 // The rest of the cases are not implemented but could be added
1264 // when there are use cases.
1265 return nullptr;
1266}
1267
1268static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
1269 return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
1270}
1271
1272static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
1273 return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
1274}
1275
1278 ConstantRange NewRange(Low->getValue(), High->getValue());
1279 unsigned Size = EndPoints.size();
1280 const APInt &LB = EndPoints[Size - 2]->getValue();
1281 const APInt &LE = EndPoints[Size - 1]->getValue();
1282 ConstantRange LastRange(LB, LE);
1283 if (canBeMerged(NewRange, LastRange)) {
1284 ConstantRange Union = LastRange.unionWith(NewRange);
1285 Type *Ty = High->getType();
1286 EndPoints[Size - 2] =
1287 cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
1288 EndPoints[Size - 1] =
1289 cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
1290 return true;
1291 }
1292 return false;
1293}
1294
1297 if (!EndPoints.empty())
1298 if (tryMergeRange(EndPoints, Low, High))
1299 return;
1300
1301 EndPoints.push_back(Low);
1302 EndPoints.push_back(High);
1303}
1304
1306 // Drop the callee_type metadata if either of the call instructions do not
1307 // have it.
1308 if (!A || !B)
1309 return nullptr;
1311 SmallPtrSet<Metadata *, 8> MergedCallees;
1312 auto AddUniqueCallees = [&AB, &MergedCallees](const MDNode *N) {
1313 for (Metadata *MD : N->operands()) {
1314 if (MergedCallees.insert(MD).second)
1315 AB.push_back(MD);
1316 }
1317 };
1318 AddUniqueCallees(A);
1319 AddUniqueCallees(B);
1320 return MDNode::get(A->getContext(), AB);
1321}
1322
1324 // Given two ranges, we want to compute the union of the ranges. This
1325 // is slightly complicated by having to combine the intervals and merge
1326 // the ones that overlap.
1327
1328 if (!A || !B)
1329 return nullptr;
1330
1331 if (A == B)
1332 return A;
1333
1334 // First, walk both lists in order of the lower boundary of each interval.
1335 // At each step, try to merge the new interval to the last one we added.
1337 unsigned AI = 0;
1338 unsigned BI = 0;
1339 unsigned AN = A->getNumOperands() / 2;
1340 unsigned BN = B->getNumOperands() / 2;
1341 while (AI < AN && BI < BN) {
1342 ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
1343 ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
1344
1345 if (ALow->getValue().slt(BLow->getValue())) {
1346 addRange(EndPoints, ALow,
1347 mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1348 ++AI;
1349 } else {
1350 addRange(EndPoints, BLow,
1351 mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1352 ++BI;
1353 }
1354 }
1355 while (AI < AN) {
1356 addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
1357 mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1358 ++AI;
1359 }
1360 while (BI < BN) {
1361 addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
1362 mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1363 ++BI;
1364 }
1365
1366 // We haven't handled wrap in the previous merge,
1367 // if we have at least 2 ranges (4 endpoints) we have to try to merge
1368 // the last and first ones.
1369 unsigned Size = EndPoints.size();
1370 if (Size > 2) {
1371 ConstantInt *FB = EndPoints[0];
1372 ConstantInt *FE = EndPoints[1];
1373 if (tryMergeRange(EndPoints, FB, FE)) {
1374 for (unsigned i = 0; i < Size - 2; ++i) {
1375 EndPoints[i] = EndPoints[i + 2];
1376 }
1377 EndPoints.resize(Size - 2);
1378 }
1379 }
1380
1381 // If in the end we have a single range, it is possible that it is now the
1382 // full range. Just drop the metadata in that case.
1383 if (EndPoints.size() == 2) {
1384 ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
1385 if (Range.isFullSet())
1386 return nullptr;
1387 }
1388
1390 MDs.reserve(EndPoints.size());
1391 for (auto *I : EndPoints)
1393 return MDNode::get(A->getContext(), MDs);
1394}
1395
1397 if (!A || !B)
1398 return nullptr;
1399
1400 if (A == B)
1401 return A;
1402
1403 SmallVector<ConstantRange> RangeListA, RangeListB;
1404 for (unsigned I = 0, E = A->getNumOperands() / 2; I != E; ++I) {
1405 auto *LowA = mdconst::extract<ConstantInt>(A->getOperand(2 * I + 0));
1406 auto *HighA = mdconst::extract<ConstantInt>(A->getOperand(2 * I + 1));
1407 RangeListA.push_back(ConstantRange(LowA->getValue(), HighA->getValue()));
1408 }
1409
1410 for (unsigned I = 0, E = B->getNumOperands() / 2; I != E; ++I) {
1411 auto *LowB = mdconst::extract<ConstantInt>(B->getOperand(2 * I + 0));
1412 auto *HighB = mdconst::extract<ConstantInt>(B->getOperand(2 * I + 1));
1413 RangeListB.push_back(ConstantRange(LowB->getValue(), HighB->getValue()));
1414 }
1415
1416 ConstantRangeList CRLA(RangeListA);
1417 ConstantRangeList CRLB(RangeListB);
1418 ConstantRangeList Result = CRLA.intersectWith(CRLB);
1419 if (Result.empty())
1420 return nullptr;
1421
1423 for (const ConstantRange &CR : Result) {
1425 ConstantInt::get(A->getContext(), CR.getLower())));
1427 ConstantInt::get(A->getContext(), CR.getUpper())));
1428 }
1429
1430 return MDNode::get(A->getContext(), MDs);
1431}
1432
1434 if (!A || !B)
1435 return nullptr;
1436
1437 ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
1438 ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
1439 if (AVal->getZExtValue() < BVal->getZExtValue())
1440 return A;
1441 return B;
1442}
1443
1444//===----------------------------------------------------------------------===//
1445// NamedMDNode implementation.
1446//
1447
1451
1452NamedMDNode::NamedMDNode(const Twine &N)
1453 : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
1454
1457 delete &getNMDOps(Operands);
1458}
1459
1461 return (unsigned)getNMDOps(Operands).size();
1462}
1463
1465 assert(i < getNumOperands() && "Invalid Operand number!");
1466 auto *N = getNMDOps(Operands)[i].get();
1467 return cast_or_null<MDNode>(N);
1468}
1469
1470void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
1471
1472void NamedMDNode::setOperand(unsigned I, MDNode *New) {
1473 assert(I < getNumOperands() && "Invalid operand number");
1474 getNMDOps(Operands)[I].reset(New);
1475}
1476
1478
1479void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
1480
1482
1483//===----------------------------------------------------------------------===//
1484// Instruction Metadata method implementations.
1485//
1486
1488 for (const auto &A : Attachments)
1489 if (A.MDKind == ID)
1490 return A.Node;
1491 return nullptr;
1492}
1493
1494void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
1495 for (const auto &A : Attachments)
1496 if (A.MDKind == ID)
1497 Result.push_back(A.Node);
1498}
1499
1501 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1502 for (const auto &A : Attachments)
1503 Result.emplace_back(A.MDKind, A.Node);
1504
1505 // Sort the resulting array so it is stable with respect to metadata IDs. We
1506 // need to preserve the original insertion order though.
1507 if (Result.size() > 1)
1508 llvm::stable_sort(Result, less_first());
1509}
1510
1511void MDAttachments::set(unsigned ID, MDNode *MD) {
1512 erase(ID);
1513 if (MD)
1514 insert(ID, *MD);
1515}
1516
1517void MDAttachments::insert(unsigned ID, MDNode &MD) {
1518 Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1519}
1520
1521bool MDAttachments::erase(unsigned ID) {
1522 if (empty())
1523 return false;
1524
1525 // Common case is one value.
1526 if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1527 Attachments.pop_back();
1528 return true;
1529 }
1530
1531 auto OldSize = Attachments.size();
1532 llvm::erase_if(Attachments,
1533 [ID](const Attachment &A) { return A.MDKind == ID; });
1534 return OldSize != Attachments.size();
1535}
1536
1538 if (!hasMetadata())
1539 return nullptr;
1540 unsigned KindID = getContext().getMDKindID(Kind);
1541 return getMetadataImpl(KindID);
1542}
1543
1544MDNode *Value::getMetadataImpl(unsigned KindID) const {
1545 const LLVMContext &Ctx = getContext();
1546 const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
1547 return Attachements.lookup(KindID);
1548}
1549
1550void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1551 if (hasMetadata())
1552 getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
1553}
1554
1556 if (hasMetadata())
1557 getMetadata(getContext().getMDKindID(Kind), MDs);
1558}
1559
1561 SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1562 if (hasMetadata()) {
1563 assert(getContext().pImpl->ValueMetadata.count(this) &&
1564 "bit out of sync with hash table");
1565 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1566 Info.getAll(MDs);
1567 }
1568}
1569
1570void Value::setMetadata(unsigned KindID, MDNode *Node) {
1572
1573 // Handle the case when we're adding/updating metadata on a value.
1574 if (Node) {
1576 assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1577 if (Info.empty())
1578 HasMetadata = true;
1579 Info.set(KindID, Node);
1580 return;
1581 }
1582
1583 // Otherwise, we're removing metadata from an instruction.
1584 assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1585 "bit out of sync with hash table");
1586 if (!HasMetadata)
1587 return; // Nothing to remove!
1588 MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1589
1590 // Handle removal of an existing value.
1591 Info.erase(KindID);
1592 if (!Info.empty())
1593 return;
1594 getContext().pImpl->ValueMetadata.erase(this);
1595 HasMetadata = false;
1596}
1597
1599 if (!Node && !HasMetadata)
1600 return;
1601 setMetadata(getContext().getMDKindID(Kind), Node);
1602}
1603
1604void Value::addMetadata(unsigned KindID, MDNode &MD) {
1606 if (!HasMetadata)
1607 HasMetadata = true;
1608 getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1609}
1610
1612 addMetadata(getContext().getMDKindID(Kind), MD);
1613}
1614
1615bool Value::eraseMetadata(unsigned KindID) {
1616 // Nothing to unset.
1617 if (!HasMetadata)
1618 return false;
1619
1620 MDAttachments &Store = getContext().pImpl->ValueMetadata.find(this)->second;
1621 bool Changed = Store.erase(KindID);
1622 if (Store.empty())
1623 clearMetadata();
1624 return Changed;
1625}
1626
1627void Value::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1628 if (!HasMetadata)
1629 return;
1630
1631 auto &MetadataStore = getContext().pImpl->ValueMetadata;
1632 MDAttachments &Info = MetadataStore.find(this)->second;
1633 assert(!Info.empty() && "bit out of sync with hash table");
1634 Info.remove_if([Pred](const MDAttachments::Attachment &I) {
1635 return Pred(I.MDKind, I.Node);
1636 });
1637
1638 if (Info.empty())
1639 clearMetadata();
1640}
1641
1643 if (!HasMetadata)
1644 return;
1645 assert(getContext().pImpl->ValueMetadata.count(this) &&
1646 "bit out of sync with hash table");
1647 getContext().pImpl->ValueMetadata.erase(this);
1648 HasMetadata = false;
1649}
1650
1652 if (!Node && !hasMetadata())
1653 return;
1654 setMetadata(getContext().getMDKindID(Kind), Node);
1655}
1656
1657MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
1658 const LLVMContext &Ctx = getContext();
1659 unsigned KindID = Ctx.getMDKindID(Kind);
1660 if (KindID == LLVMContext::MD_dbg)
1661 return DbgLoc.getAsMDNode();
1662 return Value::getMetadata(KindID);
1663}
1664
1665void Instruction::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1666 if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
1667 DbgLoc = {};
1668
1670}
1671
1673 if (!Value::hasMetadata())
1674 return; // Nothing to remove!
1675
1676 SmallSet<unsigned, 32> KnownSet(llvm::from_range, KnownIDs);
1677
1678 // A DIAssignID attachment is debug metadata, don't drop it.
1679 KnownSet.insert(LLVMContext::MD_DIAssignID);
1680
1681 Value::eraseMetadataIf([&KnownSet](unsigned MDKind, MDNode *Node) {
1682 return !KnownSet.count(MDKind);
1683 });
1684}
1685
1686void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1687 auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1688 if (const DIAssignID *CurrentID =
1689 cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1690 // Nothing to do if the ID isn't changing.
1691 if (ID == CurrentID)
1692 return;
1693
1694 // Unmap this instruction from its current ID.
1695 auto InstrsIt = IDToInstrs.find(CurrentID);
1696 assert(InstrsIt != IDToInstrs.end() &&
1697 "Expect existing attachment to be mapped");
1698
1699 auto &InstVec = InstrsIt->second;
1700 auto *InstIt = llvm::find(InstVec, this);
1701 assert(InstIt != InstVec.end() &&
1702 "Expect instruction to be mapped to attachment");
1703 // The vector contains a ptr to this. If this is the only element in the
1704 // vector, remove the ID:vector entry, otherwise just remove the
1705 // instruction from the vector.
1706 if (InstVec.size() == 1)
1707 IDToInstrs.erase(InstrsIt);
1708 else
1709 InstVec.erase(InstIt);
1710 }
1711
1712 // Map this instruction to the new ID.
1713 if (ID)
1714 IDToInstrs[ID].push_back(this);
1715}
1716
1717void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
1718 if (!Node && !hasMetadata())
1719 return;
1720
1721 // Handle 'dbg' as a special case since it is not stored in the hash table.
1722 if (KindID == LLVMContext::MD_dbg) {
1723 DbgLoc = DebugLoc(Node);
1724 return;
1725 }
1726
1727 // Update DIAssignID to Instruction(s) mapping.
1728 if (KindID == LLVMContext::MD_DIAssignID) {
1729 // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1730 // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1731 // having a dedicated assert helps make this obvious.
1732 assert((!Node || !Node->isTemporary()) &&
1733 "Temporary DIAssignIDs are invalid");
1734 updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1735 }
1736
1737 Value::setMetadata(KindID, Node);
1738}
1739
1742 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1743 SmallSetVector<StringRef, 2> AnnotationsSet(Annotations.begin(),
1744 Annotations.end());
1745 auto *Tuple = cast<MDTuple>(Existing);
1746 for (auto &N : Tuple->operands()) {
1747 if (isa<MDString>(N.get())) {
1748 Names.push_back(N);
1749 continue;
1750 }
1751 auto *MDAnnotationTuple = cast<MDTuple>(N);
1752 if (any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](auto &Op) {
1753 return AnnotationsSet.contains(cast<MDString>(Op)->getString());
1754 }))
1755 return;
1756 Names.push_back(N);
1757 }
1758 }
1759
1760 MDBuilder MDB(getContext());
1761 SmallVector<Metadata *> MDAnnotationStrings;
1762 for (StringRef Annotation : Annotations)
1763 MDAnnotationStrings.push_back(MDB.createString(Annotation));
1764 MDNode *InfoTuple = MDTuple::get(getContext(), MDAnnotationStrings);
1765 Names.push_back(InfoTuple);
1766 MDNode *MD = MDTuple::get(getContext(), Names);
1767 setMetadata(LLVMContext::MD_annotation, MD);
1768}
1769
1772 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1773 auto *Tuple = cast<MDTuple>(Existing);
1774 for (auto &N : Tuple->operands()) {
1775 if (isa<MDString>(N.get()) &&
1776 cast<MDString>(N.get())->getString() == Name)
1777 return;
1778 Names.push_back(N.get());
1779 }
1780 }
1781
1782 MDBuilder MDB(getContext());
1783 Names.push_back(MDB.createString(Name));
1784 MDNode *MD = MDTuple::get(getContext(), Names);
1785 setMetadata(LLVMContext::MD_annotation, MD);
1786}
1787
1789 AAMDNodes Result;
1790 // Not using Instruction::hasMetadata() because we're not interested in
1791 // DebugInfoMetadata.
1792 if (Value::hasMetadata()) {
1793 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1794 Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1795 Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1796 Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1797 Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1798 Result.NoAliasAddrSpace = Info.lookup(LLVMContext::MD_noalias_addrspace);
1799 }
1800 return Result;
1801}
1802
1804 setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1805 setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
1806 setMetadata(LLVMContext::MD_alias_scope, N.Scope);
1807 setMetadata(LLVMContext::MD_noalias, N.NoAlias);
1808 setMetadata(LLVMContext::MD_noalias_addrspace, N.NoAliasAddrSpace);
1809}
1810
1812 setMetadata(llvm::LLVMContext::MD_nosanitize,
1814}
1815
1816void Instruction::getAllMetadataImpl(
1817 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1818 Result.clear();
1819
1820 // Handle 'dbg' as a special case since it is not stored in the hash table.
1821 if (DbgLoc) {
1822 Result.push_back(
1823 std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
1824 }
1825 Value::getAllMetadata(Result);
1826}
1827
1829 assert(
1830 (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1831 getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1832 getOpcode() == Instruction::IndirectBr ||
1833 getOpcode() == Instruction::Switch) &&
1834 "Looking for branch weights on something besides branch");
1835
1836 return ::extractProfTotalWeight(*this, TotalVal);
1837}
1838
1841 Other->getAllMetadata(MDs);
1842 for (auto &MD : MDs) {
1843 // We need to adjust the type metadata offset.
1844 if (Offset != 0 && MD.first == LLVMContext::MD_type) {
1845 auto *OffsetConst = cast<ConstantInt>(
1846 cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
1847 Metadata *TypeId = MD.second->getOperand(1);
1848 auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
1849 OffsetConst->getType(), OffsetConst->getValue() + Offset));
1850 addMetadata(LLVMContext::MD_type,
1851 *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
1852 continue;
1853 }
1854 // If an offset adjustment was specified we need to modify the DIExpression
1855 // to prepend the adjustment:
1856 // !DIExpression(DW_OP_plus, Offset, [original expr])
1857 auto *Attachment = MD.second;
1858 if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1860 DIExpression *E = nullptr;
1861 if (!GV) {
1862 auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
1863 GV = GVE->getVariable();
1864 E = GVE->getExpression();
1865 }
1866 ArrayRef<uint64_t> OrigElements;
1867 if (E)
1868 OrigElements = E->getElements();
1869 std::vector<uint64_t> Elements(OrigElements.size() + 2);
1870 Elements[0] = dwarf::DW_OP_plus_uconst;
1871 Elements[1] = Offset;
1872 llvm::copy(OrigElements, Elements.begin() + 2);
1873 E = DIExpression::get(getContext(), Elements);
1874 Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
1875 }
1876 addMetadata(MD.first, *Attachment);
1877 }
1878}
1879
1882 LLVMContext::MD_type,
1884 {ConstantAsMetadata::get(ConstantInt::get(
1886 TypeID}));
1887}
1888
1890 // Remove any existing vcall visibility metadata first in case we are
1891 // updating.
1892 eraseMetadata(LLVMContext::MD_vcall_visibility);
1893 addMetadata(LLVMContext::MD_vcall_visibility,
1895 {ConstantAsMetadata::get(ConstantInt::get(
1897}
1898
1900 if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
1902 cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
1903 ->getZExtValue();
1904 assert(Val <= 2 && "unknown vcall visibility!");
1905 return (VCallVisibility)Val;
1906 }
1908}
1909
1911 setMetadata(LLVMContext::MD_dbg, SP);
1912}
1913
1915 return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
1916}
1917
1919 if (DISubprogram *SP = getSubprogram()) {
1920 if (DICompileUnit *CU = SP->getUnit()) {
1921 return CU->getDebugInfoForProfiling();
1922 }
1923 }
1924 return false;
1925}
1926
1928 addMetadata(LLVMContext::MD_dbg, *GV);
1929}
1930
1934 getMetadata(LLVMContext::MD_dbg, MDs);
1935 for (MDNode *MD : MDs)
1937}
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:824
void stable_sort(R &&Range)
Definition STLExtras.h:2047
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:1740
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:1666
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:1721
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1633
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:1824
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:1856
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:1950
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:2109
bool is_contained(R &&Range, const E &Element)
Returns true if Element is found in Range.
Definition STLExtras.h:1886
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 Yes & check(SFINAE< void(U::*)(unsigned), &U::setHash > *)
static const bool value
Definition Metadata.cpp:997
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:1436