diff options
author | Jan Beulich <jbeulich@suse.com> | 2021-08-11 08:31:03 +0200 |
---|---|---|
committer | Jan Beulich <jbeulich@suse.com> | 2021-08-11 08:31:03 +0200 |
commit | e74e2b4c336fad993b0dd31b859af919ad52ec9e (patch) | |
tree | d2da95940234a9ed70a44738a018f4ee2919bd53 /gas/read.c | |
parent | e2295dade838ad296e1e1cd1096177058139b6b3 (diff) | |
download | gdb-e74e2b4c336fad993b0dd31b859af919ad52ec9e.zip gdb-e74e2b4c336fad993b0dd31b859af919ad52ec9e.tar.gz gdb-e74e2b4c336fad993b0dd31b859af919ad52ec9e.tar.bz2 |
x86/ELF: fix .ds.x output
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.
Diffstat (limited to 'gas/read.c')
-rw-r--r-- | gas/read.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -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 |