diff options
author | Nick Alcock <nick.alcock@oracle.com> | 2019-12-13 15:19:17 +0000 |
---|---|---|
committer | Nick Alcock <nick.alcock@oracle.com> | 2020-06-26 15:56:39 +0100 |
commit | e755667f94f2579056fb5210eed525dafebb96f3 (patch) | |
tree | 7d4024539b52d471f42cf6f3d9f61d72197043fa /elfcpp | |
parent | 866706584c6622bd7f9f595c307422771ce1d564 (diff) | |
download | binutils-e755667f94f2579056fb5210eed525dafebb96f3.zip binutils-e755667f94f2579056fb5210eed525dafebb96f3.tar.gz binutils-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 'elfcpp')
-rw-r--r-- | elfcpp/ChangeLog | 9 | ||||
-rw-r--r-- | elfcpp/elfcpp_swap.h | 16 |
2 files changed, 20 insertions, 5 deletions
diff --git a/elfcpp/ChangeLog b/elfcpp/ChangeLog index dc37f65..ee6db3a 100644 --- a/elfcpp/ChangeLog +++ b/elfcpp/ChangeLog @@ -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 diff --git a/elfcpp/elfcpp_swap.h b/elfcpp/elfcpp_swap.h index 3c9d259..61b3ba5 100644 --- a/elfcpp/elfcpp_swap.h +++ b/elfcpp/elfcpp_swap.h @@ -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. |