diff options
author | Andrew Burgess <aburgess@broadcom.com> | 2013-01-25 17:16:43 +0000 |
---|---|---|
committer | Andrew Burgess <aburgess@broadcom.com> | 2013-01-25 17:16:43 +0000 |
commit | 8954db33ac73962ac337cc456a782db7e9539c06 (patch) | |
tree | 9ca8b23663dcfd7823bc8f3ecbc8641c397e7613 /gdb/valops.c | |
parent | d79dcc73ac46dad924acf843a2c3546517506f9e (diff) | |
download | gdb-8954db33ac73962ac337cc456a782db7e9539c06.zip gdb-8954db33ac73962ac337cc456a782db7e9539c06.tar.gz gdb-8954db33ac73962ac337cc456a782db7e9539c06.tar.bz2 |
http://sourceware.org/ml/gdb-patches/2012-11/msg00312.html
gdb/ChangeLog
* valarith.c (value_vector_widen): New function for replicating a
scalar into a vector.
(value_binop): Use value_vector_widen to widen scalar to vector
rather than casting, this better matches gcc C behaviour.
* valops.c (value_casst): Update logic for casting between vector
types, and for casting from scalar to vector, try to match gcc C
behaviour.
* value.h (value_vector_widen): Declare.
* opencl-lang.c (opencl_value_cast): New opencl specific casting
function, handle special case for casting scalar to vector.
(opencl_relop): Use opencl_value_cast.
(evaluate_subexp_opencl): Use opencl_value_cast instead of
value_cast, and handle BINOP_ASSIGN, UNOP_CAST, and UNOP_CAST_TYPE
in order to use opencl_value_cast.
gdb/testsuite/ChangeLog
* gdb.base/gnu_vector.c: New variable for use in tests.
* gdb.base/gnu_vector.exp: Update and extend tests to reflect
changes in scalar to vector casting and widening.
* gdb.python/py-type.c: New variables for use in tests.
* gdb.python/py-type.exp: Update vector related tests to reflect
changes in scalar to vector casting and widening.
Diffstat (limited to 'gdb/valops.c')
-rw-r--r-- | gdb/valops.c | 30 |
1 files changed, 7 insertions, 23 deletions
diff --git a/gdb/valops.c b/gdb/valops.c index e3d36a1..b9bc460 100644 --- a/gdb/valops.c +++ b/gdb/valops.c @@ -546,29 +546,13 @@ value_cast (struct type *type, struct value *arg2) minus one, instead of biasing the normal case. */ return value_from_longest (type, -1); } - else if (code1 == TYPE_CODE_ARRAY && TYPE_VECTOR (type) && scalar) - { - /* Widen the scalar to a vector. */ - struct type *eltype; - struct value *val; - LONGEST low_bound, high_bound; - int i; - - if (!get_array_bounds (type, &low_bound, &high_bound)) - error (_("Could not determine the vector bounds")); - - eltype = check_typedef (TYPE_TARGET_TYPE (type)); - arg2 = value_cast (eltype, arg2); - val = allocate_value (type); - - for (i = 0; i < high_bound - low_bound + 1; i++) - { - /* Duplicate the contents of arg2 into the destination vector. */ - memcpy (value_contents_writeable (val) + (i * TYPE_LENGTH (eltype)), - value_contents_all (arg2), TYPE_LENGTH (eltype)); - } - return val; - } + else if (code1 == TYPE_CODE_ARRAY && TYPE_VECTOR (type) + && code2 == TYPE_CODE_ARRAY && TYPE_VECTOR (type2) + && TYPE_LENGTH (type) != TYPE_LENGTH (type2)) + error (_("Cannot convert between vector values of different sizes")); + else if (code1 == TYPE_CODE_ARRAY && TYPE_VECTOR (type) && scalar + && TYPE_LENGTH (type) != TYPE_LENGTH (type2)) + error (_("can only cast scalar to vector of same size")); else if (code1 == TYPE_CODE_VOID) { return value_zero (type, not_lval); |