[Mesa-dev] [PATCH 2/3] One definition of C99 inline/__func__ to rule them all.

Patrick Baggett baggett.patrick at gmail.com
Tue Mar 12 15:45:21 PDT 2013


On Tue, Mar 12, 2013 at 3:39 PM, <jfonseca at vmware.com> wrote:

> From: José Fonseca <jfonseca at vmware.com>
>
> We were in four already...
> ---
>  include/c99_compat.h                  |  105
> +++++++++++++++++++++++++++++++++
>  src/egl/main/eglcompiler.h            |   44 ++------------
>  src/gallium/include/pipe/p_compiler.h |   74 ++---------------------
>  src/mapi/mapi/u_compiler.h            |   26 ++------
>  src/mesa/main/compiler.h              |   56 ++----------------
>  5 files changed, 125 insertions(+), 180 deletions(-)
>  create mode 100644 include/c99_compat.h
>
> diff --git a/include/c99_compat.h b/include/c99_compat.h
> new file mode 100644
> index 0000000..39f958f
> --- /dev/null
> +++ b/include/c99_compat.h
> @@ -0,0 +1,105 @@
>
> +/**************************************************************************
> + *
> + * Copyright 2007-2013 VMware, Inc.
> + * All Rights Reserved.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the
> + * "Software"), to deal in the Software without restriction, including
> + * without limitation the rights to use, copy, modify, merge, publish,
> + * distribute, sub license, and/or sell copies of the Software, and to
> + * permit persons to whom the Software is furnished to do so, subject to
> + * the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the
> + * next paragraph) shall be included in all copies or substantial portions
> + * of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
> + * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
> + * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
> + * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF
> CONTRACT,
> + * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
> + * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
> + *
> +
> **************************************************************************/
> +
> +#ifndef _C99_COMPAT_H_
> +#define _C99_COMPAT_H_
> +
> +
> +/*
> + * C99 inline keyword
> + */
> +#ifndef inline
> +#  ifdef __cplusplus
> +     /* C++ supports inline keyword */
> +#  elif defined(__GNUC__)
> +#    define inline __inline__
> +#  elif defined(_MSC_VER)
> +#    define inline __inline
> +#  elif defined(__ICL)
> +#    define inline __inline
> +#  elif defined(__INTEL_COMPILER)
> +     /* Intel compiler supports inline keyword */
> +#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
> +#    define inline __inline
> +#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
>

Solaris Studio supports __inline and __inline__


> +     /* C99 supports inline keyword */
> +#  elif (__STDC_VERSION__ >= 199901L)
> +     /* C99 supports inline keyword */
> +#  else
> +#    define inline
> +#  endif
> +#endif
>


The order of the checks will not work as expected. Intel's compiler will
define __GNUC__, and so will clang. The check for __GNUC__ has to be the
last one.



> +
> +
> +/*
> + * C99 restrict keyword
> + *
> + * See also:
> + * -
> http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
> + */
> +#ifndef restrict
> +#  if (__STDC_VERSION__ >= 199901L)
> +     /* C99 */
> +#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> +     /* C99 */
>

Solaris Studio supports "_Restrict" when not in C99 mode as well.

#define restrict _Restrict


> +#  elif defined(__GNUC__)
> +#    define restrict __restrict__
> +#  elif defined(_MSC_VER)
> +#    define restrict __restrict
> +#  else
> +#    define restrict /* */
> +#  endif
> +#endif
> +
> +
> +/*
> + * C99 __func__ macro
> + */
> +#ifndef __func__
> +#  if (__STDC_VERSION__ >= 199901L)
> +     /* C99 */
> +#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> +     /* C99 */
>

Solaris Studio supports __FUNCTION__ when not in C99 mode.


