From 7584bb30cf380cff9cc3914b1b523c5a1a5b4302 Mon Sep 17 00:00:00 2001 From: Andrew Burgess Date: Thu, 7 Mar 2019 14:53:37 +0000 Subject: [PATCH] gdb: Move value_from_host_double into value.c and make more use of it The function value_from_host_double can be moved from f-lang.c into value.c as a generally useful function, and then used more widely. Tested on X86-64/GNU Linux with no regressions. gdb/ChangeLog: * f-lang.c (value_from_host_double): Moved to... * value.c (value_from_host_double): ...here. * value.h (value_from_host_double): Declare. * guile/scm-math.c (vlscm_convert_typed_number): Use value_from_host_double. (vlscm_convert_number): Likewise. * guile/scm-value.c (gdbscm_value_to_real): Likewise. * python/py-value.c (convert_value_from_python): Likewise. --- gdb/ChangeLog | 11 +++++++++++ gdb/f-lang.c | 14 -------------- gdb/guile/scm-math.c | 16 ++-------------- gdb/guile/scm-value.c | 3 +-- gdb/python/py-value.c | 6 +----- gdb/value.c | 13 +++++++++++++ gdb/value.h | 1 + 7 files changed, 29 insertions(+), 35 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 9e03e85e2c6..d3d6e5b4ee6 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2019-03-07 Andrew Burgess + + * f-lang.c (value_from_host_double): Moved to... + * value.c (value_from_host_double): ...here. + * value.h (value_from_host_double): Declare. + * guile/scm-math.c (vlscm_convert_typed_number): Use + value_from_host_double. + (vlscm_convert_number): Likewise. + * guile/scm-value.c (gdbscm_value_to_real): Likewise. + * python/py-value.c (convert_value_from_python): Likewise. + 2019-03-06 Tom Tromey * gcore.c (write_gcore_file): Use SCOPE_EXIT. diff --git a/gdb/f-lang.c b/gdb/f-lang.c index 24f0e61a46b..7bd119690b4 100644 --- a/gdb/f-lang.c +++ b/gdb/f-lang.c @@ -241,20 +241,6 @@ f_collect_symbol_completion_matches (completion_tracker &tracker, text, word, ":", code); } -/* Create and return a value object of TYPE containing the value D. The - TYPE must be of TYPE_CODE_FLT, and must be large enough to hold D once - it is converted to target format. */ - -static struct value * -value_from_host_double (struct type *type, double d) -{ - struct value *value = allocate_value (type); - gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT); - target_float_from_host_double (value_contents_raw (value), - value_type (value), d); - return value; -} - /* Special expression evaluation cases for Fortran. */ struct value * evaluate_subexp_f (struct type *expect_type, struct expression *exp, diff --git a/gdb/guile/scm-math.c b/gdb/guile/scm-math.c index a31a1455487..d351ed0522c 100644 --- a/gdb/guile/scm-math.c +++ b/gdb/guile/scm-math.c @@ -559,13 +559,7 @@ vlscm_convert_typed_number (const char *func_name, int obj_arg_pos, SCM obj, } } else if (TYPE_CODE (type) == TYPE_CODE_FLT) - { - struct value *value = allocate_value (type); - target_float_from_host_double (value_contents_raw (value), - value_type (value), - scm_to_double (obj)); - return value; - } + return value_from_host_double (type, scm_to_double (obj)); else { *except_scmp = gdbscm_make_type_error (func_name, obj_arg_pos, obj, @@ -645,13 +639,7 @@ vlscm_convert_number (const char *func_name, int obj_arg_pos, SCM obj, gdbscm_scm_to_ulongest (obj)); } else if (scm_is_real (obj)) - { - struct value *value = allocate_value (bt->builtin_double); - target_float_from_host_double (value_contents_raw (value), - value_type (value), - scm_to_double (obj)); - return value; - } + return value_from_host_double (bt->builtin_double, scm_to_double (obj)); *except_scmp = gdbscm_make_out_of_range_error (func_name, obj_arg_pos, obj, _("value not a number representable on the target")); diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c index 294e3e7cafc..658924b1197 100644 --- a/gdb/guile/scm-value.c +++ b/gdb/guile/scm-value.c @@ -903,8 +903,7 @@ gdbscm_value_to_real (SCM self) if (is_floating_value (value)) { d = target_float_to_host_double (value_contents (value), type); - check = allocate_value (type); - target_float_from_host_double (value_contents_raw (check), type, d); + check = value_from_host_double (type, d); } else if (TYPE_UNSIGNED (type)) { diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 63a9952e513..dd6a536b6ad 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1739,11 +1739,7 @@ convert_value_from_python (PyObject *obj) double d = PyFloat_AsDouble (obj); if (! PyErr_Occurred ()) - { - value = allocate_value (builtin_type_pyfloat); - target_float_from_host_double (value_contents_raw (value), - value_type (value), d); - } + value = value_from_host_double (builtin_type_pyfloat, d); } else if (gdbpy_is_string (obj)) { diff --git a/gdb/value.c b/gdb/value.c index 50e47a936aa..dc297dfe0f9 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -3430,6 +3430,19 @@ value_from_pointer (struct type *type, CORE_ADDR addr) return val; } +/* Create and return a value object of TYPE containing the value D. The + TYPE must be of TYPE_CODE_FLT, and must be large enough to hold D once + it is converted to target format. */ + +struct value * +value_from_host_double (struct type *type, double d) +{ + struct value *value = allocate_value (type); + gdb_assert (TYPE_CODE (type) == TYPE_CODE_FLT); + target_float_from_host_double (value_contents_raw (value), + value_type (value), d); + return value; +} /* Create a value of type TYPE whose contents come from VALADDR, if it is non-null, and whose memory address (in the inferior) is diff --git a/gdb/value.h b/gdb/value.h index 1ca91e041a1..d3905cc354a 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -669,6 +669,7 @@ extern void pack_long (gdb_byte *buf, struct type *type, LONGEST num); extern struct value *value_from_longest (struct type *type, LONGEST num); extern struct value *value_from_ulongest (struct type *type, ULONGEST num); extern struct value *value_from_pointer (struct type *type, CORE_ADDR addr); +extern struct value *value_from_host_double (struct type *type, double d); extern struct value *value_from_history_ref (const char *, const char **); extern struct value *value_from_component (struct value *, struct type *, LONGEST); -- 2.30.2