[lld] r240603 - COFF: Cache raw pointers to relocation tables.

Sean Silva chisophugis at gmail.com
Wed Jun 24 19:42:28 PDT 2015


+  mutable const coff_relocation *Reloc = nullptr;

Do we really need `mutable const`? I have a feeling that will leave most
people scratching their heads (at least it did for me). Also it might be
useful to put `Cache` or `Cached` somewhere in the variable name.

-- Sean Silva

On Wed, Jun 24, 2015 at 4:03 PM, Rui Ueyama <ruiu at google.com> wrote:

> Author: ruiu
> Date: Wed Jun 24 18:03:17 2015
> New Revision: 240603
>
> URL: http://llvm.org/viewvc/llvm-project?rev=240603&view=rev
> Log:
> COFF: Cache raw pointers to relocation tables.
>
> Getting an iterator to the relocation table is very hot operation
> in the linker. We do that not only to apply relocations but also
> to mark live sections and to do ICF.
>
> libObject's interface is slow. By caching pointers to the first
> relocation table entries makes the linker 6% faster to self-link.
>
> We probably need to fix libObject as well.
>
> Modified:
>     lld/trunk/COFF/Chunks.cpp
>     lld/trunk/COFF/Chunks.h
>
> Modified: lld/trunk/COFF/Chunks.cpp
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Chunks.cpp?rev=240603&r1=240602&r2=240603&view=diff
>
> ==============================================================================
> --- lld/trunk/COFF/Chunks.cpp (original)
> +++ lld/trunk/COFF/Chunks.cpp Wed Jun 24 18:03:17 2015
> @@ -58,10 +58,8 @@ void SectionChunk::writeTo(uint8_t *Buf)
>    memcpy(Buf + FileOff, Data.data(), Data.size());
>
>    // Apply relocations.
> -  for (const auto &I : getSectionRef().relocations()) {
> -    const coff_relocation *Rel = File->getCOFFObj()->getCOFFRelocation(I);
> +  for (const coff_relocation *Rel = relBegin(), *E = relEnd(); Rel != E;
> ++Rel)
>      applyReloc(Buf, Rel);
> -  }
>  }
>
>  void SectionChunk::mark() {
> @@ -69,8 +67,8 @@ void SectionChunk::mark() {
>    Live = true;
>
>    // Mark all symbols listed in the relocation table for this section.
> -  for (const auto &I : getSectionRef().relocations()) {
> -    const coff_relocation *Rel = File->getCOFFObj()->getCOFFRelocation(I);
> +  for (const coff_relocation *Rel = relBegin(), *E = relEnd(); Rel != E;
> +       ++Rel) {
>      SymbolBody *B = File->getSymbolBody(Rel->SymbolTableIndex);
>      if (auto *Def = dyn_cast<Defined>(B))
>        Def->markLive();
> @@ -120,11 +118,11 @@ void SectionChunk::applyReloc(uint8_t *B
>  // which need to be fixed by the loader if load-time relocation is needed.
>  // Only called when base relocation is enabled.
>  void SectionChunk::getBaserels(std::vector<uint32_t> *Res, Defined
> *ImageBase) {
> -  for (const auto &I : getSectionRef().relocations()) {
> +  for (const coff_relocation *Rel = relBegin(), *E = relEnd(); Rel != E;
> +       ++Rel) {
>      // ADDR64 relocations contain absolute addresses.
>      // Symbol __ImageBase is special -- it's an absolute symbol, but its
>      // address never changes even if image is relocated.
> -    const coff_relocation *Rel = File->getCOFFObj()->getCOFFRelocation(I);
>      if (Rel->Type != IMAGE_REL_AMD64_ADDR64)
>        continue;
>      SymbolBody *Body = File->getSymbolBody(Rel->SymbolTableIndex);
> @@ -156,12 +154,6 @@ void SectionChunk::printDiscardedMessage
>    }
>  }
>
> -SectionRef SectionChunk::getSectionRef() const {
> -  DataRefImpl Ref;
> -  Ref.p = uintptr_t(Header);
> -  return SectionRef(Ref, File->getCOFFObj());
> -}
> -
>  StringRef SectionChunk::getDebugName() {
>    return Sym->getName();
>  }
> @@ -196,12 +188,10 @@ bool SectionChunk::equals(const SectionC
>      return false;
>
>    // Compare relocations
> -  auto Range1 = getSectionRef().relocations();
> -  auto Range2 = X->getSectionRef().relocations();
> -  auto End = Range1.end();
> -  for (auto I = Range1.begin(), J = Range2.begin(); I != End; ++I, ++J) {
> -    const coff_relocation *Rel1 =
> File->getCOFFObj()->getCOFFRelocation(*I);
> -    const coff_relocation *Rel2 =
> X->File->getCOFFObj()->getCOFFRelocation(*J);
> +  const coff_relocation *Rel1 = relBegin();
> +  const coff_relocation *End = relEnd();
> +  const coff_relocation *Rel2 = X->relBegin();
> +  for (; Rel1 != End; ++Rel1, ++Rel2) {
>      if (Rel1->Type != Rel2->Type)
>        return false;
>      if (Rel1->VirtualAddress != Rel2->VirtualAddress)
> @@ -230,6 +220,22 @@ void SectionChunk::replaceWith(SectionCh
>    Live = false;
>  }
>
> +const coff_relocation *SectionChunk::relBegin() const {
> +  if (!Reloc) {
> +    DataRefImpl Ref;
> +    Ref.p = uintptr_t(Header);
> +    SectionRef Sref(Ref, File->getCOFFObj());
> +    relocation_iterator It = Sref.relocation_begin();
> +    Reloc = File->getCOFFObj()->getCOFFRelocation(*It);
> +  }
> +  return Reloc;
> +}
> +
> +const coff_relocation *SectionChunk::relEnd() const {
> +  const coff_relocation *I = relBegin();
> +  return I + Header->NumberOfRelocations;
> +}
> +
>  CommonChunk::CommonChunk(const COFFSymbolRef S) : Sym(S) {
>    // Common symbols are aligned on natural boundaries up to 32 bytes.
>    // This is what MSVC link.exe does.
>
> Modified: lld/trunk/COFF/Chunks.h
> URL:
> http://llvm.org/viewvc/llvm-project/lld/trunk/COFF/Chunks.h?rev=240603&r1=240602&r2=240603&view=diff
>
> ==============================================================================
> --- lld/trunk/COFF/Chunks.h (original)
> +++ lld/trunk/COFF/Chunks.h Wed Jun 24 18:03:17 2015
> @@ -149,12 +149,16 @@ public:
>
>  private:
>    void mark() override;
> -  SectionRef getSectionRef() const;
>    void applyReloc(uint8_t *Buf, const coff_relocation *Rel);
>
>    // A file this chunk was created from.
>    ObjectFile *File;
>
> +  // A raw pointer to the relocation table.
> +  mutable const coff_relocation *Reloc = nullptr;
> +  const coff_relocation *relBegin() const;
> +  const coff_relocation *relEnd() const;
> +
>    // A pointer pointing to a replacement for this chunk.
>    // Initially it points to "this" object. If this chunk is merged
>    // with other chunk by ICF, it points to another chunk,
>
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20150624/1979e4b1/attachment.html>


More information about the llvm-commits mailing list