On Tue, Aug 10, 2010 at 12:12 PM, Neel Natu <neeln...@gmail.com> wrote:
> Hi Stefan,
>
> On Mon, Aug 9, 2010 at 11:28 PM, Stefan Farfeleder <stef...@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.
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to