From: Pedro Alves <palves@redhat.com>
To: gdb-patches@sourceware.org
Subject: Re: [PATCH 13/26] serial_write: change prototype to take a void-pointer buffer.
Date: Fri, 12 Apr 2013 14:55:00 -0000 [thread overview]
Message-ID: <5167DF5F.8060701@redhat.com> (raw)
In-Reply-To: <20130411230030.16791.28557.stgit@brno.lan>
On 04/12/2013 12:00 AM, Pedro Alves wrote:
> +static int dos_write (struct serial *scb, const void *buf, int count);
> static int
> -dos_write (struct serial *scb, const char *str, int len)
> +dos_write (struct serial *scb, const void *buf, int count)
> {
Bah. Re-reading this with a fresher head, I notice I failed to
change int -> size_t here. This results in a little cascade of
updates to other variables (mainly to avoid signed/unsigned comparisons).
I've merged this into the patch:
diff --git i/gdb/ser-go32.c w/gdb/ser-go32.c
index 76a2f4f..9b321df 100644
--- i/gdb/ser-go32.c
+++ w/gdb/ser-go32.c
@@ -148,7 +148,7 @@ typedef unsigned long u_long;
#define NCNT 20
static int intrcnt;
-static int cnts[NCNT];
+static size_t cnts[NCNT];
static char *cntnames[NCNT] =
{
/* h/w interrupt counts. */
@@ -230,7 +230,7 @@ static int dos_open (struct serial *scb, const char *name);
static void dos_raw (struct serial *scb);
static int dos_readchar (struct serial *scb, int timeout);
static int dos_setbaudrate (struct serial *scb, int rate);
-static int dos_write (struct serial *scb, const void *buf, int count);
+static int dos_write (struct serial *scb, const void *buf, size_t count);
static void dos_close (struct serial *scb);
static serial_ttystate dos_get_tty_state (struct serial *scb);
static int dos_set_tty_state (struct serial *scb, serial_ttystate state);
@@ -787,12 +787,12 @@ dos_setstopbits (struct serial *scb, int num)
}
static int
-dos_write (struct serial *scb, const void *buf, int count)
+dos_write (struct serial *scb, const void *buf, size_t count)
{
volatile struct dos_ttystate *port = &ports[scb->fd];
- int fifosize = port->fifo ? 16 : 1;
+ size_t fifosize = port->fifo ? 16 : 1;
long then;
- int cnt;
+ size_t cnt;
const char *str = buf;
while (count > 0)
@@ -905,7 +905,7 @@ dos_info (char *arg, int from_tty)
printf_filtered ("\nTotal interrupts: %d\n", intrcnt);
for (i = 0; i < NCNT; i++)
if (cnts[i])
- printf_filtered ("%s:\t%d\n", cntnames[i], cnts[i]);
+ printf_filtered ("%s:\t%lu\n", cntnames[i], (unsigned long) cnts[i]);
#endif
}
New version of full patch follows. I've also updated the github branch.
---------------
serial_write: change prototype to take a void-pointer buffer.
While remote.c works with "char *" buffers most of the time, other
remote targets have binary-ish-er protocols, and choose to use
"unsigned char" throughout, like e.g., remote-mips.c or
remote-m32r-sdi.c. That results in -Wpointer-sign warnings in those
targets, unless we add casts in calls to serial_write. Since
serial_write is only concerned about sending raw host bytes out, and
serial_ops->write_prim already works with "void *"/"size_t", a similar
interface to the "write" or "send" system calls, I find it natural to
change serial_write's prototype accordingly, avoiding the need for
casts.
Tested on x86_64 Fedora 17, and also by building a x86_64-mingw32
-hosted gdb. I don't have a set up for testing DJGPP/go32.
gdb/
2013-04-12 Pedro Alves <palves@redhat.com>
* ser-base.c (ser_base_write): Change prototype -- take 'void *'
buffer and size_t size. Adjust.
* ser-base.h (ser_base_write): Adjust.
* ser-go32.c (cnts): Change type to size_t.
(dos_write): Change prototype -- take 'void *'
buffer and size_t size. Adjust.
(dos_info): Print elements of 'cnts' as unsigned long.
* serial.c (serial_write): Likewise.
* serial.h (serial_write): Adjust.
(struct serial_ops) <write>: Change prototype -- take 'void *'
buffer and size_t size. Adjust.
---
gdb/ser-base.c | 9 +++++----
gdb/ser-base.h | 2 +-
gdb/ser-go32.c | 21 +++++++++++----------
gdb/serial.c | 16 +++++++++-------
gdb/serial.h | 6 +++---
5 files changed, 29 insertions(+), 25 deletions(-)
diff --git a/gdb/ser-base.c b/gdb/ser-base.c
index c602650..52c5726 100644
--- a/gdb/ser-base.c
+++ b/gdb/ser-base.c
@@ -440,17 +440,18 @@ ser_base_readchar (struct serial *scb, int timeout)
}
int
-ser_base_write (struct serial *scb, const char *str, int len)
+ser_base_write (struct serial *scb, const void *buf, size_t count)
{
+ const char *str = buf;
int cc;
- while (len > 0)
+ while (count > 0)
{
- cc = scb->ops->write_prim (scb, str, len);
+ cc = scb->ops->write_prim (scb, str, count);
if (cc < 0)
return 1;
- len -= cc;
+ count -= cc;
str += cc;
}
return 0;
diff --git a/gdb/ser-base.h b/gdb/ser-base.h
index 175bf20..e5fe9e1 100644
--- a/gdb/ser-base.h
+++ b/gdb/ser-base.h
@@ -45,7 +45,7 @@ extern int ser_base_setbaudrate (struct serial *scb, int rate);
extern int ser_base_setstopbits (struct serial *scb, int rate);
extern int ser_base_drain_output (struct serial *scb);
-extern int ser_base_write (struct serial *scb, const char *str, int len);
+extern int ser_base_write (struct serial *scb, const void *buf, size_t count);
extern void ser_base_async (struct serial *scb, int async_p);
extern int ser_base_readchar (struct serial *scb, int timeout);
diff --git a/gdb/ser-go32.c b/gdb/ser-go32.c
index 7d76720..9b321df 100644
--- a/gdb/ser-go32.c
+++ b/gdb/ser-go32.c
@@ -148,7 +148,7 @@ typedef unsigned long u_long;
#define NCNT 20
static int intrcnt;
-static int cnts[NCNT];
+static size_t cnts[NCNT];
static char *cntnames[NCNT] =
{
/* h/w interrupt counts. */
@@ -230,7 +230,7 @@ static int dos_open (struct serial *scb, const char *name);
static void dos_raw (struct serial *scb);
static int dos_readchar (struct serial *scb, int timeout);
static int dos_setbaudrate (struct serial *scb, int rate);
-static int dos_write (struct serial *scb, const char *str, int len);
+static int dos_write (struct serial *scb, const void *buf, size_t count);
static void dos_close (struct serial *scb);
static serial_ttystate dos_get_tty_state (struct serial *scb);
static int dos_set_tty_state (struct serial *scb, serial_ttystate state);
@@ -787,26 +787,27 @@ dos_setstopbits (struct serial *scb, int num)
}
static int
-dos_write (struct serial *scb, const char *str, int len)
+dos_write (struct serial *scb, const void *buf, size_t count)
{
volatile struct dos_ttystate *port = &ports[scb->fd];
- int fifosize = port->fifo ? 16 : 1;
+ size_t fifosize = port->fifo ? 16 : 1;
long then;
- int cnt;
+ size_t cnt;
+ const char *str = buf;
- while (len > 0)
+ while (count > 0)
{
/* Send the data, fifosize bytes at a time. */
- cnt = fifosize > len ? len : fifosize;
+ cnt = fifosize > count ? count : fifosize;
port->txbusy = 1;
/* Francisco Pastor <fpastor.etra-id@etra.es> says OUTSB messes
up the communications with UARTs with FIFOs. */
#ifdef UART_FIFO_WORKS
outportsb (port->base + com_data, str, cnt);
str += cnt;
- len -= cnt;
+ count -= cnt;
#else
- for ( ; cnt > 0; cnt--, len--)
+ for ( ; cnt > 0; cnt--, count--)
outportb (port->base + com_data, *str++);
#endif
#ifdef DOS_STATS
@@ -904,7 +905,7 @@ dos_info (char *arg, int from_tty)
printf_filtered ("\nTotal interrupts: %d\n", intrcnt);
for (i = 0; i < NCNT; i++)
if (cnts[i])
- printf_filtered ("%s:\t%d\n", cntnames[i], cnts[i]);
+ printf_filtered ("%s:\t%lu\n", cntnames[i], (unsigned long) cnts[i]);
#endif
}
diff --git a/gdb/serial.c b/gdb/serial.c
index 3202b0f..ee3f1ea 100644
--- a/gdb/serial.c
+++ b/gdb/serial.c
@@ -398,14 +398,15 @@ serial_readchar (struct serial *scb, int timeout)
}
int
-serial_write (struct serial *scb, const char *str, int len)
+serial_write (struct serial *scb, const void *buf, size_t count)
{
if (serial_logfp != NULL)
{
- int count;
+ const char *str = buf;
+ size_t c;
- for (count = 0; count < len; count++)
- serial_logchar (serial_logfp, 'w', str[count] & 0xff, 0);
+ for (c = 0; c < count; c++)
+ serial_logchar (serial_logfp, 'w', str[c] & 0xff, 0);
/* Make sure that the log file is as up-to-date as possible,
in case we are getting ready to dump core or something. */
@@ -413,9 +414,10 @@ serial_write (struct serial *scb, const char *str, int len)
}
if (serial_debug_p (scb))
{
- int count;
+ const char *str = buf;
+ size_t c;
- for (count = 0; count < len; count++)
+ for (c = 0; c < count; c++)
{
fprintf_unfiltered (gdb_stdlog, "[");
serial_logchar (gdb_stdlog, 'w', str[count] & 0xff, 0);
@@ -424,7 +426,7 @@ serial_write (struct serial *scb, const char *str, int len)
gdb_flush (gdb_stdlog);
}
- return (scb->ops->write (scb, str, len));
+ return (scb->ops->write (scb, buf, count));
}
void
diff --git a/gdb/serial.h b/gdb/serial.h
index a91c8b8..7a97e28 100644
--- a/gdb/serial.h
+++ b/gdb/serial.h
@@ -104,10 +104,10 @@ enum serial_rc {
extern int serial_readchar (struct serial *scb, int timeout);
-/* Write LEN chars from STRING to the port SCB. Returns 0 for
+/* Write COUNT bytes from BUF to the port SCB. Returns 0 for
success, non-zero for failure. */
-extern int serial_write (struct serial *scb, const char *str, int len);
+extern int serial_write (struct serial *scb, const void *buf, size_t count);
/* Write a printf style string onto the serial port. */
@@ -256,7 +256,7 @@ struct serial_ops
void (*close) (struct serial *);
int (*fdopen) (struct serial *, int fd);
int (*readchar) (struct serial *, int timeout);
- int (*write) (struct serial *, const char *str, int len);
+ int (*write) (struct serial *, const void *buf, size_t count);
/* Discard pending output */
int (*flush_output) (struct serial *);
/* Discard pending input */
next prev parent reply other threads:[~2013-04-12 10:18 UTC|newest]
Thread overview: 39+ messages / expand[flat|nested] mbox.gz Atom feed top
2013-04-11 23:00 [PATCH 00/26] Make GDB -Wpointer-sign clean Pedro Alves
2013-04-11 23:00 ` [PATCH 02/26] -Wpointer-sign: gdb_byte -> char Pedro Alves
2013-04-12 12:34 ` Yao Qi
2013-04-12 14:42 ` Pedro Alves
2013-04-11 23:00 ` [PATCH 01/26] -Wpointer-sign: char -> gdb_byte Pedro Alves
2013-04-11 23:01 ` [PATCH 05/26] mep-tdep.c: Wrong signness for instruction buffer Pedro Alves
2013-04-11 23:01 ` [PATCH 04/26] alpha-tdep.c/mips-tdep.c: "set heuristic-fence-post" is signed/zinteger Pedro Alves
2013-04-11 23:01 ` [PATCH 03/26] cris-tdep.c: Use unsigned variable for unsigned command Pedro Alves
2013-04-11 23:01 ` [PATCH 07/26] ppc-linux-tdep.c: Wrong signness for buffer holding instructions Pedro Alves
2013-04-11 23:01 ` [PATCH 10/26] -Wpointer-sign: xtensa-tdep.c Pedro Alves
2013-04-11 23:01 ` [PATCH 08/26] -Wpointer-sign: s390-tdep.c Pedro Alves
2013-04-11 23:01 ` [PATCH 12/26] Cast result of obstack_base to gdb_byte * in a couple spots Pedro Alves
2013-04-11 23:01 ` [PATCH 06/26] mips-tdep.c: Wrong signness for local holding PC register Pedro Alves
2013-04-11 23:02 ` [PATCH 13/26] serial_write: change prototype to take a void-pointer buffer Pedro Alves
2013-04-12 14:55 ` Pedro Alves [this message]
2013-04-19 14:23 ` Pedro Alves
2013-04-19 14:28 ` Eli Zaretskii
2013-04-19 14:28 ` Pedro Alves
2013-04-11 23:02 ` [PATCH 11/26] -Wpointer-sign: alpha-tdep.c Pedro Alves
2013-04-11 23:20 ` [PATCH 14/26] gdb_byte for binary buffer, char for string: remote.c, tracepoint.c Pedro Alves
2013-04-11 23:23 ` [PATCH 15/26] gdb_byte for binary buffer, char for string: common/agent.c Pedro Alves
2013-04-12 2:30 ` [PATCH 16/26] -Wpointer-sign: remote-mips.c Pedro Alves
2013-04-12 2:32 ` [PATCH 17/26] -Wpointer-sign: python/ Pedro Alves
2013-04-12 20:56 ` Tom Tromey
2013-04-12 6:55 ` [PATCH 18/26] -Wpointer-sign: bookmarks Pedro Alves
2013-04-12 8:58 ` [PATCH 19/26] -Wpointer-sign: coff-pe-read.c: treat strings in PE/COFF data as char * Pedro Alves
2013-04-12 9:06 ` [PATCH 20/26] -Wpointer-sign: xcoffread.c Pedro Alves
2013-04-12 9:32 ` [PATCH 21/26] -Wpointer-sign: dwarf2read.c Pedro Alves
2013-04-12 21:01 ` Tom Tromey
2013-04-12 9:54 ` [PATCH 22/26] -Wpointer-sign: dwarf2-frame.c: Pass unsigned variable to safe_read_uleb128 Pedro Alves
2013-04-12 10:01 ` [PATCH 23/26] -Wpointer-sign: ada-lang.c, ada-tasks.c Pedro Alves
2013-04-12 10:11 ` [PATCH 24/26] -Wpointer-sign: cp-valprint.c Pedro Alves
2013-04-12 10:18 ` [PATCH 25/26] -Wpointer-sign: ctf.c Pedro Alves
2013-04-12 10:39 ` [PATCH 26/26] -Wpointer-sign: record.c Pedro Alves
2013-04-12 11:34 ` [PATCH 09/26] -Wpointer-sign: aarch64-tdep.c Pedro Alves
2013-04-12 14:39 ` [PATCH 00/26] Make GDB -Wpointer-sign clean Yao Qi
2013-04-12 21:44 ` Tom Tromey
2013-04-19 14:13 ` Pedro Alves
2013-04-19 18:17 ` [COMMIT] " Pedro Alves
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=5167DF5F.8060701@redhat.com \
--to=palves@redhat.com \
--cc=gdb-patches@sourceware.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox