blob: 87ac0c4aeda035fd010d00cfd379ccc0002446ab [file] [log] [blame]
/* SPDX-License-Identifier: BSD-3-Clause OR GPL-2.0-only */
#ifndef _COMMONLIB_BSD_COMPILER_H_
#define _COMMONLIB_BSD_COMPILER_H_
#ifndef __packed
#if defined(__WIN32) || defined(__WIN64)
#define __packed __attribute__((__gcc_struct__, __packed__))
#else
#define __packed __attribute__((__packed__))
#endif
#endif
#ifndef __aligned
#define __aligned(x) __attribute__((__aligned__(x)))
#endif
/*
* Because there may be variables/parameters whose name contains "__unused" in
* header files of libc, namely musl, names consistent with the ones in the
* Linux kernel may be a better choice.
*/
/*
* This is used to mark identifiers unused in all conditions, e.g. a parameter
* completely unused in all code branch, only present to fit an API.
*/
#ifndef __always_unused
#define __always_unused __attribute__((__unused__))
#endif
/*
* This is used to mark identifiers unused in some conditions, e.g. a parameter
* only unused in some code branches, a global variable only accessed with code
* being conditionally preprocessed, etc.
*/
#ifndef __maybe_unused
#define __maybe_unused __attribute__((__unused__))
#endif
#ifndef __must_check
#define __must_check __attribute__((__warn_unused_result__))
#endif
#ifndef __weak
#define __weak __attribute__((__weak__))
#endif
#ifndef __noreturn
#define __noreturn __attribute__((__noreturn__))
#endif
#ifndef __always_inline
#define __always_inline inline __attribute__((__always_inline__))
#endif
#ifndef __fallthrough
#define __fallthrough __attribute__((__fallthrough__))
#endif
/*
* This evaluates to the type of the first expression, unless that is constant
* in which case it evaluates to the type of the second. This is useful when
* assigning macro parameters to temporary variables, because that would
* normally circumvent the special loosened type promotion rules for integer
* literals. By using this macro, the promotion can happen at the time the
* literal is assigned to the temporary variable. If the literal doesn't fit in
* the chosen type, -Werror=overflow will catch it, so this should be safe.
*/
#define __TYPEOF_UNLESS_CONST(expr, fallback_expr) __typeof__( \
__builtin_choose_expr(__builtin_constant_p(expr), fallback_expr, expr))
/* This creates a unique local variable name for use in macros. */
#define __TMPNAME_3(i) __tmpname_##i
#define __TMPNAME_2(i) __TMPNAME_3(i)
#define __TMPNAME __TMPNAME_2(__COUNTER__)
#endif