aboutsummaryrefslogtreecommitdiff
path: root/libctf
diff options
context:
space:
mode:
authorNick Alcock <nick.alcock@oracle.com>2019-12-13 15:19:17 +0000
committerNick Alcock <nick.alcock@oracle.com>2020-06-26 15:56:39 +0100
commite755667f94f2579056fb5210eed525dafebb96f3 (patch)
tree7d4024539b52d471f42cf6f3d9f61d72197043fa /libctf
parent866706584c6622bd7f9f595c307422771ce1d564 (diff)
downloadgdb-e755667f94f2579056fb5210eed525dafebb96f3.zip
gdb-e755667f94f2579056fb5210eed525dafebb96f3.tar.gz
gdb-e755667f94f2579056fb5210eed525dafebb96f3.tar.bz2
libctf, elfcpp, gold: do not assume that <byteswap.h> contains bswap_*
At least one C library (uclibc-ng) defines some of these only when the compiler is GCC. We might as well test for all three cases and handle any of them being missing. Very similar code exists in libctf and split between elfcpp and gold: fix both. (Also sync up elfcpp with a change made to libctf swap.h a few months ago: since there is no out-of-line definition of the bswap replacements, they should be declared static inline, not just inline, to prevent the linker generating out-of-line references to them.) PR libctf/25120 libctf/ * configure.ac: Check for bswap_16, bswap_32, and bswap_64 decls. * swap.h (bswap_16): Do not assume that presence of <byteswap.h> means this is declared. (bswap_32): Likewise. (bswap_64): Likewise. (bswap_identity_64): Remove, unused. * configure: Regenerated. * config.h.in: Likewise. gold/ * configure.ac: Check for bswap_16, bswap_32, and bswap_64 decls. * configure: Regenerated. * config.h.in: Likewise. elfcpp/ * elfcpp_swap.h (bswap_16): Do not assume that presence of <byteswap.h> means this is declared. Make static inline, matching recent change to libctf, since there is no non-inline definition of these functions. (bswap_32): Likewise. (bswap_64): Likewise.
Diffstat (limited to 'libctf')
-rw-r--r--libctf/ChangeLog12
-rw-r--r--libctf/config.h.in12
-rwxr-xr-xlibctf/configure34
-rw-r--r--libctf/configure.ac2
-rw-r--r--libctf/swap.h16
5 files changed, 68 insertions, 8 deletions
diff --git a/libctf/ChangeLog b/libctf/ChangeLog
index a8217fa..743237e 100644
--- a/libctf/ChangeLog
+++ b/libctf/ChangeLog
@@ -1,6 +1,18 @@
2020-06-26 Nick Alcock <nick.alcock@oracle.com>
PR libctf/25120
+ * configure.ac: Check for bswap_16, bswap_32, and bswap_64 decls.
+ * swap.h (bswap_16): Do not assume that presence of <byteswap.h>
+ means this is declared.
+ (bswap_32): Likewise.
+ (bswap_64): Likewise.
+ (bswap_identity_64): Remove, unused.
+ * configure: Regenerated.
+ * config.h.in: Likewise.
+
+2020-06-26 Nick Alcock <nick.alcock@oracle.com>
+
+ PR libctf/25120
* ctf-impl.h (_libctf_printflike_): Add non-GNU-C fallback.
(_libctf_unlikely_): Likewise.
(_libctf_unused): Likewise.
diff --git a/libctf/config.h.in b/libctf/config.h.in
index 264cbc3..ac0eb3e 100644
--- a/libctf/config.h.in
+++ b/libctf/config.h.in
@@ -13,6 +13,18 @@
don't. */
#undef HAVE_DECL_ASPRINTF
+/* Define to 1 if you have the declaration of `bswap_16', and to 0 if you
+ don't. */
+#undef HAVE_DECL_BSWAP_16
+
+/* Define to 1 if you have the declaration of `bswap_32', and to 0 if you
+ don't. */
+#undef HAVE_DECL_BSWAP_32
+
+/* Define to 1 if you have the declaration of `bswap_64', and to 0 if you
+ don't. */
+#undef HAVE_DECL_BSWAP_64
+
/* Define to 1 if you have the <dlfcn.h> header file. */
#undef HAVE_DLFCN_H
diff --git a/libctf/configure b/libctf/configure
index e5493b3..58263e5 100755
--- a/libctf/configure
+++ b/libctf/configure
@@ -13028,6 +13028,40 @@ cat >>confdefs.h <<_ACEOF
#define HAVE_DECL_ASPRINTF $ac_have_decl
_ACEOF
+ac_fn_c_check_decl "$LINENO" "bswap_16" "ac_cv_have_decl_bswap_16" "#include <byteswap.h>
+"
+if test "x$ac_cv_have_decl_bswap_16" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_BSWAP_16 $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "bswap_32" "ac_cv_have_decl_bswap_32" "#include <byteswap.h>
+"
+if test "x$ac_cv_have_decl_bswap_32" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_BSWAP_32 $ac_have_decl
+_ACEOF
+ac_fn_c_check_decl "$LINENO" "bswap_64" "ac_cv_have_decl_bswap_64" "#include <byteswap.h>
+"
+if test "x$ac_cv_have_decl_bswap_64" = xyes; then :
+ ac_have_decl=1
+else
+ ac_have_decl=0
+fi
+
+cat >>confdefs.h <<_ACEOF
+#define HAVE_DECL_BSWAP_64 $ac_have_decl
+_ACEOF
+
diff --git a/libctf/configure.ac b/libctf/configure.ac
index 7f2a713..f7e0cac 100644
--- a/libctf/configure.ac
+++ b/libctf/configure.ac
@@ -100,6 +100,8 @@ AC_CHECK_HEADERS(byteswap.h endian.h)
AC_CHECK_FUNCS(pread)
AC_CHECK_DECLS([asprintf])
+dnl Check for bswap_{16,32,64}
+AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64], [], [], [[#include <byteswap.h>]])
dnl Check for qsort_r. (Taken from gnulib.)
AC_CHECK_FUNCS_ONCE([qsort_r])
diff --git a/libctf/swap.h b/libctf/swap.h
index d526f7e..c8962a2 100644
--- a/libctf/swap.h
+++ b/libctf/swap.h
@@ -25,15 +25,19 @@
#ifdef HAVE_BYTESWAP_H
#include <byteswap.h>
-#else
+#endif /* defined(HAVE_BYTESWAP_H) */
/* Provide our own versions of the byteswap functions. */
+
+#if !HAVE_DECL_BSWAP_16
static inline uint16_t
bswap_16 (uint16_t v)
{
return ((v >> 8) & 0xff) | ((v & 0xff) << 8);
}
+#endif /* !HAVE_DECL_BSWAP16 */
+#if !HAVE_DECL_BSWAP_32
static inline uint32_t
bswap_32 (uint32_t v)
{
@@ -42,13 +46,9 @@ bswap_32 (uint32_t v)
| ((v & 0x0000ff00) << 8)
| ((v & 0x000000ff) << 24));
}
+#endif /* !HAVE_DECL_BSWAP32 */
-static inline uint64_t
-bswap_identity_64 (uint64_t v)
-{
- return v;
-}
-
+#if !HAVE_DECL_BSWAP_64
static inline uint64_t
bswap_64 (uint64_t v)
{
@@ -61,6 +61,6 @@ bswap_64 (uint64_t v)
| ((v & 0x000000000000ff00ULL) << 40)
| ((v & 0x00000000000000ffULL) << 56));
}
-#endif /* !defined(HAVE_BYTESWAP_H) */
+#endif /* !HAVE_DECL_BSWAP64 */
#endif /* !defined(_CTF_SWAP_H) */