Re: git: ee8b0c436d72 - main - lib/libc/string: replace ffs/fls implementations with clang builtins: cc: error: no such file or directory: '/usr/src/lib/libc/i386/string/ffs.S'

From: FreeBSD User <freebsd_at_walstatt-de.de>
Date: Tue, 04 Jul 2023 17:31:57 UTC
Am Mon, 3 Jul 2023 20:23:43 GMT
Robert Clausecker <fuz@FreeBSD.org> schrieb:

This commit seems to break buildworld:

[...]

cc -DCOMPAT_32BIT -march=i686 -mmmx -msse -msse2 -target x86_64-unknown-freebsd14.0 -m32
--sysroot=/usr/obj/usr/src/amd64.amd64/tmp -B/usr/obj/usr/src/amd64.amd64/tmp/usr/bin
-B/usr/obj/usr/src/amd64.amd64/tmp/usr/lib32 -fpic -DPIC -O2 -pipe -O3 -fno-common
-DNO__SCCSID -DNO__RCSID -I/usr/src/lib/libc/include -I/usr/src/include
-I/usr/src/lib/libc/i386 -DNLS  -ftls-model=initial-exec -DCRT_IRELOC_REL
-DINIT_IRELOCS="init_cpu_features()" -I/usr/src/lib/libc/csu/i386 -D__DBINTERFACE_PRIVATE
-I/usr/src/contrib/gdtoa -I/usr/src/contrib/libc-vis -DINET6
-I/usr/obj/usr/src/amd64.amd64/obj-lib32/lib/libc -I/usr/src/lib/libc/resolv -D_ACL_PRIVATE
-DPOSIX_MISTAKE -I/usr/src/lib/libmd -I/usr/src/contrib/jemalloc/include -DMALLOC_PRODUCTION
-I/usr/src/lib/libc/locale -DBROKEN_DES -DPORTMAP -DDES_BUILTIN -I/usr/src/lib/libc/rpc -DYP
-DNS_CACHING -DSYMBOL_VERSIONING -DNDEBUG -MD  -MF.depend.ffs.pico -MTffs.pico -std=gnu99
-Wno-format-zero-length -fstack-protector-strong -Wsystem-headers -Wall -Wno-format-y2k
-Wno-uninit--- ffs.nossppico --- cc -DCOMPAT_32BIT -march=i686 -mmmx -msse -msse2 -target
x86_64-unknown-freebsd14.0 -m32 --sysroot=/usr/obj/usr/src/amd64.amd64/tmp
-B/usr/obj/usr/src/amd64.amd64/tmp/usr/bin -B/usr/obj/usr/src/amd64.amd64/tmp/usr/lib32 -fpic
-DPIC -O2 -pipe -O3 -fno-common -DNO__SCCSID -DNO__RCSID -I/usr/src/lib/libc/include
-I/usr/src/include -I/usr/src/lib/libc/i386 -DNLS -ftls-model=initial-exec -DCRT_IRELOC_REL
-DINIT_IRELOCS="init_cpu_features()" -I/usr/src/lib/libc/csu/i386 -D__DBINTERFACE_PRIVATE
-I/usr/src/contrib/gdtoa -I/usr/src/contrib/libc-vis -DINET6
-I/usr/obj/usr/src/amd64.amd64/obj-lib32/lib/libc -I/usr/src/lib/libc/resolv -D_ACL_PRIVATE
-DPOSIX_MISTAKE -I/usr/src/lib/libmd -I/usr/src/contrib/jemalloc/include -DMALLOC_PRODUCTION
-I/usr/src/lib/libc/locale -DBROKEN_DES -DPORTMAP -DDES_BUILTIN -I/usr/src/lib/libc/rpc -DYP
-DNS_CACHING -DSYMBOL_VERSIONING -DNDEBUG -MD -MF.depend.ffs.nossppico -MTffs.nossppico
-std=gnu99 -Wno-format-zero-length -Wsystem-headers -Wall -Wno-format-y2k -Wno-uninitialized
-Wno-pointe--- ffsl.nossppico --- cc -DCOMPAT_32BIT -march=i686 -mmmx -msse -msse2 -target
x86_64-unknown-freebsd14.0 -m32  --sysroot=/usr/obj/usr/src/amd64.amd64/tmp
-B/usr/obj/usr/src/amd64.amd64/tmp/usr/bin -B/usr/obj/usr/src/amd64.amd64/tmp/usr/lib32 -fpic
-DPIC  -O2 -pipe -O3 -fno-common -DNO__SCCSID -DNO__RCSID -I/usr/src/lib/libc/include
-I/usr/src/include -I/usr/src/lib/libc/i386 -DNLS -ftls-model=initial-exec -DCRT_IRELOC_REL
-DINIT_IRELOCS="init_cpu_features()" -I/usr/src/lib/libc/csu/i386 -D__DBINTERFACE_PRIVATE
-I/usr/src/contrib/gdtoa -I/usr/src/contrib/libc-vis -DINET6
-I/usr/obj/usr/src/amd64.amd64/obj-lib32/lib/libc -I/usr/src/lib/libc/resolv -D_ACL_PRIVATE
-DPOSIX_MISTAKE -I/usr/src/lib/libmd -I/usr/src/contrib/jemalloc/include -DMALLOC_PRODUCTION
-I/usr/src/lib/libc/locale -DBROKEN_DES -DPORTMAP -DDES_BUILTIN -I/usr/src/lib/libc/rpc -DYP
-DNS_CACHING -DSYMBOL_VERSIONING -DNDEBUG -MD -MF.depend.ffsl.nossppico -MTffsl.nossppico
-std=gnu99 -Wno-format-zero-length -Wsystem-headers -Wall -Wno-format-y2k -Wno-uninitialized
-Wno-p--- ffs.pico --- ialized -Wno-pointer-sign -Wdate-time -Wno-empty-body
-Wno-string-plus-int -Wno-unused-const-variable -Wno-error=unused-but-set-parameter
-Wno-tautological-compare -Wno-unused-value -Wno-parentheses-equality -Wno-unused-function
-Wno-enum-conversion -Wno-unused-local-typedef -Wno-address-of-packed-member -Wno-switch
-Wno-switch-enum -Wno-knr-promoted-parameter  -Qunused-arguments    -I/usr/src/lib/libutil
-I/usr/src/lib/msun/i387 -I/usr/src/lib/msun/x86 -I/usr/src/lib/msun/src     -c
/usr/src/lib/libc/i386/string/ffs.S -o ffs.pico cc: error: no such file or directory:
'/usr/src/lib/libc/i386/string/ffs.S' cc: error: no input files

