<div dir="ltr">Addressed in r270572. But your comment made me wonder if we should do binary search rather than sequential search at the last position.</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, May 24, 2016 at 6:24 AM, Rafael Espíndola <span dir="ltr"><<a href="mailto:rafael.espindola@gmail.com" target="_blank">rafael.espindola@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">With this change we now scan every relocation for each cie. Before we<br>
use to use the fact that the relocations are sorted and not start from<br>
scratch. I measured a 2% performance regression when linking chromium<br>
with this.<br>
<br>
Cheers,<br>
Rafael<br>
<br>
<br>
On 21 May 2016 at 15:06, Rui Ueyama via llvm-commits<br>
<div class="HOEnZb"><div class="h5"><<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a>> wrote:<br>
> Author: ruiu<br>
> Date: Sat May 21 14:06:33 2016<br>
> New Revision: 270325<br>
><br>
> URL: <a href="http://llvm.org/viewvc/llvm-project?rev=270325&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project?rev=270325&view=rev</a><br>
> Log:<br>
> Split EHOutputSection<ELFT>::addSectionAux. NFC.<br>
><br>
> Modified:<br>
>     lld/trunk/ELF/OutputSections.cpp<br>
><br>
> Modified: lld/trunk/ELF/OutputSections.cpp<br>
> URL: <a href="http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=270325&r1=270324&r2=270325&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=270325&r1=270324&r2=270325&view=diff</a><br>
> ==============================================================================<br>
> --- lld/trunk/ELF/OutputSections.cpp (original)<br>
> +++ lld/trunk/ELF/OutputSections.cpp Sat May 21 14:06:33 2016<br>
> @@ -1114,6 +1114,19 @@ static typename ELFT::uint readEntryLeng<br>
>    return Len;<br>
>  }<br>
><br>
> +// Returns the first relocation that points to a region<br>
> +// between Begin and Begin+Size.<br>
> +template <class IntTy, class RelTy><br>
> +static const RelTy *getReloc(IntTy Begin, IntTy Size, ArrayRef<RelTy> Rels) {<br>
> +  size_t I = 0;<br>
> +  size_t E = Rels.size();<br>
> +  while (I != E && Rels[I].r_offset < Begin)<br>
> +    ++I;<br>
> +  if (I == E || Begin + Size <= Rels[I].r_offset)<br>
> +    return nullptr;<br>
> +  return &Rels[I];<br>
> +}<br>
> +<br>
>  template <class ELFT><br>
>  template <class RelTy><br>
>  void EHOutputSection<ELFT>::addSectionAux(EHInputSection<ELFT> *S,<br>
> @@ -1127,8 +1140,6 @@ void EHOutputSection<ELFT>::addSectionAu<br>
>    ArrayRef<uint8_t> SecData = S->getSectionData();<br>
>    ArrayRef<uint8_t> D = SecData;<br>
>    uintX_t Offset = 0;<br>
> -  auto RelI = Rels.begin();<br>
> -  auto RelE = Rels.end();<br>
><br>
>    DenseMap<unsigned, unsigned> OffsetToIndex;<br>
>    while (!D.empty()) {<br>
> @@ -1142,11 +1153,6 @@ void EHOutputSection<ELFT>::addSectionAu<br>
>        break;<br>
>      StringRef Entry((const char *)D.data(), Length);<br>
><br>
> -    while (RelI != RelE && RelI->r_offset < Offset)<br>
> -      ++RelI;<br>
> -    uintX_t NextOffset = Offset + Length;<br>
> -    bool HasReloc = RelI != RelE && RelI->r_offset < NextOffset;<br>
> -<br>
>      uint32_t ID = read32<E>(D.data() + 4);<br>
>      if (ID == 0) {<br>
>        // CIE<br>
> @@ -1155,8 +1161,8 @@ void EHOutputSection<ELFT>::addSectionAu<br>
>          C.FdeEncoding = getFdeEncoding(D);<br>
><br>
>        SymbolBody *Personality = nullptr;<br>
> -      if (HasReloc)<br>
> -        Personality = &S->getFile()->getRelocTargetSym(*RelI);<br>
> +      if (const RelTy *Rel = getReloc(Offset, Length, Rels))<br>
> +        Personality = &S->getFile()->getRelocTargetSym(*Rel);<br>
><br>
>        std::pair<StringRef, SymbolBody *> CieInfo(Entry, Personality);<br>
>        auto P = CieMap.insert(std::make_pair(CieInfo, Cies.size()));<br>
> @@ -1166,9 +1172,11 @@ void EHOutputSection<ELFT>::addSectionAu<br>
>        }<br>
>        OffsetToIndex[Offset] = P.first->second;<br>
>      } else {<br>
> -      if (!HasReloc)<br>
> +      const RelTy *Rel = getReloc(Offset, Length, Rels);<br>
> +      if (!Rel)<br>
>          fatal("FDE doesn't reference another section");<br>
> -      SymbolBody &B = S->getFile()->getRelocTargetSym(*RelI);<br>
> +      SymbolBody &B = S->getFile()->getRelocTargetSym(*Rel);<br>
> +<br>
>        auto *D = dyn_cast<DefinedRegular<ELFT>>(&B);<br>
>        if (D && D->Section) {<br>
>          InputSectionBase<ELFT> *Target = D->Section->Repl;<br>
> @@ -1184,7 +1192,7 @@ void EHOutputSection<ELFT>::addSectionAu<br>
>        }<br>
>      }<br>
><br>
> -    Offset = NextOffset;<br>
> +    Offset += Length;<br>
>      D = D.slice(Length);<br>
>    }<br>
>  }<br>
><br>
><br>
> _______________________________________________<br>
> llvm-commits mailing list<br>
> <a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
> <a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits</a><br>
</div></div></blockquote></div><br></div>