libctf, elfcpp, gold: do not assume that <byteswap.h> contains bswap_*
authorNick Alcock <nick.alcock@oracle.com>
Fri, 13 Dec 2019 15:19:17 +0000 (15:19 +0000)
committerNick Alcock <nick.alcock@oracle.com>
Fri, 26 Jun 2020 14:56:39 +0000 (15:56 +0100)
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.

elfcpp/ChangeLog
elfcpp/elfcpp_swap.h
gold/ChangeLog
gold/config.in
gold/configure
gold/configure.ac
libctf/ChangeLog
libctf/config.h.in
libctf/configure
libctf/configure.ac
libctf/swap.h

index dc37f65bab440ffb36c1599c98e4c468ea098376..ee6db3a060f36ff6bafecf8b4333c88b5b238c64 100644 (file)
@@ -1,3 +1,12 @@
+2020-06-26  Nick Alcock  <nick.alcock@oracle.com>
+
+       * 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.
+
 2020-06-18  Fangrui Song  <i@maskray.me>
 
        PR gold/26039
index 3c9d25997ba4f74eae3db0c73ae8832b163db226..61b3ba5752012ef59c8d90ce6566cc0fe72a0e91 100644 (file)
 
 #ifdef HAVE_BYTESWAP_H
 #include <byteswap.h>
-#else
+#endif // defined(HAVE_BYTESWAP_H)
+
 // Provide our own versions of the byteswap functions.
-inline uint16_t
+#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
 
-inline uint32_t
+#if !HAVE_DECL_BSWAP_32
+static inline uint32_t
 bswap_32(uint32_t v)
 {
   return (  ((v & 0xff000000) >> 24)
@@ -62,8 +66,10 @@ bswap_32(uint32_t v)
          | ((v & 0x0000ff00) <<  8)
          | ((v & 0x000000ff) << 24));
 }
+#endif // !HAVE_DECL_BSWAP32
 
-inline uint64_t
+#if !HAVE_DECL_BSWAP_64
+static inline uint64_t
 bswap_64(uint64_t v)
 {
   return (  ((v & 0xff00000000000000ULL) >> 56)
@@ -75,7 +81,7 @@ bswap_64(uint64_t v)
          | ((v & 0x000000000000ff00ULL) << 40)
          | ((v & 0x00000000000000ffULL) << 56));
 }
-#endif // !defined(HAVE_BYTESWAP_H)
+#endif // !HAVE_DECL_BSWAP64
 
 // gcc 4.3 and later provides __builtin_bswap32 and __builtin_bswap64.
 
index 78b5579cd877a6ea7bbf1d09c1c343abc71689e5..9e06ff80c27cd8979bb9d4f0d5f8103c30163fe5 100644 (file)
@@ -1,3 +1,9 @@
+2020-06-26  Nick Alcock  <nick.alcock@oracle.com>
+
+       * configure.ac: Check for bswap_16, bswap_32, and bswap_64 decls.
+       * configure: Regenerated.
+       * config.h.in: Likewise.
+
 2020-06-24  Nick Clifton  <nickc@redhat.com>
 
        * target-reloc.h (issue_discarded_error): Initialise the
index 7bac34aab25fe53cef0bb7d5adc2c8cfa92ecc49..aaad1bee7065d398096f2081e00db349620648e7 100644 (file)
    don't. */
 #undef HAVE_DECL_BASENAME
 
+/* 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 declaration of `ffs', and to 0 if you don't. */
 #undef HAVE_DECL_FFS
 
index 474c69a1258c22389dee8bd262311f12d056f18f..199a739e7d1241fae4fd1be3666a574d57438538 100755 (executable)
@@ -2167,6 +2167,52 @@ fi
 
 } # ac_fn_cxx_check_header_mongrel
 
+# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
+# -----------------------------------------------
+# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
+# accordingly.
+ac_fn_cxx_check_decl ()
+{
+  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
+  as_decl_name=`echo $2|sed 's/ *(.*//'`
+  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
+$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
+if eval \${$3+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+$4
+int
+main ()
+{
+#ifndef $as_decl_name
+#ifdef __cplusplus
+  (void) $as_decl_use;
+#else
+  (void) $as_decl_name;
+#endif
+#endif
+
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_cxx_try_compile "$LINENO"; then :
+  eval "$3=yes"
+else
+  eval "$3=no"
+fi
+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
+fi
+eval ac_res=\$$3
+              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
+$as_echo "$ac_res" >&6; }
+  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
+
+} # ac_fn_cxx_check_decl
+
 # ac_fn_cxx_try_link LINENO
 # -------------------------
 # Try to link conftest.$ac_ext, and return whether this succeeded.
@@ -2279,52 +2325,6 @@ $as_echo "$ac_res" >&6; }
   eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
 
 } # ac_fn_cxx_check_func
-
-# ac_fn_cxx_check_decl LINENO SYMBOL VAR INCLUDES
-# -----------------------------------------------
-# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR
-# accordingly.
-ac_fn_cxx_check_decl ()
-{
-  as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack
-  as_decl_name=`echo $2|sed 's/ *(.*//'`
-  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared" >&5
-$as_echo_n "checking whether $as_decl_name is declared... " >&6; }
-if eval \${$3+:} false; then :
-  $as_echo_n "(cached) " >&6
-else
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-$4
-int
-main ()
-{
-#ifndef $as_decl_name
-#ifdef __cplusplus
-  (void) $as_decl_use;
-#else
-  (void) $as_decl_name;
-#endif
-#endif
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  eval "$3=yes"
-else
-  eval "$3=no"
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-fi
-eval ac_res=\$$3
-              { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5
-$as_echo "$ac_res" >&6; }
-  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno
-
-} # ac_fn_cxx_check_decl
 cat >config.log <<_ACEOF
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
@@ -9780,6 +9780,41 @@ fi
 done
 
 
+ac_fn_cxx_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_cxx_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_cxx_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
+
+
 for ac_header in windows.h
 do :
   ac_fn_cxx_check_header_mongrel "$LINENO" "windows.h" "ac_cv_header_windows_h" "$ac_includes_default"
index c4c93a036cd8d39e7cebba3ffa885f09f79de00f..eca4f01c111f24cb9fc4c79a0435b906c92b4bf3 100644 (file)
@@ -602,6 +602,9 @@ AC_CHECK_HEADERS(tr1/unordered_set tr1/unordered_map)
 AC_CHECK_HEADERS(ext/hash_map ext/hash_set)
 AC_CHECK_HEADERS(byteswap.h)
 
+dnl Check for bswap_{16,32,64}
+AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64], [], [], [[#include <byteswap.h>]])
+
 dnl When plugins enabled dynamic loader interface is required. Check headers
 dnl which may provide this interface. Add the necessary library to link.
 AC_CHECK_HEADERS(windows.h)
index a8217fa4324094eb80647827a763ba9c2004ff4a..743237e3d34dc8e19cdf1fabbaed1d392e19eff0 100644 (file)
@@ -1,3 +1,15 @@
+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
index 264cbc3e49dc88d3d1990ba24add7b81b59a60fb..ac0eb3e12f86ded67548dd1fe079d613be5009cc 100644 (file)
    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
 
index e5493b316912cc49972ea8f9d8b266d2d0f3e15d..58263e5632db40cc888c892e1fde96c9e0d7886c 100755 (executable)
@@ -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
+
 
 
 
index 7f2a713b93d17c0192056ec84175df6feda4ae71..f7e0cace52cd4bcbf6f33bdc9ac0db067a076e91 100644 (file)
@@ -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])
index d526f7e267139b1865a07c28a5cc98722a187d6f..c8962a271855c3f5e3a9432c9a9cbcb5786f5bef 100644 (file)
 
 #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) */