This is the mail archive of the glibc-cvs@sourceware.org mailing list for the glibc project.


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

GNU C Library master sources branch rsa/2.17_backports_v3 updated. glibc-2.17-42-ga06663e


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "GNU C Library master sources".

The branch, rsa/2.17_backports_v3 has been updated
       via  a06663ebed17775761f501e5f0cdddff159959ac (commit)
       via  5c616c0a75792d2836412d6c4ed5c71e8e754992 (commit)
      from  3ca2c50727b3e3e22eb3606135a18c6212f516d2 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=a06663ebed17775761f501e5f0cdddff159959ac

commit a06663ebed17775761f501e5f0cdddff159959ac
Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
Date:   Tue Jul 23 07:39:57 2013 -0500

    PowerPC: use _dl_static_init to set GLRO(gl_pagesize)
    
    This patch fixes dlfcn/tststatic5 for PowerPC where pagesize
    variable was not properly initialized in certain cases. This patch
    is based on other architecture code.
    (cherry picked from commit 7b1f8b581f9387230788e4d8a67cdbcf464dac85)

diff --git a/ChangeLog b/ChangeLog
index bf91984..bfefdca 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2013-07-23  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+	* sysdeps/unix/sysv/linux/powerpc/dl-static.c: New file to support
+	variable page size.
+	* sysdeps/unix/sysv/linux/powerpc/ldsodefs.h: Likewise.
+	* sysdeps/unix/sysv/linux/powerpc/Makefile: Build dl-static in elf.
+	* sysdeps/unix/sysv/linux/powerpc/Versions: Add _dl_var_init.
+
 2013-06-20  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
 
 	* config.h.in (HAVE_CC_INHIBIT_LOOP_TO_LIBCALL): New define.
diff --git a/sysdeps/unix/sysv/linux/powerpc/Makefile b/sysdeps/unix/sysv/linux/powerpc/Makefile
index 4ff7e84..cf4de97 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Makefile
+++ b/sysdeps/unix/sysv/linux/powerpc/Makefile
@@ -15,6 +15,12 @@ endif
 
 ifeq ($(subdir),elf)
 sysdep_routines += dl-vdso
+ifeq ($(build-shared),yes)
+# This is needed for DSO loading from static binaries.
+sysdep-dl-routines += dl-static
+sysdep_routines += dl-static
+sysdep-rtld-routines += dl-static
+endif
 endif
 
 ifeq ($(subdir),misc)
