gold: x86-64: Fix TLSDESC -> LE relaxation
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 1 May 2020 17:08:31 +0000 (10:08 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 1 May 2020 17:08:48 +0000 (10:08 -0700)
commit6d520e36de0229eefe2f1671438cc8333a90b5e6
tree715843d140e793d17d2f3ef1728987bcf30704cc
parente10cfd063328872efa721b4a08b9d52486fb5878
gold: x86-64: Fix TLSDESC -> LE relaxation

X86-64 TLSDESC sequences can be:

4c 8d 0d 00 00 00 00 leaq foo@TLSDESC(%rip), %r9
4c 89 c8 movq %r9, %rax
ff 10 call *foo@TLSCALL(%rax)

TLSDESC -> LE relaxation can turn them into:

49 c7 c1 fc ff ff ff  mov    $0xfffffffffffffffc,%r9
4c 89 c8              mov    %r9,%rax
66 90                 xchg   %ax,%ax

We need to check and update the REX byte in this case.

PR gold/25473
* x86_64.cc (Target_x86_64<size>::Relocate::tls_desc_gd_to_ie):
Properly check r8 - r15 in "lea foo@TLSDESC(%rip), %reg".
(Target_x86_64<size>::Relocate::tls_desc_gd_to_le): Properly
relax r8 - r15 in "lea foo@TLSDESC(%rip), %reg".
* testsuite/Makefile.am (check_SCRIPTS): Add x86_64_gd_to_le.sh.
(check_DATA): Add x86_64_gd_to_le.stdout.
(MOSTLYCLEANFILES): Add x86_64_gd_to_le.
(x86_64_gd_to_le.o): New target.
(x86_64_gd_to_le): Likewise.
(x86_64_gd_to_le.stdout): Likewise.
* testsuite/Makefile.in: Regenerated.
* testsuite/x86_64_gd_to_le.s: New file.
* testsuite/x86_64_gd_to_le.sh: Likewise.
gold/ChangeLog
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/testsuite/x86_64_gd_to_le.s [new file with mode: 0644]
gold/testsuite/x86_64_gd_to_le.sh [new file with mode: 0755]
gold/x86_64.cc