LLVM 20.0.0git
Metadata.h
Go to the documentation of this file.
1//===- llvm/IR/Metadata.h - Metadata definitions ----------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9/// @file
10/// This file contains the declarations for metadata subclasses.
11/// They represent the different flavors of metadata that live in LLVM.
12//
13//===----------------------------------------------------------------------===//
14
15#ifndef LLVM_IR_METADATA_H
16#define LLVM_IR_METADATA_H
17
18#include "llvm/ADT/ArrayRef.h"
19#include "llvm/ADT/DenseMap.h"
23#include "llvm/ADT/StringRef.h"
24#include "llvm/ADT/ilist_node.h"
26#include "llvm/IR/Constant.h"
27#include "llvm/IR/LLVMContext.h"
28#include "llvm/IR/Value.h"
32#include <cassert>
33#include <cstddef>
34#include <cstdint>
35#include <iterator>
36#include <memory>
37#include <string>
38#include <type_traits>
39#include <utility>
40
41namespace llvm {
42
43class Module;
44class ModuleSlotTracker;
45class raw_ostream;
46class DbgVariableRecord;
47template <typename T> class StringMapEntry;
48template <typename ValueTy> class StringMapEntryStorage;
49class Type;
50
52 DEBUG_METADATA_VERSION = 3 // Current debug info version number.
53};
54
55/// Magic number in the value profile metadata showing a target has been
56/// promoted for the instruction and shouldn't be promoted again.
58
59/// Root of the metadata hierarchy.
60///
61/// This is a root class for typeless data in the IR.
62class Metadata {
64
65 /// RTTI.
66 const unsigned char SubclassID;
67
68protected:
69 /// Active type of storage.
71
72 /// Storage flag for non-uniqued, otherwise unowned, metadata.
73 unsigned char Storage : 7;
74
75 unsigned char SubclassData1 : 1;
76 unsigned short SubclassData16 = 0;
77 unsigned SubclassData32 = 0;
78
79public:
81#define HANDLE_METADATA_LEAF(CLASS) CLASS##Kind,
82#include "llvm/IR/Metadata.def"
83 };
84
85protected:
87 : SubclassID(ID), Storage(Storage), SubclassData1(false) {
88 static_assert(sizeof(*this) == 8, "Metadata fields poorly packed");
89 }
90
91 ~Metadata() = default;
92
93 /// Default handling of a changed operand, which asserts.
94 ///
95 /// If subclasses pass themselves in as owners to a tracking node reference,
96 /// they must provide an implementation of this method.
98 llvm_unreachable("Unimplemented in Metadata subclass");
99 }
100
101public:
102 unsigned getMetadataID() const { return SubclassID; }
103
104 /// User-friendly dump.
105 ///
106 /// If \c M is provided, metadata nodes will be numbered canonically;
107 /// otherwise, pointer addresses are substituted.
108 ///
109 /// Note: this uses an explicit overload instead of default arguments so that
110 /// the nullptr version is easy to call from a debugger.
111 ///
112 /// @{
113 void dump() const;
114 void dump(const Module *M) const;
115 /// @}
116
117 /// Print.
118 ///
119 /// Prints definition of \c this.
120 ///
121 /// If \c M is provided, metadata nodes will be numbered canonically;
122 /// otherwise, pointer addresses are substituted.
123 /// @{
124 void print(raw_ostream &OS, const Module *M = nullptr,
125 bool IsForDebug = false) const;
126 void print(raw_ostream &OS, ModuleSlotTracker &MST, const Module *M = nullptr,
127 bool IsForDebug = false) const;
128 /// @}
129
130 /// Print as operand.
131 ///
132 /// Prints reference of \c this.
133 ///
134 /// If \c M is provided, metadata nodes will be numbered canonically;
135 /// otherwise, pointer addresses are substituted.
136 /// @{
137 void printAsOperand(raw_ostream &OS, const Module *M = nullptr) const;
139 const Module *M = nullptr) const;
140 /// @}
141};
142
143// Create wrappers for C Binding types (see CBindingWrapping.h).
145
146// Specialized opaque metadata conversions.
148 return reinterpret_cast<Metadata**>(MDs);
149}
150
151#define HANDLE_METADATA(CLASS) class CLASS;
152#include "llvm/IR/Metadata.def"
153
154// Provide specializations of isa so that we don't need definitions of
155// subclasses to see if the metadata is a subclass.
156#define HANDLE_METADATA_LEAF(CLASS) \
157 template <> struct isa_impl<CLASS, Metadata> { \
158 static inline bool doit(const Metadata &MD) { \
159 return MD.getMetadataID() == Metadata::CLASS##Kind; \
160 } \
161 };
162#include "llvm/IR/Metadata.def"
163
165 MD.print(OS);
166 return OS;
167}
168
169/// Metadata wrapper in the Value hierarchy.
170///
171/// A member of the \a Value hierarchy to represent a reference to metadata.
172/// This allows, e.g., intrinsics to have metadata as operands.
173///
174/// Notably, this is the only thing in either hierarchy that is allowed to
175/// reference \a LocalAsMetadata.
176class MetadataAsValue : public Value {
178 friend class LLVMContextImpl;
179
180 Metadata *MD;
181
182 MetadataAsValue(Type *Ty, Metadata *MD);
183
184 /// Drop use of metadata (during teardown).
185 void dropUse() { MD = nullptr; }
186
187public:
189
190 static MetadataAsValue *get(LLVMContext &Context, Metadata *MD);
191 static MetadataAsValue *getIfExists(LLVMContext &Context, Metadata *MD);
192
193 Metadata *getMetadata() const { return MD; }
194
195 static bool classof(const Value *V) {
196 return V->getValueID() == MetadataAsValueVal;
197 }
198
199private:
200 void handleChangedMetadata(Metadata *MD);
201 void track();
202 void untrack();
203};
204
205/// Base class for tracking ValueAsMetadata/DIArgLists with user lookups and
206/// Owner callbacks outside of ValueAsMetadata.
207///
208/// Currently only inherited by DbgVariableRecord; if other classes need to use
209/// it, then a SubclassID will need to be added (either as a new field or by
210/// making DebugValue into a PointerIntUnion) to discriminate between the
211/// subclasses in lookup and callback handling.
213protected:
214 // Capacity to store 3 debug values.
215 // TODO: Not all DebugValueUser instances need all 3 elements, if we
216 // restructure the DbgVariableRecord class then we can template parameterize
217 // this array size.
218 std::array<Metadata *, 3> DebugValues;
219
221
222public:
224 const DbgVariableRecord *getUser() const;
225 /// To be called by ReplaceableMetadataImpl::replaceAllUsesWith, where `Old`
226 /// is a pointer to one of the pointers in `DebugValues` (so should be type
227 /// Metadata**), and `NewDebugValue` is the new Metadata* that is replacing
228 /// *Old.
229 /// For manually replacing elements of DebugValues,
230 /// `resetDebugValue(Idx, NewDebugValue)` should be used instead.
231 void handleChangedValue(void *Old, Metadata *NewDebugValue);
232 DebugValueUser() = default;
233 explicit DebugValueUser(std::array<Metadata *, 3> DebugValues)
235 trackDebugValues();
236 }
238 DebugValues = X.DebugValues;
239 retrackDebugValues(X);
240 }
242 DebugValues = X.DebugValues;
243 trackDebugValues();
244 }
245
247 if (&X == this)
248 return *this;
249
250 untrackDebugValues();
251 DebugValues = X.DebugValues;
252 retrackDebugValues(X);
253 return *this;
254 }
255
257 if (&X == this)
258 return *this;
259
260 untrackDebugValues();
261 DebugValues = X.DebugValues;
262 trackDebugValues();
263 return *this;
264 }
265
266 ~DebugValueUser() { untrackDebugValues(); }
267
269 untrackDebugValues();
270 DebugValues.fill(nullptr);
271 }
272
273 void resetDebugValue(size_t Idx, Metadata *DebugValue) {
274 assert(Idx < 3 && "Invalid debug value index.");
275 untrackDebugValue(Idx);
276 DebugValues[Idx] = DebugValue;
277 trackDebugValue(Idx);
278 }
279
280 bool operator==(const DebugValueUser &X) const {
281 return DebugValues == X.DebugValues;
282 }
283 bool operator!=(const DebugValueUser &X) const {
284 return DebugValues != X.DebugValues;
285 }
286
287private:
288 void trackDebugValue(size_t Idx);
289 void trackDebugValues();
290
291 void untrackDebugValue(size_t Idx);
292 void untrackDebugValues();
293
294 void retrackDebugValues(DebugValueUser &X);
295};
296
297/// API for tracking metadata references through RAUW and deletion.
298///
299/// Shared API for updating \a Metadata pointers in subclasses that support
300/// RAUW.
301///
302/// This API is not meant to be used directly. See \a TrackingMDRef for a
303/// user-friendly tracking reference.
305public:
306 /// Track the reference to metadata.
307 ///
308 /// Register \c MD with \c *MD, if the subclass supports tracking. If \c *MD
309 /// gets RAUW'ed, \c MD will be updated to the new address. If \c *MD gets
310 /// deleted, \c MD will be set to \c nullptr.
311 ///
312 /// If tracking isn't supported, \c *MD will not change.
313 ///
314 /// \return true iff tracking is supported by \c MD.
315 static bool track(Metadata *&MD) {
316 return track(&MD, *MD, static_cast<Metadata *>(nullptr));
317 }
318
319 /// Track the reference to metadata for \a Metadata.
320 ///
321 /// As \a track(Metadata*&), but with support for calling back to \c Owner to
322 /// tell it that its operand changed. This could trigger \c Owner being
323 /// re-uniqued.
324 static bool track(void *Ref, Metadata &MD, Metadata &Owner) {
325 return track(Ref, MD, &Owner);
326 }
327
328 /// Track the reference to metadata for \a MetadataAsValue.
329 ///
330 /// As \a track(Metadata*&), but with support for calling back to \c Owner to
331 /// tell it that its operand changed. This could trigger \c Owner being
332 /// re-uniqued.
333 static bool track(void *Ref, Metadata &MD, MetadataAsValue &Owner) {
334 return track(Ref, MD, &Owner);
335 }
336
337 /// Track the reference to metadata for \a DebugValueUser.
338 ///
339 /// As \a track(Metadata*&), but with support for calling back to \c Owner to
340 /// tell it that its operand changed. This could trigger \c Owner being
341 /// re-uniqued.
342 static bool track(void *Ref, Metadata &MD, DebugValueUser &Owner) {
343 return track(Ref, MD, &Owner);
344 }
345
346 /// Stop tracking a reference to metadata.
347 ///
348 /// Stops \c *MD from tracking \c MD.
349 static void untrack(Metadata *&MD) { untrack(&MD, *MD); }
350 static void untrack(void *Ref, Metadata &MD);
351
352 /// Move tracking from one reference to another.
353 ///
354 /// Semantically equivalent to \c untrack(MD) followed by \c track(New),
355 /// except that ownership callbacks are maintained.
356 ///
357 /// Note: it is an error if \c *MD does not equal \c New.
358 ///
359 /// \return true iff tracking is supported by \c MD.
360 static bool retrack(Metadata *&MD, Metadata *&New) {
361 return retrack(&MD, *MD, &New);
362 }
363 static bool retrack(void *Ref, Metadata &MD, void *New);
364
365 /// Check whether metadata is replaceable.
366 static bool isReplaceable(const Metadata &MD);
367
369
370private:
371 /// Track a reference to metadata for an owner.
372 ///
373 /// Generalized version of tracking.
374 static bool track(void *Ref, Metadata &MD, OwnerTy Owner);
375};
376
377/// Shared implementation of use-lists for replaceable metadata.
378///
379/// Most metadata cannot be RAUW'ed. This is a shared implementation of
380/// use-lists and associated API for the three that support it (
381/// \a ValueAsMetadata, \a TempMDNode, and \a DIArgList).
383 friend class MetadataTracking;
384
385public:
387
388private:
389 LLVMContext &Context;
390 uint64_t NextIndex = 0;
392
393public:
394 ReplaceableMetadataImpl(LLVMContext &Context) : Context(Context) {}
395
397 assert(UseMap.empty() && "Cannot destroy in-use replaceable metadata");
398 }
399
400 LLVMContext &getContext() const { return Context; }
401
402 /// Replace all uses of this with MD.
403 ///
404 /// Replace all uses of this with \c MD, which is allowed to be null.
406 /// Replace all uses of the constant with Undef in debug info metadata
407 static void SalvageDebugInfo(const Constant &C);
408 /// Returns the list of all DIArgList users of this.
410 /// Returns the list of all DbgVariableRecord users of this.
412
413 /// Resolve all uses of this.
414 ///
415 /// Resolve all uses of this, turning off RAUW permanently. If \c
416 /// ResolveUsers, call \a MDNode::resolve() on any users whose last operand
417 /// is resolved.
418 void resolveAllUses(bool ResolveUsers = true);
419
420 unsigned getNumUses() const { return UseMap.size(); }
421
422private:
423 void addRef(void *Ref, OwnerTy Owner);
424 void dropRef(void *Ref);
425 void moveRef(void *Ref, void *New, const Metadata &MD);
426
427 /// Lazily construct RAUW support on MD.
428 ///
429 /// If this is an unresolved MDNode, RAUW support will be created on-demand.
430 /// ValueAsMetadata always has RAUW support.
431 static ReplaceableMetadataImpl *getOrCreate(Metadata &MD);
432
433 /// Get RAUW support on MD, if it exists.
434 static ReplaceableMetadataImpl *getIfExists(Metadata &MD);
435
436 /// Check whether this node will support RAUW.
437 ///
438 /// Returns \c true unless getOrCreate() would return null.
439 static bool isReplaceable(const Metadata &MD);
440};
441
442/// Value wrapper in the Metadata hierarchy.
443///
444/// This is a custom value handle that allows other metadata to refer to
445/// classes in the Value hierarchy.
446///
447/// Because of full uniquing support, each value is only wrapped by a single \a
448/// ValueAsMetadata object, so the lookup maps are far more efficient than
449/// those using ValueHandleBase.
452 friend class LLVMContextImpl;
453
454 Value *V;
455
456 /// Drop users without RAUW (during teardown).
457 void dropUsers() {
458 ReplaceableMetadataImpl::resolveAllUses(/* ResolveUsers */ false);
459 }
460
461protected:
464 assert(V && "Expected valid value");
465 }
466
467 ~ValueAsMetadata() = default;
468
469public:
470 static ValueAsMetadata *get(Value *V);
471
473 return cast<ConstantAsMetadata>(get(C));
474 }
475
477 return cast<LocalAsMetadata>(get(Local));
478 }
479
481
483 return cast_or_null<ConstantAsMetadata>(getIfExists(C));
484 }
485
487 return cast_or_null<LocalAsMetadata>(getIfExists(Local));
488 }
489
490 Value *getValue() const { return V; }
491 Type *getType() const { return V->getType(); }
492 LLVMContext &getContext() const { return V->getContext(); }
493
496 }
499 }
500
501 static void handleDeletion(Value *V);
502 static void handleRAUW(Value *From, Value *To);
503
504protected:
505 /// Handle collisions after \a Value::replaceAllUsesWith().
506 ///
507 /// RAUW isn't supported directly for \a ValueAsMetadata, but if the wrapped
508 /// \a Value gets RAUW'ed and the target already exists, this is used to
509 /// merge the two metadata nodes.
512 }
513
514public:
515 static bool classof(const Metadata *MD) {
516 return MD->getMetadataID() == LocalAsMetadataKind ||
517 MD->getMetadataID() == ConstantAsMetadataKind;
518 }
519};
520
522 friend class ValueAsMetadata;
523
525 : ValueAsMetadata(ConstantAsMetadataKind, C) {}
526
527public:
530 }
531
534 }
535
537 return cast<Constant>(ValueAsMetadata::getValue());
538 }
539
540 static bool classof(const Metadata *MD) {
541 return MD->getMetadataID() == ConstantAsMetadataKind;
542 }
543};
544
546 friend class ValueAsMetadata;
547
548 LocalAsMetadata(Value *Local)
549 : ValueAsMetadata(LocalAsMetadataKind, Local) {
550 assert(!isa<Constant>(Local) && "Expected local value");
551 }
552
553public:
554 static LocalAsMetadata *get(Value *Local) {
555 return ValueAsMetadata::getLocal(Local);
556 }
557
560 }
561
562 static bool classof(const Metadata *MD) {
563 return MD->getMetadataID() == LocalAsMetadataKind;
564 }
565};
566
567/// Transitional API for extracting constants from Metadata.
568///
569/// This namespace contains transitional functions for metadata that points to
570/// \a Constants.
571///
572/// In prehistory -- when metadata was a subclass of \a Value -- \a MDNode
573/// operands could refer to any \a Value. There's was a lot of code like this:
574///
575/// \code
576/// MDNode *N = ...;
577/// auto *CI = dyn_cast<ConstantInt>(N->getOperand(2));
578/// \endcode
579///
580/// Now that \a Value and \a Metadata are in separate hierarchies, maintaining
581/// the semantics for \a isa(), \a cast(), \a dyn_cast() (etc.) requires three
582/// steps: cast in the \a Metadata hierarchy, extraction of the \a Value, and
583/// cast in the \a Value hierarchy. Besides creating boiler-plate, this
584/// requires subtle control flow changes.
585///
586/// The end-goal is to create a new type of metadata, called (e.g.) \a MDInt,
587/// so that metadata can refer to numbers without traversing a bridge to the \a
588/// Value hierarchy. In this final state, the code above would look like this:
589///
590/// \code
591/// MDNode *N = ...;
592/// auto *MI = dyn_cast<MDInt>(N->getOperand(2));
593/// \endcode
594///
595/// The API in this namespace supports the transition. \a MDInt doesn't exist
596/// yet, and even once it does, changing each metadata schema to use it is its
597/// own mini-project. In the meantime this API prevents us from introducing
598/// complex and bug-prone control flow that will disappear in the end. In
599/// particular, the above code looks like this:
600///
601/// \code
602/// MDNode *N = ...;
603/// auto *CI = mdconst::dyn_extract<ConstantInt>(N->getOperand(2));
604/// \endcode
605///
606/// The full set of provided functions includes:
607///
608/// mdconst::hasa <=> isa
609/// mdconst::extract <=> cast
610/// mdconst::extract_or_null <=> cast_or_null
611/// mdconst::dyn_extract <=> dyn_cast
612/// mdconst::dyn_extract_or_null <=> dyn_cast_or_null
613///
614/// The target of the cast must be a subclass of \a Constant.
615namespace mdconst {
616
617namespace detail {
618
619template <class T> T &make();
620template <class T, class Result> struct HasDereference {
621 using Yes = char[1];
622 using No = char[2];
623 template <size_t N> struct SFINAE {};
624
625 template <class U, class V>
626 static Yes &hasDereference(SFINAE<sizeof(static_cast<V>(*make<U>()))> * = 0);
627 template <class U, class V> static No &hasDereference(...);
628
629 static const bool value =
630 sizeof(hasDereference<T, Result>(nullptr)) == sizeof(Yes);
631};
632template <class V, class M> struct IsValidPointer {
633 static const bool value = std::is_base_of<Constant, V>::value &&
635};
636template <class V, class M> struct IsValidReference {
637 static const bool value = std::is_base_of<Constant, V>::value &&
638 std::is_convertible<M, const Metadata &>::value;
639};
640
641} // end namespace detail
642
643/// Check whether Metadata has a Value.
644///
645/// As an analogue to \a isa(), check whether \c MD has an \a Value inside of
646/// type \c X.
647template <class X, class Y>
648inline std::enable_if_t<detail::IsValidPointer<X, Y>::value, bool>
649hasa(Y &&MD) {
650 assert(MD && "Null pointer sent into hasa");
651 if (auto *V = dyn_cast<ConstantAsMetadata>(MD))
652 return isa<X>(V->getValue());
653 return false;
654}
655template <class X, class Y>
656inline std::enable_if_t<detail::IsValidReference<X, Y &>::value, bool>
657hasa(Y &MD) {
658 return hasa(&MD);
659}
660
661/// Extract a Value from Metadata.
662///
663/// As an analogue to \a cast(), extract the \a Value subclass \c X from \c MD.
664template <class X, class Y>
665inline std::enable_if_t<detail::IsValidPointer<X, Y>::value, X *>
666extract(Y &&MD) {
667 return cast<X>(cast<ConstantAsMetadata>(MD)->getValue());
668}
669template <class X, class Y>
670inline std::enable_if_t<detail::IsValidReference<X, Y &>::value, X *>
671extract(Y &MD) {
672 return extract(&MD);
673}
674
675/// Extract a Value from Metadata, allowing null.
676///
677/// As an analogue to \a cast_or_null(), extract the \a Value subclass \c X
678/// from \c MD, allowing \c MD to be null.
679template <class X, class Y>
680inline std::enable_if_t<detail::IsValidPointer<X, Y>::value, X *>
682 if (auto *V = cast_or_null<ConstantAsMetadata>(MD))
683 return cast<X>(V->getValue());
684 return nullptr;
685}
686
687/// Extract a Value from Metadata, if any.
688///
689/// As an analogue to \a dyn_cast_or_null(), extract the \a Value subclass \c X
690/// from \c MD, return null if \c MD doesn't contain a \a Value or if the \a
691/// Value it does contain is of the wrong subclass.
692template <class X, class Y>
693inline std::enable_if_t<detail::IsValidPointer<X, Y>::value, X *>
695 if (auto *V = dyn_cast<ConstantAsMetadata>(MD))
696 return dyn_cast<X>(V->getValue());
697 return nullptr;
698}
699
700/// Extract a Value from Metadata, if any, allowing null.
701///
702/// As an analogue to \a dyn_cast_or_null(), extract the \a Value subclass \c X
703/// from \c MD, return null if \c MD doesn't contain a \a Value or if the \a
704/// Value it does contain is of the wrong subclass, allowing \c MD to be null.
705template <class X, class Y>
706inline std::enable_if_t<detail::IsValidPointer<X, Y>::value, X *>
708 if (auto *V = dyn_cast_or_null<ConstantAsMetadata>(MD))
709 return dyn_cast<X>(V->getValue());
710 return nullptr;
711}
712
713} // end namespace mdconst
714
715//===----------------------------------------------------------------------===//
716/// A single uniqued string.
717///
718/// These are used to efficiently contain a byte sequence for metadata.
719/// MDString is always unnamed.
720class MDString : public Metadata {
721 friend class StringMapEntryStorage<MDString>;
722
723 StringMapEntry<MDString> *Entry = nullptr;
724
725 MDString() : Metadata(MDStringKind, Uniqued) {}
726
727public:
728 MDString(const MDString &) = delete;
730 MDString &operator=(const MDString &) = delete;
731
732 static MDString *get(LLVMContext &Context, StringRef Str);
733 static MDString *get(LLVMContext &Context, const char *Str) {
734 return get(Context, Str ? StringRef(Str) : StringRef());
735 }
736
737 StringRef getString() const;
738
739 unsigned getLength() const { return (unsigned)getString().size(); }
740
742
743 /// Pointer to the first byte of the string.
744 iterator begin() const { return getString().begin(); }
745
746 /// Pointer to one byte past the end of the string.
747 iterator end() const { return getString().end(); }
748
749 const unsigned char *bytes_begin() const { return getString().bytes_begin(); }
750 const unsigned char *bytes_end() const { return getString().bytes_end(); }
751
752 /// Methods for support type inquiry through isa, cast, and dyn_cast.
753 static bool classof(const Metadata *MD) {
754 return MD->getMetadataID() == MDStringKind;
755 }
756};
757
758/// A collection of metadata nodes that might be associated with a
759/// memory access used by the alias-analysis infrastructure.
760struct AAMDNodes {
761 explicit AAMDNodes() = default;
762 explicit AAMDNodes(MDNode *T, MDNode *TS, MDNode *S, MDNode *N)
763 : TBAA(T), TBAAStruct(TS), Scope(S), NoAlias(N) {}
764
765 bool operator==(const AAMDNodes &A) const {
766 return TBAA == A.TBAA && TBAAStruct == A.TBAAStruct && Scope == A.Scope &&
767 NoAlias == A.NoAlias;
768 }
769
770 bool operator!=(const AAMDNodes &A) const { return !(*this == A); }
771
772 explicit operator bool() const {
773 return TBAA || TBAAStruct || Scope || NoAlias;
774 }
775
776 /// The tag for type-based alias analysis.
777 MDNode *TBAA = nullptr;
778
779 /// The tag for type-based alias analysis (tbaa struct).
780 MDNode *TBAAStruct = nullptr;
781
782 /// The tag for alias scope specification (used with noalias).
783 MDNode *Scope = nullptr;
784
785 /// The tag specifying the noalias scope.
786 MDNode *NoAlias = nullptr;
787
788 // Shift tbaa Metadata node to start off bytes later
789 static MDNode *shiftTBAA(MDNode *M, size_t off);
790
791 // Shift tbaa.struct Metadata node to start off bytes later
792 static MDNode *shiftTBAAStruct(MDNode *M, size_t off);
793
794 // Extend tbaa Metadata node to apply to a series of bytes of length len.
795 // A size of -1 denotes an unknown size.
796 static MDNode *extendToTBAA(MDNode *TBAA, ssize_t len);
797
798 /// Given two sets of AAMDNodes that apply to the same pointer,
799 /// give the best AAMDNodes that are compatible with both (i.e. a set of
800 /// nodes whose allowable aliasing conclusions are a subset of those
801 /// allowable by both of the inputs). However, for efficiency
802 /// reasons, do not create any new MDNodes.
804 AAMDNodes Result;
805 Result.TBAA = Other.TBAA == TBAA ? TBAA : nullptr;
806 Result.TBAAStruct = Other.TBAAStruct == TBAAStruct ? TBAAStruct : nullptr;
807 Result.Scope = Other.Scope == Scope ? Scope : nullptr;
808 Result.NoAlias = Other.NoAlias == NoAlias ? NoAlias : nullptr;
809 return Result;
810 }
811
812 /// Create a new AAMDNode that describes this AAMDNode after applying a
813 /// constant offset to the start of the pointer.
814 AAMDNodes shift(size_t Offset) const {
815 AAMDNodes Result;
816 Result.TBAA = TBAA ? shiftTBAA(TBAA, Offset) : nullptr;
817 Result.TBAAStruct =
819 Result.Scope = Scope;
820 Result.NoAlias = NoAlias;
821 return Result;
822 }
823
824 /// Create a new AAMDNode that describes this AAMDNode after extending it to
825 /// apply to a series of bytes of length Len. A size of -1 denotes an unknown
826 /// size.
827 AAMDNodes extendTo(ssize_t Len) const {
828 AAMDNodes Result;
829 Result.TBAA = TBAA ? extendToTBAA(TBAA, Len) : nullptr;
830 // tbaa.struct contains (offset, size, type) triples. Extending the length
831 // of the tbaa.struct doesn't require changing this (though more information
832 // could be provided by adding more triples at subsequent lengths).
833 Result.TBAAStruct = TBAAStruct;
834 Result.Scope = Scope;
835 Result.NoAlias = NoAlias;
836 return Result;
837 }
838
839 /// Given two sets of AAMDNodes applying to potentially different locations,
840 /// determine the best AAMDNodes that apply to both.
841 AAMDNodes merge(const AAMDNodes &Other) const;
842
843 /// Determine the best AAMDNodes after concatenating two different locations
844 /// together. Different from `merge`, where different locations should
845 /// overlap each other, `concat` puts non-overlapping locations together.
846 AAMDNodes concat(const AAMDNodes &Other) const;
847
848 /// Create a new AAMDNode for accessing \p AccessSize bytes of this AAMDNode.
849 /// If this AAMDNode has !tbaa.struct and \p AccessSize matches the size of
850 /// the field at offset 0, get the TBAA tag describing the accessed field.
851 /// If such an AAMDNode already embeds !tbaa, the existing one is retrieved.
852 /// Finally, !tbaa.struct is zeroed out.
853 AAMDNodes adjustForAccess(unsigned AccessSize);
854 AAMDNodes adjustForAccess(size_t Offset, Type *AccessTy,
855 const DataLayout &DL);
856 AAMDNodes adjustForAccess(size_t Offset, unsigned AccessSize);
857};
858
859// Specialize DenseMapInfo for AAMDNodes.
860template<>
862 static inline AAMDNodes getEmptyKey() {
864 nullptr, nullptr, nullptr);
865 }
866
867 static inline AAMDNodes getTombstoneKey() {
869 nullptr, nullptr, nullptr);
870 }
871
872 static unsigned getHashValue(const AAMDNodes &Val) {
877 }
878
879 static bool isEqual(const AAMDNodes &LHS, const AAMDNodes &RHS) {
880 return LHS == RHS;
881 }
882};
883
884/// Tracking metadata reference owned by Metadata.
885///
886/// Similar to \a TrackingMDRef, but it's expected to be owned by an instance
887/// of \a Metadata, which has the option of registering itself for callbacks to
888/// re-unique itself.
889///
890/// In particular, this is used by \a MDNode.
892 Metadata *MD = nullptr;
893
894public:
895 MDOperand() = default;
896 MDOperand(const MDOperand &) = delete;
898 MD = Op.MD;
899 if (MD)
900 (void)MetadataTracking::retrack(Op.MD, MD);
901 Op.MD = nullptr;
902 }
903 MDOperand &operator=(const MDOperand &) = delete;
905 MD = Op.MD;
906 if (MD)
907 (void)MetadataTracking::retrack(Op.MD, MD);
908 Op.MD = nullptr;
909 return *this;
910 }
911
912 // Check if MDOperand is of type MDString and equals `Str`.
913 bool equalsStr(StringRef Str) const {
914 return isa<MDString>(this->get()) &&
915 cast<MDString>(this->get())->getString() == Str;
916 }
917
918 ~MDOperand() { untrack(); }
919
920 Metadata *get() const { return MD; }
921 operator Metadata *() const { return get(); }
922 Metadata *operator->() const { return get(); }
923 Metadata &operator*() const { return *get(); }
924
925 void reset() {
926 untrack();
927 MD = nullptr;
928 }
929 void reset(Metadata *MD, Metadata *Owner) {
930 untrack();
931 this->MD = MD;
932 track(Owner);
933 }
934
935private:
936 void track(Metadata *Owner) {
937 if (MD) {
938 if (Owner)
939 MetadataTracking::track(this, *MD, *Owner);
940 else
942 }
943 }
944
945 void untrack() {
946 assert(static_cast<void *>(this) == &MD && "Expected same address");
947 if (MD)
949 }
950};
951
952template <> struct simplify_type<MDOperand> {
954
955 static SimpleType getSimplifiedValue(MDOperand &MD) { return MD.get(); }
956};
957
958template <> struct simplify_type<const MDOperand> {
960
961 static SimpleType getSimplifiedValue(const MDOperand &MD) { return MD.get(); }
962};
963
964/// Pointer to the context, with optional RAUW support.
965///
966/// Either a raw (non-null) pointer to the \a LLVMContext, or an owned pointer
967/// to \a ReplaceableMetadataImpl (which has a reference to \a LLVMContext).
970
971public:
974 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses)
975 : Ptr(ReplaceableUses.release()) {
976 assert(getReplaceableUses() && "Expected non-null replaceable uses");
977 }
985
986 operator LLVMContext &() { return getContext(); }
987
988 /// Whether this contains RAUW support.
989 bool hasReplaceableUses() const {
990 return isa<ReplaceableMetadataImpl *>(Ptr);
991 }
992
994 if (hasReplaceableUses())
995 return getReplaceableUses()->getContext();
996 return *cast<LLVMContext *>(Ptr);
997 }
998
1000 if (hasReplaceableUses())
1001 return cast<ReplaceableMetadataImpl *>(Ptr);
1002 return nullptr;
1003 }
1004
1005 /// Ensure that this has RAUW support, and then return it.
1007 if (!hasReplaceableUses())
1008 makeReplaceable(std::make_unique<ReplaceableMetadataImpl>(getContext()));
1009 return getReplaceableUses();
1010 }
1011
1012 /// Assign RAUW support to this.
1013 ///
1014 /// Make this replaceable, taking ownership of \c ReplaceableUses (which must
1015 /// not be null).
1016 void
1017 makeReplaceable(std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses) {
1018 assert(ReplaceableUses && "Expected non-null replaceable uses");
1019 assert(&ReplaceableUses->getContext() == &getContext() &&
1020 "Expected same context");
1021 delete getReplaceableUses();
1022 Ptr = ReplaceableUses.release();
1023 }
1024
1025 /// Drop RAUW support.
1026 ///
1027 /// Cede ownership of RAUW support, returning it.
1028 std::unique_ptr<ReplaceableMetadataImpl> takeReplaceableUses() {
1029 assert(hasReplaceableUses() && "Expected to own replaceable uses");
1030 std::unique_ptr<ReplaceableMetadataImpl> ReplaceableUses(
1032 Ptr = &ReplaceableUses->getContext();
1033 return ReplaceableUses;
1034 }
1035};
1036
1038 inline void operator()(MDNode *Node) const;
1039};
1040
1041#define HANDLE_MDNODE_LEAF(CLASS) \
1042 using Temp##CLASS = std::unique_ptr<CLASS, TempMDNodeDeleter>;
1043#define HANDLE_MDNODE_BRANCH(CLASS) HANDLE_MDNODE_LEAF(CLASS)
1044#include "llvm/IR/Metadata.def"
1045
1046/// Metadata node.
1047///
1048/// Metadata nodes can be uniqued, like constants, or distinct. Temporary
1049/// metadata nodes (with full support for RAUW) can be used to delay uniquing
1050/// until forward references are known. The basic metadata node is an \a
1051/// MDTuple.
1052///
1053/// There is limited support for RAUW at construction time. At construction
1054/// time, if any operand is a temporary node (or an unresolved uniqued node,
1055/// which indicates a transitive temporary operand), the node itself will be
1056/// unresolved. As soon as all operands become resolved, it will drop RAUW
1057/// support permanently.
1058///
1059/// If an unresolved node is part of a cycle, \a resolveCycles() needs
1060/// to be called on some member of the cycle once all temporary nodes have been
1061/// replaced.
1062///
1063/// MDNodes can be large or small, as well as resizable or non-resizable.
1064/// Large MDNodes' operands are allocated in a separate storage vector,
1065/// whereas small MDNodes' operands are co-allocated. Distinct and temporary
1066/// MDnodes are resizable, but only MDTuples support this capability.
1067///
1068/// Clients can add operands to resizable MDNodes using push_back().
1069class MDNode : public Metadata {
1071 friend class LLVMContextImpl;
1072 friend class DIAssignID;
1073
1074 /// The header that is coallocated with an MDNode along with its "small"
1075 /// operands. It is located immediately before the main body of the node.
1076 /// The operands are in turn located immediately before the header.
1077 /// For resizable MDNodes, the space for the storage vector is also allocated
1078 /// immediately before the header, overlapping with the operands.
1079 /// Explicity set alignment because bitfields by default have an
1080 /// alignment of 1 on z/OS.
1081 struct alignas(alignof(size_t)) Header {
1082 bool IsResizable : 1;
1083 bool IsLarge : 1;
1084 size_t SmallSize : 4;
1085 size_t SmallNumOps : 4;
1086 size_t : sizeof(size_t) * CHAR_BIT - 10;
1087
1088 unsigned NumUnresolved = 0;
1089 using LargeStorageVector = SmallVector<MDOperand, 0>;
1090
1091 static constexpr size_t NumOpsFitInVector =
1092 sizeof(LargeStorageVector) / sizeof(MDOperand);
1093 static_assert(
1094 NumOpsFitInVector * sizeof(MDOperand) == sizeof(LargeStorageVector),
1095 "sizeof(LargeStorageVector) must be a multiple of sizeof(MDOperand)");
1096
1097 static constexpr size_t MaxSmallSize = 15;
1098
1099 static constexpr size_t getOpSize(unsigned NumOps) {
1100 return sizeof(MDOperand) * NumOps;
1101 }
1102 /// Returns the number of operands the node has space for based on its
1103 /// allocation characteristics.
1104 static size_t getSmallSize(size_t NumOps, bool IsResizable, bool IsLarge) {
1105 return IsLarge ? NumOpsFitInVector
1106 : std::max(NumOps, NumOpsFitInVector * IsResizable);
1107 }
1108 /// Returns the number of bytes allocated for operands and header.
1109 static size_t getAllocSize(StorageType Storage, size_t NumOps) {
1110 return getOpSize(
1111 getSmallSize(NumOps, isResizable(Storage), isLarge(NumOps))) +
1112 sizeof(Header);
1113 }
1114
1115 /// Only temporary and distinct nodes are resizable.
1116 static bool isResizable(StorageType Storage) { return Storage != Uniqued; }
1117 static bool isLarge(size_t NumOps) { return NumOps > MaxSmallSize; }
1118
1119 size_t getAllocSize() const {
1120 return getOpSize(SmallSize) + sizeof(Header);
1121 }
1122 void *getAllocation() {
1123 return reinterpret_cast<char *>(this + 1) -
1124 alignTo(getAllocSize(), alignof(uint64_t));
1125 }
1126
1127 void *getLargePtr() const {
1128 static_assert(alignof(LargeStorageVector) <= alignof(Header),
1129 "LargeStorageVector too strongly aligned");
1130 return reinterpret_cast<char *>(const_cast<Header *>(this)) -
1131 sizeof(LargeStorageVector);
1132 }
1133
1134 void *getSmallPtr();
1135
1136 LargeStorageVector &getLarge() {
1137 assert(IsLarge);
1138 return *reinterpret_cast<LargeStorageVector *>(getLargePtr());
1139 }
1140
1141 const LargeStorageVector &getLarge() const {
1142 assert(IsLarge);
1143 return *reinterpret_cast<const LargeStorageVector *>(getLargePtr());
1144 }
1145
1146 void resizeSmall(size_t NumOps);
1147 void resizeSmallToLarge(size_t NumOps);
1148 void resize(size_t NumOps);
1149
1150 explicit Header(size_t NumOps, StorageType Storage);
1151 ~Header();
1152
1153 MutableArrayRef<MDOperand> operands() {
1154 if (IsLarge)
1155 return getLarge();
1156 return MutableArrayRef(
1157 reinterpret_cast<MDOperand *>(this) - SmallSize, SmallNumOps);
1158 }
1159
1160 ArrayRef<MDOperand> operands() const {
1161 if (IsLarge)
1162 return getLarge();
1163 return ArrayRef(reinterpret_cast<const MDOperand *>(this) - SmallSize,
1164 SmallNumOps);
1165 }
1166
1167 unsigned getNumOperands() const {
1168 if (!IsLarge)
1169 return SmallNumOps;
1170 return getLarge().size();
1171 }
1172 };
1173
1174 Header &getHeader() { return *(reinterpret_cast<Header *>(this) - 1); }
1175
1176 const Header &getHeader() const {
1177 return *(reinterpret_cast<const Header *>(this) - 1);
1178 }
1179
1180 ContextAndReplaceableUses Context;
1181
1182protected:
1183 MDNode(LLVMContext &Context, unsigned ID, StorageType Storage,
1184 ArrayRef<Metadata *> Ops1, ArrayRef<Metadata *> Ops2 = std::nullopt);
1185 ~MDNode() = default;
1186
1187 void *operator new(size_t Size, size_t NumOps, StorageType Storage);
1188 void operator delete(void *Mem);
1189
1190 /// Required by std, but never called.
1191 void operator delete(void *, unsigned) {
1192 llvm_unreachable("Constructor throws?");
1193 }
1194
1195 /// Required by std, but never called.
1196 void operator delete(void *, unsigned, bool) {
1197 llvm_unreachable("Constructor throws?");
1198 }
1199
1200 void dropAllReferences();
1201
1202 MDOperand *mutable_begin() { return getHeader().operands().begin(); }
1203 MDOperand *mutable_end() { return getHeader().operands().end(); }
1204
1206
1209 }
1210
1211public:
1212 MDNode(const MDNode &) = delete;
1213 void operator=(const MDNode &) = delete;
1214 void *operator new(size_t) = delete;
1215
1216 static inline MDTuple *get(LLVMContext &Context, ArrayRef<Metadata *> MDs);
1217 static inline MDTuple *getIfExists(LLVMContext &Context,
1219 static inline MDTuple *getDistinct(LLVMContext &Context,
1221 static inline TempMDTuple getTemporary(LLVMContext &Context,
1223
1224 /// Create a (temporary) clone of this.
1225 TempMDNode clone() const;
1226
1227 /// Deallocate a node created by getTemporary.
1228 ///
1229 /// Calls \c replaceAllUsesWith(nullptr) before deleting, so any remaining
1230 /// references will be reset.
1231 static void deleteTemporary(MDNode *N);
1232
1233 LLVMContext &getContext() const { return Context.getContext(); }
1234
1235 /// Replace a specific operand.
1236 void replaceOperandWith(unsigned I, Metadata *New);
1237
1238 /// Check if node is fully resolved.
1239 ///
1240 /// If \a isTemporary(), this always returns \c false; if \a isDistinct(),
1241 /// this always returns \c true.
1242 ///
1243 /// If \a isUniqued(), returns \c true if this has already dropped RAUW
1244 /// support (because all operands are resolved).
1245 ///
1246 /// As forward declarations are resolved, their containers should get
1247 /// resolved automatically. However, if this (or one of its operands) is
1248 /// involved in a cycle, \a resolveCycles() needs to be called explicitly.
1249 bool isResolved() const { return !isTemporary() && !getNumUnresolved(); }
1250
1251 bool isUniqued() const { return Storage == Uniqued; }
1252 bool isDistinct() const { return Storage == Distinct; }
1253 bool isTemporary() const { return Storage == Temporary; }
1254
1255 bool isReplaceable() const { return isTemporary() || isAlwaysReplaceable(); }
1256 bool isAlwaysReplaceable() const { return getMetadataID() == DIAssignIDKind; }
1257
1258 unsigned getNumTemporaryUses() const {
1259 assert(isTemporary() && "Only for temporaries");
1260 return Context.getReplaceableUses()->getNumUses();
1261 }
1262
1263 /// RAUW a temporary.
1264 ///
1265 /// \pre \a isTemporary() must be \c true.
1267 assert(isReplaceable() && "Expected temporary/replaceable node");
1268 if (Context.hasReplaceableUses())
1269 Context.getReplaceableUses()->replaceAllUsesWith(MD);
1270 }
1271
1272 /// Resolve cycles.
1273 ///
1274 /// Once all forward declarations have been resolved, force cycles to be
1275 /// resolved.
1276 ///
1277 /// \pre No operands (or operands' operands, etc.) have \a isTemporary().
1278 void resolveCycles();
1279
1280 /// Resolve a unique, unresolved node.
1281 void resolve();
1282
1283 /// Replace a temporary node with a permanent one.
1284 ///
1285 /// Try to create a uniqued version of \c N -- in place, if possible -- and
1286 /// return it. If \c N cannot be uniqued, return a distinct node instead.
1287 template <class T>
1288 static std::enable_if_t<std::is_base_of<MDNode, T>::value, T *>
1289 replaceWithPermanent(std::unique_ptr<T, TempMDNodeDeleter> N) {
1290 return cast<T>(N.release()->replaceWithPermanentImpl());
1291 }
1292
1293 /// Replace a temporary node with a uniqued one.
1294 ///
1295 /// Create a uniqued version of \c N -- in place, if possible -- and return
1296 /// it. Takes ownership of the temporary node.
1297 ///
1298 /// \pre N does not self-reference.
1299 template <class T>
1300 static std::enable_if_t<std::is_base_of<MDNode, T>::value, T *>
1301 replaceWithUniqued(std::unique_ptr<T, TempMDNodeDeleter> N) {
1302 return cast<T>(N.release()->replaceWithUniquedImpl());
1303 }
1304
1305 /// Replace a temporary node with a distinct one.
1306 ///
1307 /// Create a distinct version of \c N -- in place, if possible -- and return
1308 /// it. Takes ownership of the temporary node.
1309 template <class T>
1310 static std::enable_if_t<std::is_base_of<MDNode, T>::value, T *>
1311 replaceWithDistinct(std::unique_ptr<T, TempMDNodeDeleter> N) {
1312 return cast<T>(N.release()->replaceWithDistinctImpl());
1313 }
1314
1315 /// Print in tree shape.
1316 ///
1317 /// Prints definition of \c this in tree shape.
1318 ///
1319 /// If \c M is provided, metadata nodes will be numbered canonically;
1320 /// otherwise, pointer addresses are substituted.
1321 /// @{
1322 void printTree(raw_ostream &OS, const Module *M = nullptr) const;
1324 const Module *M = nullptr) const;
1325 /// @}
1326
1327 /// User-friendly dump in tree shape.
1328 ///
1329 /// If \c M is provided, metadata nodes will be numbered canonically;
1330 /// otherwise, pointer addresses are substituted.
1331 ///
1332 /// Note: this uses an explicit overload instead of default arguments so that
1333 /// the nullptr version is easy to call from a debugger.
1334 ///
1335 /// @{
1336 void dumpTree() const;
1337 void dumpTree(const Module *M) const;
1338 /// @}
1339
1340private:
1341 MDNode *replaceWithPermanentImpl();
1342 MDNode *replaceWithUniquedImpl();
1343 MDNode *replaceWithDistinctImpl();
1344
1345protected:
1346 /// Set an operand.
1347 ///
1348 /// Sets the operand directly, without worrying about uniquing.
1349 void setOperand(unsigned I, Metadata *New);
1350
1351 unsigned getNumUnresolved() const { return getHeader().NumUnresolved; }
1352
1353 void setNumUnresolved(unsigned N) { getHeader().NumUnresolved = N; }
1355 template <class T, class StoreT>
1356 static T *storeImpl(T *N, StorageType Storage, StoreT &Store);
1357 template <class T> static T *storeImpl(T *N, StorageType Storage);
1358
1359 /// Resize the node to hold \a NumOps operands.
1360 ///
1361 /// \pre \a isTemporary() or \a isDistinct()
1362 /// \pre MetadataID == MDTupleKind
1363 void resize(size_t NumOps) {
1364 assert(!isUniqued() && "Resizing is not supported for uniqued nodes");
1365 assert(getMetadataID() == MDTupleKind &&
1366 "Resizing is not supported for this node kind");
1367 getHeader().resize(NumOps);
1368 }
1369
1370private:
1371 void handleChangedOperand(void *Ref, Metadata *New);
1372
1373 /// Drop RAUW support, if any.
1374 void dropReplaceableUses();
1375
1376 void resolveAfterOperandChange(Metadata *Old, Metadata *New);
1377 void decrementUnresolvedOperandCount();
1378 void countUnresolvedOperands();
1379
1380 /// Mutate this to be "uniqued".
1381 ///
1382 /// Mutate this so that \a isUniqued().
1383 /// \pre \a isTemporary().
1384 /// \pre already added to uniquing set.
1385 void makeUniqued();
1386
1387 /// Mutate this to be "distinct".
1388 ///
1389 /// Mutate this so that \a isDistinct().
1390 /// \pre \a isTemporary().
1391 void makeDistinct();
1392
1393 void deleteAsSubclass();
1394 MDNode *uniquify();
1395 void eraseFromStore();
1396
1397 template <class NodeTy> struct HasCachedHash;
1398 template <class NodeTy>
1399 static void dispatchRecalculateHash(NodeTy *N, std::true_type) {
1400 N->recalculateHash();
1401 }
1402 template <class NodeTy>
1403 static void dispatchRecalculateHash(NodeTy *, std::false_type) {}
1404 template <class NodeTy>
1405 static void dispatchResetHash(NodeTy *N, std::true_type) {
1406 N->setHash(0);
1407 }
1408 template <class NodeTy>
1409 static void dispatchResetHash(NodeTy *, std::false_type) {}
1410
1411 /// Merge branch weights from two direct callsites.
1412 static MDNode *mergeDirectCallProfMetadata(MDNode *A, MDNode *B,
1413 const Instruction *AInstr,
1414 const Instruction *BInstr);
1415
1416public:
1417 using op_iterator = const MDOperand *;
1419
1421 return const_cast<MDNode *>(this)->mutable_begin();
1422 }
1423
1425 return const_cast<MDNode *>(this)->mutable_end();
1426 }
1427
1428 ArrayRef<MDOperand> operands() const { return getHeader().operands(); }
1429
1430 const MDOperand &getOperand(unsigned I) const {
1431 assert(I < getNumOperands() && "Out of range");
1432 return getHeader().operands()[I];
1433 }
1434
1435 /// Return number of MDNode operands.
1436 unsigned getNumOperands() const { return getHeader().getNumOperands(); }
1437
1438 /// Methods for support type inquiry through isa, cast, and dyn_cast:
1439 static bool classof(const Metadata *MD) {
1440 switch (MD->getMetadataID()) {
1441 default:
1442 return false;
1443#define HANDLE_MDNODE_LEAF(CLASS) \
1444 case CLASS##Kind: \
1445 return true;
1446#include "llvm/IR/Metadata.def"
1447 }
1448 }
1449
1450 /// Check whether MDNode is a vtable access.
1451 bool isTBAAVtableAccess() const;
1452
1453 /// Methods for metadata merging.
1454 static MDNode *concatenate(MDNode *A, MDNode *B);
1455 static MDNode *intersect(MDNode *A, MDNode *B);
1461 /// Merge !prof metadata from two instructions.
1462 /// Currently only implemented with direct callsites with branch weights.
1464 const Instruction *AInstr,
1465 const Instruction *BInstr);
1466};
1467
1468/// Tuple of metadata.
1469///
1470/// This is the simple \a MDNode arbitrary tuple. Nodes are uniqued by
1471/// default based on their operands.
1472class MDTuple : public MDNode {
1473 friend class LLVMContextImpl;
1474 friend class MDNode;
1475
1476 MDTuple(LLVMContext &C, StorageType Storage, unsigned Hash,
1478 : MDNode(C, MDTupleKind, Storage, Vals) {
1479 setHash(Hash);
1480 }
1481
1483
1484 void setHash(unsigned Hash) { SubclassData32 = Hash; }
1485 void recalculateHash();
1486
1487 static MDTuple *getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1488 StorageType Storage, bool ShouldCreate = true);
1489
1490 TempMDTuple cloneImpl() const {
1491 ArrayRef<MDOperand> Operands = operands();
1492 return getTemporary(getContext(), SmallVector<Metadata *, 4>(Operands));
1493 }
1494
1495public:
1496 /// Get the hash, if any.
1497 unsigned getHash() const { return SubclassData32; }
1498
1500 return getImpl(Context, MDs, Uniqued);
1501 }
1502
1504 return getImpl(Context, MDs, Uniqued, /* ShouldCreate */ false);
1505 }
1506
1507 /// Return a distinct node.
1508 ///
1509 /// Return a distinct node -- i.e., a node that is not uniqued.
1511 return getImpl(Context, MDs, Distinct);
1512 }
1513
1514 /// Return a temporary node.
1515 ///
1516 /// For use in constructing cyclic MDNode structures. A temporary MDNode is
1517 /// not uniqued, may be RAUW'd, and must be manually deleted with
1518 /// deleteTemporary.
1519 static TempMDTuple getTemporary(LLVMContext &Context,
1521 return TempMDTuple(getImpl(Context, MDs, Temporary));
1522 }
1523
1524 /// Return a (temporary) clone of this.
1525 TempMDTuple clone() const { return cloneImpl(); }
1526
1527 /// Append an element to the tuple. This will resize the node.
1529 size_t NumOps = getNumOperands();
1530 resize(NumOps + 1);
1531 setOperand(NumOps, MD);
1532 }
1533
1534 /// Shrink the operands by 1.
1535 void pop_back() { resize(getNumOperands() - 1); }
1536
1537 static bool classof(const Metadata *MD) {
1538 return MD->getMetadataID() == MDTupleKind;
1539 }
1540};
1541
1543 return MDTuple::get(Context, MDs);
1544}
1545
1547 return MDTuple::getIfExists(Context, MDs);
1548}
1549
1551 return MDTuple::getDistinct(Context, MDs);
1552}
1553
1556 return MDTuple::getTemporary(Context, MDs);
1557}
1558
1561}
1562
1563/// This is a simple wrapper around an MDNode which provides a higher-level
1564/// interface by hiding the details of how alias analysis information is encoded
1565/// in its operands.
1567 const MDNode *Node = nullptr;
1568
1569public:
1570 AliasScopeNode() = default;
1571 explicit AliasScopeNode(const MDNode *N) : Node(N) {}
1572
1573 /// Get the MDNode for this AliasScopeNode.
1574 const MDNode *getNode() const { return Node; }
1575
1576 /// Get the MDNode for this AliasScopeNode's domain.
1577 const MDNode *getDomain() const {
1578 if (Node->getNumOperands() < 2)
1579 return nullptr;
1580 return dyn_cast_or_null<MDNode>(Node->getOperand(1));
1581 }
1583 if (Node->getNumOperands() > 2)
1584 if (MDString *N = dyn_cast_or_null<MDString>(Node->getOperand(2)))
1585 return N->getString();
1586 return StringRef();
1587 }
1588};
1589
1590/// Typed iterator through MDNode operands.
1591///
1592/// An iterator that transforms an \a MDNode::iterator into an iterator over a
1593/// particular Metadata subclass.
1594template <class T> class TypedMDOperandIterator {
1595 MDNode::op_iterator I = nullptr;
1596
1597public:
1598 using iterator_category = std::input_iterator_tag;
1599 using value_type = T *;
1600 using difference_type = std::ptrdiff_t;
1601 using pointer = void;
1602 using reference = T *;
1603
1606
1607 T *operator*() const { return cast_or_null<T>(*I); }
1608
1610 ++I;
1611 return *this;
1612 }
1613
1615 TypedMDOperandIterator Temp(*this);
1616 ++I;
1617 return Temp;
1618 }
1619
1620 bool operator==(const TypedMDOperandIterator &X) const { return I == X.I; }
1621 bool operator!=(const TypedMDOperandIterator &X) const { return I != X.I; }
1622};
1623
1624/// Typed, array-like tuple of metadata.
1625///
1626/// This is a wrapper for \a MDTuple that makes it act like an array holding a
1627/// particular type of metadata.
1628template <class T> class MDTupleTypedArrayWrapper {
1629 const MDTuple *N = nullptr;
1630
1631public:
1634
1635 template <class U>
1638 std::enable_if_t<std::is_convertible<U *, T *>::value> * = nullptr)
1639 : N(Other.get()) {}
1640
1641 template <class U>
1644 std::enable_if_t<!std::is_convertible<U *, T *>::value> * = nullptr)
1645 : N(Other.get()) {}
1646
1647 explicit operator bool() const { return get(); }
1648 explicit operator MDTuple *() const { return get(); }
1649
1650 MDTuple *get() const { return const_cast<MDTuple *>(N); }
1651 MDTuple *operator->() const { return get(); }
1652 MDTuple &operator*() const { return *get(); }
1653
1654 // FIXME: Fix callers and remove condition on N.
1655 unsigned size() const { return N ? N->getNumOperands() : 0u; }
1656 bool empty() const { return N ? N->getNumOperands() == 0 : true; }
1657 T *operator[](unsigned I) const { return cast_or_null<T>(N->getOperand(I)); }
1658
1659 // FIXME: Fix callers and remove condition on N.
1661
1662 iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); }
1663 iterator end() const { return N ? iterator(N->op_end()) : iterator(); }
1664};
1665
1666#define HANDLE_METADATA(CLASS) \
1667 using CLASS##Array = MDTupleTypedArrayWrapper<CLASS>;
1668#include "llvm/IR/Metadata.def"
1669
1670/// Placeholder metadata for operands of distinct MDNodes.
1671///
1672/// This is a lightweight placeholder for an operand of a distinct node. It's
1673/// purpose is to help track forward references when creating a distinct node.
1674/// This allows distinct nodes involved in a cycle to be constructed before
1675/// their operands without requiring a heavyweight temporary node with
1676/// full-blown RAUW support.
1677///
1678/// Each placeholder supports only a single MDNode user. Clients should pass
1679/// an ID, retrieved via \a getID(), to indicate the "real" operand that this
1680/// should be replaced with.
1681///
1682/// While it would be possible to implement move operators, they would be
1683/// fairly expensive. Leave them unimplemented to discourage their use
1684/// (clients can use std::deque, std::list, BumpPtrAllocator, etc.).
1686 friend class MetadataTracking;
1687
1688 Metadata **Use = nullptr;
1689
1690public:
1692 : Metadata(DistinctMDOperandPlaceholderKind, Distinct) {
1694 }
1695
1699
1701 if (Use)
1702 *Use = nullptr;
1703 }
1704
1705 unsigned getID() const { return SubclassData32; }
1706
1707 /// Replace the use of this with MD.
1709 if (!Use)
1710 return;
1711 *Use = MD;
1712
1713 if (*Use)
1715
1716 Metadata *T = cast<Metadata>(this);
1718 assert(!Use && "Use is still being tracked despite being untracked!");
1719 }
1720};
1721
1722//===----------------------------------------------------------------------===//
1723/// A tuple of MDNodes.
1724///
1725/// Despite its name, a NamedMDNode isn't itself an MDNode.
1726///
1727/// NamedMDNodes are named module-level entities that contain lists of MDNodes.
1728///
1729/// It is illegal for a NamedMDNode to appear as an operand of an MDNode.
1730class NamedMDNode : public ilist_node<NamedMDNode> {
1731 friend class LLVMContextImpl;
1732 friend class Module;
1733
1734 std::string Name;
1735 Module *Parent = nullptr;
1736 void *Operands; // SmallVector<TrackingMDRef, 4>
1737
1738 void setParent(Module *M) { Parent = M; }
1739
1740 explicit NamedMDNode(const Twine &N);
1741
1742 template <class T1> class op_iterator_impl {
1743 friend class NamedMDNode;
1744
1745 const NamedMDNode *Node = nullptr;
1746 unsigned Idx = 0;
1747
1748 op_iterator_impl(const NamedMDNode *N, unsigned i) : Node(N), Idx(i) {}
1749
1750 public:
1751 using iterator_category = std::bidirectional_iterator_tag;
1752 using value_type = T1;
1753 using difference_type = std::ptrdiff_t;
1754 using pointer = value_type *;
1755 using reference = value_type;
1756
1757 op_iterator_impl() = default;
1758
1759 bool operator==(const op_iterator_impl &o) const { return Idx == o.Idx; }
1760 bool operator!=(const op_iterator_impl &o) const { return Idx != o.Idx; }
1761
1762 op_iterator_impl &operator++() {
1763 ++Idx;
1764 return *this;
1765 }
1766
1767 op_iterator_impl operator++(int) {
1768 op_iterator_impl tmp(*this);
1769 operator++();
1770 return tmp;
1771 }
1772
1773 op_iterator_impl &operator--() {
1774 --Idx;
1775 return *this;
1776 }
1777
1778 op_iterator_impl operator--(int) {
1779 op_iterator_impl tmp(*this);
1780 operator--();
1781 return tmp;
1782 }
1783
1784 T1 operator*() const { return Node->getOperand(Idx); }
1785 };
1786
1787public:
1788 NamedMDNode(const NamedMDNode &) = delete;
1789 ~NamedMDNode();
1790
1791 /// Drop all references and remove the node from parent module.
1792 void eraseFromParent();
1793
1794 /// Remove all uses and clear node vector.
1796 /// Drop all references to this node's operands.
1797 void clearOperands();
1798
1799 /// Get the module that holds this named metadata collection.
1800 inline Module *getParent() { return Parent; }
1801 inline const Module *getParent() const { return Parent; }
1802
1803 MDNode *getOperand(unsigned i) const;
1804 unsigned getNumOperands() const;
1805 void addOperand(MDNode *M);
1806 void setOperand(unsigned I, MDNode *New);
1807 StringRef getName() const;
1808 void print(raw_ostream &ROS, bool IsForDebug = false) const;
1809 void print(raw_ostream &ROS, ModuleSlotTracker &MST,
1810 bool IsForDebug = false) const;
1811 void dump() const;
1812
1813 // ---------------------------------------------------------------------------
1814 // Operand Iterator interface...
1815 //
1816 using op_iterator = op_iterator_impl<MDNode *>;
1817
1818 op_iterator op_begin() { return op_iterator(this, 0); }
1820
1821 using const_op_iterator = op_iterator_impl<const MDNode *>;
1822
1823 const_op_iterator op_begin() const { return const_op_iterator(this, 0); }
1825
1827 return make_range(op_begin(), op_end());
1828 }
1830 return make_range(op_begin(), op_end());
1831 }
1832};
1833
1834// Create wrappers for C Binding types (see CBindingWrapping.h).
1836
1837} // end namespace llvm
1838
1839#endif // LLVM_IR_METADATA_H
aarch64 promote const
MachineBasicBlock MachineBasicBlock::iterator DebugLoc DL
always inline
BlockVerifier::State From
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
#define DEFINE_ISA_CONVERSION_FUNCTIONS(ty, ref)
RelocType Type
Definition: COFFYAML.cpp:391
dxil translate DXIL Translate Metadata
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
This file defines DenseMapInfo traits for DenseMap.
This file defines the DenseMap class.
std::string Name
uint64_t Size
static GCMetadataPrinterRegistry::Add< ErlangGCPrinter > X("erlang", "erlang-compatible garbage collector")
loop extract
#define I(x, y, z)
Definition: MD5.cpp:58
mir Rename Register Operands
Machine Check Debug Module
#define T1
static GCMetadataPrinterRegistry::Add< OcamlGCMetadataPrinter > Y("ocaml", "ocaml 3.10-compatible collector")
This file defines the PointerUnion class, which is a discriminated union of pointer types.
const MachineOperand & RHS
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This file defines the SmallVector class.
Value * LHS
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
Definition: Metadata.h:1566
AliasScopeNode()=default
AliasScopeNode(const MDNode *N)
Definition: Metadata.h:1571
const MDNode * getNode() const
Get the MDNode for this AliasScopeNode.
Definition: Metadata.h:1574
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
Definition: Metadata.h:1577
StringRef getName() const
Definition: Metadata.h:1582
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
Definition: ArrayRef.h:41
static ConstantAsMetadata * get(Constant *C)
Definition: Metadata.h:528
Constant * getValue() const
Definition: Metadata.h:536
static ConstantAsMetadata * getIfExists(Constant *C)
Definition: Metadata.h:532
static bool classof(const Metadata *MD)
Definition: Metadata.h:540
This is an important base class in LLVM.
Definition: Constant.h:42
Pointer to the context, with optional RAUW support.
Definition: Metadata.h:968
ContextAndReplaceableUses & operator=(const ContextAndReplaceableUses &)=delete
ReplaceableMetadataImpl * getReplaceableUses() const
Definition: Metadata.h:999
std::unique_ptr< ReplaceableMetadataImpl > takeReplaceableUses()
Drop RAUW support.
Definition: Metadata.h:1028
ContextAndReplaceableUses & operator=(ContextAndReplaceableUses &&)=delete
ReplaceableMetadataImpl * getOrCreateReplaceableUses()
Ensure that this has RAUW support, and then return it.
Definition: Metadata.h:1006
void makeReplaceable(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
Assign RAUW support to this.
Definition: Metadata.h:1017
ContextAndReplaceableUses(ContextAndReplaceableUses &&)=delete
ContextAndReplaceableUses(const ContextAndReplaceableUses &)=delete
LLVMContext & getContext() const
Definition: Metadata.h:993
bool hasReplaceableUses() const
Whether this contains RAUW support.
Definition: Metadata.h:989
ContextAndReplaceableUses(LLVMContext &Context)
Definition: Metadata.h:972
ContextAndReplaceableUses(std::unique_ptr< ReplaceableMetadataImpl > ReplaceableUses)
Definition: Metadata.h:973
Assignment ID.
This class represents an Operation in the Expression.
A parsed version of the target data layout string in and methods for querying it.
Definition: DataLayout.h:63
Record of a variable value-assignment, aka a non instruction representation of the dbg....
Base class for tracking ValueAsMetadata/DIArgLists with user lookups and Owner callbacks outside of V...
Definition: Metadata.h:212
DebugValueUser(const DebugValueUser &X)
Definition: Metadata.h:241
DebugValueUser & operator=(DebugValueUser &&X)
Definition: Metadata.h:246
DebugValueUser()=default
void handleChangedValue(void *Old, Metadata *NewDebugValue)
To be called by ReplaceableMetadataImpl::replaceAllUsesWith, where Old is a pointer to one of the poi...
Definition: Metadata.cpp:158
bool operator!=(const DebugValueUser &X) const
Definition: Metadata.h:283
DebugValueUser(std::array< Metadata *, 3 > DebugValues)
Definition: Metadata.h:233
bool operator==(const DebugValueUser &X) const
Definition: Metadata.h:280
void resetDebugValues()
Definition: Metadata.h:268
ArrayRef< Metadata * > getDebugValues() const
Definition: Metadata.h:220
DebugValueUser & operator=(const DebugValueUser &X)
Definition: Metadata.h:256
std::array< Metadata *, 3 > DebugValues
Definition: Metadata.h:218
void resetDebugValue(size_t Idx, Metadata *DebugValue)
Definition: Metadata.h:273
DbgVariableRecord * getUser()
Definition: Metadata.cpp:151
DebugValueUser(DebugValueUser &&X)
Definition: Metadata.h:237
unsigned size() const
Definition: DenseMap.h:99
bool empty() const
Definition: DenseMap.h:98
Placeholder metadata for operands of distinct MDNodes.
Definition: Metadata.h:1685
void replaceUseWith(Metadata *MD)
Replace the use of this with MD.
Definition: Metadata.h:1708
DistinctMDOperandPlaceholder(const DistinctMDOperandPlaceholder &)=delete
DistinctMDOperandPlaceholder(unsigned ID)
Definition: Metadata.h:1691
DistinctMDOperandPlaceholder(DistinctMDOperandPlaceholder &&)=delete
This is an important class for using LLVM in a threaded context.
Definition: LLVMContext.h:67
static LocalAsMetadata * getIfExists(Value *Local)
Definition: Metadata.h:558
static LocalAsMetadata * get(Value *Local)
Definition: Metadata.h:554
static bool classof(const Metadata *MD)
Definition: Metadata.h:562
Metadata node.
Definition: Metadata.h:1069
static MDNode * getMostGenericAliasScope(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1141
void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
Definition: AsmWriter.cpp:5233
void replaceOperandWith(unsigned I, Metadata *New)
Replace a specific operand.
Definition: Metadata.cpp:1077
iterator_range< MDOperand * > mutable_op_range
Definition: Metadata.h:1205
void resolveCycles()
Resolve cycles.
Definition: Metadata.cpp:841
bool isTBAAVtableAccess() const
Check whether MDNode is a vtable access.
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1550
mutable_op_range mutable_operands()
Definition: Metadata.h:1207
void replaceAllUsesWith(Metadata *MD)
RAUW a temporary.
Definition: Metadata.h:1266
static MDNode * concatenate(MDNode *A, MDNode *B)
Methods for metadata merging.
Definition: Metadata.cpp:1114
static void deleteTemporary(MDNode *N)
Deallocate a node created by getTemporary.
Definition: Metadata.cpp:1049
void resolve()
Resolve a unique, unresolved node.
Definition: Metadata.cpp:795
static MDNode * getMostGenericTBAA(MDNode *A, MDNode *B)
const MDOperand & getOperand(unsigned I) const
Definition: Metadata.h:1430
void storeDistinctInContext()
Definition: Metadata.cpp:1055
bool isTemporary() const
Definition: Metadata.h:1253
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1554
ArrayRef< MDOperand > operands() const
Definition: Metadata.h:1428
op_iterator op_end() const
Definition: Metadata.h:1424
MDNode(const MDNode &)=delete
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1542
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithDistinct(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a distinct one.
Definition: Metadata.h:1311
static MDNode * getMergedProfMetadata(MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr)
Merge !prof metadata from two instructions.
Definition: Metadata.cpp:1222
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast:
Definition: Metadata.h:1439
bool isUniqued() const
Definition: Metadata.h:1251
static MDNode * getMostGenericFPMath(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1173
void setNumUnresolved(unsigned N)
Definition: Metadata.h:1353
void resize(size_t NumOps)
Resize the node to hold NumOps operands.
Definition: Metadata.h:1363
unsigned getNumOperands() const
Return number of MDNode operands.
Definition: Metadata.h:1436
MDOperand * mutable_begin()
Definition: Metadata.h:1202
TempMDNode clone() const
Create a (temporary) clone of this.
Definition: Metadata.cpp:667
static MDNode * getMostGenericRange(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1284
bool isDistinct() const
Definition: Metadata.h:1252
unsigned getNumTemporaryUses() const
Definition: Metadata.h:1258
bool isReplaceable() const
Definition: Metadata.h:1255
void setOperand(unsigned I, Metadata *New)
Set an operand.
Definition: Metadata.cpp:1089
MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2=std::nullopt)
Definition: Metadata.cpp:650
bool isResolved() const
Check if node is fully resolved.
Definition: Metadata.h:1249
op_iterator op_begin() const
Definition: Metadata.h:1420
static MDNode * intersect(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1128
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
Definition: MetadataImpl.h:42
LLVMContext & getContext() const
Definition: Metadata.h:1233
MDOperand * mutable_end()
Definition: Metadata.h:1203
~MDNode()=default
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1546
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithPermanent(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a permanent one.
Definition: Metadata.h:1289
void dropAllReferences()
Definition: Metadata.cpp:907
void operator=(const MDNode &)=delete
static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > replaceWithUniqued(std::unique_ptr< T, TempMDNodeDeleter > N)
Replace a temporary node with a uniqued one.
Definition: Metadata.h:1301
void dumpTree() const
User-friendly dump in tree shape.
Definition: AsmWriter.cpp:5308
static MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1357
unsigned getNumUnresolved() const
Definition: Metadata.h:1351
bool isAlwaysReplaceable() const
Definition: Metadata.h:1256
Tracking metadata reference owned by Metadata.
Definition: Metadata.h:891
MDOperand()=default
bool equalsStr(StringRef Str) const
Definition: Metadata.h:913
void reset(Metadata *MD, Metadata *Owner)
Definition: Metadata.h:929
Metadata * operator->() const
Definition: Metadata.h:922
MDOperand & operator=(const MDOperand &)=delete
Metadata & operator*() const
Definition: Metadata.h:923
Metadata * get() const
Definition: Metadata.h:920
MDOperand(const MDOperand &)=delete
void reset()
Definition: Metadata.h:925
MDOperand & operator=(MDOperand &&Op)
Definition: Metadata.h:904
MDOperand(MDOperand &&Op)
Definition: Metadata.h:897
A single uniqued string.
Definition: Metadata.h:720
unsigned getLength() const
Definition: Metadata.h:739
const unsigned char * bytes_begin() const
Definition: Metadata.h:749
MDString(const MDString &)=delete
static MDString * get(LLVMContext &Context, const char *Str)
Definition: Metadata.h:733
MDString & operator=(MDString &&)=delete
static bool classof(const Metadata *MD)
Methods for support type inquiry through isa, cast, and dyn_cast.
Definition: Metadata.h:753
const unsigned char * bytes_end() const
Definition: Metadata.h:750
iterator begin() const
Pointer to the first byte of the string.
Definition: Metadata.h:744
MDString & operator=(const MDString &)=delete
StringRef getString() const
Definition: Metadata.cpp:616
iterator end() const
Pointer to one byte past the end of the string.
Definition: Metadata.h:747
static MDString * get(LLVMContext &Context, StringRef Str)
Definition: Metadata.cpp:606
Typed, array-like tuple of metadata.
Definition: Metadata.h:1628
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t<!std::is_convertible< U *, T * >::value > *=nullptr)
Definition: Metadata.h:1642
MDTupleTypedArrayWrapper(const MDTuple *N)
Definition: Metadata.h:1633
T * operator[](unsigned I) const
Definition: Metadata.h:1657
MDTuple * operator->() const
Definition: Metadata.h:1651
MDTuple & operator*() const
Definition: Metadata.h:1652
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t< std::is_convertible< U *, T * >::value > *=nullptr)
Definition: Metadata.h:1636
TypedMDOperandIterator< T > iterator
Definition: Metadata.h:1660
Tuple of metadata.
Definition: Metadata.h:1472
TempMDTuple clone() const
Return a (temporary) clone of this.
Definition: Metadata.h:1525
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
Definition: Metadata.h:1510
static bool classof(const Metadata *MD)
Definition: Metadata.h:1537
void push_back(Metadata *MD)
Append an element to the tuple. This will resize the node.
Definition: Metadata.h:1528
unsigned getHash() const
Get the hash, if any.
Definition: Metadata.h:1497
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1499
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1503
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition: Metadata.h:1519
void pop_back()
Shrink the operands by 1.
Definition: Metadata.h:1535
Metadata wrapper in the Value hierarchy.
Definition: Metadata.h:176
static MetadataAsValue * get(LLVMContext &Context, Metadata *MD)
Definition: Metadata.cpp:103
static MetadataAsValue * getIfExists(LLVMContext &Context, Metadata *MD)
Definition: Metadata.cpp:111
static bool classof(const Value *V)
Definition: Metadata.h:195
Metadata * getMetadata() const
Definition: Metadata.h:193
API for tracking metadata references through RAUW and deletion.
Definition: Metadata.h:304
static bool isReplaceable(const Metadata &MD)
Check whether metadata is replaceable.
Definition: Metadata.cpp:246
static bool track(void *Ref, Metadata &MD, MetadataAsValue &Owner)
Track the reference to metadata for MetadataAsValue.
Definition: Metadata.h:333
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
Definition: Metadata.h:349
PointerUnion< MetadataAsValue *, Metadata *, DebugValueUser * > OwnerTy
Definition: Metadata.h:368
static bool retrack(Metadata *&MD, Metadata *&New)
Move tracking from one reference to another.
Definition: Metadata.h:360
static bool track(Metadata *&MD)
Track the reference to metadata.
Definition: Metadata.h:315
static bool track(void *Ref, Metadata &MD, Metadata &Owner)
Track the reference to metadata for Metadata.
Definition: Metadata.h:324
static bool track(void *Ref, Metadata &MD, DebugValueUser &Owner)
Track the reference to metadata for DebugValueUser.
Definition: Metadata.h:342
Root of the metadata hierarchy.
Definition: Metadata.h:62
void handleChangedOperand(void *, Metadata *)
Default handling of a changed operand, which asserts.
Definition: Metadata.h:97
StorageType
Active type of storage.
Definition: Metadata.h:70
void print(raw_ostream &OS, const Module *M=nullptr, bool IsForDebug=false) const
Print.
Definition: AsmWriter.cpp:5222
unsigned short SubclassData16
Definition: Metadata.h:76
unsigned SubclassData32
Definition: Metadata.h:77
~Metadata()=default
unsigned char Storage
Storage flag for non-uniqued, otherwise unowned, metadata.
Definition: Metadata.h:73
unsigned getMetadataID() const
Definition: Metadata.h:102
unsigned char SubclassData1
Definition: Metadata.h:75
void printAsOperand(raw_ostream &OS, const Module *M=nullptr) const
Print as operand.
Definition: AsmWriter.cpp:5212
Metadata(unsigned ID, StorageType Storage)
Definition: Metadata.h:86
void dump() const
User-friendly dump.
Definition: AsmWriter.cpp:5299
Manage lifetime of a slot tracker for printing IR.
A Module instance is used to store all the information related to an LLVM module.
Definition: Module.h:65
A tuple of MDNodes.
Definition: Metadata.h:1730
const_op_iterator op_begin() const
Definition: Metadata.h:1823
NamedMDNode(const NamedMDNode &)=delete
op_iterator_impl< const MDNode * > const_op_iterator
Definition: Metadata.h:1821
void dump() const
Definition: AsmWriter.cpp:5296
void setOperand(unsigned I, MDNode *New)
Definition: Metadata.cpp:1396
StringRef getName() const
Definition: Metadata.cpp:1405
void dropAllReferences()
Remove all uses and clear node vector.
Definition: Metadata.h:1795
void print(raw_ostream &ROS, bool IsForDebug=false) const
Definition: AsmWriter.cpp:4883
void eraseFromParent()
Drop all references and remove the node from parent module.
Definition: Metadata.cpp:1401
const_op_iterator op_end() const
Definition: Metadata.h:1824
iterator_range< const_op_iterator > operands() const
Definition: Metadata.h:1829
op_iterator op_end()
Definition: Metadata.h:1819
MDNode * getOperand(unsigned i) const
Definition: Metadata.cpp:1388
op_iterator op_begin()
Definition: Metadata.h:1818
op_iterator_impl< MDNode * > op_iterator
Definition: Metadata.h:1816
unsigned getNumOperands() const
Definition: Metadata.cpp:1384
const Module * getParent() const
Definition: Metadata.h:1801
void clearOperands()
Drop all references to this node's operands.
Definition: Metadata.cpp:1403
iterator_range< op_iterator > operands()
Definition: Metadata.h:1826
Module * getParent()
Get the module that holds this named metadata collection.
Definition: Metadata.h:1800
void addOperand(MDNode *M)
Definition: Metadata.cpp:1394
A discriminated union of two or more pointer types, with the discriminator in the low bit of the poin...
Definition: PointerUnion.h:118
Shared implementation of use-lists for replaceable metadata.
Definition: Metadata.h:382
static void SalvageDebugInfo(const Constant &C)
Replace all uses of the constant with Undef in debug info metadata.
Definition: Metadata.cpp:331
void replaceAllUsesWith(Metadata *MD)
Replace all uses of this with MD.
Definition: Metadata.cpp:367
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Returns the list of all DbgVariableRecord users of this.
Definition: Metadata.cpp:272
ReplaceableMetadataImpl(LLVMContext &Context)
Definition: Metadata.h:394
LLVMContext & getContext() const
Definition: Metadata.h:400
unsigned getNumUses() const
Definition: Metadata.h:420
void resolveAllUses(bool ResolveUsers=true)
Resolve all uses of this.
Definition: Metadata.cpp:420
SmallVector< Metadata * > getAllArgListUsers()
Returns the list of all DIArgList users of this.
Definition: Metadata.cpp:250
MetadataTracking::OwnerTy OwnerTy
Definition: Metadata.h:386
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition: SmallVector.h:1209
StringMapEntryStorage - Holds the value in a StringMapEntry.
StringMapEntry - This is used to represent one value that is inserted into a StringMap.
StringRef - Represent a constant reference to a string, i.e.
Definition: StringRef.h:51
const char * iterator
Definition: StringRef.h:55
const unsigned char * bytes_end() const
Definition: StringRef.h:130
iterator begin() const
Definition: StringRef.h:115
constexpr size_t size() const
size - Get the string size.
Definition: StringRef.h:149
iterator end() const
Definition: StringRef.h:117
const unsigned char * bytes_begin() const
Definition: StringRef.h:127
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
Definition: Twine.h:81
The instances of the Type class are immutable: once they are created, they are never changed.
Definition: Type.h:45
Typed iterator through MDNode operands.
Definition: Metadata.h:1594
TypedMDOperandIterator operator++(int)
Definition: Metadata.h:1614
std::ptrdiff_t difference_type
Definition: Metadata.h:1600
std::input_iterator_tag iterator_category
Definition: Metadata.h:1598
bool operator==(const TypedMDOperandIterator &X) const
Definition: Metadata.h:1620
TypedMDOperandIterator & operator++()
Definition: Metadata.h:1609
TypedMDOperandIterator(MDNode::op_iterator I)
Definition: Metadata.h:1605
bool operator!=(const TypedMDOperandIterator &X) const
Definition: Metadata.h:1621
A Use represents the edge between a Value definition and its users.
Definition: Use.h:43
Value wrapper in the Metadata hierarchy.
Definition: Metadata.h:450
Type * getType() const
Definition: Metadata.h:491
static LocalAsMetadata * getLocalIfExists(Value *Local)
Definition: Metadata.h:486
void replaceAllUsesWith(Metadata *MD)
Handle collisions after Value::replaceAllUsesWith().
Definition: Metadata.h:510
SmallVector< DbgVariableRecord * > getAllDbgVariableRecordUsers()
Definition: Metadata.h:497
LLVMContext & getContext() const
Definition: Metadata.h:492
static void handleDeletion(Value *V)
Definition: Metadata.cpp:525
static LocalAsMetadata * getLocal(Value *Local)
Definition: Metadata.h:476
static ValueAsMetadata * get(Value *V)
Definition: Metadata.cpp:501
static ConstantAsMetadata * getConstantIfExists(Value *C)
Definition: Metadata.h:482
static ConstantAsMetadata * getConstant(Value *C)
Definition: Metadata.h:472
static ValueAsMetadata * getIfExists(Value *V)
Definition: Metadata.cpp:520
static void handleRAUW(Value *From, Value *To)
Definition: Metadata.cpp:544
static bool classof(const Metadata *MD)
Definition: Metadata.h:515
SmallVector< Metadata * > getAllArgListUsers()
Definition: Metadata.h:494
ValueAsMetadata(unsigned ID, Value *V)
Definition: Metadata.h:462
Value * getValue() const
Definition: Metadata.h:490
~ValueAsMetadata()=default
LLVM Value Representation.
Definition: Value.h:74
A range adaptor for a pair of iterators.
This class implements an extremely fast bulk output stream that can only output to a stream.
Definition: raw_ostream.h:52
struct LLVMOpaqueNamedMDNode * LLVMNamedMDNodeRef
Represents an LLVM Named Metadata Node.
Definition: Types.h:96
struct LLVMOpaqueMetadata * LLVMMetadataRef
Represents an LLVM Metadata.
Definition: Types.h:89
This file defines the ilist_node class template, which is a convenient base class for creating classe...
This provides a very simple, boring adaptor for a begin and end iterator into a range type.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
ArchKind & operator--(ArchKind &Kind)
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
LLVMConstants
Definition: Dwarf.h:44
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract_or_null(Y &&MD)
Extract a Value from Metadata, if any, allowing null.
Definition: Metadata.h:707
std::enable_if_t< detail::IsValidPointer< X, Y >::value, bool > hasa(Y &&MD)
Check whether Metadata has a Value.
Definition: Metadata.h:649
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > extract_or_null(Y &&MD)
Extract a Value from Metadata, allowing null.
Definition: Metadata.h:681
std::enable_if_t< detail::IsValidPointer< X, Y >::value, X * > dyn_extract(Y &&MD)
Extract a Value from Metadata, if any.
Definition: Metadata.h:694
This is an optimization pass for GlobalISel generic memory operations.
Definition: AddressRanges.h:18
@ Offset
Definition: DWP.cpp:480
APInt operator*(APInt a, uint64_t RHS)
Definition: APInt.h:2174
bool operator!=(uint64_t V1, const APInt &V2)
Definition: APInt.h:2052
iterator_range< T > make_range(T x, T y)
Convenience function for iterating over sub-ranges.
MutableArrayRef(T &OneElt) -> MutableArrayRef< T >
@ Ref
The access may reference the value stored in memory.
@ Other
Any other memory.
Attribute unwrap(LLVMAttributeRef Attr)
Definition: Attributes.h:320
uint64_t alignTo(uint64_t Size, Align A)
Returns a multiple of A needed to store Size bytes.
Definition: Alignment.h:155
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)
Definition: APFixedPoint.h:292
ArrayRef(const T &OneElt) -> ArrayRef< T >
std::optional< APInt > getAllocSize(const CallBase *CB, const TargetLibraryInfo *TLI, function_ref< const Value *(const Value *)> Mapper=[](const Value *V) { return V;})
Return the size of the requested allocation.
const uint64_t NOMORE_ICP_MAGICNUM
Magic number in the value profile metadata showing a target has been promoted for the instruction and...
Definition: Metadata.h:57
@ DEBUG_METADATA_VERSION
Definition: Metadata.h:52
#define N
A collection of metadata nodes that might be associated with a memory access used by the alias-analys...
Definition: Metadata.h:760
AAMDNodes concat(const AAMDNodes &Other) const
Determine the best AAMDNodes after concatenating two different locations together.
static MDNode * shiftTBAAStruct(MDNode *M, size_t off)
bool operator!=(const AAMDNodes &A) const
Definition: Metadata.h:770
MDNode * TBAAStruct
The tag for type-based alias analysis (tbaa struct).
Definition: Metadata.h:780
MDNode * Scope
The tag for alias scope specification (used with noalias).
Definition: Metadata.h:783
static MDNode * extendToTBAA(MDNode *TBAA, ssize_t len)
MDNode * TBAA
The tag for type-based alias analysis.
Definition: Metadata.h:777
AAMDNodes shift(size_t Offset) const
Create a new AAMDNode that describes this AAMDNode after applying a constant offset to the start of t...
Definition: Metadata.h:814
AAMDNodes merge(const AAMDNodes &Other) const
Given two sets of AAMDNodes applying to potentially different locations, determine the best AAMDNodes...
MDNode * NoAlias
The tag specifying the noalias scope.
Definition: Metadata.h:786
AAMDNodes intersect(const AAMDNodes &Other) const
Given two sets of AAMDNodes that apply to the same pointer, give the best AAMDNodes that are compatib...
Definition: Metadata.h:803
AAMDNodes(MDNode *T, MDNode *TS, MDNode *S, MDNode *N)
Definition: Metadata.h:762
AAMDNodes adjustForAccess(unsigned AccessSize)
Create a new AAMDNode for accessing AccessSize bytes of this AAMDNode.
AAMDNodes extendTo(ssize_t Len) const
Create a new AAMDNode that describes this AAMDNode after extending it to apply to a series of bytes o...
Definition: Metadata.h:827
bool operator==(const AAMDNodes &A) const
Definition: Metadata.h:765
AAMDNodes()=default
static MDNode * shiftTBAA(MDNode *M, size_t off)
static AAMDNodes getEmptyKey()
Definition: Metadata.h:862
static unsigned getHashValue(const AAMDNodes &Val)
Definition: Metadata.h:872
static AAMDNodes getTombstoneKey()
Definition: Metadata.h:867
static bool isEqual(const AAMDNodes &LHS, const AAMDNodes &RHS)
Definition: Metadata.h:879
An information struct used to provide DenseMap with the various necessary components for a given valu...
Definition: DenseMapInfo.h:52
void operator()(MDNode *Node) const
Definition: Metadata.h:1559
static Yes & hasDereference(SFINAE< sizeof(static_cast< V >(*make< U >()))> *=0)
static SimpleType getSimplifiedValue(MDOperand &MD)
Definition: Metadata.h:955
static SimpleType getSimplifiedValue(const MDOperand &MD)
Definition: Metadata.h:961
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...
Definition: Casting.h:34