# This file is generated from configure.in by Autoconf.  DO NOT EDIT!
 # Local configure fragment for sysdeps/sparc/sparc32/elf.

if test "$usetls" != no; then
# Check for support of thread-local storage handling in assembler and linker.
{ $as_echo "$as_me:$LINENO: checking for sparc32 TLS support" >&5
$as_echo_n "checking for sparc32 TLS support... " >&6; }
if test "${libc_cv_sparc32_tls+set}" = set; then
  $as_echo_n "(cached) " >&6
else
  cat > conftest.s <<\EOF
	.section ".tdata", "awT", @progbits
	.globl foo
foo:	.word	1
	.section ".tbss", "awT", @nobits
	.globl bar
bar:	.skip	4
	.text
baz:	sethi	%tgd_hi22(foo), %l1
	add	%l1, %tgd_lo10(foo), %l1
	add	%l7, %l1, %o0, %tgd_add(foo)
	call	__tls_get_addr, %tgd_call(foo)
	sethi	%tldm_hi22(bar), %l1
	add	%l1, %tldm_lo10(bar), %l1
	add	%l7, %l1, %o0, %tldm_add(bar)
	call	__tls_get_addr, %tldm_call(bar)
	sethi	%tldo_hix22(bar), %l1
	xor	%l1, %tldo_lox10(bar), %l1
	add	%o0, %l1, %l1, %tldo_add(bar)
	sethi	%tie_hi22(foo), %l1
	add	%l1, %tie_lo10(foo), %l1
	ld	[%l7 + %l1], %l1, %tie_ld(foo)
	add	%g7, %l1, %l1, %tie_add(foo)
	sethi	%tle_hix22(foo), %l1
	xor	%l1, %tle_lox10(foo), %l1
EOF
if { ac_try='${CC-cc} -c $CFLAGS conftest.s 1>&5'
  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
  (exit $ac_status); }; }; then
  libc_cv_sparc32_tls=yes
else
  libc_cv_sparc32_tls=no
fi
rm -f conftest*
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_sparc32_tls" >&5
$as_echo "$libc_cv_sparc32_tls" >&6; }
if test $libc_cv_sparc32_tls = yes; then
  cat >>confdefs.h <<\_ACEOF
#define HAVE_TLS_SUPPORT 1
_ACEOF

fi
fi

# Check for broken WDISP22 in the linker.
{ $as_echo "$as_me:$LINENO: checking for sparc32 ld WDISP22 handling" >&5
$as_echo_n "checking for sparc32 ld WDISP22 handling... " >&6; }
if test "${libc_cv_sparc32_wdisp22+set}" = set; then
  $as_echo_n "(cached) " >&6
else
  echo 'bne foo; nop' > conftest1.s
echo '.globl foo; .hidden foo; foo: nop' > conftest2.s
libc_cv_sparc32_wdisp22=unknown
if { ac_try='${CC-cc} -nostdlib -shared $CFLAGS conftest1.s conftest2.s -o conftest.so 1>&5'
  { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
  (eval $ac_try) 2>&5
  ac_status=$?
  $as_echo "$as_me:$LINENO: \$? = $ac_status" >&5
  (exit $ac_status); }; }; then
  if readelf -r conftest.so | grep -q R_SPARC_WDISP22; then
    libc_cv_sparc32_wdisp22=broken
  else
    libc_cv_sparc32_wdisp22=ok
  fi
fi
rm -f conftest*
fi
{ $as_echo "$as_me:$LINENO: result: $libc_cv_sparc32_wdisp22" >&5
$as_echo "$libc_cv_sparc32_wdisp22" >&6; }
if test $libc_cv_sparc32_wdisp22 != ok; then
  cat >>confdefs.h <<\_ACEOF
#define BROKEN_SPARC_WDISP22 1
_ACEOF

fi
