# This file is generated from configure.ac by Autoconf.  DO NOT EDIT!
 # Local configure fragment for sysdeps/unix/sysv/linux/powerpc/.

if test "$with_clang" = no; then

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC $CFLAGS -mlong-double-128 uses IBM extended format" >&5
$as_echo_n "checking whether $CC $CFLAGS -mlong-double-128 uses IBM extended format... " >&6; }
if ${libc_cv_mlong_double_128ibm+:} false; then :
  $as_echo_n "(cached) " >&6
else
  save_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS -mlong-double-128"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <float.h>
int
main ()
{

#if LDBL_MANT_DIG != 106
# error "compiler doesn't implement IBM extended format of long double"
#endif
long double foobar (long double x) { return x; }
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  libc_cv_mlong_double_128ibm=yes
else
  libc_cv_mlong_double_128ibm=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
CFLAGS="$save_CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mlong_double_128ibm" >&5
$as_echo "$libc_cv_mlong_double_128ibm" >&6; }

if test "$libc_cv_mlong_double_128ibm" = no; then
  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC $CFLAGS supports -mabi=ibmlongdouble" >&5
$as_echo_n "checking whether $CC $CFLAGS supports -mabi=ibmlongdouble... " >&6; }
if ${libc_cv_mabi_ibmlongdouble+:} false; then :
  $as_echo_n "(cached) " >&6
else
    save_CFLAGS="$CFLAGS"
  CFLAGS="$CFLAGS -mlong-double-128 -mabi=ibmlongdouble"
  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h.  */
#include <float.h>
int
main ()
{

#if LDBL_MANT_DIG != 106
# error "compiler doesn't implement IBM extended format of long double"
#endif
long double foobar (long double x) { return x; }
  ;
  return 0;
}
_ACEOF
if ac_fn_c_try_compile "$LINENO"; then :
  libc_cv_mabi_ibmlongdouble=yes
else
  libc_cv_mabi_ibmlongdouble=no
fi
rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
  CFLAGS="$save_CFLAGS"
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_mabi_ibmlongdouble" >&5
$as_echo "$libc_cv_mabi_ibmlongdouble" >&6; }

  if test "$libc_cv_mabi_ibmlongdouble" = yes; then
    CFLAGS="$CFLAGS -mabi=ibmlongdouble"
  else
    as_fn_error $? "this configuration requires -mlong-double-128 IBM extended format support" "$LINENO" 5
  fi
fi

fi # clang

{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for linker that supports --no-tls-get-addr-optimize" >&5
$as_echo_n "checking for linker that supports --no-tls-get-addr-optimize... " >&6; }
libc_linker_feature=no
if test x"$gnu_ld" = x"yes"; then
  cat > conftest.c <<EOF
int _start (void) { return 42; }
EOF
  if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS $LDFLAGS $no_ssp
		    -Wl,--no-tls-get-addr-optimize -nostdlib -nostartfiles
		    -fPIC -shared -o conftest.so conftest.c
		    1>&5'
  { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_try\""; } >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
  test $ac_status = 0; }; }
  then
    libc_linker_feature=yes
  fi
  rm -f conftest*
fi
if test $libc_linker_feature = yes; then
  libc_cv_tls_get_addr_optimize=yes
else
  libc_cv_tls_get_addr_optimize=no
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_linker_feature" >&5
$as_echo "$libc_linker_feature" >&6; }
config_vars="$config_vars
have-tls-get-addr-optimize = $libc_cv_tls_get_addr_optimize"

ldd_rewrite_script=sysdeps/unix/sysv/linux/powerpc/ldd-rewrite.sed
