summaryrefslogtreecommitdiffstats
path: root/sys/sys
diff options
context:
space:
mode:
authored <ed@FreeBSD.org>2011-12-16 08:22:23 +0000
committered <ed@FreeBSD.org>2011-12-16 08:22:23 +0000
commit4b3687c37847ee142858d82e7d57794114046919 (patch)
tree44d66f4615638a7046bcc3ac5c293475470c222f /sys/sys
parent65b6b4fa8f3369ae8f1ddf883233883607f6abb8 (diff)
downloadFreeBSD-src-4b3687c37847ee142858d82e7d57794114046919.zip
FreeBSD-src-4b3687c37847ee142858d82e7d57794114046919.tar.gz
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
Diffstat (limited to 'sys/sys')
-rw-r--r--sys/sys/cdefs.h38
1 files changed, 18 insertions, 20 deletions
diff --git a/sys/sys/cdefs.h b/sys/sys/cdefs.h
index 784d7f0..1a87a5d 100644
--- a/sys/sys/cdefs.h
+++ b/sys/sys/cdefs.h
@@ -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
/*-
OpenPOWER on IntegriCloud