Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Julio Guerra <guerr@julio.in>
To: gdb-patches@sourceware.org
Cc: Mike Frysinger <vapier@gentoo.org>
Subject: [PATCH 3/4] Explicit fixed-width integral File I/O protocol types
Date: Sat, 28 Apr 2018 01:19:00 -0000	[thread overview]
Message-ID: <20180428011940.115515-4-julio@farjump.io> (raw)
In-Reply-To: <20180428011940.115515-1-julio@farjump.io>

The File I/O extension defines portable types of there host-specific
counterparts, such as `struct stat` and `struct timeval`. This patch improves
these type definitions in `include/gdb/fileio.h` to make possible sharing them
with target programs, and avoid redefining them by being able to include this
header, even with cross-compiled programs.

The patch thus removes several drawbacks:
- avoid implicit pointers when defining fixed-width integers as array typedefs.
- explicitly state the sizes of fixed-width integers (e.g. fio_ulong_t becomes
  fio_uint64_t).
It also renames a few misnamed conversion functions with the convention
`host_to_fileio_*` used everywhere else.

Note that fixed-width integer types are defined using GCC's preprocessor builtin
macros to avoid using the libc's stdint.h which might not be available on the
target compiler. Therefore, `include/gdb/fileio.h` is standalone.

Tested with https://github.com/farjump/raspberry-pi/blob/ea31c48d7c7eed27d39fb1bec2d3a1d308cb8ae7/sdk/libalpha/include/alpha/fileio.h#L13

2018-04-28  Julio Guerra  <julio@farjump.io>

	* include/gdb/fileio.h: explicit fixed-width integral File I/O protocol types.
	* gdb/common/fileio.c: explicit fixed-width integral File I/O protocol types.
	* gdb/common/fileio.h: explicit fixed-width integral File I/O protocol types.
	* gdb/remote-fileio.c: explicit fixed-width integral File I/O protocol types.

Signed-off-by: Julio Guerra <julio@farjump.io>
---
 gdb/ChangeLog        |  7 ++++++
 gdb/common/fileio.c  | 39 +++++++++++++++--------------
 gdb/common/fileio.h  |  8 +++---
 gdb/remote-fileio.c  | 26 ++++++++++----------
 include/gdb/fileio.h | 58 +++++++++++++++-----------------------------
 5 files changed, 63 insertions(+), 75 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6986798f08..dc7f7cd8ac 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2018-04-28  Julio Guerra  <julio@farjump.io>
+
+	* include/gdb/fileio.h: explicit fixed-width integral File I/O protocol types.
+	* gdb/common/fileio.c: explicit fixed-width integral File I/O protocol types.
+	* gdb/common/fileio.h: explicit fixed-width integral File I/O protocol types.
+	* gdb/remote-fileio.c: explicit fixed-width integral File I/O protocol types.
+
 2018-04-28  Julio Guerra  <julio@farjump.io>
 
 	* gdb/remote-fileio.c: do not clear the value of st_dev in File I/O's stat().
diff --git a/gdb/common/fileio.c b/gdb/common/fileio.c
index 912a7ede3c..71b2745434 100644
--- a/gdb/common/fileio.c
+++ b/gdb/common/fileio.c
@@ -205,17 +205,17 @@ fileio_mode_pack (mode_t mode)
 /* Pack a host-format mode_t into an fio_mode_t.  */
 
 static void
-host_to_fileio_mode (mode_t num, fio_mode_t fnum)
+host_to_fileio_mode (mode_t num, fio_mode_t *fnum)
 {
-  host_to_bigendian (fileio_mode_pack (num), (char *) fnum, 4);
+  host_to_bigendian (fileio_mode_pack (num), (char *) fnum, sizeof (fio_mode_t));
 }
 
 /* Pack a host-format integer into an fio_ulong_t.  */
 
 static void
-host_to_fileio_ulong (LONGEST num, fio_ulong_t fnum)
+host_to_fileio_uint64 (LONGEST num, fio_uint64_t* fnum)
 {
-  host_to_bigendian (num, (char *) fnum, 8);
+  host_to_bigendian (num, (char *) fnum, sizeof (fio_uint64_t));
 }
 
 /* See fileio.h.  */
