|  | //===- Metadata.cpp - Implement Metadata classes --------------------------===// | 
|  | // | 
|  | //                     The LLVM Compiler Infrastructure | 
|  | // | 
|  | // This file is distributed under the University of Illinois Open Source | 
|  | // License. See LICENSE.TXT for details. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  | // | 
|  | // This file implements the Metadata classes. | 
|  | // | 
|  | //===----------------------------------------------------------------------===// | 
|  |  | 
|  | #include "LLVMContextImpl.h" | 
|  | #include "MetadataImpl.h" | 
|  | #include "SymbolTableListTraitsImpl.h" | 
|  | #include "llvm/ADT/APFloat.h" | 
|  | #include "llvm/ADT/APInt.h" | 
|  | #include "llvm/ADT/ArrayRef.h" | 
|  | #include "llvm/ADT/DenseSet.h" | 
|  | #include "llvm/ADT/None.h" | 
|  | #include "llvm/ADT/STLExtras.h" | 
|  | #include "llvm/ADT/SetVector.h" | 
|  | #include "llvm/ADT/SmallPtrSet.h" | 
|  | #include "llvm/ADT/SmallSet.h" | 
|  | #include "llvm/ADT/SmallVector.h" | 
|  | #include "llvm/ADT/StringMap.h" | 
|  | #include "llvm/ADT/StringRef.h" | 
|  | #include "llvm/ADT/Twine.h" | 
|  | #include "llvm/IR/Argument.h" | 
|  | #include "llvm/IR/BasicBlock.h" | 
|  | #include "llvm/IR/Constant.h" | 
|  | #include "llvm/IR/ConstantRange.h" | 
|  | #include "llvm/IR/Constants.h" | 
|  | #include "llvm/IR/DebugInfoMetadata.h" | 
|  | #include "llvm/IR/DebugLoc.h" | 
|  | #include "llvm/IR/Function.h" | 
|  | #include "llvm/IR/GlobalObject.h" | 
|  | #include "llvm/IR/GlobalVariable.h" | 
|  | #include "llvm/IR/Instruction.h" | 
|  | #include "llvm/IR/LLVMContext.h" | 
|  | #include "llvm/IR/Metadata.h" | 
|  | #include "llvm/IR/Module.h" | 
|  | #include "llvm/IR/TrackingMDRef.h" | 
|  | #include "llvm/IR/Type.h" | 
|  | #include "llvm/IR/Value.h" | 
|  | #include "llvm/IR/ValueHandle.h" | 
|  | #include "llvm/Support/Casting.h" | 
|  | #include "llvm/Support/ErrorHandling.h" | 
|  | #include "llvm/Support/MathExtras.h" | 
|  | #include <algorithm> | 
|  | #include <cassert> | 
|  | #include <cstddef> | 
|  | #include <cstdint> | 
|  | #include <iterator> | 
|  | #include <tuple> | 
|  | #include <type_traits> | 
|  | #include <utility> | 
|  | #include <vector> | 
|  |  | 
|  | using namespace llvm; | 
|  |  | 
|  | MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD) | 
|  | : Value(Ty, MetadataAsValueVal), MD(MD) { | 
|  | track(); | 
|  | } | 
|  |  | 
|  | MetadataAsValue::~MetadataAsValue() { | 
|  | getType()->getContext().pImpl->MetadataAsValues.erase(MD); | 
|  | untrack(); | 
|  | } | 
|  |  | 
|  | /// Canonicalize metadata arguments to intrinsics. | 
|  | /// | 
|  | /// To support bitcode upgrades (and assembly semantic sugar) for \a | 
|  | /// MetadataAsValue, we need to canonicalize certain metadata. | 
|  | /// | 
|  | ///   - nullptr is replaced by an empty MDNode. | 
|  | ///   - An MDNode with a single null operand is replaced by an empty MDNode. | 
|  | ///   - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped. | 
|  | /// | 
|  | /// This maintains readability of bitcode from when metadata was a type of | 
|  | /// value, and these bridges were unnecessary. | 
|  | static Metadata *canonicalizeMetadataForValue(LLVMContext &Context, | 
|  | Metadata *MD) { | 
|  | if (!MD) | 
|  | // !{} | 
|  | return MDNode::get(Context, None); | 
|  |  | 
|  | // Return early if this isn't a single-operand MDNode. | 
|  | auto *N = dyn_cast<MDNode>(MD); | 
|  | if (!N || N->getNumOperands() != 1) | 
|  | return MD; | 
|  |  | 
|  | if (!N->getOperand(0)) | 
|  | // !{} | 
|  | return MDNode::get(Context, None); | 
|  |  | 
|  | if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0))) | 
|  | // Look through the MDNode. | 
|  | return C; | 
|  |  | 
|  | return MD; | 
|  | } | 
|  |  | 
|  | MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) { | 
|  | MD = canonicalizeMetadataForValue(Context, MD); | 
|  | auto *&Entry = Context.pImpl->MetadataAsValues[MD]; | 
|  | if (!Entry) | 
|  | Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD); | 
|  | return Entry; | 
|  | } | 
|  |  | 
|  | MetadataAsValue *MetadataAsValue::getIfExists(LLVMContext &Context, | 
|  | Metadata *MD) { | 
|  | MD = canonicalizeMetadataForValue(Context, MD); | 
|  | auto &Store = Context.pImpl->MetadataAsValues; | 
|  | return Store.lookup(MD); | 
|  | } | 
|  |  | 
|  | void MetadataAsValue::handleChangedMetadata(Metadata *MD) { | 
|  | LLVMContext &Context = getContext(); | 
|  | MD = canonicalizeMetadataForValue(Context, MD); | 
|  | auto &Store = Context.pImpl->MetadataAsValues; | 
|  |  | 
|  | // Stop tracking the old metadata. | 
|  | Store.erase(this->MD); | 
|  | untrack(); | 
|  | this->MD = nullptr; | 
|  |  | 
|  | // Start tracking MD, or RAUW if necessary. | 
|  | auto *&Entry = Store[MD]; | 
|  | if (Entry) { | 
|  | replaceAllUsesWith(Entry); | 
|  | delete this; | 
|  | return; | 
|  | } | 
|  |  | 
|  | this->MD = MD; | 
|  | track(); | 
|  | Entry = this; | 
|  | } | 
|  |  | 
|  | void MetadataAsValue::track() { | 
|  | if (MD) | 
|  | MetadataTracking::track(&MD, *MD, *this); | 
|  | } | 
|  |  | 
|  | void MetadataAsValue::untrack() { | 
|  | if (MD) | 
|  | MetadataTracking::untrack(MD); | 
|  | } | 
|  |  | 
|  | bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) { | 
|  | assert(Ref && "Expected live reference"); | 
|  | assert((Owner || *static_cast<Metadata **>(Ref) == &MD) && | 
|  | "Reference without owner must be direct"); | 
|  | if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) { | 
|  | R->addRef(Ref, Owner); | 
|  | return true; | 
|  | } | 
|  | if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) { | 
|  | assert(!PH->Use && "Placeholders can only be used once"); | 
|  | assert(!Owner && "Unexpected callback to owner"); | 
|  | PH->Use = static_cast<Metadata **>(Ref); | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | void MetadataTracking::untrack(void *Ref, Metadata &MD) { | 
|  | assert(Ref && "Expected live reference"); | 
|  | if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) | 
|  | R->dropRef(Ref); | 
|  | else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) | 
|  | PH->Use = nullptr; | 
|  | } | 
|  |  | 
|  | bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) { | 
|  | assert(Ref && "Expected live reference"); | 
|  | assert(New && "Expected live reference"); | 
|  | assert(Ref != New && "Expected change"); | 
|  | if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) { | 
|  | R->moveRef(Ref, New, MD); | 
|  | return true; | 
|  | } | 
|  | assert(!isa<DistinctMDOperandPlaceholder>(MD) && | 
|  | "Unexpected move of an MDOperand"); | 
|  | assert(!isReplaceable(MD) && | 
|  | "Expected un-replaceable metadata, since we didn't move a reference"); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | bool MetadataTracking::isReplaceable(const Metadata &MD) { | 
|  | return ReplaceableMetadataImpl::isReplaceable(MD); | 
|  | } | 
|  |  | 
|  | void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) { | 
|  | bool WasInserted = | 
|  | UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex))) | 
|  | .second; | 
|  | (void)WasInserted; | 
|  | assert(WasInserted && "Expected to add a reference"); | 
|  |  | 
|  | ++NextIndex; | 
|  | assert(NextIndex != 0 && "Unexpected overflow"); | 
|  | } | 
|  |  | 
|  | void ReplaceableMetadataImpl::dropRef(void *Ref) { | 
|  | bool WasErased = UseMap.erase(Ref); | 
|  | (void)WasErased; | 
|  | assert(WasErased && "Expected to drop a reference"); | 
|  | } | 
|  |  | 
|  | void ReplaceableMetadataImpl::moveRef(void *Ref, void *New, | 
|  | const Metadata &MD) { | 
|  | auto I = UseMap.find(Ref); | 
|  | assert(I != UseMap.end() && "Expected to move a reference"); | 
|  | auto OwnerAndIndex = I->second; | 
|  | UseMap.erase(I); | 
|  | bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second; | 
|  | (void)WasInserted; | 
|  | assert(WasInserted && "Expected to add a reference"); | 
|  |  | 
|  | // Check that the references are direct if there's no owner. | 
|  | (void)MD; | 
|  | assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) && | 
|  | "Reference without owner must be direct"); | 
|  | assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) && | 
|  | "Reference without owner must be direct"); | 
|  | } | 
|  |  | 
|  | void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) { | 
|  | if (UseMap.empty()) | 
|  | return; | 
|  |  | 
|  | // Copy out uses since UseMap will get touched below. | 
|  | using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>; | 
|  | SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end()); | 
|  | llvm::sort(Uses.begin(), Uses.end(), [](const UseTy &L, const UseTy &R) { | 
|  | return L.second.second < R.second.second; | 
|  | }); | 
|  | for (const auto &Pair : Uses) { | 
|  | // Check that this Ref hasn't disappeared after RAUW (when updating a | 
|  | // previous Ref). | 
|  | if (!UseMap.count(Pair.first)) | 
|  | continue; | 
|  |  | 
|  | OwnerTy Owner = Pair.second.first; | 
|  | if (!Owner) { | 
|  | // Update unowned tracking references directly. | 
|  | Metadata *&Ref = *static_cast<Metadata **>(Pair.first); | 
|  | Ref = MD; | 
|  | if (MD) | 
|  | MetadataTracking::track(Ref); | 
|  | UseMap.erase(Pair.first); | 
|  | continue; | 
|  | } | 
|  |  | 
|  | // Check for MetadataAsValue. | 
|  | if (Owner.is<MetadataAsValue *>()) { | 
|  | Owner.get<MetadataAsValue *>()->handleChangedMetadata(MD); | 
|  | continue; | 
|  | } | 
|  |  | 
|  | // There's a Metadata owner -- dispatch. | 
|  | Metadata *OwnerMD = Owner.get<Metadata *>(); | 
|  | switch (OwnerMD->getMetadataID()) { | 
|  | #define HANDLE_METADATA_LEAF(CLASS)                                            \ | 
|  | case Metadata::CLASS##Kind:                                                  \ | 
|  | cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD);                \ | 
|  | continue; | 
|  | #include "llvm/IR/Metadata.def" | 
|  | default: | 
|  | llvm_unreachable("Invalid metadata subclass"); | 
|  | } | 
|  | } | 
|  | assert(UseMap.empty() && "Expected all uses to be replaced"); | 
|  | } | 
|  |  | 
|  | void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) { | 
|  | if (UseMap.empty()) | 
|  | return; | 
|  |  | 
|  | if (!ResolveUsers) { | 
|  | UseMap.clear(); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Copy out uses since UseMap could get touched below. | 
|  | using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>; | 
|  | SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end()); | 
|  | llvm::sort(Uses.begin(), Uses.end(), [](const UseTy &L, const UseTy &R) { | 
|  | return L.second.second < R.second.second; | 
|  | }); | 
|  | UseMap.clear(); | 
|  | for (const auto &Pair : Uses) { | 
|  | auto Owner = Pair.second.first; | 
|  | if (!Owner) | 
|  | continue; | 
|  | if (Owner.is<MetadataAsValue *>()) | 
|  | continue; | 
|  |  | 
|  | // Resolve MDNodes that point at this. | 
|  | auto *OwnerMD = dyn_cast<MDNode>(Owner.get<Metadata *>()); | 
|  | if (!OwnerMD) | 
|  | continue; | 
|  | if (OwnerMD->isResolved()) | 
|  | continue; | 
|  | OwnerMD->decrementUnresolvedOperandCount(); | 
|  | } | 
|  | } | 
|  |  | 
|  | ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) { | 
|  | if (auto *N = dyn_cast<MDNode>(&MD)) | 
|  | return N->isResolved() ? nullptr : N->Context.getOrCreateReplaceableUses(); | 
|  | return dyn_cast<ValueAsMetadata>(&MD); | 
|  | } | 
|  |  | 
|  | ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) { | 
|  | if (auto *N = dyn_cast<MDNode>(&MD)) | 
|  | return N->isResolved() ? nullptr : N->Context.getReplaceableUses(); | 
|  | return dyn_cast<ValueAsMetadata>(&MD); | 
|  | } | 
|  |  | 
|  | bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) { | 
|  | if (auto *N = dyn_cast<MDNode>(&MD)) | 
|  | return !N->isResolved(); | 
|  | return dyn_cast<ValueAsMetadata>(&MD); | 
|  | } | 
|  |  | 
|  | static DISubprogram *getLocalFunctionMetadata(Value *V) { | 
|  | assert(V && "Expected value"); | 
|  | if (auto *A = dyn_cast<Argument>(V)) { | 
|  | if (auto *Fn = A->getParent()) | 
|  | return Fn->getSubprogram(); | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | if (BasicBlock *BB = cast<Instruction>(V)->getParent()) { | 
|  | if (auto *Fn = BB->getParent()) | 
|  | return Fn->getSubprogram(); | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | ValueAsMetadata *ValueAsMetadata::get(Value *V) { | 
|  | assert(V && "Unexpected null Value"); | 
|  |  | 
|  | auto &Context = V->getContext(); | 
|  | auto *&Entry = Context.pImpl->ValuesAsMetadata[V]; | 
|  | if (!Entry) { | 
|  | assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) && | 
|  | "Expected constant or function-local value"); | 
|  | assert(!V->IsUsedByMD && "Expected this to be the only metadata use"); | 
|  | V->IsUsedByMD = true; | 
|  | if (auto *C = dyn_cast<Constant>(V)) | 
|  | Entry = new ConstantAsMetadata(C); | 
|  | else | 
|  | Entry = new LocalAsMetadata(V); | 
|  | } | 
|  |  | 
|  | return Entry; | 
|  | } | 
|  |  | 
|  | ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) { | 
|  | assert(V && "Unexpected null Value"); | 
|  | return V->getContext().pImpl->ValuesAsMetadata.lookup(V); | 
|  | } | 
|  |  | 
|  | void ValueAsMetadata::handleDeletion(Value *V) { | 
|  | assert(V && "Expected valid value"); | 
|  |  | 
|  | auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata; | 
|  | auto I = Store.find(V); | 
|  | if (I == Store.end()) | 
|  | return; | 
|  |  | 
|  | // Remove old entry from the map. | 
|  | ValueAsMetadata *MD = I->second; | 
|  | assert(MD && "Expected valid metadata"); | 
|  | assert(MD->getValue() == V && "Expected valid mapping"); | 
|  | Store.erase(I); | 
|  |  | 
|  | // Delete the metadata. | 
|  | MD->replaceAllUsesWith(nullptr); | 
|  | delete MD; | 
|  | } | 
|  |  | 
|  | void ValueAsMetadata::handleRAUW(Value *From, Value *To) { | 
|  | assert(From && "Expected valid value"); | 
|  | assert(To && "Expected valid value"); | 
|  | assert(From != To && "Expected changed value"); | 
|  | assert(From->getType() == To->getType() && "Unexpected type change"); | 
|  |  | 
|  | LLVMContext &Context = From->getType()->getContext(); | 
|  | auto &Store = Context.pImpl->ValuesAsMetadata; | 
|  | auto I = Store.find(From); | 
|  | if (I == Store.end()) { | 
|  | assert(!From->IsUsedByMD && "Expected From not to be used by metadata"); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Remove old entry from the map. | 
|  | assert(From->IsUsedByMD && "Expected From to be used by metadata"); | 
|  | From->IsUsedByMD = false; | 
|  | ValueAsMetadata *MD = I->second; | 
|  | assert(MD && "Expected valid metadata"); | 
|  | assert(MD->getValue() == From && "Expected valid mapping"); | 
|  | Store.erase(I); | 
|  |  | 
|  | if (isa<LocalAsMetadata>(MD)) { | 
|  | if (auto *C = dyn_cast<Constant>(To)) { | 
|  | // Local became a constant. | 
|  | MD->replaceAllUsesWith(ConstantAsMetadata::get(C)); | 
|  | delete MD; | 
|  | return; | 
|  | } | 
|  | if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) && | 
|  | getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) { | 
|  | // DISubprogram changed. | 
|  | MD->replaceAllUsesWith(nullptr); | 
|  | delete MD; | 
|  | return; | 
|  | } | 
|  | } else if (!isa<Constant>(To)) { | 
|  | // Changed to function-local value. | 
|  | MD->replaceAllUsesWith(nullptr); | 
|  | delete MD; | 
|  | return; | 
|  | } | 
|  |  | 
|  | auto *&Entry = Store[To]; | 
|  | if (Entry) { | 
|  | // The target already exists. | 
|  | MD->replaceAllUsesWith(Entry); | 
|  | delete MD; | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Update MD in place (and update the map entry). | 
|  | assert(!To->IsUsedByMD && "Expected this to be the only metadata use"); | 
|  | To->IsUsedByMD = true; | 
|  | MD->V = To; | 
|  | Entry = MD; | 
|  | } | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // MDString implementation. | 
|  | // | 
|  |  | 
|  | MDString *MDString::get(LLVMContext &Context, StringRef Str) { | 
|  | auto &Store = Context.pImpl->MDStringCache; | 
|  | auto I = Store.try_emplace(Str); | 
|  | auto &MapEntry = I.first->getValue(); | 
|  | if (!I.second) | 
|  | return &MapEntry; | 
|  | MapEntry.Entry = &*I.first; | 
|  | return &MapEntry; | 
|  | } | 
|  |  | 
|  | StringRef MDString::getString() const { | 
|  | assert(Entry && "Expected to find string map entry"); | 
|  | return Entry->first(); | 
|  | } | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // MDNode implementation. | 
|  | // | 
|  |  | 
|  | // Assert that the MDNode types will not be unaligned by the objects | 
|  | // prepended to them. | 
|  | #define HANDLE_MDNODE_LEAF(CLASS)                                              \ | 
|  | static_assert(                                                               \ | 
|  | alignof(uint64_t) >= alignof(CLASS),                                     \ | 
|  | "Alignment is insufficient after objects prepended to " #CLASS); | 
|  | #include "llvm/IR/Metadata.def" | 
|  |  | 
|  | void *MDNode::operator new(size_t Size, unsigned NumOps) { | 
|  | size_t OpSize = NumOps * sizeof(MDOperand); | 
|  | // uint64_t is the most aligned type we need support (ensured by static_assert | 
|  | // above) | 
|  | OpSize = alignTo(OpSize, alignof(uint64_t)); | 
|  | void *Ptr = reinterpret_cast<char *>(::operator new(OpSize + Size)) + OpSize; | 
|  | MDOperand *O = static_cast<MDOperand *>(Ptr); | 
|  | for (MDOperand *E = O - NumOps; O != E; --O) | 
|  | (void)new (O - 1) MDOperand; | 
|  | return Ptr; | 
|  | } | 
|  |  | 
|  | void MDNode::operator delete(void *Mem) { | 
|  | MDNode *N = static_cast<MDNode *>(Mem); | 
|  | size_t OpSize = N->NumOperands * sizeof(MDOperand); | 
|  | OpSize = alignTo(OpSize, alignof(uint64_t)); | 
|  |  | 
|  | MDOperand *O = static_cast<MDOperand *>(Mem); | 
|  | for (MDOperand *E = O - N->NumOperands; O != E; --O) | 
|  | (O - 1)->~MDOperand(); | 
|  | ::operator delete(reinterpret_cast<char *>(Mem) - OpSize); | 
|  | } | 
|  |  | 
|  | MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, | 
|  | ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2) | 
|  | : Metadata(ID, Storage), NumOperands(Ops1.size() + Ops2.size()), | 
|  | NumUnresolved(0), Context(Context) { | 
|  | unsigned Op = 0; | 
|  | for (Metadata *MD : Ops1) | 
|  | setOperand(Op++, MD); | 
|  | for (Metadata *MD : Ops2) | 
|  | setOperand(Op++, MD); | 
|  |  | 
|  | if (!isUniqued()) | 
|  | return; | 
|  |  | 
|  | // Count the unresolved operands.  If there are any, RAUW support will be | 
|  | // added lazily on first reference. | 
|  | countUnresolvedOperands(); | 
|  | } | 
|  |  | 
|  | TempMDNode MDNode::clone() const { | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | llvm_unreachable("Invalid MDNode subclass"); | 
|  | #define HANDLE_MDNODE_LEAF(CLASS)                                              \ | 
|  | case CLASS##Kind:                                                            \ | 
|  | return cast<CLASS>(this)->cloneImpl(); | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  | } | 
|  |  | 
|  | static bool isOperandUnresolved(Metadata *Op) { | 
|  | if (auto *N = dyn_cast_or_null<MDNode>(Op)) | 
|  | return !N->isResolved(); | 
|  | return false; | 
|  | } | 
|  |  | 
|  | void MDNode::countUnresolvedOperands() { | 
|  | assert(NumUnresolved == 0 && "Expected unresolved ops to be uncounted"); | 
|  | assert(isUniqued() && "Expected this to be uniqued"); | 
|  | NumUnresolved = count_if(operands(), isOperandUnresolved); | 
|  | } | 
|  |  | 
|  | void MDNode::makeUniqued() { | 
|  | assert(isTemporary() && "Expected this to be temporary"); | 
|  | assert(!isResolved() && "Expected this to be unresolved"); | 
|  |  | 
|  | // Enable uniquing callbacks. | 
|  | for (auto &Op : mutable_operands()) | 
|  | Op.reset(Op.get(), this); | 
|  |  | 
|  | // Make this 'uniqued'. | 
|  | Storage = Uniqued; | 
|  | countUnresolvedOperands(); | 
|  | if (!NumUnresolved) { | 
|  | dropReplaceableUses(); | 
|  | assert(isResolved() && "Expected this to be resolved"); | 
|  | } | 
|  |  | 
|  | assert(isUniqued() && "Expected this to be uniqued"); | 
|  | } | 
|  |  | 
|  | void MDNode::makeDistinct() { | 
|  | assert(isTemporary() && "Expected this to be temporary"); | 
|  | assert(!isResolved() && "Expected this to be unresolved"); | 
|  |  | 
|  | // Drop RAUW support and store as a distinct node. | 
|  | dropReplaceableUses(); | 
|  | storeDistinctInContext(); | 
|  |  | 
|  | assert(isDistinct() && "Expected this to be distinct"); | 
|  | assert(isResolved() && "Expected this to be resolved"); | 
|  | } | 
|  |  | 
|  | void MDNode::resolve() { | 
|  | assert(isUniqued() && "Expected this to be uniqued"); | 
|  | assert(!isResolved() && "Expected this to be unresolved"); | 
|  |  | 
|  | NumUnresolved = 0; | 
|  | dropReplaceableUses(); | 
|  |  | 
|  | assert(isResolved() && "Expected this to be resolved"); | 
|  | } | 
|  |  | 
|  | void MDNode::dropReplaceableUses() { | 
|  | assert(!NumUnresolved && "Unexpected unresolved operand"); | 
|  |  | 
|  | // Drop any RAUW support. | 
|  | if (Context.hasReplaceableUses()) | 
|  | Context.takeReplaceableUses()->resolveAllUses(); | 
|  | } | 
|  |  | 
|  | void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) { | 
|  | assert(isUniqued() && "Expected this to be uniqued"); | 
|  | assert(NumUnresolved != 0 && "Expected unresolved operands"); | 
|  |  | 
|  | // Check if an operand was resolved. | 
|  | if (!isOperandUnresolved(Old)) { | 
|  | if (isOperandUnresolved(New)) | 
|  | // An operand was un-resolved! | 
|  | ++NumUnresolved; | 
|  | } else if (!isOperandUnresolved(New)) | 
|  | decrementUnresolvedOperandCount(); | 
|  | } | 
|  |  | 
|  | void MDNode::decrementUnresolvedOperandCount() { | 
|  | assert(!isResolved() && "Expected this to be unresolved"); | 
|  | if (isTemporary()) | 
|  | return; | 
|  |  | 
|  | assert(isUniqued() && "Expected this to be uniqued"); | 
|  | if (--NumUnresolved) | 
|  | return; | 
|  |  | 
|  | // Last unresolved operand has just been resolved. | 
|  | dropReplaceableUses(); | 
|  | assert(isResolved() && "Expected this to become resolved"); | 
|  | } | 
|  |  | 
|  | void MDNode::resolveCycles() { | 
|  | if (isResolved()) | 
|  | return; | 
|  |  | 
|  | // Resolve this node immediately. | 
|  | resolve(); | 
|  |  | 
|  | // Resolve all operands. | 
|  | for (const auto &Op : operands()) { | 
|  | auto *N = dyn_cast_or_null<MDNode>(Op); | 
|  | if (!N) | 
|  | continue; | 
|  |  | 
|  | assert(!N->isTemporary() && | 
|  | "Expected all forward declarations to be resolved"); | 
|  | if (!N->isResolved()) | 
|  | N->resolveCycles(); | 
|  | } | 
|  | } | 
|  |  | 
|  | static bool hasSelfReference(MDNode *N) { | 
|  | for (Metadata *MD : N->operands()) | 
|  | if (MD == N) | 
|  | return true; | 
|  | return false; | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::replaceWithPermanentImpl() { | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | // If this type isn't uniquable, replace with a distinct node. | 
|  | return replaceWithDistinctImpl(); | 
|  |  | 
|  | #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \ | 
|  | case CLASS##Kind:                                                            \ | 
|  | break; | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  |  | 
|  | // Even if this type is uniquable, self-references have to be distinct. | 
|  | if (hasSelfReference(this)) | 
|  | return replaceWithDistinctImpl(); | 
|  | return replaceWithUniquedImpl(); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::replaceWithUniquedImpl() { | 
|  | // Try to uniquify in place. | 
|  | MDNode *UniquedNode = uniquify(); | 
|  |  | 
|  | if (UniquedNode == this) { | 
|  | makeUniqued(); | 
|  | return this; | 
|  | } | 
|  |  | 
|  | // Collision, so RAUW instead. | 
|  | replaceAllUsesWith(UniquedNode); | 
|  | deleteAsSubclass(); | 
|  | return UniquedNode; | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::replaceWithDistinctImpl() { | 
|  | makeDistinct(); | 
|  | return this; | 
|  | } | 
|  |  | 
|  | void MDTuple::recalculateHash() { | 
|  | setHash(MDTupleInfo::KeyTy::calculateHash(this)); | 
|  | } | 
|  |  | 
|  | void MDNode::dropAllReferences() { | 
|  | for (unsigned I = 0, E = NumOperands; I != E; ++I) | 
|  | setOperand(I, nullptr); | 
|  | if (Context.hasReplaceableUses()) { | 
|  | Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false); | 
|  | (void)Context.takeReplaceableUses(); | 
|  | } | 
|  | } | 
|  |  | 
|  | void MDNode::handleChangedOperand(void *Ref, Metadata *New) { | 
|  | unsigned Op = static_cast<MDOperand *>(Ref) - op_begin(); | 
|  | assert(Op < getNumOperands() && "Expected valid operand"); | 
|  |  | 
|  | if (!isUniqued()) { | 
|  | // This node is not uniqued.  Just set the operand and be done with it. | 
|  | setOperand(Op, New); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // This node is uniqued. | 
|  | eraseFromStore(); | 
|  |  | 
|  | Metadata *Old = getOperand(Op); | 
|  | setOperand(Op, New); | 
|  |  | 
|  | // Drop uniquing for self-reference cycles and deleted constants. | 
|  | if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) { | 
|  | if (!isResolved()) | 
|  | resolve(); | 
|  | storeDistinctInContext(); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Re-unique the node. | 
|  | auto *Uniqued = uniquify(); | 
|  | if (Uniqued == this) { | 
|  | if (!isResolved()) | 
|  | resolveAfterOperandChange(Old, New); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Collision. | 
|  | if (!isResolved()) { | 
|  | // Still unresolved, so RAUW. | 
|  | // | 
|  | // First, clear out all operands to prevent any recursion (similar to | 
|  | // dropAllReferences(), but we still need the use-list). | 
|  | for (unsigned O = 0, E = getNumOperands(); O != E; ++O) | 
|  | setOperand(O, nullptr); | 
|  | if (Context.hasReplaceableUses()) | 
|  | Context.getReplaceableUses()->replaceAllUsesWith(Uniqued); | 
|  | deleteAsSubclass(); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Store in non-uniqued form if RAUW isn't possible. | 
|  | storeDistinctInContext(); | 
|  | } | 
|  |  | 
|  | void MDNode::deleteAsSubclass() { | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | llvm_unreachable("Invalid subclass of MDNode"); | 
|  | #define HANDLE_MDNODE_LEAF(CLASS)                                              \ | 
|  | case CLASS##Kind:                                                            \ | 
|  | delete cast<CLASS>(this);                                                  \ | 
|  | break; | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  | } | 
|  |  | 
|  | template <class T, class InfoT> | 
|  | static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) { | 
|  | if (T *U = getUniqued(Store, N)) | 
|  | return U; | 
|  |  | 
|  | Store.insert(N); | 
|  | return N; | 
|  | } | 
|  |  | 
|  | template <class NodeTy> struct MDNode::HasCachedHash { | 
|  | using Yes = char[1]; | 
|  | using No = char[2]; | 
|  | template <class U, U Val> struct SFINAE {}; | 
|  |  | 
|  | template <class U> | 
|  | static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *); | 
|  | template <class U> static No &check(...); | 
|  |  | 
|  | static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes); | 
|  | }; | 
|  |  | 
|  | MDNode *MDNode::uniquify() { | 
|  | assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node"); | 
|  |  | 
|  | // Try to insert into uniquing store. | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | llvm_unreachable("Invalid or non-uniquable subclass of MDNode"); | 
|  | #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \ | 
|  | case CLASS##Kind: {                                                          \ | 
|  | CLASS *SubclassThis = cast<CLASS>(this);                                   \ | 
|  | std::integral_constant<bool, HasCachedHash<CLASS>::value>                  \ | 
|  | ShouldRecalculateHash;                                                 \ | 
|  | dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash);              \ | 
|  | return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s);           \ | 
|  | } | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  | } | 
|  |  | 
|  | void MDNode::eraseFromStore() { | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | llvm_unreachable("Invalid or non-uniquable subclass of MDNode"); | 
|  | #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \ | 
|  | case CLASS##Kind:                                                            \ | 
|  | getContext().pImpl->CLASS##s.erase(cast<CLASS>(this));                     \ | 
|  | break; | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  | } | 
|  |  | 
|  | MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs, | 
|  | StorageType Storage, bool ShouldCreate) { | 
|  | unsigned Hash = 0; | 
|  | if (Storage == Uniqued) { | 
|  | MDTupleInfo::KeyTy Key(MDs); | 
|  | if (auto *N = getUniqued(Context.pImpl->MDTuples, Key)) | 
|  | return N; | 
|  | if (!ShouldCreate) | 
|  | return nullptr; | 
|  | Hash = Key.getHash(); | 
|  | } else { | 
|  | assert(ShouldCreate && "Expected non-uniqued nodes to always be created"); | 
|  | } | 
|  |  | 
|  | return storeImpl(new (MDs.size()) MDTuple(Context, Storage, Hash, MDs), | 
|  | Storage, Context.pImpl->MDTuples); | 
|  | } | 
|  |  | 
|  | void MDNode::deleteTemporary(MDNode *N) { | 
|  | assert(N->isTemporary() && "Expected temporary node"); | 
|  | N->replaceAllUsesWith(nullptr); | 
|  | N->deleteAsSubclass(); | 
|  | } | 
|  |  | 
|  | void MDNode::storeDistinctInContext() { | 
|  | assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses"); | 
|  | assert(!NumUnresolved && "Unexpected unresolved nodes"); | 
|  | Storage = Distinct; | 
|  | assert(isResolved() && "Expected this to be resolved"); | 
|  |  | 
|  | // Reset the hash. | 
|  | switch (getMetadataID()) { | 
|  | default: | 
|  | llvm_unreachable("Invalid subclass of MDNode"); | 
|  | #define HANDLE_MDNODE_LEAF(CLASS)                                              \ | 
|  | case CLASS##Kind: {                                                          \ | 
|  | std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \ | 
|  | dispatchResetHash(cast<CLASS>(this), ShouldResetHash);                     \ | 
|  | break;                                                                     \ | 
|  | } | 
|  | #include "llvm/IR/Metadata.def" | 
|  | } | 
|  |  | 
|  | getContext().pImpl->DistinctMDNodes.push_back(this); | 
|  | } | 
|  |  | 
|  | void MDNode::replaceOperandWith(unsigned I, Metadata *New) { | 
|  | if (getOperand(I) == New) | 
|  | return; | 
|  |  | 
|  | if (!isUniqued()) { | 
|  | setOperand(I, New); | 
|  | return; | 
|  | } | 
|  |  | 
|  | handleChangedOperand(mutable_begin() + I, New); | 
|  | } | 
|  |  | 
|  | void MDNode::setOperand(unsigned I, Metadata *New) { | 
|  | assert(I < NumOperands); | 
|  | mutable_begin()[I].reset(New, isUniqued() ? this : nullptr); | 
|  | } | 
|  |  | 
|  | /// Get a node or a self-reference that looks like it. | 
|  | /// | 
|  | /// Special handling for finding self-references, for use by \a | 
|  | /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from | 
|  | /// when self-referencing nodes were still uniqued.  If the first operand has | 
|  | /// the same operands as \c Ops, return the first operand instead. | 
|  | static MDNode *getOrSelfReference(LLVMContext &Context, | 
|  | ArrayRef<Metadata *> Ops) { | 
|  | if (!Ops.empty()) | 
|  | if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0])) | 
|  | if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) { | 
|  | for (unsigned I = 1, E = Ops.size(); I != E; ++I) | 
|  | if (Ops[I] != N->getOperand(I)) | 
|  | return MDNode::get(Context, Ops); | 
|  | return N; | 
|  | } | 
|  |  | 
|  | return MDNode::get(Context, Ops); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::concatenate(MDNode *A, MDNode *B) { | 
|  | if (!A) | 
|  | return B; | 
|  | if (!B) | 
|  | return A; | 
|  |  | 
|  | SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end()); | 
|  | MDs.insert(B->op_begin(), B->op_end()); | 
|  |  | 
|  | // FIXME: This preserves long-standing behaviour, but is it really the right | 
|  | // behaviour?  Or was that an unintended side-effect of node uniquing? | 
|  | return getOrSelfReference(A->getContext(), MDs.getArrayRef()); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::intersect(MDNode *A, MDNode *B) { | 
|  | if (!A || !B) | 
|  | return nullptr; | 
|  |  | 
|  | SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end()); | 
|  | SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end()); | 
|  | MDs.remove_if([&](Metadata *MD) { return !is_contained(BSet, MD); }); | 
|  |  | 
|  | // FIXME: This preserves long-standing behaviour, but is it really the right | 
|  | // behaviour?  Or was that an unintended side-effect of node uniquing? | 
|  | return getOrSelfReference(A->getContext(), MDs.getArrayRef()); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) { | 
|  | if (!A || !B) | 
|  | return nullptr; | 
|  |  | 
|  | return concatenate(A, B); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) { | 
|  | if (!A || !B) | 
|  | return nullptr; | 
|  |  | 
|  | APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF(); | 
|  | APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF(); | 
|  | if (AVal.compare(BVal) == APFloat::cmpLessThan) | 
|  | return A; | 
|  | return B; | 
|  | } | 
|  |  | 
|  | static bool isContiguous(const ConstantRange &A, const ConstantRange &B) { | 
|  | return A.getUpper() == B.getLower() || A.getLower() == B.getUpper(); | 
|  | } | 
|  |  | 
|  | static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) { | 
|  | return !A.intersectWith(B).isEmptySet() || isContiguous(A, B); | 
|  | } | 
|  |  | 
|  | static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints, | 
|  | ConstantInt *Low, ConstantInt *High) { | 
|  | ConstantRange NewRange(Low->getValue(), High->getValue()); | 
|  | unsigned Size = EndPoints.size(); | 
|  | APInt LB = EndPoints[Size - 2]->getValue(); | 
|  | APInt LE = EndPoints[Size - 1]->getValue(); | 
|  | ConstantRange LastRange(LB, LE); | 
|  | if (canBeMerged(NewRange, LastRange)) { | 
|  | ConstantRange Union = LastRange.unionWith(NewRange); | 
|  | Type *Ty = High->getType(); | 
|  | EndPoints[Size - 2] = | 
|  | cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower())); | 
|  | EndPoints[Size - 1] = | 
|  | cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper())); | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints, | 
|  | ConstantInt *Low, ConstantInt *High) { | 
|  | if (!EndPoints.empty()) | 
|  | if (tryMergeRange(EndPoints, Low, High)) | 
|  | return; | 
|  |  | 
|  | EndPoints.push_back(Low); | 
|  | EndPoints.push_back(High); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) { | 
|  | // Given two ranges, we want to compute the union of the ranges. This | 
|  | // is slightly complicated by having to combine the intervals and merge | 
|  | // the ones that overlap. | 
|  |  | 
|  | if (!A || !B) | 
|  | return nullptr; | 
|  |  | 
|  | if (A == B) | 
|  | return A; | 
|  |  | 
|  | // First, walk both lists in order of the lower boundary of each interval. | 
|  | // At each step, try to merge the new interval to the last one we adedd. | 
|  | SmallVector<ConstantInt *, 4> EndPoints; | 
|  | int AI = 0; | 
|  | int BI = 0; | 
|  | int AN = A->getNumOperands() / 2; | 
|  | int BN = B->getNumOperands() / 2; | 
|  | while (AI < AN && BI < BN) { | 
|  | ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI)); | 
|  | ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI)); | 
|  |  | 
|  | if (ALow->getValue().slt(BLow->getValue())) { | 
|  | addRange(EndPoints, ALow, | 
|  | mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1))); | 
|  | ++AI; | 
|  | } else { | 
|  | addRange(EndPoints, BLow, | 
|  | mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1))); | 
|  | ++BI; | 
|  | } | 
|  | } | 
|  | while (AI < AN) { | 
|  | addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)), | 
|  | mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1))); | 
|  | ++AI; | 
|  | } | 
|  | while (BI < BN) { | 
|  | addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)), | 
|  | mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1))); | 
|  | ++BI; | 
|  | } | 
|  |  | 
|  | // If we have more than 2 ranges (4 endpoints) we have to try to merge | 
|  | // the last and first ones. | 
|  | unsigned Size = EndPoints.size(); | 
|  | if (Size > 4) { | 
|  | ConstantInt *FB = EndPoints[0]; | 
|  | ConstantInt *FE = EndPoints[1]; | 
|  | if (tryMergeRange(EndPoints, FB, FE)) { | 
|  | for (unsigned i = 0; i < Size - 2; ++i) { | 
|  | EndPoints[i] = EndPoints[i + 2]; | 
|  | } | 
|  | EndPoints.resize(Size - 2); | 
|  | } | 
|  | } | 
|  |  | 
|  | // If in the end we have a single range, it is possible that it is now the | 
|  | // full range. Just drop the metadata in that case. | 
|  | if (EndPoints.size() == 2) { | 
|  | ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue()); | 
|  | if (Range.isFullSet()) | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | SmallVector<Metadata *, 4> MDs; | 
|  | MDs.reserve(EndPoints.size()); | 
|  | for (auto *I : EndPoints) | 
|  | MDs.push_back(ConstantAsMetadata::get(I)); | 
|  | return MDNode::get(A->getContext(), MDs); | 
|  | } | 
|  |  | 
|  | MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) { | 
|  | if (!A || !B) | 
|  | return nullptr; | 
|  |  | 
|  | ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0)); | 
|  | ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0)); | 
|  | if (AVal->getZExtValue() < BVal->getZExtValue()) | 
|  | return A; | 
|  | return B; | 
|  | } | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // NamedMDNode implementation. | 
|  | // | 
|  |  | 
|  | static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) { | 
|  | return *(SmallVector<TrackingMDRef, 4> *)Operands; | 
|  | } | 
|  |  | 
|  | NamedMDNode::NamedMDNode(const Twine &N) | 
|  | : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {} | 
|  |  | 
|  | NamedMDNode::~NamedMDNode() { | 
|  | dropAllReferences(); | 
|  | delete &getNMDOps(Operands); | 
|  | } | 
|  |  | 
|  | unsigned NamedMDNode::getNumOperands() const { | 
|  | return (unsigned)getNMDOps(Operands).size(); | 
|  | } | 
|  |  | 
|  | MDNode *NamedMDNode::getOperand(unsigned i) const { | 
|  | assert(i < getNumOperands() && "Invalid Operand number!"); | 
|  | auto *N = getNMDOps(Operands)[i].get(); | 
|  | return cast_or_null<MDNode>(N); | 
|  | } | 
|  |  | 
|  | void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); } | 
|  |  | 
|  | void NamedMDNode::setOperand(unsigned I, MDNode *New) { | 
|  | assert(I < getNumOperands() && "Invalid operand number"); | 
|  | getNMDOps(Operands)[I].reset(New); | 
|  | } | 
|  |  | 
|  | void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); } | 
|  |  | 
|  | void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); } | 
|  |  | 
|  | StringRef NamedMDNode::getName() const { return StringRef(Name); } | 
|  |  | 
|  | //===----------------------------------------------------------------------===// | 
|  | // Instruction Metadata method implementations. | 
|  | // | 
|  | void MDAttachmentMap::set(unsigned ID, MDNode &MD) { | 
|  | for (auto &I : Attachments) | 
|  | if (I.first == ID) { | 
|  | I.second.reset(&MD); | 
|  | return; | 
|  | } | 
|  | Attachments.emplace_back(std::piecewise_construct, std::make_tuple(ID), | 
|  | std::make_tuple(&MD)); | 
|  | } | 
|  |  | 
|  | bool MDAttachmentMap::erase(unsigned ID) { | 
|  | if (empty()) | 
|  | return false; | 
|  |  | 
|  | // Common case is one/last value. | 
|  | if (Attachments.back().first == ID) { | 
|  | Attachments.pop_back(); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | for (auto I = Attachments.begin(), E = std::prev(Attachments.end()); I != E; | 
|  | ++I) | 
|  | if (I->first == ID) { | 
|  | *I = std::move(Attachments.back()); | 
|  | Attachments.pop_back(); | 
|  | return true; | 
|  | } | 
|  |  | 
|  | return false; | 
|  | } | 
|  |  | 
|  | MDNode *MDAttachmentMap::lookup(unsigned ID) const { | 
|  | for (const auto &I : Attachments) | 
|  | if (I.first == ID) | 
|  | return I.second; | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | void MDAttachmentMap::getAll( | 
|  | SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { | 
|  | Result.append(Attachments.begin(), Attachments.end()); | 
|  |  | 
|  | // Sort the resulting array so it is stable. | 
|  | if (Result.size() > 1) | 
|  | array_pod_sort(Result.begin(), Result.end()); | 
|  | } | 
|  |  | 
|  | void MDGlobalAttachmentMap::insert(unsigned ID, MDNode &MD) { | 
|  | Attachments.push_back({ID, TrackingMDNodeRef(&MD)}); | 
|  | } | 
|  |  | 
|  | MDNode *MDGlobalAttachmentMap::lookup(unsigned ID) const { | 
|  | for (const auto &A : Attachments) | 
|  | if (A.MDKind == ID) | 
|  | return A.Node; | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | void MDGlobalAttachmentMap::get(unsigned ID, | 
|  | SmallVectorImpl<MDNode *> &Result) const { | 
|  | for (const auto &A : Attachments) | 
|  | if (A.MDKind == ID) | 
|  | Result.push_back(A.Node); | 
|  | } | 
|  |  | 
|  | bool MDGlobalAttachmentMap::erase(unsigned ID) { | 
|  | auto I = std::remove_if(Attachments.begin(), Attachments.end(), | 
|  | [ID](const Attachment &A) { return A.MDKind == ID; }); | 
|  | bool Changed = I != Attachments.end(); | 
|  | Attachments.erase(I, Attachments.end()); | 
|  | return Changed; | 
|  | } | 
|  |  | 
|  | void MDGlobalAttachmentMap::getAll( | 
|  | SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { | 
|  | for (const auto &A : Attachments) | 
|  | Result.emplace_back(A.MDKind, A.Node); | 
|  |  | 
|  | // Sort the resulting array so it is stable with respect to metadata IDs. We | 
|  | // need to preserve the original insertion order though. | 
|  | std::stable_sort( | 
|  | Result.begin(), Result.end(), | 
|  | [](const std::pair<unsigned, MDNode *> &A, | 
|  | const std::pair<unsigned, MDNode *> &B) { return A.first < B.first; }); | 
|  | } | 
|  |  | 
|  | void Instruction::setMetadata(StringRef Kind, MDNode *Node) { | 
|  | if (!Node && !hasMetadata()) | 
|  | return; | 
|  | setMetadata(getContext().getMDKindID(Kind), Node); | 
|  | } | 
|  |  | 
|  | MDNode *Instruction::getMetadataImpl(StringRef Kind) const { | 
|  | return getMetadataImpl(getContext().getMDKindID(Kind)); | 
|  | } | 
|  |  | 
|  | void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) { | 
|  | if (!hasMetadataHashEntry()) | 
|  | return; // Nothing to remove! | 
|  |  | 
|  | auto &InstructionMetadata = getContext().pImpl->InstructionMetadata; | 
|  |  | 
|  | SmallSet<unsigned, 4> KnownSet; | 
|  | KnownSet.insert(KnownIDs.begin(), KnownIDs.end()); | 
|  | if (KnownSet.empty()) { | 
|  | // Just drop our entry at the store. | 
|  | InstructionMetadata.erase(this); | 
|  | setHasMetadataHashEntry(false); | 
|  | return; | 
|  | } | 
|  |  | 
|  | auto &Info = InstructionMetadata[this]; | 
|  | Info.remove_if([&KnownSet](const std::pair<unsigned, TrackingMDNodeRef> &I) { | 
|  | return !KnownSet.count(I.first); | 
|  | }); | 
|  |  | 
|  | if (Info.empty()) { | 
|  | // Drop our entry at the store. | 
|  | InstructionMetadata.erase(this); | 
|  | setHasMetadataHashEntry(false); | 
|  | } | 
|  | } | 
|  |  | 
|  | void Instruction::setMetadata(unsigned KindID, MDNode *Node) { | 
|  | if (!Node && !hasMetadata()) | 
|  | return; | 
|  |  | 
|  | // Handle 'dbg' as a special case since it is not stored in the hash table. | 
|  | if (KindID == LLVMContext::MD_dbg) { | 
|  | DbgLoc = DebugLoc(Node); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Handle the case when we're adding/updating metadata on an instruction. | 
|  | if (Node) { | 
|  | auto &Info = getContext().pImpl->InstructionMetadata[this]; | 
|  | assert(!Info.empty() == hasMetadataHashEntry() && | 
|  | "HasMetadata bit is wonked"); | 
|  | if (Info.empty()) | 
|  | setHasMetadataHashEntry(true); | 
|  | Info.set(KindID, *Node); | 
|  | return; | 
|  | } | 
|  |  | 
|  | // Otherwise, we're removing metadata from an instruction. | 
|  | assert((hasMetadataHashEntry() == | 
|  | (getContext().pImpl->InstructionMetadata.count(this) > 0)) && | 
|  | "HasMetadata bit out of date!"); | 
|  | if (!hasMetadataHashEntry()) | 
|  | return; // Nothing to remove! | 
|  | auto &Info = getContext().pImpl->InstructionMetadata[this]; | 
|  |  | 
|  | // Handle removal of an existing value. | 
|  | Info.erase(KindID); | 
|  |  | 
|  | if (!Info.empty()) | 
|  | return; | 
|  |  | 
|  | getContext().pImpl->InstructionMetadata.erase(this); | 
|  | setHasMetadataHashEntry(false); | 
|  | } | 
|  |  | 
|  | void Instruction::setAAMetadata(const AAMDNodes &N) { | 
|  | setMetadata(LLVMContext::MD_tbaa, N.TBAA); | 
|  | setMetadata(LLVMContext::MD_alias_scope, N.Scope); | 
|  | setMetadata(LLVMContext::MD_noalias, N.NoAlias); | 
|  | } | 
|  |  | 
|  | MDNode *Instruction::getMetadataImpl(unsigned KindID) const { | 
|  | // Handle 'dbg' as a special case since it is not stored in the hash table. | 
|  | if (KindID == LLVMContext::MD_dbg) | 
|  | return DbgLoc.getAsMDNode(); | 
|  |  | 
|  | if (!hasMetadataHashEntry()) | 
|  | return nullptr; | 
|  | auto &Info = getContext().pImpl->InstructionMetadata[this]; | 
|  | assert(!Info.empty() && "bit out of sync with hash table"); | 
|  |  | 
|  | return Info.lookup(KindID); | 
|  | } | 
|  |  | 
|  | void Instruction::getAllMetadataImpl( | 
|  | SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { | 
|  | Result.clear(); | 
|  |  | 
|  | // Handle 'dbg' as a special case since it is not stored in the hash table. | 
|  | if (DbgLoc) { | 
|  | Result.push_back( | 
|  | std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode())); | 
|  | if (!hasMetadataHashEntry()) | 
|  | return; | 
|  | } | 
|  |  | 
|  | assert(hasMetadataHashEntry() && | 
|  | getContext().pImpl->InstructionMetadata.count(this) && | 
|  | "Shouldn't have called this"); | 
|  | const auto &Info = getContext().pImpl->InstructionMetadata.find(this)->second; | 
|  | assert(!Info.empty() && "Shouldn't have called this"); | 
|  | Info.getAll(Result); | 
|  | } | 
|  |  | 
|  | void Instruction::getAllMetadataOtherThanDebugLocImpl( | 
|  | SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { | 
|  | Result.clear(); | 
|  | assert(hasMetadataHashEntry() && | 
|  | getContext().pImpl->InstructionMetadata.count(this) && | 
|  | "Shouldn't have called this"); | 
|  | const auto &Info = getContext().pImpl->InstructionMetadata.find(this)->second; | 
|  | assert(!Info.empty() && "Shouldn't have called this"); | 
|  | Info.getAll(Result); | 
|  | } | 
|  |  | 
|  | bool Instruction::extractProfMetadata(uint64_t &TrueVal, | 
|  | uint64_t &FalseVal) const { | 
|  | assert( | 
|  | (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select) && | 
|  | "Looking for branch weights on something besides branch or select"); | 
|  |  | 
|  | auto *ProfileData = getMetadata(LLVMContext::MD_prof); | 
|  | if (!ProfileData || ProfileData->getNumOperands() != 3) | 
|  | return false; | 
|  |  | 
|  | auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0)); | 
|  | if (!ProfDataName || !ProfDataName->getString().equals("branch_weights")) | 
|  | return false; | 
|  |  | 
|  | auto *CITrue = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1)); | 
|  | auto *CIFalse = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2)); | 
|  | if (!CITrue || !CIFalse) | 
|  | return false; | 
|  |  | 
|  | TrueVal = CITrue->getValue().getZExtValue(); | 
|  | FalseVal = CIFalse->getValue().getZExtValue(); | 
|  |  | 
|  | return true; | 
|  | } | 
|  |  | 
|  | bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const { | 
|  | assert((getOpcode() == Instruction::Br || | 
|  | getOpcode() == Instruction::Select || | 
|  | getOpcode() == Instruction::Call || | 
|  | getOpcode() == Instruction::Invoke || | 
|  | getOpcode() == Instruction::Switch) && | 
|  | "Looking for branch weights on something besides branch"); | 
|  |  | 
|  | TotalVal = 0; | 
|  | auto *ProfileData = getMetadata(LLVMContext::MD_prof); | 
|  | if (!ProfileData) | 
|  | return false; | 
|  |  | 
|  | auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0)); | 
|  | if (!ProfDataName) | 
|  | return false; | 
|  |  | 
|  | if (ProfDataName->getString().equals("branch_weights")) { | 
|  | TotalVal = 0; | 
|  | for (unsigned i = 1; i < ProfileData->getNumOperands(); i++) { | 
|  | auto *V = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(i)); | 
|  | if (!V) | 
|  | return false; | 
|  | TotalVal += V->getValue().getZExtValue(); | 
|  | } | 
|  | return true; | 
|  | } else if (ProfDataName->getString().equals("VP") && | 
|  | ProfileData->getNumOperands() > 3) { | 
|  | TotalVal = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2)) | 
|  | ->getValue() | 
|  | .getZExtValue(); | 
|  | return true; | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | void Instruction::clearMetadataHashEntries() { | 
|  | assert(hasMetadataHashEntry() && "Caller should check"); | 
|  | getContext().pImpl->InstructionMetadata.erase(this); | 
|  | setHasMetadataHashEntry(false); | 
|  | } | 
|  |  | 
|  | void GlobalObject::getMetadata(unsigned KindID, | 
|  | SmallVectorImpl<MDNode *> &MDs) const { | 
|  | if (hasMetadata()) | 
|  | getContext().pImpl->GlobalObjectMetadata[this].get(KindID, MDs); | 
|  | } | 
|  |  | 
|  | void GlobalObject::getMetadata(StringRef Kind, | 
|  | SmallVectorImpl<MDNode *> &MDs) const { | 
|  | if (hasMetadata()) | 
|  | getMetadata(getContext().getMDKindID(Kind), MDs); | 
|  | } | 
|  |  | 
|  | void GlobalObject::addMetadata(unsigned KindID, MDNode &MD) { | 
|  | if (!hasMetadata()) | 
|  | setHasMetadataHashEntry(true); | 
|  |  | 
|  | getContext().pImpl->GlobalObjectMetadata[this].insert(KindID, MD); | 
|  | } | 
|  |  | 
|  | void GlobalObject::addMetadata(StringRef Kind, MDNode &MD) { | 
|  | addMetadata(getContext().getMDKindID(Kind), MD); | 
|  | } | 
|  |  | 
|  | bool GlobalObject::eraseMetadata(unsigned KindID) { | 
|  | // Nothing to unset. | 
|  | if (!hasMetadata()) | 
|  | return false; | 
|  |  | 
|  | auto &Store = getContext().pImpl->GlobalObjectMetadata[this]; | 
|  | bool Changed = Store.erase(KindID); | 
|  | if (Store.empty()) | 
|  | clearMetadata(); | 
|  | return Changed; | 
|  | } | 
|  |  | 
|  | void GlobalObject::getAllMetadata( | 
|  | SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const { | 
|  | MDs.clear(); | 
|  |  | 
|  | if (!hasMetadata()) | 
|  | return; | 
|  |  | 
|  | getContext().pImpl->GlobalObjectMetadata[this].getAll(MDs); | 
|  | } | 
|  |  | 
|  | void GlobalObject::clearMetadata() { | 
|  | if (!hasMetadata()) | 
|  | return; | 
|  | getContext().pImpl->GlobalObjectMetadata.erase(this); | 
|  | setHasMetadataHashEntry(false); | 
|  | } | 
|  |  | 
|  | void GlobalObject::setMetadata(unsigned KindID, MDNode *N) { | 
|  | eraseMetadata(KindID); | 
|  | if (N) | 
|  | addMetadata(KindID, *N); | 
|  | } | 
|  |  | 
|  | void GlobalObject::setMetadata(StringRef Kind, MDNode *N) { | 
|  | setMetadata(getContext().getMDKindID(Kind), N); | 
|  | } | 
|  |  | 
|  | MDNode *GlobalObject::getMetadata(unsigned KindID) const { | 
|  | if (hasMetadata()) | 
|  | return getContext().pImpl->GlobalObjectMetadata[this].lookup(KindID); | 
|  | return nullptr; | 
|  | } | 
|  |  | 
|  | MDNode *GlobalObject::getMetadata(StringRef Kind) const { | 
|  | return getMetadata(getContext().getMDKindID(Kind)); | 
|  | } | 
|  |  | 
|  | void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) { | 
|  | SmallVector<std::pair<unsigned, MDNode *>, 8> MDs; | 
|  | Other->getAllMetadata(MDs); | 
|  | for (auto &MD : MDs) { | 
|  | // We need to adjust the type metadata offset. | 
|  | if (Offset != 0 && MD.first == LLVMContext::MD_type) { | 
|  | auto *OffsetConst = cast<ConstantInt>( | 
|  | cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue()); | 
|  | Metadata *TypeId = MD.second->getOperand(1); | 
|  | auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get( | 
|  | OffsetConst->getType(), OffsetConst->getValue() + Offset)); | 
|  | addMetadata(LLVMContext::MD_type, | 
|  | *MDNode::get(getContext(), {NewOffsetMD, TypeId})); | 
|  | continue; | 
|  | } | 
|  | // If an offset adjustment was specified we need to modify the DIExpression | 
|  | // to prepend the adjustment: | 
|  | // !DIExpression(DW_OP_plus, Offset, [original expr]) | 
|  | auto *Attachment = MD.second; | 
|  | if (Offset != 0 && MD.first == LLVMContext::MD_dbg) { | 
|  | DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment); | 
|  | DIExpression *E = nullptr; | 
|  | if (!GV) { | 
|  | auto *GVE = cast<DIGlobalVariableExpression>(Attachment); | 
|  | GV = GVE->getVariable(); | 
|  | E = GVE->getExpression(); | 
|  | } | 
|  | ArrayRef<uint64_t> OrigElements; | 
|  | if (E) | 
|  | OrigElements = E->getElements(); | 
|  | std::vector<uint64_t> Elements(OrigElements.size() + 2); | 
|  | Elements[0] = dwarf::DW_OP_plus_uconst; | 
|  | Elements[1] = Offset; | 
|  | std::copy(OrigElements.begin(), OrigElements.end(), Elements.begin() + 2); | 
|  | E = DIExpression::get(getContext(), Elements); | 
|  | Attachment = DIGlobalVariableExpression::get(getContext(), GV, E); | 
|  | } | 
|  | addMetadata(MD.first, *Attachment); | 
|  | } | 
|  | } | 
|  |  | 
|  | void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) { | 
|  | addMetadata( | 
|  | LLVMContext::MD_type, | 
|  | *MDTuple::get(getContext(), | 
|  | {ConstantAsMetadata::get(ConstantInt::get( | 
|  | Type::getInt64Ty(getContext()), Offset)), | 
|  | TypeID})); | 
|  | } | 
|  |  | 
|  | void Function::setSubprogram(DISubprogram *SP) { | 
|  | setMetadata(LLVMContext::MD_dbg, SP); | 
|  | } | 
|  |  | 
|  | DISubprogram *Function::getSubprogram() const { | 
|  | return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg)); | 
|  | } | 
|  |  | 
|  | bool Function::isDebugInfoForProfiling() const { | 
|  | if (DISubprogram *SP = getSubprogram()) { | 
|  | if (DICompileUnit *CU = SP->getUnit()) { | 
|  | return CU->getDebugInfoForProfiling(); | 
|  | } | 
|  | } | 
|  | return false; | 
|  | } | 
|  |  | 
|  | void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) { | 
|  | addMetadata(LLVMContext::MD_dbg, *GV); | 
|  | } | 
|  |  | 
|  | void GlobalVariable::getDebugInfo( | 
|  | SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const { | 
|  | SmallVector<MDNode *, 1> MDs; | 
|  | getMetadata(LLVMContext::MD_dbg, MDs); | 
|  | for (MDNode *MD : MDs) | 
|  | GVs.push_back(cast<DIGlobalVariableExpression>(MD)); | 
|  | } |