Thanks to visit codestin.com
Credit goes to llvm.org

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 "llvm/Support/ModRef.h"
52#include <cassert>
53#include <cstddef>
54#include <cstdint>
55#include <type_traits>
56#include <utility>
57#include <vector>
58
59using namespace llvm;
60
61MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
62 : Value(Ty, MetadataAsValueVal), MD(MD) {
63 track();
64}
65
70
71/// Canonicalize metadata arguments to intrinsics.
72///
73/// To support bitcode upgrades (and assembly semantic sugar) for \a
74/// MetadataAsValue, we need to canonicalize certain metadata.
75///
76/// - nullptr is replaced by an empty MDNode.
77/// - An MDNode with a single null operand is replaced by an empty MDNode.
78/// - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
79///
80/// This maintains readability of bitcode from when metadata was a type of
81/// value, and these bridges were unnecessary.
83 Metadata *MD) {
84 if (!MD)
85 // !{}
86 return MDNode::get(Context, {});
87
88 // Return early if this isn't a single-operand MDNode.
89 auto *N = dyn_cast<MDNode>(MD);
90 if (!N || N->getNumOperands() != 1)
91 return MD;
92
93 if (!N->getOperand(0))
94 // !{}
95 return MDNode::get(Context, {});
96
97 if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0)))
98 // Look through the MDNode.
99 return C;
100
101 return MD;
102}
103
104MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) {
105 MD = canonicalizeMetadataForValue(Context, MD);
106 auto *&Entry = Context.pImpl->MetadataAsValues[MD];
107 if (!Entry)
108 Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD);
109 return Entry;
110}
111
113 Metadata *MD) {
114 MD = canonicalizeMetadataForValue(Context, MD);
115 auto &Store = Context.pImpl->MetadataAsValues;
116 return Store.lookup(MD);
117}
118
119void MetadataAsValue::handleChangedMetadata(Metadata *MD) {
120 LLVMContext &Context = getContext();
121 MD = canonicalizeMetadataForValue(Context, MD);
122 auto &Store = Context.pImpl->MetadataAsValues;
123
124 // Stop tracking the old metadata.
125 Store.erase(this->MD);
126 untrack();
127 this->MD = nullptr;
128
129 // Start tracking MD, or RAUW if necessary.
130 auto *&Entry = Store[MD];
131 if (Entry) {
132 replaceAllUsesWith(Entry);
133 delete this;
134 return;
135 }
136
137 this->MD = MD;
138 track();
139 Entry = this;
140}
141
142void MetadataAsValue::track() {
143 if (MD)
144 MetadataTracking::track(&MD, *MD, *this);
145}
146
147void MetadataAsValue::untrack() {
148 if (MD)
150}
151
153 return static_cast<DbgVariableRecord *>(this);
154}
156 return static_cast<const DbgVariableRecord *>(this);
157}
158
160 // NOTE: We could inform the "owner" that a value has changed through
161 // getOwner, if needed.
162 auto OldMD = static_cast<Metadata **>(Old);
163 ptrdiff_t Idx = std::distance(&*DebugValues.begin(), OldMD);
164 // If replacing a ValueAsMetadata with a nullptr, replace it with a
165 // PoisonValue instead.
166 if (OldMD && isa<ValueAsMetadata>(*OldMD) && !New) {
167 auto *OldVAM = cast<ValueAsMetadata>(*OldMD);
168 New = ValueAsMetadata::get(PoisonValue::get(OldVAM->getValue()->getType()));
169 }
170 resetDebugValue(Idx, New);
171}
172
173void DebugValueUser::trackDebugValue(size_t Idx) {
174 assert(Idx < 3 && "Invalid debug value index.");
175 Metadata *&MD = DebugValues[Idx];
176 if (MD)
177 MetadataTracking::track(&MD, *MD, *this);
178}
179
180void DebugValueUser::trackDebugValues() {
181 for (Metadata *&MD : DebugValues)
182 if (MD)
183 MetadataTracking::track(&MD, *MD, *this);
184}
185
186void DebugValueUser::untrackDebugValue(size_t Idx) {
187 assert(Idx < 3 && "Invalid debug value index.");
188 Metadata *&MD = DebugValues[Idx];
189 if (MD)
191}
192
193void DebugValueUser::untrackDebugValues() {
194 for (Metadata *&MD : DebugValues)
195 if (MD)
197}
198
199void DebugValueUser::retrackDebugValues(DebugValueUser &X) {
200 assert(DebugValueUser::operator==(X) && "Expected values to match");
201 for (const auto &[MD, XMD] : zip(DebugValues, X.DebugValues))
202 if (XMD)
204 X.DebugValues.fill(nullptr);
205}
206
207bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
208 assert(Ref && "Expected live reference");
209 assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
210 "Reference without owner must be direct");
211 if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
212 R->addRef(Ref, Owner);
213 return true;
214 }
215 if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
216 assert(!PH->Use && "Placeholders can only be used once");
217 assert(!Owner && "Unexpected callback to owner");
218 PH->Use = static_cast<Metadata **>(Ref);
219 return true;
220 }
221 return false;
222}
223
225 assert(Ref && "Expected live reference");
226 if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
227 R->dropRef(Ref);
228 else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
229 PH->Use = nullptr;
230}
231
232bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
233 assert(Ref && "Expected live reference");
234 assert(New && "Expected live reference");
235 assert(Ref != New && "Expected change");
236 if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
237 R->moveRef(Ref, New, MD);
238 return true;
239 }
241 "Unexpected move of an MDOperand");
242 assert(!isReplaceable(MD) &&
243 "Expected un-replaceable metadata, since we didn't move a reference");
244 return false;
245}
246
248 return ReplaceableMetadataImpl::isReplaceable(MD);
249}
250
253 for (auto Pair : UseMap) {
254 OwnerTy Owner = Pair.second.first;
255 if (Owner.isNull())
256 continue;
257 if (!isa<Metadata *>(Owner))
258 continue;
259 Metadata *OwnerMD = cast<Metadata *>(Owner);
260 if (OwnerMD->getMetadataID() == Metadata::DIArgListKind)
261 MDUsersWithID.push_back(&UseMap[Pair.first]);
262 }
263 llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) {
264 return UserA->second < UserB->second;
265 });
267 for (auto *UserWithID : MDUsersWithID)
268 MDUsers.push_back(cast<Metadata *>(UserWithID->first));
269 return MDUsers;
270}
271
275 for (auto Pair : UseMap) {
276 OwnerTy Owner = Pair.second.first;
277 if (Owner.isNull())
278 continue;
279 if (!isa<DebugValueUser *>(Owner))
280 continue;
281 DVRUsersWithID.push_back(&UseMap[Pair.first]);
282 }
283 // Order DbgVariableRecord users in reverse-creation order. Normal dbg.value
284 // users of MetadataAsValues are ordered by their UseList, i.e. reverse order
285 // of when they were added: we need to replicate that here. The structure of
286 // debug-info output depends on the ordering of intrinsics, thus we need
287 // to keep them consistent for comparisons sake.
288 llvm::sort(DVRUsersWithID, [](auto UserA, auto UserB) {
289 return UserA->second > UserB->second;
290 });
292 for (auto UserWithID : DVRUsersWithID)
293 DVRUsers.push_back(cast<DebugValueUser *>(UserWithID->first)->getUser());
294 return DVRUsers;
295}
296
297void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
298 bool WasInserted =
299 UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
300 .second;
301 (void)WasInserted;
302 assert(WasInserted && "Expected to add a reference");
303
304 ++NextIndex;
305 assert(NextIndex != 0 && "Unexpected overflow");
306}
307
308void ReplaceableMetadataImpl::dropRef(void *Ref) {
309 bool WasErased = UseMap.erase(Ref);
310 (void)WasErased;
311 assert(WasErased && "Expected to drop a reference");
312}
313
314void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
315 const Metadata &MD) {
316 auto I = UseMap.find(Ref);
317 assert(I != UseMap.end() && "Expected to move a reference");
318 auto OwnerAndIndex = I->second;
319 UseMap.erase(I);
320 bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
321 (void)WasInserted;
322 assert(WasInserted && "Expected to add a reference");
323
324 // Check that the references are direct if there's no owner.
325 (void)MD;
326 assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
327 "Reference without owner must be direct");
328 assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
329 "Reference without owner must be direct");
330}
331
333 if (!C.isUsedByMetadata()) {
334 return;
335 }
336
337 LLVMContext &Context = C.getType()->getContext();
338 auto &Store = Context.pImpl->ValuesAsMetadata;
339 auto I = Store.find(&C);
340 ValueAsMetadata *MD = I->second;
341 using UseTy =
342 std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
343 // Copy out uses and update value of Constant used by debug info metadata with
344 // poison below
345 SmallVector<UseTy, 8> Uses(MD->UseMap.begin(), MD->UseMap.end());
346
347 for (const auto &Pair : Uses) {
348 MetadataTracking::OwnerTy Owner = Pair.second.first;
349 if (!Owner)
350 continue;
351 // Check for MetadataAsValue.
352 if (isa<MetadataAsValue *>(Owner)) {
353 cast<MetadataAsValue *>(Owner)->handleChangedMetadata(
355 continue;
356 }
357 if (!isa<Metadata *>(Owner))
358 continue;
359 auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
360 if (!OwnerMD)
361 continue;
362 if (isa<DINode>(OwnerMD)) {
363 OwnerMD->handleChangedOperand(
364 Pair.first, ValueAsMetadata::get(PoisonValue::get(C.getType())));
365 }
366 }
367}
368
370 if (UseMap.empty())
371 return;
372
373 // Copy out uses since UseMap will get touched below.
374 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
375 SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
376 llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
377 return L.second.second < R.second.second;
378 });
379 for (const auto &Pair : Uses) {
380 // Check that this Ref hasn't disappeared after RAUW (when updating a
381 // previous Ref).
382 if (!UseMap.count(Pair.first))
383 continue;
384
385 OwnerTy Owner = Pair.second.first;
386 if (!Owner) {
387 // Update unowned tracking references directly.
388 Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
389 Ref = MD;
390 if (MD)
392 UseMap.erase(Pair.first);
393 continue;
394 }
395
396 // Check for MetadataAsValue.
397 if (isa<MetadataAsValue *>(Owner)) {
398 cast<MetadataAsValue *>(Owner)->handleChangedMetadata(MD);
399 continue;
400 }
401
402 if (auto *DVU = dyn_cast<DebugValueUser *>(Owner)) {
403 DVU->handleChangedValue(Pair.first, MD);
404 continue;
405 }
406
407 // There's a Metadata owner -- dispatch.
408 Metadata *OwnerMD = cast<Metadata *>(Owner);
409 switch (OwnerMD->getMetadataID()) {
410#define HANDLE_METADATA_LEAF(CLASS) \
411 case Metadata::CLASS##Kind: \
412 cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
413 continue;
414#include "llvm/IR/Metadata.def"
415 default:
416 llvm_unreachable("Invalid metadata subclass");
417 }
418 }
419 assert(UseMap.empty() && "Expected all uses to be replaced");
420}
421
423 if (UseMap.empty())
424 return;
425
426 if (!ResolveUsers) {
427 UseMap.clear();
428 return;
429 }
430
431 // Copy out uses since UseMap could get touched below.
432 using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
433 SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
434 llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
435 return L.second.second < R.second.second;
436 });
437 UseMap.clear();
438 for (const auto &Pair : Uses) {
439 auto Owner = Pair.second.first;
440 if (!Owner)
441 continue;
442 if (!isa<Metadata *>(Owner))
443 continue;
444
445 // Resolve MDNodes that point at this.
446 auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
447 if (!OwnerMD)
448 continue;
449 if (OwnerMD->isResolved())
450 continue;
451 OwnerMD->decrementUnresolvedOperandCount();
452 }
453}
454
455// Special handing of DIArgList is required in the RemoveDIs project, see
456// commentry in DIArgList::handleChangedOperand for details. Hidden behind
457// conditional compilation to avoid a compile time regression.
458ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
459 if (auto *N = dyn_cast<MDNode>(&MD)) {
460 return !N->isResolved() || N->isAlwaysReplaceable()
461 ? N->Context.getOrCreateReplaceableUses()
462 : nullptr;
463 }
464 if (auto ArgList = dyn_cast<DIArgList>(&MD))
465 return ArgList;
466 return dyn_cast<ValueAsMetadata>(&MD);
467}
468
469ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
470 if (auto *N = dyn_cast<MDNode>(&MD)) {
471 return !N->isResolved() || N->isAlwaysReplaceable()
472 ? N->Context.getReplaceableUses()
473 : nullptr;
474 }
475 if (auto ArgList = dyn_cast<DIArgList>(&MD))
476 return ArgList;
477 return dyn_cast<ValueAsMetadata>(&MD);
478}
479
480bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
481 if (auto *N = dyn_cast<MDNode>(&MD))
482 return !N->isResolved() || N->isAlwaysReplaceable();
483 return isa<ValueAsMetadata>(&MD) || isa<DIArgList>(&MD);
484}
485
487 assert(V && "Expected value");
488 if (auto *A = dyn_cast<Argument>(V)) {
489 if (auto *Fn = A->getParent())
490 return Fn->getSubprogram();
491 return nullptr;
492 }
493
494 if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
495 if (auto *Fn = BB->getParent())
496 return Fn->getSubprogram();
497 return nullptr;
498 }
499
500 return nullptr;
501}
502
504 assert(V && "Unexpected null Value");
505
506 auto &Context = V->getContext();
507 auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
508 if (!Entry) {
510 "Expected constant or function-local value");
511 assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
512 V->IsUsedByMD = true;
513 if (auto *C = dyn_cast<Constant>(V))
514 Entry = new ConstantAsMetadata(C);
515 else
516 Entry = new LocalAsMetadata(V);
517 }
518
519 return Entry;
520}
521
523 assert(V && "Unexpected null Value");
524 return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
525}
526
528 assert(V && "Expected valid value");
529
530 auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
531 auto I = Store.find(V);
532 if (I == Store.end())
533 return;
534
535 // Remove old entry from the map.
536 ValueAsMetadata *MD = I->second;
537 assert(MD && "Expected valid metadata");
538 assert(MD->getValue() == V && "Expected valid mapping");
539 Store.erase(I);
540
541 // Delete the metadata.
542 MD->replaceAllUsesWith(nullptr);
543 delete MD;
544}
545
547 assert(From && "Expected valid value");
548 assert(To && "Expected valid value");
549 assert(From != To && "Expected changed value");
550 assert(&From->getContext() == &To->getContext() && "Expected same context");
551
552 LLVMContext &Context = From->getType()->getContext();
553 auto &Store = Context.pImpl->ValuesAsMetadata;
554 auto I = Store.find(From);
555 if (I == Store.end()) {
556 assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
557 return;
558 }
559
560 // Remove old entry from the map.
561 assert(From->IsUsedByMD && "Expected From to be used by metadata");
562 From->IsUsedByMD = false;
563 ValueAsMetadata *MD = I->second;
564 assert(MD && "Expected valid metadata");
565 assert(MD->getValue() == From && "Expected valid mapping");
566 Store.erase(I);
567
568 if (isa<LocalAsMetadata>(MD)) {
569 if (auto *C = dyn_cast<Constant>(To)) {
570 // Local became a constant.
572 delete MD;
573 return;
574 }
577 // DISubprogram changed.
578 MD->replaceAllUsesWith(nullptr);
579 delete MD;
580 return;
582 } else if (!isa<Constant>(To)) {
583 // Changed to function-local value.
584 MD->replaceAllUsesWith(nullptr);
585 delete MD;
586 return;
587 }
589 auto *&Entry = Store[To];
590 if (Entry) {
591 // The target already exists.
592 MD->replaceAllUsesWith(Entry);
593 delete MD;
594 return;
595 }
596
597 // Update MD in place (and update the map entry).
598 assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
599 To->IsUsedByMD = true;
600 MD->V = To;
601 Entry = MD;
602}
603
604//===----------------------------------------------------------------------===//
605// MDString implementation.
606//
607
608MDString *MDString::get(LLVMContext &Context, StringRef Str) {
609 auto &Store = Context.pImpl->MDStringCache;
610 auto I = Store.try_emplace(Str);
611 auto &MapEntry = I.first->getValue();
612 if (!I.second)
613 return &MapEntry;
614 MapEntry.Entry = &*I.first;
615 return &MapEntry;
616}
617
619 assert(Entry && "Expected to find string map entry");
620 return Entry->first();
621}
622
623//===----------------------------------------------------------------------===//
624// MDNode implementation.
627// Assert that the MDNode types will not be unaligned by the objects
628// prepended to them.
629#define HANDLE_MDNODE_LEAF(CLASS) \
630 static_assert( \
631 alignof(uint64_t) >= alignof(CLASS), \
632 "Alignment is insufficient after objects prepended to " #CLASS);
633#include "llvm/IR/Metadata.def"
634
635void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
636 // uint64_t is the most aligned type we need support (ensured by static_assert
637 // above)
638 size_t AllocSize =
639 alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
640 char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
641 Header *H = new (Mem + AllocSize - sizeof(Header)) Header(NumOps, Storage);
642 return reinterpret_cast<void *>(H + 1);
643}
644
645void MDNode::operator delete(void *N) {
646 Header *H = reinterpret_cast<Header *>(N) - 1;
647 void *Mem = H->getAllocation();
648 H->~Header();
649 ::operator delete(Mem);
650}
651
654 : Metadata(ID, Storage), Context(Context) {
655 unsigned Op = 0;
656 for (Metadata *MD : Ops1)
657 setOperand(Op++, MD);
658 for (Metadata *MD : Ops2)
659 setOperand(Op++, MD);
660
661 if (!isUniqued())
662 return;
663
664 // Count the unresolved operands. If there are any, RAUW support will be
665 // added lazily on first reference.
666 countUnresolvedOperands();
667}
668
669TempMDNode MDNode::clone() const {
670 switch (getMetadataID()) {
671 default:
672 llvm_unreachable("Invalid MDNode subclass");
673#define HANDLE_MDNODE_LEAF(CLASS) \
674 case CLASS##Kind: \
675 return cast<CLASS>(this)->cloneImpl();
676#include "llvm/IR/Metadata.def"
677 }
678}
679
680MDNode::Header::Header(size_t NumOps, StorageType Storage) {
681 IsLarge = isLarge(NumOps);
682 IsResizable = isResizable(Storage);
683 SmallSize = getSmallSize(NumOps, IsResizable, IsLarge);
684 if (IsLarge) {
685 SmallNumOps = 0;
686 new (getLargePtr()) LargeStorageVector();
687 getLarge().resize(NumOps);
688 return;
689 }
690 SmallNumOps = NumOps;
691 MDOperand *O = reinterpret_cast<MDOperand *>(this) - SmallSize;
692 for (MDOperand *E = O + SmallSize; O != E;)
693 (void)new (O++) MDOperand();
694}
695
696MDNode::Header::~Header() {
697 if (IsLarge) {
698 getLarge().~LargeStorageVector();
699 return;
700 }
701 MDOperand *O = reinterpret_cast<MDOperand *>(this);
702 for (MDOperand *E = O - SmallSize; O != E; --O)
703 (O - 1)->~MDOperand();
704}
705
706void *MDNode::Header::getSmallPtr() {
707 static_assert(alignof(MDOperand) <= alignof(Header),
708 "MDOperand too strongly aligned");
709 return reinterpret_cast<char *>(const_cast<Header *>(this)) -
710 sizeof(MDOperand) * SmallSize;
711}
712
713void MDNode::Header::resize(size_t NumOps) {
714 assert(IsResizable && "Node is not resizable");
715 if (operands().size() == NumOps)
716 return;
717
718 if (IsLarge)
719 getLarge().resize(NumOps);
720 else if (NumOps <= SmallSize)
721 resizeSmall(NumOps);
722 else
723 resizeSmallToLarge(NumOps);
724}
725
726void MDNode::Header::resizeSmall(size_t NumOps) {
727 assert(!IsLarge && "Expected a small MDNode");
728 assert(NumOps <= SmallSize && "NumOps too large for small resize");
729
730 MutableArrayRef<MDOperand> ExistingOps = operands();
731 assert(NumOps != ExistingOps.size() && "Expected a different size");
732
733 int NumNew = (int)NumOps - (int)ExistingOps.size();
734 MDOperand *O = ExistingOps.end();
735 for (int I = 0, E = NumNew; I < E; ++I)
736 (O++)->reset();
737 for (int I = 0, E = NumNew; I > E; --I)
738 (--O)->reset();
739 SmallNumOps = NumOps;
740 assert(O == operands().end() && "Operands not (un)initialized until the end");
741}
742
743void MDNode::Header::resizeSmallToLarge(size_t NumOps) {
744 assert(!IsLarge && "Expected a small MDNode");
745 assert(NumOps > SmallSize && "Expected NumOps to be larger than allocation");
746 LargeStorageVector NewOps;
747 NewOps.resize(NumOps);
748 llvm::move(operands(), NewOps.begin());
749 resizeSmall(0);
750 new (getLargePtr()) LargeStorageVector(std::move(NewOps));
751 IsLarge = true;
752}
753
755 if (auto *N = dyn_cast_or_null<MDNode>(Op))
756 return !N->isResolved();
757 return false;
758}
759
760void MDNode::countUnresolvedOperands() {
761 assert(getNumUnresolved() == 0 && "Expected unresolved ops to be uncounted");
762 assert(isUniqued() && "Expected this to be uniqued");
764}
765
766void MDNode::makeUniqued() {
767 assert(isTemporary() && "Expected this to be temporary");
768 assert(!isResolved() && "Expected this to be unresolved");
769
770 // Enable uniquing callbacks.
771 for (auto &Op : mutable_operands())
772 Op.reset(Op.get(), this);
773
774 // Make this 'uniqued'.
776 countUnresolvedOperands();
777 if (!getNumUnresolved()) {
778 dropReplaceableUses();
779 assert(isResolved() && "Expected this to be resolved");
780 }
781
782 assert(isUniqued() && "Expected this to be uniqued");
783}
784
785void MDNode::makeDistinct() {
786 assert(isTemporary() && "Expected this to be temporary");
787 assert(!isResolved() && "Expected this to be unresolved");
788
789 // Drop RAUW support and store as a distinct node.
790 dropReplaceableUses();
792
793 assert(isDistinct() && "Expected this to be distinct");
794 assert(isResolved() && "Expected this to be resolved");
795}
796
798 assert(isUniqued() && "Expected this to be uniqued");
799 assert(!isResolved() && "Expected this to be unresolved");
800
802 dropReplaceableUses();
803
804 assert(isResolved() && "Expected this to be resolved");
805}
806
807void MDNode::dropReplaceableUses() {
808 assert(!getNumUnresolved() && "Unexpected unresolved operand");
809
810 // Drop any RAUW support.
811 if (Context.hasReplaceableUses())
812 Context.takeReplaceableUses()->resolveAllUses();
813}
814
815void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
816 assert(isUniqued() && "Expected this to be uniqued");
817 assert(getNumUnresolved() != 0 && "Expected unresolved operands");
818
819 // Check if an operand was resolved.
820 if (!isOperandUnresolved(Old)) {
821 if (isOperandUnresolved(New))
822 // An operand was un-resolved!
824 } else if (!isOperandUnresolved(New))
825 decrementUnresolvedOperandCount();
826}
827
828void MDNode::decrementUnresolvedOperandCount() {
829 assert(!isResolved() && "Expected this to be unresolved");
830 if (isTemporary())
831 return;
832
833 assert(isUniqued() && "Expected this to be uniqued");
835 if (getNumUnresolved())
836 return;
837
838 // Last unresolved operand has just been resolved.
839 dropReplaceableUses();
840 assert(isResolved() && "Expected this to become resolved");
841}
842
844 if (isResolved())
845 return;
846
847 // Resolve this node immediately.
848 resolve();
849
850 // Resolve all operands.
851 for (const auto &Op : operands()) {
853 if (!N)
854 continue;
855
856 assert(!N->isTemporary() &&
857 "Expected all forward declarations to be resolved");
858 if (!N->isResolved())
859 N->resolveCycles();
860 }
861}
862
863static bool hasSelfReference(MDNode *N) {
864 return llvm::is_contained(N->operands(), N);
865}
866
867MDNode *MDNode::replaceWithPermanentImpl() {
868 switch (getMetadataID()) {
869 default:
870 // If this type isn't uniquable, replace with a distinct node.
871 return replaceWithDistinctImpl();
872
873#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
874 case CLASS##Kind: \
875 break;
876#include "llvm/IR/Metadata.def"
877 }
878
879 // Even if this type is uniquable, self-references have to be distinct.
880 if (hasSelfReference(this))
881 return replaceWithDistinctImpl();
882 return replaceWithUniquedImpl();
883}
884
885MDNode *MDNode::replaceWithUniquedImpl() {
886 // Try to uniquify in place.
887 MDNode *UniquedNode = uniquify();
888
889 if (UniquedNode == this) {
890 makeUniqued();
891 return this;
892 }
893
894 // Collision, so RAUW instead.
895 replaceAllUsesWith(UniquedNode);
896 deleteAsSubclass();
897 return UniquedNode;
898}
899
900MDNode *MDNode::replaceWithDistinctImpl() {
901 makeDistinct();
902 return this;
903}
904
905void MDTuple::recalculateHash() {
906 setHash(MDTupleInfo::KeyTy::calculateHash(this));
907}
908
910 for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
911 setOperand(I, nullptr);
912 if (Context.hasReplaceableUses()) {
913 Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
914 (void)Context.takeReplaceableUses();
915 }
916}
917
918void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
919 unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
920 assert(Op < getNumOperands() && "Expected valid operand");
921
922 if (!isUniqued()) {
923 // This node is not uniqued. Just set the operand and be done with it.
924 setOperand(Op, New);
925 return;
926 }
927
928 // This node is uniqued.
929 eraseFromStore();
930
931 Metadata *Old = getOperand(Op);
932 setOperand(Op, New);
933
934 // Drop uniquing for self-reference cycles and deleted constants.
935 if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
936 if (!isResolved())
937 resolve();
939 return;
940 }
941
942 // Re-unique the node.
943 auto *Uniqued = uniquify();
944 if (Uniqued == this) {
945 if (!isResolved())
946 resolveAfterOperandChange(Old, New);
947 return;
948 }
949
950 // Collision.
951 if (!isResolved()) {
952 // Still unresolved, so RAUW.
953 //
954 // First, clear out all operands to prevent any recursion (similar to
955 // dropAllReferences(), but we still need the use-list).
956 for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
957 setOperand(O, nullptr);
958 if (Context.hasReplaceableUses())
959 Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
960 deleteAsSubclass();
961 return;
962 }
963
964 // Store in non-uniqued form if RAUW isn't possible.
966}
967
968void MDNode::deleteAsSubclass() {
969 switch (getMetadataID()) {
970 default:
971 llvm_unreachable("Invalid subclass of MDNode");
972#define HANDLE_MDNODE_LEAF(CLASS) \
973 case CLASS##Kind: \
974 delete cast<CLASS>(this); \
975 break;
976#include "llvm/IR/Metadata.def"
977 }
978}
979
980template <class T, class InfoT>
982 if (T *U = getUniqued(Store, N))
983 return U;
984
985 Store.insert(N);
986 return N;
987}
988
989template <class NodeTy> struct MDNode::HasCachedHash {
990 template <class U>
991 static std::true_type check(SameType<void (U::*)(unsigned), &U::setHash> *);
992 template <class U> static std::false_type check(...);
993
994 static constexpr bool value = decltype(check<NodeTy>(nullptr))::value;
995};
996
997MDNode *MDNode::uniquify() {
998 assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
999
1000 // Try to insert into uniquing store.
1001 switch (getMetadataID()) {
1002 default:
1003 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1004#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1005 case CLASS##Kind: { \
1006 CLASS *SubclassThis = cast<CLASS>(this); \
1007 dispatchRecalculateHash(SubclassThis); \
1008 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
1009 }
1010#include "llvm/IR/Metadata.def"
1011 }
1012}
1013
1014void MDNode::eraseFromStore() {
1015 switch (getMetadataID()) {
1016 default:
1017 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
1018#define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
1019 case CLASS##Kind: \
1020 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
1021 break;
1022#include "llvm/IR/Metadata.def"
1023 }
1024}
1025
1026MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1027 StorageType Storage, bool ShouldCreate) {
1028 unsigned Hash = 0;
1029 if (Storage == Uniqued) {
1030 MDTupleInfo::KeyTy Key(MDs);
1031 if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
1032 return N;
1033 if (!ShouldCreate)
1034 return nullptr;
1035 Hash = Key.getHash();
1036 } else {
1037 assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
1038 }
1039
1040 return storeImpl(new (MDs.size(), Storage)
1041 MDTuple(Context, Storage, Hash, MDs),
1042 Storage, Context.pImpl->MDTuples);
1043}
1044
1046 assert(N->isTemporary() && "Expected temporary node");
1047 N->replaceAllUsesWith(nullptr);
1048 N->deleteAsSubclass();
1049}
1050
1052 assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
1053 assert(!getNumUnresolved() && "Unexpected unresolved nodes");
1054 Storage = Distinct;
1055 assert(isResolved() && "Expected this to be resolved");
1056
1057 // Reset the hash.
1058 switch (getMetadataID()) {
1059 default:
1060 llvm_unreachable("Invalid subclass of MDNode");
1061#define HANDLE_MDNODE_LEAF(CLASS) \
1062 case CLASS##Kind: { \
1063 dispatchResetHash(cast<CLASS>(this)); \
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
1440 if (!MD)
1442
1444 for (Metadata *Op : MD->operands()) {
1445 CaptureComponents Component =
1447 .Case("address", CaptureComponents::Address)
1448 .Case("address_is_null", CaptureComponents::AddressIsNull)
1449 .Case("provenance", CaptureComponents::Provenance)
1450 .Case("read_provenance", CaptureComponents::ReadProvenance);
1451 CC |= Component;
1452 }
1453 return CC;
1454}
1455
1457 assert(!capturesNothing(CC) && "Can't encode captures(none)");
1458 if (capturesAll(CC))
1459 return nullptr;
1460
1461 SmallVector<Metadata *> Components;
1463 Components.push_back(MDString::get(Ctx, "address_is_null"));
1464 else if (capturesAddress(CC))
1465 Components.push_back(MDString::get(Ctx, "address"));
1467 Components.push_back(MDString::get(Ctx, "read_provenance"));
1468 else if (capturesFullProvenance(CC))
1469 Components.push_back(MDString::get(Ctx, "provenance"));
1470 return MDNode::get(Ctx, Components);
1471}
1472
1473//===----------------------------------------------------------------------===//
1474// NamedMDNode implementation.
1475//
1476
1480
1481NamedMDNode::NamedMDNode(const Twine &N)
1482 : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
1483
1486 delete &getNMDOps(Operands);
1487}
1488
1490 return (unsigned)getNMDOps(Operands).size();
1491}
1492
1494 assert(i < getNumOperands() && "Invalid Operand number!");
1495 auto *N = getNMDOps(Operands)[i].get();
1496 return cast_or_null<MDNode>(N);
1497}
1498
1499void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
1500
1501void NamedMDNode::setOperand(unsigned I, MDNode *New) {
1502 assert(I < getNumOperands() && "Invalid operand number");
1503 getNMDOps(Operands)[I].reset(New);
1504}
1505
1507
1508void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
1509
1511
1512//===----------------------------------------------------------------------===//
1513// Instruction Metadata method implementations.
1514//
1515
1517 for (const auto &A : Attachments)
1518 if (A.MDKind == ID)
1519 return A.Node;
1520 return nullptr;
1521}
1522
1523void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
1524 for (const auto &A : Attachments)
1525 if (A.MDKind == ID)
1526 Result.push_back(A.Node);
1527}
1528
1530 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1531 for (const auto &A : Attachments)
1532 Result.emplace_back(A.MDKind, A.Node);
1533
1534 // Sort the resulting array so it is stable with respect to metadata IDs. We
1535 // need to preserve the original insertion order though.
1536 if (Result.size() > 1)
1537 llvm::stable_sort(Result, less_first());
1538}
1539
1540void MDAttachments::set(unsigned ID, MDNode *MD) {
1541 erase(ID);
1542 if (MD)
1543 insert(ID, *MD);
1544}
1545
1546void MDAttachments::insert(unsigned ID, MDNode &MD) {
1547 Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1548}
1549
1550bool MDAttachments::erase(unsigned ID) {
1551 if (empty())
1552 return false;
1553
1554 // Common case is one value.
1555 if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1556 Attachments.pop_back();
1557 return true;
1558 }
1559
1560 auto OldSize = Attachments.size();
1561 llvm::erase_if(Attachments,
1562 [ID](const Attachment &A) { return A.MDKind == ID; });
1563 return OldSize != Attachments.size();
1564}
1565
1567 if (!hasMetadata())
1568 return nullptr;
1569 unsigned KindID = getContext().getMDKindID(Kind);
1570 return getMetadataImpl(KindID);
1571}
1572
1573MDNode *Value::getMetadataImpl(unsigned KindID) const {
1574 const LLVMContext &Ctx = getContext();
1575 const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
1576 return Attachements.lookup(KindID);
1577}
1578
1579void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1580 if (hasMetadata())
1581 getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
1582}
1583
1585 if (hasMetadata())
1586 getMetadata(getContext().getMDKindID(Kind), MDs);
1587}
1588
1590 SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1591 if (hasMetadata()) {
1592 assert(getContext().pImpl->ValueMetadata.count(this) &&
1593 "bit out of sync with hash table");
1594 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1595 Info.getAll(MDs);
1596 }
1597}
1598
1599void Value::setMetadata(unsigned KindID, MDNode *Node) {
1601
1602 // Handle the case when we're adding/updating metadata on a value.
1603 if (Node) {
1605 assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1606 if (Info.empty())
1607 HasMetadata = true;
1608 Info.set(KindID, Node);
1609 return;
1610 }
1611
1612 // Otherwise, we're removing metadata from an instruction.
1613 assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1614 "bit out of sync with hash table");
1615 if (!HasMetadata)
1616 return; // Nothing to remove!
1617 MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1618
1619 // Handle removal of an existing value.
1620 Info.erase(KindID);
1621 if (!Info.empty())
1622 return;
1623 getContext().pImpl->ValueMetadata.erase(this);
1624 HasMetadata = false;
1625}
1626
1628 if (!Node && !HasMetadata)
1629 return;
1630 setMetadata(getContext().getMDKindID(Kind), Node);
1631}
1632
1633void Value::addMetadata(unsigned KindID, MDNode &MD) {
1635 if (!HasMetadata)
1636 HasMetadata = true;
1637 getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1638}
1639
1641 addMetadata(getContext().getMDKindID(Kind), MD);
1642}
1643
1644bool Value::eraseMetadata(unsigned KindID) {
1645 // Nothing to unset.
1646 if (!HasMetadata)
1647 return false;
1648
1649 MDAttachments &Store = getContext().pImpl->ValueMetadata.find(this)->second;
1650 bool Changed = Store.erase(KindID);
1651 if (Store.empty())
1652 clearMetadata();
1653 return Changed;
1654}
1655
1656void Value::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1657 if (!HasMetadata)
1658 return;
1659
1660 auto &MetadataStore = getContext().pImpl->ValueMetadata;
1661 MDAttachments &Info = MetadataStore.find(this)->second;
1662 assert(!Info.empty() && "bit out of sync with hash table");
1663 Info.remove_if([Pred](const MDAttachments::Attachment &I) {
1664 return Pred(I.MDKind, I.Node);
1665 });
1666
1667 if (Info.empty())
1668 clearMetadata();
1669}
1670
1672 if (!HasMetadata)
1673 return;
1674 assert(getContext().pImpl->ValueMetadata.count(this) &&
1675 "bit out of sync with hash table");
1676 getContext().pImpl->ValueMetadata.erase(this);
1677 HasMetadata = false;
1678}
1679
1681 if (!Node && !hasMetadata())
1682 return;
1683 setMetadata(getContext().getMDKindID(Kind), Node);
1684}
1685
1686MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
1687 const LLVMContext &Ctx = getContext();
1688 unsigned KindID = Ctx.getMDKindID(Kind);
1689 if (KindID == LLVMContext::MD_dbg)
1690 return DbgLoc.getAsMDNode();
1691 return Value::getMetadata(KindID);
1692}
1693
1694void Instruction::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
1695 if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
1696 DbgLoc = {};
1697
1699}
1700
1702 if (!Value::hasMetadata())
1703 return; // Nothing to remove!
1704
1705 SmallSet<unsigned, 32> KnownSet(llvm::from_range, KnownIDs);
1706
1707 // A DIAssignID attachment is debug metadata, don't drop it.
1708 KnownSet.insert(LLVMContext::MD_DIAssignID);
1709
1710 Value::eraseMetadataIf([&KnownSet](unsigned MDKind, MDNode *Node) {
1711 return !KnownSet.count(MDKind);
1712 });
1713}
1714
1715void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1716 auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1717 if (const DIAssignID *CurrentID =
1718 cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1719 // Nothing to do if the ID isn't changing.
1720 if (ID == CurrentID)
1721 return;
1722
1723 // Unmap this instruction from its current ID.
1724 auto InstrsIt = IDToInstrs.find(CurrentID);
1725 assert(InstrsIt != IDToInstrs.end() &&
1726 "Expect existing attachment to be mapped");
1727
1728 auto &InstVec = InstrsIt->second;
1729 auto *InstIt = llvm::find(InstVec, this);
1730 assert(InstIt != InstVec.end() &&
1731 "Expect instruction to be mapped to attachment");
1732 // The vector contains a ptr to this. If this is the only element in the
1733 // vector, remove the ID:vector entry, otherwise just remove the
1734 // instruction from the vector.
1735 if (InstVec.size() == 1)
1736 IDToInstrs.erase(InstrsIt);
1737 else
1738 InstVec.erase(InstIt);
1739 }
1740
1741 // Map this instruction to the new ID.
1742 if (ID)
1743 IDToInstrs[ID].push_back(this);
1744}
1745
1746void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
1747 if (!Node && !hasMetadata())
1748 return;
1749
1750 // Handle 'dbg' as a special case since it is not stored in the hash table.
1751 if (KindID == LLVMContext::MD_dbg) {
1752 DbgLoc = DebugLoc(Node);
1753 return;
1754 }
1755
1756 // Update DIAssignID to Instruction(s) mapping.
1757 if (KindID == LLVMContext::MD_DIAssignID) {
1758 // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1759 // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1760 // having a dedicated assert helps make this obvious.
1761 assert((!Node || !Node->isTemporary()) &&
1762 "Temporary DIAssignIDs are invalid");
1763 updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1764 }
1765
1766 Value::setMetadata(KindID, Node);
1767}
1768
1771 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1772 SmallSetVector<StringRef, 2> AnnotationsSet(Annotations.begin(),
1773 Annotations.end());
1774 auto *Tuple = cast<MDTuple>(Existing);
1775 for (auto &N : Tuple->operands()) {
1776 if (isa<MDString>(N.get())) {
1777 Names.push_back(N);
1778 continue;
1779 }
1780 auto *MDAnnotationTuple = cast<MDTuple>(N);
1781 if (any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](auto &Op) {
1782 return AnnotationsSet.contains(cast<MDString>(Op)->getString());
1783 }))
1784 return;
1785 Names.push_back(N);
1786 }
1787 }
1788
1789 MDBuilder MDB(getContext());
1790 SmallVector<Metadata *> MDAnnotationStrings;
1791 for (StringRef Annotation : Annotations)
1792 MDAnnotationStrings.push_back(MDB.createString(Annotation));
1793 MDNode *InfoTuple = MDTuple::get(getContext(), MDAnnotationStrings);
1794 Names.push_back(InfoTuple);
1795 MDNode *MD = MDTuple::get(getContext(), Names);
1796 setMetadata(LLVMContext::MD_annotation, MD);
1797}
1798
1801 if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1802 auto *Tuple = cast<MDTuple>(Existing);
1803 for (auto &N : Tuple->operands()) {
1804 if (isa<MDString>(N.get()) &&
1805 cast<MDString>(N.get())->getString() == Name)
1806 return;
1807 Names.push_back(N.get());
1808 }
1809 }
1810
1811 MDBuilder MDB(getContext());
1812 Names.push_back(MDB.createString(Name));
1813 MDNode *MD = MDTuple::get(getContext(), Names);
1814 setMetadata(LLVMContext::MD_annotation, MD);
1815}
1816
1818 AAMDNodes Result;
1819 // Not using Instruction::hasMetadata() because we're not interested in
1820 // DebugInfoMetadata.
1821 if (Value::hasMetadata()) {
1822 const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1823 Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1824 Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1825 Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1826 Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1827 Result.NoAliasAddrSpace = Info.lookup(LLVMContext::MD_noalias_addrspace);
1828 }
1829 return Result;
1830}
1831
1833 setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1834 setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
1835 setMetadata(LLVMContext::MD_alias_scope, N.Scope);
1836 setMetadata(LLVMContext::MD_noalias, N.NoAlias);
1837 setMetadata(LLVMContext::MD_noalias_addrspace, N.NoAliasAddrSpace);
1838}
1839
1841 setMetadata(llvm::LLVMContext::MD_nosanitize,
1843}
1844
1845void Instruction::getAllMetadataImpl(
1846 SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1847 Result.clear();
1848
1849 // Handle 'dbg' as a special case since it is not stored in the hash table.
1850 if (DbgLoc) {
1851 Result.push_back(
1852 std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
1853 }
1854 Value::getAllMetadata(Result);
1855}
1856
1858 assert(
1859 (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1860 getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1861 getOpcode() == Instruction::IndirectBr ||
1862 getOpcode() == Instruction::Switch) &&
1863 "Looking for branch weights on something besides branch");
1864
1865 return ::extractProfTotalWeight(*this, TotalVal);
1866}
1867
1870 Other->getAllMetadata(MDs);
1871 for (auto &MD : MDs) {
1872 // We need to adjust the type metadata offset.
1873 if (Offset != 0 && MD.first == LLVMContext::MD_type) {
1874 auto *OffsetConst = cast<ConstantInt>(
1875 cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
1876 Metadata *TypeId = MD.second->getOperand(1);
1877 auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
1878 OffsetConst->getType(), OffsetConst->getValue() + Offset));
1879 addMetadata(LLVMContext::MD_type,
1880 *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
1881 continue;
1882 }
1883 // If an offset adjustment was specified we need to modify the DIExpression
1884 // to prepend the adjustment:
1885 // !DIExpression(DW_OP_plus, Offset, [original expr])
1886 auto *Attachment = MD.second;
1887 if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1889 DIExpression *E = nullptr;
1890 if (!GV) {
1891 auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
1892 GV = GVE->getVariable();
1893 E = GVE->getExpression();
1894 }
1895 ArrayRef<uint64_t> OrigElements;
1896 if (E)
1897 OrigElements = E->getElements();
1898 std::vector<uint64_t> Elements(OrigElements.size() + 2);
1899 Elements[0] = dwarf::DW_OP_plus_uconst;
1900 Elements[1] = Offset;
1901 llvm::copy(OrigElements, Elements.begin() + 2);
1902 E = DIExpression::get(getContext(), Elements);
1903 Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
1904 }
1905 addMetadata(MD.first, *Attachment);
1906 }
1907}
1908
1911 LLVMContext::MD_type,
1913 {ConstantAsMetadata::get(ConstantInt::get(
1915 TypeID}));
1916}
1917
1919 // Remove any existing vcall visibility metadata first in case we are
1920 // updating.
1921 eraseMetadata(LLVMContext::MD_vcall_visibility);
1922 addMetadata(LLVMContext::MD_vcall_visibility,
1924 {ConstantAsMetadata::get(ConstantInt::get(
1926}
1927
1929 if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
1931 cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
1932 ->getZExtValue();
1933 assert(Val <= 2 && "unknown vcall visibility!");
1934 return (VCallVisibility)Val;
1935 }
1937}
1938
1940 setMetadata(LLVMContext::MD_dbg, SP);
1941}
1942
1944 return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
1945}
1946
1948 if (DISubprogram *SP = getSubprogram()) {
1949 if (DICompileUnit *CU = SP->getUnit()) {
1950 return CU->getDebugInfoForProfiling();
1951 }
1952 }
1953 return false;
1954}
1955
1957 addMetadata(LLVMContext::MD_dbg, *GV);
1958}
1959
1963 getMetadata(LLVMContext::MD_dbg, MDs);
1964 for (MDNode *MD : MDs)
1966}
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:486
static Metadata * canonicalizeMetadataForValue(LLVMContext &Context, Metadata *MD)
Canonicalize metadata arguments to intrinsics.
Definition Metadata.cpp:82
static bool isOperandUnresolved(Metadata *Op)
Definition Metadata.cpp:754
static bool hasSelfReference(MDNode *N)
Definition Metadata.cpp:863
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:981
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:1593
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:536
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:220
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:159
std::array< Metadata *, 3 > DebugValues
Definition Metadata.h:226
void resetDebugValue(size_t Idx, Metadata *DebugValue)
Definition Metadata.h:281
LLVM_ABI DbgVariableRecord * getUser()
Definition Metadata.cpp:152
Implements a dense probed hash-table based set.
Definition DenseSet.h:279
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:1078
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:843
static LLVM_ABI CaptureComponents toCaptureComponents(const MDNode *MD)
Convert !captures metadata to CaptureComponents. MD may be nullptr.
mutable_op_range mutable_operands()
Definition Metadata.h:1216
static LLVM_ABI MDNode * getMergedCalleeTypeMetadata(const MDNode *A, const MDNode *B)
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition Metadata.h:1282
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:797
const MDOperand & getOperand(unsigned I) const
Definition Metadata.h:1442
static LLVM_ABI MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
LLVM_ABI void storeDistinctInContext()
bool isTemporary() const
Definition Metadata.h:1262
ArrayRef< MDOperand > operands() const
Definition Metadata.h:1440
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1569
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:1260
static LLVM_ABI MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
void setNumUnresolved(unsigned N)
Definition Metadata.h:1369
unsigned getNumOperands() const
Return number of MDNode operands.
Definition Metadata.h:1448
MDOperand * mutable_begin()
Definition Metadata.h:1211
LLVM_ABI MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
Definition Metadata.cpp:652
LLVM_ABI TempMDNode clone() const
Create a (temporary) clone of this.
Definition Metadata.cpp:669
static LLVM_ABI MDNode * getMostGenericRange(MDNode *A, MDNode *B)
bool isDistinct() const
Definition Metadata.h:1261
LLVM_ABI void setOperand(unsigned I, Metadata *New)
Set an operand.
bool isResolved() const
Check if node is fully resolved.
Definition Metadata.h:1258
op_iterator op_begin() const
Definition Metadata.h:1432
static LLVM_ABI MDNode * intersect(MDNode *A, MDNode *B)
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
LLVMContext & getContext() const
Definition Metadata.h:1242
static LLVM_ABI MDNode * fromCaptureComponents(LLVMContext &Ctx, CaptureComponents CC)
Convert CaptureComponents to !captures metadata.
LLVM_ABI void dropAllReferences()
Definition Metadata.cpp:909
static LLVM_ABI MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
unsigned getNumUnresolved() const
Definition Metadata.h:1367
Tracking metadata reference owned by Metadata.
Definition Metadata.h:900
A single uniqued string.
Definition Metadata.h:721
LLVM_ABI StringRef getString() const
Definition Metadata.cpp:618
static LLVM_ABI MDString * get(LLVMContext &Context, StringRef Str)
Definition Metadata.cpp:608
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1526
static LLVM_ABI MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:104
static LLVM_ABI MetadataAsValue * getIfExists(LLVMContext &Context, Metadata *MD)
Definition Metadata.cpp:112
LLVM_ABI ~MetadataAsValue()
Definition Metadata.cpp:66
static LLVM_ABI bool isReplaceable(const Metadata &MD)
Check whether metadata is replaceable.
Definition Metadata.cpp:247
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
Definition Metadata.h:357
PointerUnion< MetadataAsValue *, Metadata *, DebugValueUser * > OwnerTy
Definition Metadata.h:376
static bool retrack(Metadata *&MD, Metadata *&New)
Move tracking from one reference to another.
Definition Metadata.h:368
static bool track(Metadata *&MD)
Track the reference to metadata.
Definition Metadata.h:323
Root of the metadata hierarchy.
Definition Metadata.h:64
StorageType
Active type of storage.
Definition Metadata.h:72
unsigned char Storage
Storage flag for non-uniqued, otherwise unowned, metadata.
Definition Metadata.h:75
unsigned getMetadataID() const
Definition Metadata.h:104
Metadata(unsigned ID, StorageType Storage)
Definition Metadata.h:88
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:1822
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:1827
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:390
static LLVM_ABI void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Definition Metadata.cpp:332
LLVM_ABI void replaceAllUsesWith(Metadata *MD)
Replace all uses of this with MD.
Definition Metadata.cpp:369
LLVM_ABI SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Returns the list of all DbgVariableRecord users of this.
Definition Metadata.cpp:273
LLVM_ABI void resolveAllUses(bool ResolveUsers=true)
Resolve all uses of this.
Definition Metadata.cpp:422
LLVM_ABI SmallVector< Metadata * > getAllArgListUsers()
Returns the list of all DIArgList users of this.
Definition Metadata.cpp:251
MetadataTracking::OwnerTy OwnerTy
Definition Metadata.h:394
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:229
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:150
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:338
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:183
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
A switch()-like statement whose cases are string literals.
StringSwitch & Case(StringLiteral S, T Value)
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:458
void replaceAllUsesWith(Metadata *MD)
Handle collisions after Value::replaceAllUsesWith().
Definition Metadata.h:518
static LLVM_ABI void handleDeletion(Value *V)
Definition Metadata.cpp:527
static LLVM_ABI ValueAsMetadata * get(Value *V)
Definition Metadata.cpp:503
static LLVM_ABI ValueAsMetadata * getIfExists(Value *V)
Definition Metadata.cpp:522
static LLVM_ABI void handleRAUW(Value *From, Value *To)
Definition Metadata.cpp:546
ValueAsMetadata(unsigned ID, Value *V)
Definition Metadata.h:470
Value * getValue() const
Definition Metadata.h:498
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:1099
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:695
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract(Y &&MD)
Extract a Value from Metadata.
Definition Metadata.h:667
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
bool capturesReadProvenanceOnly(CaptureComponents CC)
Definition ModRef.h:331
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
bool capturesAddressIsNullOnly(CaptureComponents CC)
Definition ModRef.h:323
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)
bool capturesAddress(CaptureComponents CC)
Definition ModRef.h:327
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
Definition Casting.h:644
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:733
auto cast_or_null(const Y &Val)
Definition Casting.h:715
auto dyn_cast_or_null(const Y &Val)
Definition Casting.h:754
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
bool capturesFullProvenance(CaptureComponents CC)
Definition ModRef.h:336
void sort(IteratorTy Start, IteratorTy End)
Definition STLExtras.h:1624
CaptureComponents
Components of the pointer that may be captured.
Definition ModRef.h:305
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:144
DWARFExpression::Operation Op
ArrayRef(const T &OneElt) -> ArrayRef< T >
OutputIt copy(R &&Range, OutputIt Out)
Definition STLExtras.h:1815
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:560
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
bool capturesAll(CaptureComponents CC)
Definition ModRef.h:344
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
bool capturesNothing(CaptureComponents CC)
Definition ModRef.h:315
#define N
static constexpr bool value
Definition Metadata.cpp:994
static std::false_type check(...)
static std::true_type check(SameType< void(U::*)(unsigned), &U::setHash > *)
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition Metadata.h:761
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