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