PowerPC64 __tls_get_addr_desc
This implements register saving and restoring in the __tls_get_addr call stub, so that when glibc supports the optimized tls call stub gcc can generate code that assumes only r0, r12 and of course r3 are changed on a __tls_get_addr call. When gcc expects __tls_get_addr calls to preserve registers the call will be to __tls_get_addr_desc, which will be translated by the linker to a call to __tls_get_addr_opt. bfd/ * elf64-ppc.h (struct ppc64_elf_params): Add no_tls_get_addr_regsave. * elf64-ppc.c (struct ppc_link_hash_table): Add tga_desc and tga_desc_fd. (is_tls_get_addr): Match tga_desc and tga_desc_df too. (STDU_R1_0R1, ADDI_R1_R1): Define. (tls_get_addr_prologue, tls_get_addr_epilogue): New functions. (ppc64_elf_tls_setup): Set up tga_desc and tga_desc_fd. Indirect tga_desc_fd to opt_fd, and tga_desc to opt. Set no_tls_get_addr_regsave. (branch_reloc_hash_match): Add hash3 and hash4. (ppc64_elf_tls_optimize): Handle tga_desc_fd and tga_desc too. (ppc64_elf_size_dynamic_sections): Likewise. (ppc64_elf_relocate_section): Likewise. (plt_stub_size, build_plt_stub): Likewise. Size regsave __tls_get_addr stub. (build_tls_get_addr_stub): Build regsave __tls_get_addr stub and eh_frame. (ppc_size_one_stub): Handle tga_desc_fd and tga_desc too. Size eh_frame for regsave __tls_get_addr. gas/ * config/tc-ppc.c (parse_tls_arg): Handle tls arg for __tls_get_addr_desc and __tls_get_addr_opt. ld/ * emultempl/ppc64elf.em (ppc64_opt, PARSE_AND_LIST_LONGOPTS), (PARSE_AND_LIST_OPTIONS, PARSE_AND_LIST_ARGS_CASES): Support --tls-get-addr-regsave and --no-tls-get-addr-regsave. (params): Init new field. * ld.texi (--tls-get-addr-regsave, --no-tls-get-addr-regsave): Document. * testsuite/ld-powerpc/tlsdesc.s, * testsuite/ld-powerpc/tlsdesc.d, * testsuite/ld-powerpc/tlsdesc.wf, * testsuite/ld-powerpc/tlsdesc2.d, * testsuite/ld-powerpc/tlsdesc2.wf, * testsuite/ld-powerpc/tlsexenors.d, * testsuite/ld-powerpc/tlsexenors.r, * testsuite/ld-powerpc/tlsexers.d, * testsuite/ld-powerpc/tlsexers.r, * testsuite/ld-powerpc/tlsexetocnors.d, * testsuite/ld-powerpc/tlsexetocrs.d, * testsuite/ld-powerpc/tlsexetocrs.r, * testsuite/ld-powerpc/tlsopt6.d, * testsuite/ld-powerpc/tlsopt6.wf: New. * testsuite/ld-powerpc/powerpc.exp: Run new tests.
Showing
- bfd/ChangeLog 22 additions, 0 deletionsbfd/ChangeLog
- bfd/elf64-ppc.c 347 additions, 89 deletionsbfd/elf64-ppc.c
- bfd/elf64-ppc.h 3 additions, 0 deletionsbfd/elf64-ppc.h
- gas/ChangeLog 5 additions, 0 deletionsgas/ChangeLog
- gas/config/tc-ppc.c 4 additions, 1 deletiongas/config/tc-ppc.c
- ld/ChangeLog 24 additions, 0 deletionsld/ChangeLog
- ld/emultempl/ppc64elf.em 19 additions, 1 deletionld/emultempl/ppc64elf.em
- ld/ld.texi 16 additions, 7 deletionsld/ld.texi
- ld/testsuite/ld-powerpc/powerpc.exp 27 additions, 0 deletionsld/testsuite/ld-powerpc/powerpc.exp
- ld/testsuite/ld-powerpc/tlsdesc.d 68 additions, 0 deletionsld/testsuite/ld-powerpc/tlsdesc.d
- ld/testsuite/ld-powerpc/tlsdesc.s 8 additions, 0 deletionsld/testsuite/ld-powerpc/tlsdesc.s
- ld/testsuite/ld-powerpc/tlsdesc.wf 50 additions, 0 deletionsld/testsuite/ld-powerpc/tlsdesc.wf
- ld/testsuite/ld-powerpc/tlsdesc2.d 69 additions, 0 deletionsld/testsuite/ld-powerpc/tlsdesc2.d
- ld/testsuite/ld-powerpc/tlsdesc2.wf 49 additions, 0 deletionsld/testsuite/ld-powerpc/tlsdesc2.wf
- ld/testsuite/ld-powerpc/tlsexenors.d 106 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexenors.d
- ld/testsuite/ld-powerpc/tlsexenors.r 113 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexenors.r
- ld/testsuite/ld-powerpc/tlsexers.d 104 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexers.d
- ld/testsuite/ld-powerpc/tlsexers.r 112 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexers.r
- ld/testsuite/ld-powerpc/tlsexetocnors.d 90 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexetocnors.d
- ld/testsuite/ld-powerpc/tlsexetocrs.d 88 additions, 0 deletionsld/testsuite/ld-powerpc/tlsexetocrs.d
Loading
Please register or sign in to comment