aboutsummaryrefslogtreecommitdiff
path: root/include/llvm/IR/TrackingMDRef.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/IR/TrackingMDRef.h')
-rw-r--r--include/llvm/IR/TrackingMDRef.h17
1 files changed, 13 insertions, 4 deletions
diff --git a/include/llvm/IR/TrackingMDRef.h b/include/llvm/IR/TrackingMDRef.h
index fe513a8f9795..12b196432006 100644
--- a/include/llvm/IR/TrackingMDRef.h
+++ b/include/llvm/IR/TrackingMDRef.h
@@ -15,6 +15,8 @@
#define LLVM_IR_TRACKINGMDREF_H
#include "llvm/IR/Metadata.h"
+#include <algorithm>
+#include <cassert>
namespace llvm {
@@ -22,14 +24,15 @@ namespace llvm {
///
/// This class behaves like \a TrackingVH, but for metadata.
class TrackingMDRef {
- Metadata *MD;
+ Metadata *MD = nullptr;
public:
- TrackingMDRef() : MD(nullptr) {}
+ TrackingMDRef() = default;
explicit TrackingMDRef(Metadata *MD) : MD(MD) { track(); }
TrackingMDRef(TrackingMDRef &&X) : MD(X.MD) { retrack(X); }
TrackingMDRef(const TrackingMDRef &X) : MD(X.MD) { track(); }
+
TrackingMDRef &operator=(TrackingMDRef &&X) {
if (&X == this)
return *this;
@@ -39,6 +42,7 @@ public:
retrack(X);
return *this;
}
+
TrackingMDRef &operator=(const TrackingMDRef &X) {
if (&X == this)
return *this;
@@ -48,6 +52,7 @@ public:
track();
return *this;
}
+
~TrackingMDRef() { untrack(); }
Metadata *get() const { return MD; }
@@ -80,10 +85,12 @@ private:
if (MD)
MetadataTracking::track(MD);
}
+
void untrack() {
if (MD)
MetadataTracking::untrack(MD);
}
+
void retrack(TrackingMDRef &X) {
assert(MD == X.MD && "Expected values to match");
if (X.MD) {
@@ -101,15 +108,17 @@ template <class T> class TypedTrackingMDRef {
TrackingMDRef Ref;
public:
- TypedTrackingMDRef() {}
+ TypedTrackingMDRef() = default;
explicit TypedTrackingMDRef(T *MD) : Ref(static_cast<Metadata *>(MD)) {}
TypedTrackingMDRef(TypedTrackingMDRef &&X) : Ref(std::move(X.Ref)) {}
TypedTrackingMDRef(const TypedTrackingMDRef &X) : Ref(X.Ref) {}
+
TypedTrackingMDRef &operator=(TypedTrackingMDRef &&X) {
Ref = std::move(X.Ref);
return *this;
}
+
TypedTrackingMDRef &operator=(const TypedTrackingMDRef &X) {
Ref = X.Ref;
return *this;
@@ -162,4 +171,4 @@ template <class T> struct simplify_type<const TypedTrackingMDRef<T>> {
} // end namespace llvm
-#endif
+#endif // LLVM_IR_TRACKINGMDREF_H