aboutsummaryrefslogtreecommitdiff
path: root/gnulib/import
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@efficios.com>2020-02-14 14:41:07 -0500
committerSimon Marchi <simon.marchi@efficios.com>2020-02-14 14:41:07 -0500
commit5f661e03972e3412778c0bee8d20522b9bffea76 (patch)
tree287495c0d6f9659408ec5becf385f73387e5cf42 /gnulib/import
parent8084e579e114e607cb65482c43566e2c5c844bf6 (diff)
downloadgdb-5f661e03972e3412778c0bee8d20522b9bffea76.zip
gdb-5f661e03972e3412778c0bee8d20522b9bffea76.tar.gz
gdb-5f661e03972e3412778c0bee8d20522b9bffea76.tar.bz2
gnulib: import count-one-bits module and use it
For a fix I intend to submit, I would need a function that counts the number of set bits in a word. There is __builtin_popcount that is supported by gcc and clang, but there is also a gnulib module that wraps that and provides a fallback for other compilers, so I think it would be good to use it. I also noticed that there is a bitcount function in arch/arm.c, so I thought that as a first step I would replace that one with the gnulib count-one-bits module. This is what this patch does. The gnulib module provides multiple functions, with various parameter length (unsigned int, unsigned long int, unsigned long long int), I chose the one that made sense for each call site based on the argument type. gnulib/ChangeLog: * update-gnulib.sh (IMPORTED_GNULIB_MODULES): Import count-one-bits module. * configure: Re-generate. * aclocal.m4: Re-generate. * Makefile.in: Re-generate. * import/count-one-bits.c: New file. * import/count-one-bits.h: New file. * import/Makefile.am: Re-generate. * import/Makefile.in: Re-generate. * import/m4/gnulib-cache.m4: Re-generate. * import/m4/gnulib-comp.m4: Re-generate. * import/m4/count-one-bits.m4: New file. gdb/ChangeLog: * arm-tdep.c: Include count-one-bits.h. (cleanup_block_store_pc): Use count_one_bits. (cleanup_block_load_pc): Use count_one_bits. (arm_copy_block_xfer): Use count_one_bits. (thumb2_copy_block_xfer): Use count_one_bits. (thumb_copy_pop_pc_16bit): Use count_one_bits. * arch/arm-get-next-pcs.c: Include count-one-bits.h. (thumb_get_next_pcs_raw): Use count_one_bits. (arm_get_next_pcs_raw): Use count_one_bits_l. * arch/arm.c (bitcount): Remove. * arch/arm.h (bitcount): Remove.
Diffstat (limited to 'gnulib/import')
-rw-r--r--gnulib/import/Makefile.am9
-rw-r--r--gnulib/import/Makefile.in50
-rw-r--r--gnulib/import/count-one-bits.c7
-rw-r--r--gnulib/import/count-one-bits.h136
-rw-r--r--gnulib/import/m4/count-one-bits.m412
-rw-r--r--gnulib/import/m4/gnulib-cache.m42
-rw-r--r--gnulib/import/m4/gnulib-comp.m45
7 files changed, 198 insertions, 23 deletions
diff --git a/gnulib/import/Makefile.am b/gnulib/import/Makefile.am
index 4ddaf4f..0944473 100644
--- a/gnulib/import/Makefile.am
+++ b/gnulib/import/Makefile.am
@@ -35,6 +35,7 @@
# --no-vc-files \
# alloca \
# canonicalize-lgpl \
+# count-one-bits \
# dirent \
# dirfd \
# errno \
@@ -236,6 +237,14 @@ EXTRA_libgnu_a_SOURCES += closedir.c
## end gnulib module closedir
+## begin gnulib module count-one-bits
+
+libgnu_a_SOURCES += count-one-bits.c
+
+EXTRA_DIST += count-one-bits.h
+
+## end gnulib module count-one-bits
+
## begin gnulib module dirent
BUILT_SOURCES += dirent.h
diff --git a/gnulib/import/Makefile.in b/gnulib/import/Makefile.in
index 7059d4c..f5ad783 100644
--- a/gnulib/import/Makefile.in
+++ b/gnulib/import/Makefile.in
@@ -49,6 +49,7 @@
# --no-vc-files \
# alloca \
# canonicalize-lgpl \
+# count-one-bits \
# dirent \
# dirfd \
# errno \
@@ -178,6 +179,7 @@ am__aclocal_m4_deps = $(top_srcdir)/../config/depstand.m4 \
$(top_srcdir)/import/m4/close.m4 \
$(top_srcdir)/import/m4/closedir.m4 \
$(top_srcdir)/import/m4/codeset.m4 \
+ $(top_srcdir)/import/m4/count-one-bits.m4 \
$(top_srcdir)/import/m4/d-ino.m4 \
$(top_srcdir)/import/m4/d-type.m4 \
$(top_srcdir)/import/m4/dirent_h.m4 \
@@ -326,14 +328,15 @@ am__v_AR_1 =
libgnu_a_AR = $(AR) $(ARFLAGS)
am__DEPENDENCIES_1 =
am__dirstamp = $(am__leading_dot)dirstamp
-am_libgnu_a_OBJECTS = cloexec.$(OBJEXT) dirname-lgpl.$(OBJEXT) \
- basename-lgpl.$(OBJEXT) stripslash.$(OBJEXT) \
- exitfail.$(OBJEXT) fd-hook.$(OBJEXT) fd-safer-flag.$(OBJEXT) \
- dup-safer-flag.$(OBJEXT) filenamecat-lgpl.$(OBJEXT) \
- getprogname.$(OBJEXT) hard-locale.$(OBJEXT) \
- localcharset.$(OBJEXT) glthread/lock.$(OBJEXT) \
- malloca.$(OBJEXT) math.$(OBJEXT) openat-die.$(OBJEXT) \
- save-cwd.$(OBJEXT) malloc/scratch_buffer_grow.$(OBJEXT) \
+am_libgnu_a_OBJECTS = cloexec.$(OBJEXT) count-one-bits.$(OBJEXT) \
+ dirname-lgpl.$(OBJEXT) basename-lgpl.$(OBJEXT) \
+ stripslash.$(OBJEXT) exitfail.$(OBJEXT) fd-hook.$(OBJEXT) \
+ fd-safer-flag.$(OBJEXT) dup-safer-flag.$(OBJEXT) \
+ filenamecat-lgpl.$(OBJEXT) getprogname.$(OBJEXT) \
+ hard-locale.$(OBJEXT) localcharset.$(OBJEXT) \
+ glthread/lock.$(OBJEXT) malloca.$(OBJEXT) math.$(OBJEXT) \
+ openat-die.$(OBJEXT) save-cwd.$(OBJEXT) \
+ malloc/scratch_buffer_grow.$(OBJEXT) \
malloc/scratch_buffer_grow_preserve.$(OBJEXT) \
malloc/scratch_buffer_set_array_size.$(OBJEXT) \
stat-time.$(OBJEXT) strnlen1.$(OBJEXT) sys_socket.$(OBJEXT) \
@@ -1620,15 +1623,15 @@ noinst_LTLIBRARIES =
EXTRA_DIST = m4/gnulib-cache.m4 alloca.c alloca.in.h arpa_inet.in.h \
assure.h openat-priv.h openat-proc.c canonicalize-lgpl.c \
chdir-long.c chdir-long.h cloexec.h close.c closedir.c \
- dirent-private.h dirent.in.h dirfd.c dirname.h dosname.h dup.c \
- dup2.c errno.in.h error.c error.h exitfail.h fchdir.c fcntl.c \
- fcntl.in.h fd-hook.h fdopendir.c filename.h filenamecat.h \
- flexmember.h float.c float.in.h itold.c fnmatch.c \
- fnmatch_loop.c fnmatch.in.h fpucw.h frexp.c frexp.c frexpl.c \
- fstat.c stat-w32.c stat-w32.h at-func.c fstatat.c getcwd.c \
- getcwd-lgpl.c getdtablesize.c getlogin_r.c gettimeofday.c \
- glob.c glob_internal.h glob_pattern_p.c globfree.c glob-libc.h \
- glob.in.h hard-locale.h \
+ dirent-private.h count-one-bits.h dirent.in.h dirfd.c \
+ dirname.h dosname.h dup.c dup2.c errno.in.h error.c error.h \
+ exitfail.h fchdir.c fcntl.c fcntl.in.h fd-hook.h fdopendir.c \
+ filename.h filenamecat.h flexmember.h float.c float.in.h \
+ itold.c fnmatch.c fnmatch_loop.c fnmatch.in.h fpucw.h frexp.c \
+ frexp.c frexpl.c fstat.c stat-w32.c stat-w32.h at-func.c \
+ fstatat.c getcwd.c getcwd-lgpl.c getdtablesize.c getlogin_r.c \
+ gettimeofday.c glob.c glob_internal.h glob_pattern_p.c \
+ globfree.c glob-libc.h glob.in.h hard-locale.h \
$(top_srcdir)/import/extra/config.rpath inet_ntop.c intprops.h \
inttypes.in.h float+.h isnan.c isnand-nolibm.h isnand.c \
float+.h isnan.c isnanl-nolibm.h isnanl.c cdefs.h \
@@ -1682,12 +1685,12 @@ DISTCLEANFILES =
MAINTAINERCLEANFILES =
AM_CPPFLAGS =
AM_CFLAGS =
-libgnu_a_SOURCES = cloexec.c dirname-lgpl.c basename-lgpl.c \
- stripslash.c exitfail.c fd-hook.c fd-safer-flag.c \
- dup-safer-flag.c filenamecat-lgpl.c getprogname.h \
- getprogname.c gettext.h hard-locale.c localcharset.c \
- glthread/lock.h glthread/lock.c malloca.c math.c openat-die.c \
- save-cwd.c malloc/scratch_buffer_grow.c \
+libgnu_a_SOURCES = cloexec.c count-one-bits.c dirname-lgpl.c \
+ basename-lgpl.c stripslash.c exitfail.c fd-hook.c \
+ fd-safer-flag.c dup-safer-flag.c filenamecat-lgpl.c \
+ getprogname.h getprogname.c gettext.h hard-locale.c \
+ localcharset.c glthread/lock.h glthread/lock.c malloca.c \
+ math.c openat-die.c save-cwd.c malloc/scratch_buffer_grow.c \
malloc/scratch_buffer_grow_preserve.c \
malloc/scratch_buffer_set_array_size.c stat-time.c strnlen1.h \
strnlen1.c sys_socket.c tempname.c glthread/threadlib.c \
@@ -1827,6 +1830,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/cloexec.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/close.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closedir.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/count-one-bits.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirfd.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname-lgpl.Po@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dup-safer-flag.Po@am__quote@
diff --git a/gnulib/import/count-one-bits.c b/gnulib/import/count-one-bits.c
new file mode 100644
index 0000000..66341d7
--- /dev/null
+++ b/gnulib/import/count-one-bits.c
@@ -0,0 +1,7 @@
+#include <config.h>
+#define COUNT_ONE_BITS_INLINE _GL_EXTERN_INLINE
+#include "count-one-bits.h"
+
+#if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64)
+int popcount_support = -1;
+#endif
diff --git a/gnulib/import/count-one-bits.h b/gnulib/import/count-one-bits.h
new file mode 100644
index 0000000..0056994
--- /dev/null
+++ b/gnulib/import/count-one-bits.h
@@ -0,0 +1,136 @@
+/* count-one-bits.h -- counts the number of 1-bits in a word.
+ Copyright (C) 2007-2019 Free Software Foundation, Inc.
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see <https://www.gnu.org/licenses/>. */
+
+/* Written by Ben Pfaff. */
+
+#ifndef COUNT_ONE_BITS_H
+#define COUNT_ONE_BITS_H 1
+
+#include <limits.h>
+#include <stdlib.h>
+
+#ifndef _GL_INLINE_HEADER_BEGIN
+ #error "Please include config.h first."
+#endif
+_GL_INLINE_HEADER_BEGIN
+#ifndef COUNT_ONE_BITS_INLINE
+# define COUNT_ONE_BITS_INLINE _GL_INLINE
+#endif
+
+/* Expand to code that computes the number of 1-bits of the local
+ variable 'x' of type TYPE (an unsigned integer type) and return it
+ from the current function. */
+#define COUNT_ONE_BITS_GENERIC(TYPE) \
+ do \
+ { \
+ int count = 0; \
+ int bits; \
+ for (bits = 0; bits < sizeof (TYPE) * CHAR_BIT; bits += 32) \
+ { \
+ count += count_one_bits_32 (x); \
+ x = x >> 31 >> 1; \
+ } \
+ return count; \
+ } \
+ while (0)
+
+/* Assuming the GCC builtin is BUILTIN and the MSC builtin is MSC_BUILTIN,
+ expand to code that computes the number of 1-bits of the local
+ variable 'x' of type TYPE (an unsigned integer type) and return it
+ from the current function. */
+#if __GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)
+# define COUNT_ONE_BITS(BUILTIN, MSC_BUILTIN, TYPE) return BUILTIN (x)
+#else
+
+/* Compute and return the number of 1-bits set in the least
+ significant 32 bits of X. */
+COUNT_ONE_BITS_INLINE int
+count_one_bits_32 (unsigned int x)
+{
+ x = ((x & 0xaaaaaaaaU) >> 1) + (x & 0x55555555U);
+ x = ((x & 0xccccccccU) >> 2) + (x & 0x33333333U);
+ x = (x >> 16) + (x & 0xffff);
+ x = ((x & 0xf0f0) >> 4) + (x & 0x0f0f);
+ return (x >> 8) + (x & 0x00ff);
+}
+
+# if 1500 <= _MSC_VER && (defined _M_IX86 || defined _M_X64)
+
+/* While gcc falls back to its own generic code if the machine
+ on which it's running doesn't support popcount, with Microsoft's
+ compiler we need to detect and fallback ourselves. */
+# pragma intrinsic __cpuid
+# pragma intrinsic __popcnt
+# pragma intrinsic __popcnt64
+
+/* Return nonzero if popcount is supported. */
+
+/* 1 if supported, 0 if not supported, -1 if unknown. */
+extern int popcount_support;
+
+COUNT_ONE_BITS_INLINE int
+popcount_supported (void)
+{
+ if (popcount_support < 0)
+ {
+ int cpu_info[4];
+ __cpuid (cpu_info, 1);
+ popcount_support = (cpu_info[2] >> 23) & 1; /* See MSDN. */
+ }
+ return popcount_support;
+}
+
+# define COUNT_ONE_BITS(BUILTIN, MSC_BUILTIN, TYPE) \
+ do \
+ { \
+ if (popcount_supported ()) \
+ return MSC_BUILTIN (x); \
+ else \
+ COUNT_ONE_BITS_GENERIC (TYPE); \
+ } \
+ while (0)
+# else
+# define COUNT_ONE_BITS(BUILTIN, MSC_BUILTIN, TYPE) \
+ COUNT_ONE_BITS_GENERIC (TYPE)
+# endif
+#endif
+
+/* Compute and return the number of 1-bits set in X. */
+COUNT_ONE_BITS_INLINE int
+count_one_bits (unsigned int x)
+{
+ COUNT_ONE_BITS (__builtin_popcount, __popcnt, unsigned int);
+}
+
+/* Compute and return the number of 1-bits set in X. */
+COUNT_ONE_BITS_INLINE int
+count_one_bits_l (unsigned long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountl, __popcnt, unsigned long int);
+}
+
+#if HAVE_UNSIGNED_LONG_LONG_INT
+/* Compute and return the number of 1-bits set in X. */
+COUNT_ONE_BITS_INLINE int
+count_one_bits_ll (unsigned long long int x)
+{
+ COUNT_ONE_BITS (__builtin_popcountll, __popcnt64, unsigned long long int);
+}
+#endif
+
+_GL_INLINE_HEADER_END
+
+#endif /* COUNT_ONE_BITS_H */
diff --git a/gnulib/import/m4/count-one-bits.m4 b/gnulib/import/m4/count-one-bits.m4
new file mode 100644
index 0000000..b4721b5
--- /dev/null
+++ b/gnulib/import/m4/count-one-bits.m4
@@ -0,0 +1,12 @@
+# count-one-bits.m4 serial 3
+dnl Copyright (C) 2007, 2009-2019 Free Software Foundation, Inc.
+dnl This file is free software; the Free Software Foundation
+dnl gives unlimited permission to copy and/or distribute it,
+dnl with or without modifications, as long as this notice is preserved.
+
+AC_DEFUN([gl_COUNT_ONE_BITS],
+[
+ dnl We don't need (and can't compile) count_one_bits_ll
+ dnl unless the type 'unsigned long long int' exists.
+ AC_REQUIRE([AC_TYPE_UNSIGNED_LONG_LONG_INT])
+])
diff --git a/gnulib/import/m4/gnulib-cache.m4 b/gnulib/import/m4/gnulib-cache.m4
index 428f5c9..03101b6 100644
--- a/gnulib/import/m4/gnulib-cache.m4
+++ b/gnulib/import/m4/gnulib-cache.m4
@@ -40,6 +40,7 @@
# --no-vc-files \
# alloca \
# canonicalize-lgpl \
+# count-one-bits \
# dirent \
# dirfd \
# errno \
@@ -79,6 +80,7 @@ gl_LOCAL_DIR([])
gl_MODULES([
alloca
canonicalize-lgpl
+ count-one-bits
dirent
dirfd
errno
diff --git a/gnulib/import/m4/gnulib-comp.m4 b/gnulib/import/m4/gnulib-comp.m4
index be1fd39..fe1da67 100644
--- a/gnulib/import/m4/gnulib-comp.m4
+++ b/gnulib/import/m4/gnulib-comp.m4
@@ -57,6 +57,7 @@ AC_DEFUN([gl_EARLY],
# Code from module cloexec:
# Code from module close:
# Code from module closedir:
+ # Code from module count-one-bits:
# Code from module d-ino:
# Code from module d-type:
# Code from module dirent:
@@ -250,6 +251,7 @@ AC_DEFUN([gl_INIT],
AC_LIBOBJ([closedir])
fi
gl_DIRENT_MODULE_INDICATOR([closedir])
+ gl_COUNT_ONE_BITS
gl_CHECK_TYPE_STRUCT_DIRENT_D_INO
gl_CHECK_TYPE_STRUCT_DIRENT_D_TYPE
gl_DIRENT_H
@@ -855,6 +857,8 @@ AC_DEFUN([gl_FILE_LIST], [
lib/cloexec.h
lib/close.c
lib/closedir.c
+ lib/count-one-bits.c
+ lib/count-one-bits.h
lib/dirent-private.h
lib/dirent.in.h
lib/dirfd.c
@@ -1045,6 +1049,7 @@ AC_DEFUN([gl_FILE_LIST], [
m4/close.m4
m4/closedir.m4
m4/codeset.m4
+ m4/count-one-bits.m4
m4/d-ino.m4
m4/d-type.m4
m4/dirent_h.m4