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