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]

[rfc] [2/7] Modernize AIX target: target build fixes


Hello,

this is the second patch required to get AIX to build; it fixes
compiler warnings in aix-thread.c and rs6000-nat.c.

Most of them are straightforward, except for one: the system
headers define a "struct ptsprs", and aix-thread.c assumes
several of its members have type "unsigned long".  That used
to be true in prior versions of AIX, but AIX 5.3 apparently
changed it to be "unsigned int".

The patch below fixes aix-thread.c for both versions of the
system header files by using temporary variables when accessing
the struct.

Tested on powerpc-ibm-aix5.3.0.0.

Bye,
Ulrich

ChangeLog:

	* aix-thread.c (fill_sprs32): Change argument types to "uint32_t *".
	Remove obsolete part of comment.
	(store_regs_user_thread): Use uint32_t temporaries when calling
	fill_sprs32.
	(store_regs_kernel_thread): Likewise.  Add assertion to verify
	correct size of struct ptsprs members.
	(aix_thread_xfer_memory): Fix type of myaddr.
	(aix_thread_extra_thread_info): Fix compiler warning.
	* rs6000-nat.c (rs6000_ptrace64): Change type of buf to "void *".
	(fetch_register, store_register): Adapt callers.


diff -urNp gdb-orig/gdb/aix-thread.c gdb-head/gdb/aix-thread.c
--- gdb-orig/gdb/aix-thread.c	Wed Apr 18 16:17:13 2007
+++ gdb-head/gdb/aix-thread.c	Mon Apr 23 15:37:49 2007
@@ -1365,9 +1365,9 @@ fill_sprs64 (uint64_t *iar, uint64_t *ms
 }
 
 static void
-fill_sprs32 (unsigned long *iar, unsigned long *msr, unsigned long *cr,
-	     unsigned long *lr,  unsigned long *ctr, unsigned long *xer,
-	     unsigned long *fpscr)
+fill_sprs32 (uint32_t *iar, uint32_t *msr, uint32_t *cr,
+	     uint32_t *lr, uint32_t *ctr, uint32_t *xer,
+	     uint32_t *fpscr)
 {
   struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch);
 
@@ -1375,12 +1375,7 @@ fill_sprs32 (unsigned long *iar, unsigne
      same as the raw size of the PC (in the register cache).  If
      they're not, then either GDB has been built incorrectly, or
      there's some other kind of internal error.  To be really safe,
-     we should check all of the sizes. 
-
-     If this assert() fails, the most likely reason is that GDB was
-     built incorrectly.  In order to make use of many of the header
-     files in /usr/include/sys, GDB needs to be configured so that
-     sizeof (long) == 4).  */
+     we should check all of the sizes.  */
   gdb_assert (sizeof (*iar) == register_size (current_gdbarch, PC_REGNUM));
 
   if (register_cached (PC_REGNUM))
