Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 24 Mar 2012 10:07:22 +0000 (UTC)
From:      Dimitry Andric <dim@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r233419 - head/sys/x86/include
Message-ID:  <201203241007.q2OA7MtS024789@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: dim
Date: Sat Mar 24 10:07:21 2012
New Revision: 233419
URL: http://svn.freebsd.org/changeset/base/233419

Log:
  Fix the following clang warning in sys/dev/dcons/dcons.c, caused by the
  recent changes in sys/x86/include/endian.h:
  
    sys/dev/dcons/dcons.c:190:15: error: implicit conversion from '__uint32_t' (aka 'unsigned int') to '__uint16_t' (aka 'unsigned short') changes value from 1684238190 to 28526 [-Werror,-Wconstant-conversion]
  	  buf->magic = ntohl(DCONS_MAGIC);
  		       ^~~~~~~~~~~~~~~~~~
    sys/sys/param.h:306:18: note: expanded from:
    #define ntohl(x)        __ntohl(x)
  			  ^
    ./x86/endian.h:128:20: note: expanded from:
    #define __ntohl(x)      __bswap32(x)
  			  ^
    ./x86/endian.h:78:20: note: expanded from:
  	      __bswap32_gen((__uint32_t)(x)) : __bswap32_var(x))
  			    ^
    ./x86/endian.h:68:26: note: expanded from:
  	  (((__uint32_t)__bswap16(x) << 16) | __bswap16((x) >> 16))
  				  ^
    ./x86/endian.h:75:53: note: expanded from:
  	      __bswap16_gen((__uint16_t)(x)) : __bswap16_var(x)))
  					       ~~~~~~~~~~~~~ ^
  
  This is because the __bswapXX_gen() macros (for x86) call the regular
  __bswapXX() macros.  Since the __bswapXX_gen() variants are only called
  when their arguments are constant, there is no need to do that constancy
  check recursively.  Also, it causes the above error with clang.
  
  Fix it by calling __bswap16_gen() from __bswap32_gen(), and similarly,
  __bswap32_gen() from  __bswap64_gen().
  
  While here, add extra parentheses around the __bswap16_gen() macro
  expansion, to prevent unexpected side effects.

Modified:
  head/sys/x86/include/endian.h

Modified: head/sys/x86/include/endian.h
==============================================================================
--- head/sys/x86/include/endian.h	Sat Mar 24 06:40:41 2012	(r233418)
+++ head/sys/x86/include/endian.h	Sat Mar 24 10:07:21 2012	(r233419)
@@ -63,11 +63,11 @@
 #define	BYTE_ORDER	_BYTE_ORDER
 #endif
 
-#define	__bswap16_gen(x)	(__uint16_t)((x) << 8 | (x) >> 8)
+#define	__bswap16_gen(x)	((__uint16_t)((x) << 8 | (x) >> 8))
 #define	__bswap32_gen(x)		\
-	(((__uint32_t)__bswap16(x) << 16) | __bswap16((x) >> 16))
+	(((__uint32_t)__bswap16_gen(x) << 16) | __bswap16_gen((x) >> 16))
 #define	__bswap64_gen(x)		\
-	(((__uint64_t)__bswap32(x) << 32) | __bswap32((x) >> 32))
+	(((__uint64_t)__bswap32_gen(x) << 32) | __bswap32_gen((x) >> 32))
 
 #ifdef __GNUCLIKE_BUILTIN_CONSTANT_P
 #define	__bswap16(x)				\



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201203241007.q2OA7MtS024789>