gold: x86-64: Fix TLSDESC relaxation for x32
authorH.J. Lu <hjl.tools@gmail.com>
Fri, 1 May 2020 17:11:06 +0000 (10:11 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Fri, 1 May 2020 17:11:23 +0000 (10:11 -0700)
commitccf20d460f73c48f3334e1401558df342c77ac8a
tree80cf7c6bb978934ed96849825b7c0e8e6bd14721
parent6d520e36de0229eefe2f1671438cc8333a90b5e6
gold: x86-64: Fix TLSDESC relaxation for x32

X32 TLSDESC sequences can be:

40 8d 05 00 00 00 00 rex lea foo@TLSDESC(%rip), %reg
...
67 ff 10 call *foo@TLSCALL(%eax)

or the same sequence as LP64:

48 8d 05 00 00 00 00 lea foo@TLSDESC(%rip), %reg
...
ff 10 call *foo@TLSCALL(%rax)

We need to support both sequences for x32.  For both GDesc -> IE/LE
transitions,

67 ff 10 call *foo@TLSCALL(%eax)

should relaxed to

0f 1f 00 nopl (%rax)

For GDesc -> LE transition,

40 8d 05 00 00 00 00 rex lea foo@TLSDESC(%rip), %reg

should relaxed to

40 c7 c0 fc ff ff ff rex movl $foo@tpoff, %reg

For GDesc -> IE transition,

40 8d 05 00 00 00 00 rex lea foo@TLSDESC(%rip), %reg

should relaxed to

40 8b 05 00 00 00 00 rex movl foo@gottpoff(%rip), %eax

PR gold/25426
* x86_64.cc (Target_x86_64<size>::Relocate::tls_desc_gd_to_ie):
For x32, relax "rex leal foo@tlsdesc(%rip), %reg" to
"rex movl foo@gottpoff(%rip), %eax" and relax ""call *(%eax)"
to "nopl (%rax)".
(Target_x86_64<size>::Relocate::tls_desc_gd_to_le): For x32,
relax "rex leal foo@tlsdesc(%rip), %reg" to
"rex movl foo@tpoff, %eax" and relax "call *foo@tlscall(%eax)"
to "nopl (%rax)".
* testsuite/Makefile.am (tls_test_gnu2.o): Depend on
gcctestdir/as.
(tls_test_file2_gnu2.o): Likewise.
(tls_test_c_gnu2.o): Likewise.
* testsuite/Makefile.in: Regenerated.
gold/ChangeLog
gold/testsuite/Makefile.am
gold/testsuite/Makefile.in
gold/x86_64.cc