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

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Fri Dec 4 11:12:20 PST 2015


On Wed, Dec 2, 2015 at 2:04 PM, Teresa Johnson <tejohnson at google.com> wrote:
> 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.

Turning this into normal Metadata* instead of TrackingMDRef works
fine. I will update the patch with the modified version. I still need
to address Mehdi's comments, that will be in the next round.

>
>>
>>> +  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.

I have this part ready with a unittest. Do you want to review that
separately, or should I just commit it?

>
>>
>>> +    return getTemporary(getContext(), getLine(), getColumn(), getRawScope(),
>>> +                        getRawInlinedAt());
>>>    }
>>>
>>>    // Disallow replacing operands.
>>>
>>
>
>
>
> --
> Teresa Johnson | Software Engineer | tejohnson at google.com | 408-460-2413



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


More information about the llvm-commits mailing list