diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2016-09-06 17:31:53 +0200 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2016-09-06 17:31:53 +0200 |
commit | 9b790ce7227fa346d08a41462119e9a3e93f5e80 (patch) | |
tree | b6e4e77409e5c0566b05548b01e3b1e700b72719 /gdb/gdbarch.c | |
parent | 49f190bcb7f074ea2e27d4e967e4fae9ed7dafb6 (diff) | |
download | gdb-9b790ce7227fa346d08a41462119e9a3e93f5e80.zip gdb-9b790ce7227fa346d08a41462119e9a3e93f5e80.tar.gz gdb-9b790ce7227fa346d08a41462119e9a3e93f5e80.tar.bz2 |
Add gdbarch callback to provide formats for debug info float types
At this point, all TYPE_CODE_FLT types carry their floating-point format,
except for those creating from reading DWARF or stabs debug info. Those
will be addressed by this commit.
The main issue here is that we actually have to determine which floating-
point format to use. Currently, we only have the type length as input
to this decision. In the future, we may hopefully get --at least in
DWARF-- additional information to help disambiguate multiple different
formats of the same length. For now, we can still look at the type name
as a hint.
This decision logic is encapsulated in a gdbarch callback to allow
platform-specific overrides. The default implementation use the same
logic (compare type length against the various gdbarch_..._bit sizes)
that is currently implemented in floatformat_from_length.
With this commit, all platforms still use the default logic, so there
should be no actual change in behavior. A follow-on commit will add
support for __float128 on Intel and Power.
Once dwarf2read.c and stabsread.c make use of the new callback to
determine floating-point formats, we're now sure every TYPE_CODE_FLT
type will always carry its format. The commit therefore adds asserts
to verify_floatformat to ensure new code will continue to always
provide formats, and removes the code in floatformat_from_type that
used to handle types with a NULL TYPE_FLOATFORMAT.
gdb/ChangeLog:
* gdbarch.sh (floatformat_for_type): New gdbarch callback.
* gdbarch.h, gdbarch.c: Re-generate.
* arch-utils.h (default_floatformat_for_type): New prototype.
* arch-utils.c (default_floatformat_for_type): New function.
* doublest.c (floatformat_from_length): Remove.
(floatformat_from_type): Assume TYPE_FLOATFORMAT is non-NULL.
* gdbtypes.c (verify_floatformat): Require non-NULL format.
* dwarf2read.c (dwarf2_init_float_type): New function.
(read_base_type): Use it.
* stabsread.c (dbx_init_float_type): New function.
(read_sun_floating_type): Use it.
(read_range_type): Likewise.
Signed-off-by: Ulrich Weigand <ulrich.weigand@de.ibm.com>
Diffstat (limited to 'gdb/gdbarch.c')
-rw-r--r-- | gdb/gdbarch.c | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gdb/gdbarch.c b/gdb/gdbarch.c index af7359e..4d8ef18 100644 --- a/gdb/gdbarch.c +++ b/gdb/gdbarch.c @@ -176,6 +176,7 @@ struct gdbarch const struct floatformat ** double_format; int long_double_bit; const struct floatformat ** long_double_format; + gdbarch_floatformat_for_type_ftype *floatformat_for_type; int ptr_bit; int addr_bit; int dwarf2_addr_size; @@ -376,6 +377,7 @@ gdbarch_alloc (const struct gdbarch_info *info, gdbarch->float_bit = 4*TARGET_CHAR_BIT; gdbarch->double_bit = 8*TARGET_CHAR_BIT; gdbarch->long_double_bit = 8*TARGET_CHAR_BIT; + gdbarch->floatformat_for_type = default_floatformat_for_type; gdbarch->ptr_bit = gdbarch->int_bit; gdbarch->char_signed = -1; gdbarch->virtual_frame_pointer = legacy_virtual_frame_pointer; @@ -522,6 +524,7 @@ verify_gdbarch (struct gdbarch *gdbarch) /* Skip verify of long_double_bit, invalid_p == 0 */ if (gdbarch->long_double_format == 0) gdbarch->long_double_format = floatformats_ieee_double; + /* Skip verify of floatformat_for_type, invalid_p == 0 */ /* Skip verify of ptr_bit, invalid_p == 0 */ if (gdbarch->addr_bit == 0) gdbarch->addr_bit = gdbarch_ptr_bit (gdbarch); @@ -973,6 +976,9 @@ gdbarch_dump (struct gdbarch *gdbarch, struct ui_file *file) "gdbarch_dump: float_format = %s\n", pformat (gdbarch->float_format)); fprintf_unfiltered (file, + "gdbarch_dump: floatformat_for_type = <%s>\n", + host_address_to_string (gdbarch->floatformat_for_type)); + fprintf_unfiltered (file, "gdbarch_dump: fp0_regnum = %s\n", plongest (gdbarch->fp0_regnum)); fprintf_unfiltered (file, @@ -1729,6 +1735,23 @@ set_gdbarch_long_double_format (struct gdbarch *gdbarch, gdbarch->long_double_format = long_double_format; } +const struct floatformat ** +gdbarch_floatformat_for_type (struct gdbarch *gdbarch, const char *name, int length) +{ + gdb_assert (gdbarch != NULL); + gdb_assert (gdbarch->floatformat_for_type != NULL); + if (gdbarch_debug >= 2) + fprintf_unfiltered (gdb_stdlog, "gdbarch_floatformat_for_type called\n"); + return gdbarch->floatformat_for_type (gdbarch, name, length); +} + +void +set_gdbarch_floatformat_for_type (struct gdbarch *gdbarch, + gdbarch_floatformat_for_type_ftype floatformat_for_type) +{ + gdbarch->floatformat_for_type = floatformat_for_type; +} + int gdbarch_ptr_bit (struct gdbarch *gdbarch) { |