From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16580 invoked by alias); 31 Jul 2009 20:51:00 -0000 Received: (qmail 16571 invoked by uid 22791); 31 Jul 2009 20:50:59 -0000 X-SWARE-Spam-Status: No, hits=-1.3 required=5.0 tests=AWL,BAYES_00,J_CHICKENPOX_33,J_CHICKENPOX_35,J_CHICKENPOX_56,SPF_PASS X-Spam-Check-By: sourceware.org Received: from gateway.codesourcery.com (HELO daisy.codesourcery.com) (65.74.133.9) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 31 Jul 2009 20:50:53 +0000 Received: by daisy.codesourcery.com (Postfix, from userid 1009) id A553D6F62056; Fri, 31 Jul 2009 13:50:51 -0700 (PDT) To: gdb-patches@sourceware.org CC: pedro@codesourcery.com Subject: [patch] procfs.c: Fix a build failure on SPARC. Message-Id: <20090731205051.A553D6F62056@daisy.codesourcery.com> Date: Fri, 31 Jul 2009 21:34:00 -0000 From: kazu@codesourcery.com (Kazu Hirata) Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2009-07/txt/msg00770.txt.bz2 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 * 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