[...]
--- ffs.pico ---
*** [ffs.pico] Error code 1

make[4]: stopped in /usr/src/lib/libc
--- ffs.nossppico ---
cc: error: no such file or directory: '/usr/src/lib/libc/i386/string/ffs.S'
cc: error: no input files
*** [ffs.nossppico] Error code 1
[...]


> The branch main has been updated by fuz:
> 
> URL: https://cgit.FreeBSD.org/src/commit/?id=ee8b0c436d7221c25e8be3c3fe1f9da78b9d5b16
> 
> commit ee8b0c436d7221c25e8be3c3fe1f9da78b9d5b16
> Author:     Robert Clausecker <fuz@FreeBSD.org>
> AuthorDate: 2023-06-23 16:22:54 +0000
> Commit:     Robert Clausecker <fuz@FreeBSD.org>
> CommitDate: 2023-07-03 20:18:27 +0000
> 
>     lib/libc/string: replace ffs/fls implementations with clang builtins
>     
>     Most architectures we support (except for riscv64) have instructions
>     to compute these functions very quickly.  Replace old code with the
>     ffs and clz builtin functions, allowing clang to generate good code
>     for all architectures.
>     
>     As a consequence, toss out arm and i386 ffs() implementations.
>     
>     Sponsored by:   FreeBSD Foundation
>     Approved by:    mhorne
>     MFC after:      1 week
>     Differential Revision: https://reviews.freebsd.org/D40730
> ---
>  lib/libc/arm/string/Makefile.inc  |  1 -
>  lib/libc/arm/string/ffs.S         | 57 ---------------------------------------
>  lib/libc/i386/string/Makefile.inc |  1 -
>  lib/libc/i386/string/ffs.S        | 56 --------------------------------------
>  lib/libc/string/ffs.c             | 12 ++++-----
>  lib/libc/string/ffsl.c            | 12 ++++-----
>  lib/libc/string/ffsll.c           | 12 ++++-----
>  lib/libc/string/fls.c             | 13 +++++----
>  lib/libc/string/flsl.c            | 14 +++++-----
>  lib/libc/string/flsll.c           | 13 +++++----
>  10 files changed, 34 insertions(+), 157 deletions(-)
> 
> diff --git a/lib/libc/arm/string/Makefile.inc b/lib/libc/arm/string/Makefile.inc
> index cf3175ea4e8c..550de34adb0e 100644
> --- a/lib/libc/arm/string/Makefile.inc
> +++ b/lib/libc/arm/string/Makefile.inc
> @@ -3,7 +3,6 @@
>  MDSRCS+= \
>  	bcopy.S \
>  	bzero.S \
> -	ffs.S \
>  	memcmp.S \
>  	memcpy.S \
>  	memmove.S \
> diff --git a/lib/libc/arm/string/ffs.S b/lib/libc/arm/string/ffs.S
> deleted file mode 100644
> index 5756dd81d21d..000000000000
> --- a/lib/libc/arm/string/ffs.S
> +++ /dev/null
> @@ -1,57 +0,0 @@
> -/*	$NetBSD: ffs.S,v 1.5 2003/04/05 23:08:52 bjh21 Exp $	*/
> -/*
> - * Copyright (c) 2001 Christopher Gilbert
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. The name of the company nor the name of the author may be used to
> - *    endorse or promote products derived from this software without specific
> - *    prior written permission.
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> - * IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
> - * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
> - * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
> - * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
> - * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
> - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
> - * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
> - * SUCH DAMAGE.
> - */
> -
> -#include <machine/asm.h>
> -
> -__FBSDID("$FreeBSD$");
> -
> -.syntax unified
> -
> -/*
> - * ffs - find first set bit, this algorithm isolates the first set
> - * bit, then multiplies the number by 0x0450fbaf which leaves the top
> - * 6 bits as an index into the table.  This algorithm should be a win
> - * over the checking each bit in turn as per the C compiled version.
> - *
> - * This is the ffs algorithm devised by d.seal and posted to comp.sys.arm on
> - * 16 Feb 1994.
> - */
> -
> -ENTRY(ffs)
> -	/* Standard trick to isolate bottom bit in r0 or 0 if r0 = 0 on entry */
> - 	rsb     r1, r0, #0
> - 	ands    r0, r0, r1
> -	itt	ne
> -	clzne	r0, r0
> -	rsbne	r0, r0, #32
> -	RET
> -END(ffs)
> -
> -	.section .note.GNU-stack,"",%progbits
> diff --git a/lib/libc/i386/string/Makefile.inc b/lib/libc/i386/string/Makefile.inc
> index a8c50a285cbd..f3678b93bec3 100644
> --- a/lib/libc/i386/string/Makefile.inc
> +++ b/lib/libc/i386/string/Makefile.inc
> @@ -4,7 +4,6 @@ MDSRCS+= \
>  	bcmp.S \
>  	bcopy.S \
>  	bzero.S \
> -	ffs.S \
>  	memcmp.S \
>  	memcpy.S \
>  	memmove.S \
> diff --git a/lib/libc/i386/string/ffs.S b/lib/libc/i386/string/ffs.S
> deleted file mode 100644
> index 3a0431c6a845..000000000000
> --- a/lib/libc/i386/string/ffs.S
> +++ /dev/null
> @@ -1,56 +0,0 @@
> -/*
> - * Copyright (c) 1993 Winning Strategies, Inc.
> - * All rights reserved.
> - *
> - * Redistribution and use in source and binary forms, with or without
> - * modification, are permitted provided that the following conditions
> - * are met:
> - * 1. Redistributions of source code must retain the above copyright
> - *    notice, this list of conditions and the following disclaimer.
> - * 2. Redistributions in binary form must reproduce the above copyright
> - *    notice, this list of conditions and the following disclaimer in the
> - *    documentation and/or other materials provided with the distribution.
> - * 3. All advertising materials mentioning features or use of this software
> - *    must display the following acknowledgement:
> - *      This product includes software developed by Winning Strategies, Inc.
> - * 4. The name of the author may not be used to endorse or promote products
> - *    derived from this software without specific prior written permission
> - *
> - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> - * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> - * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> - * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> - * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> - * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> - */
> -
> -#include <machine/asm.h>
> -__FBSDID("$FreeBSD$");
> -
> -/*
> - * ffs(value)
> - *	finds the first bit set in value and returns the index of 
> - *	that bit.  Bits are numbered starting from 1, starting at the
> - *	rightmost bit.  A return value of 0 means that the argument
> - *	was zero.
> - *
> - * Written by:
> - *	J.T. Conklin (jtc@wimsey.com), Winning Strategies, Inc.
> - */
> -
> -ENTRY(ffs)
> -	bsfl	4(%esp),%eax
> -	jz	L1	 		/* ZF is set if all bits are 0 */
> -	incl	%eax			/* bits numbered from 1, not 0 */
> -	ret
> -
> -	.align 2
> -L1:	xorl	%eax,%eax		/* clear result */
> -	ret
> -END(ffs)
> -
> -	.section .note.GNU-stack,"",%progbits
> diff --git a/lib/libc/string/ffs.c b/lib/libc/string/ffs.c
> index 738ef90ce091..c011b3390612 100644
> --- a/lib/libc/string/ffs.c
> +++ b/lib/libc/string/ffs.c
> @@ -3,6 +3,10 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -43,11 +47,5 @@ __FBSDID("$FreeBSD$");
>  int
>  ffs(int mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return(0);
> -	for (bit = 1; !(mask & 1); bit++)
> -		mask = (unsigned int)mask >> 1;
> -	return (bit);
> +	return (__builtin_ffs(mask));
>  }
> diff --git a/lib/libc/string/ffsl.c b/lib/libc/string/ffsl.c
> index dbd894b9655b..6e1ac8ec45c1 100644
> --- a/lib/libc/string/ffsl.c
> +++ b/lib/libc/string/ffsl.c
> @@ -3,6 +3,10 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -40,11 +44,5 @@ __FBSDID("$FreeBSD$");
>  int
>  ffsl(long mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return (0);
> -	for (bit = 1; !(mask & 1); bit++)
> -		mask = (unsigned long)mask >> 1;
> -	return (bit);
> +	return (__builtin_ffsl(mask));
>  }
> diff --git a/lib/libc/string/ffsll.c b/lib/libc/string/ffsll.c
> index 91886de2f127..b945658b9008 100644
> --- a/lib/libc/string/ffsll.c
> +++ b/lib/libc/string/ffsll.c
> @@ -3,6 +3,10 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -40,11 +44,5 @@ __FBSDID("$FreeBSD$");
>  int
>  ffsll(long long mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return (0);
> -	for (bit = 1; !(mask & 1); bit++)
> -		mask = (unsigned long long)mask >> 1;
> -	return (bit);
> +	return (__builtin_ffsll(mask));
>  }
> diff --git a/lib/libc/string/fls.c b/lib/libc/string/fls.c
> index d9edc41f9599..3c4719776778 100644
> --- a/lib/libc/string/fls.c
> +++ b/lib/libc/string/fls.c
> @@ -3,6 +3,10 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -32,6 +36,7 @@
>  #include <sys/cdefs.h>
>  __FBSDID("$FreeBSD$");
>  
> +#include <limits.h>
>  #include <strings.h>
>  
>  /*
> @@ -40,11 +45,5 @@ __FBSDID("$FreeBSD$");
>  int
>  fls(int mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return (0);
> -	for (bit = 1; mask != 1; bit++)
> -		mask = (unsigned int)mask >> 1;
> -	return (bit);
> +	return (mask == 0 ? 0 : CHAR_BIT * sizeof(mask) - __builtin_clz(mask));
>  }
> diff --git a/lib/libc/string/flsl.c b/lib/libc/string/flsl.c
> index 60370cf7d832..f5280b77a4e2 100644
> --- a/lib/libc/string/flsl.c
> +++ b/lib/libc/string/flsl.c
> @@ -3,6 +3,11 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> +
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -32,6 +37,7 @@
>  #include <sys/cdefs.h>
>  __FBSDID("$FreeBSD$");
>  
> +#include <limits.h>
>  #include <strings.h>
>  
>  /*
> @@ -40,11 +46,5 @@ __FBSDID("$FreeBSD$");
>  int
>  flsl(long mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return (0);
> -	for (bit = 1; mask != 1; bit++)
> -		mask = (unsigned long)mask >> 1;
> -	return (bit);
> +	return (mask == 0 ? 0 : CHAR_BIT * sizeof(mask) - __builtin_clzl(mask));
>  }
> diff --git a/lib/libc/string/flsll.c b/lib/libc/string/flsll.c
> index 275aaa0e2e15..ab504b8e592f 100644
> --- a/lib/libc/string/flsll.c
> +++ b/lib/libc/string/flsll.c
> @@ -3,6 +3,10 @@
>   *
>   * Copyright (c) 1990, 1993
>   *	The Regents of the University of California.  All rights reserved.
> + * Copyright (c) 2023 The FreeBSD Foundation
> + *
> + * Portions of this software were developed by Robert Clausecker
> + * <fuz@FreeBSD.org> under sponsorship from the FreeBSD Foundation.
>   *
>   * Redistribution and use in source and binary forms, with or without
>   * modification, are permitted provided that the following conditions
> @@ -32,6 +36,7 @@
>  #include <sys/cdefs.h>
>  __FBSDID("$FreeBSD$");
>  
> +#include <limits.h>
>  #include <strings.h>
>  
>  /*
> @@ -40,11 +45,5 @@ __FBSDID("$FreeBSD$");
>  int
>  flsll(long long mask)
>  {
> -	int bit;
> -
> -	if (mask == 0)
> -		return (0);
> -	for (bit = 1; mask != 1; bit++)
> -		mask = (unsigned long long)mask >> 1;
> -	return (bit);
> +	return (mask == 0 ? 0 : CHAR_BIT * sizeof(mask) - __builtin_clzll(mask));
>  }
> 



-- 
O. Hartmann