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:
parent
65b6b4fa8f
commit
4b3687c378
@ -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
|
||||
|
||||
/*-
|
||||
|
Loading…
x
Reference in New Issue
Block a user