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

Message ID 2b8407b6-c2a1-49db-acfb-3ae86d4cc0e3@suse.com
State New
Headers show
Series
  • gas: adjustments to floating point data directives handling
Related show

Commit Message

H.J. Lu via Binutils July 23, 2021, 6:53 a.m.
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.
---
I have to admit that I find the md_cons_align() invocation in s_space()
suspicious: Shouldn't the value passed depend on mult?

Comments

H.J. Lu via Binutils July 23, 2021, 1:16 p.m. | #1
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.
H.J. Lu via Binutils July 23, 2021, 2:50 p.m. | #2
On 23.07.2021 15:16, H.J. Lu wrote:
> On Thu, Jul 22, 2021 at 11:53 PM Jan Beulich <jbeulich@suse.com> wrote:

>> 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?


Not sure what you mean. Are you asking whether I have a testcase to
demonstrate an issue? Then no - I didn't go check which exotic(?)
architectures actually make use of this construct.

Jan

Patch

--- 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