1 //===- ValueHandle.h - Value Smart Pointer classes --------------*- 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 // This file declares the ValueHandle class and its sub-classes.
10 //
11 //===----------------------------------------------------------------------===//
12 
13 #ifndef LLVM_IR_VALUEHANDLE_H
14 #define LLVM_IR_VALUEHANDLE_H
15 
16 #include "llvm/ADT/DenseMapInfo.h"
17 #include "llvm/ADT/PointerIntPair.h"
18 #include "llvm/IR/Value.h"
19 #include "llvm/Support/Casting.h"
20 #include <cassert>
21 
22 namespace llvm {
23 
24 /// This is the common base class of value handles.
25 ///
26 /// ValueHandle's are smart pointers to Value's that have special behavior when
27 /// the value is deleted or ReplaceAllUsesWith'd.  See the specific handles
28 /// below for details.
29 class ValueHandleBase {
30   friend class Value;
31 
32 protected:
33   /// This indicates what sub class the handle actually is.
34   ///
35   /// This is to avoid having a vtable for the light-weight handle pointers. The
36   /// fully general Callback version does have a vtable.
37   enum HandleBaseKind { Assert, Callback, Weak, WeakTracking };
38 
ValueHandleBase(const ValueHandleBase & RHS)39   ValueHandleBase(const ValueHandleBase &RHS)
40       : ValueHandleBase(RHS.PrevPair.getInt(), RHS) {}
41 
ValueHandleBase(HandleBaseKind Kind,const ValueHandleBase & RHS)42   ValueHandleBase(HandleBaseKind Kind, const ValueHandleBase &RHS)
43       : PrevPair(nullptr, Kind), Val(RHS.getValPtr()) {
44     if (isValid(getValPtr()))
45       AddToExistingUseList(RHS.getPrevPtr());
46   }
47 
48 private:
49   PointerIntPair<ValueHandleBase**, 2, HandleBaseKind> PrevPair;
50   ValueHandleBase *Next = nullptr;
51   Value *Val = nullptr;
52 
setValPtr(Value * V)53   void setValPtr(Value *V) { Val = V; }
54 
55 public:
ValueHandleBase(HandleBaseKind Kind)56   explicit ValueHandleBase(HandleBaseKind Kind)
57       : PrevPair(nullptr, Kind) {}
ValueHandleBase(HandleBaseKind Kind,Value * V)58   ValueHandleBase(HandleBaseKind Kind, Value *V)
59       : PrevPair(nullptr, Kind), Val(V) {
60     if (isValid(getValPtr()))
61       AddToUseList();
62   }
63 
~ValueHandleBase()64   ~ValueHandleBase() {
65     if (isValid(getValPtr()))
66       RemoveFromUseList();
67   }
68 
69   Value *operator=(Value *RHS) {
70     if (getValPtr() == RHS)
71       return RHS;
72     if (isValid(getValPtr()))
73       RemoveFromUseList();
74     setValPtr(RHS);
75     if (isValid(getValPtr()))
76       AddToUseList();
77     return RHS;
78   }
79 
80   Value *operator=(const ValueHandleBase &RHS) {
81     if (getValPtr() == RHS.getValPtr())
82       return RHS.getValPtr();
83     if (isValid(getValPtr()))
84       RemoveFromUseList();
85     setValPtr(RHS.getValPtr());
86     if (isValid(getValPtr()))
87       AddToExistingUseList(RHS.getPrevPtr());
88     return getValPtr();
89   }
90 
91   Value *operator->() const { return getValPtr(); }
92   Value &operator*() const {
93     Value *V = getValPtr();
94     assert(V && "Dereferencing deleted ValueHandle");
95     return *V;
96   }
97 
98 protected:
getValPtr()99   Value *getValPtr() const { return Val; }
100 
isValid(Value * V)101   static bool isValid(Value *V) {
102     return V &&
103            V != DenseMapInfo<Value *>::getEmptyKey() &&
104            V != DenseMapInfo<Value *>::getTombstoneKey();
105   }
106 
107   /// Remove this ValueHandle from its current use list.
108   void RemoveFromUseList();
109 
110   /// Clear the underlying pointer without clearing the use list.
111   ///
112   /// This should only be used if a derived class has manually removed the
113   /// handle from the use list.
clearValPtr()114   void clearValPtr() { setValPtr(nullptr); }
115 
116 public:
117   // Callbacks made from Value.
118   static void ValueIsDeleted(Value *V);
119   static void ValueIsRAUWd(Value *Old, Value *New);
120 
121 private:
122   // Internal implementation details.
getPrevPtr()123   ValueHandleBase **getPrevPtr() const { return PrevPair.getPointer(); }
getKind()124   HandleBaseKind getKind() const { return PrevPair.getInt(); }
setPrevPtr(ValueHandleBase ** Ptr)125   void setPrevPtr(ValueHandleBase **Ptr) { PrevPair.setPointer(Ptr); }
126 
127   /// Add this ValueHandle to the use list for V.
128   ///
129   /// List is the address of either the head of the list or a Next node within
130   /// the existing use list.
131   void AddToExistingUseList(ValueHandleBase **List);
132 
133   /// Add this ValueHandle to the use list after Node.
134   void AddToExistingUseListAfter(ValueHandleBase *Node);
135 
136   /// Add this ValueHandle to the use list for V.
137   void AddToUseList();
138 };
139 
140 /// A nullable Value handle that is nullable.
141 ///
142 /// This is a value handle that points to a value, and nulls itself
143 /// out if that value is deleted.
144 class WeakVH : public ValueHandleBase {
145 public:
WeakVH()146   WeakVH() : ValueHandleBase(Weak) {}
WeakVH(Value * P)147   WeakVH(Value *P) : ValueHandleBase(Weak, P) {}
WeakVH(const WeakVH & RHS)148   WeakVH(const WeakVH &RHS)
149       : ValueHandleBase(Weak, RHS) {}
150 
151   WeakVH &operator=(const WeakVH &RHS) = default;
152 
153   Value *operator=(Value *RHS) {
154     return ValueHandleBase::operator=(RHS);
155   }
156   Value *operator=(const ValueHandleBase &RHS) {
157     return ValueHandleBase::operator=(RHS);
158   }
159 
160   operator Value*() const {
161     return getValPtr();
162   }
163 };
164 
165 // Specialize simplify_type to allow WeakVH to participate in
166 // dyn_cast, isa, etc.
167 template <> struct simplify_type<WeakVH> {
168   using SimpleType = Value *;
169 
170   static SimpleType getSimplifiedValue(WeakVH &WVH) { return WVH; }
171 };
172 template <> struct simplify_type<const WeakVH> {
173   using SimpleType = Value *;
174 
175   static SimpleType getSimplifiedValue(const WeakVH &WVH) { return WVH; }
176 };
177 
178 // Specialize DenseMapInfo to allow WeakVH to participate in DenseMap.
179 template <> struct DenseMapInfo<WeakVH> {
180   static inline WeakVH getEmptyKey() {
181     return WeakVH(DenseMapInfo<Value *>::getEmptyKey());
182   }
183 
184   static inline WeakVH getTombstoneKey() {
185     return WeakVH(DenseMapInfo<Value *>::getTombstoneKey());
186   }
187 
188   static unsigned getHashValue(const WeakVH &Val) {
189     return DenseMapInfo<Value *>::getHashValue(Val);
190   }
191 
192   static bool isEqual(const WeakVH &LHS, const WeakVH &RHS) {
193     return DenseMapInfo<Value *>::isEqual(LHS, RHS);
194   }
195 };
196 
197 /// Value handle that is nullable, but tries to track the Value.
198 ///
199 /// This is a value handle that tries hard to point to a Value, even across
200 /// RAUW operations, but will null itself out if the value is destroyed.  this
201 /// is useful for advisory sorts of information, but should not be used as the
202 /// key of a map (since the map would have to rearrange itself when the pointer
203 /// changes).
204 class WeakTrackingVH : public ValueHandleBase {
205 public:
206   WeakTrackingVH() : ValueHandleBase(WeakTracking) {}
207   WeakTrackingVH(Value *P) : ValueHandleBase(WeakTracking, P) {}
208   WeakTrackingVH(const WeakTrackingVH &RHS)
209       : ValueHandleBase(WeakTracking, RHS) {}
210 
211   WeakTrackingVH &operator=(const WeakTrackingVH &RHS) = default;
212 
213   Value *operator=(Value *RHS) {
214     return ValueHandleBase::operator=(RHS);
215   }
216   Value *operator=(const ValueHandleBase &RHS) {
217     return ValueHandleBase::operator=(RHS);
218   }
219 
220   operator Value*() const {
221     return getValPtr();
222   }
223 
224   bool pointsToAliveValue() const {
225     return ValueHandleBase::isValid(getValPtr());
226   }
227 };
228 
229 // Specialize simplify_type to allow WeakTrackingVH to participate in
230 // dyn_cast, isa, etc.
231 template <> struct simplify_type<WeakTrackingVH> {
232   using SimpleType = Value *;
233 
234   static SimpleType getSimplifiedValue(WeakTrackingVH &WVH) { return WVH; }
235 };
236 template <> struct simplify_type<const WeakTrackingVH> {
237   using SimpleType = Value *;
238 
239   static SimpleType getSimplifiedValue(const WeakTrackingVH &WVH) {
240     return WVH;
241   }
242 };
243 
244 /// Value handle that asserts if the Value is deleted.
245 ///
246 /// This is a Value Handle that points to a value and asserts out if the value
247 /// is destroyed while the handle is still live.  This is very useful for
248 /// catching dangling pointer bugs and other things which can be non-obvious.
249 /// One particularly useful place to use this is as the Key of a map.  Dangling
250 /// pointer bugs often lead to really subtle bugs that only occur if another
251 /// object happens to get allocated to the same address as the old one.  Using
252 /// an AssertingVH ensures that an assert is triggered as soon as the bad
253 /// delete occurs.
254 ///
255 /// Note that an AssertingVH handle does *not* follow values across RAUW
256 /// operations.  This means that RAUW's need to explicitly update the
257 /// AssertingVH's as it moves.  This is required because in non-assert mode this
258 /// class turns into a trivial wrapper around a pointer.
259 template <typename ValueTy>
260 class AssertingVH
261 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
262     : public ValueHandleBase
263 #endif
264 {
265   friend struct DenseMapInfo<AssertingVH<ValueTy>>;
266 
267 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
268   Value *getRawValPtr() const { return ValueHandleBase::getValPtr(); }
269   void setRawValPtr(Value *P) { ValueHandleBase::operator=(P); }
270 #else
271   Value *ThePtr;
272   Value *getRawValPtr() const { return ThePtr; }
273   void setRawValPtr(Value *P) { ThePtr = P; }
274 #endif
275   // Convert a ValueTy*, which may be const, to the raw Value*.
276   static Value *GetAsValue(Value *V) { return V; }
277   static Value *GetAsValue(const Value *V) { return const_cast<Value*>(V); }
278 
279   ValueTy *getValPtr() const { return static_cast<ValueTy *>(getRawValPtr()); }
280   void setValPtr(ValueTy *P) { setRawValPtr(GetAsValue(P)); }
281 
282 public:
283 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
284   AssertingVH() : ValueHandleBase(Assert) {}
285   AssertingVH(ValueTy *P) : ValueHandleBase(Assert, GetAsValue(P)) {}
286   AssertingVH(const AssertingVH &RHS) : ValueHandleBase(Assert, RHS) {}
287 #else
288   AssertingVH() : ThePtr(nullptr) {}
289   AssertingVH(ValueTy *P) : ThePtr(GetAsValue(P)) {}
290   AssertingVH(const AssertingVH &) = default;
291 #endif
292 
293   operator ValueTy*() const {
294     return getValPtr();
295   }
296 
297   ValueTy *operator=(ValueTy *RHS) {
298     setValPtr(RHS);
299     return getValPtr();
300   }
301   ValueTy *operator=(const AssertingVH<ValueTy> &RHS) {
302     setValPtr(RHS.getValPtr());
303     return getValPtr();
304   }
305 
306   ValueTy *operator->() const { return getValPtr(); }
307   ValueTy &operator*() const { return *getValPtr(); }
308 };
309 
310 // Treat AssertingVH<T> like T* inside maps. This also allows using find_as()
311 // to look up a value without constructing a value handle.
312 template<typename T>
313 struct DenseMapInfo<AssertingVH<T>> : DenseMapInfo<T *> {};
314 
315 /// Value handle that tracks a Value across RAUW.
316 ///
317 /// TrackingVH is designed for situations where a client needs to hold a handle
318 /// to a Value (or subclass) across some operations which may move that value,
319 /// but should never destroy it or replace it with some unacceptable type.
320 ///
321 /// It is an error to attempt to replace a value with one of a type which is
322 /// incompatible with any of its outstanding TrackingVHs.
323 ///
324 /// It is an error to read from a TrackingVH that does not point to a valid
325 /// value.  A TrackingVH is said to not point to a valid value if either it
326 /// hasn't yet been assigned a value yet or because the value it was tracking
327 /// has since been deleted.
328 ///
329 /// Assigning a value to a TrackingVH is always allowed, even if said TrackingVH
330 /// no longer points to a valid value.
331 template <typename ValueTy> class TrackingVH {
332   WeakTrackingVH InnerHandle;
333 
334 public:
335   ValueTy *getValPtr() const {
336     assert(InnerHandle.pointsToAliveValue() &&
337            "TrackingVH must be non-null and valid on dereference!");
338 
339     // Check that the value is a member of the correct subclass. We would like
340     // to check this property on assignment for better debugging, but we don't
341     // want to require a virtual interface on this VH. Instead we allow RAUW to
342     // replace this value with a value of an invalid type, and check it here.
343     assert(isa<ValueTy>(InnerHandle) &&
344            "Tracked Value was replaced by one with an invalid type!");
345     return cast<ValueTy>(InnerHandle);
346   }
347 
348   void setValPtr(ValueTy *P) {
349     // Assigning to non-valid TrackingVH's are fine so we just unconditionally
350     // assign here.
351     InnerHandle = GetAsValue(P);
352   }
353 
354   // Convert a ValueTy*, which may be const, to the type the base
355   // class expects.
356   static Value *GetAsValue(Value *V) { return V; }
357   static Value *GetAsValue(const Value *V) { return const_cast<Value*>(V); }
358 
359 public:
360   TrackingVH() = default;
361   TrackingVH(ValueTy *P) { setValPtr(P); }
362 
363   operator ValueTy*() const {
364     return getValPtr();
365   }
366 
367   ValueTy *operator=(ValueTy *RHS) {
368     setValPtr(RHS);
369     return getValPtr();
370   }
371 
372   ValueTy *operator->() const { return getValPtr(); }
373   ValueTy &operator*() const { return *getValPtr(); }
374 };
375 
376 /// Value handle with callbacks on RAUW and destruction.
377 ///
378 /// This is a value handle that allows subclasses to define callbacks that run
379 /// when the underlying Value has RAUW called on it or is destroyed.  This
380 /// class can be used as the key of a map, as long as the user takes it out of
381 /// the map before calling setValPtr() (since the map has to rearrange itself
382 /// when the pointer changes).  Unlike ValueHandleBase, this class has a vtable.
383 class CallbackVH : public ValueHandleBase {
384   virtual void anchor();
385 protected:
386   ~CallbackVH() = default;
387   CallbackVH(const CallbackVH &) = default;
388   CallbackVH &operator=(const CallbackVH &) = default;
389 
390   void setValPtr(Value *P) {
391     ValueHandleBase::operator=(P);
392   }
393 
394 public:
395   CallbackVH() : ValueHandleBase(Callback) {}
396   CallbackVH(Value *P) : ValueHandleBase(Callback, P) {}
397   CallbackVH(const Value *P) : CallbackVH(const_cast<Value *>(P)) {}
398 
399   operator Value*() const {
400     return getValPtr();
401   }
402 
403   /// Callback for Value destruction.
404   ///
405   /// Called when this->getValPtr() is destroyed, inside ~Value(), so you
406   /// may call any non-virtual Value method on getValPtr(), but no subclass
407   /// methods.  If WeakTrackingVH were implemented as a CallbackVH, it would use
408   /// this
409   /// method to call setValPtr(NULL).  AssertingVH would use this method to
410   /// cause an assertion failure.
411   ///
412   /// All implementations must remove the reference from this object to the
413   /// Value that's being destroyed.
414   virtual void deleted() { setValPtr(nullptr); }
415 
416   /// Callback for Value RAUW.
417   ///
418   /// Called when this->getValPtr()->replaceAllUsesWith(new_value) is called,
419   /// _before_ any of the uses have actually been replaced.  If WeakTrackingVH
420   /// were
421   /// implemented as a CallbackVH, it would use this method to call
422   /// setValPtr(new_value).  AssertingVH would do nothing in this method.
423   virtual void allUsesReplacedWith(Value *) {}
424 };
425 
426 /// Value handle that poisons itself if the Value is deleted.
427 ///
428 /// This is a Value Handle that points to a value and poisons itself if the
429 /// value is destroyed while the handle is still live.  This is very useful for
430 /// catching dangling pointer bugs where an \c AssertingVH cannot be used
431 /// because the dangling handle needs to outlive the value without ever being
432 /// used.
433 ///
434 /// One particularly useful place to use this is as the Key of a map. Dangling
435 /// pointer bugs often lead to really subtle bugs that only occur if another
436 /// object happens to get allocated to the same address as the old one. Using
437 /// a PoisoningVH ensures that an assert is triggered if looking up a new value
438 /// in the map finds a handle from the old value.
439 ///
440 /// Note that a PoisoningVH handle does *not* follow values across RAUW
441 /// operations. This means that RAUW's need to explicitly update the
442 /// PoisoningVH's as it moves. This is required because in non-assert mode this
443 /// class turns into a trivial wrapper around a pointer.
444 template <typename ValueTy>
445 class PoisoningVH final
446 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
447     : public CallbackVH
448 #endif
449 {
450   friend struct DenseMapInfo<PoisoningVH<ValueTy>>;
451 
452   // Convert a ValueTy*, which may be const, to the raw Value*.
453   static Value *GetAsValue(Value *V) { return V; }
454   static Value *GetAsValue(const Value *V) { return const_cast<Value *>(V); }
455 
456 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
457   /// A flag tracking whether this value has been poisoned.
458   ///
459   /// On delete and RAUW, we leave the value pointer alone so that as a raw
460   /// pointer it produces the same value (and we fit into the same key of
461   /// a hash table, etc), but we poison the handle so that any top-level usage
462   /// will fail.
463   bool Poisoned = false;
464 
465   Value *getRawValPtr() const { return ValueHandleBase::getValPtr(); }
466   void setRawValPtr(Value *P) { ValueHandleBase::operator=(P); }
467 
468   /// Handle deletion by poisoning the handle.
469   void deleted() override {
470     assert(!Poisoned && "Tried to delete an already poisoned handle!");
471     Poisoned = true;
472     RemoveFromUseList();
473   }
474 
475   /// Handle RAUW by poisoning the handle.
476   void allUsesReplacedWith(Value *) override {
477     assert(!Poisoned && "Tried to RAUW an already poisoned handle!");
478     Poisoned = true;
479     RemoveFromUseList();
480   }
481 #else // LLVM_ENABLE_ABI_BREAKING_CHECKS
482   Value *ThePtr = nullptr;
483 
484   Value *getRawValPtr() const { return ThePtr; }
485   void setRawValPtr(Value *P) { ThePtr = P; }
486 #endif
487 
488   ValueTy *getValPtr() const {
489 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
490     assert(!Poisoned && "Accessed a poisoned value handle!");
491 #endif
492     return static_cast<ValueTy *>(getRawValPtr());
493   }
494   void setValPtr(ValueTy *P) { setRawValPtr(GetAsValue(P)); }
495 
496 public:
497   PoisoningVH() = default;
498 #if LLVM_ENABLE_ABI_BREAKING_CHECKS
499   PoisoningVH(ValueTy *P) : CallbackVH(GetAsValue(P)) {}
500   PoisoningVH(const PoisoningVH &RHS)
501       : CallbackVH(RHS), Poisoned(RHS.Poisoned) {}
502 
503   ~PoisoningVH() {
504     if (Poisoned)
505       clearValPtr();
506   }
507 
508   PoisoningVH &operator=(const PoisoningVH &RHS) {
509     if (Poisoned)
510       clearValPtr();
511     CallbackVH::operator=(RHS);
512     Poisoned = RHS.Poisoned;
513     return *this;
514   }
515 #else
516   PoisoningVH(ValueTy *P) : ThePtr(GetAsValue(P)) {}
517 #endif
518 
519   operator ValueTy *() const { return getValPtr(); }
520 
521   ValueTy *operator->() const { return getValPtr(); }
522   ValueTy &operator*() const { return *getValPtr(); }
523 };
524 
525 // Specialize DenseMapInfo to allow PoisoningVH to participate in DenseMap.
526 template <typename T> struct DenseMapInfo<PoisoningVH<T>> {
527   static inline PoisoningVH<T> getEmptyKey() {
528     PoisoningVH<T> Res;
529     Res.setRawValPtr(DenseMapInfo<Value *>::getEmptyKey());
530     return Res;
531   }
532 
533   static inline PoisoningVH<T> getTombstoneKey() {
534     PoisoningVH<T> Res;
535     Res.setRawValPtr(DenseMapInfo<Value *>::getTombstoneKey());
536     return Res;
537   }
538 
539   static unsigned getHashValue(const PoisoningVH<T> &Val) {
540     return DenseMapInfo<Value *>::getHashValue(Val.getRawValPtr());
541   }
542 
543   static bool isEqual(const PoisoningVH<T> &LHS, const PoisoningVH<T> &RHS) {
544     return DenseMapInfo<Value *>::isEqual(LHS.getRawValPtr(),
545                                           RHS.getRawValPtr());
546   }
547 
548   // Allow lookup by T* via find_as(), without constructing a temporary
549   // value handle.
550 
551   static unsigned getHashValue(const T *Val) {
552     return DenseMapInfo<Value *>::getHashValue(Val);
553   }
554 
555   static bool isEqual(const T *LHS, const PoisoningVH<T> &RHS) {
556     return DenseMapInfo<Value *>::isEqual(LHS, RHS.getRawValPtr());
557   }
558 };
559 
560 } // end namespace llvm
561 
562 #endif // LLVM_IR_VALUEHANDLE_H
563