[PATCH] D18607: [ELF][MIPS] Revert r264761 and add test case to demonstrate the problem

Rafael EspĂ­ndola via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 30 10:41:03 PDT 2016


LGTM.

On 30 March 2016 at 12:29, Simon Atanasyan <simon at atanasyan.com> wrote:
> atanasyan created this revision.
> atanasyan added a reviewer: rafael.
> atanasyan added a subscriber: llvm-commits.
> atanasyan set the repository for this revision to rL LLVM.
> atanasyan added a project: lld.
> Herald added a subscriber: sdardis.
>
> If we make R_MIPS_LO16 a relative relocation, linker:
> - never creates R_MIPS_COPY relocation for it
> - attempts to create R_MIPS_REL32 dynamic relocation if R_MIPS_LO16's target is a preemptible symbol
>
> Repository:
>   rL LLVM
>
> http://reviews.llvm.org/D18607
>
> Files:
>   ELF/Target.cpp
>   ELF/Writer.cpp
>   test/ELF/mips-lo16-not-relative.s
>
> Index: test/ELF/mips-lo16-not-relative.s
> ===================================================================
> --- /dev/null
> +++ test/ELF/mips-lo16-not-relative.s
> @@ -0,0 +1,23 @@
> +# Check that R_MIPS_LO16 relocation is handled as non-relative,
> +# and if a target symbol is a DSO data symbol, LLD create a copy
> +# relocation.
> +
> +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux \
> +# RUN:         %S/Inputs/mips-dynamic.s -o %t.so.o
> +# RUN: ld.lld %t.so.o -shared -o %t.so
> +# RUN: llvm-mc -filetype=obj -triple=mips-unknown-linux %s -o %t.o
> +# RUN: ld.lld %t.o %t.so -o %t.exe
> +# RUN: llvm-readobj -r %t.exe | FileCheck %s
> +
> +# REQUIRES: mips
> +
> +# CHECK:      Relocations [
> +# CHECK-NEXT:   Section (7) .rel.dyn {
> +# CHECK-NEXT:     0x{{[0-9A-F]+}} R_MIPS_COPY data0 0x0
> +# CHECK-NEXT:   }
> +# CHECK-NEXT: ]
> +
> +  .text
> +  .global __start
> +__start:
> +  addi   $t0, $t0, %lo(data0)
> Index: ELF/Writer.cpp
> ===================================================================
> --- ELF/Writer.cpp
> +++ ELF/Writer.cpp
> @@ -432,6 +432,15 @@
>      }
>
>      if (Config->EMachine == EM_MIPS) {
> +      if (Type == R_MIPS_LO16)
> +        // Ignore R_MIPS_LO16 relocation. If it is a pair for R_MIPS_GOT16 we
> +        // already completed all required action (GOT entry allocation) when
> +        // handle R_MIPS_GOT16. If it is a pair for R_MIPS_HI16 against
> +        // _gp_disp it does not require dynamic relocation. If its a pair for
> +        // R_MIPS_HI16 against a regular symbol it does not require dynamic
> +        // relocation too because that case is possible for executable file
> +        // linking only.
> +        continue;
>        if (&Body == Config->MipsGpDisp || &Body == Config->MipsLocalGp)
>          // MIPS _gp_disp designates offset between start of function and 'gp'
>          // pointer into GOT. __gnu_local_gp is equal to the current value of
> Index: ELF/Target.cpp
> ===================================================================
> --- ELF/Target.cpp
> +++ ELF/Target.cpp
> @@ -1844,6 +1844,7 @@
>    case R_MIPS_32:
>    case R_MIPS_64:
>    case R_MIPS_HI16:
> +  case R_MIPS_LO16:
>    case R_MIPS_TLS_DTPREL_HI16:
>    case R_MIPS_TLS_DTPREL_LO16:
>    case R_MIPS_TLS_TPREL_HI16:
>
>


More information about the llvm-commits mailing list