/* 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