| From 10b064ffe902d5af31bb49bd8e4f03c545f8d462 Mon Sep 17 00:00:00 2001 |
| From: Ladislav Michl <ladis@linux-mips.org> |
| Date: Tue, 13 Nov 2012 11:19:47 +0100 |
| Subject: [PATCH] Support building with older compilers. |
| |
| Add a check for __builtin_unreachable. |
| |
| Upstream-Status: Pending |
| --- |
| configure.ac | 11 +++++++++++ |
| include/libunwind_i.h | 6 ++++++ |
| src/arm/Gresume.c | 2 +- |
| src/sh/Gresume.c | 2 +- |
| 4 files changed, 19 insertions(+), 2 deletions(-) |
| |
| --- a/configure.ac |
| +++ b/configure.ac |
| @@ -285,6 +285,17 @@ if test x$have__builtin___clear_cache = |
| fi |
| AC_MSG_RESULT([$have__builtin___clear_cache]) |
| |
| +AC_MSG_CHECKING([for __builtin_unreachable]) |
| +AC_LINK_IFELSE( |
| + [AC_LANG_PROGRAM([[]], [[__builtin_unreachable()]])], |
| + [have__builtin_unreachable=yes], |
| + [have__builtin_unreachable=no]) |
| +if test x$have__builtin_unreachable = xyes; then |
| + AC_DEFINE([HAVE__BUILTIN_UNREACHABLE], [1], |
| + [Defined if __builtin_unreachable() is available]) |
| +fi |
| +AC_MSG_RESULT([$have__builtin_unreachable]) |
| + |
| AC_MSG_CHECKING([for __sync atomics]) |
| AC_LINK_IFELSE( |
| [AC_LANG_PROGRAM([[]], [[ |
| --- a/include/libunwind_i.h |
| +++ b/include/libunwind_i.h |
| @@ -72,6 +72,12 @@ WITH THE SOFTWARE OR THE USE OR OTHER DE |
| # endif |
| #endif |
| |
| +#if defined(HAVE__BUILTIN_UNREACHABLE) |
| +# define unreachable() __builtin_unreachable() |
| +#else |
| +# define unreachable() do { } while (1) |
| +#endif |
| + |
| #ifdef DEBUG |
| # define UNW_DEBUG 1 |
| #else |
| --- a/src/arm/Gresume.c |
| +++ b/src/arm/Gresume.c |
| @@ -96,7 +96,7 @@ arm_local_resume (unw_addr_space_t as, u |
| : : "r" (c->sigcontext_sp), "r" (c->sigcontext_pc) |
| ); |
| } |
| - __builtin_unreachable(); |
| + unreachable(); |
| #else |
| printf ("%s: implement me\n", __FUNCTION__); |
| #endif |
| --- a/src/sh/Gresume.c |
| +++ b/src/sh/Gresume.c |
| @@ -109,7 +109,7 @@ sh_local_resume (unw_addr_space_t as, un |
| "r" (c->sigcontext_pc) |
| ); |
| } |
| - __builtin_unreachable(); |
| + unreachable(); |
| #endif |
| return -UNW_EINVAL; |
| } |