Make gdbreplay use more common routines

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.
This commit is contained in:
Pedro Alves
2018-06-08 20:48:28 +01:00
parent ecf99cc092
commit 03349c9345
3 changed files with 52 additions and 37 deletions

View File

@ -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.

View File

@ -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

View File

@ -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");
}