We're using gnulib to get ffs, ffsl, rotl32, count_one_bits,
and count_leading_zeros. Except for rotl32 they can all be
replaced with gcc/clangs builtins. rotl32 is a one-line
trivial function.
Signed-off-by: Daniel P. Berrangé <berrange(a)redhat.com>
---
bootstrap.conf | 5 -----
src/conf/capabilities.c | 3 +--
src/conf/domain_conf.c | 1 -
src/conf/snapshot_conf.c | 1 -
src/internal.h | 10 ++++++++--
src/libxl/xen_common.c | 1 -
src/util/virbitmap.c | 7 +++----
src/util/vircgroupv2.c | 2 +-
src/util/virhashcode.c | 6 +++++-
src/util/virhostcpu.c | 1 -
src/util/virhostmem.c | 1 -
src/util/virrandom.c | 4 +---
tools/vsh.c | 2 +-
13 files changed, 20 insertions(+), 24 deletions(-)
diff --git a/bootstrap.conf b/bootstrap.conf
index fe8f7fc9c3..7b20f1c371 100644
--- a/bootstrap.conf
+++ b/bootstrap.conf
@@ -22,7 +22,6 @@ accept
areadlink
base64
bind
-bitrotate
byteswap
c-ctype
c-strcase
@@ -34,8 +33,6 @@ clock-time
close
connect
configmake
-count-leading-zeros
-count-one-bits
dirname-lgpl
environ
execinfo
@@ -43,8 +40,6 @@ fclose
fcntl
fcntl-h
fdatasync
-ffs
-ffsl
fnmatch
fsync
getaddrinfo
diff --git a/src/conf/capabilities.c b/src/conf/capabilities.c
index 1231b9727c..7419d9cfc8 100644
--- a/src/conf/capabilities.c
+++ b/src/conf/capabilities.c
@@ -21,7 +21,6 @@
#include <config.h>
-#include <strings.h>
#include <unistd.h>
#include "capabilities.h"
@@ -1152,7 +1151,7 @@ virCapabilitiesFormatHostXML(virCapsHostPtr host,
virBufferAddLit(buf, "<power_management>\n");
virBufferAdjustIndent(buf, 2);
while (pm) {
- int bit = ffs(pm) - 1;
+ int bit = __builtin_ffs(pm) - 1;
virBufferAsprintf(buf, "<%s/>\n",
virCapsHostPMTargetTypeToString(bit));
pm &= ~(1U << bit);
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index 5d090876f8..a53cd6a725 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -45,7 +45,6 @@
#include "virstoragefile.h"
#include "virfile.h"
#include "virbitmap.h"
-#include "count-one-bits.h"
#include "secret_conf.h"
#include "netdev_vport_profile_conf.h"
#include "netdev_bandwidth_conf.h"
diff --git a/src/conf/snapshot_conf.c b/src/conf/snapshot_conf.c
index 96ad8ca953..a77f521302 100644
--- a/src/conf/snapshot_conf.c
+++ b/src/conf/snapshot_conf.c
@@ -29,7 +29,6 @@
#include "internal.h"
#include "virbitmap.h"
#include "virbuffer.h"
-#include "count-one-bits.h"
#include "datatypes.h"
#include "domain_conf.h"
#include "virlog.h"
diff --git a/src/internal.h b/src/internal.h
index adc1e3f496..fc251067f0 100644
--- a/src/internal.h
+++ b/src/internal.h
@@ -27,6 +27,7 @@
#include <stdint.h>
#include <stdio.h>
#include <string.h>
+#include <stdlib.h>
#if STATIC_ANALYSIS
# undef NDEBUG /* Don't let a prior NDEBUG definition cause trouble. */
@@ -63,7 +64,6 @@
#include "c-strcase.h"
#include "ignore-value.h"
-#include "count-leading-zeros.h"
/* String equality tests, suggested by Jim Meyering. */
#define STREQ(a, b) (strcmp(a, b) == 0)
@@ -493,6 +493,12 @@
} while (0)
+/* Count leading zeros in an unsigned int.
+ *
+ * Wrapper needed as __builtin_clz is undefined if value is zero
+ */
+#define VIR_CLZ(value) \
+ (value ? __builtin_clz(value) : (8 * sizeof(unsigned)))
/* divide value by size, rounding up */
#define VIR_DIV_UP(value, size) (((value) + (size) - 1) / (size))
@@ -504,7 +510,7 @@
* for 0 or number more than 2^31 (for 32bit unsigned int). */
#define VIR_ROUND_UP_POWER_OF_TWO(value) \
((value) > 0 && (value) <= 1U << (sizeof(unsigned int) * 8 - 1) ?
\
- 1U << (sizeof(unsigned int) * 8 - count_leading_zeros((value) - 1)) : 0)
+ 1U << (sizeof(unsigned int) * 8 - VIR_CLZ((value) - 1)) : 0)
/* Specific error values for use in forwarding programs such as
diff --git a/src/libxl/xen_common.c b/src/libxl/xen_common.c
index d327f03d73..2680e88a60 100644
--- a/src/libxl/xen_common.c
+++ b/src/libxl/xen_common.c
@@ -31,7 +31,6 @@
#include "virconf.h"
#include "viralloc.h"
#include "viruuid.h"
-#include "count-one-bits.h"
#include "xenxs_private.h"
#include "domain_conf.h"
#include "virstring.h"
diff --git a/src/util/virbitmap.c b/src/util/virbitmap.c
index a61f4b2095..ed8f06acc7 100644
--- a/src/util/virbitmap.c
+++ b/src/util/virbitmap.c
@@ -27,7 +27,6 @@
#include "viralloc.h"
#include "virbuffer.h"
#include "c-ctype.h"
-#include "count-one-bits.h"
#include "virstring.h"
#include "virutil.h"
#include "virerror.h"
@@ -1028,7 +1027,7 @@ virBitmapNextSetBit(virBitmapPtr bitmap,
if (bits == 0)
return -1;
- return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
+ return __builtin_ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
}
@@ -1127,7 +1126,7 @@ virBitmapNextClearBit(virBitmapPtr bitmap,
if (bits == 0)
return -1;
- return ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
+ return __builtin_ffsl(bits) - 1 + nl * VIR_BITMAP_BITS_PER_UNIT;
}
@@ -1144,7 +1143,7 @@ virBitmapCountBits(virBitmapPtr bitmap)
size_t ret = 0;
for (i = 0; i < bitmap->map_len; i++)
- ret += count_one_bits_l(bitmap->map[i]);
+ ret += __builtin_popcountl(bitmap->map[i]);
return ret;
}
diff --git a/src/util/vircgroupv2.c b/src/util/vircgroupv2.c
index 143083e56f..ace04bba04 100644
--- a/src/util/vircgroupv2.c
+++ b/src/util/vircgroupv2.c
@@ -339,7 +339,7 @@ static int
virCgroupV2GetAnyController(virCgroupPtr group)
{
/* The least significant bit is position 1. */
- return ffs(group->unified.controllers) - 1;
+ return __builtin_ffs(group->unified.controllers) - 1;
}
diff --git a/src/util/virhashcode.c b/src/util/virhashcode.c
index 310ec891c8..98d5dceeba 100644
--- a/src/util/virhashcode.c
+++ b/src/util/virhashcode.c
@@ -28,7 +28,11 @@
#include <config.h>
#include "virhashcode.h"
-#include "bitrotate.h"
+
+static uint32_t rotl32(uint32_t x, int8_t r)
+{
+ return (x << r) | (x >> (32 - r));
+}
/* slower than original but handles platforms that do only aligned reads */
static inline uint32_t getblock(const uint8_t *p, int i)
diff --git a/src/util/virhostcpu.c b/src/util/virhostcpu.c
index 8c00804b0e..83e4853006 100644
--- a/src/util/virhostcpu.c
+++ b/src/util/virhostcpu.c
@@ -44,7 +44,6 @@
#include "virhostcpupriv.h"
#include "physmem.h"
#include "virerror.h"
-#include "count-one-bits.h"
#include "intprops.h"
#include "virarch.h"
#include "virfile.h"
diff --git a/src/util/virhostmem.c b/src/util/virhostmem.c
index 19cd282724..d16e0217e5 100644
--- a/src/util/virhostmem.c
+++ b/src/util/virhostmem.c
@@ -37,7 +37,6 @@
#include "virhostmem.h"
#include "physmem.h"
#include "virerror.h"
-#include "count-one-bits.h"
#include "virarch.h"
#include "virfile.h"
#include "virtypedparam.h"
diff --git a/src/util/virrandom.c b/src/util/virrandom.c
index 93c5bf3a2c..8dcab1ac47 100644
--- a/src/util/virrandom.c
+++ b/src/util/virrandom.c
@@ -20,7 +20,6 @@
#include <inttypes.h>
#include <math.h>
-#include <strings.h>
#include <time.h>
#include <fcntl.h>
#include <sys/stat.h>
@@ -32,7 +31,6 @@
#include "virrandom.h"
#include "virthread.h"
-#include "count-one-bits.h"
#include "virutil.h"
#include "virerror.h"
#include "virfile.h"
@@ -97,7 +95,7 @@ double virRandom(void)
uint32_t virRandomInt(uint32_t max)
{
if ((max & (max - 1)) == 0)
- return virRandomBits(ffs(max) - 1);
+ return virRandomBits(__builtin_ffs(max) - 1);
double val = virRandom();
return val * max;
diff --git a/tools/vsh.c b/tools/vsh.c
index 9bdd90e362..bf8b6b412b 100644
--- a/tools/vsh.c
+++ b/tools/vsh.c
@@ -555,7 +555,7 @@ vshCmddefGetData(const vshCmdDef *cmd, uint64_t *opts_need_arg,
return NULL;
/* Grab least-significant set bit */
- i = ffsl(*opts_need_arg) - 1;
+ i = __builtin_ffsl(*opts_need_arg) - 1;
opt = &cmd->opts[i];
if (opt->type != VSH_OT_ARGV)
*opts_need_arg &= ~(1ULL << i);
--
2.21.0