diff --git a/sysdeps/unix/sysv/linux/powerpc/Versions b/sysdeps/unix/sysv/linux/powerpc/Versions
index 289c4fe..9b583fb 100644
--- a/sysdeps/unix/sysv/linux/powerpc/Versions
+++ b/sysdeps/unix/sysv/linux/powerpc/Versions
@@ -1,3 +1,9 @@
+ld {
+  GLIBC_PRIVATE {
+  # used for loading by static libraries
+    _dl_var_init;
+  }
+}
 libc {
   GLIBC_PRIVATE {
     __vdso_get_tbfreq;
diff --git a/sysdeps/unix/sysv/linux/powerpc/dl-static.c b/sysdeps/unix/sysv/linux/powerpc/dl-static.c
new file mode 100644
index 0000000..8289c61
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/dl-static.c
@@ -0,0 +1,84 @@
+/* Variable initialization.  PowerPC version.
+   Copyright (C) 2013 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.
+
+   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 <ldsodefs.h>
+
+#ifdef SHARED
+
+void
+_dl_var_init (void *array[])
+{
+  /* It has to match "variables" below. */
+  enum
+    {
+      DL_PAGESIZE = 0
+    };
+
+  GLRO(dl_pagesize) = *((size_t *) array[DL_PAGESIZE]);
+}
+
+#else
+
+static void *variables[] =
+{
+  &GLRO(dl_pagesize)
+};
+
+static void
+_dl_unprotect_relro (struct link_map *l)
+{
+  ElfW(Addr) start = ((l->l_addr + l->l_relro_addr)
+		      & ~(GLRO(dl_pagesize) - 1));
+  ElfW(Addr) end = ((l->l_addr + l->l_relro_addr + l->l_relro_size)
+		    & ~(GLRO(dl_pagesize) - 1));
+
+  if (start != end)
+    __mprotect ((void *) start, end - start, PROT_READ | PROT_WRITE);
+}
+
+void
+_dl_static_init (struct link_map *l)
+{
+  struct link_map *rtld_map = l;
+  struct r_scope_elem **scope;
+  const ElfW(Sym) *ref = NULL;
+  lookup_t loadbase;
+  void (*f) (void *[]);
+  size_t i;
+
+  loadbase = _dl_lookup_symbol_x ("_dl_var_init", l, &ref, l->l_local_scope,
+				  NULL, 0, 1, NULL);
+
+  for (scope = l->l_local_scope; *scope != NULL; scope++)
+    for (i = 0; i < (*scope)->r_nlist; i++)
+      if ((*scope)->r_list[i] == loadbase)
+	{
+	  rtld_map = (*scope)->r_list[i];
+	  break;
+	}
+
+  if (ref != NULL)
+    {
+      f = (void (*) (void *[])) DL_SYMBOL_ADDRESS (loadbase, ref);
+      _dl_unprotect_relro (rtld_map);
+      f (variables);
+      _dl_protect_relro (rtld_map);
+    }
+}
+
+#endif
diff --git a/sysdeps/unix/sysv/linux/powerpc/ldsodefs.h b/sysdeps/unix/sysv/linux/powerpc/ldsodefs.h
new file mode 100644
index 0000000..fcedf32
--- /dev/null
+++ b/sysdeps/unix/sysv/linux/powerpc/ldsodefs.h
@@ -0,0 +1,33 @@
+/* Run-time dynamic linker data structures for loaded ELF shared objects.
+   PowerPC version.
+   Copyright (C) 2013 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.
+
+   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/>.  */
+
+#ifndef _LDSODEFS_H
+
+/* Get the real definitions.  */
+#include_next <ldsodefs.h>
+
+/* Now define our stuff.  */
+
+/* We need special support to initialize DSO loaded for statically linked
+   binaries.  */
+extern void _dl_static_init (struct link_map *map);
+#undef DL_STATIC_INIT
+#define DL_STATIC_INIT(map) _dl_static_init (map)
+
+#endif /* ldsodefs.h */

http://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commitdiff;h=5c616c0a75792d2836412d6c4ed5c71e8e754992

commit 5c616c0a75792d2836412d6c4ed5c71e8e754992
Author: Adhemerval Zanella <azanella@linux.vnet.ibm.com>
Date:   Thu Jun 20 19:40:55 2013 -0500

    Fix loop construction to functions calls
    
    Check wheter the compiler has the option -fno-tree-loop-distribute-patterns
    to inhibit loop transformation to library calls and uses it on memset
    and memmove default implementation to avoid recursive calls.
    (backported from commit 85c2e6110c9a01ec817c30f1b7e20549d7229987)
    
    This backport excluded the benchmark tests from the original commit.

diff --git a/ChangeLog b/ChangeLog
index 685083b..bf91984 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2013-06-20  Adhemerval Zanella  <azanella@linux.vnet.ibm.com>
+
+	* config.h.in (HAVE_CC_INHIBIT_LOOP_TO_LIBCALL): New define.
+	* configure.in (libc_cv_cc_loop_to_function): Check if compiler
+	accepts -fno-tree-loop-distribute-patterns.
+	* include/libc-symbols.h (inhibit_loop_to_libcall): New macro.
+	* string/memmove.c (MEMMOVE): Disable loop transformation to avoid
+	recursive call.
+	* string/memset.c (memset): Likewise.
+	* string/test-memmove.c (simple_memmove): Disable loop transformation
+	to library calls.
+	* string/test-memset.c (simple_memset): Likewise.
+	* configure: Regenerated.
+
 2013-06-28  Ryan S. Arnold  <rsa@linux.vnet.ibm.com>
 
 	* sysdeps/powerpc/Makefile: Add comment about generating an offset to
diff --git a/config.h.in b/config.h.in
index f3fe6b8..b34aac2 100644
--- a/config.h.in
+++ b/config.h.in
@@ -69,6 +69,9 @@
 /* Define if the compiler supports __builtin_memset.  */
 #undef	HAVE_BUILTIN_MEMSET
 
+/* Define if compiler accepts -ftree-loop-distribute-patterns.  */
+#undef  HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
+
 /* Define if the regparm attribute shall be used for local functions
    (gcc on ix86 only).  */
 #undef	USE_REGPARMS
diff --git a/configure b/configure
index 8799b7d..99e85be 100755
--- a/configure
+++ b/configure
@@ -605,6 +605,7 @@ have_selinux
 have_libcap
 have_libaudit
 LIBGD
+libc_cv_cc_loop_to_function
 libc_cv_cc_submachine
 exceptions
 gnu89_inline
@@ -7164,6 +7165,38 @@ $as_echo "$libc_cv_cc_submachine" >&6; }
 fi
 
 
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking if $CC accepts -fno-tree-loop-distribute-patterns with \
+__attribute__ ((__optimize__))" >&5
+$as_echo_n "checking if $CC accepts -fno-tree-loop-distribute-patterns with \
+__attribute__ ((__optimize__))... " >&6; }
+if ${libc_cv_cc_loop_to_function+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat > conftest.c <<EOF
+void
+__attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
+foo (void) {}
+EOF
+libc_cv_cc_loop_to_function=no
+if { ac_try='${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c'
+  { { 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_loop_to_function=yes
+fi
+rm -f conftest*
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $libc_cv_cc_loop_to_function" >&5
+$as_echo "$libc_cv_cc_loop_to_function" >&6; }
+if test $libc_cv_cc_loop_to_function = yes; then
+  $as_echo "#define HAVE_CC_INHIBIT_LOOP_TO_LIBCALL 1" >>confdefs.h
+
+fi
+
+
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for libgd" >&5
 $as_echo_n "checking for libgd... " >&6; }
 if test "$with_gd" != "no"; then
diff --git a/configure.in b/configure.in
index d369382..379e77a 100644
--- a/configure.in
+++ b/configure.in
@@ -1928,6 +1928,24 @@ if test -n "$submachine"; then
 fi
 AC_SUBST(libc_cv_cc_submachine)
 
+AC_CACHE_CHECK(if $CC accepts -fno-tree-loop-distribute-patterns with \
+__attribute__ ((__optimize__)), libc_cv_cc_loop_to_function, [dnl
+cat > conftest.c <<EOF
+void
+__attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
+foo (void) {}
+EOF
+libc_cv_cc_loop_to_function=no
+if AC_TRY_COMMAND([${CC-cc} $CFLAGS $CPPFLAGS -c conftest.c])
+then
+  libc_cv_cc_loop_to_function=yes
+fi
+rm -f conftest*])
+if test $libc_cv_cc_loop_to_function = yes; then
+  AC_DEFINE(HAVE_CC_INHIBIT_LOOP_TO_LIBCALL)
+fi
+AC_SUBST(libc_cv_cc_loop_to_function)
+
 dnl Check whether we have the gd library available.
 AC_MSG_CHECKING(for libgd)
 if test "$with_gd" != "no"; then
diff --git a/include/libc-symbols.h b/include/libc-symbols.h
index a626d59..8f2c046 100644
--- a/include/libc-symbols.h
+++ b/include/libc-symbols.h
@@ -783,4 +783,14 @@ for linking")
 #define libc_ifunc_hidden_def(name) \
   libc_ifunc_hidden_def1 (__GI_##name, name)
 
+/* Add the compiler optimization to inhibit loop transformation to library
+   calls.  This is used to avoid recursive calls in memset and memmove
+   default implementations.  */
+#ifdef HAVE_CC_INHIBIT_LOOP_TO_LIBCALL
+# define inhibit_loop_to_libcall \
+    __attribute__ ((__optimize__ ("-fno-tree-loop-distribute-patterns")))
+#else
+# define inhibit_loop_to_libcall
+#endif
+
 #endif /* libc-symbols.h */
diff --git a/string/memmove.c b/string/memmove.c
index bf7dcc1..c59e7a9 100644
--- a/string/memmove.c
+++ b/string/memmove.c
@@ -41,6 +41,7 @@
 #endif
 
 rettype
+inhibit_loop_to_libcall
 MEMMOVE (a1, a2, len)
      a1const void *a1;
      a2const void *a2;
diff --git a/string/memset.c b/string/memset.c
index 036cb5f..eb83c1b 100644
--- a/string/memset.c
+++ b/string/memset.c
@@ -21,6 +21,7 @@
 #undef memset
 
 void *
+inhibit_loop_to_libcall
 memset (dstpp, c, len)
      void *dstpp;
      int c;
diff --git a/string/test-memmove.c b/string/test-memmove.c
index 13c5aff..0a969c3 100644
--- a/string/test-memmove.c
+++ b/string/test-memmove.c
@@ -47,6 +47,7 @@ IMPL (memmove, 1)
 #endif
 
 char *
+inhibit_loop_to_libcall
 simple_memmove (char *dst, const char *src, size_t n)
 {
   char *ret = dst;
diff --git a/string/test-memset.c b/string/test-memset.c
index af85a28..0432030 100644
--- a/string/test-memset.c
+++ b/string/test-memset.c
@@ -64,6 +64,7 @@ builtin_memset (char *s, int c, size_t n)
 #endif
 
 char *
+inhibit_loop_to_libcall
 simple_memset (char *s, int c, size_t n)
 {
   char *r = s, *end = s + n;

-----------------------------------------------------------------------

Summary of changes:
 ChangeLog                                          |   22 +++++++++++++
 config.h.in                                        |    3 ++
 configure                                          |   33 ++++++++++++++++++++
 configure.in                                       |   18 +++++++++++
 include/libc-symbols.h                             |   10 ++++++
 string/memmove.c                                   |    1 +
 string/memset.c                                    |    1 +
 string/test-memmove.c                              |    1 +
 string/test-memset.c                               |    1 +
 sysdeps/unix/sysv/linux/powerpc/Makefile           |    6 +++
 sysdeps/unix/sysv/linux/powerpc/Versions           |    6 +++
 .../unix/sysv/linux/powerpc}/dl-static.c           |   13 ++------
 .../unix/sysv/linux/powerpc}/ldsodefs.h            |    7 ++--
 13 files changed, 109 insertions(+), 13 deletions(-)
 copy {ports/sysdeps/unix/sysv/linux/mips => sysdeps/unix/sysv/linux/powerpc}/dl-static.c (86%)
 copy {ports/sysdeps/unix/sysv/linux/ia64 => sysdeps/unix/sysv/linux/powerpc}/ldsodefs.h (91%)


hooks/post-receive
-- 
GNU C Library master sources


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