@@ -225,31 +225,30 @@ host_to_fileio_stat (struct stat *st, struct fio_stat *fst)
 {
   LONGEST blksize;
 
-  host_to_fileio_uint ((long) st->st_dev, fst->fst_dev);
-  host_to_fileio_uint ((long) st->st_ino, fst->fst_ino);
-  host_to_fileio_mode (st->st_mode, fst->fst_mode);
-  host_to_fileio_uint ((long) st->st_nlink, fst->fst_nlink);
-  host_to_fileio_uint ((long) st->st_uid, fst->fst_uid);
-  host_to_fileio_uint ((long) st->st_gid, fst->fst_gid);
-  host_to_fileio_uint ((long) st->st_rdev, fst->fst_rdev);
-  host_to_fileio_ulong ((LONGEST) st->st_size, fst->fst_size);
+  host_to_fileio_uint32 ((long) st->st_dev, &fst->fst_dev);
+  host_to_fileio_uint32 ((long) st->st_ino, &fst->fst_ino);
+  host_to_fileio_mode (st->st_mode, &fst->fst_mode);
+  host_to_fileio_uint32 ((long) st->st_nlink, &fst->fst_nlink);
+  host_to_fileio_uint32 ((long) st->st_uid, &fst->fst_uid);
+  host_to_fileio_uint32 ((long) st->st_gid, &fst->fst_gid);
+  host_to_fileio_uint32 ((long) st->st_rdev, &fst->fst_rdev);
+  host_to_fileio_uint64 ((LONGEST) st->st_size, &fst->fst_size);
 #ifdef HAVE_STRUCT_STAT_ST_BLKSIZE
   blksize = st->st_blksize;
 #else
   blksize = 512;
 #endif
-  host_to_fileio_ulong (blksize, fst->fst_blksize);
+  host_to_fileio_uint64 ((LONGEST) blksize, &fst->fst_blksize);
 #if HAVE_STRUCT_STAT_ST_BLOCKS
-  host_to_fileio_ulong ((LONGEST) st->st_blocks, fst->fst_blocks);
+  host_to_fileio_uint64 ((LONGEST) st->st_blocks, &fst->fst_blocks);
 #else
   /* FIXME: This is correct for DJGPP, but other systems that don't
      have st_blocks, if any, might prefer 512 instead of st_blksize.
      (eliz, 30-12-2003)  */
-  host_to_fileio_ulong (((LONGEST) st->st_size + blksize - 1)
-			/ blksize,
-			fst->fst_blocks);
+  host_to_fileio_uint64 (((LONGEST) st->st_size + blksize - 1) / blksize,
+			 &fst->fst_blocks);
 #endif
-  host_to_fileio_time (st->st_atime, fst->fst_atime);
-  host_to_fileio_time (st->st_mtime, fst->fst_mtime);
-  host_to_fileio_time (st->st_ctime, fst->fst_ctime);
+  host_to_fileio_time (st->st_atime, &fst->fst_atime);
+  host_to_fileio_time (st->st_mtime, &fst->fst_mtime);
+  host_to_fileio_time (st->st_ctime, &fst->fst_ctime);
 }
diff --git a/gdb/common/fileio.h b/gdb/common/fileio.h
index 92d26742a7..85155ccf9a 100644
--- a/gdb/common/fileio.h
+++ b/gdb/common/fileio.h
@@ -53,17 +53,17 @@ host_to_bigendian (LONGEST num, char *buf, int bytes)
 /* Pack a host-format integer into an fio_uint_t.  */
 
 static inline void
-host_to_fileio_uint (long num, fio_uint_t fnum)
+host_to_fileio_uint32 (long num, fio_uint32_t *fnum)
 {
-  host_to_bigendian ((LONGEST) num, (char *) fnum, 4);
+  host_to_bigendian ((LONGEST) num, (char *) fnum, sizeof (fio_uint32_t));
 }
 
 /* Pack a host-format time_t into an fio_time_t.  */
 
 static inline void
