diff --git a/glibc-no-leaf-attribute.patch b/glibc-no-leaf-attribute.patch new file mode 100644 index 0000000..1cac26e --- /dev/null +++ b/glibc-no-leaf-attribute.patch @@ -0,0 +1,49 @@ +From 7327af4c323f6d4f500bf4aaa66a9cac6236772f Mon Sep 17 00:00:00 2001 +From: Jim Meyering +Date: Wed, 26 Oct 2011 20:08:52 +0200 +Subject: [PATCH] Revert "Use leaf function attribute in __THROW" + +This reverts commit aa78043a4aafe5db1a1a76d544a833b63b4c5f5c +and the related 49a43d80ec5c97cf6136b1ee2687414773b2d5aa. +This fixes http://bugzilla.redhat.com/747377 +--- + misc/sys/cdefs.h | 15 +++------------ + 2 files changed, 3 insertions(+), 14 deletions(-) + +diff --git a/misc/sys/cdefs.h b/misc/sys/cdefs.h +index 72073e8..165a94a 100644 +--- a/misc/sys/cdefs.h ++++ b/misc/sys/cdefs.h +@@ -38,27 +38,18 @@ + + #ifdef __GNUC__ + +-/* All functions, except those with callbacks, are leaf functions. */ +-# if __GNUC_PREREQ (4, 6) && !defined _LIBC +-# define __LEAF , __leaf__ +-# define __LEAF_ATTR __attribute__ ((__leaf__)) +-# else +-# define __LEAF +-# define __LEAF_ATTR +-# endif +- + /* GCC can always grok prototypes. For C++ programs we add throw() + to help it optimize the function calls. But this works only with + gcc 2.8.x and egcs. For gcc 3.2 and up we even mark C functions + as non-throwing using a function attribute since programs can use + the -fexceptions options for C code as well. */ + # if !defined __cplusplus && __GNUC_PREREQ (3, 3) +-# define __THROW __attribute__ ((__nothrow__ __LEAF)) +-# define __NTH(fct) __attribute__ ((__nothrow__ __LEAF)) fct ++# define __THROW __attribute__ ((__nothrow__)) ++# define __NTH(fct) __attribute__ ((__nothrow__)) fct + # else + # if defined __cplusplus && __GNUC_PREREQ (2,8) + # define __THROW throw () +-# define __NTH(fct) __LEAF_ATTR fct throw () ++# define __NTH(fct) fct throw () + # else + # define __THROW + # define __NTH(fct) fct +-- +1.7.7.1 diff --git a/glibc.spec b/glibc.spec index 1aebfee..52801f0 100644 --- a/glibc.spec +++ b/glibc.spec @@ -28,7 +28,7 @@ Summary: The GNU libc libraries Name: glibc Version: %{glibcversion} -Release: 13 +Release: 14 # GPLv2+ is used in a bunch of programs, LGPLv2+ is used for libraries. # Things that are linked directly into dynamically linked programs # and shared libraries (e.g. crt files, lib*_nonshared.a) have an additional @@ -42,6 +42,7 @@ Source1: %{?glibc_release_url}%{glibcportsdir}.tar.xz Source2: %{glibcsrcdir}-fedora.tar.xz Patch0: %{name}-fedora.patch Patch1: %{name}-ia64-lib64.patch +Patch2: %{name}-no-leaf-attribute.patch Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Obsoletes: glibc-profile < 2.4 Obsoletes: nss_db @@ -260,6 +261,7 @@ rm -rf %{glibcportsdir} %patch1 -p1 %endif %endif +%patch2 -p1 # A lot of programs still misuse memcpy when they have to use # memmove. The memcpy implementation below is not tolerant at @@ -1112,6 +1114,11 @@ rm -f *.filelist* %endif %changelog +* Wed Oct 19 2011 Jim Meyering - 2.14.90-14 +- Revert the upstream patch that added the leaf attribute, since it + caused gcc -O2 to move code past thread primitives and sometimes + even out of critical sections. See http://bugzilla.redhat.com/747377 + * Wed Oct 19 2011 Andreas Schwab - 2.14.90-13 - Update from master - Fix linkage conflict with feraiseexcept (#746753)