Date: Fri, 16 Dec 2011 08:22:24 +0000 (UTC) From: Ed Schouten <ed@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r228562 - head/sys/sys Message-ID: <201112160822.pBG8MODA092847@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ed Date: Fri Dec 16 08:22:23 2011 New Revision: 228562 URL: http://svn.freebsd.org/changeset/base/228562 Log: Process a lot of feedback from bde@ on <sys/cdefs.h>: - Add __alignof() for non-GCC and GCC < 2.95. - Simply implement the C1X keywords on top of the existing __macros. - Add struct __hack to _Static_assert to require consumers to add a semicolon. - Add an extra underscore to __assert_ to allow it to be combined with locally defined versions of CTASSERT in the tree. - Add proper casts to __offsetof() to make it work for cases where sizeof(size_t) != sizeof(uintptr_t). - Globally replace size_t and uintptr_t by __size_t and __uintptr_t. This removes the dependency on <sys/types.h> / <stdint.h>. Practically any header file ends up including <machines/_types.h> somehow. - Change argument names of macros to match with the rest of the file. MFC after: 3 months Modified: head/sys/sys/cdefs.h Modified: head/sys/sys/cdefs.h ============================================================================== --- head/sys/sys/cdefs.h Fri Dec 16 02:09:51 2011 (r228561) +++ head/sys/sys/cdefs.h Fri Dec 16 08:22:23 2011 (r228562) @@ -218,6 +218,10 @@ #endif #endif +#if !__GNUC_PREREQ__(2, 95) +#define __alignof(x) __offsetof(struct { char __a; x __b; }, __b) +#endif + /* * Keywords added in C1X. */ @@ -230,24 +234,17 @@ #elif defined(__STDC_VERSION__) && __STDC_VERSION__ > 201000L /* Do nothing. They are language keywords. */ #else -/* Not supported. Implement them manually. */ -#ifdef __GNUC__ -#define _Alignas(e) __attribute__((__aligned__(e))) -#define _Alignof(e) __alignof__(e) -#define _Noreturn __attribute__((__noreturn__)) +/* Not supported. Implement them using our versions. */ +#define _Alignas(x) __aligned(x) +#define _Alignof(x) __alignof(x) +#define _Noreturn __dead2 #define _Thread_local __thread -#else -#define _Alignas(e) -#define _Alignof(e) __offsetof(struct { char __a; e __b; }, __b) -#define _Noreturn -#define _Thread_local -#endif #ifdef __COUNTER__ -#define _Static_assert(e, s) __Static_assert(e, __COUNTER__) -#define __Static_assert(e, c) ___Static_assert(e, c) -#define ___Static_assert(e, c) typedef char __assert ## c[(e) ? 1 : -1] +#define _Static_assert(x, y) __Static_assert(x, __COUNTER__) +#define __Static_assert(x, y) ___Static_assert(x, y) +#define ___Static_assert(x, y) typedef char __assert_ ## y[(x) ? 1 : -1] #else -#define _Static_assert(e, s) +#define _Static_assert(x, y) struct __hack #endif #endif @@ -363,10 +360,11 @@ #define __offsetof(type, field) __builtin_offsetof(type, field) #else #ifndef __cplusplus -#define __offsetof(type, field) ((size_t)(&((type *)0)->field)) +#define __offsetof(type, field) \ + ((__size_t)(__uintptr_t)((const volatile void *)&((type *)0)->member)) #else #define __offsetof(type, field) \ - (__offsetof__ (reinterpret_cast <size_t> \ + (__offsetof__ (reinterpret_cast <__size_t> \ (&reinterpret_cast <const volatile char &> \ (static_cast<type *> (0)->field)))) #endif @@ -495,15 +493,15 @@ #endif #ifndef __DECONST -#define __DECONST(type, var) ((type)(uintptr_t)(const void *)(var)) +#define __DECONST(type, var) ((type)(__uintptr_t)(const void *)(var)) #endif #ifndef __DEVOLATILE -#define __DEVOLATILE(type, var) ((type)(uintptr_t)(volatile void *)(var)) +#define __DEVOLATILE(type, var) ((type)(__uintptr_t)(volatile void *)(var)) #endif #ifndef __DEQUALIFY -#define __DEQUALIFY(type, var) ((type)(uintptr_t)(const volatile void *)(var)) +#define __DEQUALIFY(type, var) ((type)(__uintptr_t)(const volatile void *)(var)) #endif /*-
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201112160822.pBG8MODA092847>