Re: [PATCH 1/3] autoconf: prefer an unrolled loop for trivial AC_CHECK_FUNCS

Paolo Bonzini <[email protected]>
Newsgroups gmane.comp.sysutils.autoconf.patches
Message-ID <[email protected]>

On 31/10/2016 18:01, Eric Blake wrote:
> On 10/31/2016 10:33 AM, Paolo Bonzini wrote:
>>
>>
>> On 31/10/2016 16:28, Eric Blake wrote:
>>> On 10/31/2016 06:39 AM, Paolo Bonzini wrote:
>>>> An unrolled loop avoids the cost of spawning sed in AS_TR_SH and
>>>> AS_TR_CPP.  Prefer it if there is nothing in the second and third
>>>> argument of AC_CHECK_FUNCS and the first argument is a literal.
>>>> Modify AC_CHECK_FUNCS_ONCE to avoid the variable indirection too.
>>>>
>>>> * lib/autoconf/functions.m4 (AC_CHECK_FUNCS): Unroll loop if safe.
>>>> (_AC_CHECK_FUNCS): Move basic implementation here.
>>>> (_AC_CHECK_FUNC_ONCE): Expand AC_CHECK_FUNCS here...
>>>> (_AC_FUNCS_EXPANSION): ... and not here, so remove.
>>>
>>>> -	       [$3])dnl])
>>>> +[m4_if([$2$3]AS_LITERAL_IF([$1], [yes], [no]), []yes,
>>>
>>> Why []yes instead of the more typical [yes] ?
>>>
>>> If the user has (unwisely) defined yes as a macro, your version will
>>> compare against their expansion, instead of against the intended literal.
>>
>> Because I've never understood the rules for m4_if, and thought []yes
>> matched what you get from m4_if([$2$3]AS_LITERAL_IF([$1], [yes], [no]).
> 
> If 'yes' and 'no' are not macros, then these are identical:
> 
> m4_if([$2$3]AS_LITERAL_IF([$1], yes, no), yes, ...)
> m4_if([$2$3]AS_LITERAL_IF([$1], [yes], [no]), []yes[], ...)
> m4_if([$2$3]AS_LITERAL_IF([$1], [[yes]], [[no]]), [yes], ...)
> 
> because of the order in which quotes are stripped through successive
> levels of m4 processing.  But if yes or no could be a macro, then only
> the latter form is safe against unintended expansions (yes, including
> the double-quoting within AS_LITERAL_IF, because one layer of quotes
> gets stripped when collecting the args to AS_LITERAL_IF, and another
> gets stripped when concatenating to [$2$3] to determine the final string
> to compare against the literal of the second argument to m4_if).

Good, this is what I wanted.  I'll send v2 where the
only difference will be:

diff --git a/lib/autoconf/functions.m4 b/lib/autoconf/functions.m4
index 1043192..ccfb053 100644
--- a/lib/autoconf/functions.m4
+++ b/lib/autoconf/functions.m4
@@ -85,7 +85,7 @@ m4_define([_AH_CHECK_FUNC],
 # `break' to stop the search.
 AC_DEFUN([AC_CHECK_FUNCS],
 [m4_map_args_w([$1], [_AH_CHECK_FUNC(], [)])]dnl
-[m4_if([$2$3]AS_LITERAL_IF([$1], [yes], [no]), []yes,
+[m4_if([$2$3]AS_LITERAL_IF([$1], [[yes]], [[no]]), [yes],
        [m4_map_args_w([$1], [_$0(], [)])],
        [AS_FOR([AC_func], [ac_func], [$1], [_$0(AC_func, [$2], [$3])])])
 ])# AC_CHECK_FUNCS
diff --git a/lib/autoconf/headers.m4 b/lib/autoconf/headers.m4
index e855025..42f373f 100644
--- a/lib/autoconf/headers.m4
+++ b/lib/autoconf/headers.m4
@@ -182,7 +182,7 @@ m4_define([AH_CHECK_HEADERS],
 # header.  Either ACTION may include `break' to stop the search.
 AC_DEFUN([AC_CHECK_HEADERS],
 [m4_map_args_w([$1], [_AH_CHECK_HEADER(], [)])]dnl
-[m4_if([$2$3]AS_LITERAL_IF([$1], [yes], [no]), []yes,
+[m4_if([$2$3]AS_LITERAL_IF([$1], [[yes]], [[no]]), [yes],
        [m4_map_args_w([$1], [_$0(], [, [], [], [$4])])],
        [AS_FOR([AC_header], [ac_header], [$1], [_$0(AC_header, [$2], [$3], [$4])])])
 ])# AC_CHECK_HEADERS


Please commit for me, since I don't have write access to autoconf.git.

Thanks,

Paolo
signature.asc (application/pgp-signature, 473 B)
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2

iQEcBAEBCAAGBQJYF3oOAAoJEL/70l94x66DSK8H/1266R/El1LaTWQtIzW9vGQK
T6AdghOPCA2lgwAosXYA7PjtU507DW8EOHP8iBtZRuEZIfejPDW9ZA++kzSdqTnd
ow9XGaPehxYwQcpkzHhb4pLgvV/BnO9g+8zCq/7hf+PUPFhnCx/KniqVXVXjZQqL
isOTyEKdFoKO5o7JwUsKmF9rWFI4zx6GwBwBA5LYoMpxGYQqOWh87ICkydTusXjp
WBIelpX2scc4o+dHtBJuZLAlc89lIbKNtREheItOBd5KbumHKW0o9TdFYbu6QYYZ
PLFl5HEXzukWZxdwC4fnAf9TB7bJDQpSwOxSKI/S2Np/vwJjimS4xmhn5a7KUsY=
=nJzi
-----END PGP SIGNATURE-----
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.