-host_to_fileio_time (time_t num, fio_time_t fnum)
+host_to_fileio_time (time_t num, fio_time_t *fnum)
 {
-  host_to_bigendian ((LONGEST) num, (char *) fnum, 4);
+  host_to_bigendian ((LONGEST) num, (char *) fnum, sizeof (fio_time_t));
 }
 
 /* Pack a host-format struct stat into a struct fio_stat.  */
diff --git a/gdb/remote-fileio.c b/gdb/remote-fileio.c
index e855c682a0..2237787f72 100644
--- a/gdb/remote-fileio.c
+++ b/gdb/remote-fileio.c
@@ -286,16 +286,16 @@ remote_fileio_extract_ptr_w_len (char **buf, CORE_ADDR *ptrval, int *length)
 }
 
 static void
-remote_fileio_to_fio_long (LONGEST num, fio_long_t fnum)
+host_to_fileio_int64 (LONGEST num, fio_int64_t *fnum)
 {
-  host_to_bigendian (num, (char *) fnum, 8);
+  host_to_bigendian (num, (char *) fnum, sizeof (fio_int64_t));
 }
 
 static void
-remote_fileio_to_fio_timeval (struct timeval *tv, struct fio_timeval *ftv)
+host_to_fileio_timeval (struct timeval *tv, struct fio_timeval *ftv)
 {
-  host_to_fileio_time (tv->tv_sec, ftv->ftv_sec);
-  remote_fileio_to_fio_long (tv->tv_usec, ftv->ftv_usec);
+  host_to_fileio_time (tv->tv_sec, &ftv->ftv_sec);
+  host_to_fileio_int64 (tv->tv_usec, &ftv->ftv_usec);
 }
 
 /* The quit handler originally installed.  */
