[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:15:06 PDT 2016


> On 2016-Apr-18, at 07:09, Duncan P. N. Exon Smith via llvm-commits <llvm-commits at lists.llvm.org> wrote:
> 
> 
>> 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;
>      });
> --

Or just filter them directly into the ops vector:
--
  SmallVector<const Metadata *, 16> Ops;
  SmallPtrSet<const Metadata *, 16> AlreadyImported;
  std::remove_copy_if(AllImportedModules.begin(), AllImportedModules.end(),
                      std::back_inserter(Ops),
      [&AlreadyImported](const TrackingMDNodeRef &Ref) {
        return !AlreadyImported.insert(Ref.get()).second;
      });
  MDTuple *Imports = Ops.empty() ? nullptr : MDTuple::get(Context, Ops);    
--

> 
>> 
>> 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.
>> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits



More information about the llvm-commits mailing list