From: Mehdi Amini Date: Thu, 7 Jan 2016 20:14:30 +0000 (+0000) Subject: Fix crash when printing instructions that have a metadata attached but no parent. X-Git-Tag: android-x86-7.1-r4~39482 X-Git-Url: http://git.osdn.net/view?a=commitdiff_plain;h=f45267526ead95cb8aba903f97c03e031e069bd0;p=android-x86%2Fexternal-llvm.git Fix crash when printing instructions that have a metadata attached but no parent. Fix PR24852 (crash with -debug -instcombine) Patch by Than McIntosh Summary: Add guards to the asm writer to prevent crashing when dumping an instruction that has no basic block. Differential Revision: http://reviews.llvm.org/D15798 From: Than McIntosh git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@257094 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/IR/AsmWriter.cpp b/lib/IR/AsmWriter.cpp index 1ebe9b7ee5b..0ce44e105cc 100644 --- a/lib/IR/AsmWriter.cpp +++ b/lib/IR/AsmWriter.cpp @@ -3121,7 +3121,7 @@ void AssemblyWriter::printMetadataAttachments( return; if (MDNames.empty()) - TheModule->getMDKindNames(MDNames); + MDs[0].second->getContext().getMDKindNames(MDNames); for (const auto &I : MDs) { unsigned Kind = I.first; diff --git a/unittests/IR/AsmWriterTest.cpp b/unittests/IR/AsmWriterTest.cpp new file mode 100644 index 00000000000..c7e7bb5c9f0 --- /dev/null +++ b/unittests/IR/AsmWriterTest.cpp @@ -0,0 +1,37 @@ +//===- llvm/unittest/IR/AsmWriter.cpp - AsmWriter tests -------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +#include "llvm/IR/IRBuilder.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/LLVMContext.h" +#include "llvm/IR/MDBuilder.h" +#include "llvm/IR/Module.h" +#include "gtest/gtest.h" + +using namespace llvm; + +namespace { + +TEST(AsmWriterTest, DebugPrintDetachedInstruction) { + + // PR24852: Ensure that an instruction can be printed even when it + // has metadata attached but no parent. + LLVMContext Ctx; + auto Ty = Type::getInt32Ty(Ctx); + auto Undef = UndefValue::get(Ty); + std::unique_ptr Add(BinaryOperator::CreateAdd(Undef, Undef)); + Add->setMetadata( + "", MDNode::get(Ctx, {ConstantAsMetadata::get(ConstantInt::get(Ty, 1))})); + std::string S; + raw_string_ostream OS(S); + Add->print(OS); + std::size_t r = OS.str().find(" = add i32 undef, undef, !