svn commit: r228562 - head/sys/sys
Ed Schouten
ed at FreeBSD.org
Fri Dec 16 08:22:24 UTC 2011
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
/*-
More information about the svn-src-head
mailing list