svn commit: r211130 - head/libexec/rtld-elf/mips
Jayachandran C.
c.jayachandran at gmail.com
Tue Aug 10 07:25:40 UTC 2010
On Tue, Aug 10, 2010 at 12:12 PM, Neel Natu <neelnatu at gmail.com> wrote:
> Hi Stefan,
>
> On Mon, Aug 9, 2010 at 11:28 PM, Stefan Farfeleder <stefanf at freebsd.org> wrote:
>> On Tue, Aug 10, 2010 at 05:15:35AM +0000, Neel Natu wrote:
>>> Author: neel
>>> Date: Tue Aug 10 05:15:35 2010
>>> New Revision: 211130
>>> URL: http://svn.freebsd.org/changeset/base/211130
>>>
>>> Log:
>>> Fix compilation error for 64-bit little endian build:
>>> libexec/rtld-elf/mips/reloc.c:196: warning: right shift count >= width of type
>>>
>>> When the expression '(r_info) >> 32' was passed to bswap32() it was promptly
>>> changed to '(uint32_t)(r_info) >> 32' which is not what we intended.
>>
>> Wouldn't it be better to fix the bswap32 macro instead?
>>
>
> I think you are right. Can you take a look at the following patch instead?
>
> If I hear no objections, I will commit it tomorrow.
>
> Index: libexec/rtld-elf/mips/reloc.c
> ===================================================================
> --- libexec/rtld-elf/mips/reloc.c (revision 211131)
> +++ libexec/rtld-elf/mips/reloc.c (working copy)
> @@ -83,7 +83,7 @@
> #undef ELF_R_SYM
> #undef ELF_R_TYPE
> #define ELF_R_SYM(r_info) ((r_info) & 0xffffffff)
> -#define ELF_R_TYPE(r_info) bswap32(((r_info) >> 32))
> +#define ELF_R_TYPE(r_info) bswap32((r_info) >> 32)
> #endif
> #else
> #define ELF_R_NXTTYPE_64_P(r_type) (0)
> Index: sys/sys/endian.h
> ===================================================================
> --- sys/sys/endian.h (revision 211131)
> +++ sys/sys/endian.h (working copy)
> @@ -56,9 +56,9 @@
> /*
> * General byte order swapping functions.
> */
> -#define bswap16(x) __bswap16(x)
> -#define bswap32(x) __bswap32(x)
> -#define bswap64(x) __bswap64(x)
> +#define bswap16(x) __bswap16((x))
> +#define bswap32(x) __bswap32((x))
> +#define bswap64(x) __bswap64((x))
>
I think there is a problem in sys/mips/include/_endian.h
--
#define __bswap16(x) (__uint16_t)(__is_constant(x) ? \
__bswap16_const((__uint16_t)x) : __bswap16_var((__uint16_t)x))
#define __bswap32(x) (__uint32_t)(__is_constant(x) ? \
__bswap32_const((__uint32_t)x) : __bswap32_var((__uint32_t)x))
#define __bswap64(x) (__uint64_t)(__is_constant(x) ? \
__bswap64_const((__uint64_t)x) : __bswap64_var((__uint64_t)x))
--
I'm not sure why the cast is needed, but we should have a braces
around x, unless I'm completely mistaken.
JC.
More information about the svn-src-head
mailing list