[lld] r302107 - Fix accounting of tbss.

Rui Ueyama via llvm-commits llvm-commits at lists.llvm.org
Thu May 4 18:18:16 PDT 2017


Not directly related to this, but we have code that sets virtual addresses
to .tbss sections. Do you know why we are doing that? IIUC, virtual
addresses of .tbss sections are not significant, so we can just set them to
zero.

On Wed, May 3, 2017 at 8:00 PM, Rafael Espindola via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

> Author: rafael
> Date: Wed May  3 22:00:27 2017
> New Revision: 302107
>
> URL: http://llvm.org/viewvc/llvm-project?rev=302107&view=rev
> Log:
> Fix accounting of tbss.
>
> We were correctly computing the size contribution of a .tbss input
> section (it is none), but we were incorrectly considering the
> alignment of the output section: it was advancing Dot instead of
> ThreadBssOffset.
>
> As far as I can tell this was always wrong in our linkerscript
> implementation, but that became more visible now that the code is
> shared with the non linker script case.
>
> Modified:
>     lld/trunk/ELF/LinkerScript.cpp
>     lld/trunk/ELF/LinkerScript.h
>     lld/trunk/test/ELF/tls-offset.s
>
> Modified: lld/trunk/ELF/LinkerScript.cpp
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.cpp?rev=302107&r1=302106&r2=302107&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.cpp (original)
> +++ lld/trunk/ELF/LinkerScript.cpp Wed May  3 22:00:27 2017
> @@ -495,17 +495,22 @@ void LinkerScript::addOrphanSections(Out
>    }
>  }
>
> -static bool isTbss(OutputSection *Sec) {
> -  return (Sec->Flags & SHF_TLS) && Sec->Type == SHT_NOBITS;
> +uint64_t LinkerScript::advance(uint64_t Size, unsigned Align) {
> +  bool IsTbss = (CurOutSec->Flags & SHF_TLS) && CurOutSec->Type ==
> SHT_NOBITS;
> +  uint64_t Start = IsTbss ? Dot + ThreadBssOffset : Dot;
> +  Start = alignTo(Start, Align);
> +  uint64_t End = Start + Size;
> +
> +  if (IsTbss)
> +    ThreadBssOffset = End - Dot;
> +  else
> +    Dot = End;
> +  return End;
>  }
>
>  void LinkerScript::output(InputSection *S) {
> -  bool IsTbss = isTbss(CurOutSec);
> -
> -  uint64_t Pos = IsTbss ? Dot + ThreadBssOffset : Dot;
> -  Pos = alignTo(Pos, S->Alignment);
> -  S->OutSecOff = Pos - CurOutSec->Addr;
> -  Pos += S->getSize();
> +  uint64_t Pos = advance(S->getSize(), S->Alignment);
> +  S->OutSecOff = Pos - S->getSize() - CurOutSec->Addr;
>
>    // Update output section size after adding each section. This is so that
>    // SIZEOF works correctly in the case below:
> @@ -524,11 +529,6 @@ void LinkerScript::output(InputSection *
>              " bytes");
>      }
>    }
> -
> -  if (IsTbss)
> -    ThreadBssOffset = Pos - Dot;
> -  else
> -    Dot = Pos;
>  }
>
>  void LinkerScript::switchTo(OutputSection *Sec) {
> @@ -536,9 +536,7 @@ void LinkerScript::switchTo(OutputSectio
>      return;
>
>    CurOutSec = Sec;
> -
> -  Dot = alignTo(Dot, CurOutSec->Alignment);
> -  CurOutSec->Addr = isTbss(CurOutSec) ? Dot + ThreadBssOffset : Dot;
> +  CurOutSec->Addr = advance(0, CurOutSec->Alignment);
>
>    // If neither AT nor AT> is specified for an allocatable section, the
> linker
>    // will set the LMA such that the difference between VMA and LMA for the
>
> Modified: lld/trunk/ELF/LinkerScript.h
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/
> LinkerScript.h?rev=302107&r1=302106&r2=302107&view=diff
> ============================================================
> ==================
> --- lld/trunk/ELF/LinkerScript.h (original)
> +++ lld/trunk/ELF/LinkerScript.h Wed May  3 22:00:27 2017
> @@ -228,6 +228,7 @@ protected:
>    MemoryRegion *findMemoryRegion(OutputSectionCommand *Cmd);
>
>    void switchTo(OutputSection *Sec);
> +  uint64_t advance(uint64_t Size, unsigned Align);
>    void output(InputSection *Sec);
>    void process(BaseCommand &Base);
>
>
> Modified: lld/trunk/test/ELF/tls-offset.s
> URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/
> tls-offset.s?rev=302107&r1=302106&r2=302107&view=diff
> ============================================================
> ==================
> --- lld/trunk/test/ELF/tls-offset.s (original)
> +++ lld/trunk/test/ELF/tls-offset.s Wed May  3 22:00:27 2017
> @@ -10,7 +10,7 @@
>  // RUN:   .tbss : { *(.tbss) } \
>  // RUN:   .data.rel.ro : { *(.data.rel.ro) } \
>  // RUN: }" > %t.script
> -        // RUN: ld.lld -T %t.script %t -o %tout2
> +// RUN: ld.lld -T %t.script %t -o %tout2
>  // RUN: echo SCRIPT
>  // RUN: llvm-readobj -s %tout2 | FileCheck %s
>          .global _start
> @@ -61,6 +61,6 @@ _start:
>  // CHECK-NEXT:   SHF_ALLOC
>  // CHECK-NEXT:   SHF_WRITE
>  // CHECK-NEXT: ]
> -// CHECK-NEXT: Address: 0x202010
> -// CHECK-NEXT: Offset: 0x2010
> +// CHECK-NEXT: Address: 0x202004
> +// CHECK-NEXT: Offset: 0x2004
>  // CHECK-NEXT: Size: 4
>
>
> _______________________________________________
> 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/20170504/e30f6132/attachment.html>


More information about the llvm-commits mailing list