Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 | |||
39 | ValueHandleBase(const ValueHandleBase &RHS) |
||
40 | : ValueHandleBase(RHS.PrevPair.getInt(), RHS) {} |
||
41 | |||
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 | |||
53 | void setValPtr(Value *V) { Val = V; } |
||
54 | |||
55 | public: |
||
56 | explicit ValueHandleBase(HandleBaseKind Kind) |
||
57 | : PrevPair(nullptr, Kind) {} |
||
58 | ValueHandleBase(HandleBaseKind Kind, Value *V) |
||
59 | : PrevPair(nullptr, Kind), Val(V) { |
||
60 | if (isValid(getValPtr())) |
||
61 | AddToUseList(); |
||
62 | } |
||
63 | |||
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: |
||
99 | Value *getValPtr() const { return Val; } |
||
100 | |||
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. |
||
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. |
||
123 | ValueHandleBase **getPrevPtr() const { return PrevPair.getPointer(); } |
||
124 | HandleBaseKind getKind() const { return PrevPair.getInt(); } |
||
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: |
||
146 | WeakVH() : ValueHandleBase(Weak) {} |
||
147 | WeakVH(Value *P) : ValueHandleBase(Weak, P) {} |
||
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 |