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
 
 /*-
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to