DebugInfo: Use TempMDNode in DIDescriptor::replaceAllUsesWith()

Start using `TempMDNode` in `DIDescriptor::replaceAllUsesWith()`
(effectively `std::unique_ptr<MDNode, MDNode::deleteTemporary>`).

Besides making ownership more explicit, this prepares for when
`DIDescriptor` refers to nodes that are *not* `MDTuple`.  The old logic
for "replacing" a node with itself used `MDNode::get()` to return a new
(uniqued) `MDTuple`, while the new logic just defers to
`MDNode::replaceWithUniqued()` (which also typically saves an allocation
and RAUW traffic by mutating the temporary in place).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@230879 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-02-28 23:48:02 +00:00
parent be657e70b1
commit b3381acab2

View File

@ -376,35 +376,31 @@ bool DIDescriptor::isExpression() const {
// Simple Descriptor Constructors and other Methods
//===----------------------------------------------------------------------===//
void DIDescriptor::replaceAllUsesWith(LLVMContext &VMContext, DIDescriptor D) {
void DIDescriptor::replaceAllUsesWith(LLVMContext &, DIDescriptor D) {
assert(DbgNode && "Trying to replace an unverified type!");
assert(DbgNode->isTemporary() && "Expected temporary node");
TempMDNode Temp(get());
// Since we use a TrackingVH for the node, its easy for clients to manufacture
// legitimate situations where they want to replaceAllUsesWith() on something
// which, due to uniquing, has merged with the source. We shield clients from
// this detail by allowing a value to be replaced with replaceAllUsesWith()
// itself.
const MDNode *DN = D;
if (DbgNode == DN) {
SmallVector<Metadata *, 10> Ops(DbgNode->op_begin(), DbgNode->op_end());
DN = MDNode::get(VMContext, Ops);
if (Temp.get() == D.get()) {
DbgNode = MDNode::replaceWithUniqued(std::move(Temp));
return;
}
assert(DbgNode->isTemporary() && "Expected temporary node");
auto *Node = const_cast<MDNode *>(DbgNode);
Node->replaceAllUsesWith(const_cast<MDNode *>(DN));
MDNode::deleteTemporary(Node);
DbgNode = DN;
Temp->replaceAllUsesWith(D.get());
DbgNode = D.get();
}
void DIDescriptor::replaceAllUsesWith(MDNode *D) {
assert(DbgNode && "Trying to replace an unverified type!");
assert(DbgNode != D && "This replacement should always happen");
assert(DbgNode->isTemporary() && "Expected temporary node");
auto *Node = const_cast<MDNode *>(DbgNode);
TempMDNode Node(get());
Node->replaceAllUsesWith(D);
MDNode::deleteTemporary(Node);
}
bool DICompileUnit::Verify() const {