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