From: Tom Tromey Date: Wed, 1 Apr 2020 20:09:52 +0000 (-0600) Subject: Add accessors for members of complex numbers X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=4c99290df04ba757b74a21ac5a6d16fe300e49ed;p=binutils-gdb.git Add accessors for members of complex numbers This introduces two new functions that make it simpler to access the components of a complex number. gdb/ChangeLog 2020-04-01 Tom Tromey * valprint.c (generic_value_print_complex): Use accessors. * value.h (value_real_part, value_imaginary_part): Declare. * valops.c (value_real_part, value_imaginary_part): New functions. * value.c (creal_internal_fn, cimag_internal_fn): Use accessors. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7a883e81c2f..d1f408f1a47 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2020-04-01 Tom Tromey + + * valprint.c (generic_value_print_complex): Use accessors. + * value.h (value_real_part, value_imaginary_part): Declare. + * valops.c (value_real_part, value_imaginary_part): New + functions. + * value.c (creal_internal_fn, cimag_internal_fn): Use accessors. + 2020-04-01 Tom Tromey * stabsread.c (rs6000_builtin_type, read_sun_floating_type) diff --git a/gdb/valops.c b/gdb/valops.c index d48474665c3..83fd2584b59 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -3877,6 +3877,31 @@ value_literal_complex (struct value *arg1, return val; } +/* See value.h. */ + +struct value * +value_real_part (struct value *value) +{ + struct type *type = check_typedef (value_type (value)); + struct type *ttype = TYPE_TARGET_TYPE (type); + + gdb_assert (TYPE_CODE (type) == TYPE_CODE_COMPLEX); + return value_from_component (value, ttype, 0); +} + +/* See value.h. */ + +struct value * +value_imaginary_part (struct value *value) +{ + struct type *type = check_typedef (value_type (value)); + struct type *ttype = TYPE_TARGET_TYPE (type); + + gdb_assert (TYPE_CODE (type) == TYPE_CODE_COMPLEX); + return value_from_component (value, ttype, + TYPE_LENGTH (check_typedef (ttype))); +} + /* Cast a value into the appropriate complex data type. */ static struct value * diff --git a/gdb/valprint.c b/gdb/valprint.c index 108a21b6849..80b7514b7e3 100644 --- a/gdb/valprint.c +++ b/gdb/valprint.c @@ -811,16 +811,11 @@ generic_value_print_complex (struct value *val, struct ui_file *stream, { fprintf_filtered (stream, "%s", decorations->complex_prefix); - struct type *type = check_typedef (value_type (val)); - struct value *real_part - = value_from_component (val, TYPE_TARGET_TYPE (type), 0); + struct value *real_part = value_real_part (val); value_print_scalar_formatted (real_part, options, 0, stream); fprintf_filtered (stream, "%s", decorations->complex_infix); - struct value *imag_part - = value_from_component (val, TYPE_TARGET_TYPE (type), - TYPE_LENGTH (TYPE_TARGET_TYPE (type))); - + struct value *imag_part = value_imaginary_part (val); value_print_scalar_formatted (imag_part, options, 0, stream); fprintf_filtered (stream, "%s", decorations->complex_suffix); } diff --git a/gdb/value.c b/gdb/value.c index ceaeb835fa7..f722c272d8b 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -3962,7 +3962,7 @@ creal_internal_fn (struct gdbarch *gdbarch, type *ctype = check_typedef (value_type (cval)); if (TYPE_CODE (ctype) != TYPE_CODE_COMPLEX) error (_("expected a complex number")); - return value_from_component (cval, TYPE_TARGET_TYPE (ctype), 0); + return value_real_part (cval); } /* Implementation of the convenience function $_cimag. Extracts the @@ -3981,8 +3981,7 @@ cimag_internal_fn (struct gdbarch *gdbarch, type *ctype = check_typedef (value_type (cval)); if (TYPE_CODE (ctype) != TYPE_CODE_COMPLEX) error (_("expected a complex number")); - return value_from_component (cval, TYPE_TARGET_TYPE (ctype), - TYPE_LENGTH (TYPE_TARGET_TYPE (ctype))); + return value_imaginary_part (cval); } #if GDB_SELF_TEST diff --git a/gdb/value.h b/gdb/value.h index e4fd258aa8f..85fe6c297f5 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1141,6 +1141,14 @@ extern struct value *value_slice (struct value *, int, int); extern struct value *value_literal_complex (struct value *, struct value *, struct type *); +/* Return the real part of a complex value. */ + +extern struct value *value_real_part (struct value *value); + +/* Return the imaginary part of a complex value. */ + +extern struct value *value_imaginary_part (struct value *value); + extern struct value *find_function_in_inferior (const char *, struct objfile **);