diff options
author | David Blaikie <dblaikie@gmail.com> | 2013-08-28 17:28:16 +0000 |
---|---|---|
committer | David Blaikie <dblaikie@gmail.com> | 2013-08-28 17:28:16 +0000 |
commit | 13fc7448b7386369c4cbc1c25fec208cff29642e (patch) | |
tree | 5a444840eda8c258f8fd3fdbfab522cf232c037c /llvm/lib/IR/DebugInfo.cpp | |
parent | fae219a033656506d0c8cea62e22036d68b4bf6a (diff) | |
download | bcm5719-llvm-13fc7448b7386369c4cbc1c25fec208cff29642e.tar.gz bcm5719-llvm-13fc7448b7386369c4cbc1c25fec208cff29642e.zip |
PR16995: DebugInfo: Don't overwrite existing member lists when adding template arguments
With the added debug assertions this fix is covered by existing Clang
tests. (& found some other issues, also fixed)
llvm-svn: 189495
Diffstat (limited to 'llvm/lib/IR/DebugInfo.cpp')
-rw-r--r-- | llvm/lib/IR/DebugInfo.cpp | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/llvm/lib/IR/DebugInfo.cpp b/llvm/lib/IR/DebugInfo.cpp index 8fad393e5ae..8e062a03257 100644 --- a/llvm/lib/IR/DebugInfo.cpp +++ b/llvm/lib/IR/DebugInfo.cpp @@ -655,7 +655,24 @@ void DICompositeType::setTypeArray(DIArray Elements, DIArray TParams) { "If you're setting the template parameters this should include a slot " "for that!"); TrackingVH<MDNode> N(*this); - N->replaceOperandWith(10, Elements); + if (Elements) { +#ifndef NDEBUG + // Check that we're not dropping any elements on the floor here + if (const MDNode *El = cast_or_null<MDNode>(N->getOperand(10))) { + for (unsigned i = 0; i != El->getNumOperands(); ++i) { + if (i == 0 && isa<ConstantInt>(El->getOperand(i))) + continue; + const MDNode *E = cast<MDNode>(El->getOperand(i)); + bool found = false; + for (unsigned j = 0; !found && j != Elements.getNumElements(); ++j) { + found = E == Elements.getElement(j); + } + assert(found && "Losing a member during member list replacement"); + } + } +#endif + N->replaceOperandWith(10, Elements); + } if (TParams) N->replaceOperandWith(13, TParams); DbgNode = N; |