79 lines
1.7 KiB
C
79 lines
1.7 KiB
C
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
// Copyright The Music Player Daemon Project
|
|
|
|
#ifndef COMPILER_H
|
|
#define COMPILER_H
|
|
|
|
#define GCC_MAKE_VERSION(major, minor, patchlevel) ((major) * 10000 + (minor) * 100 + patchlevel)
|
|
|
|
#ifdef __GNUC__
|
|
#define GCC_VERSION GCC_MAKE_VERSION(__GNUC__, __GNUC_MINOR__, __GNUC_PATCHLEVEL__)
|
|
#else
|
|
#define GCC_VERSION 0
|
|
#endif
|
|
|
|
#ifdef __clang__
|
|
# define CLANG_VERSION GCC_MAKE_VERSION(__clang_major__, __clang_minor__, __clang_patchlevel__)
|
|
#elif defined(__GNUC__)
|
|
# define CLANG_VERSION 0
|
|
#endif
|
|
|
|
/**
|
|
* Are we building with the specified version of gcc (not clang or any
|
|
* other compiler) or newer?
|
|
*/
|
|
#define GCC_CHECK_VERSION(major, minor) \
|
|
(CLANG_VERSION == 0 && \
|
|
GCC_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
|
|
|
/**
|
|
* Are we building with the specified version of clang or newer?
|
|
*/
|
|
#define CLANG_CHECK_VERSION(major, minor) \
|
|
(CLANG_VERSION >= GCC_MAKE_VERSION(major, minor, 0))
|
|
|
|
#ifdef __GNUC__
|
|
|
|
/* GCC 4.x */
|
|
|
|
#define gcc_malloc __attribute__((malloc))
|
|
#define gcc_pure __attribute__((pure))
|
|
|
|
#define gcc_visibility_default __attribute__((visibility("default")))
|
|
|
|
#else
|
|
|
|
/* generic C compiler */
|
|
|
|
#define gcc_malloc
|
|
#define gcc_pure
|
|
|
|
#define gcc_visibility_default
|
|
|
|
#endif
|
|
|
|
#ifdef __GNUC__
|
|
#define gcc_fallthrough __attribute__((fallthrough))
|
|
#else
|
|
#define gcc_fallthrough
|
|
#endif
|
|
|
|
#ifndef __cplusplus
|
|
/* plain C99 has "restrict" */
|
|
#define gcc_restrict restrict
|
|
#elif defined(__GNUC__)
|
|
/* "__restrict__" is a GCC extension for C++ */
|
|
#define gcc_restrict __restrict__
|
|
#else
|
|
/* disable it on other compilers */
|
|
#define gcc_restrict
|
|
#endif
|
|
|
|
#if defined(__GNUC__) || defined(__clang__)
|
|
#define gcc_unreachable() __builtin_unreachable()
|
|
#else
|
|
#define gcc_unreachable()
|
|
#endif
|
|
|
|
#endif
|