1*1b481fc3SMaciej Żenczykowski /* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */ 2*1b481fc3SMaciej Żenczykowski #ifndef _LINUX_STDDEF_H 3*1b481fc3SMaciej Żenczykowski #define _LINUX_STDDEF_H 4*1b481fc3SMaciej Żenczykowski 5*1b481fc3SMaciej Żenczykowski 6*1b481fc3SMaciej Żenczykowski 7*1b481fc3SMaciej Żenczykowski #ifndef __always_inline 8*1b481fc3SMaciej Żenczykowski #define __always_inline __inline__ 9*1b481fc3SMaciej Żenczykowski #endif 10*1b481fc3SMaciej Żenczykowski 11*1b481fc3SMaciej Żenczykowski /** 12*1b481fc3SMaciej Żenczykowski * __struct_group() - Create a mirrored named and anonyomous struct 13*1b481fc3SMaciej Żenczykowski * 14*1b481fc3SMaciej Żenczykowski * @TAG: The tag name for the named sub-struct (usually empty) 15*1b481fc3SMaciej Żenczykowski * @NAME: The identifier name of the mirrored sub-struct 16*1b481fc3SMaciej Żenczykowski * @ATTRS: Any struct attributes (usually empty) 17*1b481fc3SMaciej Żenczykowski * @MEMBERS: The member declarations for the mirrored structs 18*1b481fc3SMaciej Żenczykowski * 19*1b481fc3SMaciej Żenczykowski * Used to create an anonymous union of two structs with identical layout 20*1b481fc3SMaciej Żenczykowski * and size: one anonymous and one named. The former's members can be used 21*1b481fc3SMaciej Żenczykowski * normally without sub-struct naming, and the latter can be used to 22*1b481fc3SMaciej Żenczykowski * reason about the start, end, and size of the group of struct members. 23*1b481fc3SMaciej Żenczykowski * The named struct can also be explicitly tagged for layer reuse, as well 24*1b481fc3SMaciej Żenczykowski * as both having struct attributes appended. 25*1b481fc3SMaciej Żenczykowski */ 26*1b481fc3SMaciej Żenczykowski #define __struct_group(TAG, NAME, ATTRS, MEMBERS...) \ 27*1b481fc3SMaciej Żenczykowski union { \ 28*1b481fc3SMaciej Żenczykowski struct { MEMBERS } ATTRS; \ 29*1b481fc3SMaciej Żenczykowski struct TAG { MEMBERS } ATTRS NAME; \ 30*1b481fc3SMaciej Żenczykowski } 31*1b481fc3SMaciej Żenczykowski 32*1b481fc3SMaciej Żenczykowski /** 33*1b481fc3SMaciej Żenczykowski * __DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union 34*1b481fc3SMaciej Żenczykowski * 35*1b481fc3SMaciej Żenczykowski * @TYPE: The type of each flexible array element 36*1b481fc3SMaciej Żenczykowski * @NAME: The name of the flexible array member 37*1b481fc3SMaciej Żenczykowski * 38*1b481fc3SMaciej Żenczykowski * In order to have a flexible array member in a union or alone in a 39*1b481fc3SMaciej Żenczykowski * struct, it needs to be wrapped in an anonymous struct with at least 1 40*1b481fc3SMaciej Żenczykowski * named member, but that member can be empty. 41*1b481fc3SMaciej Żenczykowski */ 42*1b481fc3SMaciej Żenczykowski #define __DECLARE_FLEX_ARRAY(TYPE, NAME) \ 43*1b481fc3SMaciej Żenczykowski struct { \ 44*1b481fc3SMaciej Żenczykowski struct { } __empty_ ## NAME; \ 45*1b481fc3SMaciej Żenczykowski TYPE NAME[]; \ 46*1b481fc3SMaciej Żenczykowski } 47*1b481fc3SMaciej Żenczykowski #endif 48