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