[PATCH] D35803: [ELF] - Fix calculation of memory region offset.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 24 09:22:28 PDT 2017


LGTM

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> Herald added a subscriber: emaste.
>
> This is PR33714.
>
> Previously for each input section offset of memory region
> was increamented on a size of output section.
> That resulted in a wrong error message saying about
> overflow. Patch fixes that.
>
>
> https://reviews.llvm.org/D35803
>
> Files:
>   ELF/LinkerScript.cpp
>   test/ELF/linkerscript/memory2.s
>
>
> Index: test/ELF/linkerscript/memory2.s
> ===================================================================
> --- test/ELF/linkerscript/memory2.s
> +++ test/ELF/linkerscript/memory2.s
> @@ -0,0 +1,14 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0, LENGTH = 2K } \
> +# RUN: SECTIONS { .text : { *(.text*) } > ram }" > %t.script
> +# RUN: ld.lld -o %t2 --script %t.script %t
> +
> +.text
> +.global _start
> +_start:
> +  .zero 1024
> +
> +.section .text.foo,"ax",%progbits
> +foo:
> +  nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -550,6 +550,7 @@
>  }
>  
>  void LinkerScript::output(InputSection *S) {
> +  uint64_t Before = advance(0, 1);
>    uint64_t Pos = advance(S->getSize(), S->Alignment);
>    S->OutSecOff = Pos - S->getSize() - CurAddressState->OutSec->Addr;
>  
> @@ -563,7 +564,7 @@
>    if (CurAddressState->MemRegion) {
>      uint64_t &CurOffset =
>          CurAddressState->MemRegionOffset[CurAddressState->MemRegion];
> -    CurOffset += CurAddressState->OutSec->Size;
> +    CurOffset += Pos - Before;
>      uint64_t CurSize = CurOffset - CurAddressState->MemRegion->Origin;
>      if (CurSize > CurAddressState->MemRegion->Length) {
>        uint64_t OverflowAmt = CurSize - CurAddressState->MemRegion->Length;
>
>
> Index: test/ELF/linkerscript/memory2.s
> ===================================================================
> --- test/ELF/linkerscript/memory2.s
> +++ test/ELF/linkerscript/memory2.s
> @@ -0,0 +1,14 @@
> +# REQUIRES: x86
> +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
> +# RUN: echo "MEMORY { ram (rwx) : ORIGIN = 0, LENGTH = 2K } \
> +# RUN: SECTIONS { .text : { *(.text*) } > ram }" > %t.script
> +# RUN: ld.lld -o %t2 --script %t.script %t
> +
> +.text
> +.global _start
> +_start:
> +  .zero 1024
> +
> +.section .text.foo,"ax",%progbits
> +foo:
> +  nop
> Index: ELF/LinkerScript.cpp
> ===================================================================
> --- ELF/LinkerScript.cpp
> +++ ELF/LinkerScript.cpp
> @@ -550,6 +550,7 @@
>  }
>  
>  void LinkerScript::output(InputSection *S) {
> +  uint64_t Before = advance(0, 1);
>    uint64_t Pos = advance(S->getSize(), S->Alignment);
>    S->OutSecOff = Pos - S->getSize() - CurAddressState->OutSec->Addr;
>  
> @@ -563,7 +564,7 @@
>    if (CurAddressState->MemRegion) {
>      uint64_t &CurOffset =
>          CurAddressState->MemRegionOffset[CurAddressState->MemRegion];
> -    CurOffset += CurAddressState->OutSec->Size;
> +    CurOffset += Pos - Before;
>      uint64_t CurSize = CurOffset - CurAddressState->MemRegion->Origin;
>      if (CurSize > CurAddressState->MemRegion->Length) {
>        uint64_t OverflowAmt = CurSize - CurAddressState->MemRegion->Length;


More information about the llvm-commits mailing list