From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9178 invoked by alias); 5 May 2006 19:55:05 -0000 Received: (qmail 9170 invoked by uid 22791); 5 May 2006 19:55:04 -0000 X-Spam-Check-By: sourceware.org Received: from sibelius.xs4all.nl (HELO sibelius.xs4all.nl) (82.92.89.47) by sourceware.org (qpsmtpd/0.31) with ESMTP; Fri, 05 May 2006 19:55:00 +0000 Received: from elgar.sibelius.xs4all.nl (root@elgar.sibelius.xs4all.nl [192.168.0.2]) by sibelius.xs4all.nl (8.13.4/8.13.4) with ESMTP id k45JsPu1018726; Fri, 5 May 2006 21:54:25 +0200 (CEST) Received: from elgar.sibelius.xs4all.nl (kettenis@localhost.sibelius.xs4all.nl [127.0.0.1]) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6) with ESMTP id k45JsPAS009600; Fri, 5 May 2006 21:54:25 +0200 (CEST) Received: (from kettenis@localhost) by elgar.sibelius.xs4all.nl (8.13.6/8.13.6/Submit) id k45JsOhL021761; Fri, 5 May 2006 21:54:24 +0200 (CEST) Date: Fri, 05 May 2006 19:55:00 -0000 Message-Id: <200605051954.k45JsOhL021761@elgar.sibelius.xs4all.nl> From: Mark Kettenis To: pgilliam@us.ibm.com CC: drow@false.org, gdb-patches@sources.redhat.com In-reply-to: <1146853938.16180.11.camel@dufur.beaverton.ibm.com> (message from PAUL GILLIAM on Fri, 05 May 2006 11:32:18 -0700) Subject: Re: [patch] Can't build ppc32 GDB References: <1145924338.18934.45.camel@dufur.beaverton.ibm.com> <1145924593.18934.48.camel@dufur.beaverton.ibm.com> <200604251938.k3PJc9dl014571@elgar.sibelius.xs4all.nl> <1146699224.16180.4.camel@dufur.beaverton.ibm.com> <25493.192.87.1.22.1146726734.squirrel@webmail.xs4all.nl> <20060505162955.GB31029@nevyn.them.org> <200605051649.k45GnKob023219@elgar.sibelius.xs4all.nl> <1146853938.16180.11.camel@dufur.beaverton.ibm.com> Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2006-05/txt/msg00091.txt.bz2 > From: PAUL GILLIAM > Date: Fri, 05 May 2006 11:32:18 -0700 > > OK, How about this? I tried to make everyone happy :-) > > Here is an excerpt: > > #ifdef HAVE_STDINT_H > #include > #define CORE_ADDR_CAST (uintptr_t) > #else > #define CORE_ADDR_CAST (CORE_ADDR)(unsigned long) > #endif > . . . > last_stopped_data_address = CORE_ADDR_CAST siginfo.si_addr; > > Then when there is a gdb_stdint.h, I'll submit another patch to include > it and replace CORE_ADDR_CAST with just (uintptr_t). > > Ok to commit? Sorry Paul, this is silly. Just include and use uintptr_t unconditionally. Or use unsigned long (the extra CORE_ADDR cast isn't necessary) if you're really scared that someone will try to compile GDB on a system with glibc 2.0.x. Mark > On Fri, 2006-05-05 at 18:49 +0200, Mark Kettenis wrote: > > > Date: Fri, 5 May 2006 12:29:55 -0400 > > > From: Daniel Jacobowitz > > > > > > On Thu, May 04, 2006 at 09:12:14AM +0200, Mark Kettenis wrote: > > > > This is where the new ISO C99 types come in handy. Instead of > > > > casting to CORE_ADDR, try casting to uintptr_t. > > > > > > Can we rely on on GNU/Linux? I know we can't in general. > > > Conveniently, I have a patch on one of my pending branches that > > > provides a gdb_stdint.h. > > > > Having a gdb_stdint.h would be cool ;-). > > > > > But for this case there's an easier solution, which IIRC is roughly > > > what Paul did: I can pretty much promise you that sizeof (long) == > > > sizeof (void *) on any GNU/Linux system. So either I can merge > > > gdb_stdint.h and we can start using that, which might be a nice idea in > > > general, or for now I think "long" is fine. > > > > Well, we already use uintptr_t in linux-thread-db.c, and > > gdb_thread_db.h errors out if it isn't available (and has been doing > > so for ages). So we can be pretty sure that nobody is trying to > > compile on systems with libc5 or really old glibc versions. > > > > That said, it is probably safe to assume that all (powerpc) Linux > > ports are either ILP32 or LP64, so casting to (unsigned long) should > > be perfectly safe. It's just that I think that a uintptr_t cast > > better expresses what's happening here. But either way is fine with > > me. > > > > Mark > > --=-+yu21rc4iHrvNYe3G7+v > Content-Disposition: attachment; filename=ppc-linux-nat.diff > Content-Type: text/x-patch; name=ppc-linux-nat.diff; charset=utf-8 > Content-Transfer-Encoding: 7bit > > 2006-04-26: Paul Gilliam > > * ppc-linux-nat.c: Clean up types for ptrace. > New macro 'CORE_ADDR_CAST' accounts for the size difference between > a CORE_ADDR and a void* on ppc64 systems compiled for 32-bits. > > Index: ppc-linux-nat.c > =================================================================== > RCS file: /cvs/src/src/gdb/ppc-linux-nat.c,v > retrieving revision 1.60 > diff -a -u -r1.60 ppc-linux-nat.c > --- ppc-linux-nat.c 24 Mar 2006 23:08:16 -0000 1.60 > +++ ppc-linux-nat.c 5 May 2006 18:15:28 -0000 > @@ -30,6 +30,13 @@ > #include "target.h" > #include "linux-nat.h" > > +#ifdef HAVE_STDINT_H > +#include > +#define CORE_ADDR_CAST (uintptr_t) > +#else > +#define CORE_ADDR_CAST (CORE_ADDR)(unsigned long) > +#endif > + > #include > #include > #include > @@ -44,18 +51,6 @@ > #include "gregset.h" > #include "ppc-tdep.h" > > -#ifndef PT_READ_U > -#define PT_READ_U PTRACE_PEEKUSR > -#endif > -#ifndef PT_WRITE_U > -#define PT_WRITE_U PTRACE_POKEUSR > -#endif > - > -/* Default the type of the ptrace transfer to int. */ > -#ifndef PTRACE_XFER_TYPE > -#define PTRACE_XFER_TYPE int > -#endif > - > /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a > configure time check. Some older glibc's (for instance 2.2.1) > don't have a specific powerpc version of ptrace.h, and fall back on > @@ -126,13 +121,12 @@ > > /* On PPC processors that support the the Signal Processing Extension > (SPE) APU, the general-purpose registers are 64 bits long. > - However, the ordinary Linux kernel PTRACE_PEEKUSR / PTRACE_POKEUSR > - / PT_READ_U / PT_WRITE_U ptrace calls only access the lower half of > - each register, to allow them to behave the same way they do on > - non-SPE systems. There's a separate pair of calls, > - PTRACE_GETEVRREGS / PTRACE_SETEVRREGS, that read and write the top > - halves of all the general-purpose registers at once, along with > - some SPE-specific registers. > + However, the ordinary Linux kernel PTRACE_PEEKUSER / PTRACE_POKEUSER > + ptrace calls only access the lower half of each register, to allow > + them to behave the same way they do on non-SPE systems. There's a > + separate pair of calls, PTRACE_GETEVRREGS / PTRACE_SETEVRREGS, that > + read and write the top halves of all the general-purpose registers > + at once, along with some SPE-specific registers. > > GDB itself continues to claim the general-purpose registers are 32 > bits long. It has unnamed raw registers that hold the upper halves > @@ -190,7 +184,7 @@ > struct gdbarch_tdep *tdep = gdbarch_tdep (current_gdbarch); > /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace > interface, and not the wordsize of the program's ABI. */ > - int wordsize = sizeof (PTRACE_XFER_TYPE); > + int wordsize = sizeof (long); > > /* General purpose registers occupy 1 slot each in the buffer */ > if (regno >= tdep->ppc_gp0_regnum > @@ -384,17 +378,17 @@ > return; > } > > - /* Read the raw register using PTRACE_XFER_TYPE sized chunks. On a > + /* Read the raw register using sizeof(long) sized chunks. On a > 32-bit platform, 64-bit floating-point registers will require two > transfers. */ > for (bytes_transferred = 0; > bytes_transferred < register_size (current_gdbarch, regno); > - bytes_transferred += sizeof (PTRACE_XFER_TYPE)) > + bytes_transferred += sizeof (long)) > { > errno = 0; > - *(PTRACE_XFER_TYPE *) & buf[bytes_transferred] > - = ptrace (PT_READ_U, tid, (PTRACE_ARG3_TYPE) regaddr, 0); > - regaddr += sizeof (PTRACE_XFER_TYPE); > + *(long *) & buf[bytes_transferred] > + = ptrace (PTRACE_PEEKUSER, tid, (PTRACE_TYPE_ARG3) regaddr, 0); > + regaddr += sizeof (long); > if (errno != 0) > { > char message[128]; > @@ -406,7 +400,7 @@ > > /* Now supply the register. Keep in mind that the regcache's idea > of the register's size may not be a multiple of sizeof > - (PTRACE_XFER_TYPE). */ > + (long). */ > if (gdbarch_byte_order (current_gdbarch) == BFD_ENDIAN_LITTLE) > { > /* Little-endian values are always found at the left end of the > @@ -668,10 +662,10 @@ > > /* First collect the register. Keep in mind that the regcache's > idea of the register's size may not be a multiple of sizeof > - (PTRACE_XFER_TYPE). */ > + (long). */ > memset (buf, 0, sizeof buf); > bytes_to_transfer = align_up (register_size (current_gdbarch, regno), > - sizeof (PTRACE_XFER_TYPE)); > + sizeof (long)); > if (TARGET_BYTE_ORDER == BFD_ENDIAN_LITTLE) > { > /* Little-endian values always sit at the left end of the buffer. */ > @@ -685,12 +679,12 @@ > regcache_raw_collect (current_regcache, regno, buf + padding); > } > > - for (i = 0; i < bytes_to_transfer; i += sizeof (PTRACE_XFER_TYPE)) > + for (i = 0; i < bytes_to_transfer; i += sizeof (long)) > { > errno = 0; > - ptrace (PT_WRITE_U, tid, (PTRACE_ARG3_TYPE) regaddr, > - *(PTRACE_XFER_TYPE *) & buf[i]); > - regaddr += sizeof (PTRACE_XFER_TYPE); > + ptrace (PTRACE_POKEUSER, tid, (PTRACE_TYPE_ARG3) regaddr, > + *(long *) & buf[i]); > + regaddr += sizeof (long); > > if (errno == EIO > && regno == tdep->ppc_fpscr_regnum) > @@ -901,7 +895,7 @@ > (siginfo.si_code & 0xffff) != 0x0004) > return 0; > > - last_stopped_data_address = (CORE_ADDR) siginfo.si_addr; > + last_stopped_data_address = CORE_ADDR_CAST siginfo.si_addr; > return 1; > } > > @@ -926,7 +920,7 @@ > { > /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace > interface, and not the wordsize of the program's ABI. */ > - int wordsize = sizeof (PTRACE_XFER_TYPE); > + int wordsize = sizeof (long); > ppc_linux_supply_gregset (current_regcache, -1, gregsetp, > sizeof (gdb_gregset_t), wordsize); > } > @@ -936,7 +930,7 @@ > { > /* NOTE: cagney/2003-11-25: This is the word size used by the ptrace > interface, and not the wordsize of the program's ABI. */ > - int wordsize = sizeof (PTRACE_XFER_TYPE); > + int wordsize = sizeof (long); > /* Right fill the register. */ > regcache_raw_collect (current_regcache, regnum, > ((bfd_byte *) reg > > --=-+yu21rc4iHrvNYe3G7+v-- > >