diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-16 21:21:10 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-03-16 21:21:10 +0000 |
commit | 3d510665e98e12838abf8b949c96191bbe2b3935 (patch) | |
tree | 2f51813258ff557df11ba8891ccf8e61f14e928a | |
parent | b786572d7c039e75bd6c285dfec4b3ac0056e1fc (diff) | |
download | bcm5719-llvm-3d510665e98e12838abf8b949c96191bbe2b3935.tar.gz bcm5719-llvm-3d510665e98e12838abf8b949c96191bbe2b3935.zip |
AsmWriter: Handle broken metadata nodes
Print out temporary `MDNode`s so we don't crash in the verifier (or
during `dump()` output).
llvm-svn: 232417
-rw-r--r-- | llvm/lib/IR/AsmWriter.cpp | 4 | ||||
-rw-r--r-- | llvm/unittests/IR/MetadataTest.cpp | 16 |
2 files changed, 18 insertions, 2 deletions
diff --git a/llvm/lib/IR/AsmWriter.cpp b/llvm/lib/IR/AsmWriter.cpp index ea6822052d0..fb23c7e436a 100644 --- a/llvm/lib/IR/AsmWriter.cpp +++ b/llvm/lib/IR/AsmWriter.cpp @@ -1916,10 +1916,10 @@ static void WriteMDNodeBodyInternal(raw_ostream &Out, const MDNode *Node, TypePrinting *TypePrinter, SlotTracker *Machine, const Module *Context) { - assert(!Node->isTemporary() && "Unexpected forward declaration"); - if (Node->isDistinct()) Out << "distinct "; + else if (Node->isTemporary()) + Out << "<temporary!> "; // Handle broken code. switch (Node->getMetadataID()) { default: diff --git a/llvm/unittests/IR/MetadataTest.cpp b/llvm/unittests/IR/MetadataTest.cpp index 12fa392312b..70ce2946af1 100644 --- a/llvm/unittests/IR/MetadataTest.cpp +++ b/llvm/unittests/IR/MetadataTest.cpp @@ -251,6 +251,22 @@ TEST_F(MDNodeTest, Print) { EXPECT_EQ(Expected_, Actual_); \ } while (false) +TEST_F(MDNodeTest, PrintTemporary) { + MDNode *Arg = getNode(); + TempMDNode Temp = MDNode::getTemporary(Context, Arg); + MDNode *N = getNode(Temp.get()); + Module M("test", Context); + NamedMDNode *NMD = M.getOrInsertNamedMetadata("named"); + NMD->addOperand(N); + + EXPECT_PRINTER_EQ("!0 = !{!1}", N->print(OS, &M)); + EXPECT_PRINTER_EQ("!1 = <temporary!> !{!2}", Temp->print(OS, &M)); + EXPECT_PRINTER_EQ("!2 = !{}", Arg->print(OS, &M)); + + // Cleanup. + Temp->replaceAllUsesWith(Arg); +} + TEST_F(MDNodeTest, PrintFromModule) { Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 7); MDString *S = MDString::get(Context, "foo"); |