1 //===- Metadata.cpp - Implement Metadata classes --------------------------===//
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
7 //===----------------------------------------------------------------------===//
9 // This file implements the Metadata classes.
11 //===----------------------------------------------------------------------===//
13 #include "LLVMContextImpl.h"
14 #include "MetadataImpl.h"
15 #include "SymbolTableListTraitsImpl.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/None.h"
21 #include "llvm/ADT/STLExtras.h"
22 #include "llvm/ADT/SetVector.h"
23 #include "llvm/ADT/SmallPtrSet.h"
24 #include "llvm/ADT/SmallSet.h"
25 #include "llvm/ADT/SmallVector.h"
26 #include "llvm/ADT/StringMap.h"
27 #include "llvm/ADT/StringRef.h"
28 #include "llvm/ADT/Twine.h"
29 #include "llvm/IR/Argument.h"
30 #include "llvm/IR/BasicBlock.h"
31 #include "llvm/IR/Constant.h"
32 #include "llvm/IR/ConstantRange.h"
33 #include "llvm/IR/Constants.h"
34 #include "llvm/IR/DebugInfoMetadata.h"
35 #include "llvm/IR/DebugLoc.h"
36 #include "llvm/IR/Function.h"
37 #include "llvm/IR/GlobalObject.h"
38 #include "llvm/IR/GlobalVariable.h"
39 #include "llvm/IR/Instruction.h"
40 #include "llvm/IR/LLVMContext.h"
41 #include "llvm/IR/Metadata.h"
42 #include "llvm/IR/Module.h"
43 #include "llvm/IR/TrackingMDRef.h"
44 #include "llvm/IR/Type.h"
45 #include "llvm/IR/Value.h"
46 #include "llvm/IR/ValueHandle.h"
47 #include "llvm/Support/Casting.h"
48 #include "llvm/Support/ErrorHandling.h"
49 #include "llvm/Support/MathExtras.h"
56 #include <type_traits>
62 MetadataAsValue::MetadataAsValue(Type
*Ty
, Metadata
*MD
)
63 : Value(Ty
, MetadataAsValueVal
), MD(MD
) {
67 MetadataAsValue::~MetadataAsValue() {
68 getType()->getContext().pImpl
->MetadataAsValues
.erase(MD
);
72 /// Canonicalize metadata arguments to intrinsics.
74 /// To support bitcode upgrades (and assembly semantic sugar) for \a
75 /// MetadataAsValue, we need to canonicalize certain metadata.
77 /// - nullptr is replaced by an empty MDNode.
78 /// - An MDNode with a single null operand is replaced by an empty MDNode.
79 /// - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
81 /// This maintains readability of bitcode from when metadata was a type of
82 /// value, and these bridges were unnecessary.
83 static Metadata
*canonicalizeMetadataForValue(LLVMContext
&Context
,
87 return MDNode::get(Context
, None
);
89 // Return early if this isn't a single-operand MDNode.
90 auto *N
= dyn_cast
<MDNode
>(MD
);
91 if (!N
|| N
->getNumOperands() != 1)
94 if (!N
->getOperand(0))
96 return MDNode::get(Context
, None
);
98 if (auto *C
= dyn_cast
<ConstantAsMetadata
>(N
->getOperand(0)))
99 // Look through the MDNode.
105 MetadataAsValue
*MetadataAsValue::get(LLVMContext
&Context
, Metadata
*MD
) {
106 MD
= canonicalizeMetadataForValue(Context
, MD
);
107 auto *&Entry
= Context
.pImpl
->MetadataAsValues
[MD
];
109 Entry
= new MetadataAsValue(Type::getMetadataTy(Context
), MD
);
113 MetadataAsValue
*MetadataAsValue::getIfExists(LLVMContext
&Context
,
115 MD
= canonicalizeMetadataForValue(Context
, MD
);
116 auto &Store
= Context
.pImpl
->MetadataAsValues
;
117 return Store
.lookup(MD
);
120 void MetadataAsValue::handleChangedMetadata(Metadata
*MD
) {
121 LLVMContext
&Context
= getContext();
122 MD
= canonicalizeMetadataForValue(Context
, MD
);
123 auto &Store
= Context
.pImpl
->MetadataAsValues
;
125 // Stop tracking the old metadata.
126 Store
.erase(this->MD
);
130 // Start tracking MD, or RAUW if necessary.
131 auto *&Entry
= Store
[MD
];
133 replaceAllUsesWith(Entry
);
143 void MetadataAsValue::track() {
145 MetadataTracking::track(&MD
, *MD
, *this);
148 void MetadataAsValue::untrack() {
150 MetadataTracking::untrack(MD
);
153 bool MetadataTracking::track(void *Ref
, Metadata
&MD
, OwnerTy Owner
) {
154 assert(Ref
&& "Expected live reference");
155 assert((Owner
|| *static_cast<Metadata
**>(Ref
) == &MD
) &&
156 "Reference without owner must be direct");
157 if (auto *R
= ReplaceableMetadataImpl::getOrCreate(MD
)) {
158 R
->addRef(Ref
, Owner
);
161 if (auto *PH
= dyn_cast
<DistinctMDOperandPlaceholder
>(&MD
)) {
162 assert(!PH
->Use
&& "Placeholders can only be used once");
163 assert(!Owner
&& "Unexpected callback to owner");
164 PH
->Use
= static_cast<Metadata
**>(Ref
);
170 void MetadataTracking::untrack(void *Ref
, Metadata
&MD
) {
171 assert(Ref
&& "Expected live reference");
172 if (auto *R
= ReplaceableMetadataImpl::getIfExists(MD
))
174 else if (auto *PH
= dyn_cast
<DistinctMDOperandPlaceholder
>(&MD
))
178 bool MetadataTracking::retrack(void *Ref
, Metadata
&MD
, void *New
) {
179 assert(Ref
&& "Expected live reference");
180 assert(New
&& "Expected live reference");
181 assert(Ref
!= New
&& "Expected change");
182 if (auto *R
= ReplaceableMetadataImpl::getIfExists(MD
)) {
183 R
->moveRef(Ref
, New
, MD
);
186 assert(!isa
<DistinctMDOperandPlaceholder
>(MD
) &&
187 "Unexpected move of an MDOperand");
188 assert(!isReplaceable(MD
) &&
189 "Expected un-replaceable metadata, since we didn't move a reference");
193 bool MetadataTracking::isReplaceable(const Metadata
&MD
) {
194 return ReplaceableMetadataImpl::isReplaceable(MD
);
197 void ReplaceableMetadataImpl::addRef(void *Ref
, OwnerTy Owner
) {
199 UseMap
.insert(std::make_pair(Ref
, std::make_pair(Owner
, NextIndex
)))
202 assert(WasInserted
&& "Expected to add a reference");
205 assert(NextIndex
!= 0 && "Unexpected overflow");
208 void ReplaceableMetadataImpl::dropRef(void *Ref
) {
209 bool WasErased
= UseMap
.erase(Ref
);
211 assert(WasErased
&& "Expected to drop a reference");
214 void ReplaceableMetadataImpl::moveRef(void *Ref
, void *New
,
215 const Metadata
&MD
) {
216 auto I
= UseMap
.find(Ref
);
217 assert(I
!= UseMap
.end() && "Expected to move a reference");
218 auto OwnerAndIndex
= I
->second
;
220 bool WasInserted
= UseMap
.insert(std::make_pair(New
, OwnerAndIndex
)).second
;
222 assert(WasInserted
&& "Expected to add a reference");
224 // Check that the references are direct if there's no owner.
226 assert((OwnerAndIndex
.first
|| *static_cast<Metadata
**>(Ref
) == &MD
) &&
227 "Reference without owner must be direct");
228 assert((OwnerAndIndex
.first
|| *static_cast<Metadata
**>(New
) == &MD
) &&
229 "Reference without owner must be direct");
232 void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata
*MD
) {
236 // Copy out uses since UseMap will get touched below.
237 using UseTy
= std::pair
<void *, std::pair
<OwnerTy
, uint64_t>>;
238 SmallVector
<UseTy
, 8> Uses(UseMap
.begin(), UseMap
.end());
239 llvm::sort(Uses
, [](const UseTy
&L
, const UseTy
&R
) {
240 return L
.second
.second
< R
.second
.second
;
242 for (const auto &Pair
: Uses
) {
243 // Check that this Ref hasn't disappeared after RAUW (when updating a
245 if (!UseMap
.count(Pair
.first
))
248 OwnerTy Owner
= Pair
.second
.first
;
250 // Update unowned tracking references directly.
251 Metadata
*&Ref
= *static_cast<Metadata
**>(Pair
.first
);
254 MetadataTracking::track(Ref
);
255 UseMap
.erase(Pair
.first
);
259 // Check for MetadataAsValue.
260 if (Owner
.is
<MetadataAsValue
*>()) {
261 Owner
.get
<MetadataAsValue
*>()->handleChangedMetadata(MD
);
265 // There's a Metadata owner -- dispatch.
266 Metadata
*OwnerMD
= Owner
.get
<Metadata
*>();
267 switch (OwnerMD
->getMetadataID()) {
268 #define HANDLE_METADATA_LEAF(CLASS) \
269 case Metadata::CLASS##Kind: \
270 cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
272 #include "llvm/IR/Metadata.def"
274 llvm_unreachable("Invalid metadata subclass");
277 assert(UseMap
.empty() && "Expected all uses to be replaced");
280 void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers
) {
289 // Copy out uses since UseMap could get touched below.
290 using UseTy
= std::pair
<void *, std::pair
<OwnerTy
, uint64_t>>;
291 SmallVector
<UseTy
, 8> Uses(UseMap
.begin(), UseMap
.end());
292 llvm::sort(Uses
, [](const UseTy
&L
, const UseTy
&R
) {
293 return L
.second
.second
< R
.second
.second
;
296 for (const auto &Pair
: Uses
) {
297 auto Owner
= Pair
.second
.first
;
300 if (Owner
.is
<MetadataAsValue
*>())
303 // Resolve MDNodes that point at this.
304 auto *OwnerMD
= dyn_cast
<MDNode
>(Owner
.get
<Metadata
*>());
307 if (OwnerMD
->isResolved())
309 OwnerMD
->decrementUnresolvedOperandCount();
313 ReplaceableMetadataImpl
*ReplaceableMetadataImpl::getOrCreate(Metadata
&MD
) {
314 if (auto *N
= dyn_cast
<MDNode
>(&MD
))
315 return N
->isResolved() ? nullptr : N
->Context
.getOrCreateReplaceableUses();
316 return dyn_cast
<ValueAsMetadata
>(&MD
);
319 ReplaceableMetadataImpl
*ReplaceableMetadataImpl::getIfExists(Metadata
&MD
) {
320 if (auto *N
= dyn_cast
<MDNode
>(&MD
))
321 return N
->isResolved() ? nullptr : N
->Context
.getReplaceableUses();
322 return dyn_cast
<ValueAsMetadata
>(&MD
);
325 bool ReplaceableMetadataImpl::isReplaceable(const Metadata
&MD
) {
326 if (auto *N
= dyn_cast
<MDNode
>(&MD
))
327 return !N
->isResolved();
328 return dyn_cast
<ValueAsMetadata
>(&MD
);
331 static DISubprogram
*getLocalFunctionMetadata(Value
*V
) {
332 assert(V
&& "Expected value");
333 if (auto *A
= dyn_cast
<Argument
>(V
)) {
334 if (auto *Fn
= A
->getParent())
335 return Fn
->getSubprogram();
339 if (BasicBlock
*BB
= cast
<Instruction
>(V
)->getParent()) {
340 if (auto *Fn
= BB
->getParent())
341 return Fn
->getSubprogram();
348 ValueAsMetadata
*ValueAsMetadata::get(Value
*V
) {
349 assert(V
&& "Unexpected null Value");
351 auto &Context
= V
->getContext();
352 auto *&Entry
= Context
.pImpl
->ValuesAsMetadata
[V
];
354 assert((isa
<Constant
>(V
) || isa
<Argument
>(V
) || isa
<Instruction
>(V
)) &&
355 "Expected constant or function-local value");
356 assert(!V
->IsUsedByMD
&& "Expected this to be the only metadata use");
357 V
->IsUsedByMD
= true;
358 if (auto *C
= dyn_cast
<Constant
>(V
))
359 Entry
= new ConstantAsMetadata(C
);
361 Entry
= new LocalAsMetadata(V
);
367 ValueAsMetadata
*ValueAsMetadata::getIfExists(Value
*V
) {
368 assert(V
&& "Unexpected null Value");
369 return V
->getContext().pImpl
->ValuesAsMetadata
.lookup(V
);
372 void ValueAsMetadata::handleDeletion(Value
*V
) {
373 assert(V
&& "Expected valid value");
375 auto &Store
= V
->getType()->getContext().pImpl
->ValuesAsMetadata
;
376 auto I
= Store
.find(V
);
377 if (I
== Store
.end())
380 // Remove old entry from the map.
381 ValueAsMetadata
*MD
= I
->second
;
382 assert(MD
&& "Expected valid metadata");
383 assert(MD
->getValue() == V
&& "Expected valid mapping");
386 // Delete the metadata.
387 MD
->replaceAllUsesWith(nullptr);
391 void ValueAsMetadata::handleRAUW(Value
*From
, Value
*To
) {
392 assert(From
&& "Expected valid value");
393 assert(To
&& "Expected valid value");
394 assert(From
!= To
&& "Expected changed value");
395 assert(From
->getType() == To
->getType() && "Unexpected type change");
397 LLVMContext
&Context
= From
->getType()->getContext();
398 auto &Store
= Context
.pImpl
->ValuesAsMetadata
;
399 auto I
= Store
.find(From
);
400 if (I
== Store
.end()) {
401 assert(!From
->IsUsedByMD
&& "Expected From not to be used by metadata");
405 // Remove old entry from the map.
406 assert(From
->IsUsedByMD
&& "Expected From to be used by metadata");
407 From
->IsUsedByMD
= false;
408 ValueAsMetadata
*MD
= I
->second
;
409 assert(MD
&& "Expected valid metadata");
410 assert(MD
->getValue() == From
&& "Expected valid mapping");
413 if (isa
<LocalAsMetadata
>(MD
)) {
414 if (auto *C
= dyn_cast
<Constant
>(To
)) {
415 // Local became a constant.
416 MD
->replaceAllUsesWith(ConstantAsMetadata::get(C
));
420 if (getLocalFunctionMetadata(From
) && getLocalFunctionMetadata(To
) &&
421 getLocalFunctionMetadata(From
) != getLocalFunctionMetadata(To
)) {
422 // DISubprogram changed.
423 MD
->replaceAllUsesWith(nullptr);
427 } else if (!isa
<Constant
>(To
)) {
428 // Changed to function-local value.
429 MD
->replaceAllUsesWith(nullptr);
434 auto *&Entry
= Store
[To
];
436 // The target already exists.
437 MD
->replaceAllUsesWith(Entry
);
442 // Update MD in place (and update the map entry).
443 assert(!To
->IsUsedByMD
&& "Expected this to be the only metadata use");
444 To
->IsUsedByMD
= true;
449 //===----------------------------------------------------------------------===//
450 // MDString implementation.
453 MDString
*MDString::get(LLVMContext
&Context
, StringRef Str
) {
454 auto &Store
= Context
.pImpl
->MDStringCache
;
455 auto I
= Store
.try_emplace(Str
);
456 auto &MapEntry
= I
.first
->getValue();
459 MapEntry
.Entry
= &*I
.first
;
463 StringRef
MDString::getString() const {
464 assert(Entry
&& "Expected to find string map entry");
465 return Entry
->first();
468 //===----------------------------------------------------------------------===//
469 // MDNode implementation.
472 // Assert that the MDNode types will not be unaligned by the objects
473 // prepended to them.
474 #define HANDLE_MDNODE_LEAF(CLASS) \
476 alignof(uint64_t) >= alignof(CLASS), \
477 "Alignment is insufficient after objects prepended to " #CLASS);
478 #include "llvm/IR/Metadata.def"
480 void *MDNode::operator new(size_t Size
, unsigned NumOps
) {
481 size_t OpSize
= NumOps
* sizeof(MDOperand
);
482 // uint64_t is the most aligned type we need support (ensured by static_assert
484 OpSize
= alignTo(OpSize
, alignof(uint64_t));
485 void *Ptr
= reinterpret_cast<char *>(::operator new(OpSize
+ Size
)) + OpSize
;
486 MDOperand
*O
= static_cast<MDOperand
*>(Ptr
);
487 for (MDOperand
*E
= O
- NumOps
; O
!= E
; --O
)
488 (void)new (O
- 1) MDOperand
;
492 void MDNode::operator delete(void *Mem
) {
493 MDNode
*N
= static_cast<MDNode
*>(Mem
);
494 size_t OpSize
= N
->NumOperands
* sizeof(MDOperand
);
495 OpSize
= alignTo(OpSize
, alignof(uint64_t));
497 MDOperand
*O
= static_cast<MDOperand
*>(Mem
);
498 for (MDOperand
*E
= O
- N
->NumOperands
; O
!= E
; --O
)
499 (O
- 1)->~MDOperand();
500 ::operator delete(reinterpret_cast<char *>(Mem
) - OpSize
);
503 MDNode::MDNode(LLVMContext
&Context
, unsigned ID
, StorageType Storage
,
504 ArrayRef
<Metadata
*> Ops1
, ArrayRef
<Metadata
*> Ops2
)
505 : Metadata(ID
, Storage
), NumOperands(Ops1
.size() + Ops2
.size()),
506 NumUnresolved(0), Context(Context
) {
508 for (Metadata
*MD
: Ops1
)
509 setOperand(Op
++, MD
);
510 for (Metadata
*MD
: Ops2
)
511 setOperand(Op
++, MD
);
516 // Count the unresolved operands. If there are any, RAUW support will be
517 // added lazily on first reference.
518 countUnresolvedOperands();
521 TempMDNode
MDNode::clone() const {
522 switch (getMetadataID()) {
524 llvm_unreachable("Invalid MDNode subclass");
525 #define HANDLE_MDNODE_LEAF(CLASS) \
527 return cast<CLASS>(this)->cloneImpl();
528 #include "llvm/IR/Metadata.def"
532 static bool isOperandUnresolved(Metadata
*Op
) {
533 if (auto *N
= dyn_cast_or_null
<MDNode
>(Op
))
534 return !N
->isResolved();
538 void MDNode::countUnresolvedOperands() {
539 assert(NumUnresolved
== 0 && "Expected unresolved ops to be uncounted");
540 assert(isUniqued() && "Expected this to be uniqued");
541 NumUnresolved
= count_if(operands(), isOperandUnresolved
);
544 void MDNode::makeUniqued() {
545 assert(isTemporary() && "Expected this to be temporary");
546 assert(!isResolved() && "Expected this to be unresolved");
548 // Enable uniquing callbacks.
549 for (auto &Op
: mutable_operands())
550 Op
.reset(Op
.get(), this);
552 // Make this 'uniqued'.
554 countUnresolvedOperands();
555 if (!NumUnresolved
) {
556 dropReplaceableUses();
557 assert(isResolved() && "Expected this to be resolved");
560 assert(isUniqued() && "Expected this to be uniqued");
563 void MDNode::makeDistinct() {
564 assert(isTemporary() && "Expected this to be temporary");
565 assert(!isResolved() && "Expected this to be unresolved");
567 // Drop RAUW support and store as a distinct node.
568 dropReplaceableUses();
569 storeDistinctInContext();
571 assert(isDistinct() && "Expected this to be distinct");
572 assert(isResolved() && "Expected this to be resolved");
575 void MDNode::resolve() {
576 assert(isUniqued() && "Expected this to be uniqued");
577 assert(!isResolved() && "Expected this to be unresolved");
580 dropReplaceableUses();
582 assert(isResolved() && "Expected this to be resolved");
585 void MDNode::dropReplaceableUses() {
586 assert(!NumUnresolved
&& "Unexpected unresolved operand");
588 // Drop any RAUW support.
589 if (Context
.hasReplaceableUses())
590 Context
.takeReplaceableUses()->resolveAllUses();
593 void MDNode::resolveAfterOperandChange(Metadata
*Old
, Metadata
*New
) {
594 assert(isUniqued() && "Expected this to be uniqued");
595 assert(NumUnresolved
!= 0 && "Expected unresolved operands");
597 // Check if an operand was resolved.
598 if (!isOperandUnresolved(Old
)) {
599 if (isOperandUnresolved(New
))
600 // An operand was un-resolved!
602 } else if (!isOperandUnresolved(New
))
603 decrementUnresolvedOperandCount();
606 void MDNode::decrementUnresolvedOperandCount() {
607 assert(!isResolved() && "Expected this to be unresolved");
611 assert(isUniqued() && "Expected this to be uniqued");
615 // Last unresolved operand has just been resolved.
616 dropReplaceableUses();
617 assert(isResolved() && "Expected this to become resolved");
620 void MDNode::resolveCycles() {
624 // Resolve this node immediately.
627 // Resolve all operands.
628 for (const auto &Op
: operands()) {
629 auto *N
= dyn_cast_or_null
<MDNode
>(Op
);
633 assert(!N
->isTemporary() &&
634 "Expected all forward declarations to be resolved");
635 if (!N
->isResolved())
640 static bool hasSelfReference(MDNode
*N
) {
641 for (Metadata
*MD
: N
->operands())
647 MDNode
*MDNode::replaceWithPermanentImpl() {
648 switch (getMetadataID()) {
650 // If this type isn't uniquable, replace with a distinct node.
651 return replaceWithDistinctImpl();
653 #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
656 #include "llvm/IR/Metadata.def"
659 // Even if this type is uniquable, self-references have to be distinct.
660 if (hasSelfReference(this))
661 return replaceWithDistinctImpl();
662 return replaceWithUniquedImpl();
665 MDNode
*MDNode::replaceWithUniquedImpl() {
666 // Try to uniquify in place.
667 MDNode
*UniquedNode
= uniquify();
669 if (UniquedNode
== this) {
674 // Collision, so RAUW instead.
675 replaceAllUsesWith(UniquedNode
);
680 MDNode
*MDNode::replaceWithDistinctImpl() {
685 void MDTuple::recalculateHash() {
686 setHash(MDTupleInfo::KeyTy::calculateHash(this));
689 void MDNode::dropAllReferences() {
690 for (unsigned I
= 0, E
= NumOperands
; I
!= E
; ++I
)
691 setOperand(I
, nullptr);
692 if (Context
.hasReplaceableUses()) {
693 Context
.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
694 (void)Context
.takeReplaceableUses();
698 void MDNode::handleChangedOperand(void *Ref
, Metadata
*New
) {
699 unsigned Op
= static_cast<MDOperand
*>(Ref
) - op_begin();
700 assert(Op
< getNumOperands() && "Expected valid operand");
703 // This node is not uniqued. Just set the operand and be done with it.
708 // This node is uniqued.
711 Metadata
*Old
= getOperand(Op
);
714 // Drop uniquing for self-reference cycles and deleted constants.
715 if (New
== this || (!New
&& Old
&& isa
<ConstantAsMetadata
>(Old
))) {
718 storeDistinctInContext();
722 // Re-unique the node.
723 auto *Uniqued
= uniquify();
724 if (Uniqued
== this) {
726 resolveAfterOperandChange(Old
, New
);
732 // Still unresolved, so RAUW.
734 // First, clear out all operands to prevent any recursion (similar to
735 // dropAllReferences(), but we still need the use-list).
736 for (unsigned O
= 0, E
= getNumOperands(); O
!= E
; ++O
)
737 setOperand(O
, nullptr);
738 if (Context
.hasReplaceableUses())
739 Context
.getReplaceableUses()->replaceAllUsesWith(Uniqued
);
744 // Store in non-uniqued form if RAUW isn't possible.
745 storeDistinctInContext();
748 void MDNode::deleteAsSubclass() {
749 switch (getMetadataID()) {
751 llvm_unreachable("Invalid subclass of MDNode");
752 #define HANDLE_MDNODE_LEAF(CLASS) \
754 delete cast<CLASS>(this); \
756 #include "llvm/IR/Metadata.def"
760 template <class T
, class InfoT
>
761 static T
*uniquifyImpl(T
*N
, DenseSet
<T
*, InfoT
> &Store
) {
762 if (T
*U
= getUniqued(Store
, N
))
769 template <class NodeTy
> struct MDNode::HasCachedHash
{
772 template <class U
, U Val
> struct SFINAE
{};
775 static Yes
&check(SFINAE
<void (U::*)(unsigned), &U::setHash
> *);
776 template <class U
> static No
&check(...);
778 static const bool value
= sizeof(check
<NodeTy
>(nullptr)) == sizeof(Yes
);
781 MDNode
*MDNode::uniquify() {
782 assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
784 // Try to insert into uniquing store.
785 switch (getMetadataID()) {
787 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
788 #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
789 case CLASS##Kind: { \
790 CLASS *SubclassThis = cast<CLASS>(this); \
791 std::integral_constant<bool, HasCachedHash<CLASS>::value> \
792 ShouldRecalculateHash; \
793 dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \
794 return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
796 #include "llvm/IR/Metadata.def"
800 void MDNode::eraseFromStore() {
801 switch (getMetadataID()) {
803 llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
804 #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
806 getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
808 #include "llvm/IR/Metadata.def"
812 MDTuple
*MDTuple::getImpl(LLVMContext
&Context
, ArrayRef
<Metadata
*> MDs
,
813 StorageType Storage
, bool ShouldCreate
) {
815 if (Storage
== Uniqued
) {
816 MDTupleInfo::KeyTy
Key(MDs
);
817 if (auto *N
= getUniqued(Context
.pImpl
->MDTuples
, Key
))
821 Hash
= Key
.getHash();
823 assert(ShouldCreate
&& "Expected non-uniqued nodes to always be created");
826 return storeImpl(new (MDs
.size()) MDTuple(Context
, Storage
, Hash
, MDs
),
827 Storage
, Context
.pImpl
->MDTuples
);
830 void MDNode::deleteTemporary(MDNode
*N
) {
831 assert(N
->isTemporary() && "Expected temporary node");
832 N
->replaceAllUsesWith(nullptr);
833 N
->deleteAsSubclass();
836 void MDNode::storeDistinctInContext() {
837 assert(!Context
.hasReplaceableUses() && "Unexpected replaceable uses");
838 assert(!NumUnresolved
&& "Unexpected unresolved nodes");
840 assert(isResolved() && "Expected this to be resolved");
843 switch (getMetadataID()) {
845 llvm_unreachable("Invalid subclass of MDNode");
846 #define HANDLE_MDNODE_LEAF(CLASS) \
847 case CLASS##Kind: { \
848 std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
849 dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \
852 #include "llvm/IR/Metadata.def"
855 getContext().pImpl
->DistinctMDNodes
.push_back(this);
858 void MDNode::replaceOperandWith(unsigned I
, Metadata
*New
) {
859 if (getOperand(I
) == New
)
867 handleChangedOperand(mutable_begin() + I
, New
);
870 void MDNode::setOperand(unsigned I
, Metadata
*New
) {
871 assert(I
< NumOperands
);
872 mutable_begin()[I
].reset(New
, isUniqued() ? this : nullptr);
875 /// Get a node or a self-reference that looks like it.
877 /// Special handling for finding self-references, for use by \a
878 /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
879 /// when self-referencing nodes were still uniqued. If the first operand has
880 /// the same operands as \c Ops, return the first operand instead.
881 static MDNode
*getOrSelfReference(LLVMContext
&Context
,
882 ArrayRef
<Metadata
*> Ops
) {
884 if (MDNode
*N
= dyn_cast_or_null
<MDNode
>(Ops
[0]))
885 if (N
->getNumOperands() == Ops
.size() && N
== N
->getOperand(0)) {
886 for (unsigned I
= 1, E
= Ops
.size(); I
!= E
; ++I
)
887 if (Ops
[I
] != N
->getOperand(I
))
888 return MDNode::get(Context
, Ops
);
892 return MDNode::get(Context
, Ops
);
895 MDNode
*MDNode::concatenate(MDNode
*A
, MDNode
*B
) {
901 SmallSetVector
<Metadata
*, 4> MDs(A
->op_begin(), A
->op_end());
902 MDs
.insert(B
->op_begin(), B
->op_end());
904 // FIXME: This preserves long-standing behaviour, but is it really the right
905 // behaviour? Or was that an unintended side-effect of node uniquing?
906 return getOrSelfReference(A
->getContext(), MDs
.getArrayRef());
909 MDNode
*MDNode::intersect(MDNode
*A
, MDNode
*B
) {
913 SmallSetVector
<Metadata
*, 4> MDs(A
->op_begin(), A
->op_end());
914 SmallPtrSet
<Metadata
*, 4> BSet(B
->op_begin(), B
->op_end());
915 MDs
.remove_if([&](Metadata
*MD
) { return !is_contained(BSet
, MD
); });
917 // FIXME: This preserves long-standing behaviour, but is it really the right
918 // behaviour? Or was that an unintended side-effect of node uniquing?
919 return getOrSelfReference(A
->getContext(), MDs
.getArrayRef());
922 MDNode
*MDNode::getMostGenericAliasScope(MDNode
*A
, MDNode
*B
) {
926 return concatenate(A
, B
);
929 MDNode
*MDNode::getMostGenericFPMath(MDNode
*A
, MDNode
*B
) {
933 APFloat AVal
= mdconst::extract
<ConstantFP
>(A
->getOperand(0))->getValueAPF();
934 APFloat BVal
= mdconst::extract
<ConstantFP
>(B
->getOperand(0))->getValueAPF();
935 if (AVal
.compare(BVal
) == APFloat::cmpLessThan
)
940 static bool isContiguous(const ConstantRange
&A
, const ConstantRange
&B
) {
941 return A
.getUpper() == B
.getLower() || A
.getLower() == B
.getUpper();
944 static bool canBeMerged(const ConstantRange
&A
, const ConstantRange
&B
) {
945 return !A
.intersectWith(B
).isEmptySet() || isContiguous(A
, B
);
948 static bool tryMergeRange(SmallVectorImpl
<ConstantInt
*> &EndPoints
,
949 ConstantInt
*Low
, ConstantInt
*High
) {
950 ConstantRange
NewRange(Low
->getValue(), High
->getValue());
951 unsigned Size
= EndPoints
.size();
952 APInt LB
= EndPoints
[Size
- 2]->getValue();
953 APInt LE
= EndPoints
[Size
- 1]->getValue();
954 ConstantRange
LastRange(LB
, LE
);
955 if (canBeMerged(NewRange
, LastRange
)) {
956 ConstantRange Union
= LastRange
.unionWith(NewRange
);
957 Type
*Ty
= High
->getType();
958 EndPoints
[Size
- 2] =
959 cast
<ConstantInt
>(ConstantInt::get(Ty
, Union
.getLower()));
960 EndPoints
[Size
- 1] =
961 cast
<ConstantInt
>(ConstantInt::get(Ty
, Union
.getUpper()));
967 static void addRange(SmallVectorImpl
<ConstantInt
*> &EndPoints
,
968 ConstantInt
*Low
, ConstantInt
*High
) {
969 if (!EndPoints
.empty())
970 if (tryMergeRange(EndPoints
, Low
, High
))
973 EndPoints
.push_back(Low
);
974 EndPoints
.push_back(High
);
977 MDNode
*MDNode::getMostGenericRange(MDNode
*A
, MDNode
*B
) {
978 // Given two ranges, we want to compute the union of the ranges. This
979 // is slightly complicated by having to combine the intervals and merge
980 // the ones that overlap.
988 // First, walk both lists in order of the lower boundary of each interval.
989 // At each step, try to merge the new interval to the last one we adedd.
990 SmallVector
<ConstantInt
*, 4> EndPoints
;
993 int AN
= A
->getNumOperands() / 2;
994 int BN
= B
->getNumOperands() / 2;
995 while (AI
< AN
&& BI
< BN
) {
996 ConstantInt
*ALow
= mdconst::extract
<ConstantInt
>(A
->getOperand(2 * AI
));
997 ConstantInt
*BLow
= mdconst::extract
<ConstantInt
>(B
->getOperand(2 * BI
));
999 if (ALow
->getValue().slt(BLow
->getValue())) {
1000 addRange(EndPoints
, ALow
,
1001 mdconst::extract
<ConstantInt
>(A
->getOperand(2 * AI
+ 1)));
1004 addRange(EndPoints
, BLow
,
1005 mdconst::extract
<ConstantInt
>(B
->getOperand(2 * BI
+ 1)));
1010 addRange(EndPoints
, mdconst::extract
<ConstantInt
>(A
->getOperand(2 * AI
)),
1011 mdconst::extract
<ConstantInt
>(A
->getOperand(2 * AI
+ 1)));
1015 addRange(EndPoints
, mdconst::extract
<ConstantInt
>(B
->getOperand(2 * BI
)),
1016 mdconst::extract
<ConstantInt
>(B
->getOperand(2 * BI
+ 1)));
1020 // If we have more than 2 ranges (4 endpoints) we have to try to merge
1021 // the last and first ones.
1022 unsigned Size
= EndPoints
.size();
1024 ConstantInt
*FB
= EndPoints
[0];
1025 ConstantInt
*FE
= EndPoints
[1];
1026 if (tryMergeRange(EndPoints
, FB
, FE
)) {
1027 for (unsigned i
= 0; i
< Size
- 2; ++i
) {
1028 EndPoints
[i
] = EndPoints
[i
+ 2];
1030 EndPoints
.resize(Size
- 2);
1034 // If in the end we have a single range, it is possible that it is now the
1035 // full range. Just drop the metadata in that case.
1036 if (EndPoints
.size() == 2) {
1037 ConstantRange
Range(EndPoints
[0]->getValue(), EndPoints
[1]->getValue());
1038 if (Range
.isFullSet())
1042 SmallVector
<Metadata
*, 4> MDs
;
1043 MDs
.reserve(EndPoints
.size());
1044 for (auto *I
: EndPoints
)
1045 MDs
.push_back(ConstantAsMetadata::get(I
));
1046 return MDNode::get(A
->getContext(), MDs
);
1049 MDNode
*MDNode::getMostGenericAlignmentOrDereferenceable(MDNode
*A
, MDNode
*B
) {
1053 ConstantInt
*AVal
= mdconst::extract
<ConstantInt
>(A
->getOperand(0));
1054 ConstantInt
*BVal
= mdconst::extract
<ConstantInt
>(B
->getOperand(0));
1055 if (AVal
->getZExtValue() < BVal
->getZExtValue())
1060 //===----------------------------------------------------------------------===//
1061 // NamedMDNode implementation.
1064 static SmallVector
<TrackingMDRef
, 4> &getNMDOps(void *Operands
) {
1065 return *(SmallVector
<TrackingMDRef
, 4> *)Operands
;
1068 NamedMDNode::NamedMDNode(const Twine
&N
)
1069 : Name(N
.str()), Operands(new SmallVector
<TrackingMDRef
, 4>()) {}
1071 NamedMDNode::~NamedMDNode() {
1072 dropAllReferences();
1073 delete &getNMDOps(Operands
);
1076 unsigned NamedMDNode::getNumOperands() const {
1077 return (unsigned)getNMDOps(Operands
).size();
1080 MDNode
*NamedMDNode::getOperand(unsigned i
) const {
1081 assert(i
< getNumOperands() && "Invalid Operand number!");
1082 auto *N
= getNMDOps(Operands
)[i
].get();
1083 return cast_or_null
<MDNode
>(N
);
1086 void NamedMDNode::addOperand(MDNode
*M
) { getNMDOps(Operands
).emplace_back(M
); }
1088 void NamedMDNode::setOperand(unsigned I
, MDNode
*New
) {
1089 assert(I
< getNumOperands() && "Invalid operand number");
1090 getNMDOps(Operands
)[I
].reset(New
);
1093 void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); }
1095 void NamedMDNode::clearOperands() { getNMDOps(Operands
).clear(); }
1097 StringRef
NamedMDNode::getName() const { return StringRef(Name
); }
1099 //===----------------------------------------------------------------------===//
1100 // Instruction Metadata method implementations.
1102 void MDAttachmentMap::set(unsigned ID
, MDNode
&MD
) {
1103 for (auto &I
: Attachments
)
1104 if (I
.first
== ID
) {
1105 I
.second
.reset(&MD
);
1108 Attachments
.emplace_back(std::piecewise_construct
, std::make_tuple(ID
),
1109 std::make_tuple(&MD
));
1112 bool MDAttachmentMap::erase(unsigned ID
) {
1116 // Common case is one/last value.
1117 if (Attachments
.back().first
== ID
) {
1118 Attachments
.pop_back();
1122 for (auto I
= Attachments
.begin(), E
= std::prev(Attachments
.end()); I
!= E
;
1124 if (I
->first
== ID
) {
1125 *I
= std::move(Attachments
.back());
1126 Attachments
.pop_back();
1133 MDNode
*MDAttachmentMap::lookup(unsigned ID
) const {
1134 for (const auto &I
: Attachments
)
1140 void MDAttachmentMap::getAll(
1141 SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const {
1142 Result
.append(Attachments
.begin(), Attachments
.end());
1144 // Sort the resulting array so it is stable.
1145 if (Result
.size() > 1)
1146 array_pod_sort(Result
.begin(), Result
.end());
1149 void MDGlobalAttachmentMap::insert(unsigned ID
, MDNode
&MD
) {
1150 Attachments
.push_back({ID
, TrackingMDNodeRef(&MD
)});
1153 MDNode
*MDGlobalAttachmentMap::lookup(unsigned ID
) const {
1154 for (const auto &A
: Attachments
)
1160 void MDGlobalAttachmentMap::get(unsigned ID
,
1161 SmallVectorImpl
<MDNode
*> &Result
) const {
1162 for (const auto &A
: Attachments
)
1164 Result
.push_back(A
.Node
);
1167 bool MDGlobalAttachmentMap::erase(unsigned ID
) {
1168 auto I
= std::remove_if(Attachments
.begin(), Attachments
.end(),
1169 [ID
](const Attachment
&A
) { return A
.MDKind
== ID
; });
1170 bool Changed
= I
!= Attachments
.end();
1171 Attachments
.erase(I
, Attachments
.end());
1175 void MDGlobalAttachmentMap::getAll(
1176 SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const {
1177 for (const auto &A
: Attachments
)
1178 Result
.emplace_back(A
.MDKind
, A
.Node
);
1180 // Sort the resulting array so it is stable with respect to metadata IDs. We
1181 // need to preserve the original insertion order though.
1182 llvm::stable_sort(Result
, less_first());
1185 void Instruction::setMetadata(StringRef Kind
, MDNode
*Node
) {
1186 if (!Node
&& !hasMetadata())
1188 setMetadata(getContext().getMDKindID(Kind
), Node
);
1191 MDNode
*Instruction::getMetadataImpl(StringRef Kind
) const {
1192 return getMetadataImpl(getContext().getMDKindID(Kind
));
1195 void Instruction::dropUnknownNonDebugMetadata(ArrayRef
<unsigned> KnownIDs
) {
1196 if (!hasMetadataHashEntry())
1197 return; // Nothing to remove!
1199 auto &InstructionMetadata
= getContext().pImpl
->InstructionMetadata
;
1201 SmallSet
<unsigned, 4> KnownSet
;
1202 KnownSet
.insert(KnownIDs
.begin(), KnownIDs
.end());
1203 if (KnownSet
.empty()) {
1204 // Just drop our entry at the store.
1205 InstructionMetadata
.erase(this);
1206 setHasMetadataHashEntry(false);
1210 auto &Info
= InstructionMetadata
[this];
1211 Info
.remove_if([&KnownSet
](const std::pair
<unsigned, TrackingMDNodeRef
> &I
) {
1212 return !KnownSet
.count(I
.first
);
1216 // Drop our entry at the store.
1217 InstructionMetadata
.erase(this);
1218 setHasMetadataHashEntry(false);
1222 void Instruction::setMetadata(unsigned KindID
, MDNode
*Node
) {
1223 if (!Node
&& !hasMetadata())
1226 // Handle 'dbg' as a special case since it is not stored in the hash table.
1227 if (KindID
== LLVMContext::MD_dbg
) {
1228 DbgLoc
= DebugLoc(Node
);
1232 // Handle the case when we're adding/updating metadata on an instruction.
1234 auto &Info
= getContext().pImpl
->InstructionMetadata
[this];
1235 assert(!Info
.empty() == hasMetadataHashEntry() &&
1236 "HasMetadata bit is wonked");
1238 setHasMetadataHashEntry(true);
1239 Info
.set(KindID
, *Node
);
1243 // Otherwise, we're removing metadata from an instruction.
1244 assert((hasMetadataHashEntry() ==
1245 (getContext().pImpl
->InstructionMetadata
.count(this) > 0)) &&
1246 "HasMetadata bit out of date!");
1247 if (!hasMetadataHashEntry())
1248 return; // Nothing to remove!
1249 auto &Info
= getContext().pImpl
->InstructionMetadata
[this];
1251 // Handle removal of an existing value.
1257 getContext().pImpl
->InstructionMetadata
.erase(this);
1258 setHasMetadataHashEntry(false);
1261 void Instruction::setAAMetadata(const AAMDNodes
&N
) {
1262 setMetadata(LLVMContext::MD_tbaa
, N
.TBAA
);
1263 setMetadata(LLVMContext::MD_alias_scope
, N
.Scope
);
1264 setMetadata(LLVMContext::MD_noalias
, N
.NoAlias
);
1267 MDNode
*Instruction::getMetadataImpl(unsigned KindID
) const {
1268 // Handle 'dbg' as a special case since it is not stored in the hash table.
1269 if (KindID
== LLVMContext::MD_dbg
)
1270 return DbgLoc
.getAsMDNode();
1272 if (!hasMetadataHashEntry())
1274 auto &Info
= getContext().pImpl
->InstructionMetadata
[this];
1275 assert(!Info
.empty() && "bit out of sync with hash table");
1277 return Info
.lookup(KindID
);
1280 void Instruction::getAllMetadataImpl(
1281 SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const {
1284 // Handle 'dbg' as a special case since it is not stored in the hash table.
1287 std::make_pair((unsigned)LLVMContext::MD_dbg
, DbgLoc
.getAsMDNode()));
1288 if (!hasMetadataHashEntry())
1292 assert(hasMetadataHashEntry() &&
1293 getContext().pImpl
->InstructionMetadata
.count(this) &&
1294 "Shouldn't have called this");
1295 const auto &Info
= getContext().pImpl
->InstructionMetadata
.find(this)->second
;
1296 assert(!Info
.empty() && "Shouldn't have called this");
1297 Info
.getAll(Result
);
1300 void Instruction::getAllMetadataOtherThanDebugLocImpl(
1301 SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &Result
) const {
1303 assert(hasMetadataHashEntry() &&
1304 getContext().pImpl
->InstructionMetadata
.count(this) &&
1305 "Shouldn't have called this");
1306 const auto &Info
= getContext().pImpl
->InstructionMetadata
.find(this)->second
;
1307 assert(!Info
.empty() && "Shouldn't have called this");
1308 Info
.getAll(Result
);
1311 bool Instruction::extractProfMetadata(uint64_t &TrueVal
,
1312 uint64_t &FalseVal
) const {
1314 (getOpcode() == Instruction::Br
|| getOpcode() == Instruction::Select
) &&
1315 "Looking for branch weights on something besides branch or select");
1317 auto *ProfileData
= getMetadata(LLVMContext::MD_prof
);
1318 if (!ProfileData
|| ProfileData
->getNumOperands() != 3)
1321 auto *ProfDataName
= dyn_cast
<MDString
>(ProfileData
->getOperand(0));
1322 if (!ProfDataName
|| !ProfDataName
->getString().equals("branch_weights"))
1325 auto *CITrue
= mdconst::dyn_extract
<ConstantInt
>(ProfileData
->getOperand(1));
1326 auto *CIFalse
= mdconst::dyn_extract
<ConstantInt
>(ProfileData
->getOperand(2));
1327 if (!CITrue
|| !CIFalse
)
1330 TrueVal
= CITrue
->getValue().getZExtValue();
1331 FalseVal
= CIFalse
->getValue().getZExtValue();
1336 bool Instruction::extractProfTotalWeight(uint64_t &TotalVal
) const {
1337 assert((getOpcode() == Instruction::Br
||
1338 getOpcode() == Instruction::Select
||
1339 getOpcode() == Instruction::Call
||
1340 getOpcode() == Instruction::Invoke
||
1341 getOpcode() == Instruction::Switch
) &&
1342 "Looking for branch weights on something besides branch");
1345 auto *ProfileData
= getMetadata(LLVMContext::MD_prof
);
1349 auto *ProfDataName
= dyn_cast
<MDString
>(ProfileData
->getOperand(0));
1353 if (ProfDataName
->getString().equals("branch_weights")) {
1355 for (unsigned i
= 1; i
< ProfileData
->getNumOperands(); i
++) {
1356 auto *V
= mdconst::dyn_extract
<ConstantInt
>(ProfileData
->getOperand(i
));
1359 TotalVal
+= V
->getValue().getZExtValue();
1362 } else if (ProfDataName
->getString().equals("VP") &&
1363 ProfileData
->getNumOperands() > 3) {
1364 TotalVal
= mdconst::dyn_extract
<ConstantInt
>(ProfileData
->getOperand(2))
1372 void Instruction::clearMetadataHashEntries() {
1373 assert(hasMetadataHashEntry() && "Caller should check");
1374 getContext().pImpl
->InstructionMetadata
.erase(this);
1375 setHasMetadataHashEntry(false);
1378 void GlobalObject::getMetadata(unsigned KindID
,
1379 SmallVectorImpl
<MDNode
*> &MDs
) const {
1381 getContext().pImpl
->GlobalObjectMetadata
[this].get(KindID
, MDs
);
1384 void GlobalObject::getMetadata(StringRef Kind
,
1385 SmallVectorImpl
<MDNode
*> &MDs
) const {
1387 getMetadata(getContext().getMDKindID(Kind
), MDs
);
1390 void GlobalObject::addMetadata(unsigned KindID
, MDNode
&MD
) {
1392 setHasMetadataHashEntry(true);
1394 getContext().pImpl
->GlobalObjectMetadata
[this].insert(KindID
, MD
);
1397 void GlobalObject::addMetadata(StringRef Kind
, MDNode
&MD
) {
1398 addMetadata(getContext().getMDKindID(Kind
), MD
);
1401 bool GlobalObject::eraseMetadata(unsigned KindID
) {
1402 // Nothing to unset.
1406 auto &Store
= getContext().pImpl
->GlobalObjectMetadata
[this];
1407 bool Changed
= Store
.erase(KindID
);
1413 void GlobalObject::getAllMetadata(
1414 SmallVectorImpl
<std::pair
<unsigned, MDNode
*>> &MDs
) const {
1420 getContext().pImpl
->GlobalObjectMetadata
[this].getAll(MDs
);
1423 void GlobalObject::clearMetadata() {
1426 getContext().pImpl
->GlobalObjectMetadata
.erase(this);
1427 setHasMetadataHashEntry(false);
1430 void GlobalObject::setMetadata(unsigned KindID
, MDNode
*N
) {
1431 eraseMetadata(KindID
);
1433 addMetadata(KindID
, *N
);
1436 void GlobalObject::setMetadata(StringRef Kind
, MDNode
*N
) {
1437 setMetadata(getContext().getMDKindID(Kind
), N
);
1440 MDNode
*GlobalObject::getMetadata(unsigned KindID
) const {
1442 return getContext().pImpl
->GlobalObjectMetadata
[this].lookup(KindID
);
1446 MDNode
*GlobalObject::getMetadata(StringRef Kind
) const {
1447 return getMetadata(getContext().getMDKindID(Kind
));
1450 void GlobalObject::copyMetadata(const GlobalObject
*Other
, unsigned Offset
) {
1451 SmallVector
<std::pair
<unsigned, MDNode
*>, 8> MDs
;
1452 Other
->getAllMetadata(MDs
);
1453 for (auto &MD
: MDs
) {
1454 // We need to adjust the type metadata offset.
1455 if (Offset
!= 0 && MD
.first
== LLVMContext::MD_type
) {
1456 auto *OffsetConst
= cast
<ConstantInt
>(
1457 cast
<ConstantAsMetadata
>(MD
.second
->getOperand(0))->getValue());
1458 Metadata
*TypeId
= MD
.second
->getOperand(1);
1459 auto *NewOffsetMD
= ConstantAsMetadata::get(ConstantInt::get(
1460 OffsetConst
->getType(), OffsetConst
->getValue() + Offset
));
1461 addMetadata(LLVMContext::MD_type
,
1462 *MDNode::get(getContext(), {NewOffsetMD
, TypeId
}));
1465 // If an offset adjustment was specified we need to modify the DIExpression
1466 // to prepend the adjustment:
1467 // !DIExpression(DW_OP_plus, Offset, [original expr])
1468 auto *Attachment
= MD
.second
;
1469 if (Offset
!= 0 && MD
.first
== LLVMContext::MD_dbg
) {
1470 DIGlobalVariable
*GV
= dyn_cast
<DIGlobalVariable
>(Attachment
);
1471 DIExpression
*E
= nullptr;
1473 auto *GVE
= cast
<DIGlobalVariableExpression
>(Attachment
);
1474 GV
= GVE
->getVariable();
1475 E
= GVE
->getExpression();
1477 ArrayRef
<uint64_t> OrigElements
;
1479 OrigElements
= E
->getElements();
1480 std::vector
<uint64_t> Elements(OrigElements
.size() + 2);
1481 Elements
[0] = dwarf::DW_OP_plus_uconst
;
1482 Elements
[1] = Offset
;
1483 llvm::copy(OrigElements
, Elements
.begin() + 2);
1484 E
= DIExpression::get(getContext(), Elements
);
1485 Attachment
= DIGlobalVariableExpression::get(getContext(), GV
, E
);
1487 addMetadata(MD
.first
, *Attachment
);
1491 void GlobalObject::addTypeMetadata(unsigned Offset
, Metadata
*TypeID
) {
1493 LLVMContext::MD_type
,
1494 *MDTuple::get(getContext(),
1495 {ConstantAsMetadata::get(ConstantInt::get(
1496 Type::getInt64Ty(getContext()), Offset
)),
1500 void Function::setSubprogram(DISubprogram
*SP
) {
1501 setMetadata(LLVMContext::MD_dbg
, SP
);
1504 DISubprogram
*Function::getSubprogram() const {
1505 return cast_or_null
<DISubprogram
>(getMetadata(LLVMContext::MD_dbg
));
1508 bool Function::isDebugInfoForProfiling() const {
1509 if (DISubprogram
*SP
= getSubprogram()) {
1510 if (DICompileUnit
*CU
= SP
->getUnit()) {
1511 return CU
->getDebugInfoForProfiling();
1517 void GlobalVariable::addDebugInfo(DIGlobalVariableExpression
*GV
) {
1518 addMetadata(LLVMContext::MD_dbg
, *GV
);
1521 void GlobalVariable::getDebugInfo(
1522 SmallVectorImpl
<DIGlobalVariableExpression
*> &GVs
) const {
1523 SmallVector
<MDNode
*, 1> MDs
;
1524 getMetadata(LLVMContext::MD_dbg
, MDs
);
1525 for (MDNode
*MD
: MDs
)
1526 GVs
.push_back(cast
<DIGlobalVariableExpression
>(MD
));