From patchwork Wed May 13 16:33:10 2015 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Maria Guseva X-Patchwork-Id: 6701 Received: (qmail 123378 invoked by alias); 13 May 2015 16:33:23 -0000 Mailing-List: contact libc-alpha-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: libc-alpha-owner@sourceware.org Delivered-To: mailing list libc-alpha@sourceware.org Received: (qmail 122879 invoked by uid 89); 13 May 2015 16:33:22 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.2 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, MSGID_MULTIPLE_AT, SPF_HELO_PASS, T_MANY_HDRS_LCASE, T_RP_MATCHES_RCVD autolearn=no version=3.3.2 X-HELO: mailout1.w1.samsung.com From: Maria Guseva To: libc-alpha@sourceware.org Cc: rth@twiddle.net, roland@hack.frob.com, 'Yury Gribov' Subject: [RFC][PATCH] New configure option "--disable-ifunc" Date: Wed, 13 May 2015 19:33:10 +0300 Message-id: <"013e01d08d9a$80b32b10$82198130$@guseva"@samsung.com> MIME-version: 1.0 Content-type: text/plain; charset=US-ASCII Content-transfer-encoding: 7bit Hi all, The proposed patch adds a new configure option in order to disable IFUNC usage in Glibc. Currently in Glibc configure there is an option to disable multiarch while the IFUNC usage still may be enabled by default if linker supports it. I've tested the new option for ARM configuration. So I have to add pt-vfork implementation in arm sysdeps - cause the common pt-vfork implementation suggest IFUNC usage only. As I understood it was done in order to guarantee the tail call in non-IFUNC case. Are there any reasons for this except performance? If no I suggest to change the patch and move non-IFUNC implementation in common source nptl/pt-vfork.c instead of copying aarch64 implementation in sysdeps folders. The current patch just includes the aarch64 implementation for arm. Regards, Maria diff --git a/ChangeLog b/ChangeLog index 1e4d6f8..c025f3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,10 @@ +2015-05-13 Maria Guseva + + * configure.ac (--disable-ifunc): New configure option. + (use_ifunc): New AC_SUBST. + * configure: Regenerated. + * sysdeps/unix/sysv/linux/arm/pt-vfork.c: New file. + 2015-05-13 Szabolcs Nagy * sysdeps/aarch64/tls-macros.h (TLS_GD): Add "cc" to the clobber diff --git a/configure b/configure index 97e549e..b63a736 100755 --- a/configure +++ b/configure @@ -662,6 +662,7 @@ sysdeps_add_ons sysnames submachine multi_arch +use_ifunc base_machine add_on_subdirs add_ons @@ -770,6 +771,7 @@ enable_maintainer_mode enable_kernel enable_all_warnings enable_werror +enable_ifunc enable_multi_arch enable_nss_crypt enable_obsolete_rpc @@ -1432,6 +1434,7 @@ Optional Features: VERSION --enable-all-warnings enable all useful warnings gcc can issue --disable-werror do not build with -Werror + --disable-ifunc do not use gnu_indirect_function --enable-multi-arch enable single DSO with optimizations for multiple architectures --enable-nss-crypt enable libcrypt to use nss @@ -3668,6 +3671,14 @@ fi +# Check whether --enable-ifunc was given. +if test "${enable_ifunc+set}" = set; then : + enableval=$enable_ifunc; use_ifunc=$enableval +else + use_ifunc=default +fi + + # Check whether --enable-multi-arch was given. if test "${enable_multi_arch+set}" = set; then : enableval=$enable_multi_arch; multi_arch=$enableval @@ -4125,8 +4136,21 @@ $as_echo "yes" >&6; } fi if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then + if test x"$use_ifunc" = xyes; then + as_fn_error $? "--enable-ifunc support requires assembler and linker support" "$LINENO" 5 + else + use_ifunc=no + fi +fi + +if test "x$use_ifunc" = xdefault; then + use_ifunc=$libc_cv_ld_gnu_indirect_function +fi + + +if test x"$use_ifunc" != xyes; then if test x"$multi_arch" = xyes; then - as_fn_error $? "--enable-multi-arch support requires assembler and linker support" "$LINENO" 5 + as_fn_error $? "--enable-multi-arch support requires ifunc support" "$LINENO" 5 else multi_arch=no fi @@ -7226,7 +7250,7 @@ fi # A sysdeps configure fragment can reset this if IFUNC is not actually # usable even though the assembler knows how to generate the symbol type. -if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then +if test x"$use_ifunc" = xyes; then $as_echo "#define HAVE_IFUNC 1" >>confdefs.h fi diff --git a/configure.ac b/configure.ac index def655a..ac30620 100644 --- a/configure.ac +++ b/configure.ac @@ -269,6 +269,12 @@ AC_ARG_ENABLE([werror], [enable_werror=yes]) AC_SUBST(enable_werror) +AC_ARG_ENABLE([ifunc], + AC_HELP_STRING([--disable-ifunc], + [do not use gnu_indirect_function]), + [use_ifunc=$enableval], + [use_ifunc=default]) + AC_ARG_ENABLE([multi-arch], AC_HELP_STRING([--enable-multi-arch], [enable single DSO with optimizations for multiple architectures]), @@ -623,8 +629,21 @@ else fi if test x"$libc_cv_ld_gnu_indirect_function" != xyes; then + if test x"$use_ifunc" = xyes; then + AC_MSG_ERROR([--enable-ifunc support requires assembler and linker support]) + else + use_ifunc=no + fi +fi + +if test "x$use_ifunc" = xdefault; then + use_ifunc=$libc_cv_ld_gnu_indirect_function +fi +AC_SUBST(use_ifunc) + +if test x"$use_ifunc" != xyes; then if test x"$multi_arch" = xyes; then - AC_MSG_ERROR([--enable-multi-arch support requires assembler and linker support]) + AC_MSG_ERROR([--enable-multi-arch support requires ifunc support]) else multi_arch=no fi @@ -2004,7 +2023,7 @@ AC_SUBST(libc_cv_gcc_unwind_find_fde) # A sysdeps configure fragment can reset this if IFUNC is not actually # usable even though the assembler knows how to generate the symbol type. -if test x"$libc_cv_ld_gnu_indirect_function" = xyes; then +if test x"$use_ifunc" = xyes; then AC_DEFINE(HAVE_IFUNC) fi diff --git a/sysdeps/unix/sysv/linux/arm/pt-vfork.c b/sysdeps/unix/sysv/linux/arm/pt-vfork.c new file mode 100644 index 0000000..dfeda3b --- /dev/null +++ b/sysdeps/unix/sysv/linux/arm/pt-vfork.c @@ -0,0 +1,19 @@ +/* vfork ABI-compatibility entry points for libpthread. + Copyright (C) 2015 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 + . */ + +#include