xref: /third_party/pulseaudio/src/pulse/gccmacro.h (revision 53a5a1b3)
153a5a1b3Sopenharmony_ci#ifndef foopulsegccmacrohfoo
253a5a1b3Sopenharmony_ci#define foopulsegccmacrohfoo
353a5a1b3Sopenharmony_ci
453a5a1b3Sopenharmony_ci/***
553a5a1b3Sopenharmony_ci  This file is part of PulseAudio.
653a5a1b3Sopenharmony_ci
753a5a1b3Sopenharmony_ci  Copyright 2004-2006 Lennart Poettering
853a5a1b3Sopenharmony_ci
953a5a1b3Sopenharmony_ci  PulseAudio is free software; you can redistribute it and/or modify
1053a5a1b3Sopenharmony_ci  it under the terms of the GNU Lesser General Public License as published
1153a5a1b3Sopenharmony_ci  by the Free Software Foundation; either version 2.1 of the License,
1253a5a1b3Sopenharmony_ci  or (at your option) any later version.
1353a5a1b3Sopenharmony_ci
1453a5a1b3Sopenharmony_ci  PulseAudio is distributed in the hope that it will be useful, but
1553a5a1b3Sopenharmony_ci  WITHOUT ANY WARRANTY; without even the implied warranty of
1653a5a1b3Sopenharmony_ci  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
1753a5a1b3Sopenharmony_ci  General Public License for more details.
1853a5a1b3Sopenharmony_ci
1953a5a1b3Sopenharmony_ci  You should have received a copy of the GNU Lesser General Public License
2053a5a1b3Sopenharmony_ci  along with PulseAudio; if not, see <http://www.gnu.org/licenses/>.
2153a5a1b3Sopenharmony_ci***/
2253a5a1b3Sopenharmony_ci
2353a5a1b3Sopenharmony_ci/** \file
2453a5a1b3Sopenharmony_ci * GCC attribute macros */
2553a5a1b3Sopenharmony_ci
2653a5a1b3Sopenharmony_ci#if defined(__GNUC__)
2753a5a1b3Sopenharmony_ci#ifdef __MINGW32__
2853a5a1b3Sopenharmony_ci#include <stdio.h>
2953a5a1b3Sopenharmony_ci#define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (__MINGW_PRINTF_FORMAT, a, b)))
3053a5a1b3Sopenharmony_ci#else
3153a5a1b3Sopenharmony_ci#define PA_GCC_PRINTF_ATTR(a,b) __attribute__ ((format (printf, a, b)))
3253a5a1b3Sopenharmony_ci#endif
3353a5a1b3Sopenharmony_ci#else
3453a5a1b3Sopenharmony_ci/** If we're in GNU C, use some magic for detecting invalid format strings */
3553a5a1b3Sopenharmony_ci#define PA_GCC_PRINTF_ATTR(a,b)
3653a5a1b3Sopenharmony_ci#endif
3753a5a1b3Sopenharmony_ci
3853a5a1b3Sopenharmony_ci#if defined(__GNUC__) && (__GNUC__ >= 4)
3953a5a1b3Sopenharmony_ci#define PA_GCC_SENTINEL __attribute__ ((sentinel))
4053a5a1b3Sopenharmony_ci#else
4153a5a1b3Sopenharmony_ci/** Macro for usage of GCC's sentinel compilation warnings */
4253a5a1b3Sopenharmony_ci#define PA_GCC_SENTINEL
4353a5a1b3Sopenharmony_ci#endif
4453a5a1b3Sopenharmony_ci
4553a5a1b3Sopenharmony_ci#ifdef __GNUC__
4653a5a1b3Sopenharmony_ci#define PA_GCC_NORETURN __attribute__((noreturn))
4753a5a1b3Sopenharmony_ci#else
4853a5a1b3Sopenharmony_ci/** Macro for no-return functions */
4953a5a1b3Sopenharmony_ci#define PA_GCC_NORETURN
5053a5a1b3Sopenharmony_ci#endif
5153a5a1b3Sopenharmony_ci
5253a5a1b3Sopenharmony_ci#ifdef __GNUC__
5353a5a1b3Sopenharmony_ci#define PA_GCC_UNUSED __attribute__ ((unused))
5453a5a1b3Sopenharmony_ci#else
5553a5a1b3Sopenharmony_ci/** Macro for not used function, variable or parameter */
5653a5a1b3Sopenharmony_ci#define PA_GCC_UNUSED
5753a5a1b3Sopenharmony_ci#endif
5853a5a1b3Sopenharmony_ci
5953a5a1b3Sopenharmony_ci#ifdef __GNUC__
6053a5a1b3Sopenharmony_ci#define PA_GCC_DESTRUCTOR __attribute__ ((destructor))
6153a5a1b3Sopenharmony_ci#else
6253a5a1b3Sopenharmony_ci/** Call this function when process terminates */
6353a5a1b3Sopenharmony_ci#define PA_GCC_DESTRUCTOR
6453a5a1b3Sopenharmony_ci#endif
6553a5a1b3Sopenharmony_ci
6653a5a1b3Sopenharmony_ci#ifndef PA_GCC_PURE
6753a5a1b3Sopenharmony_ci#ifdef __GNUC__
6853a5a1b3Sopenharmony_ci#define PA_GCC_PURE __attribute__ ((pure))
6953a5a1b3Sopenharmony_ci#else
7053a5a1b3Sopenharmony_ci/** This function's return value depends only the arguments list and global state **/
7153a5a1b3Sopenharmony_ci#define PA_GCC_PURE
7253a5a1b3Sopenharmony_ci#endif
7353a5a1b3Sopenharmony_ci#endif
7453a5a1b3Sopenharmony_ci
7553a5a1b3Sopenharmony_ci#ifndef PA_GCC_CONST
7653a5a1b3Sopenharmony_ci#ifdef __GNUC__
7753a5a1b3Sopenharmony_ci#define PA_GCC_CONST __attribute__ ((const))
7853a5a1b3Sopenharmony_ci#else
7953a5a1b3Sopenharmony_ci/** This function's return value depends only the arguments list (stricter version of PA_GCC_PURE) **/
8053a5a1b3Sopenharmony_ci#define PA_GCC_CONST
8153a5a1b3Sopenharmony_ci#endif
8253a5a1b3Sopenharmony_ci#endif
8353a5a1b3Sopenharmony_ci
8453a5a1b3Sopenharmony_ci#ifndef PA_GCC_DEPRECATED
8553a5a1b3Sopenharmony_ci#ifdef __GNUC__
8653a5a1b3Sopenharmony_ci#define PA_GCC_DEPRECATED __attribute__ ((deprecated))
8753a5a1b3Sopenharmony_ci#else
8853a5a1b3Sopenharmony_ci/** This function is deprecated **/
8953a5a1b3Sopenharmony_ci#define PA_GCC_DEPRECATED
9053a5a1b3Sopenharmony_ci#endif
9153a5a1b3Sopenharmony_ci#endif
9253a5a1b3Sopenharmony_ci
9353a5a1b3Sopenharmony_ci#ifndef PA_GCC_PACKED
9453a5a1b3Sopenharmony_ci#ifdef __GNUC__
9553a5a1b3Sopenharmony_ci#define PA_GCC_PACKED __attribute__ ((packed))
9653a5a1b3Sopenharmony_ci#else
9753a5a1b3Sopenharmony_ci/** Structure shall be packed in memory **/
9853a5a1b3Sopenharmony_ci#define PA_GCC_PACKED
9953a5a1b3Sopenharmony_ci#endif
10053a5a1b3Sopenharmony_ci#endif
10153a5a1b3Sopenharmony_ci
10253a5a1b3Sopenharmony_ci#ifndef PA_GCC_ALLOC_SIZE
10353a5a1b3Sopenharmony_ci#if defined(__GNUC__) && (__GNUC__ >= 4) && (__GNUC_MINOR__ >= 3)
10453a5a1b3Sopenharmony_ci#define PA_GCC_ALLOC_SIZE(x) __attribute__ ((__alloc_size__(x)))
10553a5a1b3Sopenharmony_ci#define PA_GCC_ALLOC_SIZE2(x,y) __attribute__ ((__alloc_size__(x,y)))
10653a5a1b3Sopenharmony_ci#else
10753a5a1b3Sopenharmony_ci/** Macro for usage of GCC's alloc_size attribute */
10853a5a1b3Sopenharmony_ci#define PA_GCC_ALLOC_SIZE(x)
10953a5a1b3Sopenharmony_ci/** Macro for usage of GCC's alloc_size attribute */
11053a5a1b3Sopenharmony_ci#define PA_GCC_ALLOC_SIZE2(x,y)
11153a5a1b3Sopenharmony_ci#endif
11253a5a1b3Sopenharmony_ci#endif
11353a5a1b3Sopenharmony_ci
11453a5a1b3Sopenharmony_ci#ifndef PA_GCC_MALLOC
11553a5a1b3Sopenharmony_ci#ifdef __GNUC__
11653a5a1b3Sopenharmony_ci#define PA_GCC_MALLOC __attribute__ ((malloc))
11753a5a1b3Sopenharmony_ci#else
11853a5a1b3Sopenharmony_ci/** Macro for usage of GCC's malloc attribute */
11953a5a1b3Sopenharmony_ci#define PA_GCC_MALLOC
12053a5a1b3Sopenharmony_ci#endif
12153a5a1b3Sopenharmony_ci#endif
12253a5a1b3Sopenharmony_ci
12353a5a1b3Sopenharmony_ci#ifndef PA_GCC_WEAKREF
12453a5a1b3Sopenharmony_ci#if defined(__GNUC__) && defined(__ELF__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ > 1)) || (__GNUC__ > 4))
12553a5a1b3Sopenharmony_ci/** Macro for usage of GCC's weakref attribute */
12653a5a1b3Sopenharmony_ci#define PA_GCC_WEAKREF(x) __attribute__((weakref(#x)))
12753a5a1b3Sopenharmony_ci#endif
12853a5a1b3Sopenharmony_ci#endif
12953a5a1b3Sopenharmony_ci
13053a5a1b3Sopenharmony_ci#ifndef PA_LIKELY
13153a5a1b3Sopenharmony_ci#ifdef __GNUC__
13253a5a1b3Sopenharmony_ci#define PA_LIKELY(x) (__builtin_expect(!!(x),1))
13353a5a1b3Sopenharmony_ci#define PA_UNLIKELY(x) (__builtin_expect(!!(x),0))
13453a5a1b3Sopenharmony_ci#else
13553a5a1b3Sopenharmony_ci#define PA_LIKELY(x) (x)
13653a5a1b3Sopenharmony_ci#define PA_UNLIKELY(x) (x)
13753a5a1b3Sopenharmony_ci#endif
13853a5a1b3Sopenharmony_ci#endif
13953a5a1b3Sopenharmony_ci
14053a5a1b3Sopenharmony_ci#ifdef __GNUC__
14153a5a1b3Sopenharmony_ci#define PA_CLAMP(x, low, high)                                          \
14253a5a1b3Sopenharmony_ci    __extension__ ({                                                    \
14353a5a1b3Sopenharmony_ci            typeof(x) _x = (x);                                         \
14453a5a1b3Sopenharmony_ci            typeof(low) _low = (low);                                   \
14553a5a1b3Sopenharmony_ci            typeof(high) _high = (high);                                \
14653a5a1b3Sopenharmony_ci            ((_x > _high) ? _high : ((_x < _low) ? _low : _x));         \
14753a5a1b3Sopenharmony_ci        })
14853a5a1b3Sopenharmony_ci#else
14953a5a1b3Sopenharmony_ci#define PA_CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
15053a5a1b3Sopenharmony_ci#endif
15153a5a1b3Sopenharmony_ci
15253a5a1b3Sopenharmony_ci#ifdef __GNUC__
15353a5a1b3Sopenharmony_ci#define PA_CLAMP_UNLIKELY(x, low, high)                                 \
15453a5a1b3Sopenharmony_ci    __extension__ ({                                                    \
15553a5a1b3Sopenharmony_ci            typeof(x) _x = (x);                                         \
15653a5a1b3Sopenharmony_ci            typeof(low) _low = (low);                                   \
15753a5a1b3Sopenharmony_ci            typeof(high) _high = (high);                                \
15853a5a1b3Sopenharmony_ci            (PA_UNLIKELY(_x > _high) ? _high : (PA_UNLIKELY(_x < _low) ? _low : _x)); \
15953a5a1b3Sopenharmony_ci        })
16053a5a1b3Sopenharmony_ci#else
16153a5a1b3Sopenharmony_ci#define PA_CLAMP_UNLIKELY(x, low, high) (PA_UNLIKELY((x) > (high)) ? (high) : (PA_UNLIKELY((x) < (low)) ? (low) : (x)))
16253a5a1b3Sopenharmony_ci#endif
16353a5a1b3Sopenharmony_ci
16453a5a1b3Sopenharmony_ci/* We don't define a PA_CLAMP_LIKELY here, because it doesn't really
16553a5a1b3Sopenharmony_ci * make sense: we cannot know if it is more likely that the value is
16653a5a1b3Sopenharmony_ci * lower or greater than the boundaries. */
16753a5a1b3Sopenharmony_ci
16853a5a1b3Sopenharmony_ci#endif
169