From 23289c385abf6bcd80251ca2197d07ff2644de1f Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Mon, 24 Jan 2011 03:18:24 +0000 Subject: fix PR9015, a crash linking recursive metadata. llvm-svn: 124099 --- llvm/lib/Transforms/Utils/ValueMapper.cpp | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) (limited to 'llvm/lib/Transforms') diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index 132c3920397..f5481d31eb8 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -38,15 +38,16 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, if (!MD->isFunctionLocal() && (Flags & RF_NoModuleLevelChanges)) return VM[V] = const_cast(V); + // Create a dummy node in case we have a metadata cycle. + MDNode *Dummy = MDNode::getTemporary(V->getContext(), 0, 0); + VM[V] = Dummy; + // Check all operands to see if any need to be remapped. for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) { Value *OP = MD->getOperand(i); if (OP == 0 || MapValue(OP, VM, Flags) == OP) continue; - // Ok, at least one operand needs remapping. Create a dummy node in case - // we have a metadata cycle. - MDNode *Dummy = MDNode::getTemporary(V->getContext(), 0, 0); - VM[V] = Dummy; + // Ok, at least one operand needs remapping. SmallVector Elts; Elts.reserve(MD->getNumOperands()); for (i = 0; i != e; ++i) { @@ -55,12 +56,16 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, } MDNode *NewMD = MDNode::get(V->getContext(), Elts.data(), Elts.size()); Dummy->replaceAllUsesWith(NewMD); + VM[V] = NewMD; MDNode::deleteTemporary(Dummy); - return VM[V] = NewMD; + return NewMD; } + VM[V] = const_cast(V); + MDNode::deleteTemporary(Dummy); + // No operands needed remapping. Use an identity mapping. - return VM[V] = const_cast(V); + return const_cast(V); } // Okay, this either must be a constant (which may or may not be mappable) or -- cgit v1.2.3