diff options
-rw-r--r-- | include/llvm/ValueHolder.h | 6 | ||||
-rw-r--r-- | lib/VMCore/ValueHolderImpl.h | 28 |
2 files changed, 33 insertions, 1 deletions
diff --git a/include/llvm/ValueHolder.h b/include/llvm/ValueHolder.h index 905b2ad326..6e251ff5c1 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 411e2b4466..cbc3e5f558 100644 --- a/lib/VMCore/ValueHolderImpl.h +++ b/lib/VMCore/ValueHolderImpl.h @@ -82,7 +82,7 @@ template<class ValueSubclass, class ItemParentType, class SymTabType> ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType> ::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); @@ -97,6 +97,32 @@ ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType> } template<class ValueSubclass, class ItemParentType, class SymTabType> +ValueSubclass *ValueHolder<ValueSubclass,ItemParentType,SymTabType> +::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<class ValueSubclass, class ItemParentType, class SymTabType> void ValueHolder<ValueSubclass,ItemParentType,SymTabType> ::push_front(ValueSubclass *Inst) { assert(Inst->getParent() == 0 && "Value already has parent!"); |