From 1acaf9980b55ae180cc08db218b9face28202519 Mon Sep 17 00:00:00 2001 From: Alyssa Ross Date: Thu, 15 Jul 2021 22:55:36 +0000 Subject: [PATCH] Use popcount64 from libc when available (#152) * Use popcount64 from libc when available Without this, we get a compiler error on NetBSD because the one in libc has a slightly different prototype. libcpuid_util.c:78:12: error: conflicting types for 'popcount64' 78 | static int popcount64(uint64_t mask) | ^~~~~~~~~~ In file included from /nix/store/155rj8nqh3xd80vpa8hl35p3hk7pacys-include-netbsd-8.0/include/string.h:98, from libcpuid_util.c:30: /nix/store/155rj8nqh3xd80vpa8hl35p3hk7pacys-include-netbsd-8.0/include/strings.h:61:14: note: previous declaration of 'popcount64' was here 61 | unsigned int popcount64(__uint64_t) __constfunc; | ^~~~~~~~~~ * Return unsigned int from popcount64 Matches NetBSD libc, where popcount64 originates. --- configure.ac | 2 ++ libcpuid/libcpuid_util.c | 9 +++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index 1209fb6..4ed7f83 100644 --- a/configure.ac +++ b/configure.ac @@ -43,6 +43,8 @@ LT_INIT AM_CPPFLAGS="$CPPFLAGS" AC_CHECK_HEADERS([stdint.h]) +AC_CHECK_FUNCS([popcount64]) + AC_CHECK_PROGS([DOXYGEN], [doxygen]) AM_CONDITIONAL([HAVE_DOXYGEN], [test -n "$DOXYGEN"]) diff --git a/libcpuid/libcpuid_util.c b/libcpuid/libcpuid_util.c index f7a0868..9bed613 100644 --- a/libcpuid/libcpuid_util.c +++ b/libcpuid/libcpuid_util.c @@ -29,6 +29,9 @@ #include #include #include +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif #include "libcpuid.h" #include "libcpuid_util.h" @@ -74,9 +77,10 @@ void debugf(int verboselevel, const char* format, ...) _warn_fun(buff); } -static int popcount64(uint64_t mask) +#ifndef HAVE_POPCOUNT64 +static unsigned int popcount64(uint64_t mask) { - int num_set_bits = 0; + unsigned int num_set_bits = 0; while (mask) { mask &= mask - 1; @@ -85,6 +89,7 @@ static int popcount64(uint64_t mask) return num_set_bits; } +#endif static int score(const struct match_entry_t* entry, const struct cpu_id_t* data, int brand_code, uint64_t bits, int model_code)