Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [RFA] Fix broken sysv return value code on powerpc
@ 2005-08-17  0:25 Mark Kettenis
  2005-08-17  0:37 ` Kevin Buettner
  0 siblings, 1 reply; 2+ messages in thread
From: Mark Kettenis @ 2005-08-17  0:25 UTC (permalink / raw)
  To: gdb-patches

Not sure whether I submitted this patch for approval before.  Anyway,
it fixes how we deal with the broken GCC 3.3.5 on OpenBSD 3.7.  It
also fixes some regression tests on NetBSD 2.0 if I remove the attempt
to fix things up from ppcnbsd-tdep.c.  There's a small risk that GCC
is broken in a different way now, but I suspect that the tests in the
testsuite that FAIL (and PASS with this fix) were introduced after the
origional code was checked in.

In any case, the new code is much simpler ;-).

ok?

Mark

Index: ChangeLog
from  Mark Kettenis  <kettenis@gnu.org>

	* ppc-sysv-tdep.c (do_ppc_sysv_return_value): Fix the code that
	deals with the broken GCC convention.

Index: ppc-sysv-tdep.c
===================================================================
RCS file: /cvs/src/src/gdb/ppc-sysv-tdep.c,v
retrieving revision 1.30
diff -u -p -r1.30 ppc-sysv-tdep.c
--- ppc-sysv-tdep.c 16 Aug 2005 17:12:35 -0000 1.30
+++ ppc-sysv-tdep.c 16 Aug 2005 17:16:28 -0000
@@ -451,52 +451,33 @@ do_ppc_sysv_return_value (struct gdbarch
     }
   if (broken_gcc && TYPE_LENGTH (type) <= 8)
     {
+      /* GCC screwed up for structures or unions whose size is less
+	 than or equal to 8 bytes..  Instead of left-aligning, it
+	 right-aligns the data into the buffer formed by r3, r4.  */
+      gdb_byte regvals[MAX_REGISTER_SIZE * 2];
+      int len = TYPE_LENGTH (type);
+      int offset = (2 * tdep->wordsize - len) % tdep->wordsize;
+
       if (readbuf)
 	{
-	  /* GCC screwed up.  The last register isn't "left" aligned.
-	     Need to extract the least significant part of each
-	     register and then store that.  */
-	  /* Transfer any full words.  */
-	  int word = 0;
-	  while (1)
-	    {
-	      ULONGEST reg;
-	      int len = TYPE_LENGTH (type) - word * tdep->wordsize;
-	      if (len <= 0)
-		break;
-	      if (len > tdep->wordsize)
-		len = tdep->wordsize;
-	      regcache_cooked_read_unsigned (regcache,
-					     tdep->ppc_gp0_regnum + 3 + word,
-					     &reg);
-	      store_unsigned_integer (((bfd_byte *) readbuf
-				       + word * tdep->wordsize), len, reg);
-	      word++;
-	    }
+	  regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 3,
+				regvals + 0 * tdep->wordsize);
+	  if (len > tdep->wordsize)
+	    regcache_cooked_read (regcache, tdep->ppc_gp0_regnum + 4,
+				  regvals + 1 * tdep->wordsize);
+	  memcpy (readbuf, regvals + offset, len);
 	}
       if (writebuf)
 	{
-	  /* GCC screwed up.  The last register isn't "left" aligned.
-	     Need to extract the least significant part of each
-	     register and then store that.  */
-	  /* Transfer any full words.  */
-	  int word = 0;
-	  while (1)
-	    {
-	      ULONGEST reg;
-	      int len = TYPE_LENGTH (type) - word * tdep->wordsize;
-	      if (len <= 0)
-		break;
-	      if (len > tdep->wordsize)
-		len = tdep->wordsize;
-	      reg = extract_unsigned_integer (((const bfd_byte *) writebuf
-					       + word * tdep->wordsize), len);
-	      regcache_cooked_write_unsigned (regcache,
-					      tdep->ppc_gp0_regnum + 3 + word,
-					      reg);
-	      word++;
-	    }
+	  memset (regvals, 0, sizeof regvals);
+	  memcpy (regvals + offset, writebuf, len);
+	  regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 3,
+				 regvals + 0 * tdep->wordsize);
+	  if (len > tdep->wordsize)
+	    regcache_cooked_write (regcache, tdep->ppc_gp0_regnum + 4,
+				   regvals + 1 * tdep->wordsize);
 	}
+
       return RETURN_VALUE_REGISTER_CONVENTION;
     }
   if (TYPE_LENGTH (type) <= 8)


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2005-08-17  0:25 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2005-08-17  0:25 [RFA] Fix broken sysv return value code on powerpc Mark Kettenis
2005-08-17  0:37 ` Kevin Buettner

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox