summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZdenek Kabelac <zkabelac@redhat.com>2021-03-29 22:43:36 +0200
committerZdenek Kabelac <zkabelac@redhat.com>2021-03-30 13:08:14 +0200
commit648188df2a9ba7528f60a9362860d7615227061b (patch)
tree32d7a03ad31b1ae4f5d00c9f8bd1d4dbad274589
parentf1e8437c59882a71a9a6e005d188a12a35f0cf9b (diff)
downloadlvm2-648188df2a9ba7528f60a9362860d7615227061b.tar.gz
libdm: use libdm header util.h
Avoid using lvm header for libdm build.
-rw-r--r--libdm/dm-tools/util.h41
-rw-r--r--libdm/misc/dmlib.h2
2 files changed, 42 insertions, 1 deletions
diff --git a/libdm/dm-tools/util.h b/libdm/dm-tools/util.h
index 730b90370..3925a7438 100644
--- a/libdm/dm-tools/util.h
+++ b/libdm/dm-tools/util.h
@@ -76,4 +76,45 @@
#define FMTVGID "%." DM_TO_STRING(ID_LEN) "s"
+/*
+ * GCC 3.4 adds a __builtin_clz, which uses the count leading zeros (clz)
+ * instruction on arches that have one. Provide a fallback using shifts
+ * and comparisons for older compilers.
+ */
+#ifdef HAVE___BUILTIN_CLZ
+#define clz(x) __builtin_clz((x))
+#else /* ifdef HAVE___BUILTIN_CLZ */
+static unsigned _dm_clz(unsigned x)
+{
+ int n;
+
+ if ((int)x <= 0) return (~x >> 26) & 32;
+
+ n = 1;
+
+ if ((x >> 16) == 0) {
+ n = n + 16;
+ x = x << 16;
+ }
+
+ if ((x >> 24) == 0) {
+ n = n + 8;
+ x = x << 8;
+ }
+
+ if ((x >> 28) == 0) {
+ n = n + 4;
+ x = x << 4;
+ }
+
+ if ((x >> 30) == 0) {
+ n = n + 2;
+ x = x << 2;
+ }
+ n = n - (x >> 31);
+ return n;
+}
+#define clz(x) _dm_clz((x))
+#endif /* ifdef HAVE___BUILTIN_CLZ */
+
#endif
diff --git a/libdm/misc/dmlib.h b/libdm/misc/dmlib.h
index 22328696b..85a22c50f 100644
--- a/libdm/misc/dmlib.h
+++ b/libdm/misc/dmlib.h
@@ -72,7 +72,7 @@
#define DM_EXPORT_SYMBOL_BASE(func)
#endif
-#include "lib/misc/util.h"
+#include "libdm/dm-tools/util.h"
#include "libdm/libdevmapper.h"
#include "libdm/misc/dm-logging.h"