This is the mail archive of the cygwin-cvs@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[newlib-cygwin] BSD compatibility for <machine/endian.h>


https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=76a2110b473c12eb7a9c9e5d15d54309db5f8b9c

commit 76a2110b473c12eb7a9c9e5d15d54309db5f8b9c
Author: Sebastian Huber <sebastian.huber@embedded-brains.de>
Date:   Mon Apr 18 15:29:21 2016 +0200

    BSD compatibility for <machine/endian.h>
    
    Introduce <machine/_endian.h> to let target based customization of
    <machine/endian.h> via
    
     * _LITTLE_ENDIAN,
     * _BIG_ENDIAN,
     * _PDP_ENDIAN, and
     * _BYTE_ORDER.
    
    defines.  Add definitions expected by FreeBSD to
    <machine/endian.h> like
    
     * _QUAD_HIGHWORD,
     * _QUAD_LOWWORD,
     * __bswap16(),
     * __bswap32(),
     * __bswap64(),
     * __htonl(),
     * __htons(),
     * __ntohl(), and
     * __ntohs().
    
    Also, if __BSD_VISIBLE
    
     * LITTLE_ENDIAN,
     * BIG_ENDIAN,
     * PDP_ENDIAN, and
     * BYTE_ORDER.
    
    Targets that define __machine_host_to_from_network_defined in
    <machine/_endian.h> must provide their own implementation of
    
     * __htonl(),
     * __htons(),
     * __ntohl(), and
     * __ntohs(),
    
    otherwise a default implementation is provided by <machine/endian.h>.
    In case of GCC defines to builtins are used.
    
    Signed-off-by: Sebastian Huber <sebastian.huber@embedded-brains.de>

Diff:
---
 newlib/libc/include/machine/_endian.h              | 35 +++++++++++
 newlib/libc/include/machine/endian.h               | 69 ++++++++++++++++++----
 .../machine/arm/machine/{endian.h => _endian.h}    | 17 +++---
 winsup/cygwin/include/asm/byteorder.h              | 24 +-------
 winsup/cygwin/include/endian.h                     | 19 ++++--
 winsup/cygwin/include/machine/_endian.h            | 45 ++++++++++++++
 6 files changed, 161 insertions(+), 48 deletions(-)

diff --git a/newlib/libc/include/machine/_endian.h b/newlib/libc/include/machine/_endian.h
new file mode 100644
index 0000000..92a14dc
--- /dev/null
+++ b/newlib/libc/include/machine/_endian.h
@@ -0,0 +1,35 @@
+#ifndef __MACHINE_ENDIAN_H__
+#error "must be included via <machine/endian.h>"
+#endif /* !__MACHINE_ENDIAN_H__ */
+
+#include <sys/config.h>
+
+#ifdef __PPC__
+/* Get rid of GCC builtin defines on PowerPC */
+#ifdef _BIG_ENDIAN
+#undef _BIG_ENDIAN
+#endif
+#ifdef _LITTLE_ENDIAN
+#undef _LITTLE_ENDIAN
+#endif
+#endif /* __PPC__ */
+
+#ifndef _LITTLE_ENDIAN
+#define	_LITTLE_ENDIAN	1234
+#endif
+
+#ifndef _BIG_ENDIAN
+#define	_BIG_ENDIAN	4321
+#endif
+
+#ifndef _PDP_ENDIAN
+#define	_PDP_ENDIAN	3412
+#endif
+
+#ifndef _BYTE_ORDER
+#if defined(__IEEE_LITTLE_ENDIAN) || defined(__IEEE_BYTES_LITTLE_ENDIAN)
+#define	_BYTE_ORDER	_LITTLE_ENDIAN
+#else
+#define	_BYTE_ORDER	_BIG_ENDIAN
+#endif
+#endif
diff --git a/newlib/libc/include/machine/endian.h b/newlib/libc/include/machine/endian.h
index 07ebc8f..34a5726 100644
--- a/newlib/libc/include/machine/endian.h
+++ b/newlib/libc/include/machine/endian.h
@@ -1,20 +1,69 @@
 #ifndef __MACHINE_ENDIAN_H__
+#define	__MACHINE_ENDIAN_H__
 
-#include <sys/config.h>
+#include <sys/cdefs.h>
+#include <sys/_types.h>
+#include <machine/_endian.h>
 
-#ifndef BIG_ENDIAN
-#define BIG_ENDIAN 4321
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define	_QUAD_HIGHWORD	1
+#define	_QUAD_LOWWORD	0
+#else
+#define	_QUAD_HIGHWORD	0
+#define	_QUAD_LOWWORD	1
 #endif
