[PATCH:x11proto] Use clang's __has_attribute to check for attribute support

Jeremy Huddleston Sequoia jeremyhu at apple.com
Thu Jul 31 16:04:07 PDT 2014


Looks good to me.

Reviewed-by: Jeremy Huddleston Sequoia <jeremyhu at apple.com>

> On Jul 31, 2014, at 15:26, Alan Coopersmith <alan.coopersmith at oracle.com> wrote:
> 
> Hopefully other compilers will start adopting this so we don't have to
> maintain ever growing matrixes of compiler/version checks for all the
> attributes we use.
> 
> Signed-off-by: Alan Coopersmith <alan.coopersmith at oracle.com>
> ---
> Xfuncproto.h.in |   30 +++++++++++++++++++++---------
> 1 file changed, 21 insertions(+), 9 deletions(-)
> 
> diff --git a/Xfuncproto.h.in b/Xfuncproto.h.in
> index 608728f..e9e5e71 100644
> --- a/Xfuncproto.h.in
> +++ b/Xfuncproto.h.in
> @@ -75,15 +75,21 @@ in this Software without prior written authorization from The Open Group.
> #endif
> #endif /* _XFUNCPROTOBEGIN */
> 
> +/* http://clang.llvm.org/docs/LanguageExtensions.html#has-attribute */
> +#ifndef __has_attribute
> +# define __has_attribute(x) 0  /* Compatibility with non-clang compilers. */
> +#endif
> +
> /* Added in X11R6.9, so available in any version of modular xproto */
> -#if defined(__GNUC__) && (__GNUC__ >= 4)
> +#if __has_attribute(__sentinel__) || (defined(__GNUC__) && (__GNUC__ >= 4))
> # define _X_SENTINEL(x) __attribute__ ((__sentinel__(x)))
> #else
> # define _X_SENTINEL(x)
> #endif /* GNUC >= 4 */
> 
> /* Added in X11R6.9, so available in any version of modular xproto */
> -#if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__CYGWIN__) && !defined(__MINGW32__)
> +#if (__has_attribute(visibility) || (defined(__GNUC__) && (__GNUC__ >= 4))) \
> +    && !defined(__CYGWIN__) && !defined(__MINGW32__)
> # define _X_EXPORT      __attribute__((visibility("default")))
> # define _X_HIDDEN      __attribute__((visibility("hidden")))
> # define _X_INTERNAL    __attribute__((visibility("internal")))
> @@ -109,14 +115,16 @@ in this Software without prior written authorization from The Open Group.
> 
> /* Bulk branch prediction hints via marking error path functions as "cold" */
> /* requires xproto >= 7.0.25 */
> -#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403) /* 4.3+ */
> +#if __has_attribute(__cold__) || \
> +    (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 403)) /* 4.3+ */
> # define _X_COLD __attribute__((__cold__))
> #else
> # define _X_COLD /* nothing */
> #endif
> 
> /* Added in X11R6.9, so available in any version of modular xproto */
> -#if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
> +#if __has_attribute(deprecated) \
> +    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 301)) \
>     || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x5130))
> # define _X_DEPRECATED  __attribute__((deprecated))
> #else /* not gcc >= 3.1 */
> @@ -124,15 +132,17 @@ in this Software without prior written authorization from The Open Group.
> #endif
> 
> /* requires xproto >= 7.0.17 */
> -#if (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \
> -	|| (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
> +#if __has_attribute(noreturn) \
> +    || (defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)) \
> +    || (defined(__SUNPRO_C) && (__SUNPRO_C >= 0x590))
> # define _X_NORETURN __attribute((noreturn))
> #else
> # define _X_NORETURN
> #endif /* GNUC  */
> 
> /* Added in X11R6.9, so available in any version of modular xproto */
> -#if defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203)
> +#if __has_attribute(__format__) \
> +    || defined(__GNUC__) && ((__GNUC__ * 100 + __GNUC_MINOR__) >= 203)
> # define _X_ATTRIBUTE_PRINTF(x,y) __attribute__((__format__(__printf__,x,y)))
> #else /* not gcc >= 2.3 */
> # define _X_ATTRIBUTE_PRINTF(x,y)
> @@ -141,14 +151,16 @@ in this Software without prior written authorization from The Open Group.
> /* requires xproto >= 7.0.22 - since this uses either gcc or C99 variable
>    argument macros, must be only used inside #ifdef _X_NONNULL guards, as
>    many legacy X clients are compiled in C89 mode still. */
> -#if defined(__GNUC__) &&  ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303)
> +#if __has_attribute(nonnull) \
> +    || defined(__GNUC__) &&  ((__GNUC__ * 100 + __GNUC_MINOR__) >= 303)
> #define _X_NONNULL(args...)  __attribute__((nonnull(args)))
> #elif defined(__STDC_VERSION__) && (__STDC_VERSION__ - 0 >= 199901L) /* C99 */
> #define _X_NONNULL(...)  /* */
> #endif
> 
> /* requires xproto >= 7.0.22 */
> -#if defined(__GNUC__) &&  ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)
> +#if __has_attribute(__unused__) \
> +    || defined(__GNUC__) &&  ((__GNUC__ * 100 + __GNUC_MINOR__) >= 205)
> #define _X_UNUSED  __attribute__((__unused__))
> #else
> #define _X_UNUSED  /* */
> -- 
> 1.7.9.2
> 

-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4109 bytes
Desc: not available
URL: <http://lists.x.org/archives/xorg-devel/attachments/20140731/f9a73b78/attachment.bin>


More information about the xorg-devel mailing list