From: Duncan P. N. Exon Smith <dexonsmith@apple.com> Date: Sat, 11 Apr 2015 19:04:09 +0000 (+0000) Subject: DebugInfo: Introduce DIBuilder::replaceTemporary() X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=9b30c7bd3839553e104553b014dcf0812c405b4a;p=oota-llvm.git DebugInfo: Introduce DIBuilder::replaceTemporary() Add `DIBuilder::replaceTemporary()` as a replacement for `DIDescriptor::replaceAllUsesWith()`. I'll update clang to use the new method, and then come back to delete the original. This method dispatches to `replaceAllUsesWith()` or `replaceWithUniqued()`, depending on whether the replacement is actually a different node from the original. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@234695 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/IR/DIBuilder.h b/include/llvm/IR/DIBuilder.h index eb5cdd60427..ac82947741c 100644 --- a/include/llvm/IR/DIBuilder.h +++ b/include/llvm/IR/DIBuilder.h @@ -701,6 +701,23 @@ namespace llvm { /// resolve cycles. void replaceArrays(DICompositeType &T, DIArray Elements, DIArray TParems = DIArray()); + + /// \brief Replace a temporary node. + /// + /// Call \a MDNode::replaceAllUsesWith() on \c N, replacing it with \c + /// Replacement. + /// + /// If \c Replacement is the same as \c N.get(), instead call \a + /// MDNode::replaceWithUniqued(). In this case, the uniqued node could + /// have a different address, so we return the final address. + template <class NodeTy> + NodeTy *replaceTemporary(TempMDNode &&N, NodeTy *Replacement) { + if (N.get() == Replacement) + return cast<NodeTy>(MDNode::replaceWithUniqued(std::move(N))); + + N->replaceAllUsesWith(Replacement); + return Replacement; + } }; } // end namespace llvm