@@ -914,7 +914,7 @@ remote_fileio_func_fstat (char *buf)
 
   if (fd == FIO_FD_CONSOLE_IN || fd == FIO_FD_CONSOLE_OUT)
     {
-      host_to_fileio_uint (1, fst.fst_dev);
+      host_to_fileio_uint32 (1, &fst.fst_dev);
       memset (&st, 0, sizeof (st));
       st.st_mode = S_IFCHR | (fd == FIO_FD_CONSOLE_IN ? S_IRUSR : S_IWUSR);
       st.st_nlink = 1;
@@ -997,7 +997,7 @@ remote_fileio_func_gettimeofday (char *buf)
 
   if (ptrval)
     {
-      remote_fileio_to_fio_timeval (&tv, &ftv);
+      host_to_fileio_timeval (&tv, &ftv);
 
       errno = target_write_memory (ptrval, (gdb_byte *) &ftv, sizeof ftv);
       if (errno != 0)
@@ -1178,21 +1178,21 @@ remote_fileio_request (char *buf, int ctrlc_pending_p)
 }
 \f
 
-/* Unpack an fio_uint_t.  */
+/* Unpack an fio_uint32_t.  */
 
 static unsigned int
-remote_fileio_to_host_uint (fio_uint_t fnum)
+remote_fileio_to_host_uint (fio_uint32_t fnum)
 {
-  return extract_unsigned_integer ((gdb_byte *) fnum, 4,
+  return extract_unsigned_integer ((gdb_byte *) &fnum, 4,
 				   BFD_ENDIAN_BIG);
 }
 
-/* Unpack an fio_ulong_t.  */
+/* Unpack an fio_uint64_t.  */
 
 static ULONGEST
-remote_fileio_to_host_ulong (fio_ulong_t fnum)
+remote_fileio_to_host_ulong (fio_uint64_t fnum)
 {
-  return extract_unsigned_integer ((gdb_byte *) fnum, 8,
+  return extract_unsigned_integer ((gdb_byte *) &fnum, 8,
 				   BFD_ENDIAN_BIG);
 }
 
diff --git a/include/gdb/fileio.h b/include/gdb/fileio.h
index 7bb55f579f..8b37df4dfe 100644
--- a/include/gdb/fileio.h
+++ b/include/gdb/fileio.h
@@ -95,50 +95,32 @@
 #define FILEIO_ULONG_MAX   18446744073709551615ULL
 
 /* Integral types as used in protocol. */
-#if 0
-typedef __int32_t fio_int_t;
-typedef __uint32_t fio_uint_t, fio_mode_t, fio_time_t;
-typedef __int64_t fio_long_t;
-typedef __uint64_t fio_ulong_t;
-#endif
-
-#define FIO_INT_LEN   4
-#define FIO_UINT_LEN  4
-#define FIO_MODE_LEN  4
-#define FIO_TIME_LEN  4
-#define FIO_LONG_LEN  8
-#define FIO_ULONG_LEN 8
-
-typedef char fio_int_t[FIO_INT_LEN];   
-typedef char fio_uint_t[FIO_UINT_LEN];
-typedef char fio_mode_t[FIO_MODE_LEN];
-typedef char fio_time_t[FIO_TIME_LEN];
-typedef char fio_long_t[FIO_LONG_LEN];
-typedef char fio_ulong_t[FIO_ULONG_LEN];
-
-/* Struct stat as used in protocol.  For complete independence
-   of host/target systems, it's defined as an array with offsets
-   to the members. */
+typedef __INT32_TYPE__  fio_int32_t;
+typedef __UINT32_TYPE__ fio_uint32_t, fio_mode_t, fio_time_t;
+typedef __INT64_TYPE__  fio_int64_t;
+typedef __UINT64_TYPE__ fio_uint64_t;
 
+/* Struct stat as used in protocol. */
 struct fio_stat {
-  fio_uint_t  fst_dev;
-  fio_uint_t  fst_ino;
-  fio_mode_t  fst_mode;
-  fio_uint_t  fst_nlink;
-  fio_uint_t  fst_uid;
-  fio_uint_t  fst_gid;
-  fio_uint_t  fst_rdev;
-  fio_ulong_t fst_size;
-  fio_ulong_t fst_blksize;
-  fio_ulong_t fst_blocks;
-  fio_time_t  fst_atime;
-  fio_time_t  fst_mtime;
-  fio_time_t  fst_ctime;
+  fio_uint32_t fst_dev;
+  fio_uint32_t fst_ino;
+  fio_mode_t   fst_mode;
+  fio_uint32_t fst_nlink;
+  fio_uint32_t fst_uid;
+  fio_uint32_t fst_gid;
+  fio_uint32_t fst_rdev;
+  fio_uint64_t fst_size;
+  fio_uint64_t fst_blksize;
+  fio_uint64_t fst_blocks;
+  fio_time_t   fst_atime;
+  fio_time_t   fst_mtime;
+  fio_time_t   fst_ctime;
 };
 
+/* Struct timeval as used in protocol. */
 struct fio_timeval {
   fio_time_t  ftv_sec;
-  fio_long_t  ftv_usec;
+  fio_int64_t ftv_usec;
 };
 
 #endif /* GDB_FILEIO_H_ */
-- 
2.17.0


  parent reply	other threads:[~2018-04-28  1:19 UTC|newest]

Thread overview: 10+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-04-28  1:19 [PATCH 0/4] Some File I/O improvements for embedded programming Julio Guerra
2018-04-28  1:19 ` [PATCH 2/4] Do not clear the value of st_dev in File I/O's stat() Julio Guerra
2018-04-28  1:19 ` Julio Guerra [this message]
2018-05-02 10:46   ` [PATCH 3/4] Explicit fixed-width integral File I/O protocol types Pedro Alves
     [not found]     ` <332abe88-4b88-3f06-7141-31a798f2b153@farjump.io>
2018-05-02 15:18       ` Julio Guerra
2018-05-02 16:14         ` Joel Brobecker
     [not found]           ` <a5149a53-09e3-2a08-607a-38d81dfa5eac@farjump.io>
2018-05-02 16:31             ` Julio Guerra
2018-04-28  1:19 ` [PATCH 1/4] Remove the restriction of File I/O functions to regular files only Julio Guerra
2018-04-30  1:54   ` Simon Marchi
2018-04-28  1:19 ` [PATCH 4/4] Install gdb/fileio.h Julio Guerra

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=20180428011940.115515-4-julio@farjump.io \
    --to=guerr@julio.in \
    --cc=gdb-patches@sourceware.org \
    --cc=vapier@gentoo.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