diff --git a/include/llvm/ValueHolder.h b/include/llvm/ValueHolder.h index 905b2ad326a..6e251ff5c17 100644 --- a/include/llvm/ValueHolder.h +++ b/include/llvm/ValueHolder.h @@ -90,6 +90,12 @@ public: void remove(ValueSubclass *D); // Defined in ValueHolderImpl.h ValueSubclass *pop_back(); // Defined in ValueHolderImpl.h + // replaceWith - This removes the element pointed to by 'Where', and inserts + // NewValue in it's place. The old value is returned. 'Where' must be a + // valid iterator! + // + ValueSubclass *replaceWith(iterator &Where, ValueSubclass *NewValue); + // delete_span - Remove the elements from begin to end, deleting them as we // go. This leaves the iterator pointing to the element that used to be end. // diff --git a/lib/VMCore/ValueHolderImpl.h b/lib/VMCore/ValueHolderImpl.h index 411e2b44664..cbc3e5f5588 100644 --- a/lib/VMCore/ValueHolderImpl.h +++ b/lib/VMCore/ValueHolderImpl.h @@ -82,7 +82,7 @@ template ValueSubclass *ValueHolder ::remove(const iterator &DI) { assert(DI != ValueList.end() && - "Trying to remove the end of the def list!!!"); + "Trying to remove the end of the value holder list!!!"); ValueSubclass *i = *DI; ValueList.erase(DI); @@ -96,6 +96,32 @@ ValueSubclass *ValueHolder return i; } +template +ValueSubclass *ValueHolder +::replaceWith(iterator &DI, ValueSubclass *NewVal) { + assert(DI != ValueList.end() && + "Trying to replace the end of the value holder list!!!"); + + // Remove the value from the current container... + ValueSubclass *Ret = *DI; + Ret->setParent(0); // I don't own you anymore... byebye... + + // You don't get to be in the symbol table anymore... byebye + if (Ret->hasName() && Parent) + Parent->getSymbolTable()->remove(Ret); + + // Insert the new value into the container... + assert(NewVal->getParent() == 0 && "Value already has parent!"); + NewVal->setParent(ItemParent); + + *DI = NewVal; + if (NewVal->hasName() && Parent) + Parent->getSymbolTableSure()->insert(NewVal); + + return Ret; +} + + template void ValueHolder ::push_front(ValueSubclass *Inst) {