This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
[patch] procfs.c: Fix a build failure on SPARC.
- From: kazu at codesourcery dot com (Kazu Hirata)
- To: gdb-patches at sourceware dot org
- Cc: pedro at codesourcery dot com
- Date: Fri, 31 Jul 2009 13:50:51 -0700 (PDT)
- Subject: [patch] procfs.c: Fix a build failure on SPARC.
Hi,
Attached is a patch to fix a build failure on SPARC.
Without this patch, I get several errors like so:
error: dereferencing pointer 'mysinfo' does break strict-aliasing rules
when building gdb with gcc-4.4.
This patch, which Pedro helped me develop, fixes the problem by
rearranging:
struct {
procfs_ctl_t cmd;
/* Use char array to avoid alignment issues. */
char sinfo[sizeof (gdb_siginfo_t)];
} arg;
gdb_siginfo_t *mysinfo;
mysinfo = (gdb_siginfo_t *) &arg.sinfo;
mysinfo->si_signo = signo;
to:
struct {
procfs_ctl_t cmd;
/* Use char array to avoid alignment issues. */
char sinfo[sizeof (gdb_siginfo_t)];
} arg;
gdb_siginfo_t mysinfo;
mysinfo.si_signo = signo;
memcpy (arg.sinfo, &mysinfo, sizeof (gdb_siginfo_t));
Note that we populate mysinfo before copying it to arg.sinfo.
Tested by building sparc-solaris2.8. OK to apply?
Kazu Hirata
2009-07-31 Kazu Hirata <kazu@codesourcery.com>
* procfs.c (proc_set_current_signal): Populate mysinfo before
copying it to arg.
(proc_clear_current_signal): Likewise.
(proc_set_watchpoint): Populate pwatch before copying it to arg.
Index: gdb/procfs.c
===================================================================
RCS file: /cvs/src/src/gdb/procfs.c,v
retrieving revision 1.114
diff -u -d -p -r1.114 procfs.c
--- gdb/procfs.c 2 Jul 2009 17:25:58 -0000 1.114
+++ gdb/procfs.c 31 Jul 2009 20:48:51 -0000
@@ -2505,7 +2505,7 @@ proc_set_current_signal (procinfo *pi, i
/* Use char array to avoid alignment issues. */
char sinfo[sizeof (gdb_siginfo_t)];
} arg;
- gdb_siginfo_t *mysinfo;
+ gdb_siginfo_t mysinfo;
ptid_t wait_ptid;
struct target_waitstatus wait_status;
@@ -2530,7 +2530,6 @@ proc_set_current_signal (procinfo *pi, i
#endif
/* The pointer is just a type alias. */
- mysinfo = (gdb_siginfo_t *) &arg.sinfo;
get_last_target_status (&wait_ptid, &wait_status);
if (ptid_equal (wait_ptid, inferior_ptid)
&& wait_status.kind == TARGET_WAITKIND_STOPPED
@@ -2545,16 +2544,17 @@ proc_set_current_signal (procinfo *pi, i
/* Use the siginfo associated with the signal being
redelivered. */
#ifdef NEW_PROC_API
- memcpy (mysinfo, &pi->prstatus.pr_lwp.pr_info, sizeof (gdb_siginfo_t));
+ memcpy (arg.sinfo, &pi->prstatus.pr_lwp.pr_info, sizeof (gdb_siginfo_t));
#else
- memcpy (mysinfo, &pi->prstatus.pr_info, sizeof (gdb_siginfo_t));
+ memcpy (arg.sinfo, &pi->prstatus.pr_info, sizeof (gdb_siginfo_t));
#endif
else
{
- mysinfo->si_signo = signo;
- mysinfo->si_code = 0;
- mysinfo->si_pid = getpid (); /* ?why? */
- mysinfo->si_uid = getuid (); /* ?why? */
+ mysinfo.si_signo = signo;
+ mysinfo.si_code = 0;
+ mysinfo.si_pid = getpid (); /* ?why? */
+ mysinfo.si_uid = getuid (); /* ?why? */
+ memcpy (arg.sinfo, &mysinfo, sizeof (gdb_siginfo_t));
}
#ifdef NEW_PROC_API
@@ -2597,16 +2597,16 @@ proc_clear_current_signal (procinfo *pi)
/* Use char array to avoid alignment issues. */
char sinfo[sizeof (gdb_siginfo_t)];
} arg;
- gdb_siginfo_t *mysinfo;
+ gdb_siginfo_t mysinfo;
arg.cmd = PCSSIG;
/* The pointer is just a type alias. */
- mysinfo = (gdb_siginfo_t *) &arg.sinfo;
- mysinfo->si_signo = 0;
- mysinfo->si_code = 0;
- mysinfo->si_errno = 0;
- mysinfo->si_pid = getpid (); /* ?why? */
- mysinfo->si_uid = getuid (); /* ?why? */
+ mysinfo.si_signo = 0;
+ mysinfo.si_code = 0;
+ mysinfo.si_errno = 0;
+ mysinfo.si_pid = getpid (); /* ?why? */
+ mysinfo.si_uid = getuid (); /* ?why? */
+ memcpy (arg.sinfo, &mysinfo, sizeof (gdb_siginfo_t));
win = (write (pi->ctl_fd, (void *) &arg, sizeof (arg)) == sizeof (arg));
}
@@ -2917,25 +2917,25 @@ proc_set_watchpoint (procinfo *pi, CORE_
procfs_ctl_t cmd;
char watch[sizeof (prwatch_t)];
} arg;
- prwatch_t *pwatch;
+ prwatch_t pwatch;
- pwatch = (prwatch_t *) &arg.watch;
/* NOTE: cagney/2003-02-01: Even more horrible hack. Need to
convert a target address into something that can be stored in a
native data structure. */
#ifdef PCAGENT /* Horrible hack: only defined on Solaris 2.6+ */
- pwatch->pr_vaddr = (uintptr_t) procfs_address_to_host_pointer (addr);
+ pwatch.pr_vaddr = (uintptr_t) procfs_address_to_host_pointer (addr);
#else
- pwatch->pr_vaddr = (caddr_t) procfs_address_to_host_pointer (addr);
+ pwatch.pr_vaddr = (caddr_t) procfs_address_to_host_pointer (addr);
#endif
- pwatch->pr_size = len;
- pwatch->pr_wflags = wflags;
+ pwatch.pr_size = len;
+ pwatch.pr_wflags = wflags;
#if defined(NEW_PROC_API) && defined (PCWATCH)
arg.cmd = PCWATCH;
+ memcpy (arg.watch, &pwatch, sizeof (prwatch_t));
return (write (pi->ctl_fd, &arg, sizeof (arg)) == sizeof (arg));
#else
#if defined (PIOCSWATCH)
- return (ioctl (pi->ctl_fd, PIOCSWATCH, pwatch) >= 0);
+ return (ioctl (pi->ctl_fd, PIOCSWATCH, &pwatch) >= 0);
#else
return 0; /* Fail */
#endif