LLVM 23.0.0git
TrackingMDRef.h
Go to the documentation of this file.
1//===- llvm/IR/TrackingMDRef.h - Tracking Metadata references ---*- 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// References to metadata that track RAUW.
10//
11//===----------------------------------------------------------------------===//
12
13#ifndef LLVM_IR_TRACKINGMDREF_H
14#define LLVM_IR_TRACKINGMDREF_H
15
16#include "llvm/IR/Metadata.h"
17#include <algorithm>
18#include <cassert>
19
20namespace llvm {
21
22/// Tracking metadata reference.
23///
24/// This class behaves like \a TrackingVH, but for metadata.
26 Metadata *MD = nullptr;
27
28public:
29 TrackingMDRef() = default;
30 explicit TrackingMDRef(Metadata *MD) : MD(MD) { track(); }
31
32 TrackingMDRef(TrackingMDRef &&X) : MD(X.MD) { retrack(X); }
33 TrackingMDRef(const TrackingMDRef &X) : MD(X.MD) { track(); }
34
36 if (&X == this || MD == X.MD)
37 return *this;
38
39 untrack();
40 MD = X.MD;
41 retrack(X);
42 return *this;
43 }
44
46 if (&X == this || MD == X.MD)
47 return *this;
48
49 untrack();
50 MD = X.MD;
51 track();
52 return *this;
53 }
54
55 ~TrackingMDRef() { untrack(); }
56
57 Metadata *get() const { return MD; }
58 operator Metadata *() const { return get(); }
59 Metadata *operator->() const { return get(); }
60 Metadata &operator*() const { return *get(); }
61
62 void reset() {
63 untrack();
64 MD = nullptr;
65 }
66 void reset(Metadata *MD) {
67 untrack();
68 this->MD = MD;
69 track();
70 }
71
72 bool operator==(const TrackingMDRef &X) const { return MD == X.MD; }
73 bool operator!=(const TrackingMDRef &X) const { return MD != X.MD; }
74
75private:
76 void track() {
77 if (MD)
79 }
80
81 void untrack() {
82 if (MD)
84 }
85
86 void retrack(TrackingMDRef &X) {
87 assert(MD == X.MD && "Expected values to match");
88 if (X.MD) {
90 X.MD = nullptr;
91 }
92 }
93};
94
95/// Typed tracking ref.
96///
97/// Track refererences of a particular type. It's useful to use this for \a
98/// MDNode and \a ValueAsMetadata.
99template <class T> class TypedTrackingMDRef {
100 TrackingMDRef Ref;
101
102public:
104 explicit TypedTrackingMDRef(T *MD) : Ref(static_cast<Metadata *>(MD)) {}
105
108
110 Ref = std::move(X.Ref);
111 return *this;
112 }
113
115
116 T *get() const { return (T *)Ref.get(); }
117 operator T *() const { return get(); }
118 T *operator->() const { return get(); }
119 T &operator*() const { return *get(); }
120
121 bool operator==(const TypedTrackingMDRef &X) const { return Ref == X.Ref; }
122 bool operator!=(const TypedTrackingMDRef &X) const { return Ref != X.Ref; }
123
124 void reset() { Ref.reset(); }
125 void reset(T *MD) { Ref.reset(static_cast<Metadata *>(MD)); }
126};
127
130
131// Expose the underlying metadata to casting.
132template <> struct simplify_type<TrackingMDRef> {
134
135 static SimpleType getSimplifiedValue(TrackingMDRef &MD) { return MD.get(); }
136};
137
138template <> struct simplify_type<const TrackingMDRef> {
140
142 return MD.get();
143 }
144};
145
146template <class T> struct simplify_type<TypedTrackingMDRef<T>> {
147 using SimpleType = T *;
148
150 return MD.get();
151 }
152};
153
154template <class T> struct simplify_type<const TypedTrackingMDRef<T>> {
155 using SimpleType = T *;
156
158 return MD.get();
159 }
160};
161
162} // end namespace llvm
163
164#endif // LLVM_IR_TRACKINGMDREF_H
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
aarch64 promote const
#define X(NUM, ENUM, NAME)
Definition ELF.h:853
This file contains the declarations for metadata subclasses.
#define T
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata * > MDs)
Definition Metadata.h:1572
static void untrack(Metadata *&MD)
Stop tracking a reference to metadata.
Definition Metadata.h:358
static bool retrack(Metadata *&MD, Metadata *&New)
Move tracking from one reference to another.
Definition Metadata.h:369
static bool track(Metadata *&MD)
Track the reference to metadata.
Definition Metadata.h:324
Root of the metadata hierarchy.
Definition Metadata.h:64
Tracking metadata reference.
TrackingMDRef(const TrackingMDRef &X)
Metadata & operator*() const
bool operator==(const TrackingMDRef &X) const
TrackingMDRef(Metadata *MD)
TrackingMDRef()=default
bool operator!=(const TrackingMDRef &X) const
Metadata * get() const
void reset(Metadata *MD)
TrackingMDRef(TrackingMDRef &&X)
Metadata * operator->() const
TrackingMDRef & operator=(const TrackingMDRef &X)
TrackingMDRef & operator=(TrackingMDRef &&X)
Typed tracking ref.
bool operator!=(const TypedTrackingMDRef &X) const
TypedTrackingMDRef(const TypedTrackingMDRef &X)=default
TypedTrackingMDRef(TypedTrackingMDRef &&X)
bool operator==(const TypedTrackingMDRef &X) const
TypedTrackingMDRef & operator=(TypedTrackingMDRef &&X)
TypedTrackingMDRef & operator=(const TypedTrackingMDRef &X)=default
This is an optimization pass for GlobalISel generic memory operations.
TypedTrackingMDRef< MDNode > TrackingMDNodeRef
OutputIt move(R &&Range, OutputIt Out)
Provide wrappers to std::move which take ranges instead of having to pass begin/end explicitly.
Definition STLExtras.h:1916
TypedTrackingMDRef< ValueAsMetadata > TrackingValueAsMetadataRef
Implement std::hash so that hash_code can be used in STL containers.
Definition BitVector.h:874
static SimpleType getSimplifiedValue(TrackingMDRef &MD)
static SimpleType getSimplifiedValue(TypedTrackingMDRef< T > &MD)
static SimpleType getSimplifiedValue(const TrackingMDRef &MD)
static SimpleType getSimplifiedValue(const TypedTrackingMDRef< T > &MD)
Define a template that can be specialized by smart pointers to reflect the fact that they are automat...
Definition Casting.h:34