[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Commits] r17786 - in /fsf/trunk/libc: ./ conform/ debug/ nptl/ sysdeps/generic/ sysdeps/generic/elf/ sysdeps/i386/ sysdeps/i386/elf/ ...
- To: commits@xxxxxxxxxx
- Subject: [Commits] r17786 - in /fsf/trunk/libc: ./ conform/ debug/ nptl/ sysdeps/generic/ sysdeps/generic/elf/ sysdeps/i386/ sysdeps/i386/elf/ ...
- From: eglibc@xxxxxxxxxx
- Date: Wed, 28 Mar 2012 00:02:45 -0000
Author: eglibc
Date: Wed Mar 28 00:02:43 2012
New Revision: 17786
Log:
Import glibc-mainline for 2012-03-28
Added:
fsf/trunk/libc/sysdeps/generic/ifunc-sel.h
fsf/trunk/libc/sysdeps/i386/start.S
fsf/trunk/libc/sysdeps/x86_64/configure.in
fsf/trunk/libc/sysdeps/x86_64/start.S
Removed:
fsf/trunk/libc/sysdeps/generic/elf/
fsf/trunk/libc/sysdeps/i386/elf/
fsf/trunk/libc/sysdeps/unix/i386/start.c
fsf/trunk/libc/sysdeps/unix/sparc/start.c
fsf/trunk/libc/sysdeps/unix/start.c
fsf/trunk/libc/sysdeps/x86_64/elf/
Modified:
fsf/trunk/libc/ChangeLog
fsf/trunk/libc/conform/Makefile
fsf/trunk/libc/debug/backtracesyms.c
fsf/trunk/libc/debug/backtracesymsfd.c
fsf/trunk/libc/nptl/ChangeLog
fsf/trunk/libc/nptl/tst-cond16.c
fsf/trunk/libc/nptl/tst-cond18.c
fsf/trunk/libc/sysdeps/i386/Versions
fsf/trunk/libc/sysdeps/i386/configure
fsf/trunk/libc/sysdeps/i386/configure.in
fsf/trunk/libc/sysdeps/x86_64/configure
Modified: fsf/trunk/libc/ChangeLog
==============================================================================
--- fsf/trunk/libc/ChangeLog (original)
+++ fsf/trunk/libc/ChangeLog Wed Mar 28 00:02:43 2012
@@ -1,3 +1,122 @@
+2012-03-27 David S. Miller <davem@xxxxxxxxxxxxx>
+
+ * conform/Makefile: Run run-conformtest.sh using $(BASH).
+
+ * sysdeps/sparc/sparc64/Makefile (ASFLAGS-.os): Move before
+ have-as-vis3 check.
+
+2012-03-27 Andreas Jaeger <aj@xxxxxxx>
+
+ * sysdeps/x86_64/elf/configure.in: Moved to ...
+ * sysdeps/x86_64/configure.in: ... here.
+ * sysdeps/x86_64/elf/start.S: Moved to ...
+ * sysdeps/x86_64/start.S: ... here.
+ * sysdeps/x86_64/elf/configure: Delete.
+
+ * sysdeps/x86_64/configure.in: Merge contents from
+ sysdeps/i386/configure.in (without i686 check).
+
+ * sysdeps/i386/elf/Versions: Merge into ...
+ * sysdeps/i386/Versions: ... this.
+ * sysdeps/i386/elf/Versions: Delete file.
+ * sysdeps/i386/elf/start.S: Moved to ...
+ * sysdeps/i386/start.S: ...here.
+ * sysdeps/i386/elf/configure.in: Merge into...
+ * sysdeps/i386/configure.in: ...here.
+ * sysdeps/i386/elf/configure.in: Delete file.
+ * sysdeps/i386/elf/configure: Delete file.
+
+ * sysdeps/generic/elf/backtracesyms.c: Moved to ...
+ * debug/backtracesyms.c: ... here.
+ * sysdeps/generic/elf/backtracesymsfd.c: Moved to ...
+ * debug/backtracesymsfd.c: ... here.
+ * sysdeps/generic/elf/ifunc-sel.h: Moved to ...
+ * sysdeps/generic/ifunc-sel.h: ... here.
+
+ * sysdeps/unix/i386/start.c: Delete file.
+ * sysdeps/unix/sparc/start.c: Delete file.
+ * sysdeps/unix/start.c: Delete file.
+
+ * sysdeps/sh/elf/configure.in: Moved to ...
+ * sysdeps/sh/configure.in: ... here.
+ * sysdeps/sh/elf/start.S: Moved to ...
+ * sysdeps/sh/start.S: ... here.
+ * sysdeps/sh/elf/configure: Delete file.
+
+ * sysdeps/powerpc/powerpc64/elf/bzero.S: Moved to ...
+ * sysdeps/powerpc/powerpc64/bzero.S: ... here.
+ * sysdeps/powerpc/powerpc64/elf/entry.h: Moved to ...
+ * sysdeps/powerpc/powerpc64/entry.h: ... here.
+ * sysdeps/powerpc/powerpc64/elf/start.S: Moved to ...
+ * sysdeps/powerpc/powerpc64/start.S: here.
+ * sysdeps/powerpc/powerpc64/elf/Makefile: Merge into ...
+ * sysdeps/powerpc/powerpc64/Makefile: ... this.
+ * sysdeps/powerpc/powerpc64/elf/configure.in: Merge into ...
+ * sysdeps/powerpc/powerpc64/configure.in: ... this.
+ * sysdeps/powerpc/powerpc64/elf/configure: Delete file.
+
+ * sysdeps/powerpc/powerpc32/elf/bzero.S: Moved to ...
+ * sysdeps/powerpc/powerpc32/bzero.S: ... here.
+ * sysdeps/powerpc/powerpc32/elf/start.S: Moved to ...
+ * sysdeps/powerpc/powerpc32/start.S: ... here.
+ * sysdeps/powerpc/powerpc32/elf/configure.in: Merge into ...
+ * sysdeps/powerpc/powerpc32/configure.in: ... this.
+ * sysdeps/powerpc/powerpc32/elf/configure: Delete file.
+
+ * sysdeps/powerpc/elf/ifunc-sel.h: Moved to ...
+ * sysdeps/powerpc/ifunc-sel.h: ... here.
+ * sysdeps/powerpc/elf/rtld-global-offsets.sym: Moved to ...
+ * sysdeps/powerpc/rtld-global-offsets.sym: ... here.
+
+ * sysdeps/sparc/elf/configure.in: Moved to ...
+ * sysdeps/sparc/configure.in: ... here.
+ * sysdeps/sparc/elf/configure: Delete file.
+ * sysdeps/sparc/sparc32/elf/start.S: Moved to ...
+ * sysdeps/sparc/sparc32/start.S: ... here.
+ * sysdeps/sparc/sparc64/elf/start.S: Moved to ...
+ * sysdeps/sparc/sparc64/start.S: ... here.
+ * sysdeps/sparc/sparc32/elf/Makefile: Merged into ...
+ * sysdeps/sparc/sparc32/Makefile: ... this.
+ * sysdeps/sparc/sparc64/elf/Makefile: Merged into ...
+ * sysdeps/sparc/sparc64/Makefile: ... this.
+
+ * sysdeps/s390/s390-32/elf/bsd-_setjmp.S: Moved to ...
+ * sysdeps/s390/s390-32/bsd-_setjmp.S: ... here.
+ * sysdeps/s390/s390-32/elf/bsd-setjmp.S: Moved to ...
+ * sysdeps/s390/s390-32/bsd-setjmp.S: ... here.
+ * sysdeps/s390/s390-32/elf/setjmp.S: Moved to ...
+ * sysdeps/s390/s390-32/setjmp.S: ... here.
+ * sysdeps/s390/s390-32/elf/configure.in: Moved to ...
+ * sysdeps/s390/s390-32/configure.in: ... here.
+ * sysdeps/s390/s390-32/elf/configure: Delete file.
+ * sysdeps/s390/s390-32/elf/start.S: Moved to ...
+ * sysdeps/s390/s390-32/start.S: ... here.
+
+ * sysdeps/s390/s390-64/elf/bsd-_setjmp.S: Moved to ...
+ * sysdeps/s390/s390-64/bsd-_setjmp.S: ... here.
+ * sysdeps/s390/s390-64/elf/bsd-setjmp.S: Moved to ...
+ * sysdeps/s390/s390-64/bsd-setjmp.S: ... here.
+ * sysdeps/s390/s390-64/elf/setjmp.S: Moved to ...
+ * sysdeps/s390/s390-64/setjmp.S: ... here.
+ * sysdeps/s390/s390-64/elf/configure.in: Moved to ...
+ * sysdeps/s390/s390-64/configure.in: ... here
+ * sysdeps/s390/s390-64/elf/configure: Delete file.
+ * sysdeps/s390/s390-64/elf/start.S: Moved to ...
+ * sysdeps/s390/s390-64/start.S: ... here.
+ * sysdeps/s390/s390-64/elf/configure: Delete.
+
+ * configure.in: Remove support for elf directories in sysdeps.
+
+ * configure: Regenerated.
+ * sysdeps/i386/configure: Regenerated.
+ * sysdeps/powerpc/powerpc32/configure: Regenerated.
+ * sysdeps/powerpc/powerpc64/configure: Regenerated.
+ * sysdeps/s390/s390-32/configure: Regenerated.
+ * sysdeps/s390/s390-64/configure: Regenerated.
+ * sysdeps/sh/configure: Regenerated.
+ * sysdeps/sparc/configure: Regenerated.
+ * sysdeps/x86_64/configure: Regenerated.
+
2012-03-26 Andreas Schwab <schwab@xxxxxxxxxxxxxx>
* sysdeps/powerpc/fpu/libm-test-ulps: Update.
Modified: fsf/trunk/libc/conform/Makefile
==============================================================================
--- fsf/trunk/libc/conform/Makefile (original)
+++ fsf/trunk/libc/conform/Makefile Wed Mar 28 00:02:43 2012
@@ -31,7 +31,7 @@
$(objpfx)run-conformtest.out: run-conformtest.sh conformtest.pl \
$(wildcard data/*.h-data) \
$(wildcard data/*/*.h-data)
- -$(SHELL) -e $< $(objpfx) $(PERL) '$(CC)' \
+ -$(BASH) -e $< $(objpfx) $(PERL) '$(CC)' \
'-I../include $(+sysdep-includes) $(sysincludes) -I..'
generated = $(wildcard $(objpfx)conform-*.out)
Modified: fsf/trunk/libc/debug/backtracesyms.c
==============================================================================
--- fsf/trunk/libc/debug/backtracesyms.c (original)
+++ fsf/trunk/libc/debug/backtracesyms.c Wed Mar 28 00:02:43 2012
@@ -1,5 +1,5 @@
/* Return list with names for address in backtrace.
- Copyright (C) 1998, 2000 Free Software Foundation, Inc.
+ Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1998.
@@ -17,13 +17,20 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
+#include <assert.h>
#include <execinfo.h>
+#include <stdio.h>
#include <stdlib.h>
#include <string.h>
+#include <ldsodefs.h>
-/* Assume the worst for the width of an address. */
-#define WORD_WIDTH 16
+#if __ELF_NATIVE_CLASS == 32
+# define WORD_WIDTH 8
+#else
+/* We assyme 64bits. */
+# define WORD_WIDTH 16
+#endif
char **
@@ -31,16 +38,37 @@
void *const *array;
int size;
{
+ Dl_info info[size];
+ int status[size];
int cnt;
size_t total = 0;
char **result;
- /* We can compute the text size needed for the symbols since we print
- them all as "[+0x<addr>]". */
- total = size * (WORD_WIDTH + 6);
+ /* Fill in the information we can get from `dladdr'. */
+ for (cnt = 0; cnt < size; ++cnt)
+ {
+ struct link_map *map;
+ status[cnt] = _dl_addr (array[cnt], &info[cnt], &map, NULL);
+ if (status[cnt] && info[cnt].dli_fname && info[cnt].dli_fname[0] != '\0')
+ {
+ /* We have some info, compute the length of the string which will be
+ "<file-name>(<sym-name>+offset) [address]. */
+ total += (strlen (info[cnt].dli_fname ?: "")
+ + strlen (info[cnt].dli_sname ?: "")
+ + 3 + WORD_WIDTH + 3 + WORD_WIDTH + 5);
+
+ /* The load bias is more useful to the user than the load
+ address. The use of these addresses is to calculate an
+ address in the ELF file, so its prelinked bias is not
+ something we want to subtract out. */
+ info[cnt].dli_fbase = (void *) map->l_addr;
+ }
+ else
+ total += 5 + WORD_WIDTH;
+ }
/* Allocate memory for the result. */
- result = malloc (size * sizeof (char *) + total);
+ result = (char **) malloc (size * sizeof (char *) + total);
if (result != NULL)
{
char *last = (char *) (result + size);
@@ -48,8 +76,45 @@
for (cnt = 0; cnt < size; ++cnt)
{
result[cnt] = last;
- last += 1 + sprintf (last, "[+%p]", array[cnt]);
+
+ if (status[cnt]
+ && info[cnt].dli_fname != NULL && info[cnt].dli_fname[0] != '\0')
+ {
+ if (info[cnt].dli_sname == NULL)
+ /* We found no symbol name to use, so describe it as
+ relative to the file. */
+ info[cnt].dli_saddr = info[cnt].dli_fbase;
+
+ if (info[cnt].dli_sname == NULL && info[cnt].dli_saddr == 0)
+ last += 1 + sprintf (last, "%s(%s) [%p]",
+ info[cnt].dli_fname ?: "",
+ info[cnt].dli_sname ?: "",
+ array[cnt]);
+ else
+ {
+ char sign;
+ ptrdiff_t offset;
+ if (array[cnt] >= (void *) info[cnt].dli_saddr)
+ {
+ sign = '+';
+ offset = array[cnt] - info[cnt].dli_saddr;
+ }
+ else
+ {
+ sign = '-';
+ offset = info[cnt].dli_saddr - array[cnt];
+ }
+
+ last += 1 + sprintf (last, "%s(%s%c%#tx) [%p]",
+ info[cnt].dli_fname ?: "",
+ info[cnt].dli_sname ?: "",
+ sign, offset, array[cnt]);
+ }
+ }
+ else
+ last += 1 + sprintf (last, "[%p]", array[cnt]);
}
+ assert (last <= (char *) result + size * sizeof (char *) + total);
}
return result;
Modified: fsf/trunk/libc/debug/backtracesymsfd.c
==============================================================================
--- fsf/trunk/libc/debug/backtracesymsfd.c (original)
+++ fsf/trunk/libc/debug/backtracesymsfd.c Wed Mar 28 00:02:43 2012
@@ -1,5 +1,5 @@
/* Write formatted list with names for addresses in backtrace to a file.
- Copyright (C) 1998, 2003, 2005 Free Software Foundation, Inc.
+ Copyright (C) 1998-2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@xxxxxxxxxx>, 1998.
@@ -22,7 +22,7 @@
#include <sys/uio.h>
#include <_itoa.h>
-#include <not-cancel.h>
+#include <ldsodefs.h>
#if __ELF_NATIVE_CLASS == 32
# define WORD_WIDTH 8
@@ -38,25 +38,87 @@
int size;
int fd;
{
- struct iovec iov[3];
+ struct iovec iov[9];
int cnt;
for (cnt = 0; cnt < size; ++cnt)
{
char buf[WORD_WIDTH];
+ char buf2[WORD_WIDTH];
+ Dl_info info;
+ struct link_map *map;
+ size_t last = 0;
- iov[0].iov_base = (void *) "[0x";
- iov[0].iov_len = 3;
+ if (_dl_addr (array[cnt], &info, &map, NULL)
+ && info.dli_fname != NULL && info.dli_fname[0] != '\0')
+ {
+ /* Name of the file. */
+ iov[0].iov_base = (void *) info.dli_fname;
+ iov[0].iov_len = strlen (info.dli_fname);
+ last = 1;
- iov[1].iov_base = _itoa_word ((unsigned long int) array[cnt],
- &buf[WORD_WIDTH], 16, 0);
- iov[1].iov_len = &buf[WORD_WIDTH] - (char *) iov[1].iov_base;
+ if (info.dli_sname != NULL || map->l_addr != 0)
+ {
+ size_t diff;
- iov[2].iov_base = (void *) "]\n";
- iov[2].iov_len = 2;
+ iov[last].iov_base = (void *) "(";
+ iov[last].iov_len = 1;
+ ++last;
- /* We prefer to use the non-cancelable interface if it is available. */
- writev_not_cancel_no_status (fd, iov, 3);
+ if (info.dli_sname != NULL)
+ {
+ /* We have a symbol name. */
+ iov[last].iov_base = (void *) info.dli_sname;
+ iov[last].iov_len = strlen (info.dli_sname);
+ ++last;
+ }
+ else
+ /* We have no symbol, so describe it as relative to the file.
+ The load bias is more useful to the user than the load
+ address. The use of these addresses is to calculate an
+ address in the ELF file, so its prelinked bias is not
+ something we want to subtract out. */
+ info.dli_saddr = (void *) map->l_addr;
+
+ if (array[cnt] >= (void *) info.dli_saddr)
+ {
+ iov[last].iov_base = (void *) "+0x";
+ diff = array[cnt] - info.dli_saddr;
+ }
+ else
+ {
+ iov[last].iov_base = (void *) "-0x";
+ diff = info.dli_saddr - array[cnt];
+ }
+ iov[last].iov_len = 3;
+ ++last;
+
+ iov[last].iov_base = _itoa_word ((unsigned long int) diff,
+ &buf2[WORD_WIDTH], 16, 0);
+ iov[last].iov_len = (&buf2[WORD_WIDTH]
+ - (char *) iov[last].iov_base);
+ ++last;
+
+ iov[last].iov_base = (void *) ")";
+ iov[last].iov_len = 1;
+ ++last;
+ }
+ }
+
+ iov[last].iov_base = (void *) "[0x";
+ iov[last].iov_len = 3;
+ ++last;
+
+ iov[last].iov_base = _itoa_word ((unsigned long int) array[cnt],
+ &buf[WORD_WIDTH], 16, 0);
+ iov[last].iov_len = &buf[WORD_WIDTH] - (char *) iov[last].iov_base;
+ ++last;
+
+ iov[last].iov_base = (void *) "]\n";
+ iov[last].iov_len = 2;
+ ++last;
+
+ __writev (fd, iov, last);
}
}
weak_alias (__backtrace_symbols_fd, backtrace_symbols_fd)
Modified: fsf/trunk/libc/nptl/ChangeLog
==============================================================================
--- fsf/trunk/libc/nptl/ChangeLog (original)
+++ fsf/trunk/libc/nptl/ChangeLog Wed Mar 28 00:02:43 2012
@@ -1,3 +1,9 @@
+2012-03-27 David S. Miller <davem@xxxxxxxxxxxxx>
+
+ * tst-cond16.c (do_test): Use a thread stack size which is either
+ PTHREAD_STACK_MIN or the page size, whichever is larger.
+ * tst-cond18.c (do_test): Likewise.
+
2012-03-19 H.J. Lu <hongjiu.lu@xxxxxxxxx>
* sysdeps/x86_64/pthreaddef.h (CURRENT_STACK_FRAME): Use
Modified: fsf/trunk/libc/nptl/tst-cond16.c
==============================================================================
--- fsf/trunk/libc/nptl/tst-cond16.c (original)
+++ fsf/trunk/libc/nptl/tst-cond16.c Wed Mar 28 00:02:43 2012
@@ -76,9 +76,15 @@
count *= 4;
pthread_t th[count];
- int i, ret;
+ pthread_attr_t attr;
+ int i, ret, sz;
+ pthread_attr_init (&attr);
+ sz = __getpagesize ();
+ if (sz < PTHREAD_STACK_MIN)
+ sz = PTHREAD_STACK_MIN;
+ pthread_attr_setstacksize (&attr, sz);
for (i = 0; i < count; ++i)
- if ((ret = pthread_create (&th[i], NULL, tf, NULL)) != 0)
+ if ((ret = pthread_create (&th[i], &attr, tf, NULL)) != 0)
{
errno = ret;
printf ("pthread_create %d failed: %m\n", i);
Modified: fsf/trunk/libc/nptl/tst-cond18.c
==============================================================================
--- fsf/trunk/libc/nptl/tst-cond18.c (original)
+++ fsf/trunk/libc/nptl/tst-cond18.c Wed Mar 28 00:02:43 2012
@@ -87,10 +87,16 @@
count *= 8;
pthread_t th[count + 1];
- int i, ret;
+ pthread_attr_t attr;
+ int i, ret, sz;
+ pthread_attr_init (&attr);
+ sz = __getpagesize ();
+ if (sz < PTHREAD_STACK_MIN)
+ sz = PTHREAD_STACK_MIN;
+ pthread_attr_setstacksize (&attr, sz);
for (i = 0; i <= count; ++i)
- if ((ret = pthread_create (&th[i], NULL, tf, (void *) (long) i)) != 0)
+ if ((ret = pthread_create (&th[i], &attr, tf, (void *) (long) i)) != 0)
{
errno = ret;
printf ("pthread_create %d failed: %m\n", i);
Added: fsf/trunk/libc/sysdeps/generic/ifunc-sel.h
==============================================================================
--- fsf/trunk/libc/sysdeps/generic/ifunc-sel.h (added)
+++ fsf/trunk/libc/sysdeps/generic/ifunc-sel.h Wed Mar 28 00:02:43 2012
@@ -1,0 +1,26 @@
+/* Used by the elf ifunc tests. */
+#ifndef ELF_IFUNC_SEL_H
+#define ELF_IFUNC_SEL_H 1
+
+extern int global;
+
+static inline void *
+ifunc_sel (int (*f1) (void), int (*f2) (void), int (*f3) (void))
+{
+ switch (global)
+ {
+ case 1:
+ return f1;
+ case -1:
+ return f2;
+ default:
+ return f3;
+ }
+}
+
+static inline void *
+ifunc_one (int (*f1) (void))
+{
+ return f1;
+}
+#endif
Modified: fsf/trunk/libc/sysdeps/i386/Versions
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/Versions (original)
+++ fsf/trunk/libc/sysdeps/i386/Versions Wed Mar 28 00:02:43 2012
@@ -1,3 +1,9 @@
+ld {
+ GLIBC_2.3 {
+ # The alternative i386 runtime interface to TLS.
+ ___tls_get_addr;
+ }
+}
libc {
GLIBC_2.0 {
# Functions from libgcc.
Modified: fsf/trunk/libc/sysdeps/i386/configure
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/configure (original)
+++ fsf/trunk/libc/sysdeps/i386/configure Wed Mar 28 00:02:43 2012
@@ -348,3 +348,46 @@
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_novzeroupper" >&5
$as_echo "$libc_cv_cc_novzeroupper" >&6; }
+
+# Check for support of thread-local storage handling in assembler and
+# linker.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for i386 TLS support" >&5
+$as_echo_n "checking for i386 TLS support... " >&6; }
+if ${libc_cv_386_tls+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.s <<\EOF
+ .section ".tdata", "awT", @progbits
+ .globl foo
+foo: .long 1
+ .section ".tbss", "awT", @nobits
+ .globl bar
+bar: .skip 4
+ .text
+baz: leal bar@TLSLDM(%ebx), %eax
+ leal bar@DTPOFF(%eax), %edx
+ subl foo@GOTTPOFF(%edx), %eax
+ subl $bar@TPOFF, %eax
+ movl foo@GOTNTPOFF(%edx), %ecx
+ movl %gs:(%ecx), %eax
+ movl %gs:bar@NTPOFF, %eax
+EOF
+if { ac_try='${CC-cc} -c $CFLAGS conftest.s 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_cv_386_tls=yes
+else
+ libc_cv_386_tls=no
+fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_386_tls" >&5
+$as_echo "$libc_cv_386_tls" >&6; }
+if test $libc_cv_386_tls = no; then
+ as_fn_error $? "the assembler must support TLS" "$LINENO" 5
+fi
+
+$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
Modified: fsf/trunk/libc/sysdeps/i386/configure.in
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/configure.in (original)
+++ fsf/trunk/libc/sysdeps/i386/configure.in Wed Mar 28 00:02:43 2012
@@ -85,3 +85,37 @@
[libc_cv_cc_novzeroupper=yes],
[libc_cv_cc_novzeroupper=no])
])
+
+# Check for support of thread-local storage handling in assembler and
+# linker.
+AC_CACHE_CHECK(for i386 TLS support, libc_cv_386_tls, [dnl
+cat > conftest.s <<\EOF
+ .section ".tdata", "awT", @progbits
+ .globl foo
+foo: .long 1
+ .section ".tbss", "awT", @nobits
+ .globl bar
+bar: .skip 4
+ .text
+baz: leal bar@TLSLDM(%ebx), %eax
+ leal bar@DTPOFF(%eax), %edx
+ subl foo@GOTTPOFF(%edx), %eax
+ subl $bar@TPOFF, %eax
+ movl foo@GOTNTPOFF(%edx), %ecx
+ movl %gs:(%ecx), %eax
+ movl %gs:bar@NTPOFF, %eax
+EOF
+dnl
+if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
+ libc_cv_386_tls=yes
+else
+ libc_cv_386_tls=no
+fi
+rm -f conftest*])
+if test $libc_cv_386_tls = no; then
+ AC_MSG_ERROR([the assembler must support TLS])
+fi
+
+dnl It is always possible to access static and hidden symbols in an
+dnl position independent way.
+AC_DEFINE(PI_STATIC_AND_HIDDEN)
Added: fsf/trunk/libc/sysdeps/i386/start.S
==============================================================================
--- fsf/trunk/libc/sysdeps/i386/start.S (added)
+++ fsf/trunk/libc/sysdeps/i386/start.S Wed Mar 28 00:02:43 2012
@@ -1,0 +1,141 @@
+/* Startup code compliant to the ELF i386 ABI.
+ Copyright (C) 1995-2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* This is the canonical entry point, usually the first thing in the text
+ segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry
+ point runs, most registers' values are unspecified, except for:
+
+ %edx Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ %esp The stack contains the arguments and environment:
+ 0(%esp) argc
+ 4(%esp) argv[0]
+ ...
+ (4*argc)(%esp) NULL
+ (4*(argc+1))(%esp) envp[0]
+ ...
+ NULL
+*/
+
+#include "bp-sym.h"
+
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ /* Clear the frame pointer. The ABI suggests this be done, to mark
+ the outermost frame obviously. */
+ xorl %ebp, %ebp
+
+ /* Extract the arguments as encoded on the stack and set up
+ the arguments for `main': argc, argv. envp will be determined
+ later in __libc_start_main. */
+ popl %esi /* Pop the argument count. */
+ movl %esp, %ecx /* argv starts just at the current stack top.*/
+
+ /* Before pushing the arguments align the stack to a 16-byte
+ (SSE needs 16-byte alignment) boundary to avoid penalties from
+ misaligned accesses. Thanks to Edward Seidl <seidl@xxxxxxxxx>
+ for pointing this out. */
+ andl $0xfffffff0, %esp
+ pushl %eax /* Push garbage because we allocate
+ 28 more bytes. */
+
+ /* Provide the highest stack address to the user code (for stacks
+ which grow downwards). */
+ pushl %esp
+
+ pushl %edx /* Push address of the shared library
+ termination function. */
+
+#ifdef SHARED
+ /* Load PIC register. */
+ call 1f
+ addl $_GLOBAL_OFFSET_TABLE_, %ebx
+
+ /* Push address of our own entry points to .fini and .init. */
+ leal __libc_csu_fini@GOTOFF(%ebx), %eax
+ pushl %eax
+ leal __libc_csu_init@GOTOFF(%ebx), %eax
+ pushl %eax
+
+ pushl %ecx /* Push second argument: argv. */
+ pushl %esi /* Push first argument: argc. */
+
+ pushl BP_SYM (main)@GOT(%ebx)
+
+ /* Call the user's main function, and exit with its value.
+ But let the libc call main. */
+ call BP_SYM (__libc_start_main)@PLT
+#else
+ /* Push address of our own entry points to .fini and .init. */
+ pushl $__libc_csu_fini
+ pushl $__libc_csu_init
+
+ pushl %ecx /* Push second argument: argv. */
+ pushl %esi /* Push first argument: argc. */
+
+ pushl $BP_SYM (main)
+
+ /* Call the user's main function, and exit with its value.
+ But let the libc call main. */
+ call BP_SYM (__libc_start_main)
+#endif
+
+ hlt /* Crash if somehow `exit' does return. */
+
+#ifdef SHARED
+1: movl (%esp), %ebx
+ ret
+#endif
+
+/* To fulfill the System V/i386 ABI we need this symbol. Yuck, it's so
+ meaningless since we don't support machines < 80386. */
+ .section .rodata
+ .globl _fp_hw
+_fp_hw: .long 3
+ .size _fp_hw, 4
+ .type _fp_hw,@object
+
+/* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start
Removed: fsf/trunk/libc/sysdeps/unix/i386/start.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/i386/start.c (original)
+++ fsf/trunk/libc/sysdeps/unix/i386/start.c (removed)
@@ -1,2 +1,0 @@
-#define DUMMIES dummy0
-#include <sysdeps/unix/start.c>
Removed: fsf/trunk/libc/sysdeps/unix/sparc/start.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/sparc/start.c (original)
+++ fsf/trunk/libc/sysdeps/unix/sparc/start.c (removed)
@@ -1,186 +1,0 @@
-/* Copyright (C) 1991-1997,2004,2012 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- In addition to the permissions in the GNU Lesser General Public
- License, the Free Software Foundation gives you unlimited
- permission to link the compiled version of this file with other
- programs, and to distribute those programs without any restriction
- coming from the use of this file. (The GNU Lesser General Public
- License restrictions do apply in other respects; for example, they
- cover modification of the file, and distribution when not linked
- into another program.)
-
- Note that people who make modified versions of this file are not
- obligated to grant this special exception for their modified
- versions; it is their choice whether to do so. The GNU Lesser
- General Public License gives permission to release a modified
- version without this exception; this exception also makes it
- possible to release a modified version which carries forward this
- exception.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-
-#ifndef NO_SHLIB
-#include <sys/exec.h>
-#include <sys/types.h>
-#include <sys/mman.h>
-#include <link.h>
-#include <syscall.h>
-#endif
-
-#if !defined (__GNUC__) || __GNUC__ < 2
- #error This file uses GNU C extensions; you must compile with GCC version 2.
-#endif
-
-/* The first piece of initialized data. */
-int __data_start = 0;
-weak_alias (__data_start, data_start)
-
-extern void __libc_init (int argc, char **argv, char **envp) __THROW;
-extern int main (int argc, char **argv, char **envp) __THROW;
-
-register long int sp asm("%sp"), fp asm("%fp");
-
-#ifndef NO_SHLIB
-static void init_shlib (void) __THROW;
-#endif
-
-#ifndef NO_EXPLICIT_START
-/* Declare _start with an explicit assembly symbol name of `start'
- (note no leading underscore). This is the name Sun's crt0.o uses,
- and programs are often linked with `ld -e start'. */
-void _start (void) asm ("start");
-#endif
-
-void
-_start (void)
-{
- /* It is important that these be declared `register'.
- Otherwise, when compiled without optimization, they are put on the
- stack, which loses completely after we zero the FP. */
- register int argc;
- register char **argv, **envp;
-
- /* Unwind the frame built when we entered the function. */
- asm("restore");
-
- /* And clear the frame pointer. */
- fp = 0;
-
- /* The argument info starts after one register
- window (64 bytes) past the SP. */
- argc = ((int *) sp)[16];
- argv = (char **) &((int *) sp)[17];
- envp = &argv[argc + 1];
- __environ = envp;
-
-#ifndef NO_SHLIB
- init_shlib ();
-#endif
-
- /* Allocate 24 bytes of stack space for the register save area. */
- sp -= 24;
- __libc_init (argc, argv, envp);
-
- exit (main (argc, argv, envp));
-}
-
-#ifndef NO_SHLIB
-
-/* System calls for use by the bootstrap routine.
- These are defined here since the usual calls may be dynamically linked. */
-
-int syscall (int sysno, ...) asm ("init_syscall");
-asm ("init_syscall:\n"
- " clr %g1\n"
- " ta 0\n"
- " bcc 1f\n"
- " sethi %hi(_errno), %g1\n"
- " st %o0, [%g1 + %lo(_errno)]\n"
- " sub %g0, 1, %o0\n"
- "1:retl\n"
- " nop");
-
-static void
-init_shlib ()
-{
- extern struct link_dynamic _DYNAMIC;
- int so, zf;
- caddr_t somap;
- caddr_t sodmap;
- caddr_t sobssmap;
- void (*ldstart) (int, int);
- struct exec soexec;
- struct
- {
- caddr_t crt_ba;
- int crt_dzfd;
- int crt_ldfd;
- struct link_dynamic *crt_dp;
- char **crt_ep;
- caddr_t crt_bp;
- } soarg;
-
- /* If not dynamically linked, do nothing. */
- if (&_DYNAMIC == 0)
- return;
-
- /* Map in the dynamic linker. */
- so = syscall (SYS_open, "/usr/lib/ld.so", O_RDONLY);
- if (syscall (SYS_read, so, &soexec, sizeof (soexec)) != sizeof (soexec)
- || soexec.a_magic != ZMAGIC)
- {
- static const char emsg[] = "crt0: no /usr/lib/ld.so\n";
-
- syscall (SYS_write, 2, emsg, sizeof (emsg) - 1);
- syscall (SYS_exit, 127);
- }
- somap = (caddr_t) syscall (SYS_mmap, 0,
- soexec.a_text + soexec.a_data + soexec.a_bss,
- PROT_READ | PROT_EXEC, _MAP_NEW | MAP_PRIVATE,
- so, 0);
- sodmap = (caddr_t) syscall (SYS_mmap, somap + soexec.a_text, soexec.a_data,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- _MAP_NEW | MAP_FIXED | MAP_PRIVATE,
- so, soexec.a_text);
- zf = syscall (SYS_open, "/dev/zero", O_RDONLY);
- if (soexec.a_bss != 0)
- sobssmap = (caddr_t) syscall (SYS_mmap,
- somap + soexec.a_text + soexec.a_data,
- soexec.a_bss,
- PROT_READ | PROT_WRITE | PROT_EXEC,
- _MAP_NEW | MAP_FIXED | MAP_PRIVATE,
- zf, 0);
-
- /* Call the entry point of the dynamic linker. */
- soarg.crt_ba = somap;
- soarg.crt_dzfd = zf;
- soarg.crt_ldfd = so;
- soarg.crt_dp = &_DYNAMIC;
- soarg.crt_ep = __environ;
- soarg.crt_bp = (caddr_t) &&retaddr;
-
- ldstart = (__typeof (ldstart)) (somap + soexec.a_entry);
- (*ldstart) (1, (char *) &soarg - (char *) sp);
-
- retaddr:
-}
-
-#endif
Removed: fsf/trunk/libc/sysdeps/unix/start.c
==============================================================================
--- fsf/trunk/libc/sysdeps/unix/start.c (original)
+++ fsf/trunk/libc/sysdeps/unix/start.c (removed)
@@ -1,95 +1,0 @@
-/* Copyright (C) 1991, 93, 1995-1998, 2000, 2012 Free Software Foundation, Inc.
- This file is part of the GNU C Library.
-
- The GNU C Library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Lesser General Public
- License as published by the Free Software Foundation; either
- version 2.1 of the License, or (at your option) any later version.
-
- In addition to the permissions in the GNU Lesser General Public
- License, the Free Software Foundation gives you unlimited
- permission to link the compiled version of this file with other
- programs, and to distribute those programs without any restriction
- coming from the use of this file. (The GNU Lesser General Public
- License restrictions do apply in other respects; for example, they
- cover modification of the file, and distribution when not linked
- into another program.)
-
- Note that people who make modified versions of this file are not
- obligated to grant this special exception for their modified
- versions; it is their choice whether to do so. The GNU Lesser
- General Public License gives permission to release a modified
- version without this exception; this exception also makes it
- possible to release a modified version which carries forward this
- exception.
-
- The GNU C Library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Lesser General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, see
- <http://www.gnu.org/licenses/>. */
-
-#include <errno.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <sysdep.h> /* In case it wants to define anything. */
-
-/* The first piece of initialized data. */
-int __data_start = 0;
-weak_alias (__data_start, data_start)
-
-#ifdef DUMMIES
-#define ARG_DUMMIES DUMMIES,
-#define DECL_DUMMIES int DUMMIES;
-#else
-#define ARG_DUMMIES
-#define DECL_DUMMIES
-#endif
-
-extern void __libc_init (int argc, char **argv, char **envp);
-extern int main (int argc, char **argv, char **envp);
-
-
-/* Not a prototype because it gets called strangely. */
-static void start1();
-
-#ifndef HAVE__start
-
-/* N.B.: It is important that this be the first function.
- This file is the first thing in the text section. */
-void
-_start ()
-{
- start1 ();
-}
-
-#endif
-
-/* ARGSUSED */
-static void
-start1 (ARG_DUMMIES argc, argp)
- DECL_DUMMIES
- int argc;
- char *argp;
-{
- char **argv = &argp;
-
- /* The environment starts just after ARGV. */
- __environ = &argv[argc + 1];
-
- /* If the first thing after ARGV is the arguments
- themselves, there is no environment. */
- if ((char *) __environ == *argv)
- /* The environment is empty. Make __environ
- point at ARGV[ARGC], which is NULL. */
- --__environ;
-
- /* Do C library initializations. */
- __libc_init (argc, argv, __environ);
-
- /* Call the user program. */
- exit (main (argc, argv, __environ));
-}
Modified: fsf/trunk/libc/sysdeps/x86_64/configure
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/configure (original)
+++ fsf/trunk/libc/sysdeps/x86_64/configure Wed Mar 28 00:02:43 2012
@@ -1,3 +1,366 @@
-# The i386 fragment also works for x86_64.
-
-. $srcdir/sysdeps/i386/configure
+
+# as_fn_set_status STATUS
+# -----------------------
+# Set $? to STATUS, without forking.
+as_fn_set_status ()
+{
+ return $1
+} # as_fn_set_status
+
+# as_fn_exit STATUS
+# -----------------
+# Exit the shell with STATUS, even in a "trap 0" or "set -e" context.
+as_fn_exit ()
+{
+ set +e
+ as_fn_set_status $1
+ exit $1
+} # as_fn_exit
+if expr a : '\(a\)' >/dev/null 2>&1 &&
+ test "X`expr 00001 : '.*\(...\)'`" = X001; then
+ as_expr=expr
+else
+ as_expr=false
+fi
+
+if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then
+ as_basename=basename
+else
+ as_basename=false
+fi
+
+as_me=`$as_basename -- "$0" ||
+$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \
+ X"$0" : 'X\(//\)$' \| \
+ X"$0" : 'X\(/\)' \| . 2>/dev/null ||
+$as_echo X/"$0" |
+ sed '/^.*\/\([^/][^/]*\)\/*$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\/\)$/{
+ s//\1/
+ q
+ }
+ /^X\/\(\/\).*/{
+ s//\1/
+ q
+ }
+ s/.*/./; q'`
+
+
+ as_lineno_1=$LINENO as_lineno_1a=$LINENO
+ as_lineno_2=$LINENO as_lineno_2a=$LINENO
+ eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" &&
+ test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || {
+ # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-)
+ sed -n '
+ p
+ /[$]LINENO/=
+ ' <$as_myself |
+ sed '
+ s/[$]LINENO.*/&-/
+ t lineno
+ b
+ :lineno
+ N
+ :loop
+ s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/
+ t loop
+ s/-\n.*//
+ ' >$as_me.lineno &&
+ chmod +x "$as_me.lineno" ||
+ { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; }
+
+ # Don't try to exec as it changes $[0], causing all sort of problems
+ # (the dirname of $[0] is not the place where we might find the
+ # original and so on. Autoconf is especially sensitive to this).
+ . "./$as_me.lineno"
+ # Exit status is that of the last command.
+ exit
+}
+
+
+# ac_fn_c_try_compile LINENO
+# --------------------------
+# Try to compile conftest.$ac_ext, and return whether this succeeded.
+ac_fn_c_try_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ rm -f conftest.$ac_objext
+ if { { ac_try="$ac_compile"
+case "(($ac_try" in
+ *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;;
+ *) ac_try_echo=$ac_try;;
+esac
+eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\""
+$as_echo "$ac_try_echo"; } >&5
+ (eval "$ac_compile") 2>conftest.err
+ ac_status=$?
+ if test -s conftest.err; then
+ grep -v '^ *+' conftest.err >conftest.er1
+ cat conftest.er1 >&5
+ mv -f conftest.er1 conftest.err
+ fi
+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+ test $ac_status = 0; } && {
+ test -z "$ac_c_werror_flag" ||
+ test ! -s conftest.err
+ } && test -s conftest.$ac_objext; then :
+ ac_retval=0
+else
+ $as_echo "$as_me: failed program was:" >&5
+sed 's/^/| /' conftest.$ac_ext >&5
+
+ ac_retval=1
+fi
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+ as_fn_set_status $ac_retval
+
+} # ac_fn_c_try_compile
+
+# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES
+# -------------------------------------------------------
+# Tests whether HEADER exists and can be compiled using the include files in
+# INCLUDES, setting the cache variable VAR accordingly.
+ac_fn_c_check_header_compile ()
+{
+ as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5
+$as_echo_n "checking for $2... " >&6; }
+if eval \${$3+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h. */
+$4
+#include <$2>
+_ACEOF
+if ac_fn_c_try_compile "$LINENO"; then :
+ eval "$3=yes"
+else
+ eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+ eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_c_check_header_compile
+# This file is generated from configure.in by Autoconf. DO NOT EDIT!
+ # Local configure fragment for sysdeps/x86_64.
+
+
+ac_fn_c_check_header_compile "$LINENO" "cpuid.h" "ac_cv_header_cpuid_h" "/* No default includes. */
+"
+if test "x$ac_cv_header_cpuid_h" = xyes; then :
+
+else
+ as_fn_error $? "gcc must provide the <cpuid.h> header" "$LINENO" 5
+fi
+
+
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if -g produces usable source locations for assembler-with-cpp" >&5
+$as_echo_n "checking if -g produces usable source locations for assembler-with-cpp... " >&6; }
+if ${libc_cv_cpp_asm_debuginfo+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.S <<EOF
+#include "confdefs.h"
+
+/* comment on
+ two lines */
+ ${libc_cv_dot_text}
+ ${libc_cv_asm_global_directive} foo
+foo:
+ /* Unfortunately this test only works for a real instruction,
+ not for any of the machine-independent pseudo-ops.
+ So we just have to assume everybody has a "nop". */
+ nop
+ /* comment */
+ nop
+ /* comment */
+ nop
+EOF
+if { ac_try='${CC-cc} $CPPFLAGS $ASFLAGS -g -c conftest.S 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; }; } && {
+ ac_pattern='conftest\.S'
+ { ac_try='readelf --debug-dump=line conftest.o |
+ grep $ac_pattern 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_cv_cpp_asm_debuginfo=yes
+else
+ libc_cv_cpp_asm_debuginfo=no
+fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cpp_asm_debuginfo" >&5
+$as_echo "$libc_cv_cpp_asm_debuginfo" >&6; }
+if test $libc_cv_cpp_asm_debuginfo = yes; then
+ $as_echo "#define HAVE_CPP_ASM_DEBUGINFO 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for SSE4 support" >&5
+$as_echo_n "checking for SSE4 support... " >&6; }
+if ${libc_cv_cc_sse4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if { ac_try='${CC-cc} -msse4 -xc /dev/null -S -o /dev/null'
+ { { 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_cv_cc_sse4=yes
+else
+ libc_cv_cc_sse4=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_sse4" >&5
+$as_echo "$libc_cv_cc_sse4" >&6; }
+if test $libc_cv_cc_sse4 = yes; then
+ $as_echo "#define HAVE_SSE4_SUPPORT 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX support" >&5
+$as_echo_n "checking for AVX support... " >&6; }
+if ${libc_cv_cc_avx+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if { ac_try='${CC-cc} -mavx -xc /dev/null -S -o /dev/null'
+ { { 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_cv_cc_avx=yes
+else
+ libc_cv_cc_avx=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_avx" >&5
+$as_echo "$libc_cv_cc_avx" >&6; }
+if test $libc_cv_cc_avx = yes; then
+ $as_echo "#define HAVE_AVX_SUPPORT 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for AVX encoding of SSE instructions" >&5
+$as_echo_n "checking for AVX encoding of SSE instructions... " >&6; }
+if ${libc_cv_cc_sse2avx+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if { ac_try='${CC-cc} -msse2avx -xc /dev/null -S -o /dev/null'
+ { { 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_cv_cc_sse2avx=yes
+else
+ libc_cv_cc_sse2avx=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_sse2avx" >&5
+$as_echo "$libc_cv_cc_sse2avx" >&6; }
+if test $libc_cv_cc_sse2avx = yes; then
+ $as_echo "#define HAVE_SSE2AVX_SUPPORT 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for FMA4 support" >&5
+$as_echo_n "checking for FMA4 support... " >&6; }
+if ${libc_cv_cc_fma4+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if { ac_try='${CC-cc} -mfma4 -xc /dev/null -S -o /dev/null'
+ { { 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_cv_cc_fma4=yes
+else
+ libc_cv_cc_fma4=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_fma4" >&5
+$as_echo "$libc_cv_cc_fma4" >&6; }
+if test $libc_cv_cc_fma4 = yes; then
+ $as_echo "#define HAVE_FMA4_SUPPORT 1" >>confdefs.h
+
+fi
+
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for -mno-vzeroupper support" >&5
+$as_echo_n "checking for -mno-vzeroupper support... " >&6; }
+if ${libc_cv_cc_novzeroupper+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ if { ac_try='${CC-cc} -mno-vzeroupper -xc /dev/null -S -o /dev/null'
+ { { 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_cv_cc_novzeroupper=yes
+else
+ libc_cv_cc_novzeroupper=no
+fi
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_novzeroupper" >&5
+$as_echo "$libc_cv_cc_novzeroupper" >&6; }
+
+# Check for support of thread-local storage handling in assembler and linker.
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for x86-64 TLS support" >&5
+$as_echo_n "checking for x86-64 TLS support... " >&6; }
+if ${libc_cv_x86_64_tls+:} false; then :
+ $as_echo_n "(cached) " >&6
+else
+ cat > conftest.s <<\EOF
+ .section ".tdata", "awT", @progbits
+ .globl foo
+foo: .quad 1
+ .section ".tbss", "awT", @nobits
+ .globl bar
+bar: .skip 8
+ .text
+baz: leaq bar@TLSLD(%rip), %rdi
+ leaq bar@DTPOFF(%rax), %rcx
+ addq foo@GOTTPOFF(%rip), %rax
+ movq $bar@TPOFF, %rdx
+EOF
+if { ac_try='${CC-cc} -c $CFLAGS conftest.s 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_cv_x86_64_tls=yes
+else
+ libc_cv_x86_64_tls=no
+fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_x86_64_tls" >&5
+$as_echo "$libc_cv_x86_64_tls" >&6; }
+if test $libc_cv_x86_64_tls = no; then
+ as_fn_error $? "the assembler must support TLS" "$LINENO" 5
+fi
+
+$as_echo "#define PI_STATIC_AND_HIDDEN 1" >>confdefs.h
+
+# work around problem with autoconf and empty lines at the end of files
Added: fsf/trunk/libc/sysdeps/x86_64/configure.in
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/configure.in (added)
+++ fsf/trunk/libc/sysdeps/x86_64/configure.in Wed Mar 28 00:02:43 2012
@@ -1,0 +1,122 @@
+GLIBC_PROVIDES dnl See aclocal.m4 in the top level source directory.
+# Local configure fragment for sysdeps/x86_64.
+
+AC_CHECK_HEADER([cpuid.h], ,
+ [AC_MSG_ERROR([gcc must provide the <cpuid.h> header])],
+ [/* No default includes. */])
+
+AC_CACHE_CHECK(if -g produces usable source locations for assembler-with-cpp,
+ libc_cv_cpp_asm_debuginfo, [dnl
+cat > conftest.S <<EOF
+#include "confdefs.h"
+
+/* comment on
+ two lines */
+ ${libc_cv_dot_text}
+ ${libc_cv_asm_global_directive} foo
+foo:
+ /* Unfortunately this test only works for a real instruction,
+ not for any of the machine-independent pseudo-ops.
+ So we just have to assume everybody has a "nop". */
+ nop
+ /* comment */
+ nop
+ /* comment */
+ nop
+EOF
+if AC_TRY_COMMAND([${CC-cc} $CPPFLAGS $ASFLAGS -g -c conftest.S 1>&AS_MESSAGE_LOG_FD]) && {
+ ac_pattern='conftest\.S'
+ AC_TRY_COMMAND([readelf --debug-dump=line conftest.o |
+ grep $ac_pattern 1>&AS_MESSAGE_LOG_FD])
+ }; then
+ libc_cv_cpp_asm_debuginfo=yes
+else
+ libc_cv_cpp_asm_debuginfo=no
+fi
+rm -f conftest*])AC_SUBST(libc_cv_cpp_asm_debuginfo)
+if test $libc_cv_cpp_asm_debuginfo = yes; then
+ AC_DEFINE(HAVE_CPP_ASM_DEBUGINFO)
+fi
+
+dnl Check if -msse4 works.
+AC_CACHE_CHECK(for SSE4 support, libc_cv_cc_sse4, [dnl
+if AC_TRY_COMMAND([${CC-cc} -msse4 -xc /dev/null -S -o /dev/null]); then
+ libc_cv_cc_sse4=yes
+else
+ libc_cv_cc_sse4=no
+fi])
+if test $libc_cv_cc_sse4 = yes; then
+ AC_DEFINE(HAVE_SSE4_SUPPORT)
+fi
+
+dnl Check if -mavx works.
+AC_CACHE_CHECK(for AVX support, libc_cv_cc_avx, [dnl
+if AC_TRY_COMMAND([${CC-cc} -mavx -xc /dev/null -S -o /dev/null]); then
+ libc_cv_cc_avx=yes
+else
+ libc_cv_cc_avx=no
+fi])
+if test $libc_cv_cc_avx = yes; then
+ AC_DEFINE(HAVE_AVX_SUPPORT)
+fi
+
+dnl Check if -msse2avx works.
+AC_CACHE_CHECK(for AVX encoding of SSE instructions, libc_cv_cc_sse2avx, [dnl
+if AC_TRY_COMMAND([${CC-cc} -msse2avx -xc /dev/null -S -o /dev/null]); then
+ libc_cv_cc_sse2avx=yes
+else
+ libc_cv_cc_sse2avx=no
+fi])
+if test $libc_cv_cc_sse2avx = yes; then
+ AC_DEFINE(HAVE_SSE2AVX_SUPPORT)
+fi
+
+dnl Check if -mfma4 works.
+AC_CACHE_CHECK(for FMA4 support, libc_cv_cc_fma4, [dnl
+if AC_TRY_COMMAND([${CC-cc} -mfma4 -xc /dev/null -S -o /dev/null]); then
+ libc_cv_cc_fma4=yes
+else
+ libc_cv_cc_fma4=no
+fi])
+if test $libc_cv_cc_fma4 = yes; then
+ AC_DEFINE(HAVE_FMA4_SUPPORT)
+fi
+
+dnl Check if -mno-vzeroupper works.
+AC_CACHE_CHECK(for -mno-vzeroupper support, libc_cv_cc_novzeroupper, [dnl
+if AC_TRY_COMMAND([${CC-cc} -mno-vzeroupper -xc /dev/null -S -o /dev/null]); then
+ libc_cv_cc_novzeroupper=yes
+else
+ libc_cv_cc_novzeroupper=no
+fi])
+
+# Check for support of thread-local storage handling in assembler and linker.
+AC_CACHE_CHECK(for x86-64 TLS support, libc_cv_x86_64_tls, [dnl
+cat > conftest.s <<\EOF
+ .section ".tdata", "awT", @progbits
+ .globl foo
+foo: .quad 1
+ .section ".tbss", "awT", @nobits
+ .globl bar
+bar: .skip 8
+ .text
+baz: leaq bar@TLSLD(%rip), %rdi
+ leaq bar@DTPOFF(%rax), %rcx
+ addq foo@GOTTPOFF(%rip), %rax
+ movq $bar@TPOFF, %rdx
+EOF
+dnl
+if AC_TRY_COMMAND(${CC-cc} -c $CFLAGS conftest.s 1>&AS_MESSAGE_LOG_FD); then
+ libc_cv_x86_64_tls=yes
+else
+ libc_cv_x86_64_tls=no
+fi
+rm -f conftest*])
+if test $libc_cv_x86_64_tls = no; then
+ AC_MSG_ERROR([the assembler must support TLS])
+fi
+
+dnl It is always possible to access static and hidden symbols in an
+dnl position independent way.
+AC_DEFINE(PI_STATIC_AND_HIDDEN)
+# work around problem with autoconf and empty lines at the end of files
Added: fsf/trunk/libc/sysdeps/x86_64/start.S
==============================================================================
--- fsf/trunk/libc/sysdeps/x86_64/start.S (added)
+++ fsf/trunk/libc/sysdeps/x86_64/start.S Wed Mar 28 00:02:43 2012
@@ -1,0 +1,128 @@
+/* Startup code compliant to the ELF x86-64 ABI.
+ Copyright (C) 2001-2012 Free Software Foundation, Inc.
+ This file is part of the GNU C Library.
+ Contributed by Andreas Jaeger <aj@xxxxxxx>, 2001.
+
+ The GNU C Library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ In addition to the permissions in the GNU Lesser General Public
+ License, the Free Software Foundation gives you unlimited
+ permission to link the compiled version of this file with other
+ programs, and to distribute those programs without any restriction
+ coming from the use of this file. (The GNU Lesser General Public
+ License restrictions do apply in other respects; for example, they
+ cover modification of the file, and distribution when not linked
+ into another program.)
+
+ Note that people who make modified versions of this file are not
+ obligated to grant this special exception for their modified
+ versions; it is their choice whether to do so. The GNU Lesser
+ General Public License gives permission to release a modified
+ version without this exception; this exception also makes it
+ possible to release a modified version which carries forward this
+ exception.
+
+ The GNU C Library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+/* This is the canonical entry point, usually the first thing in the text
+ segment. The SVR4/i386 ABI (pages 3-31, 3-32) says that when the entry
+ point runs, most registers' values are unspecified, except for:
+
+ %rdx Contains a function pointer to be registered with `atexit'.
+ This is how the dynamic linker arranges to have DT_FINI
+ functions called for shared libraries that have been loaded
+ before this code runs.
+
+ %rsp The stack contains the arguments and environment:
+ 0(%rsp) argc
+ 8(%rsp) argv[0]
+ ...
+ (8*argc)(%rsp) NULL
+ (8*(argc+1))(%rsp) envp[0]
+ ...
+ NULL
+*/
+
+#include <sysdep.h>
+#include "bp-sym.h"
+
+ .text
+ .globl _start
+ .type _start,@function
+_start:
+ cfi_startproc
+ /* Clearing frame pointer is insufficient, use CFI. */
+ cfi_undefined (rip)
+ /* Clear the frame pointer. The ABI suggests this be done, to mark
+ the outermost frame obviously. */
+ xorl %ebp, %ebp
+
+ /* Extract the arguments as encoded on the stack and set up
+ the arguments for __libc_start_main (int (*main) (int, char **, char **),
+ int argc, char *argv,
+ void (*init) (void), void (*fini) (void),
+ void (*rtld_fini) (void), void *stack_end).
+ The arguments are passed via registers and on the stack:
+ main: %rdi
+ argc: %rsi
+ argv: %rdx
+ init: %rcx
+ fini: %r8
+ rtld_fini: %r9
+ stack_end: stack. */
+
+ movq %rdx, %r9 /* Address of the shared library termination
+ function. */
+ popq %rsi /* Pop the argument count. */
+ movq %rsp, %rdx /* argv starts just at the current stack top. */
+ /* Align the stack to a 16 byte boundary to follow the ABI. */
+ andq $~15, %rsp
+
+ pushq %rax /* Push garbage because we push 8 more bytes. */
+
+ /* Provide the highest stack address to the user code (for stacks
+ which grow downwards). */
+ pushq %rsp
+
+#ifdef SHARED
+ /* Pass address of our own entry points to .fini and .init. */
+ movq __libc_csu_fini@GOTPCREL(%rip), %r8
+ movq __libc_csu_init@GOTPCREL(%rip), %rcx
+
+ movq BP_SYM (main)@GOTPCREL(%rip), %rdi
+
+ /* Call the user's main function, and exit with its value.
+ But let the libc call main. */
+ call BP_SYM (__libc_start_main)@PLT
+#else
+ /* Pass address of our own entry points to .fini and .init. */
+ movq $__libc_csu_fini, %r8
+ movq $__libc_csu_init, %rcx
+
+ movq $BP_SYM (main), %rdi
+
+ /* Call the user's main function, and exit with its value.
+ But let the libc call main. */
+ call BP_SYM (__libc_start_main)
+#endif
+
+ hlt /* Crash if somehow `exit' does return. */
+ cfi_endproc
+
+/* Define a symbol for the first piece of initialized data. */
+ .data
+ .globl __data_start
+__data_start:
+ .long 0
+ .weak data_start
+ data_start = __data_start
_______________________________________________
Commits mailing list
Commits@xxxxxxxxxx
http://eglibc.org/cgi-bin/mailman/listinfo/commits