Patchwork [pushed] Make gdbreplay use more common routines

login
register
mail settings
Submitter Pedro Alves
Date June 8, 2018, 7:49 p.m.
Message ID <20180608194918.8543-1-palves@redhat.com>
Download mbox | patch
Permalink /patch/27722/
State New
Headers show

Comments

Pedro Alves - June 8, 2018, 7:49 p.m.
This makes gdbreplay share a bit more code with gdbserver, and paves
the way to share more in future.  Including common-defs.h pulls in
defines and headers that gdb and gdbserver assume are always
defined/available too, such as for example _(), ansidecl.h or a set of
system headers.  Including that revealed (static vs extern conflict)
gdbreplay had a local copy of perror_with_name (which exited directly
instead of throwing an error).  So I removed gdbreplay's local copy,
and then added enough .o files until gdbreplay linked successfully.

Also, use xstrdup instead of strdup.

gdb/gdbserver/ChangeLog:
2018-06-08  Pedro Alves  <palves@redhat.com>

	* Makefile.in (GDBREPLAY_OBS): Add common/cleanups.o,
	common/common-exceptions.o, common/common-utils.o,
	common/errors.o, common/print-utils.o and utils.o.
	* gdbreplay.c: Include "common-defs.h" instead of the two
	'config.h's here.  Don't include stdio.h, errno.h, stdlib.h,
	string.h or alloca.h.
	(perror_with_name): Delete.
	(remote_open): Use xstrdup instead of strdup.
	(main): Rename to ...
	(captured_main): ... this.
	(main): New.
---
 gdb/gdbserver/ChangeLog   | 14 +++++++++++
 gdb/gdbserver/Makefile.in | 11 +++++++-
 gdb/gdbserver/gdbreplay.c | 64 +++++++++++++++++++++--------------------------
 3 files changed, 52 insertions(+), 37 deletions(-)

Patch

diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 4e55c365be0..d040dc1af49 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,17 @@ 
+2018-06-08  Pedro Alves  <palves@redhat.com>
+
+	* Makefile.in (GDBREPLAY_OBS): Add common/cleanups.o,
+	common/common-exceptions.o, common/common-utils.o,
+	common/errors.o, common/print-utils.o and utils.o.
+	* gdbreplay.c: Include "common-defs.h" instead of the two
+	'config.h's here.  Don't include stdio.h, errno.h, stdlib.h,
+	string.h or alloca.h.
+	(perror_with_name): Delete.
+	(remote_open): Use xstrdup instead of strdup.
+	(main): Rename to ...
+	(captured_main): ... this.
+	(main): New.
+
 2018-06-08  Tom Tromey  <tom@tromey.com>
 
 	* linux-low.c (linux_low_read_btrace): Update.
diff --git a/gdb/gdbserver/Makefile.in b/gdb/gdbserver/Makefile.in
index 675faa43642..cf04b7d7b5a 100644
--- a/gdb/gdbserver/Makefile.in
+++ b/gdb/gdbserver/Makefile.in
@@ -284,7 +284,16 @@  OBS = \
 	$(LIBOBJS) \
 	$(XML_BUILTIN)
 
-GDBREPLAY_OBS = gdbreplay.o version.o
+GDBREPLAY_OBS = \
+	common/cleanups.o \
+	common/common-exceptions.o \
+	common/common-utils.o \
+	common/errors.o \
+	common/print-utils.o \
+	gdbreplay.o \
+	utils.o \
+	version.o
+
 GDBSERVER_LIBS = @GDBSERVER_LIBS@
 XM_CLIBS = @LIBS@
 CDEPS = $(srcdir)/proc-service.list
diff --git a/gdb/gdbserver/gdbreplay.c b/gdb/gdbserver/gdbreplay.c
index c1a639069a6..a4bc8924623 100644
--- a/gdb/gdbserver/gdbreplay.c
+++ b/gdb/gdbserver/gdbreplay.c
@@ -17,11 +17,9 @@ 
    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
-#include "config.h"
-#include "build-gnulib-gdbserver/config.h"
+#include "common-defs.h"
 #include "version.h"
 
-#include <stdio.h>
 #if HAVE_SYS_FILE_H
 #include <sys/file.h>
 #endif
@@ -32,9 +30,6 @@ 
 #if HAVE_FCNTL_H
 #include <fcntl.h>
 #endif
-#include <errno.h>
-#include <stdlib.h>
-#include <string.h>
 #include <unistd.h>
 #ifdef HAVE_NETINET_IN_H
 #include <netinet/in.h>
@@ -49,8 +44,6 @@ 
 #include <netinet/tcp.h>
 #endif
 
-#include <alloca.h>
-
 #if USE_WIN32API
 #include <winsock2.h>
 #endif
@@ -115,32 +108,6 @@  strerror (DWORD error)
 
 #endif /* __MINGW32CE__ */
 
-/* Print the system error message for errno, and also mention STRING
-   as the file name for which the error was encountered.
-   Then return to command level.  */
-
-static void
-perror_with_name (const char *string)
-{
-#ifndef STDC_HEADERS
-  extern int errno;
-#endif
-  const char *err;
-  char *combined;
-
-  err = strerror (errno);
-  if (err == NULL)
-    err = "unknown error";
-
-  combined = (char *) alloca (strlen (err) + strlen (string) + 3);
-  strcpy (combined, string);
-  strcat (combined, ": ");
-  strcat (combined, err);
-  fprintf (stderr, "\n%s.\n", combined);
-  fflush (stderr);
-  exit (1);
-}
-
 static void
 sync_error (FILE *fp, const char *desc, int expect, int got)
 {
@@ -422,8 +389,11 @@  gdbreplay_usage (FILE *stream)
     fprintf (stream, "Report bugs to \"%s\".\n", REPORT_BUGS_TO);
 }
 
-int
-main (int argc, char *argv[])
+/* Main function.  This is called by the real "main" function,
+   wrapped in a TRY_CATCH that handles any uncaught exceptions.  */
+
+static void ATTRIBUTE_NORETURN
+captured_main (int argc, char *argv[])
 {
   FILE *fp;
   int ch;
@@ -471,3 +441,25 @@  main (int argc, char *argv[])
   remote_close ();
   exit (0);
 }
+
+int
+main (int argc, char *argv[])
+{
+  TRY
+    {
+      captured_main (argc, argv);
+    }
+  CATCH (exception, RETURN_MASK_ALL)
+    {
+      if (exception.reason == RETURN_ERROR)
+	{
+	  fflush (stdout);
+	  fprintf (stderr, "%s\n", exception.message);
+	}
+
+      exit (1);
+    }
+  END_CATCH
+
+  gdb_assert_not_reached ("captured_main should never return");
+}