From: Tom Tromey Date: Tue, 15 Apr 2025 18:29:50 +0000 (-0600) Subject: Clean up value_struct_elt_bitpos X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=2b4909278a4c664b9f457efbcc475ed288b730ac;p=thirdparty%2Fbinutils-gdb.git Clean up value_struct_elt_bitpos value_struct_elt_bitpos is weird: it takes an in/out value parameter, and it takes an error string parameter. However, it only has a single caller, which never uses the "out" value. I think it was done this way to mimic value_struct_elt. However, value_struct_elt is pretty ugly and I don't think it's worth imitating. This patch cleans up value_struct_elt_bitpos a bit. Approved-By: Simon Marchi --- diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 3855bdecc16..8a2e26368d7 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -1096,8 +1096,7 @@ valpy_getitem (PyObject *self, PyObject *key) res_val = value_struct_elt (&tmp, {}, field.get (), NULL, "struct/class/union"); else if (bitpos >= 0) - res_val = value_struct_elt_bitpos (&tmp, bitpos, field_type, - "struct/class/union"); + res_val = value_struct_elt_bitpos (tmp, bitpos, field_type); else if (base_class_type != NULL) { struct type *val_type; diff --git a/gdb/valops.c b/gdb/valops.c index 1b63343c4a7..94f908df420 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -2420,47 +2420,42 @@ value_struct_elt (struct value **argp, return v; } -/* Given *ARGP, a value of type structure or union, or a pointer/reference +/* Given VAL, a value of type structure or union, or a pointer/reference to a structure or union, extract and return its component (field) of type FTYPE at the specified BITPOS. Throw an exception on error. */ struct value * -value_struct_elt_bitpos (struct value **argp, int bitpos, struct type *ftype, - const char *err) +value_struct_elt_bitpos (struct value *val, int bitpos, struct type *ftype) { struct type *t; int i; - *argp = coerce_array (*argp); + val = coerce_array (val); - t = check_typedef ((*argp)->type ()); + t = check_typedef (val->type ()); while (t->is_pointer_or_reference ()) { - *argp = value_ind (*argp); - if (check_typedef ((*argp)->type ())->code () != TYPE_CODE_FUNC) - *argp = coerce_array (*argp); - t = check_typedef ((*argp)->type ()); + val = value_ind (val); + if (check_typedef (val->type ())->code () != TYPE_CODE_FUNC) + val = coerce_array (val); + t = check_typedef (val->type ()); } if (t->code () != TYPE_CODE_STRUCT && t->code () != TYPE_CODE_UNION) - error (_("Attempt to extract a component of a value that is not a %s."), - err); + error (_("Attempt to extract a component of non-aggregate value.")); for (i = TYPE_N_BASECLASSES (t); i < t->num_fields (); i++) { if (!t->field (i).is_static () && bitpos == t->field (i).loc_bitpos () && types_equal (ftype, t->field (i).type ())) - return (*argp)->primitive_field (0, i, t); + return val->primitive_field (0, i, t); } error (_("No field with matching bitpos and type.")); - - /* Never hit. */ - return NULL; } /* Search through the methods of an object (and its bases) to find a diff --git a/gdb/value.h b/gdb/value.h index 0cbcfca267f..71d0ba17f43 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -1297,10 +1297,9 @@ extern struct value *value_struct_elt (struct value **argp, const char *name, int *static_memfuncp, const char *err); -extern struct value *value_struct_elt_bitpos (struct value **argp, +extern struct value *value_struct_elt_bitpos (struct value *val, int bitpos, - struct type *field_type, - const char *err); + struct type *field_type); extern struct value *value_aggregate_elt (struct type *curtype, const char *name,