[PATCH] D28088: MetadataLoader: simplify old type ref upgrade by removing a redundant set (NFC)

Duncan P. N. Exon Smith via llvm-commits llvm-commits at lists.llvm.org
Sat Dec 24 05:21:48 PST 2016


I don't think this is correct.  It's subtle and there should really be a testcase (I'm sorry I failed to provide one).

Note the behaviour change in the following scenario:
- 1st translation unit has a fwd ref DICompositeType (!1).
- 2nd translation unit has a full DICompositeType (!2).
- 3rd translation unit has a full DICompositeType (!3).

In the code in ToT:
- !1 gets inserted into FwdRefs.
- !2 gets inserted into Final.
- !3 gets ignored.

With your change, I believe:
- !1 gets inserted into Final.
- !2 gets ignored.
- !3 gets ignored.

It's important that !2, the first non-fwd-ref DICompositeType, is the one that we keep (that "wins").

It shouldn't be too hard to make a testcase.  I suggest:
- Three translation units.
- Each one has a single DICompositeType referenced from a named MD node you make up.
- uuid: "id"
- name: "forward", "winner", and "loser" (for the three)

Should be easy to write a FileCheck against that.


> On 2016-Dec-24, at 01:18, Mehdi AMINI via Phabricator <reviews at reviews.llvm.org> wrote:
> 
> mehdi_amini created this revision.
> mehdi_amini added reviewers: pcc, dexonsmith.
> mehdi_amini added a subscriber: llvm-commits.
> 
> I'm still trying to understand the logic, hopefully this is correct
> (at least the validation is still passing).
> 
> 
> https://reviews.llvm.org/D28088
> 
> Files:
>  llvm/lib/Bitcode/Reader/MetadataLoader.cpp
> 
> 
> Index: llvm/lib/Bitcode/Reader/MetadataLoader.cpp
> ===================================================================
> --- llvm/lib/Bitcode/Reader/MetadataLoader.cpp
> +++ llvm/lib/Bitcode/Reader/MetadataLoader.cpp
> @@ -120,7 +120,6 @@
>   struct {
>     SmallDenseMap<MDString *, TempMDTuple, 1> Unknown;
>     SmallDenseMap<MDString *, DICompositeType *, 1> Final;
> -    SmallDenseMap<MDString *, DICompositeType *, 1> FwdDecls;
>     SmallVector<std::pair<TrackingMDRef, TempMDTuple>, 1> Arrays;
>   } OldTypeRefs;
> 
> @@ -246,11 +245,6 @@
> 
>   bool DidReplaceTypeRefs = false;
> 
> -  // Give up on finding a full definition for any forward decls that remain.
> -  for (const auto &Ref : OldTypeRefs.FwdDecls)
> -    OldTypeRefs.Final.insert(Ref);
> -  OldTypeRefs.FwdDecls.clear();
> -
>   // Upgrade from old type ref arrays.  In strange cases, this could add to
>   // OldTypeRefs.Unknown.
>   for (const auto &Array : OldTypeRefs.Arrays) {
> @@ -302,10 +296,7 @@
> void BitcodeReaderMetadataList::addTypeRef(MDString &UUID,
>                                            DICompositeType &CT) {
>   assert(CT.getRawIdentifier() == &UUID && "Mismatched UUID");
> -  if (CT.isForwardDecl())
> -    OldTypeRefs.FwdDecls.insert(std::make_pair(&UUID, &CT));
> -  else
> -    OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
> +  OldTypeRefs.Final.insert(std::make_pair(&UUID, &CT));
> }
> 
> Metadata *BitcodeReaderMetadataList::upgradeTypeRef(Metadata *MaybeUUID) {
> 
> 
> <D28088.82432.patch>



More information about the llvm-commits mailing list