Line data Source code
1 : //===- Metadata.cpp - Implement Metadata classes --------------------------===//
2 : //
3 : // The LLVM Compiler Infrastructure
4 : //
5 : // This file is distributed under the University of Illinois Open Source
6 : // License. See LICENSE.TXT for details.
7 : //
8 : //===----------------------------------------------------------------------===//
9 : //
10 : // This file implements the Metadata classes.
11 : //
12 : //===----------------------------------------------------------------------===//
13 :
14 : #include "LLVMContextImpl.h"
15 : #include "MetadataImpl.h"
16 : #include "SymbolTableListTraitsImpl.h"
17 : #include "llvm/ADT/APFloat.h"
18 : #include "llvm/ADT/APInt.h"
19 : #include "llvm/ADT/ArrayRef.h"
20 : #include "llvm/ADT/DenseSet.h"
21 : #include "llvm/ADT/None.h"
22 : #include "llvm/ADT/STLExtras.h"
23 : #include "llvm/ADT/SetVector.h"
24 : #include "llvm/ADT/SmallPtrSet.h"
25 : #include "llvm/ADT/SmallSet.h"
26 : #include "llvm/ADT/SmallVector.h"
27 : #include "llvm/ADT/StringMap.h"
28 : #include "llvm/ADT/StringRef.h"
29 : #include "llvm/ADT/Twine.h"
30 : #include "llvm/IR/Argument.h"
31 : #include "llvm/IR/BasicBlock.h"
32 : #include "llvm/IR/Constant.h"
33 : #include "llvm/IR/ConstantRange.h"
34 : #include "llvm/IR/Constants.h"
35 : #include "llvm/IR/DebugInfoMetadata.h"
36 : #include "llvm/IR/DebugLoc.h"
37 : #include "llvm/IR/Function.h"
38 : #include "llvm/IR/GlobalObject.h"
39 : #include "llvm/IR/GlobalVariable.h"
40 : #include "llvm/IR/Instruction.h"
41 : #include "llvm/IR/LLVMContext.h"
42 : #include "llvm/IR/Metadata.h"
43 : #include "llvm/IR/Module.h"
44 : #include "llvm/IR/TrackingMDRef.h"
45 : #include "llvm/IR/Type.h"
46 : #include "llvm/IR/Value.h"
47 : #include "llvm/IR/ValueHandle.h"
48 : #include "llvm/Support/Casting.h"
49 : #include "llvm/Support/ErrorHandling.h"
50 : #include "llvm/Support/MathExtras.h"
51 : #include <algorithm>
52 : #include <cassert>
53 : #include <cstddef>
54 : #include <cstdint>
55 : #include <iterator>
56 : #include <tuple>
57 : #include <type_traits>
58 : #include <utility>
59 : #include <vector>
60 :
61 : using namespace llvm;
62 :
63 166070 : MetadataAsValue::MetadataAsValue(Type *Ty, Metadata *MD)
64 166070 : : Value(Ty, MetadataAsValueVal), MD(MD) {
65 166070 : track();
66 166070 : }
67 :
68 103553 : MetadataAsValue::~MetadataAsValue() {
69 103553 : getType()->getContext().pImpl->MetadataAsValues.erase(MD);
70 103553 : untrack();
71 103553 : }
72 :
73 : /// Canonicalize metadata arguments to intrinsics.
74 : ///
75 : /// To support bitcode upgrades (and assembly semantic sugar) for \a
76 : /// MetadataAsValue, we need to canonicalize certain metadata.
77 : ///
78 : /// - nullptr is replaced by an empty MDNode.
79 : /// - An MDNode with a single null operand is replaced by an empty MDNode.
80 : /// - An MDNode whose only operand is a \a ConstantAsMetadata gets skipped.
81 : ///
82 : /// This maintains readability of bitcode from when metadata was a type of
83 : /// value, and these bridges were unnecessary.
84 662918 : static Metadata *canonicalizeMetadataForValue(LLVMContext &Context,
85 : Metadata *MD) {
86 662918 : if (!MD)
87 : // !{}
88 : return MDNode::get(Context, None);
89 :
90 : // Return early if this isn't a single-operand MDNode.
91 : auto *N = dyn_cast<MDNode>(MD);
92 177417 : if (!N || N->getNumOperands() != 1)
93 : return MD;
94 :
95 846 : if (!N->getOperand(0))
96 : // !{}
97 : return MDNode::get(Context, None);
98 :
99 : if (auto *C = dyn_cast<ConstantAsMetadata>(N->getOperand(0)))
100 : // Look through the MDNode.
101 246 : return C;
102 :
103 : return MD;
104 : }
105 :
106 451870 : MetadataAsValue *MetadataAsValue::get(LLVMContext &Context, Metadata *MD) {
107 451870 : MD = canonicalizeMetadataForValue(Context, MD);
108 451870 : auto *&Entry = Context.pImpl->MetadataAsValues[MD];
109 451870 : if (!Entry)
110 166070 : Entry = new MetadataAsValue(Type::getMetadataTy(Context), MD);
111 451870 : return Entry;
112 : }
113 :
114 114038 : MetadataAsValue *MetadataAsValue::getIfExists(LLVMContext &Context,
115 : Metadata *MD) {
116 114038 : MD = canonicalizeMetadataForValue(Context, MD);
117 114038 : auto &Store = Context.pImpl->MetadataAsValues;
118 114038 : return Store.lookup(MD);
119 : }
120 :
121 97010 : void MetadataAsValue::handleChangedMetadata(Metadata *MD) {
122 97010 : LLVMContext &Context = getContext();
123 97010 : MD = canonicalizeMetadataForValue(Context, MD);
124 97010 : auto &Store = Context.pImpl->MetadataAsValues;
125 :
126 : // Stop tracking the old metadata.
127 97010 : Store.erase(this->MD);
128 97010 : untrack();
129 97010 : this->MD = nullptr;
130 :
131 : // Start tracking MD, or RAUW if necessary.
132 : auto *&Entry = Store[MD];
133 97010 : if (Entry) {
134 91472 : replaceAllUsesWith(Entry);
135 91472 : delete this;
136 91472 : return;
137 : }
138 :
139 5538 : this->MD = MD;
140 5538 : track();
141 5538 : Entry = this;
142 : }
143 :
144 171608 : void MetadataAsValue::track() {
145 171608 : if (MD)
146 171608 : MetadataTracking::track(&MD, *MD, *this);
147 171608 : }
148 :
149 200563 : void MetadataAsValue::untrack() {
150 200563 : if (MD)
151 97010 : MetadataTracking::untrack(MD);
152 200563 : }
153 :
154 149350757 : bool MetadataTracking::track(void *Ref, Metadata &MD, OwnerTy Owner) {
155 : assert(Ref && "Expected live reference");
156 : assert((Owner || *static_cast<Metadata **>(Ref) == &MD) &&
157 : "Reference without owner must be direct");
158 149350757 : if (auto *R = ReplaceableMetadataImpl::getOrCreate(MD)) {
159 925489 : R->addRef(Ref, Owner);
160 925489 : return true;
161 : }
162 : if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD)) {
163 : assert(!PH->Use && "Placeholders can only be used once");
164 : assert(!Owner && "Unexpected callback to owner");
165 3021 : PH->Use = static_cast<Metadata **>(Ref);
166 3021 : return true;
167 : }
168 : return false;
169 : }
170 :
171 130842681 : void MetadataTracking::untrack(void *Ref, Metadata &MD) {
172 : assert(Ref && "Expected live reference");
173 130842681 : if (auto *R = ReplaceableMetadataImpl::getIfExists(MD))
174 366243 : R->dropRef(Ref);
175 : else if (auto *PH = dyn_cast<DistinctMDOperandPlaceholder>(&MD))
176 3021 : PH->Use = nullptr;
177 130842686 : }
178 :
179 90622040 : bool MetadataTracking::retrack(void *Ref, Metadata &MD, void *New) {
180 : assert(Ref && "Expected live reference");
181 : assert(New && "Expected live reference");
182 : assert(Ref != New && "Expected change");
183 90622040 : if (auto *R = ReplaceableMetadataImpl::getIfExists(MD)) {
184 118591 : R->moveRef(Ref, New, MD);
185 118591 : return true;
186 : }
187 : assert(!isa<DistinctMDOperandPlaceholder>(MD) &&
188 : "Unexpected move of an MDOperand");
189 : assert(!isReplaceable(MD) &&
190 : "Expected un-replaceable metadata, since we didn't move a reference");
191 : return false;
192 : }
193 :
194 0 : bool MetadataTracking::isReplaceable(const Metadata &MD) {
195 0 : return ReplaceableMetadataImpl::isReplaceable(MD);
196 : }
197 :
198 925489 : void ReplaceableMetadataImpl::addRef(void *Ref, OwnerTy Owner) {
199 : bool WasInserted =
200 925489 : UseMap.insert(std::make_pair(Ref, std::make_pair(Owner, NextIndex)))
201 : .second;
202 : (void)WasInserted;
203 : assert(WasInserted && "Expected to add a reference");
204 :
205 925489 : ++NextIndex;
206 : assert(NextIndex != 0 && "Unexpected overflow");
207 925489 : }
208 :
209 366243 : void ReplaceableMetadataImpl::dropRef(void *Ref) {
210 366243 : bool WasErased = UseMap.erase(Ref);
211 : (void)WasErased;
212 : assert(WasErased && "Expected to drop a reference");
213 366243 : }
214 :
215 118591 : void ReplaceableMetadataImpl::moveRef(void *Ref, void *New,
216 : const Metadata &MD) {
217 118591 : auto I = UseMap.find(Ref);
218 : assert(I != UseMap.end() && "Expected to move a reference");
219 118591 : auto OwnerAndIndex = I->second;
220 : UseMap.erase(I);
221 118591 : bool WasInserted = UseMap.insert(std::make_pair(New, OwnerAndIndex)).second;
222 : (void)WasInserted;
223 : assert(WasInserted && "Expected to add a reference");
224 :
225 : // Check that the references are direct if there's no owner.
226 : (void)MD;
227 : assert((OwnerAndIndex.first || *static_cast<Metadata **>(Ref) == &MD) &&
228 : "Reference without owner must be direct");
229 : assert((OwnerAndIndex.first || *static_cast<Metadata **>(New) == &MD) &&
230 : "Reference without owner must be direct");
231 118591 : }
232 :
233 449615 : void ReplaceableMetadataImpl::replaceAllUsesWith(Metadata *MD) {
234 449615 : if (UseMap.empty())
235 232746 : return;
236 :
237 : // Copy out uses since UseMap will get touched below.
238 : using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
239 433738 : SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
240 : llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
241 0 : return L.second.second < R.second.second;
242 : });
243 554602 : for (const auto &Pair : Uses) {
244 : // Check that this Ref hasn't disappeared after RAUW (when updating a
245 : // previous Ref).
246 337733 : if (!UseMap.count(Pair.first))
247 0 : continue;
248 :
249 337733 : OwnerTy Owner = Pair.second.first;
250 337733 : if (!Owner) {
251 : // Update unowned tracking references directly.
252 176855 : Metadata *&Ref = *static_cast<Metadata **>(Pair.first);
253 176855 : Ref = MD;
254 176855 : if (MD)
255 : MetadataTracking::track(Ref);
256 176855 : UseMap.erase(Pair.first);
257 176855 : continue;
258 : }
259 :
260 : // Check for MetadataAsValue.
261 160878 : if (Owner.is<MetadataAsValue *>()) {
262 97010 : Owner.get<MetadataAsValue *>()->handleChangedMetadata(MD);
263 97010 : continue;
264 : }
265 :
266 : // There's a Metadata owner -- dispatch.
267 : Metadata *OwnerMD = Owner.get<Metadata *>();
268 127736 : switch (OwnerMD->getMetadataID()) {
269 : #define HANDLE_METADATA_LEAF(CLASS) \
270 : case Metadata::CLASS##Kind: \
271 : cast<CLASS>(OwnerMD)->handleChangedOperand(Pair.first, MD); \
272 : continue;
273 : #include "llvm/IR/Metadata.def"
274 0 : default:
275 0 : llvm_unreachable("Invalid metadata subclass");
276 : }
277 : }
278 : assert(UseMap.empty() && "Expected all uses to be replaced");
279 : }
280 :
281 395678 : void ReplaceableMetadataImpl::resolveAllUses(bool ResolveUsers) {
282 395678 : if (UseMap.empty())
283 232224 : return;
284 :
285 163891 : if (!ResolveUsers) {
286 437 : UseMap.clear();
287 437 : return;
288 : }
289 :
290 : // Copy out uses since UseMap could get touched below.
291 : using UseTy = std::pair<void *, std::pair<OwnerTy, uint64_t>>;
292 326908 : SmallVector<UseTy, 8> Uses(UseMap.begin(), UseMap.end());
293 : llvm::sort(Uses, [](const UseTy &L, const UseTy &R) {
294 0 : return L.second.second < R.second.second;
295 : });
296 163454 : UseMap.clear();
297 476546 : for (const auto &Pair : Uses) {
298 313092 : auto Owner = Pair.second.first;
299 313092 : if (!Owner)
300 : continue;
301 161343 : if (Owner.is<MetadataAsValue *>())
302 : continue;
303 :
304 : // Resolve MDNodes that point at this.
305 : auto *OwnerMD = dyn_cast<MDNode>(Owner.get<Metadata *>());
306 : if (!OwnerMD)
307 : continue;
308 : if (OwnerMD->isResolved())
309 : continue;
310 92344 : OwnerMD->decrementUnresolvedOperandCount();
311 : }
312 : }
313 :
314 149350757 : ReplaceableMetadataImpl *ReplaceableMetadataImpl::getOrCreate(Metadata &MD) {
315 : if (auto *N = dyn_cast<MDNode>(&MD))
316 630798 : return N->isResolved() ? nullptr : N->Context.getOrCreateReplaceableUses();
317 294691 : return dyn_cast<ValueAsMetadata>(&MD);
318 : }
319 :
320 221464727 : ReplaceableMetadataImpl *ReplaceableMetadataImpl::getIfExists(Metadata &MD) {
321 : if (auto *N = dyn_cast<MDNode>(&MD))
322 : return N->isResolved() ? nullptr : N->Context.getReplaceableUses();
323 233962 : return dyn_cast<ValueAsMetadata>(&MD);
324 : }
325 :
326 0 : bool ReplaceableMetadataImpl::isReplaceable(const Metadata &MD) {
327 : if (auto *N = dyn_cast<MDNode>(&MD))
328 0 : return !N->isResolved();
329 0 : return dyn_cast<ValueAsMetadata>(&MD);
330 : }
331 :
332 86586 : static DISubprogram *getLocalFunctionMetadata(Value *V) {
333 : assert(V && "Expected value");
334 : if (auto *A = dyn_cast<Argument>(V)) {
335 3275 : if (auto *Fn = A->getParent())
336 2648 : return Fn->getSubprogram();
337 : return nullptr;
338 : }
339 :
340 83311 : if (BasicBlock *BB = cast<Instruction>(V)->getParent()) {
341 81245 : if (auto *Fn = BB->getParent())
342 81245 : return Fn->getSubprogram();
343 : return nullptr;
344 : }
345 :
346 : return nullptr;
347 : }
348 :
349 492651 : ValueAsMetadata *ValueAsMetadata::get(Value *V) {
350 : assert(V && "Unexpected null Value");
351 :
352 492651 : auto &Context = V->getContext();
353 492651 : auto *&Entry = Context.pImpl->ValuesAsMetadata[V];
354 492651 : if (!Entry) {
355 : assert((isa<Constant>(V) || isa<Argument>(V) || isa<Instruction>(V)) &&
356 : "Expected constant or function-local value");
357 : assert(!V->IsUsedByMD && "Expected this to be the only metadata use");
358 212729 : V->IsUsedByMD = true;
359 : if (auto *C = dyn_cast<Constant>(V))
360 179580 : Entry = new ConstantAsMetadata(C);
361 : else
362 122939 : Entry = new LocalAsMetadata(V);
363 : }
364 :
365 492651 : return Entry;
366 : }
367 :
368 114407 : ValueAsMetadata *ValueAsMetadata::getIfExists(Value *V) {
369 : assert(V && "Unexpected null Value");
370 114407 : return V->getContext().pImpl->ValuesAsMetadata.lookup(V);
371 : }
372 :
373 144615 : void ValueAsMetadata::handleDeletion(Value *V) {
374 : assert(V && "Expected valid value");
375 :
376 144615 : auto &Store = V->getType()->getContext().pImpl->ValuesAsMetadata;
377 144615 : auto I = Store.find(V);
378 144615 : if (I == Store.end())
379 1 : return;
380 :
381 : // Remove old entry from the map.
382 144614 : ValueAsMetadata *MD = I->second;
383 : assert(MD && "Expected valid metadata");
384 : assert(MD->getValue() == V && "Expected valid mapping");
385 : Store.erase(I);
386 :
387 : // Delete the metadata.
388 : MD->replaceAllUsesWith(nullptr);
389 289228 : delete MD;
390 : }
391 :
392 30991 : void ValueAsMetadata::handleRAUW(Value *From, Value *To) {
393 : assert(From && "Expected valid value");
394 : assert(To && "Expected valid value");
395 : assert(From != To && "Expected changed value");
396 : assert(From->getType() == To->getType() && "Unexpected type change");
397 :
398 30991 : LLVMContext &Context = From->getType()->getContext();
399 30991 : auto &Store = Context.pImpl->ValuesAsMetadata;
400 30991 : auto I = Store.find(From);
401 30991 : if (I == Store.end()) {
402 : assert(!From->IsUsedByMD && "Expected From not to be used by metadata");
403 18150 : return;
404 : }
405 :
406 : // Remove old entry from the map.
407 : assert(From->IsUsedByMD && "Expected From to be used by metadata");
408 30991 : From->IsUsedByMD = false;
409 30991 : ValueAsMetadata *MD = I->second;
410 : assert(MD && "Expected valid metadata");
411 : assert(MD->getValue() == From && "Expected valid mapping");
412 : Store.erase(I);
413 :
414 30991 : if (isa<LocalAsMetadata>(MD)) {
415 30840 : if (auto *C = dyn_cast<Constant>(To)) {
416 : // Local became a constant.
417 : MD->replaceAllUsesWith(ConstantAsMetadata::get(C));
418 7456 : delete MD;
419 7456 : return;
420 : }
421 43655 : if (getLocalFunctionMetadata(From) && getLocalFunctionMetadata(To) &&
422 20271 : getLocalFunctionMetadata(From) != getLocalFunctionMetadata(To)) {
423 : // DISubprogram changed.
424 : MD->replaceAllUsesWith(nullptr);
425 0 : delete MD;
426 0 : return;
427 : }
428 302 : } else if (!isa<Constant>(To)) {
429 : // Changed to function-local value.
430 : MD->replaceAllUsesWith(nullptr);
431 1 : delete MD;
432 1 : return;
433 : }
434 :
435 : auto *&Entry = Store[To];
436 23534 : if (Entry) {
437 : // The target already exists.
438 : MD->replaceAllUsesWith(Entry);
439 10693 : delete MD;
440 10693 : return;
441 : }
442 :
443 : // Update MD in place (and update the map entry).
444 : assert(!To->IsUsedByMD && "Expected this to be the only metadata use");
445 12841 : To->IsUsedByMD = true;
446 12841 : MD->V = To;
447 12841 : Entry = MD;
448 : }
449 :
450 : //===----------------------------------------------------------------------===//
451 : // MDString implementation.
452 : //
453 :
454 452859 : MDString *MDString::get(LLVMContext &Context, StringRef Str) {
455 452859 : auto &Store = Context.pImpl->MDStringCache;
456 452859 : auto I = Store.try_emplace(Str);
457 : auto &MapEntry = I.first->getValue();
458 452859 : if (!I.second)
459 : return &MapEntry;
460 250282 : MapEntry.Entry = &*I.first;
461 250282 : return &MapEntry;
462 : }
463 :
464 12567425 : StringRef MDString::getString() const {
465 : assert(Entry && "Expected to find string map entry");
466 25134850 : return Entry->first();
467 : }
468 :
469 : //===----------------------------------------------------------------------===//
470 : // MDNode implementation.
471 : //
472 :
473 : // Assert that the MDNode types will not be unaligned by the objects
474 : // prepended to them.
475 : #define HANDLE_MDNODE_LEAF(CLASS) \
476 : static_assert( \
477 : alignof(uint64_t) >= alignof(CLASS), \
478 : "Alignment is insufficient after objects prepended to " #CLASS);
479 : #include "llvm/IR/Metadata.def"
480 :
481 2281112 : void *MDNode::operator new(size_t Size, unsigned NumOps) {
482 2281112 : size_t OpSize = NumOps * sizeof(MDOperand);
483 : // uint64_t is the most aligned type we need support (ensured by static_assert
484 : // above)
485 : OpSize = alignTo(OpSize, alignof(uint64_t));
486 2281112 : void *Ptr = reinterpret_cast<char *>(::operator new(OpSize + Size)) + OpSize;
487 : MDOperand *O = static_cast<MDOperand *>(Ptr);
488 7181818 : for (MDOperand *E = O - NumOps; O != E; --O)
489 : (void)new (O - 1) MDOperand;
490 2281112 : return Ptr;
491 : }
492 :
493 381083 : void MDNode::operator delete(void *Mem) {
494 : MDNode *N = static_cast<MDNode *>(Mem);
495 381083 : size_t OpSize = N->NumOperands * sizeof(MDOperand);
496 : OpSize = alignTo(OpSize, alignof(uint64_t));
497 :
498 : MDOperand *O = static_cast<MDOperand *>(Mem);
499 1111407 : for (MDOperand *E = O - N->NumOperands; O != E; --O)
500 730323 : (O - 1)->~MDOperand();
501 381084 : ::operator delete(reinterpret_cast<char *>(Mem) - OpSize);
502 381085 : }
503 :
504 2281112 : MDNode::MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
505 2281112 : ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2)
506 2281112 : : Metadata(ID, Storage), NumOperands(Ops1.size() + Ops2.size()),
507 2281112 : NumUnresolved(0), Context(Context) {
508 : unsigned Op = 0;
509 7181783 : for (Metadata *MD : Ops1)
510 4900671 : setOperand(Op++, MD);
511 2281147 : for (Metadata *MD : Ops2)
512 35 : setOperand(Op++, MD);
513 :
514 2281112 : if (!isUniqued())
515 : return;
516 :
517 : // Count the unresolved operands. If there are any, RAUW support will be
518 : // added lazily on first reference.
519 1736982 : countUnresolvedOperands();
520 : }
521 :
522 33203 : TempMDNode MDNode::clone() const {
523 66406 : switch (getMetadataID()) {
524 0 : default:
525 0 : llvm_unreachable("Invalid MDNode subclass");
526 : #define HANDLE_MDNODE_LEAF(CLASS) \
527 : case CLASS##Kind: \
528 : return cast<CLASS>(this)->cloneImpl();
529 : #include "llvm/IR/Metadata.def"
530 : }
531 : }
532 :
533 3829412 : static bool isOperandUnresolved(Metadata *Op) {
534 : if (auto *N = dyn_cast_or_null<MDNode>(Op))
535 2868768 : return !N->isResolved();
536 : return false;
537 : }
538 :
539 1755099 : void MDNode::countUnresolvedOperands() {
540 : assert(NumUnresolved == 0 && "Expected unresolved ops to be uncounted");
541 : assert(isUniqued() && "Expected this to be uniqued");
542 1755099 : NumUnresolved = count_if(operands(), isOperandUnresolved);
543 1755099 : }
544 :
545 18117 : void MDNode::makeUniqued() {
546 : assert(isTemporary() && "Expected this to be temporary");
547 : assert(!isResolved() && "Expected this to be unresolved");
548 :
549 : // Enable uniquing callbacks.
550 150664 : for (auto &Op : mutable_operands())
551 132547 : Op.reset(Op.get(), this);
552 :
553 : // Make this 'uniqued'.
554 18117 : Storage = Uniqued;
555 18117 : countUnresolvedOperands();
556 18117 : if (!NumUnresolved) {
557 17504 : dropReplaceableUses();
558 : assert(isResolved() && "Expected this to be resolved");
559 : }
560 :
561 : assert(isUniqued() && "Expected this to be uniqued");
562 18117 : }
563 :
564 6187 : void MDNode::makeDistinct() {
565 : assert(isTemporary() && "Expected this to be temporary");
566 : assert(!isResolved() && "Expected this to be unresolved");
567 :
568 : // Drop RAUW support and store as a distinct node.
569 6187 : dropReplaceableUses();
570 6187 : storeDistinctInContext();
571 :
572 : assert(isDistinct() && "Expected this to be distinct");
573 : assert(isResolved() && "Expected this to be resolved");
574 6187 : }
575 :
576 60805 : void MDNode::resolve() {
577 : assert(isUniqued() && "Expected this to be uniqued");
578 : assert(!isResolved() && "Expected this to be unresolved");
579 :
580 60805 : NumUnresolved = 0;
581 60805 : dropReplaceableUses();
582 :
583 : assert(isResolved() && "Expected this to be resolved");
584 60805 : }
585 :
586 167299 : void MDNode::dropReplaceableUses() {
587 : assert(!NumUnresolved && "Unexpected unresolved operand");
588 :
589 : // Drop any RAUW support.
590 167299 : if (Context.hasReplaceableUses())
591 163454 : Context.takeReplaceableUses()->resolveAllUses();
592 167299 : }
593 :
594 39439 : void MDNode::resolveAfterOperandChange(Metadata *Old, Metadata *New) {
595 : assert(isUniqued() && "Expected this to be uniqued");
596 : assert(NumUnresolved != 0 && "Expected unresolved operands");
597 :
598 : // Check if an operand was resolved.
599 39438 : if (!isOperandUnresolved(Old)) {
600 2 : if (isOperandUnresolved(New))
601 : // An operand was un-resolved!
602 1 : ++NumUnresolved;
603 39205 : } else if (!isOperandUnresolved(New))
604 22946 : decrementUnresolvedOperandCount();
605 39439 : }
606 :
607 115290 : void MDNode::decrementUnresolvedOperandCount() {
608 : assert(!isResolved() && "Expected this to be unresolved");
609 115290 : if (isTemporary())
610 : return;
611 :
612 : assert(isUniqued() && "Expected this to be uniqued");
613 115290 : if (--NumUnresolved)
614 : return;
615 :
616 : // Last unresolved operand has just been resolved.
617 82803 : dropReplaceableUses();
618 : assert(isResolved() && "Expected this to become resolved");
619 : }
620 :
621 2064 : void MDNode::resolveCycles() {
622 : if (isResolved())
623 : return;
624 :
625 : // Resolve this node immediately.
626 667 : resolve();
627 :
628 : // Resolve all operands.
629 4872 : for (const auto &Op : operands()) {
630 : auto *N = dyn_cast_or_null<MDNode>(Op);
631 : if (!N)
632 : continue;
633 :
634 : assert(!N->isTemporary() &&
635 : "Expected all forward declarations to be resolved");
636 : if (!N->isResolved())
637 452 : N->resolveCycles();
638 : }
639 : }
640 :
641 : static bool hasSelfReference(MDNode *N) {
642 5 : for (Metadata *MD : N->operands())
643 3 : if (MD == N)
644 : return true;
645 : return false;
646 : }
647 :
648 4 : MDNode *MDNode::replaceWithPermanentImpl() {
649 4 : switch (getMetadataID()) {
650 1 : default:
651 : // If this type isn't uniquable, replace with a distinct node.
652 1 : return replaceWithDistinctImpl();
653 :
654 : #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
655 : case CLASS##Kind: \
656 : break;
657 : #include "llvm/IR/Metadata.def"
658 : }
659 :
660 : // Even if this type is uniquable, self-references have to be distinct.
661 3 : if (hasSelfReference(this))
662 1 : return replaceWithDistinctImpl();
663 2 : return replaceWithUniquedImpl();
664 : }
665 :
666 47545 : MDNode *MDNode::replaceWithUniquedImpl() {
667 : // Try to uniquify in place.
668 47545 : MDNode *UniquedNode = uniquify();
669 :
670 47545 : if (UniquedNode == this) {
671 18117 : makeUniqued();
672 18117 : return this;
673 : }
674 :
675 : // Collision, so RAUW instead.
676 : replaceAllUsesWith(UniquedNode);
677 29428 : deleteAsSubclass();
678 29428 : return UniquedNode;
679 : }
680 :
681 6187 : MDNode *MDNode::replaceWithDistinctImpl() {
682 6187 : makeDistinct();
683 6187 : return this;
684 : }
685 :
686 27083 : void MDTuple::recalculateHash() {
687 : setHash(MDTupleInfo::KeyTy::calculateHash(this));
688 27083 : }
689 :
690 479917 : void MDNode::dropAllReferences() {
691 1367119 : for (unsigned I = 0, E = NumOperands; I != E; ++I)
692 887202 : setOperand(I, nullptr);
693 479917 : if (Context.hasReplaceableUses()) {
694 164943 : Context.getReplaceableUses()->resolveAllUses(/* ResolveUsers */ false);
695 : (void)Context.takeReplaceableUses();
696 : }
697 479917 : }
698 :
699 111943 : void MDNode::handleChangedOperand(void *Ref, Metadata *New) {
700 111943 : unsigned Op = static_cast<MDOperand *>(Ref) - op_begin();
701 : assert(Op < getNumOperands() && "Expected valid operand");
702 :
703 111943 : if (!isUniqued()) {
704 : // This node is not uniqued. Just set the operand and be done with it.
705 7651 : setOperand(Op, New);
706 7651 : return;
707 : }
708 :
709 : // This node is uniqued.
710 104292 : eraseFromStore();
711 :
712 : Metadata *Old = getOperand(Op);
713 104292 : setOperand(Op, New);
714 :
715 : // Drop uniquing for self-reference cycles and deleted constants.
716 104292 : if (New == this || (!New && Old && isa<ConstantAsMetadata>(Old))) {
717 : if (!isResolved())
718 60138 : resolve();
719 64431 : storeDistinctInContext();
720 64431 : return;
721 : }
722 :
723 : // Re-unique the node.
724 39861 : auto *Uniqued = uniquify();
725 39861 : if (Uniqued == this) {
726 : if (!isResolved())
727 39439 : resolveAfterOperandChange(Old, New);
728 39601 : return;
729 : }
730 :
731 : // Collision.
732 : if (!isResolved()) {
733 : // Still unresolved, so RAUW.
734 : //
735 : // First, clear out all operands to prevent any recursion (similar to
736 : // dropAllReferences(), but we still need the use-list).
737 1252 : for (unsigned O = 0, E = getNumOperands(); O != E; ++O)
738 994 : setOperand(O, nullptr);
739 258 : if (Context.hasReplaceableUses())
740 258 : Context.getReplaceableUses()->replaceAllUsesWith(Uniqued);
741 258 : deleteAsSubclass();
742 258 : return;
743 : }
744 :
745 : // Store in non-uniqued form if RAUW isn't possible.
746 2 : storeDistinctInContext();
747 : }
748 :
749 228946 : void MDNode::deleteAsSubclass() {
750 457892 : switch (getMetadataID()) {
751 0 : default:
752 0 : llvm_unreachable("Invalid subclass of MDNode");
753 : #define HANDLE_MDNODE_LEAF(CLASS) \
754 : case CLASS##Kind: \
755 : delete cast<CLASS>(this); \
756 : break;
757 : #include "llvm/IR/Metadata.def"
758 : }
759 228947 : }
760 :
761 : template <class T, class InfoT>
762 87406 : static T *uniquifyImpl(T *N, DenseSet<T *, InfoT> &Store) {
763 174812 : if (T *U = getUniqued(Store, N))
764 : return U;
765 :
766 : Store.insert(N);
767 57718 : return N;
768 : }
769 15296 :
770 30592 : template <class NodeTy> struct MDNode::HasCachedHash {
771 : using Yes = char[1];
772 : using No = char[2];
773 : template <class U, U Val> struct SFINAE {};
774 14663 :
775 : template <class U>
776 27083 : static Yes &check(SFINAE<void (U::*)(unsigned), &U::setHash> *);
777 54166 : template <class U> static No &check(...);
778 :
779 : static const bool value = sizeof(check<NodeTy>(nullptr)) == sizeof(Yes);
780 : };
781 27006 :
782 : MDNode *MDNode::uniquify() {
783 1366 : assert(!hasSelfReference(this) && "Cannot uniquify a self-referencing node");
784 2732 :
785 : // Try to insert into uniquing store.
786 : switch (getMetadataID()) {
787 : default:
788 1366 : llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
789 : #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
790 1 : case CLASS##Kind: { \
791 2 : CLASS *SubclassThis = cast<CLASS>(this); \
792 : std::integral_constant<bool, HasCachedHash<CLASS>::value> \
793 : ShouldRecalculateHash; \
794 : dispatchRecalculateHash(SubclassThis, ShouldRecalculateHash); \
795 0 : return uniquifyImpl(SubclassThis, getContext().pImpl->CLASS##s); \
796 : }
797 880 : #include "llvm/IR/Metadata.def"
798 1760 : }
799 : }
800 :
801 : void MDNode::eraseFromStore() {
802 879 : switch (getMetadataID()) {
803 : default:
804 15 : llvm_unreachable("Invalid or non-uniquable subclass of MDNode");
805 30 : #define HANDLE_MDNODE_LEAF_UNIQUABLE(CLASS) \
806 : case CLASS##Kind: \
807 : getContext().pImpl->CLASS##s.erase(cast<CLASS>(this)); \
808 : break;
809 14 : #include "llvm/IR/Metadata.def"
810 : }
811 11 : }
812 22 :
813 : MDTuple *MDTuple::getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
814 : StorageType Storage, bool ShouldCreate) {
815 : unsigned Hash = 0;
816 10 : if (Storage == Uniqued) {
817 : MDTupleInfo::KeyTy Key(MDs);
818 1 : if (auto *N = getUniqued(Context.pImpl->MDTuples, Key))
819 2 : return N;
820 : if (!ShouldCreate)
821 : return nullptr;
822 : Hash = Key.getHash();
823 0 : } else {
824 : assert(ShouldCreate && "Expected non-uniqued nodes to always be created");
825 2 : }
826 4 :
827 : return storeImpl(new (MDs.size()) MDTuple(Context, Storage, Hash, MDs),
828 : Storage, Context.pImpl->MDTuples);
829 : }
830 0 :
831 : void MDNode::deleteTemporary(MDNode *N) {
832 35368 : assert(N->isTemporary() && "Expected temporary node");
833 70736 : N->replaceAllUsesWith(nullptr);
834 : N->deleteAsSubclass();
835 : }
836 :
837 6471 : void MDNode::storeDistinctInContext() {
838 : assert(!Context.hasReplaceableUses() && "Unexpected replaceable uses");
839 2267 : assert(!NumUnresolved && "Unexpected unresolved nodes");
840 4534 : Storage = Distinct;
841 : assert(isResolved() && "Expected this to be resolved");
842 :
843 : // Reset the hash.
844 2256 : switch (getMetadataID()) {
845 : default:
846 1667 : llvm_unreachable("Invalid subclass of MDNode");
847 3334 : #define HANDLE_MDNODE_LEAF(CLASS) \
848 : case CLASS##Kind: { \
849 : std::integral_constant<bool, HasCachedHash<CLASS>::value> ShouldResetHash; \
850 : dispatchResetHash(cast<CLASS>(this), ShouldResetHash); \
851 1634 : break; \
852 : }
853 1 : #include "llvm/IR/Metadata.def"
854 2 : }
855 :
856 : getContext().pImpl->DistinctMDNodes.push_back(this);
857 : }
858 0 :
859 : void MDNode::replaceOperandWith(unsigned I, Metadata *New) {
860 14 : if (getOperand(I) == New)
861 28 : return;
862 :
863 : if (!isUniqued()) {
864 : setOperand(I, New);
865 13 : return;
866 : }
867 1 :
868 2 : handleChangedOperand(mutable_begin() + I, New);
869 : }
870 :
871 : void MDNode::setOperand(unsigned I, Metadata *New) {
872 0 : assert(I < NumOperands);
873 : mutable_begin()[I].reset(New, isUniqued() ? this : nullptr);
874 86 : }
875 172 :
876 : /// Get a node or a self-reference that looks like it.
877 : ///
878 : /// Special handling for finding self-references, for use by \a
879 85 : /// MDNode::concatenate() and \a MDNode::intersect() to maintain behaviour from
880 : /// when self-referencing nodes were still uniqued. If the first operand has
881 12 : /// the same operands as \c Ops, return the first operand instead.
882 24 : static MDNode *getOrSelfReference(LLVMContext &Context,
883 : ArrayRef<Metadata *> Ops) {
884 : if (!Ops.empty())
885 : if (MDNode *N = dyn_cast_or_null<MDNode>(Ops[0]))
886 11 : if (N->getNumOperands() == Ops.size() && N == N->getOperand(0)) {
887 : for (unsigned I = 1, E = Ops.size(); I != E; ++I)
888 1 : if (Ops[I] != N->getOperand(I))
889 2 : return MDNode::get(Context, Ops);
890 : return N;
891 : }
892 :
893 0 : return MDNode::get(Context, Ops);
894 : }
895 147 :
896 294 : MDNode *MDNode::concatenate(MDNode *A, MDNode *B) {
897 : if (!A)
898 : return B;
899 : if (!B)
900 128 : return A;
901 :
902 25 : SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
903 50 : MDs.insert(B->op_begin(), B->op_end());
904 :
905 : // FIXME: This preserves long-standing behaviour, but is it really the right
906 : // behaviour? Or was that an unintended side-effect of node uniquing?
907 24 : return getOrSelfReference(A->getContext(), MDs.getArrayRef());
908 : }
909 634 :
910 1268 : MDNode *MDNode::intersect(MDNode *A, MDNode *B) {
911 : if (!A || !B)
912 : return nullptr;
913 :
914 633 : SmallSetVector<Metadata *, 4> MDs(A->op_begin(), A->op_end());
915 : SmallPtrSet<Metadata *, 4> BSet(B->op_begin(), B->op_end());
916 1625 : MDs.remove_if([&](Metadata *MD) { return !is_contained(BSet, MD); });
917 3250 :
918 : // FIXME: This preserves long-standing behaviour, but is it really the right
919 : // behaviour? Or was that an unintended side-effect of node uniquing?
920 : return getOrSelfReference(A->getContext(), MDs.getArrayRef());
921 1624 : }
922 :
923 1 : MDNode *MDNode::getMostGenericAliasScope(MDNode *A, MDNode *B) {
924 2 : if (!A || !B)
925 : return nullptr;
926 :
927 : return concatenate(A, B);
928 1 : }
929 :
930 1 : MDNode *MDNode::getMostGenericFPMath(MDNode *A, MDNode *B) {
931 2 : if (!A || !B)
932 : return nullptr;
933 :
934 : APFloat AVal = mdconst::extract<ConstantFP>(A->getOperand(0))->getValueAPF();
935 0 : APFloat BVal = mdconst::extract<ConstantFP>(B->getOperand(0))->getValueAPF();
936 : if (AVal.compare(BVal) == APFloat::cmpLessThan)
937 901 : return A;
938 1802 : return B;
939 : }
940 :
941 : static bool isContiguous(const ConstantRange &A, const ConstantRange &B) {
942 900 : return A.getUpper() == B.getLower() || A.getLower() == B.getUpper();
943 : }
944 0 :
945 0 : static bool canBeMerged(const ConstantRange &A, const ConstantRange &B) {
946 : return !A.intersectWith(B).isEmptySet() || isContiguous(A, B);
947 : }
948 :
949 0 : static bool tryMergeRange(SmallVectorImpl<ConstantInt *> &EndPoints,
950 : ConstantInt *Low, ConstantInt *High) {
951 : ConstantRange NewRange(Low->getValue(), High->getValue());
952 : unsigned Size = EndPoints.size();
953 : APInt LB = EndPoints[Size - 2]->getValue();
954 : APInt LE = EndPoints[Size - 1]->getValue();
955 : ConstantRange LastRange(LB, LE);
956 : if (canBeMerged(NewRange, LastRange)) {
957 : ConstantRange Union = LastRange.unionWith(NewRange);
958 : Type *Ty = High->getType();
959 : EndPoints[Size - 2] =
960 : cast<ConstantInt>(ConstantInt::get(Ty, Union.getLower()));
961 : EndPoints[Size - 1] =
962 : cast<ConstantInt>(ConstantInt::get(Ty, Union.getUpper()));
963 : return true;
964 87406 : }
965 : return false;
966 : }
967 :
968 174812 : static void addRange(SmallVectorImpl<ConstantInt *> &EndPoints,
969 0 : ConstantInt *Low, ConstantInt *High) {
970 0 : if (!EndPoints.empty())
971 : if (tryMergeRange(EndPoints, Low, High))
972 : return;
973 :
974 : EndPoints.push_back(Low);
975 : EndPoints.push_back(High);
976 : }
977 :
978 : MDNode *MDNode::getMostGenericRange(MDNode *A, MDNode *B) {
979 : // Given two ranges, we want to compute the union of the ranges. This
980 : // is slightly complicated by having to combine the intervals and merge
981 : // the ones that overlap.
982 :
983 104292 : if (!A || !B)
984 208584 : return nullptr;
985 0 :
986 0 : if (A == B)
987 : return A;
988 :
989 : // First, walk both lists in order of the lower boundary of each interval.
990 : // At each step, try to merge the new interval to the last one we adedd.
991 : SmallVector<ConstantInt *, 4> EndPoints;
992 : int AI = 0;
993 104292 : int BI = 0;
994 : int AN = A->getNumOperands() / 2;
995 1128353 : int BN = B->getNumOperands() / 2;
996 : while (AI < AN && BI < BN) {
997 : ConstantInt *ALow = mdconst::extract<ConstantInt>(A->getOperand(2 * AI));
998 1128353 : ConstantInt *BLow = mdconst::extract<ConstantInt>(B->getOperand(2 * BI));
999 :
1000 1654502 : if (ALow->getValue().slt(BLow->getValue())) {
1001 693821 : addRange(EndPoints, ALow,
1002 266862 : mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1003 : ++AI;
1004 266861 : } else {
1005 : addRange(EndPoints, BLow,
1006 : mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1007 : ++BI;
1008 : }
1009 434532 : }
1010 434532 : while (AI < AN) {
1011 : addRange(EndPoints, mdconst::extract<ConstantInt>(A->getOperand(2 * AI)),
1012 : mdconst::extract<ConstantInt>(A->getOperand(2 * AI + 1)));
1013 165477 : ++AI;
1014 : }
1015 : while (BI < BN) {
1016 165477 : addRange(EndPoints, mdconst::extract<ConstantInt>(B->getOperand(2 * BI)),
1017 165477 : mdconst::extract<ConstantInt>(B->getOperand(2 * BI + 1)));
1018 : ++BI;
1019 395541 : }
1020 :
1021 : // If we have more than 2 ranges (4 endpoints) we have to try to merge
1022 395541 : // the last and first ones.
1023 : unsigned Size = EndPoints.size();
1024 : if (Size > 4) {
1025 : ConstantInt *FB = EndPoints[0];
1026 395541 : ConstantInt *FE = EndPoints[1];
1027 0 : if (tryMergeRange(EndPoints, FB, FE)) {
1028 0 : for (unsigned i = 0; i < Size - 2; ++i) {
1029 : EndPoints[i] = EndPoints[i + 2];
1030 : }
1031 : EndPoints.resize(Size - 2);
1032 : }
1033 : }
1034 :
1035 : // If in the end we have a single range, it is possible that it is now the
1036 : // full range. Just drop the metadata in that case.
1037 : if (EndPoints.size() == 2) {
1038 395541 : ConstantRange Range(EndPoints[0]->getValue(), EndPoints[1]->getValue());
1039 395541 : if (Range.isFullSet())
1040 : return nullptr;
1041 66532 : }
1042 66532 :
1043 : SmallVector<Metadata *, 4> MDs;
1044 : MDs.reserve(EndPoints.size());
1045 60938 : for (auto *I : EndPoints)
1046 12863 : MDs.push_back(ConstantAsMetadata::get(I));
1047 12863 : return MDNode::get(A->getContext(), MDs);
1048 : }
1049 :
1050 48075 : MDNode *MDNode::getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B) {
1051 : if (!A || !B)
1052 : return nullptr;
1053 5913718 :
1054 : ConstantInt *AVal = mdconst::extract<ConstantInt>(A->getOperand(0));
1055 13251195 : ConstantInt *BVal = mdconst::extract<ConstantInt>(B->getOperand(0));
1056 5913717 : if (AVal->getZExtValue() < BVal->getZExtValue())
1057 : return A;
1058 : return B;
1059 : }
1060 :
1061 : //===----------------------------------------------------------------------===//
1062 : // NamedMDNode implementation.
1063 : //
1064 106237 :
1065 : static SmallVector<TrackingMDRef, 4> &getNMDOps(void *Operands) {
1066 106237 : return *(SmallVector<TrackingMDRef, 4> *)Operands;
1067 95426 : }
1068 95420 :
1069 10276 : NamedMDNode::NamedMDNode(const Twine &N)
1070 30798 : : Name(N.str()), Operands(new SmallVector<TrackingMDRef, 4>()) {}
1071 10246 :
1072 : NamedMDNode::~NamedMDNode() {
1073 : dropAllReferences();
1074 : delete &getNMDOps(Operands);
1075 95981 : }
1076 :
1077 : unsigned NamedMDNode::getNumOperands() const {
1078 313676 : return (unsigned)getNMDOps(Operands).size();
1079 313676 : }
1080 :
1081 84079 : MDNode *NamedMDNode::getOperand(unsigned i) const {
1082 : assert(i < getNumOperands() && "Invalid Operand number!");
1083 : auto *N = getNMDOps(Operands)[i].get();
1084 84075 : return cast_or_null<MDNode>(N);
1085 84075 : }
1086 :
1087 : void NamedMDNode::addOperand(MDNode *M) { getNMDOps(Operands).emplace_back(M); }
1088 :
1089 84075 : void NamedMDNode::setOperand(unsigned I, MDNode *New) {
1090 : assert(I < getNumOperands() && "Invalid operand number");
1091 : getNMDOps(Operands)[I].reset(New);
1092 22496 : }
1093 22496 :
1094 : void NamedMDNode::eraseFromParent() { getParent()->eraseNamedMetadata(this); }
1095 :
1096 22162 : void NamedMDNode::clearOperands() { getNMDOps(Operands).clear(); }
1097 22162 :
1098 35046 : StringRef NamedMDNode::getName() const { return StringRef(Name); }
1099 :
1100 : //===----------------------------------------------------------------------===//
1101 : // Instruction Metadata method implementations.
1102 22162 : //
1103 : void MDAttachmentMap::set(unsigned ID, MDNode &MD) {
1104 : for (auto &I : Attachments)
1105 244 : if (I.first == ID) {
1106 244 : I.second.reset(&MD);
1107 : return;
1108 : }
1109 16 : Attachments.emplace_back(std::piecewise_construct, std::make_tuple(ID),
1110 : std::make_tuple(&MD));
1111 : }
1112 10 :
1113 10 : bool MDAttachmentMap::erase(unsigned ID) {
1114 : if (empty())
1115 : return false;
1116 :
1117 : // Common case is one/last value.
1118 8 : if (Attachments.back().first == ID) {
1119 2 : Attachments.pop_back();
1120 : return true;
1121 : }
1122 :
1123 19 : for (auto I = Attachments.begin(), E = std::prev(Attachments.end()); I != E;
1124 36 : ++I)
1125 : if (I->first == ID) {
1126 : *I = std::move(Attachments.back());
1127 22 : Attachments.pop_back();
1128 28 : return true;
1129 : }
1130 :
1131 22 : return false;
1132 : }
1133 66 :
1134 22 : MDNode *MDAttachmentMap::lookup(unsigned ID) const {
1135 44 : for (const auto &I : Attachments)
1136 44 : if (I.first == ID)
1137 66 : return I.second;
1138 22 : return nullptr;
1139 9 : }
1140 :
1141 9 : void MDAttachmentMap::getAll(
1142 9 : SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1143 9 : Result.append(Attachments.begin(), Attachments.end());
1144 9 :
1145 : // Sort the resulting array so it is stable.
1146 : if (Result.size() > 1)
1147 : array_pod_sort(Result.begin(), Result.end());
1148 : }
1149 :
1150 38 : void MDGlobalAttachmentMap::insert(unsigned ID, MDNode &MD) {
1151 : Attachments.push_back({ID, TrackingMDNodeRef(&MD)});
1152 38 : }
1153 20 :
1154 : MDNode *MDGlobalAttachmentMap::lookup(unsigned ID) const {
1155 : for (const auto &A : Attachments)
1156 31 : if (A.MDKind == ID)
1157 31 : return A.Node;
1158 : return nullptr;
1159 : }
1160 51 :
1161 : void MDGlobalAttachmentMap::get(unsigned ID,
1162 : SmallVectorImpl<MDNode *> &Result) const {
1163 : for (const auto &A : Attachments)
1164 : if (A.MDKind == ID)
1165 51 : Result.push_back(A.Node);
1166 : }
1167 :
1168 47 : bool MDGlobalAttachmentMap::erase(unsigned ID) {
1169 : auto I = std::remove_if(Attachments.begin(), Attachments.end(),
1170 : [ID](const Attachment &A) { return A.MDKind == ID; });
1171 : bool Changed = I != Attachments.end();
1172 : Attachments.erase(I, Attachments.end());
1173 : return Changed;
1174 : }
1175 :
1176 18 : void MDGlobalAttachmentMap::getAll(
1177 18 : SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1178 38 : for (const auto &A : Attachments)
1179 20 : Result.emplace_back(A.MDKind, A.Node);
1180 20 :
1181 : // Sort the resulting array so it is stable with respect to metadata IDs. We
1182 20 : // need to preserve the original insertion order though.
1183 0 : std::stable_sort(
1184 0 : Result.begin(), Result.end(),
1185 0 : [](const std::pair<unsigned, MDNode *> &A,
1186 : const std::pair<unsigned, MDNode *> &B) { return A.first < B.first; });
1187 20 : }
1188 20 :
1189 20 : void Instruction::setMetadata(StringRef Kind, MDNode *Node) {
1190 : if (!Node && !hasMetadata())
1191 : return;
1192 36 : setMetadata(getContext().getMDKindID(Kind), Node);
1193 36 : }
1194 18 :
1195 18 : MDNode *Instruction::getMetadataImpl(StringRef Kind) const {
1196 : return getMetadataImpl(getContext().getMDKindID(Kind));
1197 18 : }
1198 0 :
1199 0 : void Instruction::dropUnknownNonDebugMetadata(ArrayRef<unsigned> KnownIDs) {
1200 0 : if (!hasMetadataHashEntry())
1201 : return; // Nothing to remove!
1202 :
1203 : auto &InstructionMetadata = getContext().pImpl->InstructionMetadata;
1204 :
1205 18 : SmallSet<unsigned, 4> KnownSet;
1206 18 : KnownSet.insert(KnownIDs.begin(), KnownIDs.end());
1207 2 : if (KnownSet.empty()) {
1208 2 : // Just drop our entry at the store.
1209 2 : InstructionMetadata.erase(this);
1210 10 : setHasMetadataHashEntry(false);
1211 24 : return;
1212 : }
1213 2 :
1214 : auto &Info = InstructionMetadata[this];
1215 : Info.remove_if([&KnownSet](const std::pair<unsigned, TrackingMDNodeRef> &I) {
1216 : return !KnownSet.count(I.first);
1217 : });
1218 :
1219 18 : if (Info.empty()) {
1220 33 : // Drop our entry at the store.
1221 7 : InstructionMetadata.erase(this);
1222 2 : setHasMetadataHashEntry(false);
1223 : }
1224 : }
1225 :
1226 16 : void Instruction::setMetadata(unsigned KindID, MDNode *Node) {
1227 70 : if (!Node && !hasMetadata())
1228 54 : return;
1229 :
1230 : // Handle 'dbg' as a special case since it is not stored in the hash table.
1231 : if (KindID == LLVMContext::MD_dbg) {
1232 9 : DbgLoc = DebugLoc(Node);
1233 9 : return;
1234 : }
1235 :
1236 : // Handle the case when we're adding/updating metadata on an instruction.
1237 : if (Node) {
1238 9 : auto &Info = getContext().pImpl->InstructionMetadata[this];
1239 0 : assert(!Info.empty() == hasMetadataHashEntry() &&
1240 : "HasMetadata bit is wonked");
1241 : if (Info.empty())
1242 : setHasMetadataHashEntry(true);
1243 : Info.set(KindID, *Node);
1244 : return;
1245 : }
1246 :
1247 : // Otherwise, we're removing metadata from an instruction.
1248 : assert((hasMetadataHashEntry() ==
1249 : (getContext().pImpl->InstructionMetadata.count(this) > 0)) &&
1250 : "HasMetadata bit out of date!");
1251 42174 : if (!hasMetadataHashEntry())
1252 42174 : return; // Nothing to remove!
1253 : auto &Info = getContext().pImpl->InstructionMetadata[this];
1254 29094 :
1255 : // Handle removal of an existing value.
1256 29094 : Info.erase(KindID);
1257 29094 :
1258 : if (!Info.empty())
1259 2882255 : return;
1260 2882255 :
1261 : getContext().pImpl->InstructionMetadata.erase(this);
1262 : setHasMetadataHashEntry(false);
1263 7907035 : }
1264 :
1265 15814070 : void Instruction::setAAMetadata(const AAMDNodes &N) {
1266 7907035 : setMetadata(LLVMContext::MD_tbaa, N.TBAA);
1267 : setMetadata(LLVMContext::MD_alias_scope, N.Scope);
1268 : setMetadata(LLVMContext::MD_noalias, N.NoAlias);
1269 64388 : }
1270 :
1271 340 : MDNode *Instruction::getMetadataImpl(unsigned KindID) const {
1272 : // Handle 'dbg' as a special case since it is not stored in the hash table.
1273 680 : if (KindID == LLVMContext::MD_dbg)
1274 340 : return DbgLoc.getAsMDNode();
1275 :
1276 709 : if (!hasMetadataHashEntry())
1277 : return nullptr;
1278 29116 : auto &Info = getContext().pImpl->InstructionMetadata[this];
1279 : assert(!Info.empty() && "bit out of sync with hash table");
1280 293558 :
1281 : return Info.lookup(KindID);
1282 : }
1283 :
1284 : void Instruction::getAllMetadataImpl(
1285 1393870 : SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1286 1454137 : Result.clear();
1287 286593 :
1288 : // Handle 'dbg' as a special case since it is not stored in the hash table.
1289 226326 : if (DbgLoc) {
1290 : Result.push_back(
1291 2335088 : std::make_pair((unsigned)LLVMContext::MD_dbg, DbgLoc.getAsMDNode()));
1292 1167544 : if (!hasMetadataHashEntry())
1293 : return;
1294 : }
1295 653823 :
1296 653823 : assert(hasMetadataHashEntry() &&
1297 : getContext().pImpl->InstructionMetadata.count(this) &&
1298 : "Shouldn't have called this");
1299 : const auto &Info = getContext().pImpl->InstructionMetadata.find(this)->second;
1300 653823 : assert(!Info.empty() && "Shouldn't have called this");
1301 270 : Info.getAll(Result);
1302 270 : }
1303 :
1304 : void Instruction::getAllMetadataOtherThanDebugLocImpl(
1305 670402 : SmallVectorImpl<std::pair<unsigned, MDNode *>> &Result) const {
1306 : Result.clear();
1307 16857 : assert(hasMetadataHashEntry() &&
1308 : getContext().pImpl->InstructionMetadata.count(this) &&
1309 8 : "Shouldn't have called this");
1310 8 : const auto &Info = getContext().pImpl->InstructionMetadata.find(this)->second;
1311 : assert(!Info.empty() && "Shouldn't have called this");
1312 : Info.getAll(Result);
1313 : }
1314 :
1315 : bool Instruction::extractProfMetadata(uint64_t &TrueVal,
1316 35099244 : uint64_t &FalseVal) const {
1317 63057411 : assert(
1318 35996796 : (getOpcode() == Instruction::Br || getOpcode() == Instruction::Select) &&
1319 8038629 : "Looking for branch weights on something besides branch or select");
1320 :
1321 : auto *ProfileData = getMetadata(LLVMContext::MD_prof);
1322 : if (!ProfileData || ProfileData->getNumOperands() != 3)
1323 996917 : return false;
1324 :
1325 996917 : auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0));
1326 : if (!ProfDataName || !ProfDataName->getString().equals("branch_weights"))
1327 : return false;
1328 1993834 :
1329 : auto *CITrue = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(1));
1330 996917 : auto *CIFalse = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2));
1331 : if (!CITrue || !CIFalse)
1332 50424 : return false;
1333 50424 :
1334 50424 : TrueVal = CITrue->getValue().getZExtValue();
1335 : FalseVal = CIFalse->getValue().getZExtValue();
1336 2940801 :
1337 3377935 : return true;
1338 2962438 : }
1339 2525304 :
1340 : bool Instruction::extractProfTotalWeight(uint64_t &TotalVal) const {
1341 : assert((getOpcode() == Instruction::Br ||
1342 : getOpcode() == Instruction::Select ||
1343 5978 : getOpcode() == Instruction::Call ||
1344 : getOpcode() == Instruction::Invoke ||
1345 12989 : getOpcode() == Instruction::Switch) &&
1346 7011 : "Looking for branch weights on something besides branch");
1347 10680 :
1348 5978 : TotalVal = 0;
1349 : auto *ProfileData = getMetadata(LLVMContext::MD_prof);
1350 2963 : if (!ProfileData)
1351 : return false;
1352 :
1353 2963 : auto *ProfDataName = dyn_cast<MDString>(ProfileData->getOperand(0));
1354 2963 : if (!ProfDataName)
1355 2963 : return false;
1356 :
1357 : if (ProfDataName->getString().equals("branch_weights")) {
1358 25377 : TotalVal = 0;
1359 : for (unsigned i = 1; i < ProfileData->getNumOperands(); i++) {
1360 59513 : auto *V = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(i));
1361 34136 : if (!V)
1362 : return false;
1363 : TotalVal += V->getValue().getZExtValue();
1364 : }
1365 : return true;
1366 : } else if (ProfDataName->getString().equals("VP") &&
1367 : ProfileData->getNumOperands() > 3) {
1368 0 : TotalVal = mdconst::dyn_extract<ConstantInt>(ProfileData->getOperand(2))
1369 25377 : ->getValue()
1370 : .getZExtValue();
1371 202753 : return true;
1372 202753 : }
1373 : return false;
1374 95749 : }
1375 :
1376 : void Instruction::clearMetadataHashEntries() {
1377 5247 : assert(hasMetadataHashEntry() && "Caller should check");
1378 5247 : getContext().pImpl->InstructionMetadata.erase(this);
1379 : setHasMetadataHashEntry(false);
1380 : }
1381 30217 :
1382 30217 : void GlobalObject::getMetadata(unsigned KindID,
1383 26314 : SmallVectorImpl<MDNode *> &MDs) const {
1384 : if (hasMetadata())
1385 4961 : getContext().pImpl->GlobalObjectMetadata[this].get(KindID, MDs);
1386 : }
1387 3903 :
1388 4961 : void GlobalObject::getMetadata(StringRef Kind,
1389 : SmallVectorImpl<MDNode *> &MDs) const {
1390 : if (hasMetadata())
1391 1058 : getMetadata(getContext().getMDKindID(Kind), MDs);
1392 : }
1393 1058 :
1394 : void GlobalObject::addMetadata(unsigned KindID, MDNode &MD) {
1395 : if (!hasMetadata())
1396 3903 : setHasMetadataHashEntry(true);
1397 3903 :
1398 0 : getContext().pImpl->GlobalObjectMetadata[this].insert(KindID, MD);
1399 : }
1400 :
1401 3903 : void GlobalObject::addMetadata(StringRef Kind, MDNode &MD) {
1402 : addMetadata(getContext().getMDKindID(Kind), MD);
1403 105 : }
1404 :
1405 : bool GlobalObject::eraseMetadata(unsigned KindID) {
1406 : // Nothing to unset.
1407 : if (!hasMetadata())
1408 5710543 : return false;
1409 5710543 :
1410 : auto &Store = getContext().pImpl->GlobalObjectMetadata[this];
1411 : bool Changed = Store.erase(KindID);
1412 : if (Store.empty())
1413 4935971 : clearMetadata();
1414 24193 : return Changed;
1415 24193 : }
1416 :
1417 : void GlobalObject::getAllMetadata(
1418 : SmallVectorImpl<std::pair<unsigned, MDNode *>> &MDs) const {
1419 4911778 : MDs.clear();
1420 1393870 :
1421 : if (!hasMetadata())
1422 : return;
1423 1393870 :
1424 : getContext().pImpl->GlobalObjectMetadata[this].getAll(MDs);
1425 1393870 : }
1426 1393870 :
1427 : void GlobalObject::clearMetadata() {
1428 : if (!hasMetadata())
1429 : return;
1430 : getContext().pImpl->GlobalObjectMetadata.erase(this);
1431 : setHasMetadataHashEntry(false);
1432 : }
1433 3517908 :
1434 : void GlobalObject::setMetadata(unsigned KindID, MDNode *N) {
1435 653823 : eraseMetadata(KindID);
1436 : if (N)
1437 : addMetadata(KindID, *N);
1438 653823 : }
1439 :
1440 653823 : void GlobalObject::setMetadata(StringRef Kind, MDNode *N) {
1441 : setMetadata(getContext().getMDKindID(Kind), N);
1442 : }
1443 265 :
1444 : MDNode *GlobalObject::getMetadata(unsigned KindID) const {
1445 : if (hasMetadata())
1446 : return getContext().pImpl->GlobalObjectMetadata[this].lookup(KindID);
1447 331110 : return nullptr;
1448 331110 : }
1449 331110 :
1450 331110 : MDNode *GlobalObject::getMetadata(StringRef Kind) const {
1451 331110 : return getMetadata(getContext().getMDKindID(Kind));
1452 : }
1453 169535464 :
1454 : void GlobalObject::copyMetadata(const GlobalObject *Other, unsigned Offset) {
1455 169535464 : SmallVector<std::pair<unsigned, MDNode *>, 8> MDs;
1456 0 : Other->getAllMetadata(MDs);
1457 : for (auto &MD : MDs) {
1458 169535464 : // We need to adjust the type metadata offset.
1459 : if (Offset != 0 && MD.first == LLVMContext::MD_type) {
1460 35099244 : auto *OffsetConst = cast<ConstantInt>(
1461 : cast<ConstantAsMetadata>(MD.second->getOperand(0))->getValue());
1462 : Metadata *TypeId = MD.second->getOperand(1);
1463 35099244 : auto *NewOffsetMD = ConstantAsMetadata::get(ConstantInt::get(
1464 : OffsetConst->getType(), OffsetConst->getValue() + Offset));
1465 : addMetadata(LLVMContext::MD_type,
1466 2674083 : *MDNode::get(getContext(), {NewOffsetMD, TypeId}));
1467 : continue;
1468 : }
1469 : // If an offset adjustment was specified we need to modify the DIExpression
1470 : // to prepend the adjustment:
1471 2674083 : // !DIExpression(DW_OP_plus, Offset, [original expr])
1472 4688710 : auto *Attachment = MD.second;
1473 2344355 : if (Offset != 0 && MD.first == LLVMContext::MD_dbg) {
1474 2344355 : DIGlobalVariable *GV = dyn_cast<DIGlobalVariable>(Attachment);
1475 : DIExpression *E = nullptr;
1476 : if (!GV) {
1477 : auto *GVE = cast<DIGlobalVariableExpression>(Attachment);
1478 : GV = GVE->getVariable();
1479 : E = GVE->getExpression();
1480 : }
1481 492893 : ArrayRef<uint64_t> OrigElements;
1482 : if (E)
1483 492893 : OrigElements = E->getElements();
1484 : std::vector<uint64_t> Elements(OrigElements.size() + 2);
1485 : Elements[0] = dwarf::DW_OP_plus_uconst;
1486 504024 : Elements[1] = Offset;
1487 : std::copy(OrigElements.begin(), OrigElements.end(), Elements.begin() + 2);
1488 : E = DIExpression::get(getContext(), Elements);
1489 : Attachment = DIGlobalVariableExpression::get(getContext(), GV, E);
1490 : }
1491 : addMetadata(MD.first, *Attachment);
1492 504024 : }
1493 : }
1494 504024 :
1495 504024 : void GlobalObject::addTypeMetadata(unsigned Offset, Metadata *TypeID) {
1496 : addMetadata(
1497 10285 : LLVMContext::MD_type,
1498 : *MDTuple::get(getContext(),
1499 : {ConstantAsMetadata::get(ConstantInt::get(
1500 : Type::getInt64Ty(getContext()), Offset)),
1501 : TypeID}));
1502 : }
1503 :
1504 6421 : void Function::setSubprogram(DISubprogram *SP) {
1505 9942 : setMetadata(LLVMContext::MD_dbg, SP);
1506 : }
1507 :
1508 685 : DISubprogram *Function::getSubprogram() const {
1509 1 : return cast_or_null<DISubprogram>(getMetadata(LLVMContext::MD_dbg));
1510 : }
1511 :
1512 : bool Function::isDebugInfoForProfiling() const {
1513 342 : if (DISubprogram *SP = getSubprogram()) {
1514 : if (DICompileUnit *CU = SP->getUnit()) {
1515 : return CU->getDebugInfoForProfiling();
1516 342 : }
1517 342 : }
1518 : return false;
1519 342 : }
1520 :
1521 : void GlobalVariable::addDebugInfo(DIGlobalVariableExpression *GV) {
1522 3021 : addMetadata(LLVMContext::MD_dbg, *GV);
1523 : }
1524 :
1525 : void GlobalVariable::getDebugInfo(
1526 : SmallVectorImpl<DIGlobalVariableExpression *> &GVs) const {
1527 : SmallVector<MDNode *, 1> MDs;
1528 : getMetadata(LLVMContext::MD_dbg, MDs);
1529 : for (MDNode *MD : MDs)
1530 3021 : GVs.push_back(cast<DIGlobalVariableExpression>(MD));
1531 : }
|