@@ -1459,11 +1454,9 @@ store_regs_user_thread (pthdb_pthread_t 
   else
     {
       /* Problem: ctx.iar etc. are 64 bits, but raw_registers are 32.
-	 Solution: use 32-bit temp variables.  (The assert() in fill_sprs32()
-	 will fail if the size of an unsigned long is incorrect.  If this
-	 happens, GDB needs to be reconfigured so that longs are 32-bits.)  */
-      unsigned long tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
-                    tmp_fpscr;
+	 Solution: use 32-bit temp variables.  */
+      uint32_t tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
+	       tmp_fpscr;
 
       fill_sprs32 (&tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr, &tmp_ctr, &tmp_xer,
                    &tmp_fpscr);
@@ -1564,12 +1557,30 @@ store_regs_kernel_thread (int regno, pth
 	}
       else
 	{
+	  /* The contents of "struct ptspr" were declared as "unsigned
+	     long" up to AIX 5.2, but are "unsigned int" since 5.3.
+	     Use temporaries to work around this problem.  Also, add an
+	     assert here to make sure we fail if the system header files
+	     use "unsigned long", and the size of that type is not what
+	     the headers expect.  */
+	  uint32_t tmp_iar, tmp_msr, tmp_cr, tmp_lr, tmp_ctr, tmp_xer,
+		   tmp_fpscr;
+
+	  gdb_assert (sizeof (sprs32.pt_iar) == 4);
+
 	  /* Pre-fetch: some registers won't be in the cache.  */
 	  ptrace32 (PTT_READ_SPRS, tid, (int *) &sprs32, 0, NULL);
 
-	  fill_sprs32 (&sprs32.pt_iar, &sprs32.pt_msr, &sprs32.pt_cr,
-		       &sprs32.pt_lr,  &sprs32.pt_ctr, &sprs32.pt_xer,
-		       &sprs32.pt_fpscr);
+	  fill_sprs32 (&tmp_iar, &tmp_msr, &tmp_cr, &tmp_lr, &tmp_ctr,
+		       &tmp_xer, &tmp_fpscr);
+
+	  sprs32.pt_iar = tmp_iar;
+	  sprs32.pt_msr = tmp_msr;
+	  sprs32.pt_cr = tmp_cr;
+	  sprs32.pt_lr = tmp_lr;
+	  sprs32.pt_ctr = tmp_ctr;
+	  sprs32.pt_xer = tmp_xer;
+	  sprs32.pt_fpscr = tmp_fpscr;
 
 	  if (tdep->ppc_mq_regnum >= 0)
 	    if (register_cached (tdep->ppc_mq_regnum))
@@ -1608,7 +1619,7 @@ aix_thread_store_registers (int regno)
    address MEMADDR if WRITE and vice versa otherwise.  */
 
 static int
-aix_thread_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write,
+aix_thread_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write,
 		      struct mem_attrib *attrib,
 		      struct target_ops *target)
 {
@@ -1703,7 +1714,7 @@ aix_thread_extra_thread_info (struct thr
 
   if (tid != PTHDB_INVALID_TID)
     /* i18n: Like "thread-identifier %d, [state] running, suspended" */
-    fprintf_unfiltered (buf, _("tid %d"), tid);
+    fprintf_unfiltered (buf, _("tid %d"), (int)tid);
 
   status = pthdb_pthread_state (pd_session, pdtid, &state);
   if (status != PTHDB_SUCCESS)
diff -urNp gdb-orig/gdb/rs6000-nat.c gdb-head/gdb/rs6000-nat.c
--- gdb-orig/gdb/rs6000-nat.c	Wed Apr 18 16:17:23 2007
+++ gdb-head/gdb/rs6000-nat.c	Mon Apr 23 13:53:20 2007
@@ -204,7 +204,7 @@ rs6000_ptrace32 (int req, int id, int *a
 /* Call ptracex(REQ, ID, ADDR, DATA, BUF). */
 
 static int
-rs6000_ptrace64 (int req, int id, long long addr, int data, int *buf)
+rs6000_ptrace64 (int req, int id, long long addr, int data, void *buf)
 {
 #ifdef ARCH3264
   int ret = ptracex (req, id, addr, data, buf);
@@ -255,7 +255,7 @@ fetch_register (int regno)
 	  /* PT_READ_GPR requires the buffer parameter to point to long long,
 	     even if the register is really only 32 bits. */
 	  long long buf;
-	  rs6000_ptrace64 (PT_READ_GPR, PIDGET (inferior_ptid), nr, 0, (int *)&buf);
+	  rs6000_ptrace64 (PT_READ_GPR, PIDGET (inferior_ptid), nr, 0, &buf);
 	  if (register_size (current_gdbarch, regno) == 8)
 	    memcpy (addr, &buf, 8);
 	  else
@@ -329,7 +329,7 @@ store_register (int regno)
 	    memcpy (&buf, addr, 8);
 	  else
 	    buf = *addr;
-	  rs6000_ptrace64 (PT_WRITE_GPR, PIDGET (inferior_ptid), nr, 0, (int *)&buf);
+	  rs6000_ptrace64 (PT_WRITE_GPR, PIDGET (inferior_ptid), nr, 0, &buf);
 	}
     }
 
-- 
  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]