From 120bd36024971107c9f5dce6882e343c836a6402 Mon Sep 17 00:00:00 2001 From: Ken Werner Date: Wed, 3 Nov 2010 14:06:27 +0000 Subject: gdb: * valarith.c (value_pos, value_neg, value_complement): Handle vector types. * valops.c (value_one): Likewise. gdb/testsuite: * gdb.base/gnu_vector.exp: Add unary operator tests. --- gdb/valarith.c | 45 ++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 42 insertions(+), 3 deletions(-) (limited to 'gdb/valarith.c') diff --git a/gdb/valarith.c b/gdb/valarith.c index 88f1448..f6e3a05 100644 --- a/gdb/valarith.c +++ b/gdb/valarith.c @@ -1712,6 +1712,14 @@ value_pos (struct value *arg1) { return value_from_longest (type, value_as_long (arg1)); } + else if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)) + { + struct value *val = allocate_value (type); + + memcpy (value_contents_raw (val), value_contents (arg1), + TYPE_LENGTH (type)); + return val; + } else { error ("Argument to positive operation not a number."); @@ -1749,6 +1757,20 @@ value_neg (struct value *arg1) { return value_from_longest (type, -value_as_long (arg1)); } + else if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)) + { + struct value *tmp, *val = allocate_value (type); + struct type *eltype = check_typedef (TYPE_TARGET_TYPE (type)); + int i, n = TYPE_LENGTH (type) / TYPE_LENGTH (eltype); + + for (i = 0; i < n; i++) + { + tmp = value_neg (value_subscript (arg1, i)); + memcpy (value_contents_writeable (val) + i * TYPE_LENGTH (eltype), + value_contents_all (tmp), TYPE_LENGTH (eltype)); + } + return val; + } else { error (_("Argument to negate operation not a number.")); @@ -1760,14 +1782,31 @@ struct value * value_complement (struct value *arg1) { struct type *type; + struct value *val; arg1 = coerce_ref (arg1); type = check_typedef (value_type (arg1)); - if (!is_integral_type (type)) - error (_("Argument to complement operation not an integer or boolean.")); + if (is_integral_type (type)) + val = value_from_longest (type, ~value_as_long (arg1)); + else if (TYPE_CODE (type) == TYPE_CODE_ARRAY && TYPE_VECTOR (type)) + { + struct value *tmp; + struct type *eltype = check_typedef (TYPE_TARGET_TYPE (type)); + int i, n = TYPE_LENGTH (type) / TYPE_LENGTH (eltype); + + val = allocate_value (type); + for (i = 0; i < n; i++) + { + tmp = value_complement (value_subscript (arg1, i)); + memcpy (value_contents_writeable (val) + i * TYPE_LENGTH (eltype), + value_contents_all (tmp), TYPE_LENGTH (eltype)); + } + } + else + error (_("Argument to complement operation not an integer, boolean.")); - return value_from_longest (type, ~value_as_long (arg1)); + return val; } /* The INDEX'th bit of SET value whose value_type is TYPE, -- cgit v1.1