PPC64_OPT_LOCALENTRY is incompatible with tail calls
authorAlan Modra <amodra@gmail.com>
Sat, 26 Sep 2020 05:40:09 +0000 (15:10 +0930)
committerAlan Modra <amodra@gmail.com>
Sat, 26 Sep 2020 09:33:02 +0000 (19:03 +0930)
commit3cd7c7d7ef38ec5dc0a0c137c47d9ad0fc9e2e5f
tree1b9ed3050e4eb9b5338592f702929c91e44be19e
parent0be2fe677c53c6d363a40ae3612d4490ba377e02
PPC64_OPT_LOCALENTRY is incompatible with tail calls

The save of r2 in __glink_PLTresolve is the culprit.  Remove it,
unless we know we need it for --plt-localentry.  --plt-localentry
should not be used with power10 pc-relative code that makes tail
calls.

The patch also removes use of r2 as a scratch reg in the ELFv2
__glink_PLTresolve.  Using r2 isn't a problem, this is just reducing
the number of scratch regs.

bfd/
* elf64-ppc.c (GLINK_PLTRESOLVE_SIZE): Depend on has_plt_localentry0.
(LD_R0_0R11, ADD_R11_R0_R11): Define.
(ppc64_elf_tls_setup): Disable params->plt_localentry0 when power10
code detected.
(ppc64_elf_size_stubs): Update __glink_PLTresolve eh_frame.
(ppc64_elf_build_stubs): Move r2 save to start of __glink_PLTresolve,
and only emit for has_plt_localentry0.  Don't use r2 in the stub.
ld/
* testsuite/ld-powerpc/elfv2so.d,
* testsuite/ld-powerpc/notoc2.d,
* testsuite/ld-powerpc/tlsdesc.wf,
* testsuite/ld-powerpc/tlsdesc2.d,
* testsuite/ld-powerpc/tlsdesc2.wf,
* testsuite/ld-powerpc/tlsopt5.d,
* testsuite/ld-powerpc/tlsopt5.wf,
* testsuite/ld-powerpc/tlsopt6.d,
* testsuite/ld-powerpc/tlsopt6.wf: Update __glink_PLTresolve.
12 files changed:
bfd/ChangeLog
bfd/elf64-ppc.c
ld/ChangeLog
ld/testsuite/ld-powerpc/elfv2so.d
ld/testsuite/ld-powerpc/notoc2.d
ld/testsuite/ld-powerpc/tlsdesc.wf
ld/testsuite/ld-powerpc/tlsdesc2.d
ld/testsuite/ld-powerpc/tlsdesc2.wf
ld/testsuite/ld-powerpc/tlsopt5.d
ld/testsuite/ld-powerpc/tlsopt5.wf
ld/testsuite/ld-powerpc/tlsopt6.d
ld/testsuite/ld-powerpc/tlsopt6.wf