-#ifndef LITTLE_ENDIAN
-#define LITTLE_ENDIAN 1234
+
+#if __BSD_VISIBLE
+#define	LITTLE_ENDIAN	_LITTLE_ENDIAN
+#define	BIG_ENDIAN	_BIG_ENDIAN
+#define	PDP_ENDIAN	_PDP_ENDIAN
+#define	BYTE_ORDER	_BYTE_ORDER
 #endif
 
-#ifndef BYTE_ORDER
-#if defined(__IEEE_LITTLE_ENDIAN) || defined(__IEEE_BYTES_LITTLE_ENDIAN)
-#define BYTE_ORDER LITTLE_ENDIAN
+#ifdef __GNUC__
+#define	__bswap16(_x)	__builtin_bswap16(_x)
+#define	__bswap32(_x)	__builtin_bswap32(_x)
+#define	__bswap64(_x)	__builtin_bswap64(_x)
+#else /* __GNUC__ */
+static __inline __uint16_t
+__bswap16(__uint16_t _x)
+{
+
+	return ((__uint16_t)((_x >> 8) | ((_x << 8) & 0xff00)));
+}
+
+static __inline __uint32_t
+__bswap32(__uint32_t _x)
+{
+
+	return ((__uint32_t)((_x >> 24) | ((_x >> 8) & 0xff00) |
+	    ((_x << 8) & 0xff0000) | ((_x << 24) & 0xff000000)));
+}
+
+static __inline __uint64_t
+__bswap64(__uint64_t _x)
+{
+
+	return ((__uint64_t)((_x >> 56) | ((_x >> 40) & 0xff00) |
+	    ((_x >> 24) & 0xff0000) | ((_x >> 8) & 0xff000000) |
+	    ((_x << 8) & ((__uint64_t)0xff << 32)) |
+	    ((_x << 24) & ((__uint64_t)0xff << 40)) |
+	    ((_x << 40) & ((__uint64_t)0xff << 48)) | ((_x << 56))));
+}
+#endif /* !__GNUC__ */
+
+#ifndef __machine_host_to_from_network_defined
+#if _BYTE_ORDER == _LITTLE_ENDIAN
+#define	__htonl(_x)	__bswap32(_x)
+#define	__htons(_x)	__bswap16(_x)
+#define	__ntohl(_x)	__bswap32(_x)
+#define	__ntohs(_x)	__bswap16(_x)
 #else
-#define BYTE_ORDER BIG_ENDIAN
-#endif
+#define	__htonl(_x)	((__uint32_t)(_x))
+#define	__htons(_x)	((__uint16_t)(_x))
+#define	__ntohl(_x)	((__uint32_t)(_x))
+#define	__ntohs(_x)	((__uint16_t)(_x))
 #endif
+#endif /* __machine_host_to_from_network_defined */
 
 #endif /* __MACHINE_ENDIAN_H__ */
diff --git a/newlib/libc/machine/arm/machine/endian.h b/newlib/libc/machine/arm/machine/_endian.h
similarity index 85%
rename from newlib/libc/machine/arm/machine/endian.h
rename to newlib/libc/machine/arm/machine/_endian.h
index 035cabf..3f50a69 100644
--- a/newlib/libc/machine/arm/machine/endian.h
+++ b/newlib/libc/machine/arm/machine/_endian.h
@@ -24,17 +24,16 @@
    NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
    SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
 
-#ifndef _MACHINE_ENDIAN_H
-#define _MACHINE_ENDIAN_H
+#ifndef __MACHINE_ENDIAN_H__
+#error "must be included via <machine/endian.h>"
+#endif /* !__MACHINE_ENDIAN_H__ */
 
-/*  Code relocated from libc/sys/arm/sys/param.h.  */
-#define BIG_ENDIAN      4321
-#define LITTLE_ENDIAN   1234
+#define	_LITTLE_ENDIAN	1234
+#define	_BIG_ENDIAN	4321
+#define	_PDP_ENDIAN	3412
 
 #ifdef __ARMEB__
-#define BYTE_ORDER BIG_ENDIAN
+#define	_BYTE_ORDER	_BIG_ENDIAN
 #else
-#define BYTE_ORDER LITTLE_ENDIAN
-#endif
-
+#define	_BYTE_ORDER	_LITTLE_ENDIAN
 #endif
diff --git a/winsup/cygwin/include/asm/byteorder.h b/winsup/cygwin/include/asm/byteorder.h
index 4f5d7cb..14529bf 100644
--- a/winsup/cygwin/include/asm/byteorder.h
+++ b/winsup/cygwin/include/asm/byteorder.h
@@ -11,9 +11,8 @@ details. */
 #ifndef _I386_BYTEORDER_H
 #define _I386_BYTEORDER_H
 
-#include <_ansi.h>
 #include <stdint.h>
