From 62f6f5cc80628d335728c6ba24a9c2d03e336d55 Mon Sep 17 00:00:00 2001 From: Amjad Aboud Date: Sun, 13 Mar 2016 11:11:39 +0000 Subject: [PATCH] Fixed DIBuilder to verify that same imported entity will not be added twice to the "imports" list of the DICompileUnit. Differential Revision: http://reviews.llvm.org/D17884 llvm-svn: 263379 --- llvm/lib/IR/DIBuilder.cpp | 7 ++++++- llvm/unittests/IR/IRBuilderTest.cpp | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/llvm/lib/IR/DIBuilder.cpp b/llvm/lib/IR/DIBuilder.cpp index b7841fe..f966c1d 100644 --- a/llvm/lib/IR/DIBuilder.cpp +++ b/llvm/lib/IR/DIBuilder.cpp @@ -19,6 +19,7 @@ #include "llvm/IR/Module.h" #include "llvm/Support/Debug.h" #include "llvm/Support/Dwarf.h" +#include "LLVMContextImpl.h" using namespace llvm; using namespace llvm::dwarf; @@ -168,8 +169,12 @@ static DIImportedEntity * createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context, Metadata *NS, unsigned Line, StringRef Name, SmallVectorImpl &AllImportedModules) { + unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size(); auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS), Line, Name); - AllImportedModules.emplace_back(M); + if (EntitiesCount < C.pImpl->DIImportedEntitys.size()) + // A new Imported Entity was just added to the context. + // Add it to the Imported Modules list. + AllImportedModules.emplace_back(M); return M; } diff --git a/llvm/unittests/IR/IRBuilderTest.cpp b/llvm/unittests/IR/IRBuilderTest.cpp index bd0eae0..6e4e829 100644 --- a/llvm/unittests/IR/IRBuilderTest.cpp +++ b/llvm/unittests/IR/IRBuilderTest.cpp @@ -418,4 +418,19 @@ TEST_F(IRBuilderTest, DebugLoc) { DIB.finalize(); } + +TEST_F(IRBuilderTest, DIImportedEntity) { + IRBuilder<> Builder(BB); + DIBuilder DIB(*M); + auto File = DIB.createFile("F.CBL", "/"); + auto CU = DIB.createCompileUnit(dwarf::DW_LANG_Cobol74, "F.CBL", "/", + "llvm-cobol74", true, "", 0); + auto IE1 = DIB.createImportedDeclaration(CU, nullptr, 1); + auto IE2 = DIB.createImportedDeclaration(CU, nullptr, 1); + auto IE3 = DIB.createImportedModule(CU, (DIImportedEntity*)nullptr, 2); + auto IE4 = DIB.createImportedModule(CU, (DIImportedEntity*)nullptr, 2); + DIB.finalize(); + EXPECT_TRUE(verifyModule(*M)); + EXPECT_TRUE(CU->getImportedEntities().size() == 2); +} } -- 2.7.4