From: Duncan Sands Date: Tue, 27 Jul 2010 06:53:14 +0000 (+0000) Subject: After updating value handles for RAUW, check that no weak or tracking handles X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=2c11046fa186a4489bfd562cd81ff8a4883cb223 After updating value handles for RAUW, check that no weak or tracking handles are still on the list. This might happen if a CallbackVH created some new value handles for the old value when doing RAUW. Barf if it occurs, since it is almost certainly a mistake. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@109495 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/VMCore/Value.cpp b/lib/VMCore/Value.cpp index 436a07c4f20..b8c67756546 100644 --- a/lib/VMCore/Value.cpp +++ b/lib/VMCore/Value.cpp @@ -494,7 +494,7 @@ void ValueHandleBase::ValueIsDeleted(Value *V) { // Note that we deliberately do not the support the case when dropping a value // handle results in a new value handle being permanently added to the list // (as might occur in theory for CallbackVH's): the new value handle will not - // be processed and the checking code will meet out righteous punishment if + // be processed and the checking code will mete out righteous punishment if // the handle is still present once we have finished processing all the other // value handles (it is fine to momentarily add then remove a value handle). for (ValueHandleBase Iterator(Assert, *Entry); Entry; Entry = Iterator.Next) { @@ -577,6 +577,24 @@ void ValueHandleBase::ValueIsRAUWd(Value *Old, Value *New) { break; } } + +#ifndef NDEBUG + // If any new tracking or weak value handles were added while processing the + // list, then complain about it now. + if (Old->HasValueHandle) + for (Entry = pImpl->ValueHandles[Old]; Entry; Entry = Entry->Next) + switch (Entry->getKind()) { + case Tracking: + case Weak: + dbgs() << "After RAUW from " << *Old->getType() << " %" + << Old->getNameStr() << " to " << *New->getType() << " %" + << New->getNameStr() << "\n"; + llvm_unreachable("A tracking or weak value handle still pointed to the" + " old value!\n"); + default: + break; + } +#endif } /// ~CallbackVH. Empty, but defined here to avoid emitting the vtable