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]

[RFA][2/5] New port: Cell BE SPU (valops.c fix)


Hello,

this fixes another problem for the SPU port.  In value_assign,
when assigning to a register that is marked as CONVERT_REGISTER_P,
the front end always calls VALUE_TO_REGISTER, which always cleans
out the full previous contents of the register.

This happens even if the value is a bitfield that occupies only
part of the register, and the remaining contents should *not* be
changed.  The back end's VALUE_TO_REGISTER has no real chance to
do this right since it doesn't even get the value object as input,
and thus doesn't know that value_bitsize is nonzero.

This probably rarely triggers on other architectures, as those
registers that require CONVERT_REGISTER_P tend to be special 
registers that usually don't hold bitfield values.  On the SPU
however, every general-purpose register needs CONVERT_REGISTER_P
(since they are really 16-byte vector registers, and loading/
storing scalar values required a special conversion).

The patch below 'fixes' this for SPU by at least not calling
VALUE_TO_REGISTER for bitfield assignments, but falling back
to the default code.  This happens to work for SPU; other 
platforms with special conversion needs might need to get a
chance for the back-end to get involved even then.  I guess
when this happens we can think of an extended interface that
would pass the bitsize information through to the back-end ...

Tested on SPU (where it fixes about a dozen test cases).
Also tested without regressions on s390-ibm-linux and
s390x-ibm-linux.

OK?


Bye,
Ulrich


ChangeLog:

	* valops.c (value_assign): Do not call VALUE_TO_REGISTER
	for bitfield assignments.


diff -urN gdb-orig/gdb/valops.c gdb-head/gdb/valops.c
--- gdb-orig/gdb/valops.c	2006-10-09 21:28:14.000000000 +0200
+++ gdb-head/gdb/valops.c	2006-10-30 19:39:02.972619008 +0100
@@ -643,6 +643,7 @@
 	  error (_("Value being assigned to is no longer active."));
 	
 	if (VALUE_LVAL (toval) == lval_register
+	    && value_bitsize (toval) == 0
 	    && CONVERT_REGISTER_P (VALUE_REGNUM (toval), type))
 	  {
 	    /* If TOVAL is a special machine register requiring
-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  Ulrich.Weigand@de.ibm.com


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