This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch] Small fix for assigning values to vectors
- From: Ken Werner <ken at linux dot vnet dot ibm dot com>
- To: gdb-patches at sourceware dot org
- Date: Tue, 6 Jul 2010 15:58:07 +0200
- Subject: [patch] Small fix for assigning values to vectors
Hi,
I noticed that with the current GDB it is possible to assign values to
not_lval-vector-values. Consider the following sample code:
/* gcc -g -maltivec -mabi=altivec altivec.c -o altivec */
#include <altivec.h>
int test () {
return 1;
}
vector int vtest () {
return (vector int) {0, 1, 2, 3};
}
int main () {
return 0;
}
Here is the corresponding gdb session:
gdb ./altivec
start
[...]
(gdb) p test()
$1 = 1
(gdb) p &test()
Attempt to take address of value not located in memory.
(gdb) set variable test() = 2
Left operand of assignment is not an lvalue.
(gdb)
(gdb)
(gdb) p vtest()
$2 = {0, 1, 2, 3}
(gdb) p &vtest()
$3 = (__vector signed int *) 0x10020008
(gdb) set variable vtest() = {3, 2, 1, 0}
(gdb) p vtest()
$4 = {0, 1, 2, 3}
As can be seen the GDB behaves incorrect for vector types. A quick look to the
valops.c:value_assign function shows that value_coerce_to_target creates a
value with lval set to lval_memory for array types (including vectors). The
code was introduced with the following patch: http://sourceware.org/ml/gdb-
patches/2008-03/msg00079.html. I have to admit that I do not entirely
understand why value_coerce_to_target is called here. The attached patch adds
a check for vector types within value_coerce_to_target and extends the
altivec-abi testcase. Tested on powerpc64-*-linux-gnu, no regressions. Any
suggestions are welcome.
Regards
-ken
Changelog:
2010-07-06 Ken Werner <ken.werner@de.ibm.com>
* valops.c (value_must_coerce_to_target): Return 0 in case of TYPE_VECTOR.
testsuite/ChangeLog:
2010-07-06 Ken Werner <ken.werner@de.ibm.com>
* gdb.arch/altivec-abi.exp: New tests.
Index: gdb/valops.c
===================================================================
RCS file: /cvs/src/src/gdb/valops.c,v
retrieving revision 1.248
diff -u -p -r1.248 valops.c
--- gdb/valops.c 28 Jun 2010 20:35:52 -0000 1.248
+++ gdb/valops.c 6 Jul 2010 12:47:00 -0000
@@ -1424,6 +1424,9 @@ value_must_coerce_to_target (struct valu
valtype = check_typedef (value_type (val));
+ if (TYPE_VECTOR (valtype))
+ return 0;
+
switch (TYPE_CODE (valtype))
{
case TYPE_CODE_ARRAY:
Index: gdb/testsuite/gdb.arch/altivec-abi.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.arch/altivec-abi.exp,v
retrieving revision 1.19
diff -u -p -r1.19 altivec-abi.exp
--- gdb/testsuite/gdb.arch/altivec-abi.exp 2 Jul 2010 18:02:19 -0000 1.19
+++ gdb/testsuite/gdb.arch/altivec-abi.exp 6 Jul 2010 12:47:01 -0000
@@ -98,6 +98,16 @@ proc altivec_abi_tests { extra_flags for
gdb_test "p vec_func(vshort_d,vushort_d,vint_d,vuint_d,vchar_d,vuchar_d,vfloat_d,x_d,y_d,a_d,b_d,c_d,intv_on_stack_d)" \
".\[0-9\]+ = .0, 0, 0, 0." "call inferior function with vectors (2)"
+ # Attempt to take address of the return value of vec_func.
+ gdb_test "p &vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack)" \
+ "Attempt to take address of value not located in memory." \
+ "Attempt to take address of the return value of vec_func"
+
+ # Attempt to assing a value to the return value of vec_func.
+ gdb_test "set variable vec_func(vshort,vushort,vint,vuint,vchar,vuchar,vfloat,x,y,a,b,c,intv_on_stack) = {0,1,2,3}" \
+ "Left operand of assignment is not an lvalue." \
+ "Attempt to assing a value to the return value of vec_func"
+
# Let's step into the function, to see if the args are printed correctly.
gdb_test "step" \
$pattern1 \