From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 1912 invoked by alias); 9 Aug 2008 21:33:23 -0000 Received: (qmail 1900 invoked by uid 22791); 9 Aug 2008 21:33:22 -0000 X-Spam-Check-By: sourceware.org Received: from mail.codesourcery.com (HELO mail.codesourcery.com) (65.74.133.4) by sourceware.org (qpsmtpd/0.31) with ESMTP; Sat, 09 Aug 2008 21:32:48 +0000 Received: (qmail 4239 invoked from network); 9 Aug 2008 21:32:45 -0000 Received: from unknown (HELO orlando.local) (pedro@127.0.0.2) by mail.codesourcery.com with ESMTPA; 9 Aug 2008 21:32:45 -0000 From: Pedro Alves To: gdb-patches@sourceware.org, Eli Zaretskii Subject: Re: go32-nat, always a thread Date: Sat, 09 Aug 2008 21:33:00 -0000 User-Agent: KMail/1.9.9 References: <200808080439.17254.pedro@codesourcery.com> <200808091853.44771.pedro@codesourcery.com> In-Reply-To: MIME-Version: 1.0 Content-Type: Multipart/Mixed; boundary="Boundary-00=_8zgnIUVhyJtHTFT" Message-Id: <200808092232.44638.pedro@codesourcery.com> X-IsSubscribed: yes 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: 2008-08/txt/msg00258.txt.bz2 --Boundary-00=_8zgnIUVhyJtHTFT Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Content-Disposition: inline Content-length: 1700 On Saturday 09 August 2008 19:54:20, Eli Zaretskii wrote: > > From: Pedro Alves > > Date: Sat, 9 Aug 2008 18:53:44 +0100 > > > > GCC complains about attribute packed like so: > > > > cc1.exe: warnings being treated as errors > > ../../gdb/go32-nat.c:1292: warning: 'packed' attribute ignored for field > > of type 'unsigned char' ../../gdb/go32-nat.c:1301: warning: 'packed' > > attribute ignored for field of type 'unsigned char' > > This one is the only one that bother me a little, since these > structures need to match the memory layouts expected by the system > calls to which we pass them. Does the warning mean that GCC will > never add any padding between the previous field and the `unsigned > char' field? If so, the change is safe; if not, we need to find some > way of enforcing the no-padding layouts. > On Saturday 09 August 2008 20:16:09, Mark Kettenis wrote: > Instead of > > struct foo { > char c __attribute__((packed)); > int d __attribute__((packed)); > }; > > you can (should?) write > > struct foo { > char c; > int d; > } __attribute__((packed)); > > I think that'll get rid of the warning. I considered changing it that way, but resisted because I assumed there was some obscure reason this wasn't done this way, that I was just failing to see. I've always used the latter form. Indeed, from GDB's manual: "Specifying this attribute for struct and union types is equivalent to specifying the packed attribute on each of the structure or union members." > The go32-nat.c changes are fine with me. Thanks, I've checked in the go32-nat.c changes, as attached. I'll post the rest of the changes in another thread. -- Pedro Alves --Boundary-00=_8zgnIUVhyJtHTFT Content-Type: text/x-diff; charset="utf-8"; name="go32_fixes_only.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="go32_fixes_only.diff" Content-length: 4828 2008-08-09 Pedro Alves * go32-nat.c (fetch_register, store_register): Pass the regcache gdbarch to i386_fp_regnum_p and i386_fpc_regnum_p. (go32_xfer_memory): Change type of myaddr parameter to gdb_byte. (struct seg_descr, struct seg_descr): pack the whole struct instead of each member individually. --- gdb/go32-nat.c | 58 +++++++++++++++++++++++++++++---------------------------- 1 file changed, 30 insertions(+), 28 deletions(-) Index: src/gdb/go32-nat.c =================================================================== --- src.orig/gdb/go32-nat.c 2008-08-09 20:55:08.000000000 +0100 +++ src/gdb/go32-nat.c 2008-08-09 20:55:13.000000000 +0100 @@ -176,7 +176,7 @@ static void go32_fetch_registers (struct static void store_register (const struct regcache *, int regno); static void go32_store_registers (struct regcache *, int regno); static void go32_prepare_to_store (struct regcache *); -static int go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, +static int go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, struct mem_attrib *attrib, struct target_ops *target); @@ -465,10 +465,11 @@ go32_wait (ptid_t ptid, struct target_wa static void fetch_register (struct regcache *regcache, int regno) { - if (regno < gdbarch_fp0_regnum (get_regcache_arch (regcache))) + struct gdbarch *gdbarch = get_regcache_arch (regcache); + if (regno < gdbarch_fp0_regnum (gdbarch)) regcache_raw_supply (regcache, regno, (char *) &a_tss + regno_mapping[regno].tss_ofs); - else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno)) + else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch, regno)) i387_supply_fsave (regcache, regno, &npx); else internal_error (__FILE__, __LINE__, @@ -493,10 +494,11 @@ go32_fetch_registers (struct regcache *r static void store_register (const struct regcache *regcache, int regno) { - if (regno < gdbarch_fp0_regnum (get_regcache_arch (regcache))) + struct gdbarch *gdbarch = get_regcache_arch (regcache); + if (regno < gdbarch_fp0_regnum (gdbarch)) regcache_raw_collect (regcache, regno, (char *) &a_tss + regno_mapping[regno].tss_ofs); - else if (i386_fp_regnum_p (regno) || i386_fpc_regnum_p (regno)) + else if (i386_fp_regnum_p (gdbarch, regno) || i386_fpc_regnum_p (gdbarch, regno)) i387_collect_fsave (regcache, regno, &npx); else internal_error (__FILE__, __LINE__, @@ -524,7 +526,7 @@ go32_prepare_to_store (struct regcache * } static int -go32_xfer_memory (CORE_ADDR memaddr, char *myaddr, int len, int write, +go32_xfer_memory (CORE_ADDR memaddr, gdb_byte *myaddr, int len, int write, struct mem_attrib *attrib, struct target_ops *target) { if (write) @@ -1261,30 +1263,30 @@ go32_sysinfo (char *arg, int from_tty) } struct seg_descr { - unsigned short limit0 __attribute__((packed)); - unsigned short base0 __attribute__((packed)); - unsigned char base1 __attribute__((packed)); - unsigned stype:5 __attribute__((packed)); - unsigned dpl:2 __attribute__((packed)); - unsigned present:1 __attribute__((packed)); - unsigned limit1:4 __attribute__((packed)); - unsigned available:1 __attribute__((packed)); - unsigned dummy:1 __attribute__((packed)); - unsigned bit32:1 __attribute__((packed)); - unsigned page_granular:1 __attribute__((packed)); - unsigned char base2 __attribute__((packed)); -}; + unsigned short limit0; + unsigned short base0; + unsigned char base1; + unsigned stype:5; + unsigned dpl:2; + unsigned present:1; + unsigned limit1:4; + unsigned available:1; + unsigned dummy:1; + unsigned bit32:1; + unsigned page_granular:1; + unsigned char base2; +} __attribute__ ((packed)); struct gate_descr { - unsigned short offset0 __attribute__((packed)); - unsigned short selector __attribute__((packed)); - unsigned param_count:5 __attribute__((packed)); - unsigned dummy:3 __attribute__((packed)); - unsigned stype:5 __attribute__((packed)); - unsigned dpl:2 __attribute__((packed)); - unsigned present:1 __attribute__((packed)); - unsigned short offset1 __attribute__((packed)); -}; + unsigned short offset0; + unsigned short selector; + unsigned param_count:5; + unsigned dummy:3; + unsigned stype:5; + unsigned dpl:2; + unsigned present:1; + unsigned short offset1; +} __attribute__ ((packed)); /* Read LEN bytes starting at logical address ADDR, and put the result into DEST. Return 1 if success, zero if not. */ --Boundary-00=_8zgnIUVhyJtHTFT Content-Type: text/x-diff; charset="utf-8"; name="go32-always_a_thread.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="go32-always_a_thread.diff" Content-length: 2062 2008-08-09 Pedro Alves * go32-nat.c: Include "gdbthread.h". (go32_stop, go32_kill_inferior): Delete the main thread. (go32_create_inferior): Add it. (go32_thread_alive, go32_pid_to_str): New. (init_go32_ops): Register go32_thread_alive and go32_pid_to_str. --- gdb/go32-nat.c | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) Index: src/gdb/go32-nat.c =================================================================== --- src.orig/gdb/go32-nat.c +++ src/gdb/go32-nat.c @@ -22,6 +22,7 @@ #include "defs.h" #include "inferior.h" +#include "gdbthread.h" #include "gdb_wait.h" #include "gdbcore.h" #include "command.h" @@ -566,7 +567,9 @@ go32_stop (ptid_t ptid) { normal_stop (); cleanup_client (); + ptid = inferior_ptid; inferior_ptid = null_ptid; + delete_thread_silent (ptid); prog_has_started = 0; } @@ -576,6 +579,8 @@ go32_kill_inferior (void) redir_cmdline_delete (&child_cmd); resume_signal = -1; resume_is_step = 0; + if (!ptid_equal (inferior_ptid, null_ptid)) + delete_thread_silent (inferior_ptid); unpush_target (&go32_ops); } @@ -658,6 +663,9 @@ go32_create_inferior (char *exec_file, c inferior_ptid = pid_to_ptid (SOME_PID); push_target (&go32_ops); + + add_thread_silent (inferior_ptid); + clear_proceed_status (); insert_breakpoints (); prog_has_started = 1; @@ -848,6 +856,20 @@ go32_terminal_ours (void) } } +static int +go32_thread_alive (ptid_t ptid) +{ + return 1; +} + +static char * +go32_pid_to_str (ptid_t ptid) +{ + static char buf[64]; + xsnprintf (buf, sizeof buf, "Thread
"); + return buf; +} + static void init_go32_ops (void) { @@ -878,6 +900,8 @@ init_go32_ops (void) go32_ops.to_mourn_inferior = go32_mourn_inferior; go32_ops.to_can_run = go32_can_run; go32_ops.to_stop = go32_stop; + go32_ops.to_thread_alive = go32_thread_alive; + go32_ops.to_pid_to_str = go32_pid_to_str; go32_ops.to_stratum = process_stratum; go32_ops.to_has_all_memory = 1; go32_ops.to_has_memory = 1; --Boundary-00=_8zgnIUVhyJtHTFT--