[lld] r270717 - Make SectionPiece 8 bytes smaller on LP64.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Wed May 25 10:04:59 PDT 2016


Sure, I have an idea to completely remove binary search from here. I'll try
it first.

On Wed, May 25, 2016 at 9:51 AM, Sean Silva <chisophugis at gmail.com> wrote:

> Seems fine. If you are making the Size field only 31 bits then you might
> as well make InputOff 32 bits as well so SectionPiece is 24 bytes instead
> of 32 bytes.
>
> On Wed, May 25, 2016 at 9:37 AM, Rui Ueyama via llvm-commits <
> llvm-commits at lists.llvm.org> wrote:
>
>> Author: ruiu
>> Date: Wed May 25 11:37:01 2016
>> New Revision: 270717
>>
>> URL: http://llvm.org/viewvc/llvm-project?rev=270717&view=rev
>> Log:
>> Make SectionPiece 8 bytes smaller on LP64.
>>
>> This patch makes SectionPiece class 8 bytes smaller on platforms
>> on which pointer size is 8 bytes. Sean suggested in a post commit
>> review for r270340 that this could make a differentce, and it
>> actually is. Time to link clang (with debug info) improved from
>> 6.725 seconds to 6.589 seconds or by about 2%.
>>
>> Differential Revision: http://reviews.llvm.org/D20613
>>
>> Modified:
>>     lld/trunk/ELF/InputSection.h
>>     lld/trunk/ELF/OutputSections.cpp
>>
>> Modified: lld/trunk/ELF/InputSection.h
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/InputSection.h?rev=270717&r1=270716&r2=270717&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/InputSection.h (original)
>> +++ lld/trunk/ELF/InputSection.h Wed May 25 11:37:01 2016
>> @@ -87,13 +87,24 @@ template <class ELFT> InputSectionBase<E
>>  // SectionPiece represents a piece of splittable section contents.
>>  struct SectionPiece {
>>    SectionPiece(size_t Off, ArrayRef<uint8_t> Data)
>> -      : InputOff(Off), Data(Data), Live(!Config->GcSections) {}
>> -  size_t size() const { return Data.size(); }
>> +      : InputOff(Off), Data((uint8_t *)Data.data()), Size(Data.size()),
>> +        Live(!Config->GcSections) {}
>> +
>> +  ArrayRef<uint8_t> data() { return {Data, Size}; }
>> +  size_t size() const { return Size; }
>>
>>    size_t InputOff;
>>    size_t OutputOff = -1;
>> -  ArrayRef<uint8_t> Data; // slice of the input section
>> -  bool Live;
>> +
>> +private:
>> +  // We use bitfields because SplitInputSection is accessed by
>> +  // std::upper_bound very often.
>> +  // We want to save bits to make it cache friendly.
>> +  uint8_t *Data;
>> +  uint32_t Size : 31;
>> +
>> +public:
>> +  uint32_t Live : 1;
>>  };
>>
>>  // Usually sections are copied to the output as atomic chunks of data,
>>
>> Modified: lld/trunk/ELF/OutputSections.cpp
>> URL:
>> http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/OutputSections.cpp?rev=270717&r1=270716&r2=270717&view=diff
>>
>> ==============================================================================
>> --- lld/trunk/ELF/OutputSections.cpp (original)
>> +++ lld/trunk/ELF/OutputSections.cpp Wed May 25 11:37:01 2016
>> @@ -946,7 +946,7 @@ CieRecord *EhOutputSection<ELFT>::addCie
>>                                           EhInputSection<ELFT> *Sec,
>>                                           ArrayRef<RelTy> &Rels) {
>>    const endianness E = ELFT::TargetEndianness;
>> -  if (read32<E>(Piece.Data.data() + 4) != 0)
>> +  if (read32<E>(Piece.data().data() + 4) != 0)
>>      fatal("CIE expected at beginning of .eh_frame: " +
>> Sec->getSectionName());
>>
>>    SymbolBody *Personality = nullptr;
>> @@ -954,7 +954,7 @@ CieRecord *EhOutputSection<ELFT>::addCie
>>      Personality = &Sec->getFile()->getRelocTargetSym(*Rel);
>>
>>    // Search for an existing CIE by CIE contents/relocation target pair.
>> -  CieRecord *Cie = &CieMap[{Piece.Data, Personality}];
>> +  CieRecord *Cie = &CieMap[{Piece.data(), Personality}];
>>
>>    // If not found, create a new one.
>>    if (Cie->Piece == nullptr) {
>> @@ -995,11 +995,11 @@ void EhOutputSection<ELFT>::addSectionAu
>>    DenseMap<size_t, CieRecord *> OffsetToCie;
>>    for (SectionPiece &Piece : Sec->Pieces) {
>>      // The empty record is the end marker.
>> -    if (Piece.Data.size() == 4)
>> +    if (Piece.size() == 4)
>>        return;
>>
>>      size_t Offset = Piece.InputOff;
>> -    uint32_t ID = read32<E>(Piece.Data.data() + 4);
>> +    uint32_t ID = read32<E>(Piece.data().data() + 4);
>>      if (ID == 0) {
>>        OffsetToCie[Offset] = addCie(Piece, Sec, Rels);
>>        continue;
>> @@ -1106,11 +1106,11 @@ template <class ELFT> void EhOutputSecti
>>    const endianness E = ELFT::TargetEndianness;
>>    for (CieRecord *Cie : Cies) {
>>      size_t CieOffset = Cie->Piece->OutputOff;
>> -    writeCieFde<ELFT>(Buf + CieOffset, Cie->Piece->Data);
>> +    writeCieFde<ELFT>(Buf + CieOffset, Cie->Piece->data());
>>
>>      for (SectionPiece *Fde : Cie->FdePieces) {
>>        size_t Off = Fde->OutputOff;
>> -      writeCieFde<ELFT>(Buf + Off, Fde->Data);
>> +      writeCieFde<ELFT>(Buf + Off, Fde->data());
>>
>>        // FDE's second word should have the offset to an associated CIE.
>>        // Write it.
>> @@ -1126,7 +1126,7 @@ template <class ELFT> void EhOutputSecti
>>    // we obtain two addresses and pass them to EhFrameHdr object.
>>    if (Out<ELFT>::EhFrameHdr) {
>>      for (CieRecord *Cie : Cies) {
>> -      uint8_t Enc = getFdeEncoding<ELFT>(Cie->Piece->Data);
>> +      uint8_t Enc = getFdeEncoding<ELFT>(Cie->Piece->data());
>>        for (SectionPiece *Fde : Cie->FdePieces) {
>>          uintX_t Pc = getFdePc(Buf, Fde->OutputOff, Enc);
>>          uintX_t FdeVA = this->getVA() + Fde->OutputOff;
>> @@ -1170,7 +1170,7 @@ void MergeOutputSection<ELFT>::addSectio
>>    for (SectionPiece &Piece : Sec->Pieces) {
>>      if (!Piece.Live)
>>        continue;
>> -    uintX_t OutputOffset = Builder.add(toStringRef(Piece.Data));
>> +    uintX_t OutputOffset = Builder.add(toStringRef(Piece.data()));
>>      if (!IsString || !shouldTailMerge())
>>        Piece.OutputOff = OutputOffset;
>>    }
>>
>>
>> _______________________________________________
>> llvm-commits mailing list
>> llvm-commits at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160525/3b92f439/attachment.html>


More information about the llvm-commits mailing list