diff options
author | Gary Benson <gbenson@redhat.com> | 2014-08-07 15:53:21 +0100 |
---|---|---|
committer | Gary Benson <gbenson@redhat.com> | 2014-08-29 10:53:36 +0100 |
commit | e9bcb6585201ab674d90d714295f63b40da41f16 (patch) | |
tree | 0f9c692937bd00e832170a137fed9eb17c4e188d | |
parent | e31806255fe0cf49a1eeb14a51788473eaaa6310 (diff) | |
download | gdb-e9bcb6585201ab674d90d714295f63b40da41f16.zip gdb-e9bcb6585201ab674d90d714295f63b40da41f16.tar.gz gdb-e9bcb6585201ab674d90d714295f63b40da41f16.tar.bz2 |
Introduce common/gdb_setjmp.h
This commit creates a new file, common/gdb_setjmp.h, to hold some
portability macros for setjmp/longjmp et al. that are used by the
exceptions subsystem and by the demangler crash catcher.
gdb/ChangeLog:
* common/gdb_setjmp.h: New file.
* Makefile.in (HFILES_NO_SRCDIR): Add common/gdb_setjmp.h.
* configure.ac: Move sigsetjmp check...
* common/common.m4: ...here.
* configure: Regenerate.
* cp-support.c (SIGJMP_BUF): Delete.
(SIGSETJMP): Likewise.
(SIGLONGJMP): Likewise.
* exceptions.h (gdb_setjmp.h): Include.
(setjmp.h): Do not include.
(EXCEPTIONS_SIGJMP_BUF): Delete.
(EXCEPTIONS_SIGSETJMP): Likewise.
(EXCEPTIONS_SIGLONGJMP): Likewise.
Replace all uses of EXCEPTIONS_SIG* macros with SIG* macros
from gdb_setjmp.h.
* exceptions.c: Likewise.
gdb/gdbserver/ChangeLog:
* config.in: Regenerate.
* configure: Likewise.
-rw-r--r-- | gdb/ChangeLog | 19 | ||||
-rw-r--r-- | gdb/Makefile.in | 2 | ||||
-rw-r--r-- | gdb/common/common.m4 | 11 | ||||
-rw-r--r-- | gdb/common/gdb_setjmp.h | 34 | ||||
-rwxr-xr-x | gdb/configure | 68 | ||||
-rw-r--r-- | gdb/configure.ac | 11 | ||||
-rw-r--r-- | gdb/cp-support.c | 12 | ||||
-rw-r--r-- | gdb/exceptions.c | 6 | ||||
-rw-r--r-- | gdb/exceptions.h | 25 | ||||
-rw-r--r-- | gdb/gdbserver/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/gdbserver/config.in | 3 | ||||
-rwxr-xr-x | gdb/gdbserver/configure | 33 |
12 files changed, 148 insertions, 81 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 6bacb45..fbe8e87 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,24 @@ 2014-08-29 Gary Benson <gbenson@redhat.com> + * common/gdb_setjmp.h: New file. + * Makefile.in (HFILES_NO_SRCDIR): Add common/gdb_setjmp.h. + * configure.ac: Move sigsetjmp check... + * common/common.m4: ...here. + * configure: Regenerate. + * cp-support.c (SIGJMP_BUF): Delete. + (SIGSETJMP): Likewise. + (SIGLONGJMP): Likewise. + * exceptions.h (gdb_setjmp.h): Include. + (setjmp.h): Do not include. + (EXCEPTIONS_SIGJMP_BUF): Delete. + (EXCEPTIONS_SIGSETJMP): Likewise. + (EXCEPTIONS_SIGLONGJMP): Likewise. + Replace all uses of EXCEPTIONS_SIG* macros with SIG* macros + from gdb_setjmp.h. + * exceptions.c: Likewise. + +2014-08-29 Gary Benson <gbenson@redhat.com> + * cleanups.h: Moved to... * common/cleanups.h: New file. * cleanups.c: Moved to... diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8479324..c886c5d 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -937,7 +937,7 @@ ctf.h nat/i386-cpuid.h nat/i386-gcc-cpuid.h target/resume.h \ target/wait.h target/waitstatus.h nat/linux-nat.h nat/linux-waitpid.h \ common/print-utils.h common/rsp-low.h nat/i386-dregs.h x86-linux-nat.h \ i386-linux-nat.h common/common-defs.h common/errors.h common/common-types.h \ -common/common-debug.h common/cleanups.h +common/common-debug.h common/cleanups.h common/gdb_setjmp.h # Header files that already have srcdir in them, or which are in objdir. diff --git a/gdb/common/common.m4 b/gdb/common/common.m4 index 426df79..7aabd07 100644 --- a/gdb/common/common.m4 +++ b/gdb/common/common.m4 @@ -33,4 +33,15 @@ AC_DEFUN([GDB_AC_COMMON], [ AC_CHECK_FUNCS([fdwalk getrlimit pipe pipe2 socketpair]) AC_CHECK_DECLS([strerror, strstr]) + + dnl Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't + dnl do since sigsetjmp might only be defined as a macro. +AC_CACHE_CHECK([for sigsetjmp], gdb_cv_func_sigsetjmp, +[AC_TRY_COMPILE([ +#include <setjmp.h> +], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);], +gdb_cv_func_sigsetjmp=yes, gdb_cv_func_sigsetjmp=no)]) +if test $gdb_cv_func_sigsetjmp = yes; then + AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ]) +fi ]) diff --git a/gdb/common/gdb_setjmp.h b/gdb/common/gdb_setjmp.h new file mode 100644 index 0000000..aba50a4 --- /dev/null +++ b/gdb/common/gdb_setjmp.h @@ -0,0 +1,34 @@ +/* Portability wrappers for setjmp and longjmp. + Copyright (C) 1986-2014 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef GDB_SETJMP_H +#define GDB_SETJMP_H + +#include <setjmp.h> + +#ifdef HAVE_SIGSETJMP +#define SIGJMP_BUF sigjmp_buf +#define SIGSETJMP(buf) sigsetjmp((buf), 1) +#define SIGLONGJMP(buf,val) siglongjmp((buf), (val)) +#else +#define SIGJMP_BUF jmp_buf +#define SIGSETJMP(buf) setjmp(buf) +#define SIGLONGJMP(buf,val) longjmp((buf), (val)) +#endif + +#endif /* GDB_SETJMP_H */ diff --git a/gdb/configure b/gdb/configure index 9253e28..bf141f1 100755 --- a/gdb/configure +++ b/gdb/configure @@ -11143,6 +11143,39 @@ cat >>confdefs.h <<_ACEOF _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5 +$as_echo_n "checking for sigsetjmp... " >&6; } +if test "${gdb_cv_func_sigsetjmp+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <setjmp.h> + +int +main () +{ +sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gdb_cv_func_sigsetjmp=yes +else + gdb_cv_func_sigsetjmp=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_func_sigsetjmp" >&5 +$as_echo "$gdb_cv_func_sigsetjmp" >&6; } +if test $gdb_cv_func_sigsetjmp = yes; then + +$as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h + +fi + # Check the return and argument types of ptrace. No canned test for # this, so roll our own. @@ -11405,41 +11438,6 @@ if test $ac_cv_func_setpgrp_void = yes; then fi fi -# Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't do -# since sigsetjmp might only be defined as a macro. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5 -$as_echo_n "checking for sigsetjmp... " >&6; } -if test "${gdb_cv_func_sigsetjmp+set}" = set; then : - $as_echo_n "(cached) " >&6 -else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ - -#include <setjmp.h> - -int -main () -{ -sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1); - ; - return 0; -} -_ACEOF -if ac_fn_c_try_compile "$LINENO"; then : - gdb_cv_func_sigsetjmp=yes -else - gdb_cv_func_sigsetjmp=no -fi -rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_func_sigsetjmp" >&5 -$as_echo "$gdb_cv_func_sigsetjmp" >&6; } -if test $gdb_cv_func_sigsetjmp = yes; then - -$as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h - -fi - # Assume we'll default to using the included libiberty regex. gdb_use_included_regex=yes diff --git a/gdb/configure.ac b/gdb/configure.ac index 61919b4..26c8ecf 100644 --- a/gdb/configure.ac +++ b/gdb/configure.ac @@ -1441,17 +1441,6 @@ if test $ac_cv_func_setpgrp_void = yes; then fi fi -# Check if sigsetjmp is available. Using AC_CHECK_FUNCS won't do -# since sigsetjmp might only be defined as a macro. -AC_CACHE_CHECK([for sigsetjmp], gdb_cv_func_sigsetjmp, -[AC_TRY_COMPILE([ -#include <setjmp.h> -], [sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1);], -gdb_cv_func_sigsetjmp=yes, gdb_cv_func_sigsetjmp=no)]) -if test $gdb_cv_func_sigsetjmp = yes; then - AC_DEFINE(HAVE_SIGSETJMP, 1, [Define if sigsetjmp is available. ]) -fi - # Assume we'll default to using the included libiberty regex. gdb_use_included_regex=yes diff --git a/gdb/cp-support.c b/gdb/cp-support.c index 20a4a07..14aaac8 100644 --- a/gdb/cp-support.c +++ b/gdb/cp-support.c @@ -1488,18 +1488,6 @@ cp_lookup_rtti_type (const char *name, struct block *block) static int catch_demangler_crashes = 1; -/* Wrap set/long jmp so that it's more portable. */ - -#if defined(HAVE_SIGSETJMP) -#define SIGJMP_BUF sigjmp_buf -#define SIGSETJMP(buf) sigsetjmp((buf), 1) -#define SIGLONGJMP(buf,val) siglongjmp((buf), (val)) -#else -#define SIGJMP_BUF jmp_buf -#define SIGSETJMP(buf) setjmp(buf) -#define SIGLONGJMP(buf,val) longjmp((buf), (val)) -#endif - /* Stack context and environment for demangler crash recovery. */ static SIGJMP_BUF gdb_demangle_jmp_buf; diff --git a/gdb/exceptions.c b/gdb/exceptions.c index 063d2b1..48843ea 100644 --- a/gdb/exceptions.c +++ b/gdb/exceptions.c @@ -51,7 +51,7 @@ struct catcher { enum catcher_state state; /* Jump buffer pointing back at the exception handler. */ - EXCEPTIONS_SIGJMP_BUF buf; + SIGJMP_BUF buf; /* Status buffer belonging to the exception handler. */ volatile struct gdb_exception *exception; /* Saved/current state. */ @@ -80,7 +80,7 @@ catcher_list_size (void) return size; } -EXCEPTIONS_SIGJMP_BUF * +SIGJMP_BUF * exceptions_state_mc_init (volatile struct gdb_exception *exception, return_mask mask) { @@ -229,7 +229,7 @@ throw_exception (struct gdb_exception exception) be zero, by definition in defs.h. */ exceptions_state_mc (CATCH_THROWING); *current_catcher->exception = exception; - EXCEPTIONS_SIGLONGJMP (current_catcher->buf, exception.reason); + SIGLONGJMP (current_catcher->buf, exception.reason); } static void diff --git a/gdb/exceptions.h b/gdb/exceptions.h index be74ad5..e3ff672 100644 --- a/gdb/exceptions.h +++ b/gdb/exceptions.h @@ -21,7 +21,7 @@ #define EXCEPTIONS_H #include "ui-out.h" -#include <setjmp.h> +#include "gdb_setjmp.h" /* Reasons for calling throw_exceptions(). NOTE: all reason values must be less than zero. enum value 0 is reserved for internal use @@ -114,24 +114,11 @@ struct gdb_exception /* A pre-defined non-exception. */ extern const struct gdb_exception exception_none; -/* Wrap set/long jmp so that it's more portable (internal to - exceptions). */ - -#if defined(HAVE_SIGSETJMP) -#define EXCEPTIONS_SIGJMP_BUF sigjmp_buf -#define EXCEPTIONS_SIGSETJMP(buf) sigsetjmp((buf), 1) -#define EXCEPTIONS_SIGLONGJMP(buf,val) siglongjmp((buf), (val)) -#else -#define EXCEPTIONS_SIGJMP_BUF jmp_buf -#define EXCEPTIONS_SIGSETJMP(buf) setjmp(buf) -#define EXCEPTIONS_SIGLONGJMP(buf,val) longjmp((buf), (val)) -#endif - /* Functions to drive the exceptions state m/c (internal to exceptions). */ -EXCEPTIONS_SIGJMP_BUF *exceptions_state_mc_init (volatile struct - gdb_exception *exception, - return_mask mask); +SIGJMP_BUF *exceptions_state_mc_init (volatile struct + gdb_exception *exception, + return_mask mask); int exceptions_state_mc_action_iter (void); int exceptions_state_mc_action_iter_1 (void); @@ -159,9 +146,9 @@ int exceptions_state_mc_action_iter_1 (void); #define TRY_CATCH(EXCEPTION,MASK) \ { \ - EXCEPTIONS_SIGJMP_BUF *buf = \ + SIGJMP_BUF *buf = \ exceptions_state_mc_init (&(EXCEPTION), (MASK)); \ - EXCEPTIONS_SIGSETJMP (*buf); \ + SIGSETJMP (*buf); \ } \ while (exceptions_state_mc_action_iter ()) \ while (exceptions_state_mc_action_iter_1 ()) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 76afb0d..453854e 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,10 @@ 2014-08-29 Gary Benson <gbenson@redhat.com> + * config.in: Regenerate. + * configure: Likewise. + +2014-08-29 Gary Benson <gbenson@redhat.com> + * Makefile.in (SFILES): Add common/cleanups.c. (OBS): cleanups.o. (cleanups.o): New rule. diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in index 216c01d..7828bf9 100644 --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in @@ -154,6 +154,9 @@ /* Define to 1 if you have the <signal.h> header file. */ #undef HAVE_SIGNAL_H +/* Define if sigsetjmp is available. */ +#undef HAVE_SIGSETJMP + /* Define to 1 if you have the `socketpair' function. */ #undef HAVE_SOCKETPAIR diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure index 9c1f9a8..9495905 100755 --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure @@ -5322,6 +5322,39 @@ cat >>confdefs.h <<_ACEOF _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for sigsetjmp" >&5 +$as_echo_n "checking for sigsetjmp... " >&6; } +if test "${gdb_cv_func_sigsetjmp+set}" = set; then : + $as_echo_n "(cached) " >&6 +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include <setjmp.h> + +int +main () +{ +sigjmp_buf env; while (! sigsetjmp (env, 1)) siglongjmp (env, 1); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_compile "$LINENO"; then : + gdb_cv_func_sigsetjmp=yes +else + gdb_cv_func_sigsetjmp=no +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $gdb_cv_func_sigsetjmp" >&5 +$as_echo "$gdb_cv_func_sigsetjmp" >&6; } +if test $gdb_cv_func_sigsetjmp = yes; then + +$as_echo "#define HAVE_SIGSETJMP 1" >>confdefs.h + +fi + # Check for UST ustlibs="" |