diff options
author | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2017-11-06 15:59:36 +0100 |
---|---|---|
committer | Ulrich Weigand <ulrich.weigand@de.ibm.com> | 2017-11-06 16:00:12 +0100 |
commit | 50eff16b85073287b1b184a257a8fd80e960fe02 (patch) | |
tree | a25945447d908edd2a5a0c878b311dfacc205147 /gdb/ada-typeprint.c | |
parent | 66c02b9ed1eabf1d7981c0c27ec9fd3c17fc5d35 (diff) | |
download | fsf-binutils-gdb-50eff16b85073287b1b184a257a8fd80e960fe02.zip fsf-binutils-gdb-50eff16b85073287b1b184a257a8fd80e960fe02.tar.gz fsf-binutils-gdb-50eff16b85073287b1b184a257a8fd80e960fe02.tar.bz2 |
Target FP: Perform Ada fixed-point scaling in target format
One of the few still remaining uses of DOUBLEST in GDB is the Ada front-end
code that handles scaling of Ada fixed-point types. The target format for
those types is some integer format; to convert those values to standard
floating-point representation, that integer needs to be multiplied by a
rational scale factor, given as a pair of numerator and denominator.
To avoid having to deal with long integer arithmetic, the current Ada
front-end code currently performs those scaling operations in host
DOUBLEST arithmetic. To eliminate this use of DOUBLEST, this patch
changes the front-end to instead perform those operations in the
*target* floating-point format (chosing to use the target "long double").
The implementation is mostly straight-forward, using value_cast and
value_binop to perform the target operations.
Scanning in the scale numerator and denominator is now done into
a host "long long" instead of a DOUBLEST, which should be large
enough to hold all possible values. (Otherwise, this can be replaced
by target-format target_float_from_string operations as well.)
Printing fixed-point types and values should be completely unchanges,
using target_float_to_string with the same format strings as current code.
gdb/ChangeLog:
2017-11-06 Ulrich Weigand <uweigand@de.ibm.com>
* ada-lang.c (cast_to_fixed): Reimplement in target arithmetic.
(cast_from_fixed): Likewise.
(ada_scaling_type): New function.
(ada_delta): Return value instead of DOUBLEST. Perform target
arithmetic instead of host arithmetic.
(scaling_factor): Rename to ...
(ada_scaling_factor) ... this. Make non-static. Return value instead
of DOUBLEST. Perform target arithmetic instead of host arithmetic.
(ada_fixed_to_float): Remove.
(ada_float_to_fixed): Remove.
* ada-lang.h (ada_fixed_to_float): Remove.
(ada_float_to_fixed): Remove.
(ada_delta): Return value instead of DOUBLEST.
(ada_scaling_factor): Add prototype.
* ada-typeprint.c: Include "target-float.h".
(print_fixed_point_type): Perform target arithmetic instead of
host arithmetic.
* ada-valprint.c: Include "target-float.h".
(ada_val_print_num): Perform target arithmetic instead of
host arithmetic for fixed-point types.
Diffstat (limited to 'gdb/ada-typeprint.c')
-rw-r--r-- | gdb/ada-typeprint.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/gdb/ada-typeprint.c b/gdb/ada-typeprint.c index 0d1f9dc..9d23302 100644 --- a/gdb/ada-typeprint.c +++ b/gdb/ada-typeprint.c @@ -31,6 +31,7 @@ #include "demangle.h" #include "c-lang.h" #include "typeprint.h" +#include "target-float.h" #include "ada-lang.h" #include <ctype.h> @@ -356,16 +357,23 @@ print_enum_type (struct type *type, struct ui_file *stream) static void print_fixed_point_type (struct type *type, struct ui_file *stream) { - DOUBLEST delta = ada_delta (type); - DOUBLEST small = ada_fixed_to_float (type, 1); + struct value *delta = ada_delta (type); + struct value *small = ada_scaling_factor (type); - if (delta < 0.0) + if (delta == nullptr) fprintf_filtered (stream, "delta ??"); else { - fprintf_filtered (stream, "delta %g", (double) delta); - if (delta != small) - fprintf_filtered (stream, " <'small = %g>", (double) small); + std::string str; + str = target_float_to_string (value_contents (delta), + value_type (delta), "%g"); + fprintf_filtered (stream, "delta %s", str.c_str()); + if (!value_equal (delta, small)) + { + str = target_float_to_string (value_contents (small), + value_type (small), "%g"); + fprintf_filtered (stream, " <'small = %s>", str.c_str()); + } } } |