provide ffs, gcc generates calls to it, even when __builtin_ffs() is used.
authorotto <otto@openbsd.org>
Tue, 30 Jan 2018 20:15:25 +0000 (20:15 +0000)
committerotto <otto@openbsd.org>
Tue, 30 Jan 2018 20:15:25 +0000 (20:15 +0000)
ok deraadt@

libexec/ld.so/Makefile
libexec/ld.so/ffs.c [new file with mode: 0644]

index 6de3863..50228d6 100644 (file)
@@ -1,4 +1,4 @@
-#      $OpenBSD: Makefile,v 1.71 2017/12/08 05:30:16 deraadt Exp $
+#      $OpenBSD: Makefile,v 1.72 2018/01/30 20:15:25 otto Exp $
 
 SUBDIR=ldconfig ldd
 MAN=   ld.so.1
@@ -19,7 +19,7 @@ VPATH=${.CURDIR}/../../lib/libc/string
 SRCS=  ldasm.S boot.c loader.c resolve.c dlfcn.c dl_printf.c rtld_machine.c
 SRCS+= path.c util.c sod.c strsep.c strtol.c dir.c library_subr.c
 SRCS+= dl_realpath.c dl_uname.c dl_dirname.c strlcat.c strlen.c trace.c
-SRCS+= malloc.c reallocarray.c tib.c
+SRCS+= malloc.c reallocarray.c tib.c ffs.c
 
 syscall=__syscall close exit fstat __getcwd getdents getentropy getthrid \
        issetugid mprotect munmap open pledge read readlink sendsyslog \
diff --git a/libexec/ld.so/ffs.c b/libexec/ld.so/ffs.c
new file mode 100644 (file)
index 0000000..8c5e624
--- /dev/null
@@ -0,0 +1,40 @@
+/*     $OpenBSD: ffs.c,v 1.1 2018/01/30 20:15:25 otto Exp $    */
+
+/*
+ * Public domain.
+ * Written by Dale Rahn.
+ */
+
+#include <string.h>
+
+/*
+ * ffs -- vax ffs instruction
+ */
+int
+ffs(int mask)
+{
+       int bit;
+       unsigned int r = mask;
+       static const signed char t[16] = {
+               -28, 1, 2, 1,
+                 3, 1, 2, 1,
+                 4, 1, 2, 1,
+                 3, 1, 2, 1
+       };
+
+       bit = 0;
+       if (!(r & 0xffff)) {
+               bit += 16;
+               r >>= 16;
+       }
+       if (!(r & 0xff)) {
+               bit += 8;
+               r >>= 8;
+       }
+       if (!(r & 0xf)) {
+               bit += 4;
+               r >>= 4;
+       }
+
+       return (bit + t[ r & 0xf ]);
+}