[PATCH 03/11] x86/ELF: fix .ds.x output

H.J. Lu hjl.tools@gmail.com
Fri Jul 23 13:16:17 GMT 2021


On Thu, Jul 22, 2021 at 11:53 PM Jan Beulich <jbeulich@suse.com> wrote:
>
> The ELF psABI-s are quite clear here: On 32-bit the underlying data type
> is 12 bytes long (with 2 bytes of trailing padding), while on 64-bit it
> is 16 bytes long (with 6 bytes of padding). Make s_space() capable of
> handling 'x' (and 'p') type floating point being other than 12 bytes
> wide (also adjusting documentation). This requires duplicating the
> definition of X_PRECISION in the target speciifc header; the compiler
> would complain if this was out of sync with config/atof-ieee.c.
>
> Note that for now padding space doesn't get separated from actual
> storage, which means that things will work correctly only for little-
> endian cases, and which also means that by specifying large enough
> numbers padding space can be set to non-zero. Since the logic is needed
> for a single little-endian architecture only for now, I'm hoping that
> this might be acceptable for the time being; otherwise the change will
> become more intrusive.
>
> Note also that this brings the emitted data size of .ds.x vs .tfloat in
> line for non-ELF targets as well; the issue will be even more obvious
> when further taking into account a subsequent patch fixing .dc.x/.dcb.x
> (where output sizes currently differ depending on input format).
>
> Extend existing x86 testcases.

The x86 part is OK.  Thanks.

> ---
> I have to admit that I find the md_cons_align() invocation in s_space()
> suspicious: Shouldn't the value passed depend on mult?

Testcases?

> --- a/gas/config/tc-i386.h
> +++ b/gas/config/tc-i386.h
> @@ -134,6 +134,7 @@ extern bfd_reloc_code_real_type x86_cons
>  extern void x86_cons_fix_new
>  (fragS *, unsigned int, unsigned int, expressionS *, bfd_reloc_code_real_type);
>
> +#define X_PRECISION     5
>  #define X_PRECISION_PAD x86_tfloat_pad ()
>  extern int x86_tfloat_pad (void);
>
> --- a/gas/doc/as.texi
> +++ b/gas/doc/as.texi
> @@ -5125,13 +5125,13 @@ Emits 8-byte values.
>  @item @samp{.l}
>  Emits 4-byte values.
>  @item @samp{.p}
> -Emits 12-byte values.
> +Emits values with size matching packed-decimal floating-point ones.
>  @item @samp{.s}
>  Emits 4-byte values.
>  @item @samp{.w}
>  Emits 2-byte values.
>  @item @samp{.x}
> -Emits 12-byte values.
> +Emits values with size matching long double precision floating-point ones.
>  @end table
>
>  Note - unlike the @code{.dcb} directive the @samp{.d}, @samp{.s} and @samp{.x}
> --- a/gas/read.c
> +++ b/gas/read.c
> @@ -382,10 +382,10 @@ static const pseudo_typeS potable[] = {
>    {"ds.b", s_space, 1},
>    {"ds.d", s_space, 8},
>    {"ds.l", s_space, 4},
> -  {"ds.p", s_space, 12},
> +  {"ds.p", s_space, 'p'},
>    {"ds.s", s_space, 4},
>    {"ds.w", s_space, 2},
> -  {"ds.x", s_space, 12},
> +  {"ds.x", s_space, 'x'},
>    {"debug", s_ignore, 0},
>  #ifdef S_SET_DESC
>    {"desc", s_desc, 0},
> @@ -3327,6 +3327,29 @@ s_space (int mult)
>    md_flush_pending_output ();
>  #endif
>
> +  switch (mult)
> +    {
> +    case 'x':
> +#ifdef X_PRECISION
> +# ifndef P_PRECISION
> +#  define P_PRECISION     X_PRECISION
> +#  define P_PRECISION_PAD X_PRECISION_PAD
> +# endif
> +      mult = (X_PRECISION + X_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
> +      if (!mult)
> +#endif
> +       mult = 12;
> +      break;
> +
> +    case 'p':
> +#ifdef P_PRECISION
> +      mult = (P_PRECISION + P_PRECISION_PAD) * sizeof (LITTLENUM_TYPE);
> +      if (!mult)
> +#endif
> +       mult = 12;
> +      break;
> +    }
> +
>  #ifdef md_cons_align
>    md_cons_align (1);
>  #endif
> --- a/gas/testsuite/gas/i386/fp-elf32.d
> +++ b/gas/testsuite/gas/i386/fp-elf32.d
> @@ -9,4 +9,5 @@ Contents of section .data:
>   0010 4f930a40 789a5440 789a5440 00000000  .*
>   0020 e65e1710 20395e3b e65e1710 20395e3b  .*
>   0030 00000000 0000a044 01000000 0000a044  .*
> - 0040 00000000 0000f03f .*
> + 0040 00000000 0000f03f 00000000 00000000  .*
> + 0050 ffffffff ffffffff ffffffff cccccccc  .*
> --- a/gas/testsuite/gas/i386/fp-elf64.d
> +++ b/gas/testsuite/gas/i386/fp-elf64.d
> @@ -9,4 +9,5 @@ Contents of section .data:
>   0010 71a37909 4f930a40 789a5440 789a5440  .*
>   0020 e65e1710 20395e3b e65e1710 20395e3b  .*
>   0030 00000000 0000a044 01000000 0000a044  .*
> - 0040 00000000 0000f03f .*
> + 0040 00000000 0000f03f 00000000 00000000  .*
> + 0050 ffffffff ffffffff ffffffff ffffffff  .*
> --- a/gas/testsuite/gas/i386/fp.d
> +++ b/gas/testsuite/gas/i386/fp.d
> @@ -8,4 +8,5 @@ Contents of section .data:
>   0010 0a40789a 5440789a 54400000 00000000  .*
>   0020 e65e1710 20395e3b e65e1710 20395e3b  .*
>   0030 00000000 0000a044 01000000 0000a044  .*
> - 0040 00000000 0000f03f .*
> + 0040 00000000 0000f03f 00000000 00000000  .*
> + 0050 ffffffff ffffffff ffffcccc cccccccc  .*
> --- a/gas/testsuite/gas/i386/fp.s
> +++ b/gas/testsuite/gas/i386/fp.s
> @@ -20,3 +20,7 @@
>         .double 37778931862957165903873.0
>  # Ensure we handle a crazy number of digits
>         .double 1.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001
> +       .p2align 4,0
> +
> +       .ds.x 1, -1
> +       .p2align 4,0xcc
>


-- 
H.J.


More information about the Binutils mailing list