* [PATCH] First part of glibc sparc64 fixes
@ 2003-02-21 18:26 Jakub Jelinek
2003-02-21 19:22 ` Ulrich Drepper
0 siblings, 1 reply; 2+ messages in thread
From: Jakub Jelinek @ 2003-02-21 18:26 UTC (permalink / raw)
To: Ulrich Drepper, Roland McGrath, davem; +Cc: Glibc hackers
Hi!
sparc32 built --with-tls --without-__thread just fine, passed make check.
sparc64 is worse. The following patch contains some fixes, now I need to
build a fixed kernel to actually test the rest (kernel clobbers the thread
register on setjmp and getcontext).
2003-02-21 Jakub Jelinek <jakub@redhat.com>
* sysdeps/sparc/sparc64/elf/configure.in: New file.
* sysdeps/sparc/sparc64/elf/configure: New file.
* sysdeps/unix/sysv/linux/sparc/sparc64/Makefile (sysdep-CFLAGS):
Use -fcall-used-g6, not -fcall-used-g7.
linuxthreads/
* sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S (__vfork): Call
__fork instead of branching to it if BROKEN_SPARC_WDISP22.
* sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h (PSEUDO):
Fix typo.
* sysdeps/unix/sysv/linux/sparc/Makefile (specs): Add ./ prefix
to crti.o and crtn.o.
* sysdeps/unix/sysv/linux/x86_64/Makefile (specs): Likewise.
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S.jj Tue Feb 11 01:28:49 2003
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/vfork.S Fri Feb 21 08:39:01 2003
@@ -34,13 +34,16 @@ ENTRY(__vfork)
mov %o1, %o7
or %o2, %lo(__libc_pthread_functions), %o2
ldx [%o0 + %o2], %o2
- ldx [%o2], %o2
- cmp %o2, 0
- bne HIDDEN_JUMPTARGET(__fork)
+ ldx [%o2], %o0
#else
.weak pthread_create
sethi %hi(pthread_create), %o0
or %o0, %lo(pthread_create), %o0
+#endif
+#if defined SHARED && !defined BROKEN_SPARC_WDISP22
+ cmp %o0, 0
+ bne HIDDEN_JUMPTARGET(__fork)
+#else
brnz,pn %o0, 1f
#endif
mov __NR_vfork, %g1
@@ -50,7 +53,7 @@ ENTRY(__vfork)
sub %o1, 1, %o1
retl
and %o0, %o1, %o0
-#ifndef SHARED
+#if !defined SHARED || defined BROKEN_SPARC_WDISP22
1: mov %o7, %g1
call HIDDEN_JUMPTARGET(__fork)
mov %g1, %o7
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h.jj Mon Jan 27 15:48:41 2003
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/sparc64/sysdep-cancel.h Fri Feb 21 12:25:42 2003
@@ -30,7 +30,7 @@
.text; \
ENTRY(name) \
ld [%g7 + MULTIPLE_THREADS_OFFSET], %g1; \
- brz,pn %g1, 1f; \
+ brnz,pn %g1, 1f; \
mov SYS_ify(syscall_name), %g1; \
ta 0x6d; \
bcs,pn %xcc, __syscall_error_handler; \
--- libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/Makefile.jj Mon Sep 16 21:47:38 2002
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/sparc/Makefile Fri Feb 21 17:09:39 2003
@@ -6,5 +6,6 @@ before-compile += $(objpfx)specs
generated += specs
$(objpfx)specs:
$(CC) $(CFLAGS) $(CPPFLAGS) -dumpspecs \
- | sed 's,/usr/lib\(\|64\)/\(crt[in]\.o\),\2,g' > $@
+ | sed 's,\(/usr/lib\(\|64\)/\|^\|\([^/a-z]\)\)\(crt[in]\.o\),\3./\4,g' > $@.new
+ mv -f $@.new $@
endif
--- libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile.jj Sat Aug 31 01:31:17 2002
+++ libc/linuxthreads/sysdeps/unix/sysv/linux/x86_64/Makefile Fri Feb 21 17:11:35 2003
@@ -7,6 +7,6 @@ before-compile += $(objpfx)specs
generated += specs
$(objpfx)specs:
$(CC) $(CFLAGS) $(CPPFLAGS) -dumpspecs \
- | sed 's,/usr/lib64/\(crt[in]\.o\),\1,g' > $@.new
+ | sed 's,\(/usr/lib\(\|64\)/\|^\|\([^/a-z]\)\)\(crt[in]\.o\),\3./\4,g' > $@.new
mv -f $@.new $@
endif
--- libc/sysdeps/sparc/sparc64/elf/configure.in.jj Fri Feb 21 08:18:54 2003
+++ libc/sysdeps/sparc/sparc64/elf/configure.in Fri Feb 21 08:29:36 2003
@@ -0,0 +1,61 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/sparc/sparc64/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and linker.
+AC_CACHE_CHECK(for sparc64 TLS support, libc_cv_sparc64_tls, [dnl
+cat > conftest.s <<\EOF
+ .section ".tdata", "awT", @progbits
+ .globl foo
+foo: .word 1
+ .section ".tbss", "awT", @nobits
+ .globl bar
+bar: .skip 4
+ .text
+ .globl main
+main: 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
+ ldx [%l7 + %l1], %l1, %tie_ldx(foo)
+ add %g7, %l1, %l1, %tie_add(foo)
+ sethi %tle_hix22(foo), %l1
+ xor %l1, %tle_lox10(foo), %l1
+EOF
+dnl
+if AC_TRY_COMMAND(${CC-cc} -o conftest.bin $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
+ libc_cv_sparc64_tls=yes
+else
+ libc_cv_sparc64_tls=no
+fi
+rm -f conftest*])
+if test $libc_cv_sparc64_tls = yes; then
+ AC_DEFINE(HAVE_TLS_SUPPORT)
+fi
+fi
+
+# Check for broken WDISP22 in the linker.
+AC_CACHE_CHECK(for sparc64 ld WDISP22 handling, libc_cv_sparc64_wdisp22, [dnl
+echo 'bne foo; nop' > conftest1.s
+echo '.globl foo; .hidden foo; foo: nop' > conftest2.s
+libc_cv_sparc64_wdisp22=unknown
+if AC_TRY_COMMAND(${CC-cc} -nostdlib -shared $CFLAGS conftest1.s conftest2.s -o conftest.so 1>&AS_MESSAGE_LOG_FD); then
+ if readelf -r conftest.so | grep -q R_SPARC_WDISP22; then
+ libc_cv_sparc64_wdisp22=broken
+ else
+ libc_cv_sparc64_wdisp22=ok
+ fi
+fi
+rm -f conftest*])
+if test $libc_cv_sparc64_wdisp22 != ok; then
+ AC_DEFINE(BROKEN_SPARC_WDISP22)
+fi
--- libc/sysdeps/sparc/sparc64/elf/configure.jj Fri Feb 21 08:19:00 2003
+++ libc/sysdeps/sparc/sparc64/elf/configure Fri Feb 21 08:31:02 2003
@@ -0,0 +1,90 @@
+# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/sparc/sparc64/elf.
+
+if test "$usetls" != no; then
+# Check for support of thread-local storage handling in assembler and linker.
+echo "$as_me:$LINENO: checking for sparc64 TLS support" >&5
+echo $ECHO_N "checking for sparc64 TLS support... $ECHO_C" >&6
+if test "${libc_cv_sparc64_tls+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&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
+ .globl main
+main: 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
+ ldx [%l7 + %l1], %l1, %tie_ldx(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} -o conftest.bin $CFLAGS conftest.s 1>&5'
+ { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
+ (eval $ac_try) 2>&5
+ ac_status=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ libc_cv_sparc64_tls=yes
+else
+ libc_cv_sparc64_tls=no
+fi
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $libc_cv_sparc64_tls" >&5
+echo "${ECHO_T}$libc_cv_sparc64_tls" >&6
+if test $libc_cv_sparc64_tls = yes; then
+ cat >>confdefs.h <<\_ACEOF
+#define HAVE_TLS_SUPPORT 1
+_ACEOF
+
+fi
+fi
+
+# Check for broken WDISP22 in the linker.
+echo "$as_me:$LINENO: checking for sparc64 ld WDISP22 handling" >&5
+echo $ECHO_N "checking for sparc64 ld WDISP22 handling... $ECHO_C" >&6
+if test "${libc_cv_sparc64_wdisp22+set}" = set; then
+ echo $ECHO_N "(cached) $ECHO_C" >&6
+else
+ echo 'bne foo; nop' > conftest1.s
+echo '.globl foo; .hidden foo; foo: nop' > conftest2.s
+libc_cv_sparc64_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=$?
+ echo "$as_me:$LINENO: \$? = $ac_status" >&5
+ (exit $ac_status); }; }; then
+ if readelf -r conftest.so | grep -q R_SPARC_WDISP22; then
+ libc_cv_sparc64_wdisp22=broken
+ else
+ libc_cv_sparc64_wdisp22=ok
+ fi
+fi
+rm -f conftest*
+fi
+echo "$as_me:$LINENO: result: $libc_cv_sparc64_wdisp22" >&5
+echo "${ECHO_T}$libc_cv_sparc64_wdisp22" >&6
+if test $libc_cv_sparc64_wdisp22 != ok; then
+ cat >>confdefs.h <<\_ACEOF
+#define BROKEN_SPARC_WDISP22 1
+_ACEOF
+
+fi
--- libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile.jj Tue Apr 18 02:15:16 2000
+++ libc/sysdeps/unix/sysv/linux/sparc/sparc64/Makefile Fri Feb 21 08:48:10 2003
@@ -1,2 +1,2 @@
-sysdep-CFLAGS += -fcall-used-g7
+sysdep-CFLAGS += -fcall-used-g6
LD += -melf64_sparc
Jakub
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] First part of glibc sparc64 fixes
2003-02-21 18:26 [PATCH] First part of glibc sparc64 fixes Jakub Jelinek
@ 2003-02-21 19:22 ` Ulrich Drepper
0 siblings, 0 replies; 2+ messages in thread
From: Ulrich Drepper @ 2003-02-21 19:22 UTC (permalink / raw)
To: Jakub Jelinek; +Cc: Roland McGrath, davem, Glibc hackers
Jakub Jelinek wrote:
> sparc32 built --with-tls --without-__thread just fine, passed make check.
> sparc64 is worse. The following patch contains some fixes, now I need to
> build a fixed kernel to actually test the rest (kernel clobbers the thread
> register on setjmp and getcontext).
Thanks, I've applied the patch. There was a little bug in the
configure script which I corrected.
--
--------------. ,-. 444 Castro Street
Ulrich Drepper \ ,-----------------' \ Mountain View, CA 94041 USA
Red Hat `--' drepper at redhat.com `---------------------------
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2003-02-21 19:22 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-02-21 18:26 [PATCH] First part of glibc sparc64 fixes Jakub Jelinek
2003-02-21 19:22 ` Ulrich Drepper
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).