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 "SymbolTableListTraitsImpl.h" 170b57cec5SDimitry Andric #include "llvm/ADT/APFloat.h" 180b57cec5SDimitry Andric #include "llvm/ADT/APInt.h" 190b57cec5SDimitry Andric #include "llvm/ADT/ArrayRef.h" 200b57cec5SDimitry Andric #include "llvm/ADT/DenseSet.h" 210b57cec5SDimitry Andric #include "llvm/ADT/None.h" 220b57cec5SDimitry Andric #include "llvm/ADT/STLExtras.h" 230b57cec5SDimitry Andric #include "llvm/ADT/SetVector.h" 240b57cec5SDimitry Andric #include "llvm/ADT/SmallPtrSet.h" 250b57cec5SDimitry Andric #include "llvm/ADT/SmallSet.h" 260b57cec5SDimitry Andric #include "llvm/ADT/SmallVector.h" 270b57cec5SDimitry Andric #include "llvm/ADT/StringMap.h" 280b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h" 290b57cec5SDimitry Andric #include "llvm/ADT/Twine.h" 300b57cec5SDimitry Andric #include "llvm/IR/Argument.h" 310b57cec5SDimitry Andric #include "llvm/IR/BasicBlock.h" 320b57cec5SDimitry Andric #include "llvm/IR/Constant.h" 330b57cec5SDimitry Andric #include "llvm/IR/ConstantRange.h" 340b57cec5SDimitry Andric #include "llvm/IR/Constants.h" 350b57cec5SDimitry Andric #include "llvm/IR/DebugInfoMetadata.h" 360b57cec5SDimitry Andric #include "llvm/IR/DebugLoc.h" 370b57cec5SDimitry Andric #include "llvm/IR/Function.h" 380b57cec5SDimitry Andric #include "llvm/IR/GlobalObject.h" 390b57cec5SDimitry Andric #include "llvm/IR/GlobalVariable.h" 400b57cec5SDimitry Andric #include "llvm/IR/Instruction.h" 410b57cec5SDimitry Andric #include "llvm/IR/LLVMContext.h" 42e8d8bef9SDimitry Andric #include "llvm/IR/MDBuilder.h" 430b57cec5SDimitry Andric #include "llvm/IR/Module.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/IR/ValueHandle.h" 480b57cec5SDimitry Andric #include "llvm/Support/Casting.h" 490b57cec5SDimitry Andric #include "llvm/Support/ErrorHandling.h" 500b57cec5SDimitry Andric #include "llvm/Support/MathExtras.h" 510b57cec5SDimitry Andric #include <algorithm> 520b57cec5SDimitry Andric #include <cassert> 530b57cec5SDimitry Andric #include <cstddef> 540b57cec5SDimitry Andric #include <cstdint> 550b57cec5SDimitry Andric #include <iterator> 560b57cec5SDimitry Andric #include <tuple> 570b57cec5SDimitry Andric #include <type_traits> 580b57cec5SDimitry Andric #include <utility> 590b57cec5SDimitry Andric #include <vector> 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric using namespace llvm; 620b57cec5SDimitry Andric 630b57cec5SDimitry Andric MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD) 640b57cec5SDimitry Andric : Value(Ty, MetadataAsValueVal), MD(MD) { 650b57cec5SDimitry Andric track(); 660b57cec5SDimitry Andric } 670b57cec5SDimitry Andric 680b57cec5SDimitry Andric MetadataAsValue::~MetadataAsValue() { 690b57cec5SDimitry Andric getType()->getContext().pImpl->MetadataAsValues.erase(MD); 700b57cec5SDimitry Andric untrack(); 710b57cec5SDimitry Andric } 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric /// Canonicalize metadata arguments to intrinsics. 740b57cec5SDimitry Andric /// 750b57cec5SDimitry Andric /// To support bitcode upgrades (and assembly semantic sugar) for \a 760b57cec5SDimitry Andric /// MetadataAsValue, we need to canonicalize certain metadata. 770b57cec5SDimitry Andric /// 780b57cec5SDimitry Andric /// - nullptr is replaced by an empty MDNode. 790b57cec5SDimitry Andric /// - An MDNode with a single null operand is replaced by an empty MDNode. 800b57cec5SDimitry Andric /// - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped. 810b57cec5SDimitry Andric /// 820b57cec5SDimitry Andric /// This maintains readability of bitcode from when metadata was a type of 830b57cec5SDimitry Andric /// value, and these bridges were unnecessary. 840b57cec5SDimitry Andric static Metadata *canonicalizeMetadataForValue(LLVMContext &Context, 850b57cec5SDimitry Andric Metadata *MD) { 860b57cec5SDimitry Andric if (!MD) 870b57cec5SDimitry Andric // !{} 880b57cec5SDimitry Andric return MDNode::get(Context, None); 890b57cec5SDimitry Andric 900b57cec5SDimitry Andric // Return early if this isn't a single-operand MDNode. 910b57cec5SDimitry Andric auto *N = dyn_cast<MDNode>(MD); 920b57cec5SDimitry Andric if (!N || N->getNumOperands() != 1) 930b57cec5SDimitry Andric return MD; 940b57cec5SDimitry Andric 950b57cec5SDimitry Andric if (!N->getOperand(0)) 960b57cec5SDimitry Andric // !{} 970b57cec5SDimitry Andric return MDNode::get(Context, None); 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0))) 1000b57cec5SDimitry Andric // Look through the MDNode. 1010b57cec5SDimitry Andric return C; 1020b57cec5SDimitry Andric 1030b57cec5SDimitry Andric return MD; 1040b57cec5SDimitry Andric } 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) { 1070b57cec5SDimitry Andric MD = canonicalizeMetadataForValue(Context, MD); 1080b57cec5SDimitry Andric auto *&Entry = Context.pImpl->MetadataAsValues[MD]; 1090b57cec5SDimitry Andric if (!Entry) 1100b57cec5SDimitry Andric Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD); 1110b57cec5SDimitry Andric return Entry; 1120b57cec5SDimitry Andric } 1130b57cec5SDimitry Andric 1140b57cec5SDimitry Andric MetadataAsValue *MetadataAsValue::getIfExists(LLVMContext &Context, 1150b57cec5SDimitry Andric Metadata *MD) { 1160b57cec5SDimitry Andric MD = canonicalizeMetadataForValue(Context, MD); 1170b57cec5SDimitry Andric auto &Store = Context.pImpl->MetadataAsValues; 1180b57cec5SDimitry Andric return Store.lookup(MD); 1190b57cec5SDimitry Andric } 1200b57cec5SDimitry Andric 1210b57cec5SDimitry Andric void MetadataAsValue::handleChangedMetadata(Metadata *MD) { 1220b57cec5SDimitry Andric LLVMContext &Context = getContext(); 1230b57cec5SDimitry Andric MD = canonicalizeMetadataForValue(Context, MD); 1240b57cec5SDimitry Andric auto &Store = Context.pImpl->MetadataAsValues; 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric // Stop tracking the old metadata. 1270b57cec5SDimitry Andric Store.erase(this->MD); 1280b57cec5SDimitry Andric untrack(); 1290b57cec5SDimitry Andric this->MD = nullptr; 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric // Start tracking MD, or RAUW if necessary. 1320b57cec5SDimitry Andric auto *&Entry = Store[MD]; 1330b57cec5SDimitry Andric if (Entry) { 1340b57cec5SDimitry Andric replaceAllUsesWith(Entry); 1350b57cec5SDimitry Andric delete this; 1360b57cec5SDimitry Andric return; 1370b57cec5SDimitry Andric } 1380b57cec5SDimitry Andric 1390b57cec5SDimitry Andric this->MD = MD; 1400b57cec5SDimitry Andric track(); 1410b57cec5SDimitry Andric Entry = this; 1420b57cec5SDimitry Andric } 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric void MetadataAsValue::track() { 1450b57cec5SDimitry Andric if (MD) 1460b57cec5SDimitry Andric MetadataTracking::track(&MD, *MD, *this); 1470b57cec5SDimitry Andric } 1480b57cec5SDimitry Andric 1490b57cec5SDimitry Andric void MetadataAsValue::untrack() { 1500b57cec5SDimitry Andric if (MD) 1510b57cec5SDimitry Andric MetadataTracking::untrack(MD); 1520b57cec5SDimitry Andric } 1530b57cec5SDimitry Andric 1540b57cec5SDimitry Andric bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) { 1550b57cec5SDimitry Andric assert(Ref && "Expected live reference"); 1560b57cec5SDimitry Andric assert((Owner || *static_cast<Metadata **>(Ref) == &MD) && 1570b57cec5SDimitry Andric "Reference without owner must be direct"); 1580b57cec5SDimitry Andric if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) { 1590b57cec5SDimitry Andric R->addRef(Ref, Owner); 1600b57cec5SDimitry Andric return true; 1610b57cec5SDimitry Andric } 1620b57cec5SDimitry Andric if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) { 1630b57cec5SDimitry Andric assert(!PH->Use && "Placeholders can only be used once"); 1640b57cec5SDimitry Andric assert(!Owner && "Unexpected callback to owner"); 1650b57cec5SDimitry Andric PH->Use = static_cast<Metadata **>(Ref); 1660b57cec5SDimitry Andric return true; 1670b57cec5SDimitry Andric } 1680b57cec5SDimitry Andric return false; 1690b57cec5SDimitry Andric } 1700b57cec5SDimitry Andric 1710b57cec5SDimitry Andric void MetadataTracking::untrack(void *Ref, Metadata &MD) { 1720b57cec5SDimitry Andric assert(Ref && "Expected live reference"); 1730b57cec5SDimitry Andric if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) 1740b57cec5SDimitry Andric R->dropRef(Ref); 1750b57cec5SDimitry Andric else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) 1760b57cec5SDimitry Andric PH->Use = nullptr; 1770b57cec5SDimitry Andric } 1780b57cec5SDimitry Andric 1790b57cec5SDimitry Andric bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) { 1800b57cec5SDimitry Andric assert(Ref && "Expected live reference"); 1810b57cec5SDimitry Andric assert(New && "Expected live reference"); 1820b57cec5SDimitry Andric assert(Ref != New && "Expected change"); 1830b57cec5SDimitry Andric if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) { 1840b57cec5SDimitry Andric R->moveRef(Ref, New, MD); 1850b57cec5SDimitry Andric return true; 1860b57cec5SDimitry Andric } 1870b57cec5SDimitry Andric assert(!isa<DistinctMDOperandPlaceholder>(MD) && 1880b57cec5SDimitry Andric "Unexpected move of an MDOperand"); 1890b57cec5SDimitry Andric assert(!isReplaceable(MD) && 1900b57cec5SDimitry Andric "Expected un-replaceable metadata, since we didn't move a reference"); 1910b57cec5SDimitry Andric return false; 1920b57cec5SDimitry Andric } 1930b57cec5SDimitry Andric 1940b57cec5SDimitry Andric bool MetadataTracking::isReplaceable(const Metadata &MD) { 1950b57cec5SDimitry Andric return ReplaceableMetadataImpl::isReplaceable(MD); 1960b57cec5SDimitry Andric } 1970b57cec5SDimitry Andric 198*fe6060f1SDimitry Andric SmallVector<Metadata *> ReplaceableMetadataImpl::getAllArgListUsers() { 199*fe6060f1SDimitry Andric SmallVector<std::pair<OwnerTy, uint64_t> *> MDUsersWithID; 200*fe6060f1SDimitry Andric for (auto Pair : UseMap) { 201*fe6060f1SDimitry Andric OwnerTy Owner = Pair.second.first; 202*fe6060f1SDimitry Andric if (!Owner.is<Metadata *>()) 203*fe6060f1SDimitry Andric continue; 204*fe6060f1SDimitry Andric Metadata *OwnerMD = Owner.get<Metadata *>(); 205*fe6060f1SDimitry Andric if (OwnerMD->getMetadataID() == Metadata::DIArgListKind) 206*fe6060f1SDimitry Andric MDUsersWithID.push_back(&UseMap[Pair.first]); 207*fe6060f1SDimitry Andric } 208*fe6060f1SDimitry Andric llvm::sort(MDUsersWithID, [](auto UserA, auto UserB) { 209*fe6060f1SDimitry Andric return UserA->second < UserB->second; 210*fe6060f1SDimitry Andric }); 211*fe6060f1SDimitry Andric SmallVector<Metadata *> MDUsers; 212*fe6060f1SDimitry Andric for (auto UserWithID : MDUsersWithID) 213*fe6060f1SDimitry Andric MDUsers.push_back(UserWithID->first.get<Metadata *>()); 214*fe6060f1SDimitry Andric return MDUsers; 215*fe6060f1SDimitry Andric } 216*fe6060f1SDimitry Andric 2170b57cec5SDimitry Andric void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) { 2180b57cec5SDimitry Andric bool WasInserted = 2190b57cec5SDimitry Andric UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex))) 2200b57cec5SDimitry Andric .second; 2210b57cec5SDimitry Andric (void)WasInserted; 2220b57cec5SDimitry Andric assert(WasInserted && "Expected to add a reference"); 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric ++NextIndex; 2250b57cec5SDimitry Andric assert(NextIndex != 0 && "Unexpected overflow"); 2260b57cec5SDimitry Andric } 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andric void ReplaceableMetadataImpl::dropRef(void *Ref) { 2290b57cec5SDimitry Andric bool WasErased = UseMap.erase(Ref); 2300b57cec5SDimitry Andric (void)WasErased; 2310b57cec5SDimitry Andric assert(WasErased && "Expected to drop a reference"); 2320b57cec5SDimitry Andric } 2330b57cec5SDimitry Andric 2340b57cec5SDimitry Andric void ReplaceableMetadataImpl::moveRef(void *Ref, void *New, 2350b57cec5SDimitry Andric const Metadata &MD) { 2360b57cec5SDimitry Andric auto I = UseMap.find(Ref); 2370b57cec5SDimitry Andric assert(I != UseMap.end() && "Expected to move a reference"); 2380b57cec5SDimitry Andric auto OwnerAndIndex = I->second; 2390b57cec5SDimitry Andric UseMap.erase(I); 2400b57cec5SDimitry Andric bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second; 2410b57cec5SDimitry Andric (void)WasInserted; 2420b57cec5SDimitry Andric assert(WasInserted && "Expected to add a reference"); 2430b57cec5SDimitry Andric 2440b57cec5SDimitry Andric // Check that the references are direct if there's no owner. 2450b57cec5SDimitry Andric (void)MD; 2460b57cec5SDimitry Andric assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) && 2470b57cec5SDimitry Andric "Reference without owner must be direct"); 2480b57cec5SDimitry Andric assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) && 2490b57cec5SDimitry Andric "Reference without owner must be direct"); 2500b57cec5SDimitry Andric } 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) { 2530b57cec5SDimitry Andric if (UseMap.empty()) 2540b57cec5SDimitry Andric return; 2550b57cec5SDimitry Andric 2560b57cec5SDimitry Andric // Copy out uses since UseMap will get touched below. 2570b57cec5SDimitry Andric using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>; 2580b57cec5SDimitry Andric SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end()); 2590b57cec5SDimitry Andric llvm::sort(Uses, [](const UseTy &L, const UseTy &R) { 2600b57cec5SDimitry Andric return L.second.second < R.second.second; 2610b57cec5SDimitry Andric }); 2620b57cec5SDimitry Andric for (const auto &Pair : Uses) { 2630b57cec5SDimitry Andric // Check that this Ref hasn't disappeared after RAUW (when updating a 2640b57cec5SDimitry Andric // previous Ref). 2650b57cec5SDimitry Andric if (!UseMap.count(Pair.first)) 2660b57cec5SDimitry Andric continue; 2670b57cec5SDimitry Andric 2680b57cec5SDimitry Andric OwnerTy Owner = Pair.second.first; 2690b57cec5SDimitry Andric if (!Owner) { 2700b57cec5SDimitry Andric // Update unowned tracking references directly. 2710b57cec5SDimitry Andric Metadata *&Ref = *static_cast<Metadata **>(Pair.first); 2720b57cec5SDimitry Andric Ref = MD; 2730b57cec5SDimitry Andric if (MD) 2740b57cec5SDimitry Andric MetadataTracking::track(Ref); 2750b57cec5SDimitry Andric UseMap.erase(Pair.first); 2760b57cec5SDimitry Andric continue; 2770b57cec5SDimitry Andric } 2780b57cec5SDimitry Andric 2790b57cec5SDimitry Andric // Check for MetadataAsValue. 2800b57cec5SDimitry Andric if (Owner.is<MetadataAsValue *>()) { 2810b57cec5SDimitry Andric Owner.get<MetadataAsValue *>()->handleChangedMetadata(MD); 2820b57cec5SDimitry Andric continue; 2830b57cec5SDimitry Andric } 2840b57cec5SDimitry Andric 2850b57cec5SDimitry Andric // There's a Metadata owner -- dispatch. 2860b57cec5SDimitry Andric Metadata *OwnerMD = Owner.get<Metadata *>(); 2870b57cec5SDimitry Andric switch (OwnerMD->getMetadataID()) { 2880b57cec5SDimitry Andric #define HANDLE_METADATA_LEAF(CLASS) \ 2890b57cec5SDimitry Andric case Metadata::CLASS##Kind: \ 2900b57cec5SDimitry Andric cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \ 2910b57cec5SDimitry Andric continue; 2920b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 2930b57cec5SDimitry Andric default: 2940b57cec5SDimitry Andric llvm_unreachable("Invalid metadata subclass"); 2950b57cec5SDimitry Andric } 2960b57cec5SDimitry Andric } 2970b57cec5SDimitry Andric assert(UseMap.empty() && "Expected all uses to be replaced"); 2980b57cec5SDimitry Andric } 2990b57cec5SDimitry Andric 3000b57cec5SDimitry Andric void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) { 3010b57cec5SDimitry Andric if (UseMap.empty()) 3020b57cec5SDimitry Andric return; 3030b57cec5SDimitry Andric 3040b57cec5SDimitry Andric if (!ResolveUsers) { 3050b57cec5SDimitry Andric UseMap.clear(); 3060b57cec5SDimitry Andric return; 3070b57cec5SDimitry Andric } 3080b57cec5SDimitry Andric 3090b57cec5SDimitry Andric // Copy out uses since UseMap could get touched below. 3100b57cec5SDimitry Andric using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>; 3110b57cec5SDimitry Andric SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end()); 3120b57cec5SDimitry Andric llvm::sort(Uses, [](const UseTy &L, const UseTy &R) { 3130b57cec5SDimitry Andric return L.second.second < R.second.second; 3140b57cec5SDimitry Andric }); 3150b57cec5SDimitry Andric UseMap.clear(); 3160b57cec5SDimitry Andric for (const auto &Pair : Uses) { 3170b57cec5SDimitry Andric auto Owner = Pair.second.first; 3180b57cec5SDimitry Andric if (!Owner) 3190b57cec5SDimitry Andric continue; 3200b57cec5SDimitry Andric if (Owner.is<MetadataAsValue *>()) 3210b57cec5SDimitry Andric continue; 3220b57cec5SDimitry Andric 3230b57cec5SDimitry Andric // Resolve MDNodes that point at this. 3240b57cec5SDimitry Andric auto *OwnerMD = dyn_cast<MDNode>(Owner.get<Metadata *>()); 3250b57cec5SDimitry Andric if (!OwnerMD) 3260b57cec5SDimitry Andric continue; 3270b57cec5SDimitry Andric if (OwnerMD->isResolved()) 3280b57cec5SDimitry Andric continue; 3290b57cec5SDimitry Andric OwnerMD->decrementUnresolvedOperandCount(); 3300b57cec5SDimitry Andric } 3310b57cec5SDimitry Andric } 3320b57cec5SDimitry Andric 3330b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) { 3340b57cec5SDimitry Andric if (auto *N = dyn_cast<MDNode>(&MD)) 3350b57cec5SDimitry Andric return N->isResolved() ? nullptr : N->Context.getOrCreateReplaceableUses(); 3360b57cec5SDimitry Andric return dyn_cast<ValueAsMetadata>(&MD); 3370b57cec5SDimitry Andric } 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) { 3400b57cec5SDimitry Andric if (auto *N = dyn_cast<MDNode>(&MD)) 3410b57cec5SDimitry Andric return N->isResolved() ? nullptr : N->Context.getReplaceableUses(); 3420b57cec5SDimitry Andric return dyn_cast<ValueAsMetadata>(&MD); 3430b57cec5SDimitry Andric } 3440b57cec5SDimitry Andric 3450b57cec5SDimitry Andric bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) { 3460b57cec5SDimitry Andric if (auto *N = dyn_cast<MDNode>(&MD)) 3470b57cec5SDimitry Andric return !N->isResolved(); 3480b57cec5SDimitry Andric return dyn_cast<ValueAsMetadata>(&MD); 3490b57cec5SDimitry Andric } 3500b57cec5SDimitry Andric 3510b57cec5SDimitry Andric static DISubprogram *getLocalFunctionMetadata(Value *V) { 3520b57cec5SDimitry Andric assert(V && "Expected value"); 3530b57cec5SDimitry Andric if (auto *A = dyn_cast<Argument>(V)) { 3540b57cec5SDimitry Andric if (auto *Fn = A->getParent()) 3550b57cec5SDimitry Andric return Fn->getSubprogram(); 3560b57cec5SDimitry Andric return nullptr; 3570b57cec5SDimitry Andric } 3580b57cec5SDimitry Andric 3590b57cec5SDimitry Andric if (BasicBlock *BB = cast<Instruction>(V)->getParent()) { 3600b57cec5SDimitry Andric if (auto *Fn = BB->getParent()) 3610b57cec5SDimitry Andric return Fn->getSubprogram(); 3620b57cec5SDimitry Andric return nullptr; 3630b57cec5SDimitry Andric } 3640b57cec5SDimitry Andric 3650b57cec5SDimitry Andric return nullptr; 3660b57cec5SDimitry Andric } 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::get(Value *V) { 3690b57cec5SDimitry Andric assert(V && "Unexpected null Value"); 3700b57cec5SDimitry Andric 3710b57cec5SDimitry Andric auto &Context = V->getContext(); 3720b57cec5SDimitry Andric auto *&Entry = Context.pImpl->ValuesAsMetadata[V]; 3730b57cec5SDimitry Andric if (!Entry) { 3740b57cec5SDimitry Andric assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) && 3750b57cec5SDimitry Andric "Expected constant or function-local value"); 3760b57cec5SDimitry Andric assert(!V->IsUsedByMD && "Expected this to be the only metadata use"); 3770b57cec5SDimitry Andric V->IsUsedByMD = true; 3780b57cec5SDimitry Andric if (auto *C = dyn_cast<Constant>(V)) 3790b57cec5SDimitry Andric Entry = new ConstantAsMetadata(C); 3800b57cec5SDimitry Andric else 3810b57cec5SDimitry Andric Entry = new LocalAsMetadata(V); 3820b57cec5SDimitry Andric } 3830b57cec5SDimitry Andric 3840b57cec5SDimitry Andric return Entry; 3850b57cec5SDimitry Andric } 3860b57cec5SDimitry Andric 3870b57cec5SDimitry Andric ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) { 3880b57cec5SDimitry Andric assert(V && "Unexpected null Value"); 3890b57cec5SDimitry Andric return V->getContext().pImpl->ValuesAsMetadata.lookup(V); 3900b57cec5SDimitry Andric } 3910b57cec5SDimitry Andric 3920b57cec5SDimitry Andric void ValueAsMetadata::handleDeletion(Value *V) { 3930b57cec5SDimitry Andric assert(V && "Expected valid value"); 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andric auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata; 3960b57cec5SDimitry Andric auto I = Store.find(V); 3970b57cec5SDimitry Andric if (I == Store.end()) 3980b57cec5SDimitry Andric return; 3990b57cec5SDimitry Andric 4000b57cec5SDimitry Andric // Remove old entry from the map. 4010b57cec5SDimitry Andric ValueAsMetadata *MD = I->second; 4020b57cec5SDimitry Andric assert(MD && "Expected valid metadata"); 4030b57cec5SDimitry Andric assert(MD->getValue() == V && "Expected valid mapping"); 4040b57cec5SDimitry Andric Store.erase(I); 4050b57cec5SDimitry Andric 4060b57cec5SDimitry Andric // Delete the metadata. 4070b57cec5SDimitry Andric MD->replaceAllUsesWith(nullptr); 4080b57cec5SDimitry Andric delete MD; 4090b57cec5SDimitry Andric } 4100b57cec5SDimitry Andric 4110b57cec5SDimitry Andric void ValueAsMetadata::handleRAUW(Value *From, Value *To) { 4120b57cec5SDimitry Andric assert(From && "Expected valid value"); 4130b57cec5SDimitry Andric assert(To && "Expected valid value"); 4140b57cec5SDimitry Andric assert(From != To && "Expected changed value"); 4150b57cec5SDimitry Andric assert(From->getType() == To->getType() && "Unexpected type change"); 4160b57cec5SDimitry Andric 4170b57cec5SDimitry Andric LLVMContext &Context = From->getType()->getContext(); 4180b57cec5SDimitry Andric auto &Store = Context.pImpl->ValuesAsMetadata; 4190b57cec5SDimitry Andric auto I = Store.find(From); 4200b57cec5SDimitry Andric if (I == Store.end()) { 4210b57cec5SDimitry Andric assert(!From->IsUsedByMD && "Expected From not to be used by metadata"); 4220b57cec5SDimitry Andric return; 4230b57cec5SDimitry Andric } 4240b57cec5SDimitry Andric 4250b57cec5SDimitry Andric // Remove old entry from the map. 4260b57cec5SDimitry Andric assert(From->IsUsedByMD && "Expected From to be used by metadata"); 4270b57cec5SDimitry Andric From->IsUsedByMD = false; 4280b57cec5SDimitry Andric ValueAsMetadata *MD = I->second; 4290b57cec5SDimitry Andric assert(MD && "Expected valid metadata"); 4300b57cec5SDimitry Andric assert(MD->getValue() == From && "Expected valid mapping"); 4310b57cec5SDimitry Andric Store.erase(I); 4320b57cec5SDimitry Andric 4330b57cec5SDimitry Andric if (isa<LocalAsMetadata>(MD)) { 4340b57cec5SDimitry Andric if (auto *C = dyn_cast<Constant>(To)) { 4350b57cec5SDimitry Andric // Local became a constant. 4360b57cec5SDimitry Andric MD->replaceAllUsesWith(ConstantAsMetadata::get(C)); 4370b57cec5SDimitry Andric delete MD; 4380b57cec5SDimitry Andric return; 4390b57cec5SDimitry Andric } 4400b57cec5SDimitry Andric if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) && 4410b57cec5SDimitry Andric getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) { 4420b57cec5SDimitry Andric // DISubprogram changed. 4430b57cec5SDimitry Andric MD->replaceAllUsesWith(nullptr); 4440b57cec5SDimitry Andric delete MD; 4450b57cec5SDimitry Andric return; 4460b57cec5SDimitry Andric } 4470b57cec5SDimitry Andric } else if (!isa<Constant>(To)) { 4480b57cec5SDimitry Andric // Changed to function-local value. 4490b57cec5SDimitry Andric MD->replaceAllUsesWith(nullptr); 4500b57cec5SDimitry Andric delete MD; 4510b57cec5SDimitry Andric return; 4520b57cec5SDimitry Andric } 4530b57cec5SDimitry Andric 4540b57cec5SDimitry Andric auto *&Entry = Store[To]; 4550b57cec5SDimitry Andric if (Entry) { 4560b57cec5SDimitry Andric // The target already exists. 4570b57cec5SDimitry Andric MD->replaceAllUsesWith(Entry); 4580b57cec5SDimitry Andric delete MD; 4590b57cec5SDimitry Andric return; 4600b57cec5SDimitry Andric } 4610b57cec5SDimitry Andric 4620b57cec5SDimitry Andric // Update MD in place (and update the map entry). 4630b57cec5SDimitry Andric assert(!To->IsUsedByMD && "Expected this to be the only metadata use"); 4640b57cec5SDimitry Andric To->IsUsedByMD = true; 4650b57cec5SDimitry Andric MD->V = To; 4660b57cec5SDimitry Andric Entry = MD; 4670b57cec5SDimitry Andric } 4680b57cec5SDimitry Andric 4690b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4700b57cec5SDimitry Andric // MDString implementation. 4710b57cec5SDimitry Andric // 4720b57cec5SDimitry Andric 4730b57cec5SDimitry Andric MDString *MDString::get(LLVMContext &Context, StringRef Str) { 4740b57cec5SDimitry Andric auto &Store = Context.pImpl->MDStringCache; 4750b57cec5SDimitry Andric auto I = Store.try_emplace(Str); 4760b57cec5SDimitry Andric auto &MapEntry = I.first->getValue(); 4770b57cec5SDimitry Andric if (!I.second) 4780b57cec5SDimitry Andric return &MapEntry; 4790b57cec5SDimitry Andric MapEntry.Entry = &*I.first; 4800b57cec5SDimitry Andric return &MapEntry; 4810b57cec5SDimitry Andric } 4820b57cec5SDimitry Andric 4830b57cec5SDimitry Andric StringRef MDString::getString() const { 4840b57cec5SDimitry Andric assert(Entry && "Expected to find string map entry"); 4850b57cec5SDimitry Andric return Entry->first(); 4860b57cec5SDimitry Andric } 4870b57cec5SDimitry Andric 4880b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 4890b57cec5SDimitry Andric // MDNode implementation. 4900b57cec5SDimitry Andric // 4910b57cec5SDimitry Andric 4920b57cec5SDimitry Andric // Assert that the MDNode types will not be unaligned by the objects 4930b57cec5SDimitry Andric // prepended to them. 4940b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) \ 4950b57cec5SDimitry Andric static_assert( \ 4960b57cec5SDimitry Andric alignof(uint64_t) >= alignof(CLASS), \ 4970b57cec5SDimitry Andric "Alignment is insufficient after objects prepended to " #CLASS); 4980b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 4990b57cec5SDimitry Andric 5000b57cec5SDimitry Andric void *MDNode::operator new(size_t Size, unsigned NumOps) { 5010b57cec5SDimitry Andric size_t OpSize = NumOps * sizeof(MDOperand); 5020b57cec5SDimitry Andric // uint64_t is the most aligned type we need support (ensured by static_assert 5030b57cec5SDimitry Andric // above) 5040b57cec5SDimitry Andric OpSize = alignTo(OpSize, alignof(uint64_t)); 5050b57cec5SDimitry Andric void *Ptr = reinterpret_cast<char *>(::operator new(OpSize + Size)) + OpSize; 5060b57cec5SDimitry Andric MDOperand *O = static_cast<MDOperand *>(Ptr); 5070b57cec5SDimitry Andric for (MDOperand *E = O - NumOps; O != E; --O) 5080b57cec5SDimitry Andric (void)new (O - 1) MDOperand; 5090b57cec5SDimitry Andric return Ptr; 5100b57cec5SDimitry Andric } 5110b57cec5SDimitry Andric 512480093f4SDimitry Andric // Repress memory sanitization, due to use-after-destroy by operator 513480093f4SDimitry Andric // delete. Bug report 24578 identifies this issue. 514480093f4SDimitry Andric LLVM_NO_SANITIZE_MEMORY_ATTRIBUTE void MDNode::operator delete(void *Mem) { 5150b57cec5SDimitry Andric MDNode *N = static_cast<MDNode *>(Mem); 5160b57cec5SDimitry Andric size_t OpSize = N->NumOperands * sizeof(MDOperand); 5170b57cec5SDimitry Andric OpSize = alignTo(OpSize, alignof(uint64_t)); 5180b57cec5SDimitry Andric 5190b57cec5SDimitry Andric MDOperand *O = static_cast<MDOperand *>(Mem); 5200b57cec5SDimitry Andric for (MDOperand *E = O - N->NumOperands; O != E; --O) 5210b57cec5SDimitry Andric (O - 1)->~MDOperand(); 5220b57cec5SDimitry Andric ::operator delete(reinterpret_cast<char *>(Mem) - OpSize); 5230b57cec5SDimitry Andric } 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andric MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, 5260b57cec5SDimitry Andric ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2) 5270b57cec5SDimitry Andric : Metadata(ID, Storage), NumOperands(Ops1.size() + Ops2.size()), 5280b57cec5SDimitry Andric NumUnresolved(0), Context(Context) { 5290b57cec5SDimitry Andric unsigned Op = 0; 5300b57cec5SDimitry Andric for (Metadata *MD : Ops1) 5310b57cec5SDimitry Andric setOperand(Op++, MD); 5320b57cec5SDimitry Andric for (Metadata *MD : Ops2) 5330b57cec5SDimitry Andric setOperand(Op++, MD); 5340b57cec5SDimitry Andric 5350b57cec5SDimitry Andric if (!isUniqued()) 5360b57cec5SDimitry Andric return; 5370b57cec5SDimitry Andric 5380b57cec5SDimitry Andric // Count the unresolved operands. If there are any, RAUW support will be 5390b57cec5SDimitry Andric // added lazily on first reference. 5400b57cec5SDimitry Andric countUnresolvedOperands(); 5410b57cec5SDimitry Andric } 5420b57cec5SDimitry Andric 5430b57cec5SDimitry Andric TempMDNode MDNode::clone() const { 5440b57cec5SDimitry Andric switch (getMetadataID()) { 5450b57cec5SDimitry Andric default: 5460b57cec5SDimitry Andric llvm_unreachable("Invalid MDNode subclass"); 5470b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) \ 5480b57cec5SDimitry Andric case CLASS##Kind: \ 5490b57cec5SDimitry Andric return cast<CLASS>(this)->cloneImpl(); 5500b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 5510b57cec5SDimitry Andric } 5520b57cec5SDimitry Andric } 5530b57cec5SDimitry Andric 5540b57cec5SDimitry Andric static bool isOperandUnresolved(Metadata *Op) { 5550b57cec5SDimitry Andric if (auto *N = dyn_cast_or_null<MDNode>(Op)) 5560b57cec5SDimitry Andric return !N->isResolved(); 5570b57cec5SDimitry Andric return false; 5580b57cec5SDimitry Andric } 5590b57cec5SDimitry Andric 5600b57cec5SDimitry Andric void MDNode::countUnresolvedOperands() { 5610b57cec5SDimitry Andric assert(NumUnresolved == 0 && "Expected unresolved ops to be uncounted"); 5620b57cec5SDimitry Andric assert(isUniqued() && "Expected this to be uniqued"); 5630b57cec5SDimitry Andric NumUnresolved = count_if(operands(), isOperandUnresolved); 5640b57cec5SDimitry Andric } 5650b57cec5SDimitry Andric 5660b57cec5SDimitry Andric void MDNode::makeUniqued() { 5670b57cec5SDimitry Andric assert(isTemporary() && "Expected this to be temporary"); 5680b57cec5SDimitry Andric assert(!isResolved() && "Expected this to be unresolved"); 5690b57cec5SDimitry Andric 5700b57cec5SDimitry Andric // Enable uniquing callbacks. 5710b57cec5SDimitry Andric for (auto &Op : mutable_operands()) 5720b57cec5SDimitry Andric Op.reset(Op.get(), this); 5730b57cec5SDimitry Andric 5740b57cec5SDimitry Andric // Make this 'uniqued'. 5750b57cec5SDimitry Andric Storage = Uniqued; 5760b57cec5SDimitry Andric countUnresolvedOperands(); 5770b57cec5SDimitry Andric if (!NumUnresolved) { 5780b57cec5SDimitry Andric dropReplaceableUses(); 5790b57cec5SDimitry Andric assert(isResolved() && "Expected this to be resolved"); 5800b57cec5SDimitry Andric } 5810b57cec5SDimitry Andric 5820b57cec5SDimitry Andric assert(isUniqued() && "Expected this to be uniqued"); 5830b57cec5SDimitry Andric } 5840b57cec5SDimitry Andric 5850b57cec5SDimitry Andric void MDNode::makeDistinct() { 5860b57cec5SDimitry Andric assert(isTemporary() && "Expected this to be temporary"); 5870b57cec5SDimitry Andric assert(!isResolved() && "Expected this to be unresolved"); 5880b57cec5SDimitry Andric 5890b57cec5SDimitry Andric // Drop RAUW support and store as a distinct node. 5900b57cec5SDimitry Andric dropReplaceableUses(); 5910b57cec5SDimitry Andric storeDistinctInContext(); 5920b57cec5SDimitry Andric 5930b57cec5SDimitry Andric assert(isDistinct() && "Expected this to be distinct"); 5940b57cec5SDimitry Andric assert(isResolved() && "Expected this to be resolved"); 5950b57cec5SDimitry Andric } 5960b57cec5SDimitry Andric 5970b57cec5SDimitry Andric void MDNode::resolve() { 5980b57cec5SDimitry Andric assert(isUniqued() && "Expected this to be uniqued"); 5990b57cec5SDimitry Andric assert(!isResolved() && "Expected this to be unresolved"); 6000b57cec5SDimitry Andric 6010b57cec5SDimitry Andric NumUnresolved = 0; 6020b57cec5SDimitry Andric dropReplaceableUses(); 6030b57cec5SDimitry Andric 6040b57cec5SDimitry Andric assert(isResolved() && "Expected this to be resolved"); 6050b57cec5SDimitry Andric } 6060b57cec5SDimitry Andric 6070b57cec5SDimitry Andric void MDNode::dropReplaceableUses() { 6080b57cec5SDimitry Andric assert(!NumUnresolved && "Unexpected unresolved operand"); 6090b57cec5SDimitry Andric 6100b57cec5SDimitry Andric // Drop any RAUW support. 6110b57cec5SDimitry Andric if (Context.hasReplaceableUses()) 6120b57cec5SDimitry Andric Context.takeReplaceableUses()->resolveAllUses(); 6130b57cec5SDimitry Andric } 6140b57cec5SDimitry Andric 6150b57cec5SDimitry Andric void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) { 6160b57cec5SDimitry Andric assert(isUniqued() && "Expected this to be uniqued"); 6170b57cec5SDimitry Andric assert(NumUnresolved != 0 && "Expected unresolved operands"); 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric // Check if an operand was resolved. 6200b57cec5SDimitry Andric if (!isOperandUnresolved(Old)) { 6210b57cec5SDimitry Andric if (isOperandUnresolved(New)) 6220b57cec5SDimitry Andric // An operand was un-resolved! 6230b57cec5SDimitry Andric ++NumUnresolved; 6240b57cec5SDimitry Andric } else if (!isOperandUnresolved(New)) 6250b57cec5SDimitry Andric decrementUnresolvedOperandCount(); 6260b57cec5SDimitry Andric } 6270b57cec5SDimitry Andric 6280b57cec5SDimitry Andric void MDNode::decrementUnresolvedOperandCount() { 6290b57cec5SDimitry Andric assert(!isResolved() && "Expected this to be unresolved"); 6300b57cec5SDimitry Andric if (isTemporary()) 6310b57cec5SDimitry Andric return; 6320b57cec5SDimitry Andric 6330b57cec5SDimitry Andric assert(isUniqued() && "Expected this to be uniqued"); 6340b57cec5SDimitry Andric if (--NumUnresolved) 6350b57cec5SDimitry Andric return; 6360b57cec5SDimitry Andric 6370b57cec5SDimitry Andric // Last unresolved operand has just been resolved. 6380b57cec5SDimitry Andric dropReplaceableUses(); 6390b57cec5SDimitry Andric assert(isResolved() && "Expected this to become resolved"); 6400b57cec5SDimitry Andric } 6410b57cec5SDimitry Andric 6420b57cec5SDimitry Andric void MDNode::resolveCycles() { 6430b57cec5SDimitry Andric if (isResolved()) 6440b57cec5SDimitry Andric return; 6450b57cec5SDimitry Andric 6460b57cec5SDimitry Andric // Resolve this node immediately. 6470b57cec5SDimitry Andric resolve(); 6480b57cec5SDimitry Andric 6490b57cec5SDimitry Andric // Resolve all operands. 6500b57cec5SDimitry Andric for (const auto &Op : operands()) { 6510b57cec5SDimitry Andric auto *N = dyn_cast_or_null<MDNode>(Op); 6520b57cec5SDimitry Andric if (!N) 6530b57cec5SDimitry Andric continue; 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric assert(!N->isTemporary() && 6560b57cec5SDimitry Andric "Expected all forward declarations to be resolved"); 6570b57cec5SDimitry Andric if (!N->isResolved()) 6580b57cec5SDimitry Andric N->resolveCycles(); 6590b57cec5SDimitry Andric } 6600b57cec5SDimitry Andric } 6610b57cec5SDimitry Andric 6620b57cec5SDimitry Andric static bool hasSelfReference(MDNode *N) { 663e8d8bef9SDimitry Andric return llvm::is_contained(N->operands(), N); 6640b57cec5SDimitry Andric } 6650b57cec5SDimitry Andric 6660b57cec5SDimitry Andric MDNode *MDNode::replaceWithPermanentImpl() { 6670b57cec5SDimitry Andric switch (getMetadataID()) { 6680b57cec5SDimitry Andric default: 6690b57cec5SDimitry Andric // If this type isn't uniquable, replace with a distinct node. 6700b57cec5SDimitry Andric return replaceWithDistinctImpl(); 6710b57cec5SDimitry Andric 6720b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \ 6730b57cec5SDimitry Andric case CLASS##Kind: \ 6740b57cec5SDimitry Andric break; 6750b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 6760b57cec5SDimitry Andric } 6770b57cec5SDimitry Andric 6780b57cec5SDimitry Andric // Even if this type is uniquable, self-references have to be distinct. 6790b57cec5SDimitry Andric if (hasSelfReference(this)) 6800b57cec5SDimitry Andric return replaceWithDistinctImpl(); 6810b57cec5SDimitry Andric return replaceWithUniquedImpl(); 6820b57cec5SDimitry Andric } 6830b57cec5SDimitry Andric 6840b57cec5SDimitry Andric MDNode *MDNode::replaceWithUniquedImpl() { 6850b57cec5SDimitry Andric // Try to uniquify in place. 6860b57cec5SDimitry Andric MDNode *UniquedNode = uniquify(); 6870b57cec5SDimitry Andric 6880b57cec5SDimitry Andric if (UniquedNode == this) { 6890b57cec5SDimitry Andric makeUniqued(); 6900b57cec5SDimitry Andric return this; 6910b57cec5SDimitry Andric } 6920b57cec5SDimitry Andric 6930b57cec5SDimitry Andric // Collision, so RAUW instead. 6940b57cec5SDimitry Andric replaceAllUsesWith(UniquedNode); 6950b57cec5SDimitry Andric deleteAsSubclass(); 6960b57cec5SDimitry Andric return UniquedNode; 6970b57cec5SDimitry Andric } 6980b57cec5SDimitry Andric 6990b57cec5SDimitry Andric MDNode *MDNode::replaceWithDistinctImpl() { 7000b57cec5SDimitry Andric makeDistinct(); 7010b57cec5SDimitry Andric return this; 7020b57cec5SDimitry Andric } 7030b57cec5SDimitry Andric 7040b57cec5SDimitry Andric void MDTuple::recalculateHash() { 7050b57cec5SDimitry Andric setHash(MDTupleInfo::KeyTy::calculateHash(this)); 7060b57cec5SDimitry Andric } 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andric void MDNode::dropAllReferences() { 7090b57cec5SDimitry Andric for (unsigned I = 0, E = NumOperands; I != E; ++I) 7100b57cec5SDimitry Andric setOperand(I, nullptr); 7110b57cec5SDimitry Andric if (Context.hasReplaceableUses()) { 7120b57cec5SDimitry Andric Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false); 7130b57cec5SDimitry Andric (void)Context.takeReplaceableUses(); 7140b57cec5SDimitry Andric } 7150b57cec5SDimitry Andric } 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric void MDNode::handleChangedOperand(void *Ref, Metadata *New) { 7180b57cec5SDimitry Andric unsigned Op = static_cast<MDOperand *>(Ref) - op_begin(); 7190b57cec5SDimitry Andric assert(Op < getNumOperands() && "Expected valid operand"); 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andric if (!isUniqued()) { 7220b57cec5SDimitry Andric // This node is not uniqued. Just set the operand and be done with it. 7230b57cec5SDimitry Andric setOperand(Op, New); 7240b57cec5SDimitry Andric return; 7250b57cec5SDimitry Andric } 7260b57cec5SDimitry Andric 7270b57cec5SDimitry Andric // This node is uniqued. 7280b57cec5SDimitry Andric eraseFromStore(); 7290b57cec5SDimitry Andric 7300b57cec5SDimitry Andric Metadata *Old = getOperand(Op); 7310b57cec5SDimitry Andric setOperand(Op, New); 7320b57cec5SDimitry Andric 7330b57cec5SDimitry Andric // Drop uniquing for self-reference cycles and deleted constants. 7340b57cec5SDimitry Andric if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) { 7350b57cec5SDimitry Andric if (!isResolved()) 7360b57cec5SDimitry Andric resolve(); 7370b57cec5SDimitry Andric storeDistinctInContext(); 7380b57cec5SDimitry Andric return; 7390b57cec5SDimitry Andric } 7400b57cec5SDimitry Andric 7410b57cec5SDimitry Andric // Re-unique the node. 7420b57cec5SDimitry Andric auto *Uniqued = uniquify(); 7430b57cec5SDimitry Andric if (Uniqued == this) { 7440b57cec5SDimitry Andric if (!isResolved()) 7450b57cec5SDimitry Andric resolveAfterOperandChange(Old, New); 7460b57cec5SDimitry Andric return; 7470b57cec5SDimitry Andric } 7480b57cec5SDimitry Andric 7490b57cec5SDimitry Andric // Collision. 7500b57cec5SDimitry Andric if (!isResolved()) { 7510b57cec5SDimitry Andric // Still unresolved, so RAUW. 7520b57cec5SDimitry Andric // 7530b57cec5SDimitry Andric // First, clear out all operands to prevent any recursion (similar to 7540b57cec5SDimitry Andric // dropAllReferences(), but we still need the use-list). 7550b57cec5SDimitry Andric for (unsigned O = 0, E = getNumOperands(); O != E; ++O) 7560b57cec5SDimitry Andric setOperand(O, nullptr); 7570b57cec5SDimitry Andric if (Context.hasReplaceableUses()) 7580b57cec5SDimitry Andric Context.getReplaceableUses()->replaceAllUsesWith(Uniqued); 7590b57cec5SDimitry Andric deleteAsSubclass(); 7600b57cec5SDimitry Andric return; 7610b57cec5SDimitry Andric } 7620b57cec5SDimitry Andric 7630b57cec5SDimitry Andric // Store in non-uniqued form if RAUW isn't possible. 7640b57cec5SDimitry Andric storeDistinctInContext(); 7650b57cec5SDimitry Andric } 7660b57cec5SDimitry Andric 7670b57cec5SDimitry Andric void MDNode::deleteAsSubclass() { 7680b57cec5SDimitry Andric switch (getMetadataID()) { 7690b57cec5SDimitry Andric default: 7700b57cec5SDimitry Andric llvm_unreachable("Invalid subclass of MDNode"); 7710b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) \ 7720b57cec5SDimitry Andric case CLASS##Kind: \ 7730b57cec5SDimitry Andric delete cast<CLASS>(this); \ 7740b57cec5SDimitry Andric break; 7750b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 7760b57cec5SDimitry Andric } 7770b57cec5SDimitry Andric } 7780b57cec5SDimitry Andric 7790b57cec5SDimitry Andric template <class T, class InfoT> 7800b57cec5SDimitry Andric static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) { 7810b57cec5SDimitry Andric if (T *U = getUniqued(Store, N)) 7820b57cec5SDimitry Andric return U; 7830b57cec5SDimitry Andric 7840b57cec5SDimitry Andric Store.insert(N); 7850b57cec5SDimitry Andric return N; 7860b57cec5SDimitry Andric } 7870b57cec5SDimitry Andric 7880b57cec5SDimitry Andric template <class NodeTy> struct MDNode::HasCachedHash { 7890b57cec5SDimitry Andric using Yes = char[1]; 7900b57cec5SDimitry Andric using No = char[2]; 7910b57cec5SDimitry Andric template <class U, U Val> struct SFINAE {}; 7920b57cec5SDimitry Andric 7930b57cec5SDimitry Andric template <class U> 7940b57cec5SDimitry Andric static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *); 7950b57cec5SDimitry Andric template <class U> static No &check(...); 7960b57cec5SDimitry Andric 7970b57cec5SDimitry Andric static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes); 7980b57cec5SDimitry Andric }; 7990b57cec5SDimitry Andric 8000b57cec5SDimitry Andric MDNode *MDNode::uniquify() { 8010b57cec5SDimitry Andric assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node"); 8020b57cec5SDimitry Andric 8030b57cec5SDimitry Andric // Try to insert into uniquing store. 8040b57cec5SDimitry Andric switch (getMetadataID()) { 8050b57cec5SDimitry Andric default: 8060b57cec5SDimitry Andric llvm_unreachable("Invalid or non-uniquable subclass of MDNode"); 8070b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \ 8080b57cec5SDimitry Andric case CLASS##Kind: { \ 8090b57cec5SDimitry Andric CLASS *SubclassThis = cast<CLASS>(this); \ 8100b57cec5SDimitry Andric std::integral_constant<bool, HasCachedHash<CLASS>::value> \ 8110b57cec5SDimitry Andric ShouldRecalculateHash; \ 8120b57cec5SDimitry Andric dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \ 8130b57cec5SDimitry Andric return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \ 8140b57cec5SDimitry Andric } 8150b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 8160b57cec5SDimitry Andric } 8170b57cec5SDimitry Andric } 8180b57cec5SDimitry Andric 8190b57cec5SDimitry Andric void MDNode::eraseFromStore() { 8200b57cec5SDimitry Andric switch (getMetadataID()) { 8210b57cec5SDimitry Andric default: 8220b57cec5SDimitry Andric llvm_unreachable("Invalid or non-uniquable subclass of MDNode"); 8230b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \ 8240b57cec5SDimitry Andric case CLASS##Kind: \ 8250b57cec5SDimitry Andric getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \ 8260b57cec5SDimitry Andric break; 8270b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 8280b57cec5SDimitry Andric } 8290b57cec5SDimitry Andric } 8300b57cec5SDimitry Andric 8310b57cec5SDimitry Andric MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs, 8320b57cec5SDimitry Andric StorageType Storage, bool ShouldCreate) { 8330b57cec5SDimitry Andric unsigned Hash = 0; 8340b57cec5SDimitry Andric if (Storage == Uniqued) { 8350b57cec5SDimitry Andric MDTupleInfo::KeyTy Key(MDs); 8360b57cec5SDimitry Andric if (auto *N = getUniqued(Context.pImpl->MDTuples, Key)) 8370b57cec5SDimitry Andric return N; 8380b57cec5SDimitry Andric if (!ShouldCreate) 8390b57cec5SDimitry Andric return nullptr; 8400b57cec5SDimitry Andric Hash = Key.getHash(); 8410b57cec5SDimitry Andric } else { 8420b57cec5SDimitry Andric assert(ShouldCreate && "Expected non-uniqued nodes to always be created"); 8430b57cec5SDimitry Andric } 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andric return storeImpl(new (MDs.size()) MDTuple(Context, Storage, Hash, MDs), 8460b57cec5SDimitry Andric Storage, Context.pImpl->MDTuples); 8470b57cec5SDimitry Andric } 8480b57cec5SDimitry Andric 8490b57cec5SDimitry Andric void MDNode::deleteTemporary(MDNode *N) { 8500b57cec5SDimitry Andric assert(N->isTemporary() && "Expected temporary node"); 8510b57cec5SDimitry Andric N->replaceAllUsesWith(nullptr); 8520b57cec5SDimitry Andric N->deleteAsSubclass(); 8530b57cec5SDimitry Andric } 8540b57cec5SDimitry Andric 8550b57cec5SDimitry Andric void MDNode::storeDistinctInContext() { 8560b57cec5SDimitry Andric assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses"); 8570b57cec5SDimitry Andric assert(!NumUnresolved && "Unexpected unresolved nodes"); 8580b57cec5SDimitry Andric Storage = Distinct; 8590b57cec5SDimitry Andric assert(isResolved() && "Expected this to be resolved"); 8600b57cec5SDimitry Andric 8610b57cec5SDimitry Andric // Reset the hash. 8620b57cec5SDimitry Andric switch (getMetadataID()) { 8630b57cec5SDimitry Andric default: 8640b57cec5SDimitry Andric llvm_unreachable("Invalid subclass of MDNode"); 8650b57cec5SDimitry Andric #define HANDLE_MDNODE_LEAF(CLASS) \ 8660b57cec5SDimitry Andric case CLASS##Kind: { \ 8670b57cec5SDimitry Andric std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \ 8680b57cec5SDimitry Andric dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \ 8690b57cec5SDimitry Andric break; \ 8700b57cec5SDimitry Andric } 8710b57cec5SDimitry Andric #include "llvm/IR/Metadata.def" 8720b57cec5SDimitry Andric } 8730b57cec5SDimitry Andric 8740b57cec5SDimitry Andric getContext().pImpl->DistinctMDNodes.push_back(this); 8750b57cec5SDimitry Andric } 8760b57cec5SDimitry Andric 8770b57cec5SDimitry Andric void MDNode::replaceOperandWith(unsigned I, Metadata *New) { 8780b57cec5SDimitry Andric if (getOperand(I) == New) 8790b57cec5SDimitry Andric return; 8800b57cec5SDimitry Andric 8810b57cec5SDimitry Andric if (!isUniqued()) { 8820b57cec5SDimitry Andric setOperand(I, New); 8830b57cec5SDimitry Andric return; 8840b57cec5SDimitry Andric } 8850b57cec5SDimitry Andric 8860b57cec5SDimitry Andric handleChangedOperand(mutable_begin() + I, New); 8870b57cec5SDimitry Andric } 8880b57cec5SDimitry Andric 8890b57cec5SDimitry Andric void MDNode::setOperand(unsigned I, Metadata *New) { 8900b57cec5SDimitry Andric assert(I < NumOperands); 8910b57cec5SDimitry Andric mutable_begin()[I].reset(New, isUniqued() ? this : nullptr); 8920b57cec5SDimitry Andric } 8930b57cec5SDimitry Andric 8940b57cec5SDimitry Andric /// Get a node or a self-reference that looks like it. 8950b57cec5SDimitry Andric /// 8960b57cec5SDimitry Andric /// Special handling for finding self-references, for use by \a 8970b57cec5SDimitry Andric /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from 8980b57cec5SDimitry Andric /// when self-referencing nodes were still uniqued. If the first operand has 8990b57cec5SDimitry Andric /// the same operands as \c Ops, return the first operand instead. 9000b57cec5SDimitry Andric static MDNode *getOrSelfReference(LLVMContext &Context, 9010b57cec5SDimitry Andric ArrayRef<Metadata *> Ops) { 9020b57cec5SDimitry Andric if (!Ops.empty()) 9030b57cec5SDimitry Andric if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0])) 9040b57cec5SDimitry Andric if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) { 9050b57cec5SDimitry Andric for (unsigned I = 1, E = Ops.size(); I != E; ++I) 9060b57cec5SDimitry Andric if (Ops[I] != N->getOperand(I)) 9070b57cec5SDimitry Andric return MDNode::get(Context, Ops); 9080b57cec5SDimitry Andric return N; 9090b57cec5SDimitry Andric } 9100b57cec5SDimitry Andric 9110b57cec5SDimitry Andric return MDNode::get(Context, Ops); 9120b57cec5SDimitry Andric } 9130b57cec5SDimitry Andric 9140b57cec5SDimitry Andric MDNode *MDNode::concatenate(MDNode *A, MDNode *B) { 9150b57cec5SDimitry Andric if (!A) 9160b57cec5SDimitry Andric return B; 9170b57cec5SDimitry Andric if (!B) 9180b57cec5SDimitry Andric return A; 9190b57cec5SDimitry Andric 9200b57cec5SDimitry Andric SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end()); 9210b57cec5SDimitry Andric MDs.insert(B->op_begin(), B->op_end()); 9220b57cec5SDimitry Andric 9230b57cec5SDimitry Andric // FIXME: This preserves long-standing behaviour, but is it really the right 9240b57cec5SDimitry Andric // behaviour? Or was that an unintended side-effect of node uniquing? 9250b57cec5SDimitry Andric return getOrSelfReference(A->getContext(), MDs.getArrayRef()); 9260b57cec5SDimitry Andric } 9270b57cec5SDimitry Andric 9280b57cec5SDimitry Andric MDNode *MDNode::intersect(MDNode *A, MDNode *B) { 9290b57cec5SDimitry Andric if (!A || !B) 9300b57cec5SDimitry Andric return nullptr; 9310b57cec5SDimitry Andric 9320b57cec5SDimitry Andric SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end()); 9330b57cec5SDimitry Andric SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end()); 9345ffd83dbSDimitry Andric MDs.remove_if([&](Metadata *MD) { return !BSet.count(MD); }); 9350b57cec5SDimitry Andric 9360b57cec5SDimitry Andric // FIXME: This preserves long-standing behaviour, but is it really the right 9370b57cec5SDimitry Andric // behaviour? Or was that an unintended side-effect of node uniquing? 9380b57cec5SDimitry Andric return getOrSelfReference(A->getContext(), MDs.getArrayRef()); 9390b57cec5SDimitry Andric } 9400b57cec5SDimitry Andric 9410b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) { 9420b57cec5SDimitry Andric if (!A || !B) 9430b57cec5SDimitry Andric return nullptr; 9440b57cec5SDimitry Andric 945e8d8bef9SDimitry Andric // Take the intersection of domains then union the scopes 946e8d8bef9SDimitry Andric // within those domains 947e8d8bef9SDimitry Andric SmallPtrSet<const MDNode *, 16> ADomains; 948e8d8bef9SDimitry Andric SmallPtrSet<const MDNode *, 16> IntersectDomains; 949e8d8bef9SDimitry Andric SmallSetVector<Metadata *, 4> MDs; 950e8d8bef9SDimitry Andric for (const MDOperand &MDOp : A->operands()) 951e8d8bef9SDimitry Andric if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp)) 952e8d8bef9SDimitry Andric if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain()) 953e8d8bef9SDimitry Andric ADomains.insert(Domain); 954e8d8bef9SDimitry Andric 955e8d8bef9SDimitry Andric for (const MDOperand &MDOp : B->operands()) 956e8d8bef9SDimitry Andric if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp)) 957e8d8bef9SDimitry Andric if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain()) 958e8d8bef9SDimitry Andric if (ADomains.contains(Domain)) { 959e8d8bef9SDimitry Andric IntersectDomains.insert(Domain); 960e8d8bef9SDimitry Andric MDs.insert(MDOp); 961e8d8bef9SDimitry Andric } 962e8d8bef9SDimitry Andric 963e8d8bef9SDimitry Andric for (const MDOperand &MDOp : A->operands()) 964e8d8bef9SDimitry Andric if (const MDNode *NAMD = dyn_cast<MDNode>(MDOp)) 965e8d8bef9SDimitry Andric if (const MDNode *Domain = AliasScopeNode(NAMD).getDomain()) 966e8d8bef9SDimitry Andric if (IntersectDomains.contains(Domain)) 967e8d8bef9SDimitry Andric MDs.insert(MDOp); 968e8d8bef9SDimitry Andric 969e8d8bef9SDimitry Andric return MDs.empty() ? nullptr 970e8d8bef9SDimitry Andric : getOrSelfReference(A->getContext(), MDs.getArrayRef()); 9710b57cec5SDimitry Andric } 9720b57cec5SDimitry Andric 9730b57cec5SDimitry Andric MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) { 9740b57cec5SDimitry Andric if (!A || !B) 9750b57cec5SDimitry Andric return nullptr; 9760b57cec5SDimitry Andric 9770b57cec5SDimitry Andric APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF(); 9780b57cec5SDimitry Andric APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF(); 9795ffd83dbSDimitry Andric if (AVal < BVal) 9800b57cec5SDimitry Andric return A; 9810b57cec5SDimitry Andric return B; 9820b57cec5SDimitry Andric } 9830b57cec5SDimitry Andric 9840b57cec5SDimitry Andric static bool isContiguous(const ConstantRange &A, const ConstantRange &B) { 9850b57cec5SDimitry Andric return A.getUpper() == B.getLower() || A.getLower() == B.getUpper(); 9860b57cec5SDimitry Andric } 9870b57cec5SDimitry Andric 9880b57cec5SDimitry Andric static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) { 9890b57cec5SDimitry Andric return !A.intersectWith(B).isEmptySet() || isContiguous(A, B); 9900b57cec5SDimitry Andric } 9910b57cec5SDimitry Andric 9920b57cec5SDimitry Andric static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints, 9930b57cec5SDimitry Andric ConstantInt *Low, ConstantInt *High) { 9940b57cec5SDimitry Andric ConstantRange NewRange(Low->getValue(), High->getValue()); 9950b57cec5SDimitry Andric unsigned Size = EndPoints.size(); 9960b57cec5SDimitry Andric APInt LB = EndPoints[Size - 2]->getValue(); 9970b57cec5SDimitry Andric APInt LE = EndPoints[Size - 1]->getValue(); 9980b57cec5SDimitry Andric ConstantRange LastRange(LB, LE); 9990b57cec5SDimitry Andric if (canBeMerged(NewRange, LastRange)) { 10000b57cec5SDimitry Andric ConstantRange Union = LastRange.unionWith(NewRange); 10010b57cec5SDimitry Andric Type *Ty = High->getType(); 10020b57cec5SDimitry Andric EndPoints[Size - 2] = 10030b57cec5SDimitry Andric cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower())); 10040b57cec5SDimitry Andric EndPoints[Size - 1] = 10050b57cec5SDimitry Andric cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper())); 10060b57cec5SDimitry Andric return true; 10070b57cec5SDimitry Andric } 10080b57cec5SDimitry Andric return false; 10090b57cec5SDimitry Andric } 10100b57cec5SDimitry Andric 10110b57cec5SDimitry Andric static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints, 10120b57cec5SDimitry Andric ConstantInt *Low, ConstantInt *High) { 10130b57cec5SDimitry Andric if (!EndPoints.empty()) 10140b57cec5SDimitry Andric if (tryMergeRange(EndPoints, Low, High)) 10150b57cec5SDimitry Andric return; 10160b57cec5SDimitry Andric 10170b57cec5SDimitry Andric EndPoints.push_back(Low); 10180b57cec5SDimitry Andric EndPoints.push_back(High); 10190b57cec5SDimitry Andric } 10200b57cec5SDimitry Andric 10210b57cec5SDimitry Andric MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) { 10220b57cec5SDimitry Andric // Given two ranges, we want to compute the union of the ranges. This 10230b57cec5SDimitry Andric // is slightly complicated by having to combine the intervals and merge 10240b57cec5SDimitry Andric // the ones that overlap. 10250b57cec5SDimitry Andric 10260b57cec5SDimitry Andric if (!A || !B) 10270b57cec5SDimitry Andric return nullptr; 10280b57cec5SDimitry Andric 10290b57cec5SDimitry Andric if (A == B) 10300b57cec5SDimitry Andric return A; 10310b57cec5SDimitry Andric 10320b57cec5SDimitry Andric // First, walk both lists in order of the lower boundary of each interval. 10330b57cec5SDimitry Andric // At each step, try to merge the new interval to the last one we adedd. 10340b57cec5SDimitry Andric SmallVector<ConstantInt *, 4> EndPoints; 10350b57cec5SDimitry Andric int AI = 0; 10360b57cec5SDimitry Andric int BI = 0; 10370b57cec5SDimitry Andric int AN = A->getNumOperands() / 2; 10380b57cec5SDimitry Andric int BN = B->getNumOperands() / 2; 10390b57cec5SDimitry Andric while (AI < AN && BI < BN) { 10400b57cec5SDimitry Andric ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI)); 10410b57cec5SDimitry Andric ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI)); 10420b57cec5SDimitry Andric 10430b57cec5SDimitry Andric if (ALow->getValue().slt(BLow->getValue())) { 10440b57cec5SDimitry Andric addRange(EndPoints, ALow, 10450b57cec5SDimitry Andric mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1))); 10460b57cec5SDimitry Andric ++AI; 10470b57cec5SDimitry Andric } else { 10480b57cec5SDimitry Andric addRange(EndPoints, BLow, 10490b57cec5SDimitry Andric mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1))); 10500b57cec5SDimitry Andric ++BI; 10510b57cec5SDimitry Andric } 10520b57cec5SDimitry Andric } 10530b57cec5SDimitry Andric while (AI < AN) { 10540b57cec5SDimitry Andric addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)), 10550b57cec5SDimitry Andric mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1))); 10560b57cec5SDimitry Andric ++AI; 10570b57cec5SDimitry Andric } 10580b57cec5SDimitry Andric while (BI < BN) { 10590b57cec5SDimitry Andric addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)), 10600b57cec5SDimitry Andric mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1))); 10610b57cec5SDimitry Andric ++BI; 10620b57cec5SDimitry Andric } 10630b57cec5SDimitry Andric 10640b57cec5SDimitry Andric // If we have more than 2 ranges (4 endpoints) we have to try to merge 10650b57cec5SDimitry Andric // the last and first ones. 10660b57cec5SDimitry Andric unsigned Size = EndPoints.size(); 10670b57cec5SDimitry Andric if (Size > 4) { 10680b57cec5SDimitry Andric ConstantInt *FB = EndPoints[0]; 10690b57cec5SDimitry Andric ConstantInt *FE = EndPoints[1]; 10700b57cec5SDimitry Andric if (tryMergeRange(EndPoints, FB, FE)) { 10710b57cec5SDimitry Andric for (unsigned i = 0; i < Size - 2; ++i) { 10720b57cec5SDimitry Andric EndPoints[i] = EndPoints[i + 2]; 10730b57cec5SDimitry Andric } 10740b57cec5SDimitry Andric EndPoints.resize(Size - 2); 10750b57cec5SDimitry Andric } 10760b57cec5SDimitry Andric } 10770b57cec5SDimitry Andric 10780b57cec5SDimitry Andric // If in the end we have a single range, it is possible that it is now the 10790b57cec5SDimitry Andric // full range. Just drop the metadata in that case. 10800b57cec5SDimitry Andric if (EndPoints.size() == 2) { 10810b57cec5SDimitry Andric ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue()); 10820b57cec5SDimitry Andric if (Range.isFullSet()) 10830b57cec5SDimitry Andric return nullptr; 10840b57cec5SDimitry Andric } 10850b57cec5SDimitry Andric 10860b57cec5SDimitry Andric SmallVector<Metadata *, 4> MDs; 10870b57cec5SDimitry Andric MDs.reserve(EndPoints.size()); 10880b57cec5SDimitry Andric for (auto *I : EndPoints) 10890b57cec5SDimitry Andric MDs.push_back(ConstantAsMetadata::get(I)); 10900b57cec5SDimitry Andric return MDNode::get(A->getContext(), MDs); 10910b57cec5SDimitry Andric } 10920b57cec5SDimitry Andric 10930b57cec5SDimitry Andric MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) { 10940b57cec5SDimitry Andric if (!A || !B) 10950b57cec5SDimitry Andric return nullptr; 10960b57cec5SDimitry Andric 10970b57cec5SDimitry Andric ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0)); 10980b57cec5SDimitry Andric ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0)); 10990b57cec5SDimitry Andric if (AVal->getZExtValue() < BVal->getZExtValue()) 11000b57cec5SDimitry Andric return A; 11010b57cec5SDimitry Andric return B; 11020b57cec5SDimitry Andric } 11030b57cec5SDimitry Andric 11040b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 11050b57cec5SDimitry Andric // NamedMDNode implementation. 11060b57cec5SDimitry Andric // 11070b57cec5SDimitry Andric 11080b57cec5SDimitry Andric static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) { 11090b57cec5SDimitry Andric return *(SmallVector<TrackingMDRef, 4> *)Operands; 11100b57cec5SDimitry Andric } 11110b57cec5SDimitry Andric 11120b57cec5SDimitry Andric NamedMDNode::NamedMDNode(const Twine &N) 11130b57cec5SDimitry Andric : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {} 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andric NamedMDNode::~NamedMDNode() { 11160b57cec5SDimitry Andric dropAllReferences(); 11170b57cec5SDimitry Andric delete &getNMDOps(Operands); 11180b57cec5SDimitry Andric } 11190b57cec5SDimitry Andric 11200b57cec5SDimitry Andric unsigned NamedMDNode::getNumOperands() const { 11210b57cec5SDimitry Andric return (unsigned)getNMDOps(Operands).size(); 11220b57cec5SDimitry Andric } 11230b57cec5SDimitry Andric 11240b57cec5SDimitry Andric MDNode *NamedMDNode::getOperand(unsigned i) const { 11250b57cec5SDimitry Andric assert(i < getNumOperands() && "Invalid Operand number!"); 11260b57cec5SDimitry Andric auto *N = getNMDOps(Operands)[i].get(); 11270b57cec5SDimitry Andric return cast_or_null<MDNode>(N); 11280b57cec5SDimitry Andric } 11290b57cec5SDimitry Andric 11300b57cec5SDimitry Andric void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); } 11310b57cec5SDimitry Andric 11320b57cec5SDimitry Andric void NamedMDNode::setOperand(unsigned I, MDNode *New) { 11330b57cec5SDimitry Andric assert(I < getNumOperands() && "Invalid operand number"); 11340b57cec5SDimitry Andric getNMDOps(Operands)[I].reset(New); 11350b57cec5SDimitry Andric } 11360b57cec5SDimitry Andric 11370b57cec5SDimitry Andric void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); } 11380b57cec5SDimitry Andric 11390b57cec5SDimitry Andric void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); } 11400b57cec5SDimitry Andric 11410b57cec5SDimitry Andric StringRef NamedMDNode::getName() const { return StringRef(Name); } 11420b57cec5SDimitry Andric 11430b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 11440b57cec5SDimitry Andric // Instruction Metadata method implementations. 11450b57cec5SDimitry Andric // 11460b57cec5SDimitry Andric 1147e8d8bef9SDimitry Andric MDNode *MDAttachments::lookup(unsigned ID) const { 11480b57cec5SDimitry Andric for (const auto &A : Attachments) 11490b57cec5SDimitry Andric if (A.MDKind == ID) 11500b57cec5SDimitry Andric return A.Node; 11510b57cec5SDimitry Andric return nullptr; 11520b57cec5SDimitry Andric } 11530b57cec5SDimitry Andric 1154e8d8bef9SDimitry Andric void MDAttachments::get(unsigned ID, SmallVectorImpl<MDNode *> &Result) const { 11550b57cec5SDimitry Andric for (const auto &A : Attachments) 11560b57cec5SDimitry Andric if (A.MDKind == ID) 11570b57cec5SDimitry Andric Result.push_back(A.Node); 11580b57cec5SDimitry Andric } 11590b57cec5SDimitry Andric 1160e8d8bef9SDimitry Andric void MDAttachments::getAll( 11610b57cec5SDimitry Andric SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { 11620b57cec5SDimitry Andric for (const auto &A : Attachments) 11630b57cec5SDimitry Andric Result.emplace_back(A.MDKind, A.Node); 11640b57cec5SDimitry Andric 11650b57cec5SDimitry Andric // Sort the resulting array so it is stable with respect to metadata IDs. We 11660b57cec5SDimitry Andric // need to preserve the original insertion order though. 1167e8d8bef9SDimitry Andric if (Result.size() > 1) 11680b57cec5SDimitry Andric llvm::stable_sort(Result, less_first()); 11690b57cec5SDimitry Andric } 11700b57cec5SDimitry Andric 1171e8d8bef9SDimitry Andric void MDAttachments::set(unsigned ID, MDNode *MD) { 1172e8d8bef9SDimitry Andric erase(ID); 1173e8d8bef9SDimitry Andric if (MD) 1174e8d8bef9SDimitry Andric insert(ID, *MD); 1175e8d8bef9SDimitry Andric } 1176e8d8bef9SDimitry Andric 1177e8d8bef9SDimitry Andric void MDAttachments::insert(unsigned ID, MDNode &MD) { 1178e8d8bef9SDimitry Andric Attachments.push_back({ID, TrackingMDNodeRef(&MD)}); 1179e8d8bef9SDimitry Andric } 1180e8d8bef9SDimitry Andric 1181e8d8bef9SDimitry Andric bool MDAttachments::erase(unsigned ID) { 1182e8d8bef9SDimitry Andric if (empty()) 1183e8d8bef9SDimitry Andric return false; 1184e8d8bef9SDimitry Andric 1185e8d8bef9SDimitry Andric // Common case is one value. 1186e8d8bef9SDimitry Andric if (Attachments.size() == 1 && Attachments.back().MDKind == ID) { 1187e8d8bef9SDimitry Andric Attachments.pop_back(); 1188e8d8bef9SDimitry Andric return true; 1189e8d8bef9SDimitry Andric } 1190e8d8bef9SDimitry Andric 1191e8d8bef9SDimitry Andric auto OldSize = Attachments.size(); 1192e8d8bef9SDimitry Andric llvm::erase_if(Attachments, 1193e8d8bef9SDimitry Andric [ID](const Attachment &A) { return A.MDKind == ID; }); 1194e8d8bef9SDimitry Andric return OldSize != Attachments.size(); 1195e8d8bef9SDimitry Andric } 1196e8d8bef9SDimitry Andric 1197e8d8bef9SDimitry Andric MDNode *Value::getMetadata(unsigned KindID) const { 1198e8d8bef9SDimitry Andric if (!hasMetadata()) 1199e8d8bef9SDimitry Andric return nullptr; 1200e8d8bef9SDimitry Andric const auto &Info = getContext().pImpl->ValueMetadata[this]; 1201e8d8bef9SDimitry Andric assert(!Info.empty() && "bit out of sync with hash table"); 1202e8d8bef9SDimitry Andric return Info.lookup(KindID); 1203e8d8bef9SDimitry Andric } 1204e8d8bef9SDimitry Andric 1205e8d8bef9SDimitry Andric MDNode *Value::getMetadata(StringRef Kind) const { 1206e8d8bef9SDimitry Andric if (!hasMetadata()) 1207e8d8bef9SDimitry Andric return nullptr; 1208e8d8bef9SDimitry Andric const auto &Info = getContext().pImpl->ValueMetadata[this]; 1209e8d8bef9SDimitry Andric assert(!Info.empty() && "bit out of sync with hash table"); 1210e8d8bef9SDimitry Andric return Info.lookup(getContext().getMDKindID(Kind)); 1211e8d8bef9SDimitry Andric } 1212e8d8bef9SDimitry Andric 1213e8d8bef9SDimitry Andric void Value::getMetadata(unsigned KindID, SmallVectorImpl<MDNode *> &MDs) const { 1214e8d8bef9SDimitry Andric if (hasMetadata()) 1215e8d8bef9SDimitry Andric getContext().pImpl->ValueMetadata[this].get(KindID, MDs); 1216e8d8bef9SDimitry Andric } 1217e8d8bef9SDimitry Andric 1218e8d8bef9SDimitry Andric void Value::getMetadata(StringRef Kind, SmallVectorImpl<MDNode *> &MDs) const { 1219e8d8bef9SDimitry Andric if (hasMetadata()) 1220e8d8bef9SDimitry Andric getMetadata(getContext().getMDKindID(Kind), MDs); 1221e8d8bef9SDimitry Andric } 1222e8d8bef9SDimitry Andric 1223e8d8bef9SDimitry Andric void Value::getAllMetadata( 1224e8d8bef9SDimitry Andric SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const { 1225e8d8bef9SDimitry Andric if (hasMetadata()) { 1226e8d8bef9SDimitry Andric assert(getContext().pImpl->ValueMetadata.count(this) && 1227e8d8bef9SDimitry Andric "bit out of sync with hash table"); 1228e8d8bef9SDimitry Andric const auto &Info = getContext().pImpl->ValueMetadata.find(this)->second; 1229e8d8bef9SDimitry Andric assert(!Info.empty() && "Shouldn't have called this"); 1230e8d8bef9SDimitry Andric Info.getAll(MDs); 1231e8d8bef9SDimitry Andric } 1232e8d8bef9SDimitry Andric } 1233e8d8bef9SDimitry Andric 1234e8d8bef9SDimitry Andric void Value::setMetadata(unsigned KindID, MDNode *Node) { 1235e8d8bef9SDimitry Andric assert(isa<Instruction>(this) || isa<GlobalObject>(this)); 1236e8d8bef9SDimitry Andric 1237e8d8bef9SDimitry Andric // Handle the case when we're adding/updating metadata on a value. 1238e8d8bef9SDimitry Andric if (Node) { 1239e8d8bef9SDimitry Andric auto &Info = getContext().pImpl->ValueMetadata[this]; 1240e8d8bef9SDimitry Andric assert(!Info.empty() == HasMetadata && "bit out of sync with hash table"); 1241e8d8bef9SDimitry Andric if (Info.empty()) 1242e8d8bef9SDimitry Andric HasMetadata = true; 1243e8d8bef9SDimitry Andric Info.set(KindID, Node); 1244e8d8bef9SDimitry Andric return; 1245e8d8bef9SDimitry Andric } 1246e8d8bef9SDimitry Andric 1247e8d8bef9SDimitry Andric // Otherwise, we're removing metadata from an instruction. 1248e8d8bef9SDimitry Andric assert((HasMetadata == (getContext().pImpl->ValueMetadata.count(this) > 0)) && 1249e8d8bef9SDimitry Andric "bit out of sync with hash table"); 1250e8d8bef9SDimitry Andric if (!HasMetadata) 1251e8d8bef9SDimitry Andric return; // Nothing to remove! 1252e8d8bef9SDimitry Andric auto &Info = getContext().pImpl->ValueMetadata[this]; 1253e8d8bef9SDimitry Andric 1254e8d8bef9SDimitry Andric // Handle removal of an existing value. 1255e8d8bef9SDimitry Andric Info.erase(KindID); 1256e8d8bef9SDimitry Andric if (!Info.empty()) 1257e8d8bef9SDimitry Andric return; 1258e8d8bef9SDimitry Andric getContext().pImpl->ValueMetadata.erase(this); 1259e8d8bef9SDimitry Andric HasMetadata = false; 1260e8d8bef9SDimitry Andric } 1261e8d8bef9SDimitry Andric 1262e8d8bef9SDimitry Andric void Value::setMetadata(StringRef Kind, MDNode *Node) { 1263e8d8bef9SDimitry Andric if (!Node && !HasMetadata) 1264e8d8bef9SDimitry Andric return; 1265e8d8bef9SDimitry Andric setMetadata(getContext().getMDKindID(Kind), Node); 1266e8d8bef9SDimitry Andric } 1267e8d8bef9SDimitry Andric 1268e8d8bef9SDimitry Andric void Value::addMetadata(unsigned KindID, MDNode &MD) { 1269e8d8bef9SDimitry Andric assert(isa<Instruction>(this) || isa<GlobalObject>(this)); 1270e8d8bef9SDimitry Andric if (!HasMetadata) 1271e8d8bef9SDimitry Andric HasMetadata = true; 1272e8d8bef9SDimitry Andric getContext().pImpl->ValueMetadata[this].insert(KindID, MD); 1273e8d8bef9SDimitry Andric } 1274e8d8bef9SDimitry Andric 1275e8d8bef9SDimitry Andric void Value::addMetadata(StringRef Kind, MDNode &MD) { 1276e8d8bef9SDimitry Andric addMetadata(getContext().getMDKindID(Kind), MD); 1277e8d8bef9SDimitry Andric } 1278e8d8bef9SDimitry Andric 1279e8d8bef9SDimitry Andric bool Value::eraseMetadata(unsigned KindID) { 1280e8d8bef9SDimitry Andric // Nothing to unset. 1281e8d8bef9SDimitry Andric if (!HasMetadata) 1282e8d8bef9SDimitry Andric return false; 1283e8d8bef9SDimitry Andric 1284e8d8bef9SDimitry Andric auto &Store = getContext().pImpl->ValueMetadata[this]; 1285e8d8bef9SDimitry Andric bool Changed = Store.erase(KindID); 1286e8d8bef9SDimitry Andric if (Store.empty()) 1287e8d8bef9SDimitry Andric clearMetadata(); 1288e8d8bef9SDimitry Andric return Changed; 1289e8d8bef9SDimitry Andric } 1290e8d8bef9SDimitry Andric 1291e8d8bef9SDimitry Andric void Value::clearMetadata() { 1292e8d8bef9SDimitry Andric if (!HasMetadata) 1293e8d8bef9SDimitry Andric return; 1294e8d8bef9SDimitry Andric assert(getContext().pImpl->ValueMetadata.count(this) && 1295e8d8bef9SDimitry Andric "bit out of sync with hash table"); 1296e8d8bef9SDimitry Andric getContext().pImpl->ValueMetadata.erase(this); 1297e8d8bef9SDimitry Andric HasMetadata = false; 1298e8d8bef9SDimitry Andric } 1299e8d8bef9SDimitry Andric 13000b57cec5SDimitry Andric void Instruction::setMetadata(StringRef Kind, MDNode *Node) { 13010b57cec5SDimitry Andric if (!Node && !hasMetadata()) 13020b57cec5SDimitry Andric return; 13030b57cec5SDimitry Andric setMetadata(getContext().getMDKindID(Kind), Node); 13040b57cec5SDimitry Andric } 13050b57cec5SDimitry Andric 13060b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(StringRef Kind) const { 13070b57cec5SDimitry Andric return getMetadataImpl(getContext().getMDKindID(Kind)); 13080b57cec5SDimitry Andric } 13090b57cec5SDimitry Andric 13100b57cec5SDimitry Andric void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) { 1311e8d8bef9SDimitry Andric if (!Value::hasMetadata()) 13120b57cec5SDimitry Andric return; // Nothing to remove! 13130b57cec5SDimitry Andric 1314e8d8bef9SDimitry Andric if (KnownIDs.empty()) { 13150b57cec5SDimitry Andric // Just drop our entry at the store. 1316e8d8bef9SDimitry Andric clearMetadata(); 13170b57cec5SDimitry Andric return; 13180b57cec5SDimitry Andric } 13190b57cec5SDimitry Andric 1320e8d8bef9SDimitry Andric SmallSet<unsigned, 4> KnownSet; 1321e8d8bef9SDimitry Andric KnownSet.insert(KnownIDs.begin(), KnownIDs.end()); 1322e8d8bef9SDimitry Andric 1323e8d8bef9SDimitry Andric auto &MetadataStore = getContext().pImpl->ValueMetadata; 1324e8d8bef9SDimitry Andric auto &Info = MetadataStore[this]; 1325e8d8bef9SDimitry Andric assert(!Info.empty() && "bit out of sync with hash table"); 1326e8d8bef9SDimitry Andric Info.remove_if([&KnownSet](const MDAttachments::Attachment &I) { 1327e8d8bef9SDimitry Andric return !KnownSet.count(I.MDKind); 13280b57cec5SDimitry Andric }); 13290b57cec5SDimitry Andric 13300b57cec5SDimitry Andric if (Info.empty()) { 13310b57cec5SDimitry Andric // Drop our entry at the store. 1332e8d8bef9SDimitry Andric clearMetadata(); 13330b57cec5SDimitry Andric } 13340b57cec5SDimitry Andric } 13350b57cec5SDimitry Andric 13360b57cec5SDimitry Andric void Instruction::setMetadata(unsigned KindID, MDNode *Node) { 13370b57cec5SDimitry Andric if (!Node && !hasMetadata()) 13380b57cec5SDimitry Andric return; 13390b57cec5SDimitry Andric 13400b57cec5SDimitry Andric // Handle 'dbg' as a special case since it is not stored in the hash table. 13410b57cec5SDimitry Andric if (KindID == LLVMContext::MD_dbg) { 13420b57cec5SDimitry Andric DbgLoc = DebugLoc(Node); 13430b57cec5SDimitry Andric return; 13440b57cec5SDimitry Andric } 13450b57cec5SDimitry Andric 1346e8d8bef9SDimitry Andric Value::setMetadata(KindID, Node); 13470b57cec5SDimitry Andric } 13480b57cec5SDimitry Andric 1349e8d8bef9SDimitry Andric void Instruction::addAnnotationMetadata(StringRef Name) { 1350e8d8bef9SDimitry Andric MDBuilder MDB(getContext()); 13510b57cec5SDimitry Andric 1352e8d8bef9SDimitry Andric auto *Existing = getMetadata(LLVMContext::MD_annotation); 1353e8d8bef9SDimitry Andric SmallVector<Metadata *, 4> Names; 1354e8d8bef9SDimitry Andric bool AppendName = true; 1355e8d8bef9SDimitry Andric if (Existing) { 1356e8d8bef9SDimitry Andric auto *Tuple = cast<MDTuple>(Existing); 1357e8d8bef9SDimitry Andric for (auto &N : Tuple->operands()) { 1358e8d8bef9SDimitry Andric if (cast<MDString>(N.get())->getString() == Name) 1359e8d8bef9SDimitry Andric AppendName = false; 1360e8d8bef9SDimitry Andric Names.push_back(N.get()); 1361e8d8bef9SDimitry Andric } 1362e8d8bef9SDimitry Andric } 1363e8d8bef9SDimitry Andric if (AppendName) 1364e8d8bef9SDimitry Andric Names.push_back(MDB.createString(Name)); 13650b57cec5SDimitry Andric 1366e8d8bef9SDimitry Andric MDNode *MD = MDTuple::get(getContext(), Names); 1367e8d8bef9SDimitry Andric setMetadata(LLVMContext::MD_annotation, MD); 13680b57cec5SDimitry Andric } 13690b57cec5SDimitry Andric 13700b57cec5SDimitry Andric void Instruction::setAAMetadata(const AAMDNodes &N) { 13710b57cec5SDimitry Andric setMetadata(LLVMContext::MD_tbaa, N.TBAA); 1372480093f4SDimitry Andric setMetadata(LLVMContext::MD_tbaa_struct, N.TBAAStruct); 13730b57cec5SDimitry Andric setMetadata(LLVMContext::MD_alias_scope, N.Scope); 13740b57cec5SDimitry Andric setMetadata(LLVMContext::MD_noalias, N.NoAlias); 13750b57cec5SDimitry Andric } 13760b57cec5SDimitry Andric 13770b57cec5SDimitry Andric MDNode *Instruction::getMetadataImpl(unsigned KindID) const { 13780b57cec5SDimitry Andric // Handle 'dbg' as a special case since it is not stored in the hash table. 13790b57cec5SDimitry Andric if (KindID == LLVMContext::MD_dbg) 13800b57cec5SDimitry Andric return DbgLoc.getAsMDNode(); 1381e8d8bef9SDimitry Andric return Value::getMetadata(KindID); 13820b57cec5SDimitry Andric } 13830b57cec5SDimitry Andric 13840b57cec5SDimitry Andric void Instruction::getAllMetadataImpl( 13850b57cec5SDimitry Andric SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const { 13860b57cec5SDimitry Andric Result.clear(); 13870b57cec5SDimitry Andric 13880b57cec5SDimitry Andric // Handle 'dbg' as a special case since it is not stored in the hash table. 13890b57cec5SDimitry Andric if (DbgLoc) { 13900b57cec5SDimitry Andric Result.push_back( 13910b57cec5SDimitry Andric std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode())); 13920b57cec5SDimitry Andric } 1393e8d8bef9SDimitry Andric Value::getAllMetadata(Result); 13940b57cec5SDimitry Andric } 13950b57cec5SDimitry Andric 13960b57cec5SDimitry Andric bool Instruction::extractProfMetadata(uint64_t &TrueVal, 13970b57cec5SDimitry Andric uint64_t &FalseVal) const { 13980b57cec5SDimitry Andric assert( 13990b57cec5SDimitry Andric (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select) && 14000b57cec5SDimitry Andric "Looking for branch weights on something besides branch or select"); 14010b57cec5SDimitry Andric 14020b57cec5SDimitry Andric auto *ProfileData = getMetadata(LLVMContext::MD_prof); 14030b57cec5SDimitry Andric if (!ProfileData || ProfileData->getNumOperands() != 3) 14040b57cec5SDimitry Andric return false; 14050b57cec5SDimitry Andric 14060b57cec5SDimitry Andric auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0)); 14070b57cec5SDimitry Andric if (!ProfDataName || !ProfDataName->getString().equals("branch_weights")) 14080b57cec5SDimitry Andric return false; 14090b57cec5SDimitry Andric 14100b57cec5SDimitry Andric auto *CITrue = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1)); 14110b57cec5SDimitry Andric auto *CIFalse = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2)); 14120b57cec5SDimitry Andric if (!CITrue || !CIFalse) 14130b57cec5SDimitry Andric return false; 14140b57cec5SDimitry Andric 14150b57cec5SDimitry Andric TrueVal = CITrue->getValue().getZExtValue(); 14160b57cec5SDimitry Andric FalseVal = CIFalse->getValue().getZExtValue(); 14170b57cec5SDimitry Andric 14180b57cec5SDimitry Andric return true; 14190b57cec5SDimitry Andric } 14200b57cec5SDimitry Andric 14210b57cec5SDimitry Andric bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const { 1422*fe6060f1SDimitry Andric assert( 1423*fe6060f1SDimitry Andric (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select || 1424*fe6060f1SDimitry Andric getOpcode() == Instruction::Call || getOpcode() == Instruction::Invoke || 1425*fe6060f1SDimitry Andric getOpcode() == Instruction::IndirectBr || 14260b57cec5SDimitry Andric getOpcode() == Instruction::Switch) && 14270b57cec5SDimitry Andric "Looking for branch weights on something besides branch"); 14280b57cec5SDimitry Andric 14290b57cec5SDimitry Andric TotalVal = 0; 14300b57cec5SDimitry Andric auto *ProfileData = getMetadata(LLVMContext::MD_prof); 14310b57cec5SDimitry Andric if (!ProfileData) 14320b57cec5SDimitry Andric return false; 14330b57cec5SDimitry Andric 14340b57cec5SDimitry Andric auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0)); 14350b57cec5SDimitry Andric if (!ProfDataName) 14360b57cec5SDimitry Andric return false; 14370b57cec5SDimitry Andric 14380b57cec5SDimitry Andric if (ProfDataName->getString().equals("branch_weights")) { 14390b57cec5SDimitry Andric TotalVal = 0; 14400b57cec5SDimitry Andric for (unsigned i = 1; i < ProfileData->getNumOperands(); i++) { 14410b57cec5SDimitry Andric auto *V = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(i)); 14420b57cec5SDimitry Andric if (!V) 14430b57cec5SDimitry Andric return false; 14440b57cec5SDimitry Andric TotalVal += V->getValue().getZExtValue(); 14450b57cec5SDimitry Andric } 14460b57cec5SDimitry Andric return true; 14470b57cec5SDimitry Andric } else if (ProfDataName->getString().equals("VP") && 14480b57cec5SDimitry Andric ProfileData->getNumOperands() > 3) { 14490b57cec5SDimitry Andric TotalVal = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2)) 14500b57cec5SDimitry Andric ->getValue() 14510b57cec5SDimitry Andric .getZExtValue(); 14520b57cec5SDimitry Andric return true; 14530b57cec5SDimitry Andric } 14540b57cec5SDimitry Andric return false; 14550b57cec5SDimitry Andric } 14560b57cec5SDimitry Andric 14570b57cec5SDimitry Andric void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) { 14580b57cec5SDimitry Andric SmallVector<std::pair<unsigned, MDNode *>, 8> MDs; 14590b57cec5SDimitry Andric Other->getAllMetadata(MDs); 14600b57cec5SDimitry Andric for (auto &MD : MDs) { 14610b57cec5SDimitry Andric // We need to adjust the type metadata offset. 14620b57cec5SDimitry Andric if (Offset != 0 && MD.first == LLVMContext::MD_type) { 14630b57cec5SDimitry Andric auto *OffsetConst = cast<ConstantInt>( 14640b57cec5SDimitry Andric cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue()); 14650b57cec5SDimitry Andric Metadata *TypeId = MD.second->getOperand(1); 14660b57cec5SDimitry Andric auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get( 14670b57cec5SDimitry Andric OffsetConst->getType(), OffsetConst->getValue() + Offset)); 14680b57cec5SDimitry Andric addMetadata(LLVMContext::MD_type, 14690b57cec5SDimitry Andric *MDNode::get(getContext(), {NewOffsetMD, TypeId})); 14700b57cec5SDimitry Andric continue; 14710b57cec5SDimitry Andric } 14720b57cec5SDimitry Andric // If an offset adjustment was specified we need to modify the DIExpression 14730b57cec5SDimitry Andric // to prepend the adjustment: 14740b57cec5SDimitry Andric // !DIExpression(DW_OP_plus, Offset, [original expr]) 14750b57cec5SDimitry Andric auto *Attachment = MD.second; 14760b57cec5SDimitry Andric if (Offset != 0 && MD.first == LLVMContext::MD_dbg) { 14770b57cec5SDimitry Andric DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment); 14780b57cec5SDimitry Andric DIExpression *E = nullptr; 14790b57cec5SDimitry Andric if (!GV) { 14800b57cec5SDimitry Andric auto *GVE = cast<DIGlobalVariableExpression>(Attachment); 14810b57cec5SDimitry Andric GV = GVE->getVariable(); 14820b57cec5SDimitry Andric E = GVE->getExpression(); 14830b57cec5SDimitry Andric } 14840b57cec5SDimitry Andric ArrayRef<uint64_t> OrigElements; 14850b57cec5SDimitry Andric if (E) 14860b57cec5SDimitry Andric OrigElements = E->getElements(); 14870b57cec5SDimitry Andric std::vector<uint64_t> Elements(OrigElements.size() + 2); 14880b57cec5SDimitry Andric Elements[0] = dwarf::DW_OP_plus_uconst; 14890b57cec5SDimitry Andric Elements[1] = Offset; 14900b57cec5SDimitry Andric llvm::copy(OrigElements, Elements.begin() + 2); 14910b57cec5SDimitry Andric E = DIExpression::get(getContext(), Elements); 14920b57cec5SDimitry Andric Attachment = DIGlobalVariableExpression::get(getContext(), GV, E); 14930b57cec5SDimitry Andric } 14940b57cec5SDimitry Andric addMetadata(MD.first, *Attachment); 14950b57cec5SDimitry Andric } 14960b57cec5SDimitry Andric } 14970b57cec5SDimitry Andric 14980b57cec5SDimitry Andric void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) { 14990b57cec5SDimitry Andric addMetadata( 15000b57cec5SDimitry Andric LLVMContext::MD_type, 15010b57cec5SDimitry Andric *MDTuple::get(getContext(), 15020b57cec5SDimitry Andric {ConstantAsMetadata::get(ConstantInt::get( 15030b57cec5SDimitry Andric Type::getInt64Ty(getContext()), Offset)), 15040b57cec5SDimitry Andric TypeID})); 15050b57cec5SDimitry Andric } 15060b57cec5SDimitry Andric 15075ffd83dbSDimitry Andric void GlobalObject::setVCallVisibilityMetadata(VCallVisibility Visibility) { 15085ffd83dbSDimitry Andric // Remove any existing vcall visibility metadata first in case we are 15095ffd83dbSDimitry Andric // updating. 15105ffd83dbSDimitry Andric eraseMetadata(LLVMContext::MD_vcall_visibility); 15118bcb0991SDimitry Andric addMetadata(LLVMContext::MD_vcall_visibility, 15128bcb0991SDimitry Andric *MDNode::get(getContext(), 15138bcb0991SDimitry Andric {ConstantAsMetadata::get(ConstantInt::get( 15148bcb0991SDimitry Andric Type::getInt64Ty(getContext()), Visibility))})); 15158bcb0991SDimitry Andric } 15168bcb0991SDimitry Andric 15178bcb0991SDimitry Andric GlobalObject::VCallVisibility GlobalObject::getVCallVisibility() const { 15188bcb0991SDimitry Andric if (MDNode *MD = getMetadata(LLVMContext::MD_vcall_visibility)) { 15198bcb0991SDimitry Andric uint64_t Val = cast<ConstantInt>( 15208bcb0991SDimitry Andric cast<ConstantAsMetadata>(MD->getOperand(0))->getValue()) 15218bcb0991SDimitry Andric ->getZExtValue(); 15228bcb0991SDimitry Andric assert(Val <= 2 && "unknown vcall visibility!"); 15238bcb0991SDimitry Andric return (VCallVisibility)Val; 15248bcb0991SDimitry Andric } 15258bcb0991SDimitry Andric return VCallVisibility::VCallVisibilityPublic; 15268bcb0991SDimitry Andric } 15278bcb0991SDimitry Andric 15280b57cec5SDimitry Andric void Function::setSubprogram(DISubprogram *SP) { 15290b57cec5SDimitry Andric setMetadata(LLVMContext::MD_dbg, SP); 15300b57cec5SDimitry Andric } 15310b57cec5SDimitry Andric 15320b57cec5SDimitry Andric DISubprogram *Function::getSubprogram() const { 15330b57cec5SDimitry Andric return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg)); 15340b57cec5SDimitry Andric } 15350b57cec5SDimitry Andric 15360b57cec5SDimitry Andric bool Function::isDebugInfoForProfiling() const { 15370b57cec5SDimitry Andric if (DISubprogram *SP = getSubprogram()) { 15380b57cec5SDimitry Andric if (DICompileUnit *CU = SP->getUnit()) { 15390b57cec5SDimitry Andric return CU->getDebugInfoForProfiling(); 15400b57cec5SDimitry Andric } 15410b57cec5SDimitry Andric } 15420b57cec5SDimitry Andric return false; 15430b57cec5SDimitry Andric } 15440b57cec5SDimitry Andric 15450b57cec5SDimitry Andric void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) { 15460b57cec5SDimitry Andric addMetadata(LLVMContext::MD_dbg, *GV); 15470b57cec5SDimitry Andric } 15480b57cec5SDimitry Andric 15490b57cec5SDimitry Andric void GlobalVariable::getDebugInfo( 15500b57cec5SDimitry Andric SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const { 15510b57cec5SDimitry Andric SmallVector<MDNode *, 1> MDs; 15520b57cec5SDimitry Andric getMetadata(LLVMContext::MD_dbg, MDs); 15530b57cec5SDimitry Andric for (MDNode *MD : MDs) 15540b57cec5SDimitry Andric GVs.push_back(cast<DIGlobalVariableExpression>(MD)); 15550b57cec5SDimitry Andric } 1556