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
This commit is contained in:
ed 2011-12-16 08:22:23 +00:00
parent 65b6b4fa8f
commit 4b3687c378

View File

@ -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
/*-