This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Re: go32-nat, always a thread
On Saturday 09 August 2008 19:54:20, Eli Zaretskii wrote:
> > From: Pedro Alves <pedro@codesourcery.com>
> > 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
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* 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. */
2008-08-09 Pedro Alves <pedro@codesourcery.com>
* 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 <main>");
+ 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;