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.
This commit is contained in:
Nick Alcock 2019-12-13 15:19:17 +00:00
parent 866706584c
commit e755667f94
11 changed files with 190 additions and 59 deletions

View 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

View File

@ -46,15 +46,19 @@
#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.

View 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

View File

@ -52,6 +52,18 @@
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

127
gold/configure vendored
View File

@ -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"

View 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)

View 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

View File

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

34
libctf/configure vendored
View File

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

View 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])

View File

@ -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) */