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
549 : ValueAsMetadata(LocalAsMetadataKind, Local) {
550 assert(!isa<Constant>(Local) && "Expected local value");
551 }
552
553public:
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 = {});
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);
1462 /// Merge !prof metadata from two instructions.
1463 /// Currently only implemented with direct callsites with branch weights.
1465 const Instruction *AInstr,
1466 const Instruction *BInstr);
1469};
1470
1471/// Tuple of metadata.
1472///
1473/// This is the simple \a MDNode arbitrary tuple. Nodes are uniqued by
1474/// default based on their operands.
1475class MDTuple : public MDNode {
1476 friend class LLVMContextImpl;
1477 friend class MDNode;
1478
1479 MDTuple(LLVMContext &C, StorageType Storage, unsigned Hash,
1481 : MDNode(C, MDTupleKind, Storage, Vals) {
1482 setHash(Hash);
1483 }
1484
1486
1487 void setHash(unsigned Hash) { SubclassData32 = Hash; }
1488 void recalculateHash();
1489
1490 static MDTuple *getImpl(LLVMContext &Context, ArrayRef<Metadata *> MDs,
1491 StorageType Storage, bool ShouldCreate = true);
1492
1493 TempMDTuple cloneImpl() const {
1494 ArrayRef<MDOperand> Operands = operands();
1495 return getTemporary(getContext(), SmallVector<Metadata *, 4>(Operands));
1496 }
1497
1498public:
1499 /// Get the hash, if any.
1500 unsigned getHash() const { return SubclassData32; }
1501
1503 return getImpl(Context, MDs, Uniqued);
1504 }
1505
1507 return getImpl(Context, MDs, Uniqued, /* ShouldCreate */ false);
1508 }
1509
1510 /// Return a distinct node.
1511 ///
1512 /// Return a distinct node -- i.e., a node that is not uniqued.
1514 return getImpl(Context, MDs, Distinct);
1515 }
1516
1517 /// Return a temporary node.
1518 ///
1519 /// For use in constructing cyclic MDNode structures. A temporary MDNode is
1520 /// not uniqued, may be RAUW'd, and must be manually deleted with
1521 /// deleteTemporary.
1522 static TempMDTuple getTemporary(LLVMContext &Context,
1524 return TempMDTuple(getImpl(Context, MDs, Temporary));
1525 }
1526
1527 /// Return a (temporary) clone of this.
1528 TempMDTuple clone() const { return cloneImpl(); }
1529
1530 /// Append an element to the tuple. This will resize the node.
1532 size_t NumOps = getNumOperands();
1533 resize(NumOps + 1);
1534 setOperand(NumOps, MD);
1535 }
1536
1537 /// Shrink the operands by 1.
1538 void pop_back() { resize(getNumOperands() - 1); }
1539
1540 static bool classof(const Metadata *MD) {
1541 return MD->getMetadataID() == MDTupleKind;
1542 }
1543};
1544
1546 return MDTuple::get(Context, MDs);
1547}
1548
1550 return MDTuple::getIfExists(Context, MDs);
1551}
1552
1554 return MDTuple::getDistinct(Context, MDs);
1555}
1556
1559 return MDTuple::getTemporary(Context, MDs);
1560}
1561
1564}
1565
1566/// This is a simple wrapper around an MDNode which provides a higher-level
1567/// interface by hiding the details of how alias analysis information is encoded
1568/// in its operands.
1570 const MDNode *Node = nullptr;
1571
1572public:
1573 AliasScopeNode() = default;
1574 explicit AliasScopeNode(const MDNode *N) : Node(N) {}
1575
1576 /// Get the MDNode for this AliasScopeNode.
1577 const MDNode *getNode() const { return Node; }
1578
1579 /// Get the MDNode for this AliasScopeNode's domain.
1580 const MDNode *getDomain() const {
1581 if (Node->getNumOperands() < 2)
1582 return nullptr;
1583 return dyn_cast_or_null<MDNode>(Node->getOperand(1));
1584 }
1586 if (Node->getNumOperands() > 2)
1587 if (MDString *N = dyn_cast_or_null<MDString>(Node->getOperand(2)))
1588 return N->getString();
1589 return StringRef();
1590 }
1591};
1592
1593/// Typed iterator through MDNode operands.
1594///
1595/// An iterator that transforms an \a MDNode::iterator into an iterator over a
1596/// particular Metadata subclass.
1597template <class T> class TypedMDOperandIterator {
1598 MDNode::op_iterator I = nullptr;
1599
1600public:
1601 using iterator_category = std::input_iterator_tag;
1602 using value_type = T *;
1603 using difference_type = std::ptrdiff_t;
1604 using pointer = void;
1605 using reference = T *;
1606
1609
1610 T *operator*() const { return cast_or_null<T>(*I); }
1611
1613 ++I;
1614 return *this;
1615 }
1616
1618 TypedMDOperandIterator Temp(*this);
1619 ++I;
1620 return Temp;
1621 }
1622
1623 bool operator==(const TypedMDOperandIterator &X) const { return I == X.I; }
1624 bool operator!=(const TypedMDOperandIterator &X) const { return I != X.I; }
1625};
1626
1627/// Typed, array-like tuple of metadata.
1628///
1629/// This is a wrapper for \a MDTuple that makes it act like an array holding a
1630/// particular type of metadata.
1631template <class T> class MDTupleTypedArrayWrapper {
1632 const MDTuple *N = nullptr;
1633
1634public:
1637
1638 template <class U>
1641 std::enable_if_t<std::is_convertible<U *, T *>::value> * = nullptr)
1642 : N(Other.get()) {}
1643
1644 template <class U>
1647 std::enable_if_t<!std::is_convertible<U *, T *>::value> * = nullptr)
1648 : N(Other.get()) {}
1649
1650 explicit operator bool() const { return get(); }
1651 explicit operator MDTuple *() const { return get(); }
1652
1653 MDTuple *get() const { return const_cast<MDTuple *>(N); }
1654 MDTuple *operator->() const { return get(); }
1655 MDTuple &operator*() const { return *get(); }
1656
1657 // FIXME: Fix callers and remove condition on N.
1658 unsigned size() const { return N ? N->getNumOperands() : 0u; }
1659 bool empty() const { return N ? N->getNumOperands() == 0 : true; }
1660 T *operator[](unsigned I) const { return cast_or_null<T>(N->getOperand(I)); }
1661
1662 // FIXME: Fix callers and remove condition on N.
1664
1665 iterator begin() const { return N ? iterator(N->op_begin()) : iterator(); }
1666 iterator end() const { return N ? iterator(N->op_end()) : iterator(); }
1667};
1668
1669#define HANDLE_METADATA(CLASS) \
1670 using CLASS##Array = MDTupleTypedArrayWrapper<CLASS>;
1671#include "llvm/IR/Metadata.def"
1672
1673/// Placeholder metadata for operands of distinct MDNodes.
1674///
1675/// This is a lightweight placeholder for an operand of a distinct node. It's
1676/// purpose is to help track forward references when creating a distinct node.
1677/// This allows distinct nodes involved in a cycle to be constructed before
1678/// their operands without requiring a heavyweight temporary node with
1679/// full-blown RAUW support.
1680///
1681/// Each placeholder supports only a single MDNode user. Clients should pass
1682/// an ID, retrieved via \a getID(), to indicate the "real" operand that this
1683/// should be replaced with.
1684///
1685/// While it would be possible to implement move operators, they would be
1686/// fairly expensive. Leave them unimplemented to discourage their use
1687/// (clients can use std::deque, std::list, BumpPtrAllocator, etc.).
1689 friend class MetadataTracking;
1690
1691 Metadata **Use = nullptr;
1692
1693public:
1695 : Metadata(DistinctMDOperandPlaceholderKind, Distinct) {
1697 }
1698
1702
1704 if (Use)
1705 *Use = nullptr;
1706 }
1707
1708 unsigned getID() const { return SubclassData32; }
1709
1710 /// Replace the use of this with MD.
1712 if (!Use)
1713 return;
1714 *Use = MD;
1715
1716 if (*Use)
1718
1719 Metadata *T = cast<Metadata>(this);
1721 assert(!Use && "Use is still being tracked despite being untracked!");
1722 }
1723};
1724
1725//===----------------------------------------------------------------------===//
1726/// A tuple of MDNodes.
1727///
1728/// Despite its name, a NamedMDNode isn't itself an MDNode.
1729///
1730/// NamedMDNodes are named module-level entities that contain lists of MDNodes.
1731///
1732/// It is illegal for a NamedMDNode to appear as an operand of an MDNode.
1733class NamedMDNode : public ilist_node<NamedMDNode> {
1734 friend class LLVMContextImpl;
1735 friend class Module;
1736
1737 std::string Name;
1738 Module *Parent = nullptr;
1739 void *Operands; // SmallVector<TrackingMDRef, 4>
1740
1741 void setParent(Module *M) { Parent = M; }
1742
1743 explicit NamedMDNode(const Twine &N);
1744
1745 template <class T1> class op_iterator_impl {
1746 friend class NamedMDNode;
1747
1748 const NamedMDNode *Node = nullptr;
1749 unsigned Idx = 0;
1750
1751 op_iterator_impl(const NamedMDNode *N, unsigned i) : Node(N), Idx(i) {}
1752
1753 public:
1754 using iterator_category = std::bidirectional_iterator_tag;
1755 using value_type = T1;
1756 using difference_type = std::ptrdiff_t;
1757 using pointer = value_type *;
1758 using reference = value_type;
1759
1760 op_iterator_impl() = default;
1761
1762 bool operator==(const op_iterator_impl &o) const { return Idx == o.Idx; }
1763 bool operator!=(const op_iterator_impl &o) const { return Idx != o.Idx; }
1764
1765 op_iterator_impl &operator++() {
1766 ++Idx;
1767 return *this;
1768 }
1769
1770 op_iterator_impl operator++(int) {
1771 op_iterator_impl tmp(*this);
1772 operator++();
1773 return tmp;
1774 }
1775
1776 op_iterator_impl &operator--() {
1777 --Idx;
1778 return *this;
1779 }
1780
1781 op_iterator_impl operator--(int) {
1782 op_iterator_impl tmp(*this);
1783 operator--();
1784 return tmp;
1785 }
1786
1787 T1 operator*() const { return Node->getOperand(Idx); }
1788 };
1789
1790public:
1791 NamedMDNode(const NamedMDNode &) = delete;
1792 ~NamedMDNode();
1793
1794 /// Drop all references and remove the node from parent module.
1795 void eraseFromParent();
1796
1797 /// Remove all uses and clear node vector.
1799 /// Drop all references to this node's operands.
1800 void clearOperands();
1801
1802 /// Get the module that holds this named metadata collection.
1803 inline Module *getParent() { return Parent; }
1804 inline const Module *getParent() const { return Parent; }
1805
1806 MDNode *getOperand(unsigned i) const;
1807 unsigned getNumOperands() const;
1808 void addOperand(MDNode *M);
1809 void setOperand(unsigned I, MDNode *New);
1810 StringRef getName() const;
1811 void print(raw_ostream &ROS, bool IsForDebug = false) const;
1812 void print(raw_ostream &ROS, ModuleSlotTracker &MST,
1813 bool IsForDebug = false) const;
1814 void dump() const;
1815
1816 // ---------------------------------------------------------------------------
1817 // Operand Iterator interface...
1818 //
1819 using op_iterator = op_iterator_impl<MDNode *>;
1820
1821 op_iterator op_begin() { return op_iterator(this, 0); }
1823
1824 using const_op_iterator = op_iterator_impl<const MDNode *>;
1825
1826 const_op_iterator op_begin() const { return const_op_iterator(this, 0); }
1828
1830 return make_range(op_begin(), op_end());
1831 }
1833 return make_range(op_begin(), op_end());
1834 }
1835};
1836
1837// Create wrappers for C Binding types (see CBindingWrapping.h).
1839
1840} // end namespace llvm
1841
1842#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:410
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.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
raw_pwrite_stream & OS
This file defines the SmallVector class.
Value * RHS
Value * LHS
This is a simple wrapper around an MDNode which provides a higher-level interface by hiding the detai...
Definition: Metadata.h:1569
AliasScopeNode()=default
AliasScopeNode(const MDNode *N)
Definition: Metadata.h:1574
const MDNode * getNode() const
Get the MDNode for this AliasScopeNode.
Definition: Metadata.h:1577
const MDNode * getDomain() const
Get the MDNode for this AliasScopeNode's domain.
Definition: Metadata.h:1580
StringRef getName() const
Definition: Metadata.h:1585
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:1688
void replaceUseWith(Metadata *MD)
Replace the use of this with MD.
Definition: Metadata.h:1711
DistinctMDOperandPlaceholder(const DistinctMDOperandPlaceholder &)=delete
DistinctMDOperandPlaceholder(unsigned ID)
Definition: Metadata.h:1694
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
static MDNode * getMergedCallsiteMetadata(MDNode *A, MDNode *B)
void printTree(raw_ostream &OS, const Module *M=nullptr) const
Print in tree shape.
Definition: AsmWriter.cpp:5271
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:1553
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
static MDNode * getMostGenericNoaliasAddrspace(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1357
void storeDistinctInContext()
Definition: Metadata.cpp:1055
bool isTemporary() const
Definition: Metadata.h:1253
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1557
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:1545
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
MDNode(LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={})
Definition: Metadata.cpp:650
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
static MDNode * getMergedMemProfMetadata(MDNode *A, MDNode *B)
bool isReplaceable() const
Definition: Metadata.h:1255
void setOperand(unsigned I, Metadata *New)
Set an operand.
Definition: Metadata.cpp:1089
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:1549
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:5346
static MDNode * getMostGenericAlignmentOrDereferenceable(MDNode *A, MDNode *B)
Definition: Metadata.cpp:1394
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:1631
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t<!std::is_convertible< U *, T * >::value > *=nullptr)
Definition: Metadata.h:1645
MDTupleTypedArrayWrapper(const MDTuple *N)
Definition: Metadata.h:1636
T * operator[](unsigned I) const
Definition: Metadata.h:1660
MDTuple * operator->() const
Definition: Metadata.h:1654
MDTuple & operator*() const
Definition: Metadata.h:1655
MDTupleTypedArrayWrapper(const MDTupleTypedArrayWrapper< U > &Other, std::enable_if_t< std::is_convertible< U *, T * >::value > *=nullptr)
Definition: Metadata.h:1639
TypedMDOperandIterator< T > iterator
Definition: Metadata.h:1663
Tuple of metadata.
Definition: Metadata.h:1475
TempMDTuple clone() const
Return a (temporary) clone of this.
Definition: Metadata.h:1528
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a distinct node.
Definition: Metadata.h:1513
static bool classof(const Metadata *MD)
Definition: Metadata.h:1540
void push_back(Metadata *MD)
Append an element to the tuple. This will resize the node.
Definition: Metadata.h:1531
unsigned getHash() const
Get the hash, if any.
Definition: Metadata.h:1500
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1502
static MDTuple * getIfExists(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition: Metadata.h:1506
static TempMDTuple getTemporary(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Return a temporary node.
Definition: Metadata.h:1522
void pop_back()
Shrink the operands by 1.
Definition: Metadata.h:1538
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:5260
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:5250
Metadata(unsigned ID, StorageType Storage)
Definition: Metadata.h:86
void dump() const
User-friendly dump.
Definition: AsmWriter.cpp:5337
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:1733
const_op_iterator op_begin() const
Definition: Metadata.h:1826
NamedMDNode(const NamedMDNode &)=delete
op_iterator_impl< const MDNode * > const_op_iterator
Definition: Metadata.h:1824
void dump() const
Definition: AsmWriter.cpp:5334
void setOperand(unsigned I, MDNode *New)
Definition: Metadata.cpp:1433
StringRef getName() const
Definition: Metadata.cpp:1442
void dropAllReferences()
Remove all uses and clear node vector.
Definition: Metadata.h:1798
void print(raw_ostream &ROS, bool IsForDebug=false) const
Definition: AsmWriter.cpp:4921
void eraseFromParent()
Drop all references and remove the node from parent module.
Definition: Metadata.cpp:1438
const_op_iterator op_end() const
Definition: Metadata.h:1827
iterator_range< const_op_iterator > operands() const
Definition: Metadata.h:1832
op_iterator op_end()
Definition: Metadata.h:1822
MDNode * getOperand(unsigned i) const
Definition: Metadata.cpp:1425
op_iterator op_begin()
Definition: Metadata.h:1821
op_iterator_impl< MDNode * > op_iterator
Definition: Metadata.h:1819
unsigned getNumOperands() const
Definition: Metadata.cpp:1421
const Module * getParent() const
Definition: Metadata.h:1804
void clearOperands()
Drop all references to this node's operands.
Definition: Metadata.cpp:1440
iterator_range< op_iterator > operands()
Definition: Metadata.h:1829
Module * getParent()
Get the module that holds this named metadata collection.
Definition: Metadata.h:1803
void addOperand(MDNode *M)
Definition: Metadata.cpp:1431
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:1196
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:131
iterator begin() const
Definition: StringRef.h:116
constexpr size_t size() const
size - Get the string size.
Definition: StringRef.h:150
iterator end() const
Definition: StringRef.h:118
const unsigned char * bytes_begin() const
Definition: StringRef.h:128
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:1597
TypedMDOperandIterator operator++(int)
Definition: Metadata.h:1617
std::ptrdiff_t difference_type
Definition: Metadata.h:1603
std::input_iterator_tag iterator_category
Definition: Metadata.h:1601
bool operator==(const TypedMDOperandIterator &X) const
Definition: Metadata.h:1623
TypedMDOperandIterator & operator++()
Definition: Metadata.h:1612
TypedMDOperandIterator(MDNode::op_iterator I)
Definition: Metadata.h:1608
bool operator!=(const TypedMDOperandIterator &X) const
Definition: Metadata.h:1624
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)
@ C
The default llvm calling convention, compatible with C.
Definition: CallingConv.h:34
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
Definition: CallingConv.h:24
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:2204
bool operator!=(uint64_t V1, const APInt &V2)
Definition: APInt.h:2082
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:332
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:303
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
LLVMConstants
Definition: Metadata.h:51
@ 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:1562
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