[lld] r240603 - COFF: Cache raw pointers to relocation tables.
Rui Ueyama
ruiu at google.com
Wed Jun 24 19:44:56 PDT 2015
On Wed, Jun 24, 2015 at 7:42 PM, Sean Silva <chisophugis at gmail.com> wrote:
> + 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.
>
Yeah, this variable was not very good. It's removed in a followup patch.
> -- 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/20393dff/attachment.html>
More information about the llvm-commits
mailing list