-#include <bits/endian.h>
+#include <machine/endian.h>
 
 #ifdef __cplusplus
 extern "C" {
@@ -28,37 +27,16 @@ extern uint16_t	ntohs(uint16_t);
 extern uint32_t	htonl(uint32_t);
 extern uint16_t	htons(uint16_t);
 
-_ELIDABLE_INLINE uint32_t __ntohl(uint32_t);
-_ELIDABLE_INLINE uint16_t __ntohs(uint16_t);
-
-_ELIDABLE_INLINE uint32_t
-__ntohl(uint32_t x)
-{
-	__asm__("bswap %0" : "=r" (x) : "0" (x));
-	return x;
-}
-
 #define __constant_ntohl(x) \
 	((uint32_t)((((uint32_t)(x) & 0x000000ffU) << 24) | \
 		   (((uint32_t)(x) & 0x0000ff00U) <<  8) | \
 		   (((uint32_t)(x) & 0x00ff0000U) >>  8) | \
 		   (((uint32_t)(x) & 0xff000000U) >> 24)))
 
-_ELIDABLE_INLINE uint16_t
-__ntohs(uint16_t x)
-{
-	__asm__("xchgb %b0,%h0"		/* swap bytes		*/
-		: "=Q" (x)
-		:  "0" (x));
-	return x;
-}
-
 #define __constant_ntohs(x) \
 	((uint16_t)((((uint16_t)(x) & 0x00ff) << 8) | \
 		   (((uint16_t)(x) & 0xff00) >> 8))) \
 
-#define __htonl(x) __ntohl(x)
-#define __htons(x) __ntohs(x)
 #define __constant_htonl(x) __constant_ntohl(x)
 #define __constant_htons(x) __constant_ntohs(x)
 
diff --git a/winsup/cygwin/include/endian.h b/winsup/cygwin/include/endian.h
index 960e61c..7ddf099 100644
--- a/winsup/cygwin/include/endian.h
+++ b/winsup/cygwin/include/endian.h
@@ -12,14 +12,21 @@ details. */
 #define _ENDIAN_H_
 
 #include <sys/config.h>
-#include <sys/cdefs.h>
-#include <bits/endian.h>
+#include <machine/endian.h>
 
 /*#ifdef  __USE_BSD*/
-# define LITTLE_ENDIAN  __LITTLE_ENDIAN
-# define BIG_ENDIAN     __BIG_ENDIAN
-# define PDP_ENDIAN     __PDP_ENDIAN
-# define BYTE_ORDER     __BYTE_ORDER
+# ifndef LITTLE_ENDIAN
+#  define LITTLE_ENDIAN __LITTLE_ENDIAN
+# endif
+# ifndef BIG_ENDIAN
+#  define BIG_ENDIAN    __BIG_ENDIAN
+# endif
+# ifndef PDP_ENDIAN
+#  define PDP_ENDIAN    __PDP_ENDIAN
+# endif
+# ifndef BYTE_ORDER
+#  define BYTE_ORDER    __BYTE_ORDER
+# endif
 /*#endif*/
 
 #if __BYTE_ORDER == __LITTLE_ENDIAN
diff --git a/winsup/cygwin/include/machine/_endian.h b/winsup/cygwin/include/machine/_endian.h
new file mode 100644
index 0000000..d878cc1
--- /dev/null
+++ b/winsup/cygwin/include/machine/_endian.h
@@ -0,0 +1,45 @@
+/* machine/_endian.h
+
+   Copyright 2005, 2010, 2011 Red Hat, Inc.
+
+This file is part of Cygwin.
+
+This software is a copyrighted work licensed under the terms of the
+Cygwin license.  Please consult the file "CYGWIN_LICENSE" for
+details. */
+
+#ifndef __MACHINE_ENDIAN_H__
+#error "must be included via <machine/endian.h>"
+#endif /* !__MACHINE_ENDIAN_H__ */
+
+#include <_ansi.h>
+#include <bits/endian.h>
+
+#define _LITTLE_ENDIAN __LITTLE_ENDIAN
+#define _BIG_ENDIAN    __BIG_ENDIAN
+#define _PDP_ENDIAN    __PDP_ENDIAN
+#define _BYTE_ORDER    __BYTE_ORDER
+
+#define __machine_host_to_from_network_defined
+
+_ELIDABLE_INLINE __uint32_t __ntohl(__uint32_t);
+_ELIDABLE_INLINE __uint16_t __ntohs(__uint16_t);
+
+_ELIDABLE_INLINE __uint32_t
+__ntohl(__uint32_t _x)
+{
+	__asm__("bswap %0" : "=r" (_x) : "0" (_x));
+	return _x;
+}
+
+_ELIDABLE_INLINE __uint16_t
+__ntohs(__uint16_t _x)
+{
+	__asm__("xchgb %b0,%h0"		/* swap bytes		*/
+		: "=Q" (_x)
+		:  "0" (_x));
+	return _x;
+}
+
+#define __htonl(_x) __ntohl(_x)
+#define __htons(_x) __ntohs(_x)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]