This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] First part of glibc sparc64 fixes


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 at redhat dot 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' > $ at  dot new
+	mv -f $ at  dot 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' > $ at  dot new
+	| sed 's,\(/usr/lib\(\|64\)/\|^\|\([^/a-z]\)\)\(crt[in]\.o\),\3./\4,g' > $ at  dot new
 	mv -f $ at  dot 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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]