diff options
Diffstat (limited to 'include/llvm/IR/TrackingMDRef.h')
-rw-r--r-- | include/llvm/IR/TrackingMDRef.h | 17 |
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 |