mirror of
https://github.com/darlinghq/darling-gdb.git
synced 2024-12-12 14:37:43 +00:00
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.
This commit is contained in:
parent
c37f7098e9
commit
120bd36024
@ -1,3 +1,9 @@
|
||||
2010-11-03 Ken Werner <ken.werner@de.ibm.com>
|
||||
|
||||
* valarith.c (value_pos, value_neg, value_complement): Handle
|
||||
vector types.
|
||||
* valops.c (value_one): Likewise.
|
||||
|
||||
2010-11-03 Ken Werner <ken.werner@de.ibm.com>
|
||||
|
||||
* value.h (value_non_lval): Declare.
|
||||
|
@ -1,3 +1,7 @@
|
||||
2010-11-03 Ken Werner <ken.werner@de.ibm.com>
|
||||
|
||||
* gdb.base/gnu_vector.exp: Add unary operator tests.
|
||||
|
||||
2010-11-03 Ken Werner <ken.werner@de.ibm.com>
|
||||
|
||||
* gdb.base/exprs.exp: Add tests for pre-/post- in-/decrement operators.
|
||||
|
@ -50,7 +50,7 @@ if { ![runto main] } {
|
||||
gdb_test "print c4" "\\\$$decimal = \\{1, 2, 3, 4\\}"
|
||||
gdb_test "print c4\[2\]" "\\\$$decimal = 3"
|
||||
|
||||
# Test binary operators on integer vector types
|
||||
# Test operators on integer vector types
|
||||
gdb_test "print i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print i4b" "\\\$$decimal = \\{1, 2, 8, 4\\}"
|
||||
# Arithmetic operators
|
||||
@ -59,15 +59,23 @@ gdb_test "print i4a - i4b" "\\\$$decimal = \\{1, 2, 0, 12\\}"
|
||||
gdb_test "print i4a * i4b" "\\\$$decimal = \\{2, 8, 64, 64\\}"
|
||||
gdb_test "print i4a / i4b" "\\\$$decimal = \\{2, 2, 1, 4\\}"
|
||||
gdb_test "print i4a % i4b" "\\\$$decimal = \\{0, 0, 0, 0\\}"
|
||||
gdb_test "print i4a++" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print ++i4a" "\\\$$decimal = \\{4, 6, 10, 18\\}"
|
||||
gdb_test "print i4a--" "\\\$$decimal = \\{4, 6, 10, 18\\}"
|
||||
gdb_test "print --i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print +i4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print -i4a" "\\\$$decimal = \\{-2, -4, -8, -16\\}"
|
||||
|
||||
# Bitwise operators
|
||||
gdb_test "print i4a & i4b" "\\\$$decimal = \\{0, 0, 8, 0\\}"
|
||||
gdb_test "print i4a | i4b" "\\\$$decimal = \\{3, 6, 8, 20\\}"
|
||||
gdb_test "print i4a ^ i4b" "\\\$$decimal = \\{3, 6, 0, 20\\}"
|
||||
gdb_test "print ~i4a" "\\\$$decimal = \\{-3, -5, -9, -17\\}"
|
||||
# Shift operators
|
||||
gdb_test "print i4a << i4b" "\\\$$decimal = \\{4, 16, 2048, 256\\}"
|
||||
gdb_test "print i4a >> i4b" "\\\$$decimal = \\{1, 1, 0, 1\\}"
|
||||
|
||||
# Test binary operators on floating point vector types
|
||||
# Test operators on floating point vector types
|
||||
gdb_test "print f4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print f4b" "\\\$$decimal = \\{1, 2, 8, 4\\}"
|
||||
# Arithmetic operators
|
||||
@ -75,6 +83,8 @@ gdb_test "print f4a + f4b" "\\\$$decimal = \\{3, 6, 16, 20\\}"
|
||||
gdb_test "print f4a - f4b" "\\\$$decimal = \\{1, 2, 0, 12\\}"
|
||||
gdb_test "print f4a * f4b" "\\\$$decimal = \\{2, 8, 64, 64\\}"
|
||||
gdb_test "print f4a / f4b" "\\\$$decimal = \\{2, 2, 1, 4\\}"
|
||||
gdb_test "print +f4a" "\\\$$decimal = \\{2, 4, 8, 16\\}"
|
||||
gdb_test "print -f4a" "\\\$$decimal = \\{-2, -4, -8, -16\\}"
|
||||
|
||||
# Test scalar to vector widening
|
||||
gdb_test "print (int2) 1" "\\\$$decimal = \\{1, 1\\}"
|
||||
|
@ -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);
|
||||
|
||||
return value_from_longest (type, ~value_as_long (arg1));
|
||||
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 val;
|
||||
}
|
||||
|
||||
/* The INDEX'th bit of SET value whose value_type is TYPE,
|
||||
|
14
gdb/valops.c
14
gdb/valops.c
@ -871,6 +871,20 @@ value_one (struct type *type, enum lval_type lv)
|
||||
{
|
||||
val = value_from_longest (type, (LONGEST) 1);
|
||||
}
|
||||
else if (TYPE_CODE (type1) == TYPE_CODE_ARRAY && TYPE_VECTOR (type1))
|
||||
{
|
||||
struct type *eltype = check_typedef (TYPE_TARGET_TYPE (type1));
|
||||
int i, n = TYPE_LENGTH (type1) / TYPE_LENGTH (eltype);
|
||||
struct value *tmp;
|
||||
|
||||
val = allocate_value (type);
|
||||
for (i = 0; i < n; i++)
|
||||
{
|
||||
tmp = value_one (eltype, lv);
|
||||
memcpy (value_contents_writeable (val) + i * TYPE_LENGTH (eltype),
|
||||
value_contents_all (tmp), TYPE_LENGTH (eltype));
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
error (_("Not a numeric type."));
|
||||
|
Loading…
Reference in New Issue
Block a user