[PATCH] x86: Allow R_386_TLS_LE_32 with KMOVD
H.J. Lu
hjl.tools@gmail.com
Tue Aug 27 20:14:51 GMT 2024
On Tue, Aug 27, 2024 at 6:06 AM H.J. Lu <hjl.tools@gmail.com> wrote:
>
> Since there is no TLS IE transition, allow R_386_TLS_LE_32 with KMOVD.
>
> gas/
>
> PR gas/28595
> * config/tc-i386.c (i386_assemble): Remove BFD_RELOC_386_TLS_LE_32
> from TLS code check.
> * testsuite/gas/i386/inval-tls.s: Remove foo@tpoff(%eax).
> * testsuite/gas/i386/inval-tls.l: Updated.
>
> ld/
>
> PR gas/28595
> * testsuite/ld-i386/i386.exp: Run tlsle1.
> * testsuite/ld-i386/tlsle1.d: New file.
> * testsuite/ld-i386/tlsle1.s: Likewise.
>
> Signed-off-by: H.J. Lu <hjl.tools@gmail.com>
> ---
> gas/config/tc-i386.c | 4 ++--
> gas/testsuite/gas/i386/inval-tls.l | 1 -
> gas/testsuite/gas/i386/inval-tls.s | 1 -
> ld/testsuite/ld-i386/i386.exp | 1 +
> ld/testsuite/ld-i386/tlsle1.d | 16 ++++++++++++++++
> ld/testsuite/ld-i386/tlsle1.s | 14 ++++++++++++++
> 6 files changed, 33 insertions(+), 4 deletions(-)
> create mode 100644 ld/testsuite/ld-i386/tlsle1.d
> create mode 100644 ld/testsuite/ld-i386/tlsle1.s
>
> diff --git a/gas/config/tc-i386.c b/gas/config/tc-i386.c
> index ad68ba9322d..20dcb38919e 100644
> --- a/gas/config/tc-i386.c
> +++ b/gas/config/tc-i386.c
> @@ -6578,13 +6578,13 @@ i386_assemble (char *line)
> return;
> }
>
> - /* Don't allow e.g. KMOV in TLS code sequences. */
> + /* Don't allow e.g. KMOV in TLS code sequences which will trigger
> + linker error later. */
> for (j = i.imm_operands; j < i.operands; ++j)
> switch (i.reloc[j])
> {
> case BFD_RELOC_X86_64_GOTTPOFF:
> case BFD_RELOC_386_TLS_GOTIE:
> - case BFD_RELOC_386_TLS_LE_32:
> case BFD_RELOC_X86_64_TLSLD:
> as_bad (_("TLS relocation cannot be used with `%s'"), insn_name (&i.tm));
> return;
> diff --git a/gas/testsuite/gas/i386/inval-tls.l b/gas/testsuite/gas/i386/inval-tls.l
> index 59e7c30f46f..907e80610a8 100644
> --- a/gas/testsuite/gas/i386/inval-tls.l
> +++ b/gas/testsuite/gas/i386/inval-tls.l
> @@ -1,3 +1,2 @@
> .*: Assembler messages:
> .*:3: Error: .* `kmovd'
> -.*:4: Error: .* `kmovd'
> diff --git a/gas/testsuite/gas/i386/inval-tls.s b/gas/testsuite/gas/i386/inval-tls.s
> index 3fe85c31ff3..ba0e1b81dc9 100644
> --- a/gas/testsuite/gas/i386/inval-tls.s
> +++ b/gas/testsuite/gas/i386/inval-tls.s
> @@ -1,4 +1,3 @@
> .text
> # All the following should be illegal
> kmovd foo@gotntpoff(%eax), %k0
> - kmovd foo@tpoff(%eax), %k0
> diff --git a/ld/testsuite/ld-i386/i386.exp b/ld/testsuite/ld-i386/i386.exp
> index adc88e42ad8..6f97f5daa23 100644
> --- a/ld/testsuite/ld-i386/i386.exp
> +++ b/ld/testsuite/ld-i386/i386.exp
> @@ -314,6 +314,7 @@ run_dump_test "tlsie2"
> run_dump_test "tlsie3"
> run_dump_test "tlsie4"
> run_dump_test "tlsie5"
> +run_dump_test "tlsle1"
> run_dump_test "hidden1"
> run_dump_test "hidden2"
> run_dump_test "hidden3"
> diff --git a/ld/testsuite/ld-i386/tlsle1.d b/ld/testsuite/ld-i386/tlsle1.d
> new file mode 100644
> index 00000000000..d304e7b5170
> --- /dev/null
> +++ b/ld/testsuite/ld-i386/tlsle1.d
> @@ -0,0 +1,16 @@
> +#name: TLS LE with kmovd
> +#as: --32
> +#ld: -melf_i386
> +#objdump: -dw
> +
> +.*: +file format .*
> +
> +
> +Disassembly of section .text:
> +
> +0+8049000 <_start>:
> + +[a-f0-9]+: 65 c4 e1 f9 90 05 04 00 00 00 kmovd %gs:0x4,%k0
> + +[a-f0-9]+: c4 e1 f9 90 80 04 00 00 00 kmovd 0x4\(%eax\),%k0
> + +[a-f0-9]+: 65 c4 e1 f9 90 05 fc ff ff ff kmovd %gs:0xfffffffc,%k0
> + +[a-f0-9]+: c4 e1 f9 90 80 fc ff ff ff kmovd -0x4\(%eax\),%k0
> +#pass
> diff --git a/ld/testsuite/ld-i386/tlsle1.s b/ld/testsuite/ld-i386/tlsle1.s
> new file mode 100644
> index 00000000000..283b903aa2f
> --- /dev/null
> +++ b/ld/testsuite/ld-i386/tlsle1.s
> @@ -0,0 +1,14 @@
> + .text
> + .globl _start
> +_start:
> + kmovd %gs:foo@tpoff,%k0
> + kmovd foo@tpoff(%eax),%k0
> + kmovd %gs:foo@ntpoff,%k0
> + kmovd foo@ntpoff(%eax),%k0
> + .globl foo
> + .section .tdata,"awT",@progbits
> + .align 4
> + .type foo, @object
> + .size foo, 4
> +foo:
> + .long 100
> --
> 2.46.0
>
I am checking it in.
--
H.J.
More information about the Binutils
mailing list