Assert that a floating type's length is at least as long as its format

This would have caught the HP/PA bug fixed in the previous patch:

 .../src/gdb/gdbtypes.c:4690: internal-error: arch_float_type: Assertion `len >= floatformat_totalsize_bytes (floatformats[0])' failed.
 A problem internal to GDB has been detected,
 further debugging may prove unreliable.
 Quit this debugging session? (y or n)

Tested on x86-64 Fedora 23, --enable-targets=all.

gdb/ChangeLog:
2016-03-09  Pedro Alves  <palves@redhat.com>

	* doublest.c (floatformat_totalsize_bytes): New function.
	(floatformat_from_type): Assert that the type's length is at least
	as long as the floatformat's totalsize.
	* doublest.h (floatformat_totalsize_bytes): New declaration.
	* gdbtypes.c (arch_float_type): Assert that the type's length is
	at least as long as the floatformat's totalsize.
This commit is contained in:
Pedro Alves 2016-03-09 02:29:39 +00:00
parent aacca8a7a9
commit b79497cb1c
4 changed files with 37 additions and 2 deletions

View file

@ -1,3 +1,12 @@
2016-03-09 Pedro Alves <palves@redhat.com>
* doublest.c (floatformat_totalsize_bytes): New function.
(floatformat_from_type): Assert that the type's length is at least
as long as the floatformat's totalsize.
* doublest.h (floatformat_totalsize_bytes): New declaration.
* gdbtypes.c (arch_float_type): Assert that the type's length is
at least as long as the floatformat's totalsize.
2016-03-09 Pedro Alves <palves@redhat.com>
* hppa-linux-tdep.c (hppa_linux_init_abi): Set the long double

View file

@ -693,6 +693,15 @@ static const struct floatformat *host_double_format = GDB_HOST_DOUBLE_FORMAT;
static const struct floatformat *host_long_double_format
= GDB_HOST_LONG_DOUBLE_FORMAT;
/* See doublest.h. */
size_t
floatformat_totalsize_bytes (const struct floatformat *fmt)
{
return ((fmt->totalsize + FLOATFORMAT_CHAR_BIT - 1)
/ FLOATFORMAT_CHAR_BIT);
}
void
floatformat_to_doublest (const struct floatformat *fmt,
const void *in, DOUBLEST *out)
@ -802,12 +811,16 @@ const struct floatformat *
floatformat_from_type (const struct type *type)
{
struct gdbarch *gdbarch = get_type_arch (type);
const struct floatformat *fmt;
gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT);
if (TYPE_FLOATFORMAT (type) != NULL)
return TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
fmt = TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)];
else
return floatformat_from_length (gdbarch, TYPE_LENGTH (type));
fmt = floatformat_from_length (gdbarch, TYPE_LENGTH (type));
gdb_assert (TYPE_LENGTH (type) >= floatformat_totalsize_bytes (fmt));
return fmt;
}
/* Extract a floating-point number of type TYPE from a target-order

View file

@ -89,6 +89,10 @@ extern const char *floatformat_mantissa (const struct floatformat *,
const struct floatformat *floatformat_from_type (const struct type *type);
/* Return the floatformat's total size in host bytes. */
extern size_t floatformat_totalsize_bytes (const struct floatformat *fmt);
extern DOUBLEST extract_typed_floating (const void *addr,
const struct type *type);
extern void store_typed_floating (void *addr, const struct type *type,

View file

@ -4682,6 +4682,15 @@ arch_float_type (struct gdbarch *gdbarch,
t = arch_type (gdbarch, TYPE_CODE_FLT, bit / TARGET_CHAR_BIT, name);
TYPE_FLOATFORMAT (t) = floatformats;
if (floatformats != NULL)
{
size_t len = TYPE_LENGTH (t);
gdb_assert (len >= floatformat_totalsize_bytes (floatformats[0]));
gdb_assert (len >= floatformat_totalsize_bytes (floatformats[1]));
}
return t;
}