This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [patch] Small fix for assigning values to vectors


On Saturday, July 10, 2010 05:39:09 pm Daniel Jacobowitz wrote:
> On Sat, Jul 10, 2010 at 03:03:53PM +0200, Ken Werner wrote:
> > But while we are at it. Are there any objections on copying the contents
> > to the destination instead of creating a pointer?
> 
> I think we're going a bit too far now, and maybe we need to figure out
> what the semantics of internalvars are supposed to be...
> 
> With this, IIUC, "set $internalvar = program_array" is going to read
> the whole array.  Previously, it would decay to a pointer as in C.

I agree. As I don't have a strong opinion either way on this particular case 
I'd leave that decision to more experienced GDB developers.

Here is the patch I intended to post where only the call to 
value_coerce_to_target is omitted and the value_must_coerce_to_target routine 
returns zero in case of a vector. Tested on powerpc64-*-linux-gnu with no 
regressions.

Regards.
-ken
Changelog:

2010-07-09  Ken Werner  <ken.werner@de.ibm.com>

	* valops.c (value_assign): Do not call to value_coerce_to_target.
	(value_must_coerce_to_target): Return 0 in case of TYPE_VECTOR.

testsuite/ChangeLog:

2010-07-09  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 -p -u -r1.248 valops.c
--- gdb/valops.c	28 Jun 2010 20:35:52 -0000	1.248
+++ gdb/valops.c	10 Jul 2010 10:16:36 -0000
@@ -1079,10 +1079,7 @@ value_assign (struct value *toval, struc
 
   type = value_type (toval);
   if (VALUE_LVAL (toval) != lval_internalvar)
-    {
-      toval = value_coerce_to_target (toval);
-      fromval = value_cast (type, fromval);
-    }
+    fromval = value_cast (type, fromval);
   else
     {
       /* Coerce arrays and functions to pointers, except for arrays
@@ -1427,6 +1424,7 @@ value_must_coerce_to_target (struct valu
   switch (TYPE_CODE (valtype))
     {
     case TYPE_CODE_ARRAY:
+      return TYPE_VECTOR (valtype) ? 0 : 1;
     case TYPE_CODE_STRING:
       return 1;
     default:
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 \

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]