From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 13425 invoked by alias); 20 Apr 2016 08:50:59 -0000 Mailing-List: contact newlib-cvs-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: newlib-cvs-owner@sourceware.org Received: (qmail 13342 invoked by uid 9078); 20 Apr 2016 08:50:58 -0000 Date: Wed, 20 Apr 2016 08:50:00 -0000 Message-ID: <20160420085058.13339.qmail@sourceware.org> Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: Corinna Vinschen To: cygwin-cvs@sourceware.org, newlib-cvs@sourceware.org Subject: [newlib-cygwin] BSD compatibility for X-Act-Checkin: newlib-cygwin X-Git-Author: Sebastian Huber X-Git-Refname: refs/heads/master X-Git-Oldrev: 7a5b4524431110fde4e9336f64ade73ab2c26b6b X-Git-Newrev: 76a2110b473c12eb7a9c9e5d15d54309db5f8b9c X-SW-Source: 2016-q2/txt/msg00035.txt.bz2 https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;h=76a2110b473c12eb7a9c9e5d15d54309db5f8b9c commit 76a2110b473c12eb7a9c9e5d15d54309db5f8b9c Author: Sebastian Huber Date: Mon Apr 18 15:29:21 2016 +0200 BSD compatibility for Introduce to let target based customization of via * _LITTLE_ENDIAN, * _BIG_ENDIAN, * _PDP_ENDIAN, and * _BYTE_ORDER. defines. Add definitions expected by FreeBSD to 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 must provide their own implementation of * __htonl(), * __htons(), * __ntohl(), and * __ntohs(), otherwise a default implementation is provided by . In case of GCC defines to builtins are used. Signed-off-by: Sebastian Huber 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 " +#endif /* !__MACHINE_ENDIAN_H__ */ + +#include + +#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 +#include +#include +#include -#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 " +#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 -#include +#include #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 -#include -#include +#include /*#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 " +#endif /* !__MACHINE_ENDIAN_H__ */ + +#include <_ansi.h> +#include + +#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)