From patchwork Thu Jun 23 20:32:27 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Siddhesh Poyarekar X-Patchwork-Id: 13341 Received: (qmail 50268 invoked by alias); 23 Jun 2016 20:32:43 -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 49719 invoked by uid 89); 23 Jun 2016 20:32:42 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=1.0 required=5.0 tests=AWL, BAYES_50, RCVD_IN_DNSWL_NONE, RCVD_IN_SORBS_WEB, SPF_NEUTRAL autolearn=no version=3.3.2 spammy=H*F:U*siddhesh, HX-Envelope-From:sk:siddhes, finds, H*M:devel X-HELO: homiemail-a91.g.dreamhost.com Date: Fri, 24 Jun 2016 02:02:27 +0530 From: Siddhesh Poyarekar To: libc-alpha@sourceware.org Subject: Re: [PATCH] Avoid attempt for runtime checks if all environments are defined Message-ID: <20160623203226.GB30229@devel.intra.reserved-bit.com> References: <1466703010-10670-1-git-send-email-siddhesh@sourceware.org> <20160623193550.GA24532@vapier.lan> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20160623193550.GA24532@vapier.lan> User-Agent: Mutt/1.6.1 (2016-04-27) On Thu, Jun 23, 2016 at 03:35:50PM -0400, Mike Frysinger wrote: > On 23 Jun 2016 23:00, Siddhesh Poyarekar wrote: > > macros undefined, which means that no such additiona execve is needed > > "additional" > > > + #define ALL_ENVIRONMENTS_DEFINED 1 > > don't indent the # Thanks, pushed with those changes. Siddhesh From d7e64365fea8d9223a233487de1e1d6e3d21c553 Mon Sep 17 00:00:00 2001 From: Siddhesh Poyarekar Date: Fri, 24 Jun 2016 01:58:44 +0530 Subject: [PATCH] Avoid attempt for runtime checks if all environments are defined getconf has the capability to do a runtime check for environment support in cases where there is optional support for an environment (_POSIX_V7_ILP32_OFF32 on x86_64 for example) and this is indicated by not defining the _POSIX_V7_ILP32_OFF32 macro, which results in getconf doing an additional execve of _POSIX_V7_ILP32_OFF32 in the $GETCONF_DIR. The default bits/environments.h however does not leave any environment macros undefined, which means that no such additional execve is needed. gcc trunk catches this as a build failure since it finds that the code block inside switch(specs[i].num) is not reachable. Avoid this error by not bothering about the additional exec (and looking in specific environments) when all environments are defined. Tested on aarch64. * posix/getconf.c: Define ALL_ENVIRONMENTS_DEFINED if all environment macros are defined. (main): Avoid execve if ALL_ENVIRONMENTS_DEFINED is defined. --- ChangeLog | 6 +++++ posix/getconf.c | 84 ++++++++++++++++++++++++++++++++++++++++----------------- 2 files changed, 66 insertions(+), 24 deletions(-) diff --git a/ChangeLog b/ChangeLog index ce5070f..66bb323 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2016-06-23 Siddhesh Poyarekar + + * posix/getconf.c: Define ALL_ENVIRONMENTS_DEFINED if all + environment macros are defined. + (main): Avoid execve if ALL_ENVIRONMENTS_DEFINED is defined. + 2016-06-23 Florian Weimer [BZ #20191] diff --git a/posix/getconf.c b/posix/getconf.c index 3e03396..5a65df8 100644 --- a/posix/getconf.c +++ b/posix/getconf.c @@ -29,6 +29,23 @@ #define NEED_SPEC_ARRAY 1 #include +/* If all of the environments are defined in environments.h, then we don't need + to bother with doing a runtime check for a specific environment. */ +#if (defined _SC_V6_ILP32_OFF32 \ + && defined _SC_V7_LPBIG_OFFBIG \ + && defined _SC_XBS5_LP64_OFF64 \ + && defined _SC_V6_LP64_OFF64 \ + && defined _SC_V7_ILP32_OFFBIG \ + && defined _SC_V6_LPBIG_OFFBIG \ + && defined _SC_V7_LP64_OFF64 \ + && defined _SC_V7_ILP32_OFF32 \ + && defined _SC_XBS5_LPBIG_OFFBIG \ + && defined _SC_XBS5_ILP32_OFFBIG \ + && defined _SC_V6_ILP32_OFFBIG \ + && defined _SC_XBS5_ILP32_OFF32) +# define ALL_ENVIRONMENTS_DEFINED 1 +#endif + struct conf { const char *name; @@ -488,6 +505,24 @@ environment SPEC.\n\n")); return 0; } +#ifdef ALL_ENVIRONMENTS_DEFINED + if (argc > 1 && strncmp (argv[1], "-v", 2) == 0) + { + if (argv[1][2] == '\0') + { + if (argc < 3) + usage (); + + argv += 2; + argc -= 2; + } + else + { + argv += 1; + argc += 1; + } + } +#else const char *getconf_dir = getenv ("GETCONF_DIR") ?: GETCONF_DIR; size_t getconf_dirlen = strlen (getconf_dir); @@ -538,42 +573,42 @@ environment SPEC.\n\n")); switch (specs[i].num) { -#ifndef _XBS5_ILP32_OFF32 +# ifndef _XBS5_ILP32_OFF32 case _SC_XBS5_ILP32_OFF32: -#endif -#ifndef _XBS5_ILP32_OFFBIG +# endif +# ifndef _XBS5_ILP32_OFFBIG case _SC_XBS5_ILP32_OFFBIG: -#endif -#ifndef _XBS5_LP64_OFF64 +# endif +# ifndef _XBS5_LP64_OFF64 case _SC_XBS5_LP64_OFF64: -#endif -#ifndef _XBS5_LPBIG_OFFBIG +# endif +# ifndef _XBS5_LPBIG_OFFBIG case _SC_XBS5_LPBIG_OFFBIG: -#endif -#ifndef _POSIX_V6_ILP32_OFF32 +# endif +# ifndef _POSIX_V6_ILP32_OFF32 case _SC_V6_ILP32_OFF32: -#endif -#ifndef _POSIX_V6_ILP32_OFFBIG +# endif +# ifndef _POSIX_V6_ILP32_OFFBIG case _SC_V6_ILP32_OFFBIG: -#endif -#ifndef _POSIX_V6_LP64_OFF64 +# endif +# ifndef _POSIX_V6_LP64_OFF64 case _SC_V6_LP64_OFF64: -#endif -#ifndef _POSIX_V6_LPBIG_OFFBIG +# endif +# ifndef _POSIX_V6_LPBIG_OFFBIG case _SC_V6_LPBIG_OFFBIG: -#endif -#ifndef _POSIX_V7_ILP32_OFF32 +# endif +# ifndef _POSIX_V7_ILP32_OFF32 case _SC_V7_ILP32_OFF32: -#endif -#ifndef _POSIX_V7_ILP32_OFFBIG +# endif +# ifndef _POSIX_V7_ILP32_OFFBIG case _SC_V7_ILP32_OFFBIG: -#endif -#ifndef _POSIX_V7_LP64_OFF64 +# endif +# ifndef _POSIX_V7_LP64_OFF64 case _SC_V7_LP64_OFF64: -#endif -#ifndef _POSIX_V7_LPBIG_OFFBIG +# endif +# ifndef _POSIX_V7_LPBIG_OFFBIG case _SC_V7_LPBIG_OFFBIG: -#endif +# endif { const char *args[argc + 3]; size_t spec_len = strlen (spec); @@ -592,6 +627,7 @@ environment SPEC.\n\n")); break; } } +#endif if (argc > 1 && strcmp (argv[1], "-a") == 0) {