[libvirt] [PATCH 1/5] build: remove all gnulib bit manipulation modules

Daniel P. Berrangé berrange at redhat.com
Mon Oct 7 11:44:24 UTC 2019


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 at 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




More information about the libvir-list mailing list