From: Gary Benson <gbenson@redhat.com>
To: gdb-patches@sourceware.org
Subject: [PATCH 3/5] Introduce common/gdb_setjmp.h
Date: Mon, 18 Aug 2014 08:47:00 -0000 [thread overview]
Message-ID: <1408351618-21013-4-git-send-email-gbenson@redhat.com> (raw)
In-Reply-To: <1408351618-21013-1-git-send-email-gbenson@redhat.com>
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/
2014-08-18 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): Undefine.
(SIGSETJMP): Likewise.
(SIGLONGJMP): Likewise.
* exceptions.h (gdb_setjmp.h): Include.
(setjmp.h): Do not include.
(EXCEPTIONS_SIGJMP_BUF): Undefine.
(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/
2014-08-18 Gary Benson <gbenson@redhat.com>
* config.in: Regenerate.
* configure: Likewise.
---
gdb/ChangeLog | 19 +++++++++++++
gdb/Makefile.in | 2 +-
gdb/common/common.m4 | 11 +++++++
gdb/common/gdb_setjmp.h | 34 +++++++++++++++++++++++
gdb/configure | 68 ++++++++++++++++++++++------------------------
gdb/configure.ac | 11 -------
gdb/cp-support.c | 12 --------
gdb/exceptions.c | 6 ++--
gdb/exceptions.h | 25 ++++-------------
gdb/gdbserver/ChangeLog | 5 +++
gdb/gdbserver/config.in | 3 ++
gdb/gdbserver/configure | 33 ++++++++++++++++++++++
12 files changed, 148 insertions(+), 81 deletions(-)
create mode 100644 gdb/common/gdb_setjmp.h
diff --git a/gdb/Makefile.in b/gdb/Makefile.in
index 1840ce7..951a738 100644
--- a/gdb/Makefile.in
+++ b/gdb/Makefile.in
@@ -939,7 +939,7 @@ 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 target/target.h target/symbol.h common/common-regcache.h
common/common-debug.h target/target.h target/symbol.h common/common-regcache.h \
-common/cleanups.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 874922d..0551f95 100755
--- a/gdb/configure
+++ b/gdb/configure
@@ -11054,6 +11054,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.
@@ -11316,41 +11349,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 38e966c..99a147c 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/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=""
--
1.7.1
next prev parent reply other threads:[~2014-08-18 8:47 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-08-18 8:47 [PATCH 0/5] Make gdbserver use exceptions and cleanups Gary Benson
2014-08-18 8:47 ` Gary Benson [this message]
2014-08-20 16:54 ` [PATCH 3/5] Introduce common/gdb_setjmp.h Pedro Alves
2014-08-18 8:47 ` [PATCH 2/5] Move cleanups.[ch] to common Gary Benson
2014-08-20 16:47 ` Pedro Alves
2014-08-20 19:05 ` Gary Benson
2014-08-28 15:35 ` Pedro Alves
2014-08-28 15:36 ` Pedro Alves
2014-08-18 8:47 ` [PATCH 1/5] Move internal_{,v}warning to common/errors.[ch] Gary Benson
2014-08-18 8:52 ` [PATCH 4/5] Introduce common/common-exceptions.[ch] Gary Benson
2014-08-18 9:25 ` [PATCH 5/5] Use exceptions and cleanups in gdbserver Gary Benson
2014-08-28 15:35 ` Pedro Alves
2014-08-28 15:39 ` [PATCH 0/5] Make gdbserver use exceptions and cleanups Pedro Alves
2014-08-29 10:07 ` Gary Benson
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=1408351618-21013-4-git-send-email-gbenson@redhat.com \
--to=gbenson@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