[PATCH] D13023: [Bug 21683 relative] - Refactor of SimpleDefinedAtom::sortReferences()

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Mon Sep 21 11:17:06 PDT 2015


Is the indentation correct?

On Mon, Sep 21, 2015 at 8:07 AM, George Rimar <grimar at accesssoftek.com>
wrote:

> grimar created this revision.
> grimar added reviewers: ruiu, kledzik.
> grimar added subscribers: grimar, llvm-commits.
> grimar set the repository for this revision to rL LLVM.
> grimar added a project: lld.
>
> I spent some time on investigating
> https://llvm.org/bugs/show_bug.cgi?id=21683
> It looks already fixed in r223528 which switched SimpleDefinedAtom to
> allocate its SimpleReferences using the BumpPtrAllocator.
>
> The only thing that does not look good for me is that
> SimpleDefinedAtom::sortReferences()
> method uses temp SmallVector for copying into and sorting the ilist
> content and after that recreates the list again.
> Since r247978 introduced ilist::sort I suggest the patch to use it.
>
> Anyways I believe bug 21683 can be closed with this patch or without as
> fixed.
>
> Repository:
>   rL LLVM
>
> http://reviews.llvm.org/D13023
>
> Files:
>   Simple.h
>
> Index: Simple.h
> ===================================================================
> --- Simple.h
> +++ Simple.h
> @@ -175,10 +175,23 @@
>    }
>
>    lld::SimpleReference *createSentinel() const {
> +       // absence of allocator generally is not an issue. That might be
> useful for
> +       // ilists of SimpleReferences created as temporatily local objects.
> +       // They dont need to be allocated via BumpPtrAllocator
> +       if (!_allocator) {
> +               return new lld::SimpleReference();
> +       }
> +
>      return new (*_allocator) lld::SimpleReference();
>    }
>
> -  static void destroySentinel(lld::SimpleReference*) {}
> +  void destroySentinel(lld::SimpleReference *sentinel) {
> +       // the same situation as described above in createSentinel()
> +       // there is no BumpPtrAllocator allocator sometimes and its fine.
> +       if (!_allocator) {
> +               delete sentinel;
> +       }
> +  }
>

I'd allocate the sentinel without the allocator. This code leaks the
sentinel if you set an allocator after a sentinel is allocated without the
allocator.

   static lld::SimpleReference *provideInitialHead() { return nullptr; }
>
> @@ -267,28 +280,17 @@
>
>    /// Sort references in a canonical order (by offset, then by kind).
>    void sortReferences() const {
> -    // Cannot sort a linked  list, so move elements into a temporary
> vector,
> -    // sort the vector, then reconstruct the list.
> -    llvm::SmallVector<SimpleReference *, 16> elements;
> -    for (SimpleReference &node : _references) {
> -      elements.push_back(&node);
> -    }
> -    std::sort(elements.begin(), elements.end(),
> -        [] (const SimpleReference *lhs, const SimpleReference *rhs) ->
> bool {
> -          uint64_t lhsOffset = lhs->offsetInAtom();
> -          uint64_t rhsOffset = rhs->offsetInAtom();
> -          if (rhsOffset != lhsOffset)
> -            return (lhsOffset < rhsOffset);
> -          if (rhs->kindNamespace() != lhs->kindNamespace())
> -            return (lhs->kindNamespace() < rhs->kindNamespace());
> -          if (rhs->kindArch() != lhs->kindArch())
> -            return (lhs->kindArch() < rhs->kindArch());
> -          return (lhs->kindValue() < rhs->kindValue());
> -        });
> -    _references.clearAndLeakNodesUnsafely();
> -    for (SimpleReference *node : elements) {
> -      _references.push_back(node);
> -    }
> +       _references.sort([](SimpleReference &lhs, SimpleReference &rhs) ->
> bool {
> +               uint64_t lhsOffset = lhs.offsetInAtom();
> +               uint64_t rhsOffset = rhs.offsetInAtom();
> +               if (rhsOffset != lhsOffset)
> +                       return (lhsOffset < rhsOffset);
> +               if (rhs.kindNamespace() != lhs.kindNamespace())
> +                       return (lhs.kindNamespace() < rhs.kindNamespace());
> +               if (rhs.kindArch() != lhs.kindArch())
> +                       return (lhs.kindArch() < rhs.kindArch());
> +               return (lhs.kindValue() < rhs.kindValue());
> +       });
>    }
>    void setOrdinal(uint64_t ord) { _ordinal = ord; }
>
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150921/3267ab98/attachment.html>


More information about the llvm-commits mailing list