# This file is generated from configure.in by Autoconf.  DO NOT EDIT!

if test "x$libc_cv_gcc___thread" != xyes; then
  { { $as_echo "$as_me:$LINENO: error: compiler support for __thread is required" >&5
$as_echo "$as_me: error: compiler support for __thread is required" >&2;}
   { (exit 1); exit 1; }; }
fi

if test "x${libc_cv_visibility_attribute}" != xyes ||
   test "x${libc_cv_broken_visibility_attribute}" != xno; then
  { { $as_echo "$as_me:$LINENO: error: working compiler support for visibility attribute is required" >&5
$as_echo "$as_me: error: working compiler support for visibility attribute is required" >&2;}
   { (exit 1); exit 1; }; }
fi

if test "x$libc_cv_asm_cfi_directives" != xyes; then
    case "$base_machine" in
    i386 | x86_64 | powerpc | s390)
      { { $as_echo "$as_me:$LINENO: error: CFI directive support in assembler is required" >&5
$as_echo "$as_me: error: CFI directive support in assembler is required" >&2;}
   { (exit 1); exit 1; }; } ;;
    *) ;;
  esac
fi


{ $as_echo "$as_me:$LINENO: checking for forced unwind support" >&5
$as_echo_n "checking for forced unwind support... " >&6; }
if test "${libc_cv_forced_unwind+set}" = set; then
  $as_echo_n "(cached) " >&6
else
  cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h.  */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h.  */
#include <unwind.h>
int
main ()
{

struct _Unwind_Exception exc;
struct _Unwind_Context *context;
_Unwind_GetCFA (context)
  ;
  return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
  (eval "$ac_link") 2>conftest.er1
  ac_status=$?
  grep -v '^ *+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
  (exit $ac_status); } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 $as_test_x conftest$ac_exeext
       }; then
  libc_cv_forced_unwind=yes
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	libc_cv_forced_unwind=no
fi

rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
      conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_forced_unwind" >&5
$as_echo "$libc_cv_forced_unwind" >&6; }
if test $libc_cv_forced_unwind = yes; then
  cat >>confdefs.h <<\_ACEOF
#define HAVE_FORCED_UNWIND 1
_ACEOF

  old_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -Werror -fexceptions"
  { $as_echo "$as_me:$LINENO: checking for C cleanup handling" >&5
$as_echo_n "checking for C cleanup handling... " >&6; }
if test "${libc_cv_c_cleanup+set}" = set; then
  $as_echo_n "(cached) " >&6
else
    cat >conftest.$ac_ext <<_ACEOF
/* confdefs.h.  */
_ACEOF
cat confdefs.h >>conftest.$ac_ext
cat >>conftest.$ac_ext <<_ACEOF
/* end confdefs.h.  */

#include <stdio.h>
void cl (void *a) { }
int
main ()
{

  int a __attribute__ ((cleanup (cl)));
  puts ("test")
  ;
  return 0;
}
_ACEOF
rm -f conftest.$ac_objext conftest$ac_exeext
if { (ac_try="$ac_link"
case "(($ac_try" in
  *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
  *) ac_try_echo=$ac_try;;
esac
eval ac_try_echo="\"\$as_me:$LINENO: $ac_try_echo\""
$as_echo "$ac_try_echo") >&5
  (eval "$ac_link") 2>conftest.er1
  ac_status=$?
  grep -v '^ *+' conftest.er1 >conftest.err
  rm -f conftest.er1
  cat conftest.err >&5
  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
  (exit $ac_status); } && {
	 test -z "$ac_c_werror_flag" ||
	 test ! -s conftest.err
       } && test -s conftest$ac_exeext && {
	 test "$cross_compiling" = yes ||
	 $as_test_x conftest$ac_exeext
       }; then
  libc_cv_c_cleanup=yes
else
  $as_echo "$as_me: failed program was:" >&5
sed 's/^/| /' conftest.$ac_ext >&5

	libc_cv_c_cleanup=no
fi

rm -rf conftest.dSYM
rm -f core conftest.err conftest.$ac_objext conftest_ipa8_conftest.oo \
      conftest$ac_exeext conftest.$ac_ext
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_c_cleanup" >&5
$as_echo "$libc_cv_c_cleanup" >&6; }
  CFLAGS="$old_CFLAGS"
  if test $libc_cv_c_cleanup = no; then
    { { $as_echo "$as_me:$LINENO: error: the compiler must support C cleanup handling" >&5
$as_echo "$as_me: error: the compiler must support C cleanup handling" >&2;}
   { (exit 1); exit 1; }; }
  fi
else
  { { $as_echo "$as_me:$LINENO: error: forced unwind support is required" >&5
$as_echo "$as_me: error: forced unwind support is required" >&2;}
   { (exit 1); exit 1; }; }
fi
