[PATCH] D14838: [ThinLTO] Metadata linking for imported functions

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Wed Dec 2 14:04:30 PST 2015


On Tue, Dec 1, 2015 at 5:11 PM, Duncan P. N. Exon Smith
<dexonsmith at apple.com> wrote:
>
>> On 2015-Nov-30, at 07:05, Teresa Johnson <tejohnson at google.com> wrote:
>>
>> tejohnson added a comment.
>>
>> Ping.
>> Thanks, Teresa
>>
>>
>> http://reviews.llvm.org/D14838
>
> Thanks for working on this, and sorry for the delay.
>
> I was looking at the patch bottom-up and came across a major issue, so
> I've stopped reviewing at `TrackingMDRef`.  Once you've got that solved
> I can look again at the updated patch.  However, it's quite big, so if
> you can possibly split out the uninteresting/separable bits that would
> be helpful.

Thanks for the comments. Response below. Will look for places to split
out some of the simpler stuff that can go in separately.

>
>> Index: include/llvm/IR/TrackingMDRef.h
>> ===================================================================
>> --- include/llvm/IR/TrackingMDRef.h
>> +++ include/llvm/IR/TrackingMDRef.h
>> @@ -14,6 +14,7 @@
>>  #ifndef LLVM_IR_TRACKINGMDREF_H
>>  #define LLVM_IR_TRACKINGMDREF_H
>>
>> +#include "llvm/ADT/DenseMapInfo.h"
>>  #include "llvm/IR/MetadataTracking.h"
>>  #include "llvm/Support/Casting.h"
>>
>> @@ -81,17 +82,24 @@
>>    bool operator!=(const TrackingMDRef &X) const { return MD != X.MD; }
>>
>>  private:
>> +  /// Enabler for DenseMapInfo of TrackingMDRefs, ensure the MD is non-null
>> +  /// and not a special DenseMapInfo key.
>
> I don't think `TrackingMDRef` is appropriate as a `DenseMap<>` key.  Its
> value can change to another arbitrary value.  If that happens, the
> associated `DenseMapEntry` will have the wrong hash, and the table will
> be invalid.
>
> As I mentioned above, I was reading the patch from the bottom, so I'm
> not quite sure where you're actually using this... but I'd be happy to
> discuss other possible solutions.

I remember thinking I wanted to record the TrackingMDRef, but looking
through the code I think things changed enough that I just want/need
the Metadata pointer. I am not running into issues because nothing is
changing on the TrackingMDRef between when I record it and use it. But
that also points to not needing the TrackingMDRef. Will take a look at
changing this part, along with addressing Mehdi's comments.

>
>> +  bool isValid() {
>> +    return MD && MD != DenseMapInfo<Metadata *>::getEmptyKey() &&
>> +           MD != DenseMapInfo<Metadata *>::getTombstoneKey();
>> +  }
>> +
>>    void track() {
>> -    if (MD)
>> +    if (isValid())
>>        MetadataTracking::track(MD);
>>    }
>>    void untrack() {
>> -    if (MD)
>> +    if (isValid())
>>        MetadataTracking::untrack(MD);
>>    }
>>    void retrack(TrackingMDRef &X) {
>>      assert(MD == X.MD && "Expected values to match");
>> -    if (X.MD) {
>> +    if (X.isValid()) {
>>        MetadataTracking::retrack(X.MD, MD);
>>        X.MD = nullptr;
>>      }
>> @@ -165,6 +173,22 @@
>>    }
>>  };
>>
>> +/// Provide DenseMapInfo for TrackingMDRefs.
>> +template <> struct DenseMapInfo<TrackingMDRef> {
>> +  static inline TrackingMDRef getEmptyKey() {
>> +    return TrackingMDRef(DenseMapInfo<Metadata *>::getEmptyKey());
>> +  }
>> +  static inline TrackingMDRef getTombstoneKey() {
>> +    return TrackingMDRef(DenseMapInfo<Metadata *>::getTombstoneKey());
>> +  }
>> +  static unsigned getHashValue(const TrackingMDRef Val) {
>> +    return DenseMapInfo<Metadata *>::getHashValue(Val.get());
>> +  }
>> +  static bool isEqual(const TrackingMDRef LHS, const TrackingMDRef RHS) {
>> +    return LHS == RHS;
>> +  }
>> +};
>> +
>>  } // end namespace llvm
>>
>>  #endif
>> Index: include/llvm/IR/DebugInfoMetadata.h
>> ===================================================================
>> --- include/llvm/IR/DebugInfoMetadata.h
>> +++ include/llvm/IR/DebugInfoMetadata.h
>> @@ -1118,8 +1118,11 @@
>>    }
>>
>>    TempDILocation cloneImpl() const {
>
> This seems possible to split out and test with a C++ unit test.

Ok.

>
>> -    return getTemporary(getContext(), getLine(), getColumn(), getScope(),
>> -                        getInlinedAt());
>> +    // Get the raw scope/inlinedAt since it is possible to invoke this on
>> +    // a DILocation containing temporary metadata. Specifically, this happens
>> +    // when we are linking metadata as a postpass after function importing.
>
> I think this comment belongs in the commit message, as once the code is
> committed we'll grow more uses of it.  The C++ unit test should be
> enough to prevent tampering.

Will do. I am thinking of leaving the first sentence (to explain why
this code is different from the rest of the subclasses which use
getScope, but will remove the second.

>
>> +    return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
>> +                        getRawInlinedAt());
>>    }
>>
>>    // Disallow replacing operands.
>>
>



-- 
Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413


More information about the llvm-commits mailing list