mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-04-06 14:21:43 +08:00
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:
parent
866706584c
commit
e755667f94
@ -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
|
||||
|
@ -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.
|
||||
|
||||
|
@ -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
|
||||
|
@ -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
127
gold/configure
vendored
@ -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"
|
||||
|
@ -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)
|
||||
|
@ -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
|
||||
|
@ -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
34
libctf/configure
vendored
@ -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
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -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])
|
||||
|
@ -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) */
|
||||
|
Loading…
x
Reference in New Issue
Block a user