[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