From bee74a3ad49392686025eb267e19d30ca78aec30 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Mon, 16 Mar 2015 21:21:10 +0000 Subject: [PATCH] AsmWriter: Handle broken metadata nodes Print out temporary `MDNode`s so we don't crash in the verifier (or during `dump()` output). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@232417 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/IR/AsmWriter.cpp | 4 ++-- unittests/IR/MetadataTest.cpp | 16 ++++++++++++++++ 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index ea6822052d0..fb23c7e436a 100644 --- a/lib/IR/AsmWriter.cpp +++ b/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 << " "; // Handle broken code. switch (Node->getMetadataID()) { default: diff --git a/unittests/IR/MetadataTest.cpp b/unittests/IR/MetadataTest.cpp index 12fa392312b..70ce2946af1 100644 --- a/unittests/IR/MetadataTest.cpp +++ b/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 = !{!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"); -- 2.34.1