xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Metadata.cpp (revision 52418fc2be8efa5172b90a3a9e617017173612c4)
10b57cec5SDimitry Andric //===- Metadata.cpp - Implement Metadata classes --------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric //
90b57cec5SDimitry Andric // This file implements the Metadata classes.
100b57cec5SDimitry Andric //
110b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
120b57cec5SDimitry Andric 
13e8d8bef9SDimitry Andric #include "llvm/IR/Metadata.h"
140b57cec5SDimitry Andric #include "LLVMContextImpl.h"
150b57cec5SDimitry Andric #include "MetadataImpl.h"
160b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h"
170b57cec5SDimitry Andric #include "llvm/ADT/APInt.h"
180b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h"
190b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h"
200b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h"
210b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h"
220b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h"
230b57cec5SDimitry Andric #include "llvm/ADT/SmallSet.h"
240b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h"
250b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h"
260b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
270b57cec5SDimitry Andric #include "llvm/ADT/Twine.h"
280b57cec5SDimitry Andric #include "llvm/IR/Argument.h"
290b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h"
300b57cec5SDimitry Andric #include "llvm/IR/Constant.h"
310b57cec5SDimitry Andric #include "llvm/IR/ConstantRange.h"
320b57cec5SDimitry Andric #include "llvm/IR/Constants.h"
330b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h"
340b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h"
355f757f3fSDimitry Andric #include "llvm/IR/DebugProgramInstruction.h"
360b57cec5SDimitry Andric #include "llvm/IR/Function.h"
370b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h"
380b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h"
390b57cec5SDimitry Andric #include "llvm/IR/Instruction.h"
400b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h"
41e8d8bef9SDimitry Andric #include "llvm/IR/MDBuilder.h"
420b57cec5SDimitry Andric #include "llvm/IR/Module.h"
43bdd1243dSDimitry Andric #include "llvm/IR/ProfDataUtils.h"
440b57cec5SDimitry Andric #include "llvm/IR/TrackingMDRef.h"
450b57cec5SDimitry Andric #include "llvm/IR/Type.h"
460b57cec5SDimitry Andric #include "llvm/IR/Value.h"
470b57cec5SDimitry Andric #include "llvm/Support/Casting.h"
480b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h"
490b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h"
500b57cec5SDimitry Andric #include <algorithm>
510b57cec5SDimitry Andric #include <cassert>
520b57cec5SDimitry Andric #include <cstddef>
530b57cec5SDimitry Andric #include <cstdint>
540b57cec5SDimitry Andric #include <type_traits>
550b57cec5SDimitry Andric #include <utility>
560b57cec5SDimitry Andric #include <vector>
570b57cec5SDimitry Andric 
580b57cec5SDimitry Andric using namespace llvm;
590b57cec5SDimitry Andric 
MetadataAsValue(Type * Ty,Metadata * MD)600b57cec5SDimitry Andric MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
610b57cec5SDimitry Andric     : Value(Ty, MetadataAsValueVal), MD(MD) {
620b57cec5SDimitry Andric   track();
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
~MetadataAsValue()650b57cec5SDimitry Andric MetadataAsValue::~MetadataAsValue() {
660b57cec5SDimitry Andric   getType()->getContext().pImpl->MetadataAsValues.erase(MD);
670b57cec5SDimitry Andric   untrack();
680b57cec5SDimitry Andric }
690b57cec5SDimitry Andric 
700b57cec5SDimitry Andric /// Canonicalize metadata arguments to intrinsics.
710b57cec5SDimitry Andric ///
720b57cec5SDimitry Andric /// To support bitcode upgrades (and assembly semantic sugar) for \a
730b57cec5SDimitry Andric /// MetadataAsValue, we need to canonicalize certain metadata.
740b57cec5SDimitry Andric ///
750b57cec5SDimitry Andric ///   - nullptr is replaced by an empty MDNode.
760b57cec5SDimitry Andric ///   - An MDNode with a single null operand is replaced by an empty MDNode.
770b57cec5SDimitry Andric ///   - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
780b57cec5SDimitry Andric ///
790b57cec5SDimitry Andric /// This maintains readability of bitcode from when metadata was a type of
800b57cec5SDimitry Andric /// value, and these bridges were unnecessary.
canonicalizeMetadataForValue(LLVMContext & Context,Metadata * MD)810b57cec5SDimitry Andric static Metadata *canonicalizeMetadataForValue(LLVMContext &Context,
820b57cec5SDimitry Andric                                               Metadata *MD) {
830b57cec5SDimitry Andric   if (!MD)
840b57cec5SDimitry Andric     // !{}
85bdd1243dSDimitry Andric     return MDNode::get(Context, std::nullopt);
860b57cec5SDimitry Andric 
870b57cec5SDimitry Andric   // Return early if this isn't a single-operand MDNode.
880b57cec5SDimitry Andric   auto *N = dyn_cast<MDNode>(MD);
890b57cec5SDimitry Andric   if (!N || N->getNumOperands() != 1)
900b57cec5SDimitry Andric     return MD;
910b57cec5SDimitry Andric 
920b57cec5SDimitry Andric   if (!N->getOperand(0))
930b57cec5SDimitry Andric     // !{}
94bdd1243dSDimitry Andric     return MDNode::get(Context, std::nullopt);
950b57cec5SDimitry Andric 
960b57cec5SDimitry Andric   if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0)))
970b57cec5SDimitry Andric     // Look through the MDNode.
980b57cec5SDimitry Andric     return C;
990b57cec5SDimitry Andric 
1000b57cec5SDimitry Andric   return MD;
1010b57cec5SDimitry Andric }
1020b57cec5SDimitry Andric 
get(LLVMContext & Context,Metadata * MD)1030b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) {
1040b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1050b57cec5SDimitry Andric   auto *&Entry = Context.pImpl->MetadataAsValues[MD];
1060b57cec5SDimitry Andric   if (!Entry)
1070b57cec5SDimitry Andric     Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD);
1080b57cec5SDimitry Andric   return Entry;
1090b57cec5SDimitry Andric }
1100b57cec5SDimitry Andric 
getIfExists(LLVMContext & Context,Metadata * MD)1110b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::getIfExists(LLVMContext &Context,
1120b57cec5SDimitry Andric                                               Metadata *MD) {
1130b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1140b57cec5SDimitry Andric   auto &Store = Context.pImpl->MetadataAsValues;
1150b57cec5SDimitry Andric   return Store.lookup(MD);
1160b57cec5SDimitry Andric }
1170b57cec5SDimitry Andric 
handleChangedMetadata(Metadata * MD)1180b57cec5SDimitry Andric void MetadataAsValue::handleChangedMetadata(Metadata *MD) {
1190b57cec5SDimitry Andric   LLVMContext &Context = getContext();
1200b57cec5SDimitry Andric   MD = canonicalizeMetadataForValue(Context, MD);
1210b57cec5SDimitry Andric   auto &Store = Context.pImpl->MetadataAsValues;
1220b57cec5SDimitry Andric 
1230b57cec5SDimitry Andric   // Stop tracking the old metadata.
1240b57cec5SDimitry Andric   Store.erase(this->MD);
1250b57cec5SDimitry Andric   untrack();
1260b57cec5SDimitry Andric   this->MD = nullptr;
1270b57cec5SDimitry Andric 
1280b57cec5SDimitry Andric   // Start tracking MD, or RAUW if necessary.
1290b57cec5SDimitry Andric   auto *&Entry = Store[MD];
1300b57cec5SDimitry Andric   if (Entry) {
1310b57cec5SDimitry Andric     replaceAllUsesWith(Entry);
1320b57cec5SDimitry Andric     delete this;
1330b57cec5SDimitry Andric     return;
1340b57cec5SDimitry Andric   }
1350b57cec5SDimitry Andric 
1360b57cec5SDimitry Andric   this->MD = MD;
1370b57cec5SDimitry Andric   track();
1380b57cec5SDimitry Andric   Entry = this;
1390b57cec5SDimitry Andric }
1400b57cec5SDimitry Andric 
track()1410b57cec5SDimitry Andric void MetadataAsValue::track() {
1420b57cec5SDimitry Andric   if (MD)
1430b57cec5SDimitry Andric     MetadataTracking::track(&MD, *MD, *this);
1440b57cec5SDimitry Andric }
1450b57cec5SDimitry Andric 
untrack()1460b57cec5SDimitry Andric void MetadataAsValue::untrack() {
1470b57cec5SDimitry Andric   if (MD)
1480b57cec5SDimitry Andric     MetadataTracking::untrack(MD);
1490b57cec5SDimitry Andric }
1500b57cec5SDimitry Andric 
getUser()1510fca6ea1SDimitry Andric DbgVariableRecord *DebugValueUser::getUser() {
1520fca6ea1SDimitry Andric   return static_cast<DbgVariableRecord *>(this);
1530fca6ea1SDimitry Andric }
getUser() const1540fca6ea1SDimitry Andric const DbgVariableRecord *DebugValueUser::getUser() const {
1550fca6ea1SDimitry Andric   return static_cast<const DbgVariableRecord *>(this);
1565f757f3fSDimitry Andric }
1577a6dacacSDimitry Andric 
handleChangedValue(void * Old,Metadata * New)1587a6dacacSDimitry Andric void DebugValueUser::handleChangedValue(void *Old, Metadata *New) {
1597a6dacacSDimitry Andric   // NOTE: We could inform the "owner" that a value has changed through
1607a6dacacSDimitry Andric   // getOwner, if needed.
1617a6dacacSDimitry Andric   auto OldMD = static_cast<Metadata **>(Old);
1627a6dacacSDimitry Andric   ptrdiff_t Idx = std::distance(&*DebugValues.begin(), OldMD);
1630fca6ea1SDimitry Andric   // If replacing a ValueAsMetadata with a nullptr, replace it with a
1640fca6ea1SDimitry Andric   // PoisonValue instead.
1650fca6ea1SDimitry Andric   if (OldMD && isa<ValueAsMetadata>(*OldMD) && !New) {
1660fca6ea1SDimitry Andric     auto *OldVAM = cast<ValueAsMetadata>(*OldMD);
1670fca6ea1SDimitry Andric     New = ValueAsMetadata::get(PoisonValue::get(OldVAM->getValue()->getType()));
1680fca6ea1SDimitry Andric   }
1697a6dacacSDimitry Andric   resetDebugValue(Idx, New);
1705f757f3fSDimitry Andric }
1715f757f3fSDimitry Andric 
trackDebugValue(size_t Idx)1727a6dacacSDimitry Andric void DebugValueUser::trackDebugValue(size_t Idx) {
1737a6dacacSDimitry Andric   assert(Idx < 3 && "Invalid debug value index.");
1747a6dacacSDimitry Andric   Metadata *&MD = DebugValues[Idx];
1757a6dacacSDimitry Andric   if (MD)
1767a6dacacSDimitry Andric     MetadataTracking::track(&MD, *MD, *this);
1775f757f3fSDimitry Andric }
1785f757f3fSDimitry Andric 
trackDebugValues()1797a6dacacSDimitry Andric void DebugValueUser::trackDebugValues() {
1807a6dacacSDimitry Andric   for (Metadata *&MD : DebugValues)
1817a6dacacSDimitry Andric     if (MD)
1827a6dacacSDimitry Andric       MetadataTracking::track(&MD, *MD, *this);
1835f757f3fSDimitry Andric }
1845f757f3fSDimitry Andric 
untrackDebugValue(size_t Idx)1857a6dacacSDimitry Andric void DebugValueUser::untrackDebugValue(size_t Idx) {
1867a6dacacSDimitry Andric   assert(Idx < 3 && "Invalid debug value index.");
1877a6dacacSDimitry Andric   Metadata *&MD = DebugValues[Idx];
1887a6dacacSDimitry Andric   if (MD)
1897a6dacacSDimitry Andric     MetadataTracking::untrack(MD);
1905f757f3fSDimitry Andric }
1917a6dacacSDimitry Andric 
untrackDebugValues()1927a6dacacSDimitry Andric void DebugValueUser::untrackDebugValues() {
1937a6dacacSDimitry Andric   for (Metadata *&MD : DebugValues)
1947a6dacacSDimitry Andric     if (MD)
1957a6dacacSDimitry Andric       MetadataTracking::untrack(MD);
1967a6dacacSDimitry Andric }
1977a6dacacSDimitry Andric 
retrackDebugValues(DebugValueUser & X)1987a6dacacSDimitry Andric void DebugValueUser::retrackDebugValues(DebugValueUser &X) {
1997a6dacacSDimitry Andric   assert(DebugValueUser::operator==(X) && "Expected values to match");
2007a6dacacSDimitry Andric   for (const auto &[MD, XMD] : zip(DebugValues, X.DebugValues))
2017a6dacacSDimitry Andric     if (XMD)
2027a6dacacSDimitry Andric       MetadataTracking::retrack(XMD, MD);
2037a6dacacSDimitry Andric   X.DebugValues.fill(nullptr);
2045f757f3fSDimitry Andric }
2055f757f3fSDimitry Andric 
track(void * Ref,Metadata & MD,OwnerTy Owner)2060b57cec5SDimitry Andric bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
2070b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
2080b57cec5SDimitry Andric   assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
2090b57cec5SDimitry Andric          "Reference without owner must be direct");
2100b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
2110b57cec5SDimitry Andric     R->addRef(Ref, Owner);
2120b57cec5SDimitry Andric     return true;
2130b57cec5SDimitry Andric   }
2140b57cec5SDimitry Andric   if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
2150b57cec5SDimitry Andric     assert(!PH->Use && "Placeholders can only be used once");
2160b57cec5SDimitry Andric     assert(!Owner && "Unexpected callback to owner");
2170b57cec5SDimitry Andric     PH->Use = static_cast<Metadata **>(Ref);
2180b57cec5SDimitry Andric     return true;
2190b57cec5SDimitry Andric   }
2200b57cec5SDimitry Andric   return false;
2210b57cec5SDimitry Andric }
2220b57cec5SDimitry Andric 
untrack(void * Ref,Metadata & MD)2230b57cec5SDimitry Andric void MetadataTracking::untrack(void *Ref, Metadata &MD) {
2240b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
2250b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
2260b57cec5SDimitry Andric     R->dropRef(Ref);
2270b57cec5SDimitry Andric   else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
2280b57cec5SDimitry Andric     PH->Use = nullptr;
2290b57cec5SDimitry Andric }
2300b57cec5SDimitry Andric 
retrack(void * Ref,Metadata & MD,void * New)2310b57cec5SDimitry Andric bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
2320b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
2330b57cec5SDimitry Andric   assert(New && "Expected live reference");
2340b57cec5SDimitry Andric   assert(Ref != New && "Expected change");
2350b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
2360b57cec5SDimitry Andric     R->moveRef(Ref, New, MD);
2370b57cec5SDimitry Andric     return true;
2380b57cec5SDimitry Andric   }
2390b57cec5SDimitry Andric   assert(!isa<DistinctMDOperandPlaceholder>(MD) &&
2400b57cec5SDimitry Andric          "Unexpected move of an MDOperand");
2410b57cec5SDimitry Andric   assert(!isReplaceable(MD) &&
2420b57cec5SDimitry Andric          "Expected un-replaceable metadata, since we didn't move a reference");
2430b57cec5SDimitry Andric   return false;
2440b57cec5SDimitry Andric }
2450b57cec5SDimitry Andric 
isReplaceable(const Metadata & MD)2460b57cec5SDimitry Andric bool MetadataTracking::isReplaceable(const Metadata &MD) {
2470b57cec5SDimitry Andric   return ReplaceableMetadataImpl::isReplaceable(MD);
2480b57cec5SDimitry Andric }
2490b57cec5SDimitry Andric 
getAllArgListUsers()250fe6060f1SDimitry Andric SmallVector<Metadata *> ReplaceableMetadataImpl::getAllArgListUsers() {
251fe6060f1SDimitry Andric   SmallVector<std::pair<OwnerTy, uint64_t> *> MDUsersWithID;
252fe6060f1SDimitry Andric   for (auto Pair : UseMap) {
253fe6060f1SDimitry Andric     OwnerTy Owner = Pair.second.first;
2545f757f3fSDimitry Andric     if (Owner.isNull())
2555f757f3fSDimitry Andric       continue;
25606c3fb27SDimitry Andric     if (!isa<Metadata *>(Owner))
257fe6060f1SDimitry Andric       continue;
25806c3fb27SDimitry Andric     Metadata *OwnerMD = cast<Metadata *>(Owner);
259fe6060f1SDimitry Andric     if (OwnerMD->getMetadataID() == Metadata::DIArgListKind)
260fe6060f1SDimitry Andric       MDUsersWithID.push_back(&UseMap[Pair.first]);
261fe6060f1SDimitry Andric   }
262fe6060f1SDimitry Andric   llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) {
263fe6060f1SDimitry Andric     return UserA->second < UserB->second;
264fe6060f1SDimitry Andric   });
265fe6060f1SDimitry Andric   SmallVector<Metadata *> MDUsers;
266bdd1243dSDimitry Andric   for (auto *UserWithID : MDUsersWithID)
26706c3fb27SDimitry Andric     MDUsers.push_back(cast<Metadata *>(UserWithID->first));
268fe6060f1SDimitry Andric   return MDUsers;
269fe6060f1SDimitry Andric }
270fe6060f1SDimitry Andric 
2710fca6ea1SDimitry Andric SmallVector<DbgVariableRecord *>
getAllDbgVariableRecordUsers()2720fca6ea1SDimitry Andric ReplaceableMetadataImpl::getAllDbgVariableRecordUsers() {
2730fca6ea1SDimitry Andric   SmallVector<std::pair<OwnerTy, uint64_t> *> DVRUsersWithID;
2745f757f3fSDimitry Andric   for (auto Pair : UseMap) {
2755f757f3fSDimitry Andric     OwnerTy Owner = Pair.second.first;
2765f757f3fSDimitry Andric     if (Owner.isNull())
2775f757f3fSDimitry Andric       continue;
2785f757f3fSDimitry Andric     if (!Owner.is<DebugValueUser *>())
2795f757f3fSDimitry Andric       continue;
2800fca6ea1SDimitry Andric     DVRUsersWithID.push_back(&UseMap[Pair.first]);
2815f757f3fSDimitry Andric   }
2820fca6ea1SDimitry Andric   // Order DbgVariableRecord users in reverse-creation order. Normal dbg.value
2830fca6ea1SDimitry Andric   // users of MetadataAsValues are ordered by their UseList, i.e. reverse order
2840fca6ea1SDimitry Andric   // of when they were added: we need to replicate that here. The structure of
2855f757f3fSDimitry Andric   // debug-info output depends on the ordering of intrinsics, thus we need
2865f757f3fSDimitry Andric   // to keep them consistent for comparisons sake.
2870fca6ea1SDimitry Andric   llvm::sort(DVRUsersWithID, [](auto UserA, auto UserB) {
2885f757f3fSDimitry Andric     return UserA->second > UserB->second;
2895f757f3fSDimitry Andric   });
2900fca6ea1SDimitry Andric   SmallVector<DbgVariableRecord *> DVRUsers;
2910fca6ea1SDimitry Andric   for (auto UserWithID : DVRUsersWithID)
2920fca6ea1SDimitry Andric     DVRUsers.push_back(UserWithID->first.get<DebugValueUser *>()->getUser());
2930fca6ea1SDimitry Andric   return DVRUsers;
2945f757f3fSDimitry Andric }
2955f757f3fSDimitry Andric 
addRef(void * Ref,OwnerTy Owner)2960b57cec5SDimitry Andric void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
2970b57cec5SDimitry Andric   bool WasInserted =
2980b57cec5SDimitry Andric       UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
2990b57cec5SDimitry Andric           .second;
3000b57cec5SDimitry Andric   (void)WasInserted;
3010b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
3020b57cec5SDimitry Andric 
3030b57cec5SDimitry Andric   ++NextIndex;
3040b57cec5SDimitry Andric   assert(NextIndex != 0 && "Unexpected overflow");
3050b57cec5SDimitry Andric }
3060b57cec5SDimitry Andric 
dropRef(void * Ref)3070b57cec5SDimitry Andric void ReplaceableMetadataImpl::dropRef(void *Ref) {
3080b57cec5SDimitry Andric   bool WasErased = UseMap.erase(Ref);
3090b57cec5SDimitry Andric   (void)WasErased;
3100b57cec5SDimitry Andric   assert(WasErased && "Expected to drop a reference");
3110b57cec5SDimitry Andric }
3120b57cec5SDimitry Andric 
moveRef(void * Ref,void * New,const Metadata & MD)3130b57cec5SDimitry Andric void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
3140b57cec5SDimitry Andric                                       const Metadata &MD) {
3150b57cec5SDimitry Andric   auto I = UseMap.find(Ref);
3160b57cec5SDimitry Andric   assert(I != UseMap.end() && "Expected to move a reference");
3170b57cec5SDimitry Andric   auto OwnerAndIndex = I->second;
3180b57cec5SDimitry Andric   UseMap.erase(I);
3190b57cec5SDimitry Andric   bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
3200b57cec5SDimitry Andric   (void)WasInserted;
3210b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
3220b57cec5SDimitry Andric 
3230b57cec5SDimitry Andric   // Check that the references are direct if there's no owner.
3240b57cec5SDimitry Andric   (void)MD;
3250b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
3260b57cec5SDimitry Andric          "Reference without owner must be direct");
3270b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
3280b57cec5SDimitry Andric          "Reference without owner must be direct");
3290b57cec5SDimitry Andric }
3300b57cec5SDimitry Andric 
SalvageDebugInfo(const Constant & C)33181ad6265SDimitry Andric void ReplaceableMetadataImpl::SalvageDebugInfo(const Constant &C) {
33281ad6265SDimitry Andric   if (!C.isUsedByMetadata()) {
33381ad6265SDimitry Andric     return;
33481ad6265SDimitry Andric   }
33581ad6265SDimitry Andric 
33681ad6265SDimitry Andric   LLVMContext &Context = C.getType()->getContext();
33781ad6265SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
33881ad6265SDimitry Andric   auto I = Store.find(&C);
33981ad6265SDimitry Andric   ValueAsMetadata *MD = I->second;
34081ad6265SDimitry Andric   using UseTy =
34181ad6265SDimitry Andric       std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
34281ad6265SDimitry Andric   // Copy out uses and update value of Constant used by debug info metadata with undef below
34381ad6265SDimitry Andric   SmallVector<UseTy, 8> Uses(MD->UseMap.begin(), MD->UseMap.end());
34481ad6265SDimitry Andric 
34581ad6265SDimitry Andric   for (const auto &Pair : Uses) {
34681ad6265SDimitry Andric     MetadataTracking::OwnerTy Owner = Pair.second.first;
34781ad6265SDimitry Andric     if (!Owner)
34881ad6265SDimitry Andric       continue;
34906c3fb27SDimitry Andric     if (!isa<Metadata *>(Owner))
35081ad6265SDimitry Andric       continue;
35106c3fb27SDimitry Andric     auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
35281ad6265SDimitry Andric     if (!OwnerMD)
35381ad6265SDimitry Andric       continue;
35481ad6265SDimitry Andric     if (isa<DINode>(OwnerMD)) {
35581ad6265SDimitry Andric       OwnerMD->handleChangedOperand(
35681ad6265SDimitry Andric           Pair.first, ValueAsMetadata::get(UndefValue::get(C.getType())));
35781ad6265SDimitry Andric     }
35881ad6265SDimitry Andric   }
35981ad6265SDimitry Andric }
36081ad6265SDimitry Andric 
replaceAllUsesWith(Metadata * MD)3610b57cec5SDimitry Andric void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) {
3620b57cec5SDimitry Andric   if (UseMap.empty())
3630b57cec5SDimitry Andric     return;
3640b57cec5SDimitry Andric 
3650b57cec5SDimitry Andric   // Copy out uses since UseMap will get touched below.
3660b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
3670b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
36806c3fb27SDimitry Andric   llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
36906c3fb27SDimitry Andric     return L.second.second < R.second.second;
37006c3fb27SDimitry Andric   });
3710b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
3720b57cec5SDimitry Andric     // Check that this Ref hasn't disappeared after RAUW (when updating a
3730b57cec5SDimitry Andric     // previous Ref).
3740b57cec5SDimitry Andric     if (!UseMap.count(Pair.first))
3750b57cec5SDimitry Andric       continue;
3760b57cec5SDimitry Andric 
3770b57cec5SDimitry Andric     OwnerTy Owner = Pair.second.first;
3780b57cec5SDimitry Andric     if (!Owner) {
3790b57cec5SDimitry Andric       // Update unowned tracking references directly.
3800b57cec5SDimitry Andric       Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
3810b57cec5SDimitry Andric       Ref = MD;
3820b57cec5SDimitry Andric       if (MD)
3830b57cec5SDimitry Andric         MetadataTracking::track(Ref);
3840b57cec5SDimitry Andric       UseMap.erase(Pair.first);
3850b57cec5SDimitry Andric       continue;
3860b57cec5SDimitry Andric     }
3870b57cec5SDimitry Andric 
3880b57cec5SDimitry Andric     // Check for MetadataAsValue.
38906c3fb27SDimitry Andric     if (isa<MetadataAsValue *>(Owner)) {
39006c3fb27SDimitry Andric       cast<MetadataAsValue *>(Owner)->handleChangedMetadata(MD);
3910b57cec5SDimitry Andric       continue;
3920b57cec5SDimitry Andric     }
3930b57cec5SDimitry Andric 
3945f757f3fSDimitry Andric     if (Owner.is<DebugValueUser *>()) {
3957a6dacacSDimitry Andric       Owner.get<DebugValueUser *>()->handleChangedValue(Pair.first, MD);
3965f757f3fSDimitry Andric       continue;
3975f757f3fSDimitry Andric     }
3985f757f3fSDimitry Andric 
3990b57cec5SDimitry Andric     // There's a Metadata owner -- dispatch.
40006c3fb27SDimitry Andric     Metadata *OwnerMD = cast<Metadata *>(Owner);
4010b57cec5SDimitry Andric     switch (OwnerMD->getMetadataID()) {
4020b57cec5SDimitry Andric #define HANDLE_METADATA_LEAF(CLASS)                                            \
4030b57cec5SDimitry Andric   case Metadata::CLASS##Kind:                                                  \
4040b57cec5SDimitry Andric     cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD);                \
4050b57cec5SDimitry Andric     continue;
4060b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
4070b57cec5SDimitry Andric     default:
4080b57cec5SDimitry Andric       llvm_unreachable("Invalid metadata subclass");
4090b57cec5SDimitry Andric     }
4100b57cec5SDimitry Andric   }
4110b57cec5SDimitry Andric   assert(UseMap.empty() && "Expected all uses to be replaced");
4120b57cec5SDimitry Andric }
4130b57cec5SDimitry Andric 
resolveAllUses(bool ResolveUsers)4140b57cec5SDimitry Andric void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) {
4150b57cec5SDimitry Andric   if (UseMap.empty())
4160b57cec5SDimitry Andric     return;
4170b57cec5SDimitry Andric 
4180b57cec5SDimitry Andric   if (!ResolveUsers) {
4190b57cec5SDimitry Andric     UseMap.clear();
4200b57cec5SDimitry Andric     return;
4210b57cec5SDimitry Andric   }
4220b57cec5SDimitry Andric 
4230b57cec5SDimitry Andric   // Copy out uses since UseMap could get touched below.
4240b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
4250b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
4260b57cec5SDimitry Andric   llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
4270b57cec5SDimitry Andric     return L.second.second < R.second.second;
4280b57cec5SDimitry Andric   });
4290b57cec5SDimitry Andric   UseMap.clear();
4300b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
4310b57cec5SDimitry Andric     auto Owner = Pair.second.first;
4320b57cec5SDimitry Andric     if (!Owner)
4330b57cec5SDimitry Andric       continue;
4345f757f3fSDimitry Andric     if (!Owner.is<Metadata *>())
4350b57cec5SDimitry Andric       continue;
4360b57cec5SDimitry Andric 
4370b57cec5SDimitry Andric     // Resolve MDNodes that point at this.
43806c3fb27SDimitry Andric     auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
4390b57cec5SDimitry Andric     if (!OwnerMD)
4400b57cec5SDimitry Andric       continue;
4410b57cec5SDimitry Andric     if (OwnerMD->isResolved())
4420b57cec5SDimitry Andric       continue;
4430b57cec5SDimitry Andric     OwnerMD->decrementUnresolvedOperandCount();
4440b57cec5SDimitry Andric   }
4450b57cec5SDimitry Andric }
4460b57cec5SDimitry Andric 
4475f757f3fSDimitry Andric // Special handing of DIArgList is required in the RemoveDIs project, see
4485f757f3fSDimitry Andric // commentry in DIArgList::handleChangedOperand for details. Hidden behind
4495f757f3fSDimitry Andric // conditional compilation to avoid a compile time regression.
getOrCreate(Metadata & MD)4500b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
4517a6dacacSDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD)) {
4527a6dacacSDimitry Andric     return !N->isResolved() || N->isAlwaysReplaceable()
4537a6dacacSDimitry Andric                ? N->Context.getOrCreateReplaceableUses()
4547a6dacacSDimitry Andric                : nullptr;
4557a6dacacSDimitry Andric   }
4565f757f3fSDimitry Andric   if (auto ArgList = dyn_cast<DIArgList>(&MD))
4575f757f3fSDimitry Andric     return ArgList;
4580b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
4590b57cec5SDimitry Andric }
4600b57cec5SDimitry Andric 
getIfExists(Metadata & MD)4610b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
4627a6dacacSDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD)) {
4637a6dacacSDimitry Andric     return !N->isResolved() || N->isAlwaysReplaceable()
4647a6dacacSDimitry Andric                ? N->Context.getReplaceableUses()
4657a6dacacSDimitry Andric                : nullptr;
4667a6dacacSDimitry Andric   }
4675f757f3fSDimitry Andric   if (auto ArgList = dyn_cast<DIArgList>(&MD))
4685f757f3fSDimitry Andric     return ArgList;
4690b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
4700b57cec5SDimitry Andric }
4710b57cec5SDimitry Andric 
isReplaceable(const Metadata & MD)4720b57cec5SDimitry Andric bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
4730b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
4747a6dacacSDimitry Andric     return !N->isResolved() || N->isAlwaysReplaceable();
4755f757f3fSDimitry Andric   return isa<ValueAsMetadata>(&MD) || isa<DIArgList>(&MD);
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric 
getLocalFunctionMetadata(Value * V)4780b57cec5SDimitry Andric static DISubprogram *getLocalFunctionMetadata(Value *V) {
4790b57cec5SDimitry Andric   assert(V && "Expected value");
4800b57cec5SDimitry Andric   if (auto *A = dyn_cast<Argument>(V)) {
4810b57cec5SDimitry Andric     if (auto *Fn = A->getParent())
4820b57cec5SDimitry Andric       return Fn->getSubprogram();
4830b57cec5SDimitry Andric     return nullptr;
4840b57cec5SDimitry Andric   }
4850b57cec5SDimitry Andric 
4860b57cec5SDimitry Andric   if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
4870b57cec5SDimitry Andric     if (auto *Fn = BB->getParent())
4880b57cec5SDimitry Andric       return Fn->getSubprogram();
4890b57cec5SDimitry Andric     return nullptr;
4900b57cec5SDimitry Andric   }
4910b57cec5SDimitry Andric 
4920b57cec5SDimitry Andric   return nullptr;
4930b57cec5SDimitry Andric }
4940b57cec5SDimitry Andric 
get(Value * V)4950b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::get(Value *V) {
4960b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
4970b57cec5SDimitry Andric 
4980b57cec5SDimitry Andric   auto &Context = V->getContext();
4990b57cec5SDimitry Andric   auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
5000b57cec5SDimitry Andric   if (!Entry) {
5010b57cec5SDimitry Andric     assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) &&
5020b57cec5SDimitry Andric            "Expected constant or function-local value");
5030b57cec5SDimitry Andric     assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
5040b57cec5SDimitry Andric     V->IsUsedByMD = true;
5050b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(V))
5060b57cec5SDimitry Andric       Entry = new ConstantAsMetadata(C);
5070b57cec5SDimitry Andric     else
5080b57cec5SDimitry Andric       Entry = new LocalAsMetadata(V);
5090b57cec5SDimitry Andric   }
5100b57cec5SDimitry Andric 
5110b57cec5SDimitry Andric   return Entry;
5120b57cec5SDimitry Andric }
5130b57cec5SDimitry Andric 
getIfExists(Value * V)5140b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) {
5150b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
5160b57cec5SDimitry Andric   return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
5170b57cec5SDimitry Andric }
5180b57cec5SDimitry Andric 
handleDeletion(Value * V)5190b57cec5SDimitry Andric void ValueAsMetadata::handleDeletion(Value *V) {
5200b57cec5SDimitry Andric   assert(V && "Expected valid value");
5210b57cec5SDimitry Andric 
5220b57cec5SDimitry Andric   auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
5230b57cec5SDimitry Andric   auto I = Store.find(V);
5240b57cec5SDimitry Andric   if (I == Store.end())
5250b57cec5SDimitry Andric     return;
5260b57cec5SDimitry Andric 
5270b57cec5SDimitry Andric   // Remove old entry from the map.
5280b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
5290b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
5300b57cec5SDimitry Andric   assert(MD->getValue() == V && "Expected valid mapping");
5310b57cec5SDimitry Andric   Store.erase(I);
5320b57cec5SDimitry Andric 
5330b57cec5SDimitry Andric   // Delete the metadata.
5340b57cec5SDimitry Andric   MD->replaceAllUsesWith(nullptr);
5350b57cec5SDimitry Andric   delete MD;
5360b57cec5SDimitry Andric }
5370b57cec5SDimitry Andric 
handleRAUW(Value * From,Value * To)5380b57cec5SDimitry Andric void ValueAsMetadata::handleRAUW(Value *From, Value *To) {
5390b57cec5SDimitry Andric   assert(From && "Expected valid value");
5400b57cec5SDimitry Andric   assert(To && "Expected valid value");
5410b57cec5SDimitry Andric   assert(From != To && "Expected changed value");
5427a6dacacSDimitry Andric   assert(&From->getContext() == &To->getContext() && "Expected same context");
5430b57cec5SDimitry Andric 
5440b57cec5SDimitry Andric   LLVMContext &Context = From->getType()->getContext();
5450b57cec5SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
5460b57cec5SDimitry Andric   auto I = Store.find(From);
5470b57cec5SDimitry Andric   if (I == Store.end()) {
5480b57cec5SDimitry Andric     assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
5490b57cec5SDimitry Andric     return;
5500b57cec5SDimitry Andric   }
5510b57cec5SDimitry Andric 
5520b57cec5SDimitry Andric   // Remove old entry from the map.
5530b57cec5SDimitry Andric   assert(From->IsUsedByMD && "Expected From to be used by metadata");
5540b57cec5SDimitry Andric   From->IsUsedByMD = false;
5550b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
5560b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
5570b57cec5SDimitry Andric   assert(MD->getValue() == From && "Expected valid mapping");
5580b57cec5SDimitry Andric   Store.erase(I);
5590b57cec5SDimitry Andric 
5600b57cec5SDimitry Andric   if (isa<LocalAsMetadata>(MD)) {
5610b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(To)) {
5620b57cec5SDimitry Andric       // Local became a constant.
5630b57cec5SDimitry Andric       MD->replaceAllUsesWith(ConstantAsMetadata::get(C));
5640b57cec5SDimitry Andric       delete MD;
5650b57cec5SDimitry Andric       return;
5660b57cec5SDimitry Andric     }
5670b57cec5SDimitry Andric     if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) &&
5680b57cec5SDimitry Andric         getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) {
5690b57cec5SDimitry Andric       // DISubprogram changed.
5700b57cec5SDimitry Andric       MD->replaceAllUsesWith(nullptr);
5710b57cec5SDimitry Andric       delete MD;
5720b57cec5SDimitry Andric       return;
5730b57cec5SDimitry Andric     }
5740b57cec5SDimitry Andric   } else if (!isa<Constant>(To)) {
5750b57cec5SDimitry Andric     // Changed to function-local value.
5760b57cec5SDimitry Andric     MD->replaceAllUsesWith(nullptr);
5770b57cec5SDimitry Andric     delete MD;
5780b57cec5SDimitry Andric     return;
5790b57cec5SDimitry Andric   }
5800b57cec5SDimitry Andric 
5810b57cec5SDimitry Andric   auto *&Entry = Store[To];
5820b57cec5SDimitry Andric   if (Entry) {
5830b57cec5SDimitry Andric     // The target already exists.
5840b57cec5SDimitry Andric     MD->replaceAllUsesWith(Entry);
5850b57cec5SDimitry Andric     delete MD;
5860b57cec5SDimitry Andric     return;
5870b57cec5SDimitry Andric   }
5880b57cec5SDimitry Andric 
5890b57cec5SDimitry Andric   // Update MD in place (and update the map entry).
5900b57cec5SDimitry Andric   assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
5910b57cec5SDimitry Andric   To->IsUsedByMD = true;
5920b57cec5SDimitry Andric   MD->V = To;
5930b57cec5SDimitry Andric   Entry = MD;
5940b57cec5SDimitry Andric }
5950b57cec5SDimitry Andric 
5960b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5970b57cec5SDimitry Andric // MDString implementation.
5980b57cec5SDimitry Andric //
5990b57cec5SDimitry Andric 
get(LLVMContext & Context,StringRef Str)6000b57cec5SDimitry Andric MDString *MDString::get(LLVMContext &Context, StringRef Str) {
6010b57cec5SDimitry Andric   auto &Store = Context.pImpl->MDStringCache;
6020b57cec5SDimitry Andric   auto I = Store.try_emplace(Str);
6030b57cec5SDimitry Andric   auto &MapEntry = I.first->getValue();
6040b57cec5SDimitry Andric   if (!I.second)
6050b57cec5SDimitry Andric     return &MapEntry;
6060b57cec5SDimitry Andric   MapEntry.Entry = &*I.first;
6070b57cec5SDimitry Andric   return &MapEntry;
6080b57cec5SDimitry Andric }
6090b57cec5SDimitry Andric 
getString() const6100b57cec5SDimitry Andric StringRef MDString::getString() const {
6110b57cec5SDimitry Andric   assert(Entry && "Expected to find string map entry");
6120b57cec5SDimitry Andric   return Entry->first();
6130b57cec5SDimitry Andric }
6140b57cec5SDimitry Andric 
6150b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
6160b57cec5SDimitry Andric // MDNode implementation.
6170b57cec5SDimitry Andric //
6180b57cec5SDimitry Andric 
6190b57cec5SDimitry Andric // Assert that the MDNode types will not be unaligned by the objects
6200b57cec5SDimitry Andric // prepended to them.
6210b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
6220b57cec5SDimitry Andric   static_assert(                                                               \
6230b57cec5SDimitry Andric       alignof(uint64_t) >= alignof(CLASS),                                     \
6240b57cec5SDimitry Andric       "Alignment is insufficient after objects prepended to " #CLASS);
6250b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
6260b57cec5SDimitry Andric 
operator new(size_t Size,size_t NumOps,StorageType Storage)62781ad6265SDimitry Andric void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
6280b57cec5SDimitry Andric   // uint64_t is the most aligned type we need support (ensured by static_assert
6290b57cec5SDimitry Andric   // above)
63081ad6265SDimitry Andric   size_t AllocSize =
63181ad6265SDimitry Andric       alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
63281ad6265SDimitry Andric   char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
63381ad6265SDimitry Andric   Header *H = new (Mem + AllocSize - sizeof(Header)) Header(NumOps, Storage);
63481ad6265SDimitry Andric   return reinterpret_cast<void *>(H + 1);
6350b57cec5SDimitry Andric }
6360b57cec5SDimitry Andric 
operator delete(void * N)63781ad6265SDimitry Andric void MDNode::operator delete(void *N) {
63881ad6265SDimitry Andric   Header *H = reinterpret_cast<Header *>(N) - 1;
63981ad6265SDimitry Andric   void *Mem = H->getAllocation();
64081ad6265SDimitry Andric   H->~Header();
64181ad6265SDimitry Andric   ::operator delete(Mem);
6420b57cec5SDimitry Andric }
6430b57cec5SDimitry Andric 
MDNode(LLVMContext & Context,unsigned ID,StorageType Storage,ArrayRef<Metadata * > Ops1,ArrayRef<Metadata * > Ops2)6440b57cec5SDimitry Andric MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
6450b57cec5SDimitry Andric                ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2)
64681ad6265SDimitry Andric     : Metadata(ID, Storage), Context(Context) {
6470b57cec5SDimitry Andric   unsigned Op = 0;
6480b57cec5SDimitry Andric   for (Metadata *MD : Ops1)
6490b57cec5SDimitry Andric     setOperand(Op++, MD);
6500b57cec5SDimitry Andric   for (Metadata *MD : Ops2)
6510b57cec5SDimitry Andric     setOperand(Op++, MD);
6520b57cec5SDimitry Andric 
6530b57cec5SDimitry Andric   if (!isUniqued())
6540b57cec5SDimitry Andric     return;
6550b57cec5SDimitry Andric 
6560b57cec5SDimitry Andric   // Count the unresolved operands.  If there are any, RAUW support will be
6570b57cec5SDimitry Andric   // added lazily on first reference.
6580b57cec5SDimitry Andric   countUnresolvedOperands();
6590b57cec5SDimitry Andric }
6600b57cec5SDimitry Andric 
clone() const6610b57cec5SDimitry Andric TempMDNode MDNode::clone() const {
6620b57cec5SDimitry Andric   switch (getMetadataID()) {
6630b57cec5SDimitry Andric   default:
6640b57cec5SDimitry Andric     llvm_unreachable("Invalid MDNode subclass");
6650b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
6660b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
6670b57cec5SDimitry Andric     return cast<CLASS>(this)->cloneImpl();
6680b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
6690b57cec5SDimitry Andric   }
6700b57cec5SDimitry Andric }
6710b57cec5SDimitry Andric 
Header(size_t NumOps,StorageType Storage)67281ad6265SDimitry Andric MDNode::Header::Header(size_t NumOps, StorageType Storage) {
67381ad6265SDimitry Andric   IsLarge = isLarge(NumOps);
67481ad6265SDimitry Andric   IsResizable = isResizable(Storage);
67581ad6265SDimitry Andric   SmallSize = getSmallSize(NumOps, IsResizable, IsLarge);
67681ad6265SDimitry Andric   if (IsLarge) {
67781ad6265SDimitry Andric     SmallNumOps = 0;
67881ad6265SDimitry Andric     new (getLargePtr()) LargeStorageVector();
67981ad6265SDimitry Andric     getLarge().resize(NumOps);
68081ad6265SDimitry Andric     return;
68181ad6265SDimitry Andric   }
68281ad6265SDimitry Andric   SmallNumOps = NumOps;
68381ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this) - SmallSize;
68481ad6265SDimitry Andric   for (MDOperand *E = O + SmallSize; O != E;)
68581ad6265SDimitry Andric     (void)new (O++) MDOperand();
68681ad6265SDimitry Andric }
68781ad6265SDimitry Andric 
~Header()68881ad6265SDimitry Andric MDNode::Header::~Header() {
68981ad6265SDimitry Andric   if (IsLarge) {
69081ad6265SDimitry Andric     getLarge().~LargeStorageVector();
69181ad6265SDimitry Andric     return;
69281ad6265SDimitry Andric   }
69381ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this);
69481ad6265SDimitry Andric   for (MDOperand *E = O - SmallSize; O != E; --O)
69581ad6265SDimitry Andric     (void)(O - 1)->~MDOperand();
69681ad6265SDimitry Andric }
69781ad6265SDimitry Andric 
getSmallPtr()69881ad6265SDimitry Andric void *MDNode::Header::getSmallPtr() {
69981ad6265SDimitry Andric   static_assert(alignof(MDOperand) <= alignof(Header),
70081ad6265SDimitry Andric                 "MDOperand too strongly aligned");
70181ad6265SDimitry Andric   return reinterpret_cast<char *>(const_cast<Header *>(this)) -
70281ad6265SDimitry Andric          sizeof(MDOperand) * SmallSize;
70381ad6265SDimitry Andric }
70481ad6265SDimitry Andric 
resize(size_t NumOps)70581ad6265SDimitry Andric void MDNode::Header::resize(size_t NumOps) {
70681ad6265SDimitry Andric   assert(IsResizable && "Node is not resizable");
70781ad6265SDimitry Andric   if (operands().size() == NumOps)
70881ad6265SDimitry Andric     return;
70981ad6265SDimitry Andric 
71081ad6265SDimitry Andric   if (IsLarge)
71181ad6265SDimitry Andric     getLarge().resize(NumOps);
71281ad6265SDimitry Andric   else if (NumOps <= SmallSize)
71381ad6265SDimitry Andric     resizeSmall(NumOps);
71481ad6265SDimitry Andric   else
71581ad6265SDimitry Andric     resizeSmallToLarge(NumOps);
71681ad6265SDimitry Andric }
71781ad6265SDimitry Andric 
resizeSmall(size_t NumOps)71881ad6265SDimitry Andric void MDNode::Header::resizeSmall(size_t NumOps) {
71981ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
72081ad6265SDimitry Andric   assert(NumOps <= SmallSize && "NumOps too large for small resize");
72181ad6265SDimitry Andric 
72281ad6265SDimitry Andric   MutableArrayRef<MDOperand> ExistingOps = operands();
72381ad6265SDimitry Andric   assert(NumOps != ExistingOps.size() && "Expected a different size");
72481ad6265SDimitry Andric 
72581ad6265SDimitry Andric   int NumNew = (int)NumOps - (int)ExistingOps.size();
72681ad6265SDimitry Andric   MDOperand *O = ExistingOps.end();
72781ad6265SDimitry Andric   for (int I = 0, E = NumNew; I < E; ++I)
72881ad6265SDimitry Andric     (O++)->reset();
72981ad6265SDimitry Andric   for (int I = 0, E = NumNew; I > E; --I)
73081ad6265SDimitry Andric     (--O)->reset();
73181ad6265SDimitry Andric   SmallNumOps = NumOps;
73281ad6265SDimitry Andric   assert(O == operands().end() && "Operands not (un)initialized until the end");
73381ad6265SDimitry Andric }
73481ad6265SDimitry Andric 
resizeSmallToLarge(size_t NumOps)73581ad6265SDimitry Andric void MDNode::Header::resizeSmallToLarge(size_t NumOps) {
73681ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
73781ad6265SDimitry Andric   assert(NumOps > SmallSize && "Expected NumOps to be larger than allocation");
73881ad6265SDimitry Andric   LargeStorageVector NewOps;
73981ad6265SDimitry Andric   NewOps.resize(NumOps);
74081ad6265SDimitry Andric   llvm::move(operands(), NewOps.begin());
74181ad6265SDimitry Andric   resizeSmall(0);
74281ad6265SDimitry Andric   new (getLargePtr()) LargeStorageVector(std::move(NewOps));
74381ad6265SDimitry Andric   IsLarge = true;
74481ad6265SDimitry Andric }
74581ad6265SDimitry Andric 
isOperandUnresolved(Metadata * Op)7460b57cec5SDimitry Andric static bool isOperandUnresolved(Metadata *Op) {
7470b57cec5SDimitry Andric   if (auto *N = dyn_cast_or_null<MDNode>(Op))
7480b57cec5SDimitry Andric     return !N->isResolved();
7490b57cec5SDimitry Andric   return false;
7500b57cec5SDimitry Andric }
7510b57cec5SDimitry Andric 
countUnresolvedOperands()7520b57cec5SDimitry Andric void MDNode::countUnresolvedOperands() {
75381ad6265SDimitry Andric   assert(getNumUnresolved() == 0 && "Expected unresolved ops to be uncounted");
7540b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
75581ad6265SDimitry Andric   setNumUnresolved(count_if(operands(), isOperandUnresolved));
7560b57cec5SDimitry Andric }
7570b57cec5SDimitry Andric 
makeUniqued()7580b57cec5SDimitry Andric void MDNode::makeUniqued() {
7590b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
7600b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7610b57cec5SDimitry Andric 
7620b57cec5SDimitry Andric   // Enable uniquing callbacks.
7630b57cec5SDimitry Andric   for (auto &Op : mutable_operands())
7640b57cec5SDimitry Andric     Op.reset(Op.get(), this);
7650b57cec5SDimitry Andric 
7660b57cec5SDimitry Andric   // Make this 'uniqued'.
7670b57cec5SDimitry Andric   Storage = Uniqued;
7680b57cec5SDimitry Andric   countUnresolvedOperands();
76981ad6265SDimitry Andric   if (!getNumUnresolved()) {
7700b57cec5SDimitry Andric     dropReplaceableUses();
7710b57cec5SDimitry Andric     assert(isResolved() && "Expected this to be resolved");
7720b57cec5SDimitry Andric   }
7730b57cec5SDimitry Andric 
7740b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
7750b57cec5SDimitry Andric }
7760b57cec5SDimitry Andric 
makeDistinct()7770b57cec5SDimitry Andric void MDNode::makeDistinct() {
7780b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
7790b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7800b57cec5SDimitry Andric 
7810b57cec5SDimitry Andric   // Drop RAUW support and store as a distinct node.
7820b57cec5SDimitry Andric   dropReplaceableUses();
7830b57cec5SDimitry Andric   storeDistinctInContext();
7840b57cec5SDimitry Andric 
7850b57cec5SDimitry Andric   assert(isDistinct() && "Expected this to be distinct");
7860b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
7870b57cec5SDimitry Andric }
7880b57cec5SDimitry Andric 
resolve()7890b57cec5SDimitry Andric void MDNode::resolve() {
7900b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
7910b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7920b57cec5SDimitry Andric 
79381ad6265SDimitry Andric   setNumUnresolved(0);
7940b57cec5SDimitry Andric   dropReplaceableUses();
7950b57cec5SDimitry Andric 
7960b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
7970b57cec5SDimitry Andric }
7980b57cec5SDimitry Andric 
dropReplaceableUses()7990b57cec5SDimitry Andric void MDNode::dropReplaceableUses() {
80081ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved operand");
8010b57cec5SDimitry Andric 
8020b57cec5SDimitry Andric   // Drop any RAUW support.
8030b57cec5SDimitry Andric   if (Context.hasReplaceableUses())
8040b57cec5SDimitry Andric     Context.takeReplaceableUses()->resolveAllUses();
8050b57cec5SDimitry Andric }
8060b57cec5SDimitry Andric 
resolveAfterOperandChange(Metadata * Old,Metadata * New)8070b57cec5SDimitry Andric void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
8080b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
80981ad6265SDimitry Andric   assert(getNumUnresolved() != 0 && "Expected unresolved operands");
8100b57cec5SDimitry Andric 
8110b57cec5SDimitry Andric   // Check if an operand was resolved.
8120b57cec5SDimitry Andric   if (!isOperandUnresolved(Old)) {
8130b57cec5SDimitry Andric     if (isOperandUnresolved(New))
8140b57cec5SDimitry Andric       // An operand was un-resolved!
81581ad6265SDimitry Andric       setNumUnresolved(getNumUnresolved() + 1);
8160b57cec5SDimitry Andric   } else if (!isOperandUnresolved(New))
8170b57cec5SDimitry Andric     decrementUnresolvedOperandCount();
8180b57cec5SDimitry Andric }
8190b57cec5SDimitry Andric 
decrementUnresolvedOperandCount()8200b57cec5SDimitry Andric void MDNode::decrementUnresolvedOperandCount() {
8210b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
8220b57cec5SDimitry Andric   if (isTemporary())
8230b57cec5SDimitry Andric     return;
8240b57cec5SDimitry Andric 
8250b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
82681ad6265SDimitry Andric   setNumUnresolved(getNumUnresolved() - 1);
82781ad6265SDimitry Andric   if (getNumUnresolved())
8280b57cec5SDimitry Andric     return;
8290b57cec5SDimitry Andric 
8300b57cec5SDimitry Andric   // Last unresolved operand has just been resolved.
8310b57cec5SDimitry Andric   dropReplaceableUses();
8320b57cec5SDimitry Andric   assert(isResolved() && "Expected this to become resolved");
8330b57cec5SDimitry Andric }
8340b57cec5SDimitry Andric 
resolveCycles()8350b57cec5SDimitry Andric void MDNode::resolveCycles() {
8360b57cec5SDimitry Andric   if (isResolved())
8370b57cec5SDimitry Andric     return;
8380b57cec5SDimitry Andric 
8390b57cec5SDimitry Andric   // Resolve this node immediately.
8400b57cec5SDimitry Andric   resolve();
8410b57cec5SDimitry Andric 
8420b57cec5SDimitry Andric   // Resolve all operands.
8430b57cec5SDimitry Andric   for (const auto &Op : operands()) {
8440b57cec5SDimitry Andric     auto *N = dyn_cast_or_null<MDNode>(Op);
8450b57cec5SDimitry Andric     if (!N)
8460b57cec5SDimitry Andric       continue;
8470b57cec5SDimitry Andric 
8480b57cec5SDimitry Andric     assert(!N->isTemporary() &&
8490b57cec5SDimitry Andric            "Expected all forward declarations to be resolved");
8500b57cec5SDimitry Andric     if (!N->isResolved())
8510b57cec5SDimitry Andric       N->resolveCycles();
8520b57cec5SDimitry Andric   }
8530b57cec5SDimitry Andric }
8540b57cec5SDimitry Andric 
hasSelfReference(MDNode * N)8550b57cec5SDimitry Andric static bool hasSelfReference(MDNode *N) {
856e8d8bef9SDimitry Andric   return llvm::is_contained(N->operands(), N);
8570b57cec5SDimitry Andric }
8580b57cec5SDimitry Andric 
replaceWithPermanentImpl()8590b57cec5SDimitry Andric MDNode *MDNode::replaceWithPermanentImpl() {
8600b57cec5SDimitry Andric   switch (getMetadataID()) {
8610b57cec5SDimitry Andric   default:
8620b57cec5SDimitry Andric     // If this type isn't uniquable, replace with a distinct node.
8630b57cec5SDimitry Andric     return replaceWithDistinctImpl();
8640b57cec5SDimitry Andric 
8650b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
8660b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
8670b57cec5SDimitry Andric     break;
8680b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
8690b57cec5SDimitry Andric   }
8700b57cec5SDimitry Andric 
8710b57cec5SDimitry Andric   // Even if this type is uniquable, self-references have to be distinct.
8720b57cec5SDimitry Andric   if (hasSelfReference(this))
8730b57cec5SDimitry Andric     return replaceWithDistinctImpl();
8740b57cec5SDimitry Andric   return replaceWithUniquedImpl();
8750b57cec5SDimitry Andric }
8760b57cec5SDimitry Andric 
replaceWithUniquedImpl()8770b57cec5SDimitry Andric MDNode *MDNode::replaceWithUniquedImpl() {
8780b57cec5SDimitry Andric   // Try to uniquify in place.
8790b57cec5SDimitry Andric   MDNode *UniquedNode = uniquify();
8800b57cec5SDimitry Andric 
8810b57cec5SDimitry Andric   if (UniquedNode == this) {
8820b57cec5SDimitry Andric     makeUniqued();
8830b57cec5SDimitry Andric     return this;
8840b57cec5SDimitry Andric   }
8850b57cec5SDimitry Andric 
8860b57cec5SDimitry Andric   // Collision, so RAUW instead.
8870b57cec5SDimitry Andric   replaceAllUsesWith(UniquedNode);
8880b57cec5SDimitry Andric   deleteAsSubclass();
8890b57cec5SDimitry Andric   return UniquedNode;
8900b57cec5SDimitry Andric }
8910b57cec5SDimitry Andric 
replaceWithDistinctImpl()8920b57cec5SDimitry Andric MDNode *MDNode::replaceWithDistinctImpl() {
8930b57cec5SDimitry Andric   makeDistinct();
8940b57cec5SDimitry Andric   return this;
8950b57cec5SDimitry Andric }
8960b57cec5SDimitry Andric 
recalculateHash()8970b57cec5SDimitry Andric void MDTuple::recalculateHash() {
8980b57cec5SDimitry Andric   setHash(MDTupleInfo::KeyTy::calculateHash(this));
8990b57cec5SDimitry Andric }
9000b57cec5SDimitry Andric 
dropAllReferences()9010b57cec5SDimitry Andric void MDNode::dropAllReferences() {
90281ad6265SDimitry Andric   for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
9030b57cec5SDimitry Andric     setOperand(I, nullptr);
9040b57cec5SDimitry Andric   if (Context.hasReplaceableUses()) {
9050b57cec5SDimitry Andric     Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
9060b57cec5SDimitry Andric     (void)Context.takeReplaceableUses();
9070b57cec5SDimitry Andric   }
9080b57cec5SDimitry Andric }
9090b57cec5SDimitry Andric 
handleChangedOperand(void * Ref,Metadata * New)9100b57cec5SDimitry Andric void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
9110b57cec5SDimitry Andric   unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
9120b57cec5SDimitry Andric   assert(Op < getNumOperands() && "Expected valid operand");
9130b57cec5SDimitry Andric 
9140b57cec5SDimitry Andric   if (!isUniqued()) {
9150b57cec5SDimitry Andric     // This node is not uniqued.  Just set the operand and be done with it.
9160b57cec5SDimitry Andric     setOperand(Op, New);
9170b57cec5SDimitry Andric     return;
9180b57cec5SDimitry Andric   }
9190b57cec5SDimitry Andric 
9200b57cec5SDimitry Andric   // This node is uniqued.
9210b57cec5SDimitry Andric   eraseFromStore();
9220b57cec5SDimitry Andric 
9230b57cec5SDimitry Andric   Metadata *Old = getOperand(Op);
9240b57cec5SDimitry Andric   setOperand(Op, New);
9250b57cec5SDimitry Andric 
9260b57cec5SDimitry Andric   // Drop uniquing for self-reference cycles and deleted constants.
9270b57cec5SDimitry Andric   if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
9280b57cec5SDimitry Andric     if (!isResolved())
9290b57cec5SDimitry Andric       resolve();
9300b57cec5SDimitry Andric     storeDistinctInContext();
9310b57cec5SDimitry Andric     return;
9320b57cec5SDimitry Andric   }
9330b57cec5SDimitry Andric 
9340b57cec5SDimitry Andric   // Re-unique the node.
9350b57cec5SDimitry Andric   auto *Uniqued = uniquify();
9360b57cec5SDimitry Andric   if (Uniqued == this) {
9370b57cec5SDimitry Andric     if (!isResolved())
9380b57cec5SDimitry Andric       resolveAfterOperandChange(Old, New);
9390b57cec5SDimitry Andric     return;
9400b57cec5SDimitry Andric   }
9410b57cec5SDimitry Andric 
9420b57cec5SDimitry Andric   // Collision.
9430b57cec5SDimitry Andric   if (!isResolved()) {
9440b57cec5SDimitry Andric     // Still unresolved, so RAUW.
9450b57cec5SDimitry Andric     //
9460b57cec5SDimitry Andric     // First, clear out all operands to prevent any recursion (similar to
9470b57cec5SDimitry Andric     // dropAllReferences(), but we still need the use-list).
9480b57cec5SDimitry Andric     for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
9490b57cec5SDimitry Andric       setOperand(O, nullptr);
9500b57cec5SDimitry Andric     if (Context.hasReplaceableUses())
9510b57cec5SDimitry Andric       Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
9520b57cec5SDimitry Andric     deleteAsSubclass();
9530b57cec5SDimitry Andric     return;
9540b57cec5SDimitry Andric   }
9550b57cec5SDimitry Andric 
9560b57cec5SDimitry Andric   // Store in non-uniqued form if RAUW isn't possible.
9570b57cec5SDimitry Andric   storeDistinctInContext();
9580b57cec5SDimitry Andric }
9590b57cec5SDimitry Andric 
deleteAsSubclass()9600b57cec5SDimitry Andric void MDNode::deleteAsSubclass() {
9610b57cec5SDimitry Andric   switch (getMetadataID()) {
9620b57cec5SDimitry Andric   default:
9630b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
9640b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
9650b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
9660b57cec5SDimitry Andric     delete cast<CLASS>(this);                                                  \
9670b57cec5SDimitry Andric     break;
9680b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9690b57cec5SDimitry Andric   }
9700b57cec5SDimitry Andric }
9710b57cec5SDimitry Andric 
9720b57cec5SDimitry Andric template <class T, class InfoT>
uniquifyImpl(T * N,DenseSet<T *,InfoT> & Store)9730b57cec5SDimitry Andric static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) {
9740b57cec5SDimitry Andric   if (T *U = getUniqued(Store, N))
9750b57cec5SDimitry Andric     return U;
9760b57cec5SDimitry Andric 
9770b57cec5SDimitry Andric   Store.insert(N);
9780b57cec5SDimitry Andric   return N;
9790b57cec5SDimitry Andric }
9800b57cec5SDimitry Andric 
9810b57cec5SDimitry Andric template <class NodeTy> struct MDNode::HasCachedHash {
9820b57cec5SDimitry Andric   using Yes = char[1];
9830b57cec5SDimitry Andric   using No = char[2];
9840b57cec5SDimitry Andric   template <class U, U Val> struct SFINAE {};
9850b57cec5SDimitry Andric 
9860b57cec5SDimitry Andric   template <class U>
9870b57cec5SDimitry Andric   static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *);
9880b57cec5SDimitry Andric   template <class U> static No &check(...);
9890b57cec5SDimitry Andric 
9900b57cec5SDimitry Andric   static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes);
9910b57cec5SDimitry Andric };
9920b57cec5SDimitry Andric 
uniquify()9930b57cec5SDimitry Andric MDNode *MDNode::uniquify() {
9940b57cec5SDimitry Andric   assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
9950b57cec5SDimitry Andric 
9960b57cec5SDimitry Andric   // Try to insert into uniquing store.
9970b57cec5SDimitry Andric   switch (getMetadataID()) {
9980b57cec5SDimitry Andric   default:
9990b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
10000b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
10010b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
10020b57cec5SDimitry Andric     CLASS *SubclassThis = cast<CLASS>(this);                                   \
10030b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value>                  \
10040b57cec5SDimitry Andric         ShouldRecalculateHash;                                                 \
10050b57cec5SDimitry Andric     dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash);              \
10060b57cec5SDimitry Andric     return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s);           \
10070b57cec5SDimitry Andric   }
10080b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
10090b57cec5SDimitry Andric   }
10100b57cec5SDimitry Andric }
10110b57cec5SDimitry Andric 
eraseFromStore()10120b57cec5SDimitry Andric void MDNode::eraseFromStore() {
10130b57cec5SDimitry Andric   switch (getMetadataID()) {
10140b57cec5SDimitry Andric   default:
10150b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
10160b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
10170b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
10180b57cec5SDimitry Andric     getContext().pImpl->CLASS##s.erase(cast<CLASS>(this));                     \
10190b57cec5SDimitry Andric     break;
10200b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
10210b57cec5SDimitry Andric   }
10220b57cec5SDimitry Andric }
10230b57cec5SDimitry Andric 
getImpl(LLVMContext & Context,ArrayRef<Metadata * > MDs,StorageType Storage,bool ShouldCreate)10240b57cec5SDimitry Andric MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
10250b57cec5SDimitry Andric                           StorageType Storage, bool ShouldCreate) {
10260b57cec5SDimitry Andric   unsigned Hash = 0;
10270b57cec5SDimitry Andric   if (Storage == Uniqued) {
10280b57cec5SDimitry Andric     MDTupleInfo::KeyTy Key(MDs);
10290b57cec5SDimitry Andric     if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
10300b57cec5SDimitry Andric       return N;
10310b57cec5SDimitry Andric     if (!ShouldCreate)
10320b57cec5SDimitry Andric       return nullptr;
10330b57cec5SDimitry Andric     Hash = Key.getHash();
10340b57cec5SDimitry Andric   } else {
10350b57cec5SDimitry Andric     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
10360b57cec5SDimitry Andric   }
10370b57cec5SDimitry Andric 
103881ad6265SDimitry Andric   return storeImpl(new (MDs.size(), Storage)
103981ad6265SDimitry Andric                        MDTuple(Context, Storage, Hash, MDs),
10400b57cec5SDimitry Andric                    Storage, Context.pImpl->MDTuples);
10410b57cec5SDimitry Andric }
10420b57cec5SDimitry Andric 
deleteTemporary(MDNode * N)10430b57cec5SDimitry Andric void MDNode::deleteTemporary(MDNode *N) {
10440b57cec5SDimitry Andric   assert(N->isTemporary() && "Expected temporary node");
10450b57cec5SDimitry Andric   N->replaceAllUsesWith(nullptr);
10460b57cec5SDimitry Andric   N->deleteAsSubclass();
10470b57cec5SDimitry Andric }
10480b57cec5SDimitry Andric 
storeDistinctInContext()10490b57cec5SDimitry Andric void MDNode::storeDistinctInContext() {
10500b57cec5SDimitry Andric   assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
105181ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved nodes");
10520b57cec5SDimitry Andric   Storage = Distinct;
10530b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
10540b57cec5SDimitry Andric 
10550b57cec5SDimitry Andric   // Reset the hash.
10560b57cec5SDimitry Andric   switch (getMetadataID()) {
10570b57cec5SDimitry Andric   default:
10580b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
10590b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
10600b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
10610b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
10620b57cec5SDimitry Andric     dispatchResetHash(cast<CLASS>(this), ShouldResetHash);                     \
10630b57cec5SDimitry Andric     break;                                                                     \
10640b57cec5SDimitry Andric   }
10650b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
10660b57cec5SDimitry Andric   }
10670b57cec5SDimitry Andric 
10680b57cec5SDimitry Andric   getContext().pImpl->DistinctMDNodes.push_back(this);
10690b57cec5SDimitry Andric }
10700b57cec5SDimitry Andric 
replaceOperandWith(unsigned I,Metadata * New)10710b57cec5SDimitry Andric void MDNode::replaceOperandWith(unsigned I, Metadata *New) {
10720b57cec5SDimitry Andric   if (getOperand(I) == New)
10730b57cec5SDimitry Andric     return;
10740b57cec5SDimitry Andric 
10750b57cec5SDimitry Andric   if (!isUniqued()) {
10760b57cec5SDimitry Andric     setOperand(I, New);
10770b57cec5SDimitry Andric     return;
10780b57cec5SDimitry Andric   }
10790b57cec5SDimitry Andric 
10800b57cec5SDimitry Andric   handleChangedOperand(mutable_begin() + I, New);
10810b57cec5SDimitry Andric }
10820b57cec5SDimitry Andric 
setOperand(unsigned I,Metadata * New)10830b57cec5SDimitry Andric void MDNode::setOperand(unsigned I, Metadata *New) {
108481ad6265SDimitry Andric   assert(I < getNumOperands());
10850b57cec5SDimitry Andric   mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
10860b57cec5SDimitry Andric }
10870b57cec5SDimitry Andric 
10880b57cec5SDimitry Andric /// Get a node or a self-reference that looks like it.
10890b57cec5SDimitry Andric ///
10900b57cec5SDimitry Andric /// Special handling for finding self-references, for use by \a
10910b57cec5SDimitry Andric /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
10920b57cec5SDimitry Andric /// when self-referencing nodes were still uniqued.  If the first operand has
10930b57cec5SDimitry Andric /// the same operands as \c Ops, return the first operand instead.
getOrSelfReference(LLVMContext & Context,ArrayRef<Metadata * > Ops)10940b57cec5SDimitry Andric static MDNode *getOrSelfReference(LLVMContext &Context,
10950b57cec5SDimitry Andric                                   ArrayRef<Metadata *> Ops) {
10960b57cec5SDimitry Andric   if (!Ops.empty())
10970b57cec5SDimitry Andric     if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0]))
10980b57cec5SDimitry Andric       if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
10990b57cec5SDimitry Andric         for (unsigned I = 1, E = Ops.size(); I != E; ++I)
11000b57cec5SDimitry Andric           if (Ops[I] != N->getOperand(I))
11010b57cec5SDimitry Andric             return MDNode::get(Context, Ops);
11020b57cec5SDimitry Andric         return N;
11030b57cec5SDimitry Andric       }
11040b57cec5SDimitry Andric 
11050b57cec5SDimitry Andric   return MDNode::get(Context, Ops);
11060b57cec5SDimitry Andric }
11070b57cec5SDimitry Andric 
concatenate(MDNode * A,MDNode * B)11080b57cec5SDimitry Andric MDNode *MDNode::concatenate(MDNode *A, MDNode *B) {
11090b57cec5SDimitry Andric   if (!A)
11100b57cec5SDimitry Andric     return B;
11110b57cec5SDimitry Andric   if (!B)
11120b57cec5SDimitry Andric     return A;
11130b57cec5SDimitry Andric 
11140b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
11150b57cec5SDimitry Andric   MDs.insert(B->op_begin(), B->op_end());
11160b57cec5SDimitry Andric 
11170b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
11180b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
11190b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
11200b57cec5SDimitry Andric }
11210b57cec5SDimitry Andric 
intersect(MDNode * A,MDNode * B)11220b57cec5SDimitry Andric MDNode *MDNode::intersect(MDNode *A, MDNode *B) {
11230b57cec5SDimitry Andric   if (!A || !B)
11240b57cec5SDimitry Andric     return nullptr;
11250b57cec5SDimitry Andric 
11260b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
11270b57cec5SDimitry Andric   SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
11285ffd83dbSDimitry Andric   MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); });
11290b57cec5SDimitry Andric 
11300b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
11310b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
11320b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
11330b57cec5SDimitry Andric }
11340b57cec5SDimitry Andric 
getMostGenericAliasScope(MDNode * A,MDNode * B)11350b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
11360b57cec5SDimitry Andric   if (!A || !B)
11370b57cec5SDimitry Andric     return nullptr;
11380b57cec5SDimitry Andric 
1139e8d8bef9SDimitry Andric   // Take the intersection of domains then union the scopes
1140e8d8bef9SDimitry Andric   // within those domains
1141e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> ADomains;
1142e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> IntersectDomains;
1143e8d8bef9SDimitry Andric   SmallSetVector<Metadata *, 4> MDs;
1144e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1145e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1146e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1147e8d8bef9SDimitry Andric         ADomains.insert(Domain);
1148e8d8bef9SDimitry Andric 
1149e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : B->operands())
1150e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1151e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1152e8d8bef9SDimitry Andric         if (ADomains.contains(Domain)) {
1153e8d8bef9SDimitry Andric           IntersectDomains.insert(Domain);
1154e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1155e8d8bef9SDimitry Andric         }
1156e8d8bef9SDimitry Andric 
1157e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1158e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1159e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1160e8d8bef9SDimitry Andric         if (IntersectDomains.contains(Domain))
1161e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1162e8d8bef9SDimitry Andric 
1163e8d8bef9SDimitry Andric   return MDs.empty() ? nullptr
1164e8d8bef9SDimitry Andric                      : getOrSelfReference(A->getContext(), MDs.getArrayRef());
11650b57cec5SDimitry Andric }
11660b57cec5SDimitry Andric 
getMostGenericFPMath(MDNode * A,MDNode * B)11670b57cec5SDimitry Andric MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
11680b57cec5SDimitry Andric   if (!A || !B)
11690b57cec5SDimitry Andric     return nullptr;
11700b57cec5SDimitry Andric 
11710b57cec5SDimitry Andric   APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
11720b57cec5SDimitry Andric   APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
11735ffd83dbSDimitry Andric   if (AVal < BVal)
11740b57cec5SDimitry Andric     return A;
11750b57cec5SDimitry Andric   return B;
11760b57cec5SDimitry Andric }
11770b57cec5SDimitry Andric 
117806c3fb27SDimitry Andric // Call instructions with branch weights are only used in SamplePGO as
117906c3fb27SDimitry Andric // documented in
118006c3fb27SDimitry Andric /// https://llvm.org/docs/BranchWeightMetadata.html#callinst).
mergeDirectCallProfMetadata(MDNode * A,MDNode * B,const Instruction * AInstr,const Instruction * BInstr)118106c3fb27SDimitry Andric MDNode *MDNode::mergeDirectCallProfMetadata(MDNode *A, MDNode *B,
118206c3fb27SDimitry Andric                                             const Instruction *AInstr,
118306c3fb27SDimitry Andric                                             const Instruction *BInstr) {
118406c3fb27SDimitry Andric   assert(A && B && AInstr && BInstr && "Caller should guarantee");
118506c3fb27SDimitry Andric   auto &Ctx = AInstr->getContext();
118606c3fb27SDimitry Andric   MDBuilder MDHelper(Ctx);
118706c3fb27SDimitry Andric 
118806c3fb27SDimitry Andric   // LLVM IR verifier verifies !prof metadata has at least 2 operands.
118906c3fb27SDimitry Andric   assert(A->getNumOperands() >= 2 && B->getNumOperands() >= 2 &&
119006c3fb27SDimitry Andric          "!prof annotations should have no less than 2 operands");
119106c3fb27SDimitry Andric   MDString *AMDS = dyn_cast<MDString>(A->getOperand(0));
119206c3fb27SDimitry Andric   MDString *BMDS = dyn_cast<MDString>(B->getOperand(0));
119306c3fb27SDimitry Andric   // LLVM IR verfier verifies first operand is MDString.
119406c3fb27SDimitry Andric   assert(AMDS != nullptr && BMDS != nullptr &&
119506c3fb27SDimitry Andric          "first operand should be a non-null MDString");
119606c3fb27SDimitry Andric   StringRef AProfName = AMDS->getString();
119706c3fb27SDimitry Andric   StringRef BProfName = BMDS->getString();
11980fca6ea1SDimitry Andric   if (AProfName == "branch_weights" && BProfName == "branch_weights") {
11990fca6ea1SDimitry Andric     ConstantInt *AInstrWeight = mdconst::dyn_extract<ConstantInt>(
12000fca6ea1SDimitry Andric         A->getOperand(getBranchWeightOffset(A)));
12010fca6ea1SDimitry Andric     ConstantInt *BInstrWeight = mdconst::dyn_extract<ConstantInt>(
12020fca6ea1SDimitry Andric         B->getOperand(getBranchWeightOffset(B)));
120306c3fb27SDimitry Andric     assert(AInstrWeight && BInstrWeight && "verified by LLVM verifier");
120406c3fb27SDimitry Andric     return MDNode::get(Ctx,
120506c3fb27SDimitry Andric                        {MDHelper.createString("branch_weights"),
120606c3fb27SDimitry Andric                         MDHelper.createConstant(ConstantInt::get(
120706c3fb27SDimitry Andric                             Type::getInt64Ty(Ctx),
120806c3fb27SDimitry Andric                             SaturatingAdd(AInstrWeight->getZExtValue(),
120906c3fb27SDimitry Andric                                           BInstrWeight->getZExtValue())))});
121006c3fb27SDimitry Andric   }
121106c3fb27SDimitry Andric   return nullptr;
121206c3fb27SDimitry Andric }
121306c3fb27SDimitry Andric 
121406c3fb27SDimitry Andric // Pass in both instructions and nodes. Instruction information (e.g.,
121506c3fb27SDimitry Andric // instruction type) helps interpret profiles and make implementation clearer.
getMergedProfMetadata(MDNode * A,MDNode * B,const Instruction * AInstr,const Instruction * BInstr)121606c3fb27SDimitry Andric MDNode *MDNode::getMergedProfMetadata(MDNode *A, MDNode *B,
121706c3fb27SDimitry Andric                                       const Instruction *AInstr,
121806c3fb27SDimitry Andric                                       const Instruction *BInstr) {
121906c3fb27SDimitry Andric   if (!(A && B)) {
122006c3fb27SDimitry Andric     return A ? A : B;
122106c3fb27SDimitry Andric   }
122206c3fb27SDimitry Andric 
122306c3fb27SDimitry Andric   assert(AInstr->getMetadata(LLVMContext::MD_prof) == A &&
122406c3fb27SDimitry Andric          "Caller should guarantee");
122506c3fb27SDimitry Andric   assert(BInstr->getMetadata(LLVMContext::MD_prof) == B &&
122606c3fb27SDimitry Andric          "Caller should guarantee");
122706c3fb27SDimitry Andric 
122806c3fb27SDimitry Andric   const CallInst *ACall = dyn_cast<CallInst>(AInstr);
122906c3fb27SDimitry Andric   const CallInst *BCall = dyn_cast<CallInst>(BInstr);
123006c3fb27SDimitry Andric 
123106c3fb27SDimitry Andric   // Both ACall and BCall are direct callsites.
123206c3fb27SDimitry Andric   if (ACall && BCall && ACall->getCalledFunction() &&
123306c3fb27SDimitry Andric       BCall->getCalledFunction())
123406c3fb27SDimitry Andric     return mergeDirectCallProfMetadata(A, B, AInstr, BInstr);
123506c3fb27SDimitry Andric 
123606c3fb27SDimitry Andric   // The rest of the cases are not implemented but could be added
123706c3fb27SDimitry Andric   // when there are use cases.
123806c3fb27SDimitry Andric   return nullptr;
123906c3fb27SDimitry Andric }
124006c3fb27SDimitry Andric 
isContiguous(const ConstantRange & A,const ConstantRange & B)12410b57cec5SDimitry Andric static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
12420b57cec5SDimitry Andric   return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
12430b57cec5SDimitry Andric }
12440b57cec5SDimitry Andric 
canBeMerged(const ConstantRange & A,const ConstantRange & B)12450b57cec5SDimitry Andric static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
12460b57cec5SDimitry Andric   return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
12470b57cec5SDimitry Andric }
12480b57cec5SDimitry Andric 
tryMergeRange(SmallVectorImpl<ConstantInt * > & EndPoints,ConstantInt * Low,ConstantInt * High)12490b57cec5SDimitry Andric static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints,
12500b57cec5SDimitry Andric                           ConstantInt *Low, ConstantInt *High) {
12510b57cec5SDimitry Andric   ConstantRange NewRange(Low->getValue(), High->getValue());
12520b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
12530b57cec5SDimitry Andric   APInt LB = EndPoints[Size - 2]->getValue();
12540b57cec5SDimitry Andric   APInt LE = EndPoints[Size - 1]->getValue();
12550b57cec5SDimitry Andric   ConstantRange LastRange(LB, LE);
12560b57cec5SDimitry Andric   if (canBeMerged(NewRange, LastRange)) {
12570b57cec5SDimitry Andric     ConstantRange Union = LastRange.unionWith(NewRange);
12580b57cec5SDimitry Andric     Type *Ty = High->getType();
12590b57cec5SDimitry Andric     EndPoints[Size - 2] =
12600b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
12610b57cec5SDimitry Andric     EndPoints[Size - 1] =
12620b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
12630b57cec5SDimitry Andric     return true;
12640b57cec5SDimitry Andric   }
12650b57cec5SDimitry Andric   return false;
12660b57cec5SDimitry Andric }
12670b57cec5SDimitry Andric 
addRange(SmallVectorImpl<ConstantInt * > & EndPoints,ConstantInt * Low,ConstantInt * High)12680b57cec5SDimitry Andric static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints,
12690b57cec5SDimitry Andric                      ConstantInt *Low, ConstantInt *High) {
12700b57cec5SDimitry Andric   if (!EndPoints.empty())
12710b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, Low, High))
12720b57cec5SDimitry Andric       return;
12730b57cec5SDimitry Andric 
12740b57cec5SDimitry Andric   EndPoints.push_back(Low);
12750b57cec5SDimitry Andric   EndPoints.push_back(High);
12760b57cec5SDimitry Andric }
12770b57cec5SDimitry Andric 
getMostGenericRange(MDNode * A,MDNode * B)12780b57cec5SDimitry Andric MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) {
12790b57cec5SDimitry Andric   // Given two ranges, we want to compute the union of the ranges. This
12800b57cec5SDimitry Andric   // is slightly complicated by having to combine the intervals and merge
12810b57cec5SDimitry Andric   // the ones that overlap.
12820b57cec5SDimitry Andric 
12830b57cec5SDimitry Andric   if (!A || !B)
12840b57cec5SDimitry Andric     return nullptr;
12850b57cec5SDimitry Andric 
12860b57cec5SDimitry Andric   if (A == B)
12870b57cec5SDimitry Andric     return A;
12880b57cec5SDimitry Andric 
12890b57cec5SDimitry Andric   // First, walk both lists in order of the lower boundary of each interval.
12900fca6ea1SDimitry Andric   // At each step, try to merge the new interval to the last one we added.
12910b57cec5SDimitry Andric   SmallVector<ConstantInt *, 4> EndPoints;
12920fca6ea1SDimitry Andric   unsigned AI = 0;
12930fca6ea1SDimitry Andric   unsigned BI = 0;
12940fca6ea1SDimitry Andric   unsigned AN = A->getNumOperands() / 2;
12950fca6ea1SDimitry Andric   unsigned BN = B->getNumOperands() / 2;
12960b57cec5SDimitry Andric   while (AI < AN && BI < BN) {
12970b57cec5SDimitry Andric     ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
12980b57cec5SDimitry Andric     ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
12990b57cec5SDimitry Andric 
13000b57cec5SDimitry Andric     if (ALow->getValue().slt(BLow->getValue())) {
13010b57cec5SDimitry Andric       addRange(EndPoints, ALow,
13020b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
13030b57cec5SDimitry Andric       ++AI;
13040b57cec5SDimitry Andric     } else {
13050b57cec5SDimitry Andric       addRange(EndPoints, BLow,
13060b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
13070b57cec5SDimitry Andric       ++BI;
13080b57cec5SDimitry Andric     }
13090b57cec5SDimitry Andric   }
13100b57cec5SDimitry Andric   while (AI < AN) {
13110b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
13120b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
13130b57cec5SDimitry Andric     ++AI;
13140b57cec5SDimitry Andric   }
13150b57cec5SDimitry Andric   while (BI < BN) {
13160b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
13170b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
13180b57cec5SDimitry Andric     ++BI;
13190b57cec5SDimitry Andric   }
13200b57cec5SDimitry Andric 
1321*52418fc2SDimitry Andric   // We haven't handled wrap in the previous merge,
1322*52418fc2SDimitry Andric   // if we have at least 2 ranges (4 endpoints) we have to try to merge
13230b57cec5SDimitry Andric   // the last and first ones.
13240b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
1325*52418fc2SDimitry Andric   if (Size > 2) {
13260b57cec5SDimitry Andric     ConstantInt *FB = EndPoints[0];
13270b57cec5SDimitry Andric     ConstantInt *FE = EndPoints[1];
13280b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, FB, FE)) {
13290b57cec5SDimitry Andric       for (unsigned i = 0; i < Size - 2; ++i) {
13300b57cec5SDimitry Andric         EndPoints[i] = EndPoints[i + 2];
13310b57cec5SDimitry Andric       }
13320b57cec5SDimitry Andric       EndPoints.resize(Size - 2);
13330b57cec5SDimitry Andric     }
13340b57cec5SDimitry Andric   }
13350b57cec5SDimitry Andric 
13360b57cec5SDimitry Andric   // If in the end we have a single range, it is possible that it is now the
13370b57cec5SDimitry Andric   // full range. Just drop the metadata in that case.
13380b57cec5SDimitry Andric   if (EndPoints.size() == 2) {
13390b57cec5SDimitry Andric     ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
13400b57cec5SDimitry Andric     if (Range.isFullSet())
13410b57cec5SDimitry Andric       return nullptr;
13420b57cec5SDimitry Andric   }
13430b57cec5SDimitry Andric 
13440b57cec5SDimitry Andric   SmallVector<Metadata *, 4> MDs;
13450b57cec5SDimitry Andric   MDs.reserve(EndPoints.size());
13460b57cec5SDimitry Andric   for (auto *I : EndPoints)
13470b57cec5SDimitry Andric     MDs.push_back(ConstantAsMetadata::get(I));
13480b57cec5SDimitry Andric   return MDNode::get(A->getContext(), MDs);
13490b57cec5SDimitry Andric }
13500b57cec5SDimitry Andric 
getMostGenericAlignmentOrDereferenceable(MDNode * A,MDNode * B)13510b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) {
13520b57cec5SDimitry Andric   if (!A || !B)
13530b57cec5SDimitry Andric     return nullptr;
13540b57cec5SDimitry Andric 
13550b57cec5SDimitry Andric   ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
13560b57cec5SDimitry Andric   ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
13570b57cec5SDimitry Andric   if (AVal->getZExtValue() < BVal->getZExtValue())
13580b57cec5SDimitry Andric     return A;
13590b57cec5SDimitry Andric   return B;
13600b57cec5SDimitry Andric }
13610b57cec5SDimitry Andric 
13620b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13630b57cec5SDimitry Andric // NamedMDNode implementation.
13640b57cec5SDimitry Andric //
13650b57cec5SDimitry Andric 
getNMDOps(void * Operands)13660b57cec5SDimitry Andric static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) {
13670b57cec5SDimitry Andric   return *(SmallVector<TrackingMDRef, 4> *)Operands;
13680b57cec5SDimitry Andric }
13690b57cec5SDimitry Andric 
NamedMDNode(const Twine & N)13700b57cec5SDimitry Andric NamedMDNode::NamedMDNode(const Twine &N)
13710b57cec5SDimitry Andric     : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
13720b57cec5SDimitry Andric 
~NamedMDNode()13730b57cec5SDimitry Andric NamedMDNode::~NamedMDNode() {
13740b57cec5SDimitry Andric   dropAllReferences();
13750b57cec5SDimitry Andric   delete &getNMDOps(Operands);
13760b57cec5SDimitry Andric }
13770b57cec5SDimitry Andric 
getNumOperands() const13780b57cec5SDimitry Andric unsigned NamedMDNode::getNumOperands() const {
13790b57cec5SDimitry Andric   return (unsigned)getNMDOps(Operands).size();
13800b57cec5SDimitry Andric }
13810b57cec5SDimitry Andric 
getOperand(unsigned i) const13820b57cec5SDimitry Andric MDNode *NamedMDNode::getOperand(unsigned i) const {
13830b57cec5SDimitry Andric   assert(i < getNumOperands() && "Invalid Operand number!");
13840b57cec5SDimitry Andric   auto *N = getNMDOps(Operands)[i].get();
13850b57cec5SDimitry Andric   return cast_or_null<MDNode>(N);
13860b57cec5SDimitry Andric }
13870b57cec5SDimitry Andric 
addOperand(MDNode * M)13880b57cec5SDimitry Andric void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
13890b57cec5SDimitry Andric 
setOperand(unsigned I,MDNode * New)13900b57cec5SDimitry Andric void NamedMDNode::setOperand(unsigned I, MDNode *New) {
13910b57cec5SDimitry Andric   assert(I < getNumOperands() && "Invalid operand number");
13920b57cec5SDimitry Andric   getNMDOps(Operands)[I].reset(New);
13930b57cec5SDimitry Andric }
13940b57cec5SDimitry Andric 
eraseFromParent()13950b57cec5SDimitry Andric void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); }
13960b57cec5SDimitry Andric 
clearOperands()13970b57cec5SDimitry Andric void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
13980b57cec5SDimitry Andric 
getName() const13990b57cec5SDimitry Andric StringRef NamedMDNode::getName() const { return StringRef(Name); }
14000b57cec5SDimitry Andric 
14010b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
14020b57cec5SDimitry Andric // Instruction Metadata method implementations.
14030b57cec5SDimitry Andric //
14040b57cec5SDimitry Andric 
lookup(unsigned ID) const1405e8d8bef9SDimitry Andric MDNode *MDAttachments::lookup(unsigned ID) const {
14060b57cec5SDimitry Andric   for (const auto &A : Attachments)
14070b57cec5SDimitry Andric     if (A.MDKind == ID)
14080b57cec5SDimitry Andric       return A.Node;
14090b57cec5SDimitry Andric   return nullptr;
14100b57cec5SDimitry Andric }
14110b57cec5SDimitry Andric 
get(unsigned ID,SmallVectorImpl<MDNode * > & Result) const1412e8d8bef9SDimitry Andric void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
14130b57cec5SDimitry Andric   for (const auto &A : Attachments)
14140b57cec5SDimitry Andric     if (A.MDKind == ID)
14150b57cec5SDimitry Andric       Result.push_back(A.Node);
14160b57cec5SDimitry Andric }
14170b57cec5SDimitry Andric 
getAll(SmallVectorImpl<std::pair<unsigned,MDNode * >> & Result) const1418e8d8bef9SDimitry Andric void MDAttachments::getAll(
14190b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
14200b57cec5SDimitry Andric   for (const auto &A : Attachments)
14210b57cec5SDimitry Andric     Result.emplace_back(A.MDKind, A.Node);
14220b57cec5SDimitry Andric 
14230b57cec5SDimitry Andric   // Sort the resulting array so it is stable with respect to metadata IDs. We
14240b57cec5SDimitry Andric   // need to preserve the original insertion order though.
1425e8d8bef9SDimitry Andric   if (Result.size() > 1)
14260b57cec5SDimitry Andric     llvm::stable_sort(Result, less_first());
14270b57cec5SDimitry Andric }
14280b57cec5SDimitry Andric 
set(unsigned ID,MDNode * MD)1429e8d8bef9SDimitry Andric void MDAttachments::set(unsigned ID, MDNode *MD) {
1430e8d8bef9SDimitry Andric   erase(ID);
1431e8d8bef9SDimitry Andric   if (MD)
1432e8d8bef9SDimitry Andric     insert(ID, *MD);
1433e8d8bef9SDimitry Andric }
1434e8d8bef9SDimitry Andric 
insert(unsigned ID,MDNode & MD)1435e8d8bef9SDimitry Andric void MDAttachments::insert(unsigned ID, MDNode &MD) {
1436e8d8bef9SDimitry Andric   Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1437e8d8bef9SDimitry Andric }
1438e8d8bef9SDimitry Andric 
erase(unsigned ID)1439e8d8bef9SDimitry Andric bool MDAttachments::erase(unsigned ID) {
1440e8d8bef9SDimitry Andric   if (empty())
1441e8d8bef9SDimitry Andric     return false;
1442e8d8bef9SDimitry Andric 
1443e8d8bef9SDimitry Andric   // Common case is one value.
1444e8d8bef9SDimitry Andric   if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1445e8d8bef9SDimitry Andric     Attachments.pop_back();
1446e8d8bef9SDimitry Andric     return true;
1447e8d8bef9SDimitry Andric   }
1448e8d8bef9SDimitry Andric 
1449e8d8bef9SDimitry Andric   auto OldSize = Attachments.size();
1450e8d8bef9SDimitry Andric   llvm::erase_if(Attachments,
1451e8d8bef9SDimitry Andric                  [ID](const Attachment &A) { return A.MDKind == ID; });
1452e8d8bef9SDimitry Andric   return OldSize != Attachments.size();
1453e8d8bef9SDimitry Andric }
1454e8d8bef9SDimitry Andric 
getMetadata(StringRef Kind) const1455e8d8bef9SDimitry Andric MDNode *Value::getMetadata(StringRef Kind) const {
1456e8d8bef9SDimitry Andric   if (!hasMetadata())
1457e8d8bef9SDimitry Andric     return nullptr;
14585f757f3fSDimitry Andric   unsigned KindID = getContext().getMDKindID(Kind);
14595f757f3fSDimitry Andric   return getMetadataImpl(KindID);
14605f757f3fSDimitry Andric }
14615f757f3fSDimitry Andric 
getMetadataImpl(unsigned KindID) const14625f757f3fSDimitry Andric MDNode *Value::getMetadataImpl(unsigned KindID) const {
14635f757f3fSDimitry Andric   const LLVMContext &Ctx = getContext();
14645f757f3fSDimitry Andric   const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
14655f757f3fSDimitry Andric   return Attachements.lookup(KindID);
1466e8d8bef9SDimitry Andric }
1467e8d8bef9SDimitry Andric 
getMetadata(unsigned KindID,SmallVectorImpl<MDNode * > & MDs) const1468e8d8bef9SDimitry Andric void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1469e8d8bef9SDimitry Andric   if (hasMetadata())
14705f757f3fSDimitry Andric     getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
1471e8d8bef9SDimitry Andric }
1472e8d8bef9SDimitry Andric 
getMetadata(StringRef Kind,SmallVectorImpl<MDNode * > & MDs) const1473e8d8bef9SDimitry Andric void Value::getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const {
1474e8d8bef9SDimitry Andric   if (hasMetadata())
1475e8d8bef9SDimitry Andric     getMetadata(getContext().getMDKindID(Kind), MDs);
1476e8d8bef9SDimitry Andric }
1477e8d8bef9SDimitry Andric 
getAllMetadata(SmallVectorImpl<std::pair<unsigned,MDNode * >> & MDs) const1478e8d8bef9SDimitry Andric void Value::getAllMetadata(
1479e8d8bef9SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1480e8d8bef9SDimitry Andric   if (hasMetadata()) {
1481e8d8bef9SDimitry Andric     assert(getContext().pImpl->ValueMetadata.count(this) &&
1482e8d8bef9SDimitry Andric            "bit out of sync with hash table");
14835f757f3fSDimitry Andric     const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1484e8d8bef9SDimitry Andric     Info.getAll(MDs);
1485e8d8bef9SDimitry Andric   }
1486e8d8bef9SDimitry Andric }
1487e8d8bef9SDimitry Andric 
setMetadata(unsigned KindID,MDNode * Node)1488e8d8bef9SDimitry Andric void Value::setMetadata(unsigned KindID, MDNode *Node) {
1489e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1490e8d8bef9SDimitry Andric 
1491e8d8bef9SDimitry Andric   // Handle the case when we're adding/updating metadata on a value.
1492e8d8bef9SDimitry Andric   if (Node) {
14935f757f3fSDimitry Andric     MDAttachments &Info = getContext().pImpl->ValueMetadata[this];
1494e8d8bef9SDimitry Andric     assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1495e8d8bef9SDimitry Andric     if (Info.empty())
1496e8d8bef9SDimitry Andric       HasMetadata = true;
1497e8d8bef9SDimitry Andric     Info.set(KindID, Node);
1498e8d8bef9SDimitry Andric     return;
1499e8d8bef9SDimitry Andric   }
1500e8d8bef9SDimitry Andric 
1501e8d8bef9SDimitry Andric   // Otherwise, we're removing metadata from an instruction.
1502e8d8bef9SDimitry Andric   assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1503e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1504e8d8bef9SDimitry Andric   if (!HasMetadata)
1505e8d8bef9SDimitry Andric     return; // Nothing to remove!
15065f757f3fSDimitry Andric   MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1507e8d8bef9SDimitry Andric 
1508e8d8bef9SDimitry Andric   // Handle removal of an existing value.
1509e8d8bef9SDimitry Andric   Info.erase(KindID);
1510e8d8bef9SDimitry Andric   if (!Info.empty())
1511e8d8bef9SDimitry Andric     return;
1512e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1513e8d8bef9SDimitry Andric   HasMetadata = false;
1514e8d8bef9SDimitry Andric }
1515e8d8bef9SDimitry Andric 
setMetadata(StringRef Kind,MDNode * Node)1516e8d8bef9SDimitry Andric void Value::setMetadata(StringRef Kind, MDNode *Node) {
1517e8d8bef9SDimitry Andric   if (!Node && !HasMetadata)
1518e8d8bef9SDimitry Andric     return;
1519e8d8bef9SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
1520e8d8bef9SDimitry Andric }
1521e8d8bef9SDimitry Andric 
addMetadata(unsigned KindID,MDNode & MD)1522e8d8bef9SDimitry Andric void Value::addMetadata(unsigned KindID, MDNode &MD) {
1523e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1524e8d8bef9SDimitry Andric   if (!HasMetadata)
1525e8d8bef9SDimitry Andric     HasMetadata = true;
1526e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1527e8d8bef9SDimitry Andric }
1528e8d8bef9SDimitry Andric 
addMetadata(StringRef Kind,MDNode & MD)1529e8d8bef9SDimitry Andric void Value::addMetadata(StringRef Kind, MDNode &MD) {
1530e8d8bef9SDimitry Andric   addMetadata(getContext().getMDKindID(Kind), MD);
1531e8d8bef9SDimitry Andric }
1532e8d8bef9SDimitry Andric 
eraseMetadata(unsigned KindID)1533e8d8bef9SDimitry Andric bool Value::eraseMetadata(unsigned KindID) {
1534e8d8bef9SDimitry Andric   // Nothing to unset.
1535e8d8bef9SDimitry Andric   if (!HasMetadata)
1536e8d8bef9SDimitry Andric     return false;
1537e8d8bef9SDimitry Andric 
15385f757f3fSDimitry Andric   MDAttachments &Store = getContext().pImpl->ValueMetadata.find(this)->second;
1539e8d8bef9SDimitry Andric   bool Changed = Store.erase(KindID);
1540e8d8bef9SDimitry Andric   if (Store.empty())
1541e8d8bef9SDimitry Andric     clearMetadata();
1542e8d8bef9SDimitry Andric   return Changed;
1543e8d8bef9SDimitry Andric }
1544e8d8bef9SDimitry Andric 
eraseMetadataIf(function_ref<bool (unsigned,MDNode *)> Pred)15457a6dacacSDimitry Andric void Value::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
15467a6dacacSDimitry Andric   if (!HasMetadata)
15477a6dacacSDimitry Andric     return;
15487a6dacacSDimitry Andric 
15497a6dacacSDimitry Andric   auto &MetadataStore = getContext().pImpl->ValueMetadata;
15507a6dacacSDimitry Andric   MDAttachments &Info = MetadataStore.find(this)->second;
15517a6dacacSDimitry Andric   assert(!Info.empty() && "bit out of sync with hash table");
15527a6dacacSDimitry Andric   Info.remove_if([Pred](const MDAttachments::Attachment &I) {
15537a6dacacSDimitry Andric     return Pred(I.MDKind, I.Node);
15547a6dacacSDimitry Andric   });
15557a6dacacSDimitry Andric 
15567a6dacacSDimitry Andric   if (Info.empty())
15577a6dacacSDimitry Andric     clearMetadata();
15587a6dacacSDimitry Andric }
15597a6dacacSDimitry Andric 
clearMetadata()1560e8d8bef9SDimitry Andric void Value::clearMetadata() {
1561e8d8bef9SDimitry Andric   if (!HasMetadata)
1562e8d8bef9SDimitry Andric     return;
1563e8d8bef9SDimitry Andric   assert(getContext().pImpl->ValueMetadata.count(this) &&
1564e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1565e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1566e8d8bef9SDimitry Andric   HasMetadata = false;
1567e8d8bef9SDimitry Andric }
1568e8d8bef9SDimitry Andric 
setMetadata(StringRef Kind,MDNode * Node)15690b57cec5SDimitry Andric void Instruction::setMetadata(StringRef Kind, MDNode *Node) {
15700b57cec5SDimitry Andric   if (!Node && !hasMetadata())
15710b57cec5SDimitry Andric     return;
15720b57cec5SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
15730b57cec5SDimitry Andric }
15740b57cec5SDimitry Andric 
getMetadataImpl(StringRef Kind) const15750b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
15765f757f3fSDimitry Andric   const LLVMContext &Ctx = getContext();
15775f757f3fSDimitry Andric   unsigned KindID = Ctx.getMDKindID(Kind);
15785f757f3fSDimitry Andric   if (KindID == LLVMContext::MD_dbg)
15795f757f3fSDimitry Andric     return DbgLoc.getAsMDNode();
15805f757f3fSDimitry Andric   return Value::getMetadata(KindID);
15810b57cec5SDimitry Andric }
15820b57cec5SDimitry Andric 
eraseMetadataIf(function_ref<bool (unsigned,MDNode *)> Pred)15837a6dacacSDimitry Andric void Instruction::eraseMetadataIf(function_ref<bool(unsigned, MDNode *)> Pred) {
15847a6dacacSDimitry Andric   if (DbgLoc && Pred(LLVMContext::MD_dbg, DbgLoc.getAsMDNode()))
15857a6dacacSDimitry Andric     DbgLoc = {};
15867a6dacacSDimitry Andric 
15877a6dacacSDimitry Andric   Value::eraseMetadataIf(Pred);
15887a6dacacSDimitry Andric }
15897a6dacacSDimitry Andric 
dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs)15900b57cec5SDimitry Andric void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) {
1591e8d8bef9SDimitry Andric   if (!Value::hasMetadata())
15920b57cec5SDimitry Andric     return; // Nothing to remove!
15930b57cec5SDimitry Andric 
15940fca6ea1SDimitry Andric   SmallSet<unsigned, 32> KnownSet;
1595e8d8bef9SDimitry Andric   KnownSet.insert(KnownIDs.begin(), KnownIDs.end());
1596e8d8bef9SDimitry Andric 
1597bdd1243dSDimitry Andric   // A DIAssignID attachment is debug metadata, don't drop it.
1598bdd1243dSDimitry Andric   KnownSet.insert(LLVMContext::MD_DIAssignID);
1599bdd1243dSDimitry Andric 
16007a6dacacSDimitry Andric   Value::eraseMetadataIf([&KnownSet](unsigned MDKind, MDNode *Node) {
16017a6dacacSDimitry Andric     return !KnownSet.count(MDKind);
16020b57cec5SDimitry Andric   });
16030b57cec5SDimitry Andric }
16040b57cec5SDimitry Andric 
updateDIAssignIDMapping(DIAssignID * ID)1605bdd1243dSDimitry Andric void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1606bdd1243dSDimitry Andric   auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1607bdd1243dSDimitry Andric   if (const DIAssignID *CurrentID =
1608bdd1243dSDimitry Andric           cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1609bdd1243dSDimitry Andric     // Nothing to do if the ID isn't changing.
1610bdd1243dSDimitry Andric     if (ID == CurrentID)
1611bdd1243dSDimitry Andric       return;
1612bdd1243dSDimitry Andric 
1613bdd1243dSDimitry Andric     // Unmap this instruction from its current ID.
1614bdd1243dSDimitry Andric     auto InstrsIt = IDToInstrs.find(CurrentID);
1615bdd1243dSDimitry Andric     assert(InstrsIt != IDToInstrs.end() &&
1616bdd1243dSDimitry Andric            "Expect existing attachment to be mapped");
1617bdd1243dSDimitry Andric 
1618bdd1243dSDimitry Andric     auto &InstVec = InstrsIt->second;
1619cb14a3feSDimitry Andric     auto *InstIt = llvm::find(InstVec, this);
1620bdd1243dSDimitry Andric     assert(InstIt != InstVec.end() &&
1621bdd1243dSDimitry Andric            "Expect instruction to be mapped to attachment");
1622bdd1243dSDimitry Andric     // The vector contains a ptr to this. If this is the only element in the
1623bdd1243dSDimitry Andric     // vector, remove the ID:vector entry, otherwise just remove the
1624bdd1243dSDimitry Andric     // instruction from the vector.
1625bdd1243dSDimitry Andric     if (InstVec.size() == 1)
1626bdd1243dSDimitry Andric       IDToInstrs.erase(InstrsIt);
1627bdd1243dSDimitry Andric     else
1628bdd1243dSDimitry Andric       InstVec.erase(InstIt);
1629bdd1243dSDimitry Andric   }
1630bdd1243dSDimitry Andric 
1631bdd1243dSDimitry Andric   // Map this instruction to the new ID.
1632bdd1243dSDimitry Andric   if (ID)
1633bdd1243dSDimitry Andric     IDToInstrs[ID].push_back(this);
1634bdd1243dSDimitry Andric }
1635bdd1243dSDimitry Andric 
setMetadata(unsigned KindID,MDNode * Node)16360b57cec5SDimitry Andric void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
16370b57cec5SDimitry Andric   if (!Node && !hasMetadata())
16380b57cec5SDimitry Andric     return;
16390b57cec5SDimitry Andric 
16400b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
16410b57cec5SDimitry Andric   if (KindID == LLVMContext::MD_dbg) {
16420b57cec5SDimitry Andric     DbgLoc = DebugLoc(Node);
16430b57cec5SDimitry Andric     return;
16440b57cec5SDimitry Andric   }
16450b57cec5SDimitry Andric 
1646bdd1243dSDimitry Andric   // Update DIAssignID to Instruction(s) mapping.
1647bdd1243dSDimitry Andric   if (KindID == LLVMContext::MD_DIAssignID) {
1648bdd1243dSDimitry Andric     // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1649bdd1243dSDimitry Andric     // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1650bdd1243dSDimitry Andric     // having a dedicated assert helps make this obvious.
1651bdd1243dSDimitry Andric     assert((!Node || !Node->isTemporary()) &&
1652bdd1243dSDimitry Andric            "Temporary DIAssignIDs are invalid");
1653bdd1243dSDimitry Andric     updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1654bdd1243dSDimitry Andric   }
1655bdd1243dSDimitry Andric 
1656e8d8bef9SDimitry Andric   Value::setMetadata(KindID, Node);
16570b57cec5SDimitry Andric }
16580b57cec5SDimitry Andric 
addAnnotationMetadata(SmallVector<StringRef> Annotations)165906c3fb27SDimitry Andric void Instruction::addAnnotationMetadata(SmallVector<StringRef> Annotations) {
16605f757f3fSDimitry Andric   SmallVector<Metadata *, 4> Names;
16615f757f3fSDimitry Andric   if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
166206c3fb27SDimitry Andric     SmallSetVector<StringRef, 2> AnnotationsSet(Annotations.begin(),
166306c3fb27SDimitry Andric                                                 Annotations.end());
166406c3fb27SDimitry Andric     auto *Tuple = cast<MDTuple>(Existing);
166506c3fb27SDimitry Andric     for (auto &N : Tuple->operands()) {
166606c3fb27SDimitry Andric       if (isa<MDString>(N.get())) {
166706c3fb27SDimitry Andric         Names.push_back(N);
166806c3fb27SDimitry Andric         continue;
166906c3fb27SDimitry Andric       }
167006c3fb27SDimitry Andric       auto *MDAnnotationTuple = cast<MDTuple>(N);
167106c3fb27SDimitry Andric       if (any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](auto &Op) {
167206c3fb27SDimitry Andric             return AnnotationsSet.contains(cast<MDString>(Op)->getString());
167306c3fb27SDimitry Andric           }))
167406c3fb27SDimitry Andric         return;
167506c3fb27SDimitry Andric       Names.push_back(N);
167606c3fb27SDimitry Andric     }
167706c3fb27SDimitry Andric   }
167806c3fb27SDimitry Andric 
16795f757f3fSDimitry Andric   MDBuilder MDB(getContext());
168006c3fb27SDimitry Andric   SmallVector<Metadata *> MDAnnotationStrings;
168106c3fb27SDimitry Andric   for (StringRef Annotation : Annotations)
168206c3fb27SDimitry Andric     MDAnnotationStrings.push_back(MDB.createString(Annotation));
168306c3fb27SDimitry Andric   MDNode *InfoTuple = MDTuple::get(getContext(), MDAnnotationStrings);
168406c3fb27SDimitry Andric   Names.push_back(InfoTuple);
168506c3fb27SDimitry Andric   MDNode *MD = MDTuple::get(getContext(), Names);
168606c3fb27SDimitry Andric   setMetadata(LLVMContext::MD_annotation, MD);
168706c3fb27SDimitry Andric }
168806c3fb27SDimitry Andric 
addAnnotationMetadata(StringRef Name)1689e8d8bef9SDimitry Andric void Instruction::addAnnotationMetadata(StringRef Name) {
1690e8d8bef9SDimitry Andric   SmallVector<Metadata *, 4> Names;
16915f757f3fSDimitry Andric   if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1692e8d8bef9SDimitry Andric     auto *Tuple = cast<MDTuple>(Existing);
1693e8d8bef9SDimitry Andric     for (auto &N : Tuple->operands()) {
169406c3fb27SDimitry Andric       if (isa<MDString>(N.get()) &&
169506c3fb27SDimitry Andric           cast<MDString>(N.get())->getString() == Name)
169606c3fb27SDimitry Andric         return;
1697e8d8bef9SDimitry Andric       Names.push_back(N.get());
1698e8d8bef9SDimitry Andric     }
1699e8d8bef9SDimitry Andric   }
17000b57cec5SDimitry Andric 
17015f757f3fSDimitry Andric   MDBuilder MDB(getContext());
170206c3fb27SDimitry Andric   Names.push_back(MDB.createString(Name));
1703e8d8bef9SDimitry Andric   MDNode *MD = MDTuple::get(getContext(), Names);
1704e8d8bef9SDimitry Andric   setMetadata(LLVMContext::MD_annotation, MD);
17050b57cec5SDimitry Andric }
17060b57cec5SDimitry Andric 
getAAMetadata() const1707349cc55cSDimitry Andric AAMDNodes Instruction::getAAMetadata() const {
1708349cc55cSDimitry Andric   AAMDNodes Result;
1709bdd1243dSDimitry Andric   // Not using Instruction::hasMetadata() because we're not interested in
1710bdd1243dSDimitry Andric   // DebugInfoMetadata.
1711bdd1243dSDimitry Andric   if (Value::hasMetadata()) {
17125f757f3fSDimitry Andric     const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1713bdd1243dSDimitry Andric     Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1714bdd1243dSDimitry Andric     Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1715bdd1243dSDimitry Andric     Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1716bdd1243dSDimitry Andric     Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1717bdd1243dSDimitry Andric   }
1718349cc55cSDimitry Andric   return Result;
1719349cc55cSDimitry Andric }
1720349cc55cSDimitry Andric 
setAAMetadata(const AAMDNodes & N)17210b57cec5SDimitry Andric void Instruction::setAAMetadata(const AAMDNodes &N) {
17220b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1723480093f4SDimitry Andric   setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
17240b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_alias_scope, N.Scope);
17250b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_noalias, N.NoAlias);
17260b57cec5SDimitry Andric }
17270b57cec5SDimitry Andric 
setNoSanitizeMetadata()172806c3fb27SDimitry Andric void Instruction::setNoSanitizeMetadata() {
172906c3fb27SDimitry Andric   setMetadata(llvm::LLVMContext::MD_nosanitize,
173006c3fb27SDimitry Andric               llvm::MDNode::get(getContext(), std::nullopt));
173106c3fb27SDimitry Andric }
173206c3fb27SDimitry Andric 
getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned,MDNode * >> & Result) const17330b57cec5SDimitry Andric void Instruction::getAllMetadataImpl(
17340b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
17350b57cec5SDimitry Andric   Result.clear();
17360b57cec5SDimitry Andric 
17370b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
17380b57cec5SDimitry Andric   if (DbgLoc) {
17390b57cec5SDimitry Andric     Result.push_back(
17400b57cec5SDimitry Andric         std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
17410b57cec5SDimitry Andric   }
1742e8d8bef9SDimitry Andric   Value::getAllMetadata(Result);
17430b57cec5SDimitry Andric }
17440b57cec5SDimitry Andric 
extractProfTotalWeight(uint64_t & TotalVal) const17450b57cec5SDimitry Andric bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const {
1746fe6060f1SDimitry Andric   assert(
1747fe6060f1SDimitry Andric       (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1748fe6060f1SDimitry Andric        getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1749fe6060f1SDimitry Andric        getOpcode() == Instruction::IndirectBr ||
17500b57cec5SDimitry Andric        getOpcode() == Instruction::Switch) &&
17510b57cec5SDimitry Andric       "Looking for branch weights on something besides branch");
17520b57cec5SDimitry Andric 
1753bdd1243dSDimitry Andric   return ::extractProfTotalWeight(*this, TotalVal);
17540b57cec5SDimitry Andric }
17550b57cec5SDimitry Andric 
copyMetadata(const GlobalObject * Other,unsigned Offset)17560b57cec5SDimitry Andric void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) {
17570b57cec5SDimitry Andric   SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
17580b57cec5SDimitry Andric   Other->getAllMetadata(MDs);
17590b57cec5SDimitry Andric   for (auto &MD : MDs) {
17600b57cec5SDimitry Andric     // We need to adjust the type metadata offset.
17610b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_type) {
17620b57cec5SDimitry Andric       auto *OffsetConst = cast<ConstantInt>(
17630b57cec5SDimitry Andric           cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
17640b57cec5SDimitry Andric       Metadata *TypeId = MD.second->getOperand(1);
17650b57cec5SDimitry Andric       auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
17660b57cec5SDimitry Andric           OffsetConst->getType(), OffsetConst->getValue() + Offset));
17670b57cec5SDimitry Andric       addMetadata(LLVMContext::MD_type,
17680b57cec5SDimitry Andric                   *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
17690b57cec5SDimitry Andric       continue;
17700b57cec5SDimitry Andric     }
17710b57cec5SDimitry Andric     // If an offset adjustment was specified we need to modify the DIExpression
17720b57cec5SDimitry Andric     // to prepend the adjustment:
17730b57cec5SDimitry Andric     // !DIExpression(DW_OP_plus, Offset, [original expr])
17740b57cec5SDimitry Andric     auto *Attachment = MD.second;
17750b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
17760b57cec5SDimitry Andric       DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment);
17770b57cec5SDimitry Andric       DIExpression *E = nullptr;
17780b57cec5SDimitry Andric       if (!GV) {
17790b57cec5SDimitry Andric         auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
17800b57cec5SDimitry Andric         GV = GVE->getVariable();
17810b57cec5SDimitry Andric         E = GVE->getExpression();
17820b57cec5SDimitry Andric       }
17830b57cec5SDimitry Andric       ArrayRef<uint64_t> OrigElements;
17840b57cec5SDimitry Andric       if (E)
17850b57cec5SDimitry Andric         OrigElements = E->getElements();
17860b57cec5SDimitry Andric       std::vector<uint64_t> Elements(OrigElements.size() + 2);
17870b57cec5SDimitry Andric       Elements[0] = dwarf::DW_OP_plus_uconst;
17880b57cec5SDimitry Andric       Elements[1] = Offset;
17890b57cec5SDimitry Andric       llvm::copy(OrigElements, Elements.begin() + 2);
17900b57cec5SDimitry Andric       E = DIExpression::get(getContext(), Elements);
17910b57cec5SDimitry Andric       Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
17920b57cec5SDimitry Andric     }
17930b57cec5SDimitry Andric     addMetadata(MD.first, *Attachment);
17940b57cec5SDimitry Andric   }
17950b57cec5SDimitry Andric }
17960b57cec5SDimitry Andric 
addTypeMetadata(unsigned Offset,Metadata * TypeID)17970b57cec5SDimitry Andric void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) {
17980b57cec5SDimitry Andric   addMetadata(
17990b57cec5SDimitry Andric       LLVMContext::MD_type,
18000b57cec5SDimitry Andric       *MDTuple::get(getContext(),
18010b57cec5SDimitry Andric                     {ConstantAsMetadata::get(ConstantInt::get(
18020b57cec5SDimitry Andric                          Type::getInt64Ty(getContext()), Offset)),
18030b57cec5SDimitry Andric                      TypeID}));
18040b57cec5SDimitry Andric }
18050b57cec5SDimitry Andric 
setVCallVisibilityMetadata(VCallVisibility Visibility)18065ffd83dbSDimitry Andric void GlobalObject::setVCallVisibilityMetadata(VCallVisibility Visibility) {
18075ffd83dbSDimitry Andric   // Remove any existing vcall visibility metadata first in case we are
18085ffd83dbSDimitry Andric   // updating.
18095ffd83dbSDimitry Andric   eraseMetadata(LLVMContext::MD_vcall_visibility);
18108bcb0991SDimitry Andric   addMetadata(LLVMContext::MD_vcall_visibility,
18118bcb0991SDimitry Andric               *MDNode::get(getContext(),
18128bcb0991SDimitry Andric                            {ConstantAsMetadata::get(ConstantInt::get(
18138bcb0991SDimitry Andric                                Type::getInt64Ty(getContext()), Visibility))}));
18148bcb0991SDimitry Andric }
18158bcb0991SDimitry Andric 
getVCallVisibility() const18168bcb0991SDimitry Andric GlobalObject::VCallVisibility GlobalObject::getVCallVisibility() const {
18178bcb0991SDimitry Andric   if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
18188bcb0991SDimitry Andric     uint64_t Val = cast<ConstantInt>(
18198bcb0991SDimitry Andric                        cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
18208bcb0991SDimitry Andric                        ->getZExtValue();
18218bcb0991SDimitry Andric     assert(Val <= 2 && "unknown vcall visibility!");
18228bcb0991SDimitry Andric     return (VCallVisibility)Val;
18238bcb0991SDimitry Andric   }
18248bcb0991SDimitry Andric   return VCallVisibility::VCallVisibilityPublic;
18258bcb0991SDimitry Andric }
18268bcb0991SDimitry Andric 
setSubprogram(DISubprogram * SP)18270b57cec5SDimitry Andric void Function::setSubprogram(DISubprogram *SP) {
18280b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_dbg, SP);
18290b57cec5SDimitry Andric }
18300b57cec5SDimitry Andric 
getSubprogram() const18310b57cec5SDimitry Andric DISubprogram *Function::getSubprogram() const {
18320b57cec5SDimitry Andric   return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
18330b57cec5SDimitry Andric }
18340b57cec5SDimitry Andric 
shouldEmitDebugInfoForProfiling() const1835bdd1243dSDimitry Andric bool Function::shouldEmitDebugInfoForProfiling() const {
18360b57cec5SDimitry Andric   if (DISubprogram *SP = getSubprogram()) {
18370b57cec5SDimitry Andric     if (DICompileUnit *CU = SP->getUnit()) {
18380b57cec5SDimitry Andric       return CU->getDebugInfoForProfiling();
18390b57cec5SDimitry Andric     }
18400b57cec5SDimitry Andric   }
18410b57cec5SDimitry Andric   return false;
18420b57cec5SDimitry Andric }
18430b57cec5SDimitry Andric 
addDebugInfo(DIGlobalVariableExpression * GV)18440b57cec5SDimitry Andric void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) {
18450b57cec5SDimitry Andric   addMetadata(LLVMContext::MD_dbg, *GV);
18460b57cec5SDimitry Andric }
18470b57cec5SDimitry Andric 
getDebugInfo(SmallVectorImpl<DIGlobalVariableExpression * > & GVs) const18480b57cec5SDimitry Andric void GlobalVariable::getDebugInfo(
18490b57cec5SDimitry Andric     SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const {
18500b57cec5SDimitry Andric   SmallVector<MDNode *, 1> MDs;
18510b57cec5SDimitry Andric   getMetadata(LLVMContext::MD_dbg, MDs);
18520b57cec5SDimitry Andric   for (MDNode *MD : MDs)
18530b57cec5SDimitry Andric     GVs.push_back(cast<DIGlobalVariableExpression>(MD));
18540b57cec5SDimitry Andric }
1855