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
11 changed files with 190 additions and 59 deletions
|
@ -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.
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue