IR: Update references to temporaries before deleting
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 22 Jan 2015 21:36:45 +0000 (21:36 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Thu, 22 Jan 2015 21:36:45 +0000 (21:36 +0000)
commit8d536973a22ef1ad5c4ff1a120633cc028313f57
treed00d040d337f45f0232b955d20d2966b7d3ceab7
parentc6ccc4fe91b8f1bc5251b454ac1f6c79a6177c8b
IR: Update references to temporaries before deleting

During `MDNode::deleteTemporary()`, call `replaceAllUsesWith(nullptr)`
to update all tracking references to `nullptr`.

This fixes PR22280, where inverted destruction order between tracking
references and the temporaries themselves caused a use-after-free in
`LLParser`.

An alternative fix would be to add an assertion that there are no users,
and continue to fix inverted destruction order in clients (like
`LLParser`), but instead I decided to make getting-teardown-right easy.
(If someone disagrees let me know.)

llvm-svn: 226866
llvm/include/llvm/IR/Metadata.h
llvm/lib/IR/Metadata.cpp
llvm/test/Assembler/invalid-mdnode-badref.ll [new file with mode: 0644]
llvm/unittests/IR/MetadataTest.cpp