xref: /freebsd/contrib/llvm-project/llvm/lib/IR/Metadata.cpp (revision cb14a3fe5122c879eae1fb480ed7ce82a699ddb6)
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 
600b57cec5SDimitry Andric MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
610b57cec5SDimitry Andric     : Value(Ty, MetadataAsValueVal), MD(MD) {
620b57cec5SDimitry Andric   track();
630b57cec5SDimitry Andric }
640b57cec5SDimitry Andric 
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.
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 
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 
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 
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 
1410b57cec5SDimitry Andric void MetadataAsValue::track() {
1420b57cec5SDimitry Andric   if (MD)
1430b57cec5SDimitry Andric     MetadataTracking::track(&MD, *MD, *this);
1440b57cec5SDimitry Andric }
1450b57cec5SDimitry Andric 
1460b57cec5SDimitry Andric void MetadataAsValue::untrack() {
1470b57cec5SDimitry Andric   if (MD)
1480b57cec5SDimitry Andric     MetadataTracking::untrack(MD);
1490b57cec5SDimitry Andric }
1500b57cec5SDimitry Andric 
1515f757f3fSDimitry Andric DPValue *DebugValueUser::getUser() { return static_cast<DPValue *>(this); }
1525f757f3fSDimitry Andric const DPValue *DebugValueUser::getUser() const {
1535f757f3fSDimitry Andric   return static_cast<const DPValue *>(this);
1545f757f3fSDimitry Andric }
1555f757f3fSDimitry Andric void DebugValueUser::handleChangedValue(Metadata *NewMD) {
1565f757f3fSDimitry Andric   getUser()->handleChangedLocation(NewMD);
1575f757f3fSDimitry Andric }
1585f757f3fSDimitry Andric 
1595f757f3fSDimitry Andric void DebugValueUser::trackDebugValue() {
1605f757f3fSDimitry Andric   if (DebugValue)
1615f757f3fSDimitry Andric     MetadataTracking::track(&DebugValue, *DebugValue, *this);
1625f757f3fSDimitry Andric }
1635f757f3fSDimitry Andric 
1645f757f3fSDimitry Andric void DebugValueUser::untrackDebugValue() {
1655f757f3fSDimitry Andric   if (DebugValue)
1665f757f3fSDimitry Andric     MetadataTracking::untrack(DebugValue);
1675f757f3fSDimitry Andric }
1685f757f3fSDimitry Andric 
1695f757f3fSDimitry Andric void DebugValueUser::retrackDebugValue(DebugValueUser &X) {
1705f757f3fSDimitry Andric   assert(DebugValue == X.DebugValue && "Expected values to match");
1715f757f3fSDimitry Andric   if (X.DebugValue) {
1725f757f3fSDimitry Andric     MetadataTracking::retrack(X.DebugValue, DebugValue);
1735f757f3fSDimitry Andric     X.DebugValue = nullptr;
1745f757f3fSDimitry Andric   }
1755f757f3fSDimitry Andric }
1765f757f3fSDimitry Andric 
1770b57cec5SDimitry Andric bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
1780b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
1790b57cec5SDimitry Andric   assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
1800b57cec5SDimitry Andric          "Reference without owner must be direct");
1810b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
1820b57cec5SDimitry Andric     R->addRef(Ref, Owner);
1830b57cec5SDimitry Andric     return true;
1840b57cec5SDimitry Andric   }
1850b57cec5SDimitry Andric   if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
1860b57cec5SDimitry Andric     assert(!PH->Use && "Placeholders can only be used once");
1870b57cec5SDimitry Andric     assert(!Owner && "Unexpected callback to owner");
1880b57cec5SDimitry Andric     PH->Use = static_cast<Metadata **>(Ref);
1890b57cec5SDimitry Andric     return true;
1900b57cec5SDimitry Andric   }
1910b57cec5SDimitry Andric   return false;
1920b57cec5SDimitry Andric }
1930b57cec5SDimitry Andric 
1940b57cec5SDimitry Andric void MetadataTracking::untrack(void *Ref, Metadata &MD) {
1950b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
1960b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
1970b57cec5SDimitry Andric     R->dropRef(Ref);
1980b57cec5SDimitry Andric   else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
1990b57cec5SDimitry Andric     PH->Use = nullptr;
2000b57cec5SDimitry Andric }
2010b57cec5SDimitry Andric 
2020b57cec5SDimitry Andric bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
2030b57cec5SDimitry Andric   assert(Ref && "Expected live reference");
2040b57cec5SDimitry Andric   assert(New && "Expected live reference");
2050b57cec5SDimitry Andric   assert(Ref != New && "Expected change");
2060b57cec5SDimitry Andric   if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
2070b57cec5SDimitry Andric     R->moveRef(Ref, New, MD);
2080b57cec5SDimitry Andric     return true;
2090b57cec5SDimitry Andric   }
2100b57cec5SDimitry Andric   assert(!isa<DistinctMDOperandPlaceholder>(MD) &&
2110b57cec5SDimitry Andric          "Unexpected move of an MDOperand");
2120b57cec5SDimitry Andric   assert(!isReplaceable(MD) &&
2130b57cec5SDimitry Andric          "Expected un-replaceable metadata, since we didn't move a reference");
2140b57cec5SDimitry Andric   return false;
2150b57cec5SDimitry Andric }
2160b57cec5SDimitry Andric 
2170b57cec5SDimitry Andric bool MetadataTracking::isReplaceable(const Metadata &MD) {
2180b57cec5SDimitry Andric   return ReplaceableMetadataImpl::isReplaceable(MD);
2190b57cec5SDimitry Andric }
2200b57cec5SDimitry Andric 
221fe6060f1SDimitry Andric SmallVector<Metadata *> ReplaceableMetadataImpl::getAllArgListUsers() {
222fe6060f1SDimitry Andric   SmallVector<std::pair<OwnerTy, uint64_t> *> MDUsersWithID;
223fe6060f1SDimitry Andric   for (auto Pair : UseMap) {
224fe6060f1SDimitry Andric     OwnerTy Owner = Pair.second.first;
2255f757f3fSDimitry Andric     if (Owner.isNull())
2265f757f3fSDimitry Andric       continue;
22706c3fb27SDimitry Andric     if (!isa<Metadata *>(Owner))
228fe6060f1SDimitry Andric       continue;
22906c3fb27SDimitry Andric     Metadata *OwnerMD = cast<Metadata *>(Owner);
230fe6060f1SDimitry Andric     if (OwnerMD->getMetadataID() == Metadata::DIArgListKind)
231fe6060f1SDimitry Andric       MDUsersWithID.push_back(&UseMap[Pair.first]);
232fe6060f1SDimitry Andric   }
233fe6060f1SDimitry Andric   llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) {
234fe6060f1SDimitry Andric     return UserA->second < UserB->second;
235fe6060f1SDimitry Andric   });
236fe6060f1SDimitry Andric   SmallVector<Metadata *> MDUsers;
237bdd1243dSDimitry Andric   for (auto *UserWithID : MDUsersWithID)
23806c3fb27SDimitry Andric     MDUsers.push_back(cast<Metadata *>(UserWithID->first));
239fe6060f1SDimitry Andric   return MDUsers;
240fe6060f1SDimitry Andric }
241fe6060f1SDimitry Andric 
2425f757f3fSDimitry Andric SmallVector<DPValue *> ReplaceableMetadataImpl::getAllDPValueUsers() {
2435f757f3fSDimitry Andric   SmallVector<std::pair<OwnerTy, uint64_t> *> DPVUsersWithID;
2445f757f3fSDimitry Andric   for (auto Pair : UseMap) {
2455f757f3fSDimitry Andric     OwnerTy Owner = Pair.second.first;
2465f757f3fSDimitry Andric     if (Owner.isNull())
2475f757f3fSDimitry Andric       continue;
2485f757f3fSDimitry Andric     if (!Owner.is<DebugValueUser *>())
2495f757f3fSDimitry Andric       continue;
2505f757f3fSDimitry Andric     DPVUsersWithID.push_back(&UseMap[Pair.first]);
2515f757f3fSDimitry Andric   }
2525f757f3fSDimitry Andric   // Order DPValue users in reverse-creation order. Normal dbg.value users
2535f757f3fSDimitry Andric   // of MetadataAsValues are ordered by their UseList, i.e. reverse order of
2545f757f3fSDimitry Andric   // when they were added: we need to replicate that here. The structure of
2555f757f3fSDimitry Andric   // debug-info output depends on the ordering of intrinsics, thus we need
2565f757f3fSDimitry Andric   // to keep them consistent for comparisons sake.
2575f757f3fSDimitry Andric   llvm::sort(DPVUsersWithID, [](auto UserA, auto UserB) {
2585f757f3fSDimitry Andric     return UserA->second > UserB->second;
2595f757f3fSDimitry Andric   });
2605f757f3fSDimitry Andric   SmallVector<DPValue *> DPVUsers;
2615f757f3fSDimitry Andric   for (auto UserWithID : DPVUsersWithID)
2625f757f3fSDimitry Andric     DPVUsers.push_back(UserWithID->first.get<DebugValueUser *>()->getUser());
2635f757f3fSDimitry Andric   return DPVUsers;
2645f757f3fSDimitry Andric }
2655f757f3fSDimitry Andric 
2660b57cec5SDimitry Andric void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
2670b57cec5SDimitry Andric   bool WasInserted =
2680b57cec5SDimitry Andric       UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
2690b57cec5SDimitry Andric           .second;
2700b57cec5SDimitry Andric   (void)WasInserted;
2710b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
2720b57cec5SDimitry Andric 
2730b57cec5SDimitry Andric   ++NextIndex;
2740b57cec5SDimitry Andric   assert(NextIndex != 0 && "Unexpected overflow");
2750b57cec5SDimitry Andric }
2760b57cec5SDimitry Andric 
2770b57cec5SDimitry Andric void ReplaceableMetadataImpl::dropRef(void *Ref) {
2780b57cec5SDimitry Andric   bool WasErased = UseMap.erase(Ref);
2790b57cec5SDimitry Andric   (void)WasErased;
2800b57cec5SDimitry Andric   assert(WasErased && "Expected to drop a reference");
2810b57cec5SDimitry Andric }
2820b57cec5SDimitry Andric 
2830b57cec5SDimitry Andric void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
2840b57cec5SDimitry Andric                                       const Metadata &MD) {
2850b57cec5SDimitry Andric   auto I = UseMap.find(Ref);
2860b57cec5SDimitry Andric   assert(I != UseMap.end() && "Expected to move a reference");
2870b57cec5SDimitry Andric   auto OwnerAndIndex = I->second;
2880b57cec5SDimitry Andric   UseMap.erase(I);
2890b57cec5SDimitry Andric   bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
2900b57cec5SDimitry Andric   (void)WasInserted;
2910b57cec5SDimitry Andric   assert(WasInserted && "Expected to add a reference");
2920b57cec5SDimitry Andric 
2930b57cec5SDimitry Andric   // Check that the references are direct if there's no owner.
2940b57cec5SDimitry Andric   (void)MD;
2950b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
2960b57cec5SDimitry Andric          "Reference without owner must be direct");
2970b57cec5SDimitry Andric   assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
2980b57cec5SDimitry Andric          "Reference without owner must be direct");
2990b57cec5SDimitry Andric }
3000b57cec5SDimitry Andric 
30181ad6265SDimitry Andric void ReplaceableMetadataImpl::SalvageDebugInfo(const Constant &C) {
30281ad6265SDimitry Andric   if (!C.isUsedByMetadata()) {
30381ad6265SDimitry Andric     return;
30481ad6265SDimitry Andric   }
30581ad6265SDimitry Andric 
30681ad6265SDimitry Andric   LLVMContext &Context = C.getType()->getContext();
30781ad6265SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
30881ad6265SDimitry Andric   auto I = Store.find(&C);
30981ad6265SDimitry Andric   ValueAsMetadata *MD = I->second;
31081ad6265SDimitry Andric   using UseTy =
31181ad6265SDimitry Andric       std::pair<void *, std::pair<MetadataTracking::OwnerTy, uint64_t>>;
31281ad6265SDimitry Andric   // Copy out uses and update value of Constant used by debug info metadata with undef below
31381ad6265SDimitry Andric   SmallVector<UseTy, 8> Uses(MD->UseMap.begin(), MD->UseMap.end());
31481ad6265SDimitry Andric 
31581ad6265SDimitry Andric   for (const auto &Pair : Uses) {
31681ad6265SDimitry Andric     MetadataTracking::OwnerTy Owner = Pair.second.first;
31781ad6265SDimitry Andric     if (!Owner)
31881ad6265SDimitry Andric       continue;
31906c3fb27SDimitry Andric     if (!isa<Metadata *>(Owner))
32081ad6265SDimitry Andric       continue;
32106c3fb27SDimitry Andric     auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
32281ad6265SDimitry Andric     if (!OwnerMD)
32381ad6265SDimitry Andric       continue;
32481ad6265SDimitry Andric     if (isa<DINode>(OwnerMD)) {
32581ad6265SDimitry Andric       OwnerMD->handleChangedOperand(
32681ad6265SDimitry Andric           Pair.first, ValueAsMetadata::get(UndefValue::get(C.getType())));
32781ad6265SDimitry Andric     }
32881ad6265SDimitry Andric   }
32981ad6265SDimitry Andric }
33081ad6265SDimitry Andric 
3310b57cec5SDimitry Andric void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) {
3320b57cec5SDimitry Andric   if (UseMap.empty())
3330b57cec5SDimitry Andric     return;
3340b57cec5SDimitry Andric 
3350b57cec5SDimitry Andric   // Copy out uses since UseMap will get touched below.
3360b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
3370b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
33806c3fb27SDimitry Andric   llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
33906c3fb27SDimitry Andric     return L.second.second < R.second.second;
34006c3fb27SDimitry Andric   });
3410b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
3420b57cec5SDimitry Andric     // Check that this Ref hasn't disappeared after RAUW (when updating a
3430b57cec5SDimitry Andric     // previous Ref).
3440b57cec5SDimitry Andric     if (!UseMap.count(Pair.first))
3450b57cec5SDimitry Andric       continue;
3460b57cec5SDimitry Andric 
3470b57cec5SDimitry Andric     OwnerTy Owner = Pair.second.first;
3480b57cec5SDimitry Andric     if (!Owner) {
3490b57cec5SDimitry Andric       // Update unowned tracking references directly.
3500b57cec5SDimitry Andric       Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
3510b57cec5SDimitry Andric       Ref = MD;
3520b57cec5SDimitry Andric       if (MD)
3530b57cec5SDimitry Andric         MetadataTracking::track(Ref);
3540b57cec5SDimitry Andric       UseMap.erase(Pair.first);
3550b57cec5SDimitry Andric       continue;
3560b57cec5SDimitry Andric     }
3570b57cec5SDimitry Andric 
3580b57cec5SDimitry Andric     // Check for MetadataAsValue.
35906c3fb27SDimitry Andric     if (isa<MetadataAsValue *>(Owner)) {
36006c3fb27SDimitry Andric       cast<MetadataAsValue *>(Owner)->handleChangedMetadata(MD);
3610b57cec5SDimitry Andric       continue;
3620b57cec5SDimitry Andric     }
3630b57cec5SDimitry Andric 
3645f757f3fSDimitry Andric     if (Owner.is<DebugValueUser *>()) {
3655f757f3fSDimitry Andric       Owner.get<DebugValueUser *>()->getUser()->handleChangedLocation(MD);
3665f757f3fSDimitry Andric       continue;
3675f757f3fSDimitry Andric     }
3685f757f3fSDimitry Andric 
3690b57cec5SDimitry Andric     // There's a Metadata owner -- dispatch.
37006c3fb27SDimitry Andric     Metadata *OwnerMD = cast<Metadata *>(Owner);
3710b57cec5SDimitry Andric     switch (OwnerMD->getMetadataID()) {
3720b57cec5SDimitry Andric #define HANDLE_METADATA_LEAF(CLASS)                                            \
3730b57cec5SDimitry Andric   case Metadata::CLASS##Kind:                                                  \
3740b57cec5SDimitry Andric     cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD);                \
3750b57cec5SDimitry Andric     continue;
3760b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
3770b57cec5SDimitry Andric     default:
3780b57cec5SDimitry Andric       llvm_unreachable("Invalid metadata subclass");
3790b57cec5SDimitry Andric     }
3800b57cec5SDimitry Andric   }
3810b57cec5SDimitry Andric   assert(UseMap.empty() && "Expected all uses to be replaced");
3820b57cec5SDimitry Andric }
3830b57cec5SDimitry Andric 
3840b57cec5SDimitry Andric void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) {
3850b57cec5SDimitry Andric   if (UseMap.empty())
3860b57cec5SDimitry Andric     return;
3870b57cec5SDimitry Andric 
3880b57cec5SDimitry Andric   if (!ResolveUsers) {
3890b57cec5SDimitry Andric     UseMap.clear();
3900b57cec5SDimitry Andric     return;
3910b57cec5SDimitry Andric   }
3920b57cec5SDimitry Andric 
3930b57cec5SDimitry Andric   // Copy out uses since UseMap could get touched below.
3940b57cec5SDimitry Andric   using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
3950b57cec5SDimitry Andric   SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
3960b57cec5SDimitry Andric   llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
3970b57cec5SDimitry Andric     return L.second.second < R.second.second;
3980b57cec5SDimitry Andric   });
3990b57cec5SDimitry Andric   UseMap.clear();
4000b57cec5SDimitry Andric   for (const auto &Pair : Uses) {
4010b57cec5SDimitry Andric     auto Owner = Pair.second.first;
4020b57cec5SDimitry Andric     if (!Owner)
4030b57cec5SDimitry Andric       continue;
4045f757f3fSDimitry Andric     if (!Owner.is<Metadata *>())
4050b57cec5SDimitry Andric       continue;
4060b57cec5SDimitry Andric 
4070b57cec5SDimitry Andric     // Resolve MDNodes that point at this.
40806c3fb27SDimitry Andric     auto *OwnerMD = dyn_cast_if_present<MDNode>(cast<Metadata *>(Owner));
4090b57cec5SDimitry Andric     if (!OwnerMD)
4100b57cec5SDimitry Andric       continue;
4110b57cec5SDimitry Andric     if (OwnerMD->isResolved())
4120b57cec5SDimitry Andric       continue;
4130b57cec5SDimitry Andric     OwnerMD->decrementUnresolvedOperandCount();
4140b57cec5SDimitry Andric   }
4150b57cec5SDimitry Andric }
4160b57cec5SDimitry Andric 
4175f757f3fSDimitry Andric // Special handing of DIArgList is required in the RemoveDIs project, see
4185f757f3fSDimitry Andric // commentry in DIArgList::handleChangedOperand for details. Hidden behind
4195f757f3fSDimitry Andric // conditional compilation to avoid a compile time regression.
4200b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
4210b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
4220b57cec5SDimitry Andric     return N->isResolved() ? nullptr : N->Context.getOrCreateReplaceableUses();
4235f757f3fSDimitry Andric   if (auto ArgList = dyn_cast<DIArgList>(&MD))
4245f757f3fSDimitry Andric     return ArgList;
4250b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
4260b57cec5SDimitry Andric }
4270b57cec5SDimitry Andric 
4280b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
4290b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
4300b57cec5SDimitry Andric     return N->isResolved() ? nullptr : N->Context.getReplaceableUses();
4315f757f3fSDimitry Andric   if (auto ArgList = dyn_cast<DIArgList>(&MD))
4325f757f3fSDimitry Andric     return ArgList;
4330b57cec5SDimitry Andric   return dyn_cast<ValueAsMetadata>(&MD);
4340b57cec5SDimitry Andric }
4350b57cec5SDimitry Andric 
4360b57cec5SDimitry Andric bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
4370b57cec5SDimitry Andric   if (auto *N = dyn_cast<MDNode>(&MD))
4380b57cec5SDimitry Andric     return !N->isResolved();
4395f757f3fSDimitry Andric   return isa<ValueAsMetadata>(&MD) || isa<DIArgList>(&MD);
4400b57cec5SDimitry Andric }
4410b57cec5SDimitry Andric 
4420b57cec5SDimitry Andric static DISubprogram *getLocalFunctionMetadata(Value *V) {
4430b57cec5SDimitry Andric   assert(V && "Expected value");
4440b57cec5SDimitry Andric   if (auto *A = dyn_cast<Argument>(V)) {
4450b57cec5SDimitry Andric     if (auto *Fn = A->getParent())
4460b57cec5SDimitry Andric       return Fn->getSubprogram();
4470b57cec5SDimitry Andric     return nullptr;
4480b57cec5SDimitry Andric   }
4490b57cec5SDimitry Andric 
4500b57cec5SDimitry Andric   if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
4510b57cec5SDimitry Andric     if (auto *Fn = BB->getParent())
4520b57cec5SDimitry Andric       return Fn->getSubprogram();
4530b57cec5SDimitry Andric     return nullptr;
4540b57cec5SDimitry Andric   }
4550b57cec5SDimitry Andric 
4560b57cec5SDimitry Andric   return nullptr;
4570b57cec5SDimitry Andric }
4580b57cec5SDimitry Andric 
4590b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::get(Value *V) {
4600b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
4610b57cec5SDimitry Andric 
4620b57cec5SDimitry Andric   auto &Context = V->getContext();
4630b57cec5SDimitry Andric   auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
4640b57cec5SDimitry Andric   if (!Entry) {
4650b57cec5SDimitry Andric     assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) &&
4660b57cec5SDimitry Andric            "Expected constant or function-local value");
4670b57cec5SDimitry Andric     assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
4680b57cec5SDimitry Andric     V->IsUsedByMD = true;
4690b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(V))
4700b57cec5SDimitry Andric       Entry = new ConstantAsMetadata(C);
4710b57cec5SDimitry Andric     else
4720b57cec5SDimitry Andric       Entry = new LocalAsMetadata(V);
4730b57cec5SDimitry Andric   }
4740b57cec5SDimitry Andric 
4750b57cec5SDimitry Andric   return Entry;
4760b57cec5SDimitry Andric }
4770b57cec5SDimitry Andric 
4780b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) {
4790b57cec5SDimitry Andric   assert(V && "Unexpected null Value");
4800b57cec5SDimitry Andric   return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
4810b57cec5SDimitry Andric }
4820b57cec5SDimitry Andric 
4830b57cec5SDimitry Andric void ValueAsMetadata::handleDeletion(Value *V) {
4840b57cec5SDimitry Andric   assert(V && "Expected valid value");
4850b57cec5SDimitry Andric 
4860b57cec5SDimitry Andric   auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
4870b57cec5SDimitry Andric   auto I = Store.find(V);
4880b57cec5SDimitry Andric   if (I == Store.end())
4890b57cec5SDimitry Andric     return;
4900b57cec5SDimitry Andric 
4910b57cec5SDimitry Andric   // Remove old entry from the map.
4920b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
4930b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
4940b57cec5SDimitry Andric   assert(MD->getValue() == V && "Expected valid mapping");
4950b57cec5SDimitry Andric   Store.erase(I);
4960b57cec5SDimitry Andric 
4970b57cec5SDimitry Andric   // Delete the metadata.
4980b57cec5SDimitry Andric   MD->replaceAllUsesWith(nullptr);
4990b57cec5SDimitry Andric   delete MD;
5000b57cec5SDimitry Andric }
5010b57cec5SDimitry Andric 
5020b57cec5SDimitry Andric void ValueAsMetadata::handleRAUW(Value *From, Value *To) {
5030b57cec5SDimitry Andric   assert(From && "Expected valid value");
5040b57cec5SDimitry Andric   assert(To && "Expected valid value");
5050b57cec5SDimitry Andric   assert(From != To && "Expected changed value");
5060b57cec5SDimitry Andric   assert(From->getType() == To->getType() && "Unexpected type change");
5070b57cec5SDimitry Andric 
5080b57cec5SDimitry Andric   LLVMContext &Context = From->getType()->getContext();
5090b57cec5SDimitry Andric   auto &Store = Context.pImpl->ValuesAsMetadata;
5100b57cec5SDimitry Andric   auto I = Store.find(From);
5110b57cec5SDimitry Andric   if (I == Store.end()) {
5120b57cec5SDimitry Andric     assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
5130b57cec5SDimitry Andric     return;
5140b57cec5SDimitry Andric   }
5150b57cec5SDimitry Andric 
5160b57cec5SDimitry Andric   // Remove old entry from the map.
5170b57cec5SDimitry Andric   assert(From->IsUsedByMD && "Expected From to be used by metadata");
5180b57cec5SDimitry Andric   From->IsUsedByMD = false;
5190b57cec5SDimitry Andric   ValueAsMetadata *MD = I->second;
5200b57cec5SDimitry Andric   assert(MD && "Expected valid metadata");
5210b57cec5SDimitry Andric   assert(MD->getValue() == From && "Expected valid mapping");
5220b57cec5SDimitry Andric   Store.erase(I);
5230b57cec5SDimitry Andric 
5240b57cec5SDimitry Andric   if (isa<LocalAsMetadata>(MD)) {
5250b57cec5SDimitry Andric     if (auto *C = dyn_cast<Constant>(To)) {
5260b57cec5SDimitry Andric       // Local became a constant.
5270b57cec5SDimitry Andric       MD->replaceAllUsesWith(ConstantAsMetadata::get(C));
5280b57cec5SDimitry Andric       delete MD;
5290b57cec5SDimitry Andric       return;
5300b57cec5SDimitry Andric     }
5310b57cec5SDimitry Andric     if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) &&
5320b57cec5SDimitry Andric         getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) {
5330b57cec5SDimitry Andric       // DISubprogram changed.
5340b57cec5SDimitry Andric       MD->replaceAllUsesWith(nullptr);
5350b57cec5SDimitry Andric       delete MD;
5360b57cec5SDimitry Andric       return;
5370b57cec5SDimitry Andric     }
5380b57cec5SDimitry Andric   } else if (!isa<Constant>(To)) {
5390b57cec5SDimitry Andric     // Changed to function-local value.
5400b57cec5SDimitry Andric     MD->replaceAllUsesWith(nullptr);
5410b57cec5SDimitry Andric     delete MD;
5420b57cec5SDimitry Andric     return;
5430b57cec5SDimitry Andric   }
5440b57cec5SDimitry Andric 
5450b57cec5SDimitry Andric   auto *&Entry = Store[To];
5460b57cec5SDimitry Andric   if (Entry) {
5470b57cec5SDimitry Andric     // The target already exists.
5480b57cec5SDimitry Andric     MD->replaceAllUsesWith(Entry);
5490b57cec5SDimitry Andric     delete MD;
5500b57cec5SDimitry Andric     return;
5510b57cec5SDimitry Andric   }
5520b57cec5SDimitry Andric 
5530b57cec5SDimitry Andric   // Update MD in place (and update the map entry).
5540b57cec5SDimitry Andric   assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
5550b57cec5SDimitry Andric   To->IsUsedByMD = true;
5560b57cec5SDimitry Andric   MD->V = To;
5570b57cec5SDimitry Andric   Entry = MD;
5580b57cec5SDimitry Andric }
5590b57cec5SDimitry Andric 
5600b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5610b57cec5SDimitry Andric // MDString implementation.
5620b57cec5SDimitry Andric //
5630b57cec5SDimitry Andric 
5640b57cec5SDimitry Andric MDString *MDString::get(LLVMContext &Context, StringRef Str) {
5650b57cec5SDimitry Andric   auto &Store = Context.pImpl->MDStringCache;
5660b57cec5SDimitry Andric   auto I = Store.try_emplace(Str);
5670b57cec5SDimitry Andric   auto &MapEntry = I.first->getValue();
5680b57cec5SDimitry Andric   if (!I.second)
5690b57cec5SDimitry Andric     return &MapEntry;
5700b57cec5SDimitry Andric   MapEntry.Entry = &*I.first;
5710b57cec5SDimitry Andric   return &MapEntry;
5720b57cec5SDimitry Andric }
5730b57cec5SDimitry Andric 
5740b57cec5SDimitry Andric StringRef MDString::getString() const {
5750b57cec5SDimitry Andric   assert(Entry && "Expected to find string map entry");
5760b57cec5SDimitry Andric   return Entry->first();
5770b57cec5SDimitry Andric }
5780b57cec5SDimitry Andric 
5790b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
5800b57cec5SDimitry Andric // MDNode implementation.
5810b57cec5SDimitry Andric //
5820b57cec5SDimitry Andric 
5830b57cec5SDimitry Andric // Assert that the MDNode types will not be unaligned by the objects
5840b57cec5SDimitry Andric // prepended to them.
5850b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
5860b57cec5SDimitry Andric   static_assert(                                                               \
5870b57cec5SDimitry Andric       alignof(uint64_t) >= alignof(CLASS),                                     \
5880b57cec5SDimitry Andric       "Alignment is insufficient after objects prepended to " #CLASS);
5890b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
5900b57cec5SDimitry Andric 
59181ad6265SDimitry Andric void *MDNode::operator new(size_t Size, size_t NumOps, StorageType Storage) {
5920b57cec5SDimitry Andric   // uint64_t is the most aligned type we need support (ensured by static_assert
5930b57cec5SDimitry Andric   // above)
59481ad6265SDimitry Andric   size_t AllocSize =
59581ad6265SDimitry Andric       alignTo(Header::getAllocSize(Storage, NumOps), alignof(uint64_t));
59681ad6265SDimitry Andric   char *Mem = reinterpret_cast<char *>(::operator new(AllocSize + Size));
59781ad6265SDimitry Andric   Header *H = new (Mem + AllocSize - sizeof(Header)) Header(NumOps, Storage);
59881ad6265SDimitry Andric   return reinterpret_cast<void *>(H + 1);
5990b57cec5SDimitry Andric }
6000b57cec5SDimitry Andric 
60181ad6265SDimitry Andric void MDNode::operator delete(void *N) {
60281ad6265SDimitry Andric   Header *H = reinterpret_cast<Header *>(N) - 1;
60381ad6265SDimitry Andric   void *Mem = H->getAllocation();
60481ad6265SDimitry Andric   H->~Header();
60581ad6265SDimitry Andric   ::operator delete(Mem);
6060b57cec5SDimitry Andric }
6070b57cec5SDimitry Andric 
6080b57cec5SDimitry Andric MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
6090b57cec5SDimitry Andric                ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2)
61081ad6265SDimitry Andric     : Metadata(ID, Storage), Context(Context) {
6110b57cec5SDimitry Andric   unsigned Op = 0;
6120b57cec5SDimitry Andric   for (Metadata *MD : Ops1)
6130b57cec5SDimitry Andric     setOperand(Op++, MD);
6140b57cec5SDimitry Andric   for (Metadata *MD : Ops2)
6150b57cec5SDimitry Andric     setOperand(Op++, MD);
6160b57cec5SDimitry Andric 
6170b57cec5SDimitry Andric   if (!isUniqued())
6180b57cec5SDimitry Andric     return;
6190b57cec5SDimitry Andric 
6200b57cec5SDimitry Andric   // Count the unresolved operands.  If there are any, RAUW support will be
6210b57cec5SDimitry Andric   // added lazily on first reference.
6220b57cec5SDimitry Andric   countUnresolvedOperands();
6230b57cec5SDimitry Andric }
6240b57cec5SDimitry Andric 
6250b57cec5SDimitry Andric TempMDNode MDNode::clone() const {
6260b57cec5SDimitry Andric   switch (getMetadataID()) {
6270b57cec5SDimitry Andric   default:
6280b57cec5SDimitry Andric     llvm_unreachable("Invalid MDNode subclass");
6290b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
6300b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
6310b57cec5SDimitry Andric     return cast<CLASS>(this)->cloneImpl();
6320b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
6330b57cec5SDimitry Andric   }
6340b57cec5SDimitry Andric }
6350b57cec5SDimitry Andric 
63681ad6265SDimitry Andric MDNode::Header::Header(size_t NumOps, StorageType Storage) {
63781ad6265SDimitry Andric   IsLarge = isLarge(NumOps);
63881ad6265SDimitry Andric   IsResizable = isResizable(Storage);
63981ad6265SDimitry Andric   SmallSize = getSmallSize(NumOps, IsResizable, IsLarge);
64081ad6265SDimitry Andric   if (IsLarge) {
64181ad6265SDimitry Andric     SmallNumOps = 0;
64281ad6265SDimitry Andric     new (getLargePtr()) LargeStorageVector();
64381ad6265SDimitry Andric     getLarge().resize(NumOps);
64481ad6265SDimitry Andric     return;
64581ad6265SDimitry Andric   }
64681ad6265SDimitry Andric   SmallNumOps = NumOps;
64781ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this) - SmallSize;
64881ad6265SDimitry Andric   for (MDOperand *E = O + SmallSize; O != E;)
64981ad6265SDimitry Andric     (void)new (O++) MDOperand();
65081ad6265SDimitry Andric }
65181ad6265SDimitry Andric 
65281ad6265SDimitry Andric MDNode::Header::~Header() {
65381ad6265SDimitry Andric   if (IsLarge) {
65481ad6265SDimitry Andric     getLarge().~LargeStorageVector();
65581ad6265SDimitry Andric     return;
65681ad6265SDimitry Andric   }
65781ad6265SDimitry Andric   MDOperand *O = reinterpret_cast<MDOperand *>(this);
65881ad6265SDimitry Andric   for (MDOperand *E = O - SmallSize; O != E; --O)
65981ad6265SDimitry Andric     (void)(O - 1)->~MDOperand();
66081ad6265SDimitry Andric }
66181ad6265SDimitry Andric 
66281ad6265SDimitry Andric void *MDNode::Header::getSmallPtr() {
66381ad6265SDimitry Andric   static_assert(alignof(MDOperand) <= alignof(Header),
66481ad6265SDimitry Andric                 "MDOperand too strongly aligned");
66581ad6265SDimitry Andric   return reinterpret_cast<char *>(const_cast<Header *>(this)) -
66681ad6265SDimitry Andric          sizeof(MDOperand) * SmallSize;
66781ad6265SDimitry Andric }
66881ad6265SDimitry Andric 
66981ad6265SDimitry Andric void MDNode::Header::resize(size_t NumOps) {
67081ad6265SDimitry Andric   assert(IsResizable && "Node is not resizable");
67181ad6265SDimitry Andric   if (operands().size() == NumOps)
67281ad6265SDimitry Andric     return;
67381ad6265SDimitry Andric 
67481ad6265SDimitry Andric   if (IsLarge)
67581ad6265SDimitry Andric     getLarge().resize(NumOps);
67681ad6265SDimitry Andric   else if (NumOps <= SmallSize)
67781ad6265SDimitry Andric     resizeSmall(NumOps);
67881ad6265SDimitry Andric   else
67981ad6265SDimitry Andric     resizeSmallToLarge(NumOps);
68081ad6265SDimitry Andric }
68181ad6265SDimitry Andric 
68281ad6265SDimitry Andric void MDNode::Header::resizeSmall(size_t NumOps) {
68381ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
68481ad6265SDimitry Andric   assert(NumOps <= SmallSize && "NumOps too large for small resize");
68581ad6265SDimitry Andric 
68681ad6265SDimitry Andric   MutableArrayRef<MDOperand> ExistingOps = operands();
68781ad6265SDimitry Andric   assert(NumOps != ExistingOps.size() && "Expected a different size");
68881ad6265SDimitry Andric 
68981ad6265SDimitry Andric   int NumNew = (int)NumOps - (int)ExistingOps.size();
69081ad6265SDimitry Andric   MDOperand *O = ExistingOps.end();
69181ad6265SDimitry Andric   for (int I = 0, E = NumNew; I < E; ++I)
69281ad6265SDimitry Andric     (O++)->reset();
69381ad6265SDimitry Andric   for (int I = 0, E = NumNew; I > E; --I)
69481ad6265SDimitry Andric     (--O)->reset();
69581ad6265SDimitry Andric   SmallNumOps = NumOps;
69681ad6265SDimitry Andric   assert(O == operands().end() && "Operands not (un)initialized until the end");
69781ad6265SDimitry Andric }
69881ad6265SDimitry Andric 
69981ad6265SDimitry Andric void MDNode::Header::resizeSmallToLarge(size_t NumOps) {
70081ad6265SDimitry Andric   assert(!IsLarge && "Expected a small MDNode");
70181ad6265SDimitry Andric   assert(NumOps > SmallSize && "Expected NumOps to be larger than allocation");
70281ad6265SDimitry Andric   LargeStorageVector NewOps;
70381ad6265SDimitry Andric   NewOps.resize(NumOps);
70481ad6265SDimitry Andric   llvm::move(operands(), NewOps.begin());
70581ad6265SDimitry Andric   resizeSmall(0);
70681ad6265SDimitry Andric   new (getLargePtr()) LargeStorageVector(std::move(NewOps));
70781ad6265SDimitry Andric   IsLarge = true;
70881ad6265SDimitry Andric }
70981ad6265SDimitry Andric 
7100b57cec5SDimitry Andric static bool isOperandUnresolved(Metadata *Op) {
7110b57cec5SDimitry Andric   if (auto *N = dyn_cast_or_null<MDNode>(Op))
7120b57cec5SDimitry Andric     return !N->isResolved();
7130b57cec5SDimitry Andric   return false;
7140b57cec5SDimitry Andric }
7150b57cec5SDimitry Andric 
7160b57cec5SDimitry Andric void MDNode::countUnresolvedOperands() {
71781ad6265SDimitry Andric   assert(getNumUnresolved() == 0 && "Expected unresolved ops to be uncounted");
7180b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
71981ad6265SDimitry Andric   setNumUnresolved(count_if(operands(), isOperandUnresolved));
7200b57cec5SDimitry Andric }
7210b57cec5SDimitry Andric 
7220b57cec5SDimitry Andric void MDNode::makeUniqued() {
7230b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
7240b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7250b57cec5SDimitry Andric 
7260b57cec5SDimitry Andric   // Enable uniquing callbacks.
7270b57cec5SDimitry Andric   for (auto &Op : mutable_operands())
7280b57cec5SDimitry Andric     Op.reset(Op.get(), this);
7290b57cec5SDimitry Andric 
7300b57cec5SDimitry Andric   // Make this 'uniqued'.
7310b57cec5SDimitry Andric   Storage = Uniqued;
7320b57cec5SDimitry Andric   countUnresolvedOperands();
73381ad6265SDimitry Andric   if (!getNumUnresolved()) {
7340b57cec5SDimitry Andric     dropReplaceableUses();
7350b57cec5SDimitry Andric     assert(isResolved() && "Expected this to be resolved");
7360b57cec5SDimitry Andric   }
7370b57cec5SDimitry Andric 
7380b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
7390b57cec5SDimitry Andric }
7400b57cec5SDimitry Andric 
7410b57cec5SDimitry Andric void MDNode::makeDistinct() {
7420b57cec5SDimitry Andric   assert(isTemporary() && "Expected this to be temporary");
7430b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7440b57cec5SDimitry Andric 
7450b57cec5SDimitry Andric   // Drop RAUW support and store as a distinct node.
7460b57cec5SDimitry Andric   dropReplaceableUses();
7470b57cec5SDimitry Andric   storeDistinctInContext();
7480b57cec5SDimitry Andric 
7490b57cec5SDimitry Andric   assert(isDistinct() && "Expected this to be distinct");
7500b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
7510b57cec5SDimitry Andric }
7520b57cec5SDimitry Andric 
7530b57cec5SDimitry Andric void MDNode::resolve() {
7540b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
7550b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7560b57cec5SDimitry Andric 
75781ad6265SDimitry Andric   setNumUnresolved(0);
7580b57cec5SDimitry Andric   dropReplaceableUses();
7590b57cec5SDimitry Andric 
7600b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
7610b57cec5SDimitry Andric }
7620b57cec5SDimitry Andric 
7630b57cec5SDimitry Andric void MDNode::dropReplaceableUses() {
76481ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved operand");
7650b57cec5SDimitry Andric 
7660b57cec5SDimitry Andric   // Drop any RAUW support.
7670b57cec5SDimitry Andric   if (Context.hasReplaceableUses())
7680b57cec5SDimitry Andric     Context.takeReplaceableUses()->resolveAllUses();
7690b57cec5SDimitry Andric }
7700b57cec5SDimitry Andric 
7710b57cec5SDimitry Andric void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
7720b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
77381ad6265SDimitry Andric   assert(getNumUnresolved() != 0 && "Expected unresolved operands");
7740b57cec5SDimitry Andric 
7750b57cec5SDimitry Andric   // Check if an operand was resolved.
7760b57cec5SDimitry Andric   if (!isOperandUnresolved(Old)) {
7770b57cec5SDimitry Andric     if (isOperandUnresolved(New))
7780b57cec5SDimitry Andric       // An operand was un-resolved!
77981ad6265SDimitry Andric       setNumUnresolved(getNumUnresolved() + 1);
7800b57cec5SDimitry Andric   } else if (!isOperandUnresolved(New))
7810b57cec5SDimitry Andric     decrementUnresolvedOperandCount();
7820b57cec5SDimitry Andric }
7830b57cec5SDimitry Andric 
7840b57cec5SDimitry Andric void MDNode::decrementUnresolvedOperandCount() {
7850b57cec5SDimitry Andric   assert(!isResolved() && "Expected this to be unresolved");
7860b57cec5SDimitry Andric   if (isTemporary())
7870b57cec5SDimitry Andric     return;
7880b57cec5SDimitry Andric 
7890b57cec5SDimitry Andric   assert(isUniqued() && "Expected this to be uniqued");
79081ad6265SDimitry Andric   setNumUnresolved(getNumUnresolved() - 1);
79181ad6265SDimitry Andric   if (getNumUnresolved())
7920b57cec5SDimitry Andric     return;
7930b57cec5SDimitry Andric 
7940b57cec5SDimitry Andric   // Last unresolved operand has just been resolved.
7950b57cec5SDimitry Andric   dropReplaceableUses();
7960b57cec5SDimitry Andric   assert(isResolved() && "Expected this to become resolved");
7970b57cec5SDimitry Andric }
7980b57cec5SDimitry Andric 
7990b57cec5SDimitry Andric void MDNode::resolveCycles() {
8000b57cec5SDimitry Andric   if (isResolved())
8010b57cec5SDimitry Andric     return;
8020b57cec5SDimitry Andric 
8030b57cec5SDimitry Andric   // Resolve this node immediately.
8040b57cec5SDimitry Andric   resolve();
8050b57cec5SDimitry Andric 
8060b57cec5SDimitry Andric   // Resolve all operands.
8070b57cec5SDimitry Andric   for (const auto &Op : operands()) {
8080b57cec5SDimitry Andric     auto *N = dyn_cast_or_null<MDNode>(Op);
8090b57cec5SDimitry Andric     if (!N)
8100b57cec5SDimitry Andric       continue;
8110b57cec5SDimitry Andric 
8120b57cec5SDimitry Andric     assert(!N->isTemporary() &&
8130b57cec5SDimitry Andric            "Expected all forward declarations to be resolved");
8140b57cec5SDimitry Andric     if (!N->isResolved())
8150b57cec5SDimitry Andric       N->resolveCycles();
8160b57cec5SDimitry Andric   }
8170b57cec5SDimitry Andric }
8180b57cec5SDimitry Andric 
8190b57cec5SDimitry Andric static bool hasSelfReference(MDNode *N) {
820e8d8bef9SDimitry Andric   return llvm::is_contained(N->operands(), N);
8210b57cec5SDimitry Andric }
8220b57cec5SDimitry Andric 
8230b57cec5SDimitry Andric MDNode *MDNode::replaceWithPermanentImpl() {
8240b57cec5SDimitry Andric   switch (getMetadataID()) {
8250b57cec5SDimitry Andric   default:
8260b57cec5SDimitry Andric     // If this type isn't uniquable, replace with a distinct node.
8270b57cec5SDimitry Andric     return replaceWithDistinctImpl();
8280b57cec5SDimitry Andric 
8290b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
8300b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
8310b57cec5SDimitry Andric     break;
8320b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
8330b57cec5SDimitry Andric   }
8340b57cec5SDimitry Andric 
8350b57cec5SDimitry Andric   // Even if this type is uniquable, self-references have to be distinct.
8360b57cec5SDimitry Andric   if (hasSelfReference(this))
8370b57cec5SDimitry Andric     return replaceWithDistinctImpl();
8380b57cec5SDimitry Andric   return replaceWithUniquedImpl();
8390b57cec5SDimitry Andric }
8400b57cec5SDimitry Andric 
8410b57cec5SDimitry Andric MDNode *MDNode::replaceWithUniquedImpl() {
8420b57cec5SDimitry Andric   // Try to uniquify in place.
8430b57cec5SDimitry Andric   MDNode *UniquedNode = uniquify();
8440b57cec5SDimitry Andric 
8450b57cec5SDimitry Andric   if (UniquedNode == this) {
8460b57cec5SDimitry Andric     makeUniqued();
8470b57cec5SDimitry Andric     return this;
8480b57cec5SDimitry Andric   }
8490b57cec5SDimitry Andric 
8500b57cec5SDimitry Andric   // Collision, so RAUW instead.
8510b57cec5SDimitry Andric   replaceAllUsesWith(UniquedNode);
8520b57cec5SDimitry Andric   deleteAsSubclass();
8530b57cec5SDimitry Andric   return UniquedNode;
8540b57cec5SDimitry Andric }
8550b57cec5SDimitry Andric 
8560b57cec5SDimitry Andric MDNode *MDNode::replaceWithDistinctImpl() {
8570b57cec5SDimitry Andric   makeDistinct();
8580b57cec5SDimitry Andric   return this;
8590b57cec5SDimitry Andric }
8600b57cec5SDimitry Andric 
8610b57cec5SDimitry Andric void MDTuple::recalculateHash() {
8620b57cec5SDimitry Andric   setHash(MDTupleInfo::KeyTy::calculateHash(this));
8630b57cec5SDimitry Andric }
8640b57cec5SDimitry Andric 
8650b57cec5SDimitry Andric void MDNode::dropAllReferences() {
86681ad6265SDimitry Andric   for (unsigned I = 0, E = getNumOperands(); I != E; ++I)
8670b57cec5SDimitry Andric     setOperand(I, nullptr);
8680b57cec5SDimitry Andric   if (Context.hasReplaceableUses()) {
8690b57cec5SDimitry Andric     Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
8700b57cec5SDimitry Andric     (void)Context.takeReplaceableUses();
8710b57cec5SDimitry Andric   }
8720b57cec5SDimitry Andric }
8730b57cec5SDimitry Andric 
8740b57cec5SDimitry Andric void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
8750b57cec5SDimitry Andric   unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
8760b57cec5SDimitry Andric   assert(Op < getNumOperands() && "Expected valid operand");
8770b57cec5SDimitry Andric 
8780b57cec5SDimitry Andric   if (!isUniqued()) {
8790b57cec5SDimitry Andric     // This node is not uniqued.  Just set the operand and be done with it.
8800b57cec5SDimitry Andric     setOperand(Op, New);
8810b57cec5SDimitry Andric     return;
8820b57cec5SDimitry Andric   }
8830b57cec5SDimitry Andric 
8840b57cec5SDimitry Andric   // This node is uniqued.
8850b57cec5SDimitry Andric   eraseFromStore();
8860b57cec5SDimitry Andric 
8870b57cec5SDimitry Andric   Metadata *Old = getOperand(Op);
8880b57cec5SDimitry Andric   setOperand(Op, New);
8890b57cec5SDimitry Andric 
8900b57cec5SDimitry Andric   // Drop uniquing for self-reference cycles and deleted constants.
8910b57cec5SDimitry Andric   if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
8920b57cec5SDimitry Andric     if (!isResolved())
8930b57cec5SDimitry Andric       resolve();
8940b57cec5SDimitry Andric     storeDistinctInContext();
8950b57cec5SDimitry Andric     return;
8960b57cec5SDimitry Andric   }
8970b57cec5SDimitry Andric 
8980b57cec5SDimitry Andric   // Re-unique the node.
8990b57cec5SDimitry Andric   auto *Uniqued = uniquify();
9000b57cec5SDimitry Andric   if (Uniqued == this) {
9010b57cec5SDimitry Andric     if (!isResolved())
9020b57cec5SDimitry Andric       resolveAfterOperandChange(Old, New);
9030b57cec5SDimitry Andric     return;
9040b57cec5SDimitry Andric   }
9050b57cec5SDimitry Andric 
9060b57cec5SDimitry Andric   // Collision.
9070b57cec5SDimitry Andric   if (!isResolved()) {
9080b57cec5SDimitry Andric     // Still unresolved, so RAUW.
9090b57cec5SDimitry Andric     //
9100b57cec5SDimitry Andric     // First, clear out all operands to prevent any recursion (similar to
9110b57cec5SDimitry Andric     // dropAllReferences(), but we still need the use-list).
9120b57cec5SDimitry Andric     for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
9130b57cec5SDimitry Andric       setOperand(O, nullptr);
9140b57cec5SDimitry Andric     if (Context.hasReplaceableUses())
9150b57cec5SDimitry Andric       Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
9160b57cec5SDimitry Andric     deleteAsSubclass();
9170b57cec5SDimitry Andric     return;
9180b57cec5SDimitry Andric   }
9190b57cec5SDimitry Andric 
9200b57cec5SDimitry Andric   // Store in non-uniqued form if RAUW isn't possible.
9210b57cec5SDimitry Andric   storeDistinctInContext();
9220b57cec5SDimitry Andric }
9230b57cec5SDimitry Andric 
9240b57cec5SDimitry Andric void MDNode::deleteAsSubclass() {
9250b57cec5SDimitry Andric   switch (getMetadataID()) {
9260b57cec5SDimitry Andric   default:
9270b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
9280b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
9290b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
9300b57cec5SDimitry Andric     delete cast<CLASS>(this);                                                  \
9310b57cec5SDimitry Andric     break;
9320b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9330b57cec5SDimitry Andric   }
9340b57cec5SDimitry Andric }
9350b57cec5SDimitry Andric 
9360b57cec5SDimitry Andric template <class T, class InfoT>
9370b57cec5SDimitry Andric static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) {
9380b57cec5SDimitry Andric   if (T *U = getUniqued(Store, N))
9390b57cec5SDimitry Andric     return U;
9400b57cec5SDimitry Andric 
9410b57cec5SDimitry Andric   Store.insert(N);
9420b57cec5SDimitry Andric   return N;
9430b57cec5SDimitry Andric }
9440b57cec5SDimitry Andric 
9450b57cec5SDimitry Andric template <class NodeTy> struct MDNode::HasCachedHash {
9460b57cec5SDimitry Andric   using Yes = char[1];
9470b57cec5SDimitry Andric   using No = char[2];
9480b57cec5SDimitry Andric   template <class U, U Val> struct SFINAE {};
9490b57cec5SDimitry Andric 
9500b57cec5SDimitry Andric   template <class U>
9510b57cec5SDimitry Andric   static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *);
9520b57cec5SDimitry Andric   template <class U> static No &check(...);
9530b57cec5SDimitry Andric 
9540b57cec5SDimitry Andric   static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes);
9550b57cec5SDimitry Andric };
9560b57cec5SDimitry Andric 
9570b57cec5SDimitry Andric MDNode *MDNode::uniquify() {
9580b57cec5SDimitry Andric   assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
9590b57cec5SDimitry Andric 
9600b57cec5SDimitry Andric   // Try to insert into uniquing store.
9610b57cec5SDimitry Andric   switch (getMetadataID()) {
9620b57cec5SDimitry Andric   default:
9630b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
9640b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
9650b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
9660b57cec5SDimitry Andric     CLASS *SubclassThis = cast<CLASS>(this);                                   \
9670b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value>                  \
9680b57cec5SDimitry Andric         ShouldRecalculateHash;                                                 \
9690b57cec5SDimitry Andric     dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash);              \
9700b57cec5SDimitry Andric     return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s);           \
9710b57cec5SDimitry Andric   }
9720b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9730b57cec5SDimitry Andric   }
9740b57cec5SDimitry Andric }
9750b57cec5SDimitry Andric 
9760b57cec5SDimitry Andric void MDNode::eraseFromStore() {
9770b57cec5SDimitry Andric   switch (getMetadataID()) {
9780b57cec5SDimitry Andric   default:
9790b57cec5SDimitry Andric     llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
9800b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS)                                    \
9810b57cec5SDimitry Andric   case CLASS##Kind:                                                            \
9820b57cec5SDimitry Andric     getContext().pImpl->CLASS##s.erase(cast<CLASS>(this));                     \
9830b57cec5SDimitry Andric     break;
9840b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
9850b57cec5SDimitry Andric   }
9860b57cec5SDimitry Andric }
9870b57cec5SDimitry Andric 
9880b57cec5SDimitry Andric MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
9890b57cec5SDimitry Andric                           StorageType Storage, bool ShouldCreate) {
9900b57cec5SDimitry Andric   unsigned Hash = 0;
9910b57cec5SDimitry Andric   if (Storage == Uniqued) {
9920b57cec5SDimitry Andric     MDTupleInfo::KeyTy Key(MDs);
9930b57cec5SDimitry Andric     if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
9940b57cec5SDimitry Andric       return N;
9950b57cec5SDimitry Andric     if (!ShouldCreate)
9960b57cec5SDimitry Andric       return nullptr;
9970b57cec5SDimitry Andric     Hash = Key.getHash();
9980b57cec5SDimitry Andric   } else {
9990b57cec5SDimitry Andric     assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
10000b57cec5SDimitry Andric   }
10010b57cec5SDimitry Andric 
100281ad6265SDimitry Andric   return storeImpl(new (MDs.size(), Storage)
100381ad6265SDimitry Andric                        MDTuple(Context, Storage, Hash, MDs),
10040b57cec5SDimitry Andric                    Storage, Context.pImpl->MDTuples);
10050b57cec5SDimitry Andric }
10060b57cec5SDimitry Andric 
10070b57cec5SDimitry Andric void MDNode::deleteTemporary(MDNode *N) {
10080b57cec5SDimitry Andric   assert(N->isTemporary() && "Expected temporary node");
10090b57cec5SDimitry Andric   N->replaceAllUsesWith(nullptr);
10100b57cec5SDimitry Andric   N->deleteAsSubclass();
10110b57cec5SDimitry Andric }
10120b57cec5SDimitry Andric 
10130b57cec5SDimitry Andric void MDNode::storeDistinctInContext() {
10140b57cec5SDimitry Andric   assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
101581ad6265SDimitry Andric   assert(!getNumUnresolved() && "Unexpected unresolved nodes");
10160b57cec5SDimitry Andric   Storage = Distinct;
10170b57cec5SDimitry Andric   assert(isResolved() && "Expected this to be resolved");
10180b57cec5SDimitry Andric 
10190b57cec5SDimitry Andric   // Reset the hash.
10200b57cec5SDimitry Andric   switch (getMetadataID()) {
10210b57cec5SDimitry Andric   default:
10220b57cec5SDimitry Andric     llvm_unreachable("Invalid subclass of MDNode");
10230b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS)                                              \
10240b57cec5SDimitry Andric   case CLASS##Kind: {                                                          \
10250b57cec5SDimitry Andric     std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
10260b57cec5SDimitry Andric     dispatchResetHash(cast<CLASS>(this), ShouldResetHash);                     \
10270b57cec5SDimitry Andric     break;                                                                     \
10280b57cec5SDimitry Andric   }
10290b57cec5SDimitry Andric #include "llvm/IR/Metadata.def"
10300b57cec5SDimitry Andric   }
10310b57cec5SDimitry Andric 
10320b57cec5SDimitry Andric   getContext().pImpl->DistinctMDNodes.push_back(this);
10330b57cec5SDimitry Andric }
10340b57cec5SDimitry Andric 
10350b57cec5SDimitry Andric void MDNode::replaceOperandWith(unsigned I, Metadata *New) {
10360b57cec5SDimitry Andric   if (getOperand(I) == New)
10370b57cec5SDimitry Andric     return;
10380b57cec5SDimitry Andric 
10390b57cec5SDimitry Andric   if (!isUniqued()) {
10400b57cec5SDimitry Andric     setOperand(I, New);
10410b57cec5SDimitry Andric     return;
10420b57cec5SDimitry Andric   }
10430b57cec5SDimitry Andric 
10440b57cec5SDimitry Andric   handleChangedOperand(mutable_begin() + I, New);
10450b57cec5SDimitry Andric }
10460b57cec5SDimitry Andric 
10470b57cec5SDimitry Andric void MDNode::setOperand(unsigned I, Metadata *New) {
104881ad6265SDimitry Andric   assert(I < getNumOperands());
10490b57cec5SDimitry Andric   mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
10500b57cec5SDimitry Andric }
10510b57cec5SDimitry Andric 
10520b57cec5SDimitry Andric /// Get a node or a self-reference that looks like it.
10530b57cec5SDimitry Andric ///
10540b57cec5SDimitry Andric /// Special handling for finding self-references, for use by \a
10550b57cec5SDimitry Andric /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
10560b57cec5SDimitry Andric /// when self-referencing nodes were still uniqued.  If the first operand has
10570b57cec5SDimitry Andric /// the same operands as \c Ops, return the first operand instead.
10580b57cec5SDimitry Andric static MDNode *getOrSelfReference(LLVMContext &Context,
10590b57cec5SDimitry Andric                                   ArrayRef<Metadata *> Ops) {
10600b57cec5SDimitry Andric   if (!Ops.empty())
10610b57cec5SDimitry Andric     if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0]))
10620b57cec5SDimitry Andric       if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
10630b57cec5SDimitry Andric         for (unsigned I = 1, E = Ops.size(); I != E; ++I)
10640b57cec5SDimitry Andric           if (Ops[I] != N->getOperand(I))
10650b57cec5SDimitry Andric             return MDNode::get(Context, Ops);
10660b57cec5SDimitry Andric         return N;
10670b57cec5SDimitry Andric       }
10680b57cec5SDimitry Andric 
10690b57cec5SDimitry Andric   return MDNode::get(Context, Ops);
10700b57cec5SDimitry Andric }
10710b57cec5SDimitry Andric 
10720b57cec5SDimitry Andric MDNode *MDNode::concatenate(MDNode *A, MDNode *B) {
10730b57cec5SDimitry Andric   if (!A)
10740b57cec5SDimitry Andric     return B;
10750b57cec5SDimitry Andric   if (!B)
10760b57cec5SDimitry Andric     return A;
10770b57cec5SDimitry Andric 
10780b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
10790b57cec5SDimitry Andric   MDs.insert(B->op_begin(), B->op_end());
10800b57cec5SDimitry Andric 
10810b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
10820b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
10830b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
10840b57cec5SDimitry Andric }
10850b57cec5SDimitry Andric 
10860b57cec5SDimitry Andric MDNode *MDNode::intersect(MDNode *A, MDNode *B) {
10870b57cec5SDimitry Andric   if (!A || !B)
10880b57cec5SDimitry Andric     return nullptr;
10890b57cec5SDimitry Andric 
10900b57cec5SDimitry Andric   SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
10910b57cec5SDimitry Andric   SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
10925ffd83dbSDimitry Andric   MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); });
10930b57cec5SDimitry Andric 
10940b57cec5SDimitry Andric   // FIXME: This preserves long-standing behaviour, but is it really the right
10950b57cec5SDimitry Andric   // behaviour?  Or was that an unintended side-effect of node uniquing?
10960b57cec5SDimitry Andric   return getOrSelfReference(A->getContext(), MDs.getArrayRef());
10970b57cec5SDimitry Andric }
10980b57cec5SDimitry Andric 
10990b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
11000b57cec5SDimitry Andric   if (!A || !B)
11010b57cec5SDimitry Andric     return nullptr;
11020b57cec5SDimitry Andric 
1103e8d8bef9SDimitry Andric   // Take the intersection of domains then union the scopes
1104e8d8bef9SDimitry Andric   // within those domains
1105e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> ADomains;
1106e8d8bef9SDimitry Andric   SmallPtrSet<const MDNode *, 16> IntersectDomains;
1107e8d8bef9SDimitry Andric   SmallSetVector<Metadata *, 4> MDs;
1108e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1109e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1110e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1111e8d8bef9SDimitry Andric         ADomains.insert(Domain);
1112e8d8bef9SDimitry Andric 
1113e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : B->operands())
1114e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1115e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1116e8d8bef9SDimitry Andric         if (ADomains.contains(Domain)) {
1117e8d8bef9SDimitry Andric           IntersectDomains.insert(Domain);
1118e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1119e8d8bef9SDimitry Andric         }
1120e8d8bef9SDimitry Andric 
1121e8d8bef9SDimitry Andric   for (const MDOperand &MDOp : A->operands())
1122e8d8bef9SDimitry Andric     if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp))
1123e8d8bef9SDimitry Andric       if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain())
1124e8d8bef9SDimitry Andric         if (IntersectDomains.contains(Domain))
1125e8d8bef9SDimitry Andric           MDs.insert(MDOp);
1126e8d8bef9SDimitry Andric 
1127e8d8bef9SDimitry Andric   return MDs.empty() ? nullptr
1128e8d8bef9SDimitry Andric                      : getOrSelfReference(A->getContext(), MDs.getArrayRef());
11290b57cec5SDimitry Andric }
11300b57cec5SDimitry Andric 
11310b57cec5SDimitry Andric MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
11320b57cec5SDimitry Andric   if (!A || !B)
11330b57cec5SDimitry Andric     return nullptr;
11340b57cec5SDimitry Andric 
11350b57cec5SDimitry Andric   APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
11360b57cec5SDimitry Andric   APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
11375ffd83dbSDimitry Andric   if (AVal < BVal)
11380b57cec5SDimitry Andric     return A;
11390b57cec5SDimitry Andric   return B;
11400b57cec5SDimitry Andric }
11410b57cec5SDimitry Andric 
114206c3fb27SDimitry Andric // Call instructions with branch weights are only used in SamplePGO as
114306c3fb27SDimitry Andric // documented in
114406c3fb27SDimitry Andric /// https://llvm.org/docs/BranchWeightMetadata.html#callinst).
114506c3fb27SDimitry Andric MDNode *MDNode::mergeDirectCallProfMetadata(MDNode *A, MDNode *B,
114606c3fb27SDimitry Andric                                             const Instruction *AInstr,
114706c3fb27SDimitry Andric                                             const Instruction *BInstr) {
114806c3fb27SDimitry Andric   assert(A && B && AInstr && BInstr && "Caller should guarantee");
114906c3fb27SDimitry Andric   auto &Ctx = AInstr->getContext();
115006c3fb27SDimitry Andric   MDBuilder MDHelper(Ctx);
115106c3fb27SDimitry Andric 
115206c3fb27SDimitry Andric   // LLVM IR verifier verifies !prof metadata has at least 2 operands.
115306c3fb27SDimitry Andric   assert(A->getNumOperands() >= 2 && B->getNumOperands() >= 2 &&
115406c3fb27SDimitry Andric          "!prof annotations should have no less than 2 operands");
115506c3fb27SDimitry Andric   MDString *AMDS = dyn_cast<MDString>(A->getOperand(0));
115606c3fb27SDimitry Andric   MDString *BMDS = dyn_cast<MDString>(B->getOperand(0));
115706c3fb27SDimitry Andric   // LLVM IR verfier verifies first operand is MDString.
115806c3fb27SDimitry Andric   assert(AMDS != nullptr && BMDS != nullptr &&
115906c3fb27SDimitry Andric          "first operand should be a non-null MDString");
116006c3fb27SDimitry Andric   StringRef AProfName = AMDS->getString();
116106c3fb27SDimitry Andric   StringRef BProfName = BMDS->getString();
116206c3fb27SDimitry Andric   if (AProfName.equals("branch_weights") &&
116306c3fb27SDimitry Andric       BProfName.equals("branch_weights")) {
116406c3fb27SDimitry Andric     ConstantInt *AInstrWeight =
116506c3fb27SDimitry Andric         mdconst::dyn_extract<ConstantInt>(A->getOperand(1));
116606c3fb27SDimitry Andric     ConstantInt *BInstrWeight =
116706c3fb27SDimitry Andric         mdconst::dyn_extract<ConstantInt>(B->getOperand(1));
116806c3fb27SDimitry Andric     assert(AInstrWeight && BInstrWeight && "verified by LLVM verifier");
116906c3fb27SDimitry Andric     return MDNode::get(Ctx,
117006c3fb27SDimitry Andric                        {MDHelper.createString("branch_weights"),
117106c3fb27SDimitry Andric                         MDHelper.createConstant(ConstantInt::get(
117206c3fb27SDimitry Andric                             Type::getInt64Ty(Ctx),
117306c3fb27SDimitry Andric                             SaturatingAdd(AInstrWeight->getZExtValue(),
117406c3fb27SDimitry Andric                                           BInstrWeight->getZExtValue())))});
117506c3fb27SDimitry Andric   }
117606c3fb27SDimitry Andric   return nullptr;
117706c3fb27SDimitry Andric }
117806c3fb27SDimitry Andric 
117906c3fb27SDimitry Andric // Pass in both instructions and nodes. Instruction information (e.g.,
118006c3fb27SDimitry Andric // instruction type) helps interpret profiles and make implementation clearer.
118106c3fb27SDimitry Andric MDNode *MDNode::getMergedProfMetadata(MDNode *A, MDNode *B,
118206c3fb27SDimitry Andric                                       const Instruction *AInstr,
118306c3fb27SDimitry Andric                                       const Instruction *BInstr) {
118406c3fb27SDimitry Andric   if (!(A && B)) {
118506c3fb27SDimitry Andric     return A ? A : B;
118606c3fb27SDimitry Andric   }
118706c3fb27SDimitry Andric 
118806c3fb27SDimitry Andric   assert(AInstr->getMetadata(LLVMContext::MD_prof) == A &&
118906c3fb27SDimitry Andric          "Caller should guarantee");
119006c3fb27SDimitry Andric   assert(BInstr->getMetadata(LLVMContext::MD_prof) == B &&
119106c3fb27SDimitry Andric          "Caller should guarantee");
119206c3fb27SDimitry Andric 
119306c3fb27SDimitry Andric   const CallInst *ACall = dyn_cast<CallInst>(AInstr);
119406c3fb27SDimitry Andric   const CallInst *BCall = dyn_cast<CallInst>(BInstr);
119506c3fb27SDimitry Andric 
119606c3fb27SDimitry Andric   // Both ACall and BCall are direct callsites.
119706c3fb27SDimitry Andric   if (ACall && BCall && ACall->getCalledFunction() &&
119806c3fb27SDimitry Andric       BCall->getCalledFunction())
119906c3fb27SDimitry Andric     return mergeDirectCallProfMetadata(A, B, AInstr, BInstr);
120006c3fb27SDimitry Andric 
120106c3fb27SDimitry Andric   // The rest of the cases are not implemented but could be added
120206c3fb27SDimitry Andric   // when there are use cases.
120306c3fb27SDimitry Andric   return nullptr;
120406c3fb27SDimitry Andric }
120506c3fb27SDimitry Andric 
12060b57cec5SDimitry Andric static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
12070b57cec5SDimitry Andric   return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
12080b57cec5SDimitry Andric }
12090b57cec5SDimitry Andric 
12100b57cec5SDimitry Andric static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
12110b57cec5SDimitry Andric   return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
12120b57cec5SDimitry Andric }
12130b57cec5SDimitry Andric 
12140b57cec5SDimitry Andric static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints,
12150b57cec5SDimitry Andric                           ConstantInt *Low, ConstantInt *High) {
12160b57cec5SDimitry Andric   ConstantRange NewRange(Low->getValue(), High->getValue());
12170b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
12180b57cec5SDimitry Andric   APInt LB = EndPoints[Size - 2]->getValue();
12190b57cec5SDimitry Andric   APInt LE = EndPoints[Size - 1]->getValue();
12200b57cec5SDimitry Andric   ConstantRange LastRange(LB, LE);
12210b57cec5SDimitry Andric   if (canBeMerged(NewRange, LastRange)) {
12220b57cec5SDimitry Andric     ConstantRange Union = LastRange.unionWith(NewRange);
12230b57cec5SDimitry Andric     Type *Ty = High->getType();
12240b57cec5SDimitry Andric     EndPoints[Size - 2] =
12250b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
12260b57cec5SDimitry Andric     EndPoints[Size - 1] =
12270b57cec5SDimitry Andric         cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
12280b57cec5SDimitry Andric     return true;
12290b57cec5SDimitry Andric   }
12300b57cec5SDimitry Andric   return false;
12310b57cec5SDimitry Andric }
12320b57cec5SDimitry Andric 
12330b57cec5SDimitry Andric static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints,
12340b57cec5SDimitry Andric                      ConstantInt *Low, ConstantInt *High) {
12350b57cec5SDimitry Andric   if (!EndPoints.empty())
12360b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, Low, High))
12370b57cec5SDimitry Andric       return;
12380b57cec5SDimitry Andric 
12390b57cec5SDimitry Andric   EndPoints.push_back(Low);
12400b57cec5SDimitry Andric   EndPoints.push_back(High);
12410b57cec5SDimitry Andric }
12420b57cec5SDimitry Andric 
12430b57cec5SDimitry Andric MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) {
12440b57cec5SDimitry Andric   // Given two ranges, we want to compute the union of the ranges. This
12450b57cec5SDimitry Andric   // is slightly complicated by having to combine the intervals and merge
12460b57cec5SDimitry Andric   // the ones that overlap.
12470b57cec5SDimitry Andric 
12480b57cec5SDimitry Andric   if (!A || !B)
12490b57cec5SDimitry Andric     return nullptr;
12500b57cec5SDimitry Andric 
12510b57cec5SDimitry Andric   if (A == B)
12520b57cec5SDimitry Andric     return A;
12530b57cec5SDimitry Andric 
12540b57cec5SDimitry Andric   // First, walk both lists in order of the lower boundary of each interval.
12550b57cec5SDimitry Andric   // At each step, try to merge the new interval to the last one we adedd.
12560b57cec5SDimitry Andric   SmallVector<ConstantInt *, 4> EndPoints;
12570b57cec5SDimitry Andric   int AI = 0;
12580b57cec5SDimitry Andric   int BI = 0;
12590b57cec5SDimitry Andric   int AN = A->getNumOperands() / 2;
12600b57cec5SDimitry Andric   int BN = B->getNumOperands() / 2;
12610b57cec5SDimitry Andric   while (AI < AN && BI < BN) {
12620b57cec5SDimitry Andric     ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
12630b57cec5SDimitry Andric     ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
12640b57cec5SDimitry Andric 
12650b57cec5SDimitry Andric     if (ALow->getValue().slt(BLow->getValue())) {
12660b57cec5SDimitry Andric       addRange(EndPoints, ALow,
12670b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
12680b57cec5SDimitry Andric       ++AI;
12690b57cec5SDimitry Andric     } else {
12700b57cec5SDimitry Andric       addRange(EndPoints, BLow,
12710b57cec5SDimitry Andric                mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
12720b57cec5SDimitry Andric       ++BI;
12730b57cec5SDimitry Andric     }
12740b57cec5SDimitry Andric   }
12750b57cec5SDimitry Andric   while (AI < AN) {
12760b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
12770b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
12780b57cec5SDimitry Andric     ++AI;
12790b57cec5SDimitry Andric   }
12800b57cec5SDimitry Andric   while (BI < BN) {
12810b57cec5SDimitry Andric     addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
12820b57cec5SDimitry Andric              mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
12830b57cec5SDimitry Andric     ++BI;
12840b57cec5SDimitry Andric   }
12850b57cec5SDimitry Andric 
12860b57cec5SDimitry Andric   // If we have more than 2 ranges (4 endpoints) we have to try to merge
12870b57cec5SDimitry Andric   // the last and first ones.
12880b57cec5SDimitry Andric   unsigned Size = EndPoints.size();
12890b57cec5SDimitry Andric   if (Size > 4) {
12900b57cec5SDimitry Andric     ConstantInt *FB = EndPoints[0];
12910b57cec5SDimitry Andric     ConstantInt *FE = EndPoints[1];
12920b57cec5SDimitry Andric     if (tryMergeRange(EndPoints, FB, FE)) {
12930b57cec5SDimitry Andric       for (unsigned i = 0; i < Size - 2; ++i) {
12940b57cec5SDimitry Andric         EndPoints[i] = EndPoints[i + 2];
12950b57cec5SDimitry Andric       }
12960b57cec5SDimitry Andric       EndPoints.resize(Size - 2);
12970b57cec5SDimitry Andric     }
12980b57cec5SDimitry Andric   }
12990b57cec5SDimitry Andric 
13000b57cec5SDimitry Andric   // If in the end we have a single range, it is possible that it is now the
13010b57cec5SDimitry Andric   // full range. Just drop the metadata in that case.
13020b57cec5SDimitry Andric   if (EndPoints.size() == 2) {
13030b57cec5SDimitry Andric     ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
13040b57cec5SDimitry Andric     if (Range.isFullSet())
13050b57cec5SDimitry Andric       return nullptr;
13060b57cec5SDimitry Andric   }
13070b57cec5SDimitry Andric 
13080b57cec5SDimitry Andric   SmallVector<Metadata *, 4> MDs;
13090b57cec5SDimitry Andric   MDs.reserve(EndPoints.size());
13100b57cec5SDimitry Andric   for (auto *I : EndPoints)
13110b57cec5SDimitry Andric     MDs.push_back(ConstantAsMetadata::get(I));
13120b57cec5SDimitry Andric   return MDNode::get(A->getContext(), MDs);
13130b57cec5SDimitry Andric }
13140b57cec5SDimitry Andric 
13150b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) {
13160b57cec5SDimitry Andric   if (!A || !B)
13170b57cec5SDimitry Andric     return nullptr;
13180b57cec5SDimitry Andric 
13190b57cec5SDimitry Andric   ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
13200b57cec5SDimitry Andric   ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
13210b57cec5SDimitry Andric   if (AVal->getZExtValue() < BVal->getZExtValue())
13220b57cec5SDimitry Andric     return A;
13230b57cec5SDimitry Andric   return B;
13240b57cec5SDimitry Andric }
13250b57cec5SDimitry Andric 
13260b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13270b57cec5SDimitry Andric // NamedMDNode implementation.
13280b57cec5SDimitry Andric //
13290b57cec5SDimitry Andric 
13300b57cec5SDimitry Andric static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) {
13310b57cec5SDimitry Andric   return *(SmallVector<TrackingMDRef, 4> *)Operands;
13320b57cec5SDimitry Andric }
13330b57cec5SDimitry Andric 
13340b57cec5SDimitry Andric NamedMDNode::NamedMDNode(const Twine &N)
13350b57cec5SDimitry Andric     : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
13360b57cec5SDimitry Andric 
13370b57cec5SDimitry Andric NamedMDNode::~NamedMDNode() {
13380b57cec5SDimitry Andric   dropAllReferences();
13390b57cec5SDimitry Andric   delete &getNMDOps(Operands);
13400b57cec5SDimitry Andric }
13410b57cec5SDimitry Andric 
13420b57cec5SDimitry Andric unsigned NamedMDNode::getNumOperands() const {
13430b57cec5SDimitry Andric   return (unsigned)getNMDOps(Operands).size();
13440b57cec5SDimitry Andric }
13450b57cec5SDimitry Andric 
13460b57cec5SDimitry Andric MDNode *NamedMDNode::getOperand(unsigned i) const {
13470b57cec5SDimitry Andric   assert(i < getNumOperands() && "Invalid Operand number!");
13480b57cec5SDimitry Andric   auto *N = getNMDOps(Operands)[i].get();
13490b57cec5SDimitry Andric   return cast_or_null<MDNode>(N);
13500b57cec5SDimitry Andric }
13510b57cec5SDimitry Andric 
13520b57cec5SDimitry Andric void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
13530b57cec5SDimitry Andric 
13540b57cec5SDimitry Andric void NamedMDNode::setOperand(unsigned I, MDNode *New) {
13550b57cec5SDimitry Andric   assert(I < getNumOperands() && "Invalid operand number");
13560b57cec5SDimitry Andric   getNMDOps(Operands)[I].reset(New);
13570b57cec5SDimitry Andric }
13580b57cec5SDimitry Andric 
13590b57cec5SDimitry Andric void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); }
13600b57cec5SDimitry Andric 
13610b57cec5SDimitry Andric void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
13620b57cec5SDimitry Andric 
13630b57cec5SDimitry Andric StringRef NamedMDNode::getName() const { return StringRef(Name); }
13640b57cec5SDimitry Andric 
13650b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
13660b57cec5SDimitry Andric // Instruction Metadata method implementations.
13670b57cec5SDimitry Andric //
13680b57cec5SDimitry Andric 
1369e8d8bef9SDimitry Andric MDNode *MDAttachments::lookup(unsigned ID) const {
13700b57cec5SDimitry Andric   for (const auto &A : Attachments)
13710b57cec5SDimitry Andric     if (A.MDKind == ID)
13720b57cec5SDimitry Andric       return A.Node;
13730b57cec5SDimitry Andric   return nullptr;
13740b57cec5SDimitry Andric }
13750b57cec5SDimitry Andric 
1376e8d8bef9SDimitry Andric void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const {
13770b57cec5SDimitry Andric   for (const auto &A : Attachments)
13780b57cec5SDimitry Andric     if (A.MDKind == ID)
13790b57cec5SDimitry Andric       Result.push_back(A.Node);
13800b57cec5SDimitry Andric }
13810b57cec5SDimitry Andric 
1382e8d8bef9SDimitry Andric void MDAttachments::getAll(
13830b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
13840b57cec5SDimitry Andric   for (const auto &A : Attachments)
13850b57cec5SDimitry Andric     Result.emplace_back(A.MDKind, A.Node);
13860b57cec5SDimitry Andric 
13870b57cec5SDimitry Andric   // Sort the resulting array so it is stable with respect to metadata IDs. We
13880b57cec5SDimitry Andric   // need to preserve the original insertion order though.
1389e8d8bef9SDimitry Andric   if (Result.size() > 1)
13900b57cec5SDimitry Andric     llvm::stable_sort(Result, less_first());
13910b57cec5SDimitry Andric }
13920b57cec5SDimitry Andric 
1393e8d8bef9SDimitry Andric void MDAttachments::set(unsigned ID, MDNode *MD) {
1394e8d8bef9SDimitry Andric   erase(ID);
1395e8d8bef9SDimitry Andric   if (MD)
1396e8d8bef9SDimitry Andric     insert(ID, *MD);
1397e8d8bef9SDimitry Andric }
1398e8d8bef9SDimitry Andric 
1399e8d8bef9SDimitry Andric void MDAttachments::insert(unsigned ID, MDNode &MD) {
1400e8d8bef9SDimitry Andric   Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1401e8d8bef9SDimitry Andric }
1402e8d8bef9SDimitry Andric 
1403e8d8bef9SDimitry Andric bool MDAttachments::erase(unsigned ID) {
1404e8d8bef9SDimitry Andric   if (empty())
1405e8d8bef9SDimitry Andric     return false;
1406e8d8bef9SDimitry Andric 
1407e8d8bef9SDimitry Andric   // Common case is one value.
1408e8d8bef9SDimitry Andric   if (Attachments.size() == 1 && Attachments.back().MDKind == ID) {
1409e8d8bef9SDimitry Andric     Attachments.pop_back();
1410e8d8bef9SDimitry Andric     return true;
1411e8d8bef9SDimitry Andric   }
1412e8d8bef9SDimitry Andric 
1413e8d8bef9SDimitry Andric   auto OldSize = Attachments.size();
1414e8d8bef9SDimitry Andric   llvm::erase_if(Attachments,
1415e8d8bef9SDimitry Andric                  [ID](const Attachment &A) { return A.MDKind == ID; });
1416e8d8bef9SDimitry Andric   return OldSize != Attachments.size();
1417e8d8bef9SDimitry Andric }
1418e8d8bef9SDimitry Andric 
1419e8d8bef9SDimitry Andric MDNode *Value::getMetadata(StringRef Kind) const {
1420e8d8bef9SDimitry Andric   if (!hasMetadata())
1421e8d8bef9SDimitry Andric     return nullptr;
14225f757f3fSDimitry Andric   unsigned KindID = getContext().getMDKindID(Kind);
14235f757f3fSDimitry Andric   return getMetadataImpl(KindID);
14245f757f3fSDimitry Andric }
14255f757f3fSDimitry Andric 
14265f757f3fSDimitry Andric MDNode *Value::getMetadataImpl(unsigned KindID) const {
14275f757f3fSDimitry Andric   const LLVMContext &Ctx = getContext();
14285f757f3fSDimitry Andric   const MDAttachments &Attachements = Ctx.pImpl->ValueMetadata.at(this);
14295f757f3fSDimitry Andric   return Attachements.lookup(KindID);
1430e8d8bef9SDimitry Andric }
1431e8d8bef9SDimitry Andric 
1432e8d8bef9SDimitry Andric void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const {
1433e8d8bef9SDimitry Andric   if (hasMetadata())
14345f757f3fSDimitry Andric     getContext().pImpl->ValueMetadata.at(this).get(KindID, MDs);
1435e8d8bef9SDimitry Andric }
1436e8d8bef9SDimitry Andric 
1437e8d8bef9SDimitry Andric void Value::getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const {
1438e8d8bef9SDimitry Andric   if (hasMetadata())
1439e8d8bef9SDimitry Andric     getMetadata(getContext().getMDKindID(Kind), MDs);
1440e8d8bef9SDimitry Andric }
1441e8d8bef9SDimitry Andric 
1442e8d8bef9SDimitry Andric void Value::getAllMetadata(
1443e8d8bef9SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1444e8d8bef9SDimitry Andric   if (hasMetadata()) {
1445e8d8bef9SDimitry Andric     assert(getContext().pImpl->ValueMetadata.count(this) &&
1446e8d8bef9SDimitry Andric            "bit out of sync with hash table");
14475f757f3fSDimitry Andric     const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1448e8d8bef9SDimitry Andric     Info.getAll(MDs);
1449e8d8bef9SDimitry Andric   }
1450e8d8bef9SDimitry Andric }
1451e8d8bef9SDimitry Andric 
1452e8d8bef9SDimitry Andric void Value::setMetadata(unsigned KindID, MDNode *Node) {
1453e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1454e8d8bef9SDimitry Andric 
1455e8d8bef9SDimitry Andric   // Handle the case when we're adding/updating metadata on a value.
1456e8d8bef9SDimitry Andric   if (Node) {
14575f757f3fSDimitry Andric     MDAttachments &Info = getContext().pImpl->ValueMetadata[this];
1458e8d8bef9SDimitry Andric     assert(!Info.empty() == HasMetadata && "bit out of sync with hash table");
1459e8d8bef9SDimitry Andric     if (Info.empty())
1460e8d8bef9SDimitry Andric       HasMetadata = true;
1461e8d8bef9SDimitry Andric     Info.set(KindID, Node);
1462e8d8bef9SDimitry Andric     return;
1463e8d8bef9SDimitry Andric   }
1464e8d8bef9SDimitry Andric 
1465e8d8bef9SDimitry Andric   // Otherwise, we're removing metadata from an instruction.
1466e8d8bef9SDimitry Andric   assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) &&
1467e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1468e8d8bef9SDimitry Andric   if (!HasMetadata)
1469e8d8bef9SDimitry Andric     return; // Nothing to remove!
14705f757f3fSDimitry Andric   MDAttachments &Info = getContext().pImpl->ValueMetadata.find(this)->second;
1471e8d8bef9SDimitry Andric 
1472e8d8bef9SDimitry Andric   // Handle removal of an existing value.
1473e8d8bef9SDimitry Andric   Info.erase(KindID);
1474e8d8bef9SDimitry Andric   if (!Info.empty())
1475e8d8bef9SDimitry Andric     return;
1476e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1477e8d8bef9SDimitry Andric   HasMetadata = false;
1478e8d8bef9SDimitry Andric }
1479e8d8bef9SDimitry Andric 
1480e8d8bef9SDimitry Andric void Value::setMetadata(StringRef Kind, MDNode *Node) {
1481e8d8bef9SDimitry Andric   if (!Node && !HasMetadata)
1482e8d8bef9SDimitry Andric     return;
1483e8d8bef9SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
1484e8d8bef9SDimitry Andric }
1485e8d8bef9SDimitry Andric 
1486e8d8bef9SDimitry Andric void Value::addMetadata(unsigned KindID, MDNode &MD) {
1487e8d8bef9SDimitry Andric   assert(isa<Instruction>(this) || isa<GlobalObject>(this));
1488e8d8bef9SDimitry Andric   if (!HasMetadata)
1489e8d8bef9SDimitry Andric     HasMetadata = true;
1490e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata[this].insert(KindID, MD);
1491e8d8bef9SDimitry Andric }
1492e8d8bef9SDimitry Andric 
1493e8d8bef9SDimitry Andric void Value::addMetadata(StringRef Kind, MDNode &MD) {
1494e8d8bef9SDimitry Andric   addMetadata(getContext().getMDKindID(Kind), MD);
1495e8d8bef9SDimitry Andric }
1496e8d8bef9SDimitry Andric 
1497e8d8bef9SDimitry Andric bool Value::eraseMetadata(unsigned KindID) {
1498e8d8bef9SDimitry Andric   // Nothing to unset.
1499e8d8bef9SDimitry Andric   if (!HasMetadata)
1500e8d8bef9SDimitry Andric     return false;
1501e8d8bef9SDimitry Andric 
15025f757f3fSDimitry Andric   MDAttachments &Store = getContext().pImpl->ValueMetadata.find(this)->second;
1503e8d8bef9SDimitry Andric   bool Changed = Store.erase(KindID);
1504e8d8bef9SDimitry Andric   if (Store.empty())
1505e8d8bef9SDimitry Andric     clearMetadata();
1506e8d8bef9SDimitry Andric   return Changed;
1507e8d8bef9SDimitry Andric }
1508e8d8bef9SDimitry Andric 
1509e8d8bef9SDimitry Andric void Value::clearMetadata() {
1510e8d8bef9SDimitry Andric   if (!HasMetadata)
1511e8d8bef9SDimitry Andric     return;
1512e8d8bef9SDimitry Andric   assert(getContext().pImpl->ValueMetadata.count(this) &&
1513e8d8bef9SDimitry Andric          "bit out of sync with hash table");
1514e8d8bef9SDimitry Andric   getContext().pImpl->ValueMetadata.erase(this);
1515e8d8bef9SDimitry Andric   HasMetadata = false;
1516e8d8bef9SDimitry Andric }
1517e8d8bef9SDimitry Andric 
15180b57cec5SDimitry Andric void Instruction::setMetadata(StringRef Kind, MDNode *Node) {
15190b57cec5SDimitry Andric   if (!Node && !hasMetadata())
15200b57cec5SDimitry Andric     return;
15210b57cec5SDimitry Andric   setMetadata(getContext().getMDKindID(Kind), Node);
15220b57cec5SDimitry Andric }
15230b57cec5SDimitry Andric 
15240b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
15255f757f3fSDimitry Andric   const LLVMContext &Ctx = getContext();
15265f757f3fSDimitry Andric   unsigned KindID = Ctx.getMDKindID(Kind);
15275f757f3fSDimitry Andric   if (KindID == LLVMContext::MD_dbg)
15285f757f3fSDimitry Andric     return DbgLoc.getAsMDNode();
15295f757f3fSDimitry Andric   return Value::getMetadata(KindID);
15300b57cec5SDimitry Andric }
15310b57cec5SDimitry Andric 
15320b57cec5SDimitry Andric void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) {
1533e8d8bef9SDimitry Andric   if (!Value::hasMetadata())
15340b57cec5SDimitry Andric     return; // Nothing to remove!
15350b57cec5SDimitry Andric 
1536e8d8bef9SDimitry Andric   SmallSet<unsigned, 4> KnownSet;
1537e8d8bef9SDimitry Andric   KnownSet.insert(KnownIDs.begin(), KnownIDs.end());
1538e8d8bef9SDimitry Andric 
1539bdd1243dSDimitry Andric   // A DIAssignID attachment is debug metadata, don't drop it.
1540bdd1243dSDimitry Andric   KnownSet.insert(LLVMContext::MD_DIAssignID);
1541bdd1243dSDimitry Andric 
1542e8d8bef9SDimitry Andric   auto &MetadataStore = getContext().pImpl->ValueMetadata;
15435f757f3fSDimitry Andric   MDAttachments &Info = MetadataStore.find(this)->second;
1544e8d8bef9SDimitry Andric   assert(!Info.empty() && "bit out of sync with hash table");
1545e8d8bef9SDimitry Andric   Info.remove_if([&KnownSet](const MDAttachments::Attachment &I) {
1546e8d8bef9SDimitry Andric     return !KnownSet.count(I.MDKind);
15470b57cec5SDimitry Andric   });
15480b57cec5SDimitry Andric 
15490b57cec5SDimitry Andric   if (Info.empty()) {
15500b57cec5SDimitry Andric     // Drop our entry at the store.
1551e8d8bef9SDimitry Andric     clearMetadata();
15520b57cec5SDimitry Andric   }
15530b57cec5SDimitry Andric }
15540b57cec5SDimitry Andric 
1555bdd1243dSDimitry Andric void Instruction::updateDIAssignIDMapping(DIAssignID *ID) {
1556bdd1243dSDimitry Andric   auto &IDToInstrs = getContext().pImpl->AssignmentIDToInstrs;
1557bdd1243dSDimitry Andric   if (const DIAssignID *CurrentID =
1558bdd1243dSDimitry Andric           cast_or_null<DIAssignID>(getMetadata(LLVMContext::MD_DIAssignID))) {
1559bdd1243dSDimitry Andric     // Nothing to do if the ID isn't changing.
1560bdd1243dSDimitry Andric     if (ID == CurrentID)
1561bdd1243dSDimitry Andric       return;
1562bdd1243dSDimitry Andric 
1563bdd1243dSDimitry Andric     // Unmap this instruction from its current ID.
1564bdd1243dSDimitry Andric     auto InstrsIt = IDToInstrs.find(CurrentID);
1565bdd1243dSDimitry Andric     assert(InstrsIt != IDToInstrs.end() &&
1566bdd1243dSDimitry Andric            "Expect existing attachment to be mapped");
1567bdd1243dSDimitry Andric 
1568bdd1243dSDimitry Andric     auto &InstVec = InstrsIt->second;
1569*cb14a3feSDimitry Andric     auto *InstIt = llvm::find(InstVec, this);
1570bdd1243dSDimitry Andric     assert(InstIt != InstVec.end() &&
1571bdd1243dSDimitry Andric            "Expect instruction to be mapped to attachment");
1572bdd1243dSDimitry Andric     // The vector contains a ptr to this. If this is the only element in the
1573bdd1243dSDimitry Andric     // vector, remove the ID:vector entry, otherwise just remove the
1574bdd1243dSDimitry Andric     // instruction from the vector.
1575bdd1243dSDimitry Andric     if (InstVec.size() == 1)
1576bdd1243dSDimitry Andric       IDToInstrs.erase(InstrsIt);
1577bdd1243dSDimitry Andric     else
1578bdd1243dSDimitry Andric       InstVec.erase(InstIt);
1579bdd1243dSDimitry Andric   }
1580bdd1243dSDimitry Andric 
1581bdd1243dSDimitry Andric   // Map this instruction to the new ID.
1582bdd1243dSDimitry Andric   if (ID)
1583bdd1243dSDimitry Andric     IDToInstrs[ID].push_back(this);
1584bdd1243dSDimitry Andric }
1585bdd1243dSDimitry Andric 
15860b57cec5SDimitry Andric void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
15870b57cec5SDimitry Andric   if (!Node && !hasMetadata())
15880b57cec5SDimitry Andric     return;
15890b57cec5SDimitry Andric 
15900b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
15910b57cec5SDimitry Andric   if (KindID == LLVMContext::MD_dbg) {
15920b57cec5SDimitry Andric     DbgLoc = DebugLoc(Node);
15930b57cec5SDimitry Andric     return;
15940b57cec5SDimitry Andric   }
15950b57cec5SDimitry Andric 
1596bdd1243dSDimitry Andric   // Update DIAssignID to Instruction(s) mapping.
1597bdd1243dSDimitry Andric   if (KindID == LLVMContext::MD_DIAssignID) {
1598bdd1243dSDimitry Andric     // The DIAssignID tracking infrastructure doesn't support RAUWing temporary
1599bdd1243dSDimitry Andric     // nodes with DIAssignIDs. The cast_or_null below would also catch this, but
1600bdd1243dSDimitry Andric     // having a dedicated assert helps make this obvious.
1601bdd1243dSDimitry Andric     assert((!Node || !Node->isTemporary()) &&
1602bdd1243dSDimitry Andric            "Temporary DIAssignIDs are invalid");
1603bdd1243dSDimitry Andric     updateDIAssignIDMapping(cast_or_null<DIAssignID>(Node));
1604bdd1243dSDimitry Andric   }
1605bdd1243dSDimitry Andric 
1606e8d8bef9SDimitry Andric   Value::setMetadata(KindID, Node);
16070b57cec5SDimitry Andric }
16080b57cec5SDimitry Andric 
160906c3fb27SDimitry Andric void Instruction::addAnnotationMetadata(SmallVector<StringRef> Annotations) {
16105f757f3fSDimitry Andric   SmallVector<Metadata *, 4> Names;
16115f757f3fSDimitry Andric   if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
161206c3fb27SDimitry Andric     SmallSetVector<StringRef, 2> AnnotationsSet(Annotations.begin(),
161306c3fb27SDimitry Andric                                                 Annotations.end());
161406c3fb27SDimitry Andric     auto *Tuple = cast<MDTuple>(Existing);
161506c3fb27SDimitry Andric     for (auto &N : Tuple->operands()) {
161606c3fb27SDimitry Andric       if (isa<MDString>(N.get())) {
161706c3fb27SDimitry Andric         Names.push_back(N);
161806c3fb27SDimitry Andric         continue;
161906c3fb27SDimitry Andric       }
162006c3fb27SDimitry Andric       auto *MDAnnotationTuple = cast<MDTuple>(N);
162106c3fb27SDimitry Andric       if (any_of(MDAnnotationTuple->operands(), [&AnnotationsSet](auto &Op) {
162206c3fb27SDimitry Andric             return AnnotationsSet.contains(cast<MDString>(Op)->getString());
162306c3fb27SDimitry Andric           }))
162406c3fb27SDimitry Andric         return;
162506c3fb27SDimitry Andric       Names.push_back(N);
162606c3fb27SDimitry Andric     }
162706c3fb27SDimitry Andric   }
162806c3fb27SDimitry Andric 
16295f757f3fSDimitry Andric   MDBuilder MDB(getContext());
163006c3fb27SDimitry Andric   SmallVector<Metadata *> MDAnnotationStrings;
163106c3fb27SDimitry Andric   for (StringRef Annotation : Annotations)
163206c3fb27SDimitry Andric     MDAnnotationStrings.push_back(MDB.createString(Annotation));
163306c3fb27SDimitry Andric   MDNode *InfoTuple = MDTuple::get(getContext(), MDAnnotationStrings);
163406c3fb27SDimitry Andric   Names.push_back(InfoTuple);
163506c3fb27SDimitry Andric   MDNode *MD = MDTuple::get(getContext(), Names);
163606c3fb27SDimitry Andric   setMetadata(LLVMContext::MD_annotation, MD);
163706c3fb27SDimitry Andric }
163806c3fb27SDimitry Andric 
1639e8d8bef9SDimitry Andric void Instruction::addAnnotationMetadata(StringRef Name) {
1640e8d8bef9SDimitry Andric   SmallVector<Metadata *, 4> Names;
16415f757f3fSDimitry Andric   if (auto *Existing = getMetadata(LLVMContext::MD_annotation)) {
1642e8d8bef9SDimitry Andric     auto *Tuple = cast<MDTuple>(Existing);
1643e8d8bef9SDimitry Andric     for (auto &N : Tuple->operands()) {
164406c3fb27SDimitry Andric       if (isa<MDString>(N.get()) &&
164506c3fb27SDimitry Andric           cast<MDString>(N.get())->getString() == Name)
164606c3fb27SDimitry Andric         return;
1647e8d8bef9SDimitry Andric       Names.push_back(N.get());
1648e8d8bef9SDimitry Andric     }
1649e8d8bef9SDimitry Andric   }
16500b57cec5SDimitry Andric 
16515f757f3fSDimitry Andric   MDBuilder MDB(getContext());
165206c3fb27SDimitry Andric   Names.push_back(MDB.createString(Name));
1653e8d8bef9SDimitry Andric   MDNode *MD = MDTuple::get(getContext(), Names);
1654e8d8bef9SDimitry Andric   setMetadata(LLVMContext::MD_annotation, MD);
16550b57cec5SDimitry Andric }
16560b57cec5SDimitry Andric 
1657349cc55cSDimitry Andric AAMDNodes Instruction::getAAMetadata() const {
1658349cc55cSDimitry Andric   AAMDNodes Result;
1659bdd1243dSDimitry Andric   // Not using Instruction::hasMetadata() because we're not interested in
1660bdd1243dSDimitry Andric   // DebugInfoMetadata.
1661bdd1243dSDimitry Andric   if (Value::hasMetadata()) {
16625f757f3fSDimitry Andric     const MDAttachments &Info = getContext().pImpl->ValueMetadata.at(this);
1663bdd1243dSDimitry Andric     Result.TBAA = Info.lookup(LLVMContext::MD_tbaa);
1664bdd1243dSDimitry Andric     Result.TBAAStruct = Info.lookup(LLVMContext::MD_tbaa_struct);
1665bdd1243dSDimitry Andric     Result.Scope = Info.lookup(LLVMContext::MD_alias_scope);
1666bdd1243dSDimitry Andric     Result.NoAlias = Info.lookup(LLVMContext::MD_noalias);
1667bdd1243dSDimitry Andric   }
1668349cc55cSDimitry Andric   return Result;
1669349cc55cSDimitry Andric }
1670349cc55cSDimitry Andric 
16710b57cec5SDimitry Andric void Instruction::setAAMetadata(const AAMDNodes &N) {
16720b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1673480093f4SDimitry Andric   setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct);
16740b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_alias_scope, N.Scope);
16750b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_noalias, N.NoAlias);
16760b57cec5SDimitry Andric }
16770b57cec5SDimitry Andric 
167806c3fb27SDimitry Andric void Instruction::setNoSanitizeMetadata() {
167906c3fb27SDimitry Andric   setMetadata(llvm::LLVMContext::MD_nosanitize,
168006c3fb27SDimitry Andric               llvm::MDNode::get(getContext(), std::nullopt));
168106c3fb27SDimitry Andric }
168206c3fb27SDimitry Andric 
16830b57cec5SDimitry Andric void Instruction::getAllMetadataImpl(
16840b57cec5SDimitry Andric     SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
16850b57cec5SDimitry Andric   Result.clear();
16860b57cec5SDimitry Andric 
16870b57cec5SDimitry Andric   // Handle 'dbg' as a special case since it is not stored in the hash table.
16880b57cec5SDimitry Andric   if (DbgLoc) {
16890b57cec5SDimitry Andric     Result.push_back(
16900b57cec5SDimitry Andric         std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
16910b57cec5SDimitry Andric   }
1692e8d8bef9SDimitry Andric   Value::getAllMetadata(Result);
16930b57cec5SDimitry Andric }
16940b57cec5SDimitry Andric 
16950b57cec5SDimitry Andric bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const {
1696fe6060f1SDimitry Andric   assert(
1697fe6060f1SDimitry Andric       (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select ||
1698fe6060f1SDimitry Andric        getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke ||
1699fe6060f1SDimitry Andric        getOpcode() == Instruction::IndirectBr ||
17000b57cec5SDimitry Andric        getOpcode() == Instruction::Switch) &&
17010b57cec5SDimitry Andric       "Looking for branch weights on something besides branch");
17020b57cec5SDimitry Andric 
1703bdd1243dSDimitry Andric   return ::extractProfTotalWeight(*this, TotalVal);
17040b57cec5SDimitry Andric }
17050b57cec5SDimitry Andric 
17060b57cec5SDimitry Andric void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) {
17070b57cec5SDimitry Andric   SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
17080b57cec5SDimitry Andric   Other->getAllMetadata(MDs);
17090b57cec5SDimitry Andric   for (auto &MD : MDs) {
17100b57cec5SDimitry Andric     // We need to adjust the type metadata offset.
17110b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_type) {
17120b57cec5SDimitry Andric       auto *OffsetConst = cast<ConstantInt>(
17130b57cec5SDimitry Andric           cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
17140b57cec5SDimitry Andric       Metadata *TypeId = MD.second->getOperand(1);
17150b57cec5SDimitry Andric       auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
17160b57cec5SDimitry Andric           OffsetConst->getType(), OffsetConst->getValue() + Offset));
17170b57cec5SDimitry Andric       addMetadata(LLVMContext::MD_type,
17180b57cec5SDimitry Andric                   *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
17190b57cec5SDimitry Andric       continue;
17200b57cec5SDimitry Andric     }
17210b57cec5SDimitry Andric     // If an offset adjustment was specified we need to modify the DIExpression
17220b57cec5SDimitry Andric     // to prepend the adjustment:
17230b57cec5SDimitry Andric     // !DIExpression(DW_OP_plus, Offset, [original expr])
17240b57cec5SDimitry Andric     auto *Attachment = MD.second;
17250b57cec5SDimitry Andric     if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
17260b57cec5SDimitry Andric       DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment);
17270b57cec5SDimitry Andric       DIExpression *E = nullptr;
17280b57cec5SDimitry Andric       if (!GV) {
17290b57cec5SDimitry Andric         auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
17300b57cec5SDimitry Andric         GV = GVE->getVariable();
17310b57cec5SDimitry Andric         E = GVE->getExpression();
17320b57cec5SDimitry Andric       }
17330b57cec5SDimitry Andric       ArrayRef<uint64_t> OrigElements;
17340b57cec5SDimitry Andric       if (E)
17350b57cec5SDimitry Andric         OrigElements = E->getElements();
17360b57cec5SDimitry Andric       std::vector<uint64_t> Elements(OrigElements.size() + 2);
17370b57cec5SDimitry Andric       Elements[0] = dwarf::DW_OP_plus_uconst;
17380b57cec5SDimitry Andric       Elements[1] = Offset;
17390b57cec5SDimitry Andric       llvm::copy(OrigElements, Elements.begin() + 2);
17400b57cec5SDimitry Andric       E = DIExpression::get(getContext(), Elements);
17410b57cec5SDimitry Andric       Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
17420b57cec5SDimitry Andric     }
17430b57cec5SDimitry Andric     addMetadata(MD.first, *Attachment);
17440b57cec5SDimitry Andric   }
17450b57cec5SDimitry Andric }
17460b57cec5SDimitry Andric 
17470b57cec5SDimitry Andric void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) {
17480b57cec5SDimitry Andric   addMetadata(
17490b57cec5SDimitry Andric       LLVMContext::MD_type,
17500b57cec5SDimitry Andric       *MDTuple::get(getContext(),
17510b57cec5SDimitry Andric                     {ConstantAsMetadata::get(ConstantInt::get(
17520b57cec5SDimitry Andric                          Type::getInt64Ty(getContext()), Offset)),
17530b57cec5SDimitry Andric                      TypeID}));
17540b57cec5SDimitry Andric }
17550b57cec5SDimitry Andric 
17565ffd83dbSDimitry Andric void GlobalObject::setVCallVisibilityMetadata(VCallVisibility Visibility) {
17575ffd83dbSDimitry Andric   // Remove any existing vcall visibility metadata first in case we are
17585ffd83dbSDimitry Andric   // updating.
17595ffd83dbSDimitry Andric   eraseMetadata(LLVMContext::MD_vcall_visibility);
17608bcb0991SDimitry Andric   addMetadata(LLVMContext::MD_vcall_visibility,
17618bcb0991SDimitry Andric               *MDNode::get(getContext(),
17628bcb0991SDimitry Andric                            {ConstantAsMetadata::get(ConstantInt::get(
17638bcb0991SDimitry Andric                                Type::getInt64Ty(getContext()), Visibility))}));
17648bcb0991SDimitry Andric }
17658bcb0991SDimitry Andric 
17668bcb0991SDimitry Andric GlobalObject::VCallVisibility GlobalObject::getVCallVisibility() const {
17678bcb0991SDimitry Andric   if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) {
17688bcb0991SDimitry Andric     uint64_t Val = cast<ConstantInt>(
17698bcb0991SDimitry Andric                        cast<ConstantAsMetadata>(MD->getOperand(0))->getValue())
17708bcb0991SDimitry Andric                        ->getZExtValue();
17718bcb0991SDimitry Andric     assert(Val <= 2 && "unknown vcall visibility!");
17728bcb0991SDimitry Andric     return (VCallVisibility)Val;
17738bcb0991SDimitry Andric   }
17748bcb0991SDimitry Andric   return VCallVisibility::VCallVisibilityPublic;
17758bcb0991SDimitry Andric }
17768bcb0991SDimitry Andric 
17770b57cec5SDimitry Andric void Function::setSubprogram(DISubprogram *SP) {
17780b57cec5SDimitry Andric   setMetadata(LLVMContext::MD_dbg, SP);
17790b57cec5SDimitry Andric }
17800b57cec5SDimitry Andric 
17810b57cec5SDimitry Andric DISubprogram *Function::getSubprogram() const {
17820b57cec5SDimitry Andric   return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
17830b57cec5SDimitry Andric }
17840b57cec5SDimitry Andric 
1785bdd1243dSDimitry Andric bool Function::shouldEmitDebugInfoForProfiling() const {
17860b57cec5SDimitry Andric   if (DISubprogram *SP = getSubprogram()) {
17870b57cec5SDimitry Andric     if (DICompileUnit *CU = SP->getUnit()) {
17880b57cec5SDimitry Andric       return CU->getDebugInfoForProfiling();
17890b57cec5SDimitry Andric     }
17900b57cec5SDimitry Andric   }
17910b57cec5SDimitry Andric   return false;
17920b57cec5SDimitry Andric }
17930b57cec5SDimitry Andric 
17940b57cec5SDimitry Andric void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) {
17950b57cec5SDimitry Andric   addMetadata(LLVMContext::MD_dbg, *GV);
17960b57cec5SDimitry Andric }
17970b57cec5SDimitry Andric 
17980b57cec5SDimitry Andric void GlobalVariable::getDebugInfo(
17990b57cec5SDimitry Andric     SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const {
18000b57cec5SDimitry Andric   SmallVector<MDNode *, 1> MDs;
18010b57cec5SDimitry Andric   getMetadata(LLVMContext::MD_dbg, MDs);
18020b57cec5SDimitry Andric   for (MDNode *MD : MDs)
18030b57cec5SDimitry Andric     GVs.push_back(cast<DIGlobalVariableExpression>(MD));
18040b57cec5SDimitry Andric }
1805