diff options
-rw-r--r-- | gdb/ChangeLog | 15 | ||||
-rw-r--r-- | gdb/doublest.c | 16 | ||||
-rw-r--r-- | gdb/doublest.h | 6 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 56 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 12 |
5 files changed, 48 insertions, 57 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7de4542..478ec65 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,20 @@ 2017-09-27 Ulrich Weigand <uweigand@de.ibm.com> + * doublest.h (floatformat_from_type): Move to gdbtypes.h. + * doublest.c (floatformat_from_type): Move to gdbtypes.c. + + * gdbtypes.h (union type_specific): Make field floatformat hold + just a single struct floatformat, not an array. + (floatformat_from_type): Move here. + * gdbtypes.c (floatformat_from_type): Move here. Update to + changed TYPE_FLOATFORMAT definition. + (verify_floatformat): Update to changed TYPE_FLOATFORMAT. + (recursive_dump_type): Likewise. + (init_float_type): Install correct floatformat for byte order. + (arch_float_type): Likewise. + +2017-09-27 Ulrich Weigand <uweigand@de.ibm.com> + * gdbtypes.c (init_type): Change incoming argument from length-in-bytes to length-in-bits. Assert length is a multiple of TARGET_CHAR_BITS. diff --git a/gdb/doublest.c b/gdb/doublest.c index e464177..2047087 100644 --- a/gdb/doublest.c +++ b/gdb/doublest.c @@ -770,22 +770,6 @@ floatformat_from_doublest (const struct floatformat *fmt, } -/* Return the floating-point format for a floating-point variable of - type TYPE. */ - -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); - gdb_assert (TYPE_FLOATFORMAT (type)); - fmt = TYPE_FLOATFORMAT (type)[gdbarch_byte_order (gdbarch)]; - gdb_assert (TYPE_LENGTH (type) >= floatformat_totalsize_bytes (fmt)); - return fmt; -} - /* Extract a floating-point number of type TYPE from a target-order byte-stream at ADDR. Returns the value as type DOUBLEST. */ diff --git a/gdb/doublest.h b/gdb/doublest.h index 23c6ee5..a22baef 100644 --- a/gdb/doublest.h +++ b/gdb/doublest.h @@ -83,12 +83,6 @@ extern enum float_kind floatformat_classify (const struct floatformat *, extern const char *floatformat_mantissa (const struct floatformat *, const bfd_byte *); -/* Given TYPE, return its floatformat. TYPE_FLOATFORMAT() may return - NULL. type_floatformat() detects that and returns a floatformat - based on the type size when FLOATFORMAT is NULL. */ - -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); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index bec1fd5..57bc218 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -2734,22 +2734,30 @@ set_type_code (struct type *type, enum type_code code) determined by the floatformat. Returns size to be used. */ static int -verify_floatformat (int bit, const struct floatformat **floatformats) +verify_floatformat (int bit, const struct floatformat *floatformat) { - gdb_assert (floatformats != NULL); - gdb_assert (floatformats[0] != NULL && floatformats[1] != NULL); + gdb_assert (floatformat != NULL); if (bit == -1) - bit = floatformats[0]->totalsize; - gdb_assert (bit >= 0); + bit = floatformat->totalsize; - size_t len = bit / TARGET_CHAR_BIT; - gdb_assert (len >= floatformat_totalsize_bytes (floatformats[0])); - gdb_assert (len >= floatformat_totalsize_bytes (floatformats[1])); + gdb_assert (bit >= 0); + gdb_assert (bit >= floatformat->totalsize); return bit; } +/* Return the floating-point format for a floating-point variable of + type TYPE. */ + +const struct floatformat * +floatformat_from_type (const struct type *type) +{ + gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT); + gdb_assert (TYPE_FLOATFORMAT (type)); + return TYPE_FLOATFORMAT (type); +} + /* Helper function to initialize the standard scalar types. If NAME is non-NULL, then it is used to initialize the type name. @@ -2842,11 +2850,13 @@ init_float_type (struct objfile *objfile, int bit, const char *name, const struct floatformat **floatformats) { + struct gdbarch *gdbarch = get_objfile_arch (objfile); + const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)]; struct type *t; - bit = verify_floatformat (bit, floatformats); + bit = verify_floatformat (bit, fmt); t = init_type (objfile, TYPE_CODE_FLT, bit, name); - TYPE_FLOATFORMAT (t) = floatformats; + TYPE_FLOATFORMAT (t) = fmt; return t; } @@ -4544,26 +4554,11 @@ recursive_dump_type (struct type *type, int spaces) case TYPE_SPECIFIC_FLOATFORMAT: printfi_filtered (spaces, "floatformat "); - if (TYPE_FLOATFORMAT (type) == NULL) + if (TYPE_FLOATFORMAT (type) == NULL + || TYPE_FLOATFORMAT (type)->name == NULL) puts_filtered ("(null)"); else - { - puts_filtered ("{ "); - if (TYPE_FLOATFORMAT (type)[0] == NULL - || TYPE_FLOATFORMAT (type)[0]->name == NULL) - puts_filtered ("(null)"); - else - puts_filtered (TYPE_FLOATFORMAT (type)[0]->name); - - puts_filtered (", "); - if (TYPE_FLOATFORMAT (type)[1] == NULL - || TYPE_FLOATFORMAT (type)[1]->name == NULL) - puts_filtered ("(null)"); - else - puts_filtered (TYPE_FLOATFORMAT (type)[1]->name); - - puts_filtered (" }"); - } + puts_filtered (TYPE_FLOATFORMAT (type)->name); puts_filtered ("\n"); break; @@ -4908,11 +4903,12 @@ arch_float_type (struct gdbarch *gdbarch, int bit, const char *name, const struct floatformat **floatformats) { + const struct floatformat *fmt = floatformats[gdbarch_byte_order (gdbarch)]; struct type *t; - bit = verify_floatformat (bit, floatformats); + bit = verify_floatformat (bit, fmt); t = arch_type (gdbarch, TYPE_CODE_FLT, bit, name); - TYPE_FLOATFORMAT (t) = floatformats; + TYPE_FLOATFORMAT (t) = fmt; return t; } diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index c96a328..009cea9 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -571,12 +571,11 @@ union type_specific struct gnat_aux_type *gnat_stuff; - /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to two - floatformat objects that describe the floating-point value - that resides within the type. The first is for big endian - targets and the second is for little endian targets. */ + /* * FLOATFORMAT is for TYPE_CODE_FLT. It is a pointer to a + floatformat object that describes the floating-point value + that resides within the type. */ - const struct floatformat **floatformat; + const struct floatformat *floatformat; /* * For TYPE_CODE_FUNC and TYPE_CODE_METHOD types. */ @@ -1434,6 +1433,9 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define TYPE_ERROR_NAME(type) \ (TYPE_NAME (type) ? TYPE_NAME (type) : _("<error type>")) +/* Given TYPE, return its floatformat. */ +const struct floatformat *floatformat_from_type (const struct type *type); + struct builtin_type { /* Integral types. */ |