[llvm] r263379 - Fixed DIBuilder to verify that same imported entity will not be added twice to the "imports" list of the DICompileUnit.

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Mon Apr 18 07:09:39 PDT 2016


> On 2016-Apr-18, at 06:12, Aboud, Amjad <amjad.aboud at intel.com> wrote:
> 
> We thought about this direction by then too, but SetVector does implement the function emplace_back.
> If you have an idea on how to make it work with a simple change of the " AllImportedModules" container type, it would be great.

Ah, right; TrackingMDNodeRef isn't stable in value so it doesn't
belong in a DenseSet, etc.

Did you consider filtering them in DIBuilder::finalize?
--
  SmallPtrSet<const Metadata *, 16> AlreadyImported;
  std::remove_if(AllImportedModules.begin(), AllImportedModules.end(),
      [&AlreadyImported](const TrackingMDNodeRef &Ref) {
        return !AlreadyImported.insert(Ref.get()).second;
      });
--

> 
> Thanks,
> Amjad
> 
> 
>> -----Original Message-----
>> From: dexonsmith at apple.com [mailto:dexonsmith at apple.com]
>> Sent: Monday, April 18, 2016 09:18
>> To: Aboud, Amjad <amjad.aboud at intel.com>
>> Cc: llvm-commits <llvm-commits at lists.llvm.org>; hintonda at gmail.com; David
>> Blaikie <dblaikie at gmail.com>
>> Subject: Re: [llvm] r263379 - Fixed DIBuilder to verify that same imported entity
>> will not be added twice to the "imports" list of the DICompileUnit.
>> 
>> 
>>> On 2016-Mar-13, at 04:11, Amjad Aboud via llvm-commits <llvm-
>> commits at lists.llvm.org> wrote:
>>> 
>>> Author: aaboud
>>> Date: Sun Mar 13 06:11:39 2016
>>> New Revision: 263379
>>> 
>>> URL: http://llvm.org/viewvc/llvm-project?rev=263379&view=rev
>>> Log:
>>> Fixed DIBuilder to verify that same imported entity will not be added twice to
>> the "imports" list of the DICompileUnit.
>> 
>> I don't like that this peeks into the LLVMContext, and it doesn't seem like it's
>> correct.  See below.  (Sorry for missing this when it went
>> by.)
>> 
>>> 
>>> Differential Revision: http://reviews.llvm.org/D17884
>>> 
>>> Modified:
>>>   llvm/trunk/lib/IR/DIBuilder.cpp
>>>   llvm/trunk/unittests/IR/IRBuilderTest.cpp
>>> 
>>> Modified: llvm/trunk/lib/IR/DIBuilder.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?re
>>> v=263379&r1=263378&r2=263379&view=diff
>>> 
>> =================================================================
>> =====
>>> ========
>>> --- llvm/trunk/lib/IR/DIBuilder.cpp (original)
>>> +++ llvm/trunk/lib/IR/DIBuilder.cpp Sun Mar 13 06:11:39 2016
>>> @@ -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<TrackingMDNodeRef>
>>> &AllImportedModules) {
>>> +  unsigned EntitiesCount = C.pImpl->DIImportedEntitys.size();
>>>  auto *M = DIImportedEntity::get(C, Tag, Context, DINodeRef(NS),
>>> Line, Name);
>> 
>> What if `M` isn't a new node because some other llvm::Module (or even a
>> different llvm::DIBuilder instance in the same llvm::Module) has added a
>> structurally equivalent DIImportedEntity?  You would still need it in
>> AllImportedModules, right?  But this logic won't do that.
>> 
>>> -  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);
>> 
>> I think you just want to change AllImportedModules to a SetVector so that
>> they're uniqued on insert.
>> 
>>>  return M;
>>> }
>>> 
>>> 
>>> Modified: llvm/trunk/unittests/IR/IRBuilderTest.cpp
>>> URL:
>>> http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/IRBuilderT
>>> est.cpp?rev=263379&r1=263378&r2=263379&view=diff
>>> 
>> =================================================================
>> =====
>>> ========
>>> --- llvm/trunk/unittests/IR/IRBuilderTest.cpp (original)
>>> +++ llvm/trunk/unittests/IR/IRBuilderTest.cpp Sun Mar 13 06:11:39 2016
>>> @@ -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); }
>>> }
>>> 
>>> 
>>> _______________________________________________
>>> llvm-commits mailing list
>>> llvm-commits at lists.llvm.org
>>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
> 
> ---------------------------------------------------------------------
> Intel Israel (74) Limited
> 
> This e-mail and any attachments may contain confidential material for
> the sole use of the intended recipient(s). Any review or distribution
> by others is strictly prohibited. If you are not the intended
> recipient, please contact the sender and delete all copies.
> 



More information about the llvm-commits mailing list