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