aboutsummaryrefslogtreecommitdiff
path: root/bfd/ChangeLog
diff options
context:
space:
mode:
authorAlan Modra <amodra@gmail.com>2018-04-09 09:11:44 +0930
committerAlan Modra <amodra@gmail.com>2018-04-09 16:53:05 +0930
commit37da22e5c85375b30e1211ecff1b261f425375f0 (patch)
tree7df19745933aff7448284642e17d626b5270358c /bfd/ChangeLog
parent51066b93507b79e46bcd6c998b760a2fd4b3d0a9 (diff)
downloadgdb-37da22e5c85375b30e1211ecff1b261f425375f0.zip
gdb-37da22e5c85375b30e1211ecff1b261f425375f0.tar.gz
gdb-37da22e5c85375b30e1211ecff1b261f425375f0.tar.bz2
PowerPC indirect calls to __tls_get_addr
It is possible to construct indirect calls to __tls_get_addr in assembly that confuse TLS optimization. (PowerPC gcc doesn't support such calls, ignoring -mlongcall for __tls_get_addr.) This patch fixes the problem by requiring a TLSLD or TLSGD marker reloc before any insn in an indirect call to __tls_get_addr will be optimized. They also need additional marker relocs defined in a later patch, so don't expect the optimization to work just yet. The point here is to prevent mis-optimization of indirect calls without any marker relocs. The presense of a marker reloc is tracked by a new bit in the tls_mask field of ppc_link_hash_entry and the corresponding lgot_masks unsigned char array for local symbols. Since the field is only 8 bits, we've run out of space. However, tracking TLS use for variables, and tracking IFUNC for functions are independent, and bits can be reused. TLS_TLS is always set for TLS usage, so can be used to select the meaning of the other bits. This patch does that even for elf32-ppc.c which hasn't yet run out of space in the field. * elf64-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL, TLS_TPRELGD, TLS_EXPLICIT): Renumber. Test TLS_TLS throughout file when other TLS flags are tested in a mask. (TLS_MARK, NON_GOT): Define. (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well. (update_local_sym_info): Don't create got entry when NON_GOT. (ppc64_elf_check_relocs): Pass NON_GOT with PLT_IFUNC. Set TLS_MARK. (get_tls_mask): Do toc lookup if tls_mask is just TLS_MARK. (ppc64_elf_relocate_section): Likewise. (ppc64_elf_tls_optimize): Don't attempt to optimize indirect __tls_get_addr calls lacking a marker reloc. * elf32-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL, TLS_TPRELGD): Renumber. Update comment. (TLS_MARK, NON_GOT): Define. (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well. (update_local_sym_info): Don't create got entry when NON_GOT. (ppc_elf_check_relocs): Pass NON_GOT with PLT_IFUNC. Set TLS_MARK. (ppc_elf_tls_optimize): Don't attempt to optimize indirect __tls_get_addr calls lacking a marker reloc.
Diffstat (limited to 'bfd/ChangeLog')
-rw-r--r--bfd/ChangeLog24
1 files changed, 24 insertions, 0 deletions
diff --git a/bfd/ChangeLog b/bfd/ChangeLog
index a8eaebb..99f5639 100644
--- a/bfd/ChangeLog
+++ b/bfd/ChangeLog
@@ -1,3 +1,27 @@
+2018-04-09 Alan Modra <amodra@gmail.com>
+
+ * elf64-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL,
+ TLS_TPRELGD, TLS_EXPLICIT): Renumber. Test TLS_TLS throughout
+ file when other TLS flags are tested in a mask.
+ (TLS_MARK, NON_GOT): Define.
+ (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well.
+ (update_local_sym_info): Don't create got entry when NON_GOT.
+ (ppc64_elf_check_relocs): Pass NON_GOT with PLT_IFUNC.
+ Set TLS_MARK.
+ (get_tls_mask): Do toc lookup if tls_mask is just TLS_MARK.
+ (ppc64_elf_relocate_section): Likewise.
+ (ppc64_elf_tls_optimize): Don't attempt to optimize indirect
+ __tls_get_addr calls lacking a marker reloc.
+ * elf32-ppc.c (TLS_TLS, TLS_GD, TLS_LD, TLS_TPREL, TLS_DTPREL,
+ TLS_TPRELGD): Renumber. Update comment.
+ (TLS_MARK, NON_GOT): Define.
+ (PLT_IFUNC): Redefine, and test TLS_TLS throughout file as well.
+ (update_local_sym_info): Don't create got entry when NON_GOT.
+ (ppc_elf_check_relocs): Pass NON_GOT with PLT_IFUNC.
+ Set TLS_MARK.
+ (ppc_elf_tls_optimize): Don't attempt to optimize indirect
+ __tls_get_addr calls lacking a marker reloc.
+
2018-04-06 H.J. Lu <hongjiu.lu@intel.com>
* elf64-x86-64.c (elf_x86_64_info_to_howto): Don't mask out