> +#  elif defined(__GNUC__)
> +#    if __GNUC__ >= 2
> +#      define __func__ __FUNCTION__
> +#    else
> +#      define __func__ "<unknown>"
> +#    endif
> +#  elif defined(_MSC_VER)
> +#    if _MSC_VER >= 1300
> +#      define __func__ __FUNCTION__
> +#    else
> +#      define __func__ "<unknown>"
> +#    endif
> +#  else
> +#    define __func__ "<unknown>"
> +#  endif
> +#endif
> +
> +
> +#endif /* _C99_COMPAT_H_ */
> diff --git a/src/egl/main/eglcompiler.h b/src/egl/main/eglcompiler.h
> index 9823693..2499172 100644
> --- a/src/egl/main/eglcompiler.h
> +++ b/src/egl/main/eglcompiler.h
> @@ -31,6 +31,9 @@
>  #define EGLCOMPILER_INCLUDED
>
>
> +#include "c99_compat.h" /* inline, __func__, etc. */
> +
> +
>  /**
>   * Get standard integer types
>   */
> @@ -62,30 +65,7 @@
>  #endif
>
>
> -/**
> - * Function inlining
> - */
> -#ifndef inline
> -#  ifdef __cplusplus
> -     /* C++ supports inline keyword */
> -#  elif defined(__GNUC__)
> -#    define inline __inline__
> -#  elif defined(_MSC_VER)
> -#    define inline __inline
> -#  elif defined(__ICL)
> -#    define inline __inline
> -#  elif defined(__INTEL_COMPILER)
> -     /* Intel compiler supports inline keyword */
> -#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
> -#    define inline __inline
> -#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> -     /* C99 supports inline keyword */
> -#  elif (__STDC_VERSION__ >= 199901L)
> -     /* C99 supports inline keyword */
> -#  else
> -#    define inline
> -#  endif
> -#endif
> +/* XXX: Use standard `inline` keyword instead */
>  #ifndef INLINE
>  #  define INLINE inline
>  #endif
> @@ -104,21 +84,9 @@
>  #  endif
>  #endif
>
> -/**
> - * The __FUNCTION__ gcc variable is generally only used for debugging.
> - * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
> - * Don't define it if using a newer Windows compiler.
> - */
> +/* XXX: Use standard `__func__` instead */
>  #ifndef __FUNCTION__
> -# if (!defined __GNUC__) && (!defined __xlC__) && \
> -      (!defined(_MSC_VER) || _MSC_VER < 1300)
> -#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
> -    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
> -#   define __FUNCTION__ __func__
> -#  else
> -#   define __FUNCTION__ "<unknown>"
> -#  endif
> -# endif
> +#  define __FUNCTION__ __func__
>  #endif
>
>  #endif /* EGLCOMPILER_INCLUDED */
> diff --git a/src/gallium/include/pipe/p_compiler.h
> b/src/gallium/include/pipe/p_compiler.h
> index 5958333..a131969 100644
> --- a/src/gallium/include/pipe/p_compiler.h
> +++ b/src/gallium/include/pipe/p_compiler.h
> @@ -29,6 +29,8 @@
>  #define P_COMPILER_H
>
>
> +#include "c99_compat.h" /* inline, __func__, etc. */
> +
>  #include "p_config.h"
>
>  #include <stdlib.h>
> @@ -90,28 +92,7 @@ typedef unsigned char boolean;
>  #endif
>  #endif
>
> -/* Function inlining */
> -#ifndef inline
> -#  ifdef __cplusplus
> -     /* C++ supports inline keyword */
> -#  elif defined(__GNUC__)
> -#    define inline __inline__
> -#  elif defined(_MSC_VER)
> -#    define inline __inline
> -#  elif defined(__ICL)
> -#    define inline __inline
> -#  elif defined(__INTEL_COMPILER)
> -     /* Intel compiler supports inline keyword */
> -#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
> -#    define inline __inline
> -#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> -     /* C99 supports inline keyword */
> -#  elif (__STDC_VERSION__ >= 199901L)
> -     /* C99 supports inline keyword */
> -#  else
> -#    define inline
> -#  endif
> -#endif
> +/* XXX: Use standard `inline` keyword instead */
>  #ifndef INLINE
>  #  define INLINE inline
>  #endif
> @@ -127,26 +108,6 @@ typedef unsigned char boolean;
>  #  endif
>  #endif
>
> -/*
> - * Define the C99 restrict keyword.
> - *
> - * See also:
> - * -
> http://cellperformance.beyond3d.com/articles/2006/05/demystifying-the-restrict-keyword.html
> - */
> -#ifndef restrict
> -#  if (__STDC_VERSION__ >= 199901L)
> -     /* C99 */
> -#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> -     /* C99 */
> -#  elif defined(__GNUC__)
> -#    define restrict __restrict__
> -#  elif defined(_MSC_VER)
> -#    define restrict __restrict
> -#  else
> -#    define restrict /* */
> -#  endif
> -#endif
> -
>
>  /* Function visibility */
>  #ifndef PUBLIC
> @@ -160,35 +121,10 @@ typedef unsigned char boolean;
>  #endif
>
>
> -/* The __FUNCTION__ gcc variable is generally only used for debugging.
> - * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
> - */
> +/* XXX: Use standard `__func__` instead */
>  #ifndef __FUNCTION__
> -# if !defined(__GNUC__)
> -#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
> -    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
> -#   define __FUNCTION__ __func__
> -#  else
> -#   define __FUNCTION__ "<unknown>"
> -#  endif
> -# endif
> -# if defined(_MSC_VER) && _MSC_VER < 1300
> -#  define __FUNCTION__ "<unknown>"
> -# endif
> +#  define __FUNCTION__ __func__
>  #endif
> -#ifndef __func__
> -#  if (__STDC_VERSION__ >= 199901L) || \
> -      (defined(__SUNPRO_C) && defined(__C99FEATURES__))
> -       /* __func__ is part of C99 */
> -#  elif defined(_MSC_VER)
> -#    if _MSC_VER >= 1300
> -#      define __func__ __FUNCTION__
> -#    else
> -#      define __func__ "<unknown>"
> -#    endif
> -#  endif
> -#endif
> -
>
>
>  /* This should match linux gcc cdecl semantics everywhere, so that we
> diff --git a/src/mapi/mapi/u_compiler.h b/src/mapi/mapi/u_compiler.h
> index 2b019ed..f376e97 100644
> --- a/src/mapi/mapi/u_compiler.h
> +++ b/src/mapi/mapi/u_compiler.h
> @@ -1,28 +1,10 @@
>  #ifndef _U_COMPILER_H_
>  #define _U_COMPILER_H_
>
> -/* Function inlining */
> -#ifndef inline
> -#  ifdef __cplusplus
> -     /* C++ supports inline keyword */
> -#  elif defined(__GNUC__)
> -#    define inline __inline__
> -#  elif defined(_MSC_VER)
> -#    define inline __inline
> -#  elif defined(__ICL)
> -#    define inline __inline
> -#  elif defined(__INTEL_COMPILER)
> -     /* Intel compiler supports inline keyword */
> -#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
> -#    define inline __inline
> -#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> -     /* C99 supports inline keyword */
> -#  elif (__STDC_VERSION__ >= 199901L)
> -     /* C99 supports inline keyword */
> -#  else
> -#    define inline
> -#  endif
> -#endif
> +#include "c99_compat.h" /* inline, __func__, etc. */
> +
> +
> +/* XXX: Use standard `inline` keyword instead */
>  #ifndef INLINE
>  #  define INLINE inline
>  #endif
> diff --git a/src/mesa/main/compiler.h b/src/mesa/main/compiler.h
> index b22b994..4871248 100644
> --- a/src/mesa/main/compiler.h
> +++ b/src/mesa/main/compiler.h
> @@ -48,6 +48,8 @@
>  #include <float.h>
>  #include <stdarg.h>
>
> +#include "c99_compat.h" /* inline, __func__, etc. */
> +
>
>  #ifdef __cplusplus
>  extern "C" {
> @@ -111,30 +113,7 @@ extern "C" {
>
>
>
> -/**
> - * Function inlining
> - */
> -#ifndef inline
> -#  ifdef __cplusplus
> -     /* C++ supports inline keyword */
> -#  elif defined(__GNUC__)
> -#    define inline __inline__
> -#  elif defined(_MSC_VER)
> -#    define inline __inline
> -#  elif defined(__ICL)
> -#    define inline __inline
> -#  elif defined(__INTEL_COMPILER)
> -     /* Intel compiler supports inline keyword */
> -#  elif defined(__WATCOMC__) && (__WATCOMC__ >= 1100)
> -#    define inline __inline
> -#  elif defined(__SUNPRO_C) && defined(__C99FEATURES__)
> -     /* C99 supports inline keyword */
> -#  elif (__STDC_VERSION__ >= 199901L)
> -     /* C99 supports inline keyword */
> -#  else
> -#    define inline
> -#  endif
> -#endif
> +/* XXX: Use standard `inline` keyword instead */
>  #ifndef INLINE
>  #  define INLINE inline
>  #endif
> @@ -177,35 +156,10 @@ extern "C" {
>  #  endif
>  #endif
>
> -/**
> - * The __FUNCTION__ gcc variable is generally only used for debugging.
> - * If we're not using gcc, define __FUNCTION__ as a cpp symbol here.
> - * Don't define it if using a newer Windows compiler.
> - */
> +/* XXX: Use standard `__func__` instead */
>  #ifndef __FUNCTION__
> -# if !defined(__GNUC__) && !defined(__xlC__) &&        \
> -      (!defined(_MSC_VER) || _MSC_VER < 1300)
> -#  if (__STDC_VERSION__ >= 199901L) /* C99 */ || \
> -    (defined(__SUNPRO_C) && defined(__C99FEATURES__))
> -#   define __FUNCTION__ __func__
> -#  else
> -#   define __FUNCTION__ "<unknown>"
> -#  endif
> -# endif
> +#  define __FUNCTION__ __func__
>  #endif
> -#ifndef __func__
> -#  if (__STDC_VERSION__ >= 199901L) || \
> -      (defined(__SUNPRO_C) && defined(__C99FEATURES__))
> -       /* __func__ is part of C99 */
> -#  elif defined(_MSC_VER)
> -#    if _MSC_VER >= 1300
> -#      define __func__ __FUNCTION__
> -#    else
> -#      define __func__ "<unknown>"
> -#    endif
> -#  endif
> -#endif
> -
>
>  /**
>   * Either define MESA_BIG_ENDIAN or MESA_LITTLE_ENDIAN, and CPU_TO_LE32.
> --
> 1.7.9.5
>
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.freedesktop.org/archives/mesa-dev/attachments/20130312/6b2d1a22/attachment-0001.html>


More information about the mesa-dev mailing list