1 /* SPDX-License-Identifier: GPL-2.0 */ 2 #ifndef _LINUX_STDDEF_H 3 #define _LINUX_STDDEF_H 4 5 #include <uapi/linux/stddef.h> 6 7 #undef NULL 8 #define NULL ((void *)0) 9 10 enum { 11 false = 0, 12 true = 1 13 }; 14 15 #undef offsetof 16 #define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER) 17 18 /** 19 * sizeof_field() - Report the size of a struct field in bytes 20 * 21 * @TYPE: The structure containing the field of interest 22 * @MEMBER: The field to return the size of 23 */ 24 #define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER)) 25 26 /** 27 * offsetofend() - Report the offset of a struct field within the struct 28 * 29 * @TYPE: The type of the structure 30 * @MEMBER: The member within the structure to get the end offset of 31 */ 32 #define offsetofend(TYPE, MEMBER) \ 33 (offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER)) 34 35 /** 36 * struct_group() - Wrap a set of declarations in a mirrored struct 37 * 38 * @NAME: The identifier name of the mirrored sub-struct 39 * @MEMBERS: The member declarations for the mirrored structs 40 * 41 * Used to create an anonymous union of two structs with identical 42 * layout and size: one anonymous and one named. The former can be 43 * used normally without sub-struct naming, and the latter can be 44 * used to reason about the start, end, and size of the group of 45 * struct members. 46 */ 47 #define struct_group(NAME, MEMBERS...) \ 48 __struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS) 49 50 /** 51 * struct_group_attr() - Create a struct_group() with trailing attributes 52 * 53 * @NAME: The identifier name of the mirrored sub-struct 54 * @ATTRS: Any struct attributes to apply 55 * @MEMBERS: The member declarations for the mirrored structs 56 * 57 * Used to create an anonymous union of two structs with identical 58 * layout and size: one anonymous and one named. The former can be 59 * used normally without sub-struct naming, and the latter can be 60 * used to reason about the start, end, and size of the group of 61 * struct members. Includes structure attributes argument. 62 */ 63 #define struct_group_attr(NAME, ATTRS, MEMBERS...) \ 64 __struct_group(/* no tag */, NAME, ATTRS, MEMBERS) 65 66 /** 67 * struct_group_tagged() - Create a struct_group with a reusable tag 68 * 69 * @TAG: The tag name for the named sub-struct 70 * @NAME: The identifier name of the mirrored sub-struct 71 * @MEMBERS: The member declarations for the mirrored structs 72 * 73 * Used to create an anonymous union of two structs with identical 74 * layout and size: one anonymous and one named. The former can be 75 * used normally without sub-struct naming, and the latter can be 76 * used to reason about the start, end, and size of the group of 77 * struct members. Includes struct tag argument for the named copy, 78 * so the specified layout can be reused later. 79 */ 80 #define struct_group_tagged(TAG, NAME, MEMBERS...) \ 81 __struct_group(TAG, NAME, /* no attrs */, MEMBERS) 82 83 /** 84 * DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union 85 * 86 * @TYPE: The type of each flexible array element 87 * @NAME: The name of the flexible array member 88 * 89 * In order to have a flexible array member in a union or alone in a 90 * struct, it needs to be wrapped in an anonymous struct with at least 1 91 * named member, but that member can be empty. 92 */ 93 #define DECLARE_FLEX_ARRAY(TYPE, NAME) \ 94 __DECLARE_FLEX_ARRAY(TYPE, NAME) 95 96 /** 97 * __TRAILING_OVERLAP() - Overlap a flexible-array member with trailing 98 * members. 99 * 100 * Creates a union between a flexible-array member (FAM) in a struct and a set 101 * of additional members that would otherwise follow it. 102 * 103 * Beware that, as this helper encloses TYPE NAME and MEMBERS in the same 104 * union, designated initializers for MEMBERS may overwrite portions 105 * previously initialized through NAME. 106 * 107 * For example:: 108 * 109 * struct flex { 110 * size_t count; 111 * u8 fam[]; 112 * }; 113 * 114 * struct composite { 115 * ... 116 * __TRAILING_OVERLAP(struct flex, flex, fam, __packed, 117 * u8 data; 118 * ); 119 * } __packed; 120 * 121 * static struct composite comp = { 122 * .flex = { 123 * .count = 1, 124 * }, 125 * .data = 2, 126 * }; 127 * 128 * In the example above, .flex and .data initialize different views of the same 129 * union storage. Since .data is initialized last, it _may_ overwrite portions 130 * previously initialized through .flex, leading to .flex.count being zeroed 131 * out. 132 * 133 * A couple of alternatives are shown below. 134 * 135 * a) Initialize only one view of the overlapped storage and assign the rest 136 * at runtime:: 137 * 138 * static struct composite comp = { 139 * .flex = { 140 * .count = 1, 141 * }, 142 * }; 143 * 144 * static void foo(void) 145 * { 146 * comp.data = 2; 147 * ... 148 * } 149 * 150 * b) Alternatively, replace designated initializers with runtime assignments:: 151 * 152 * static void foo(void) 153 * { 154 * struct composite comp; 155 * 156 * comp.flex.count = 1; 157 * comp.data = 2; 158 * ... 159 * } 160 * 161 * Compiler Explorer test code: https://godbolt.org/z/voM4E36dT 162 * 163 * For another example of the above see commit 5e54510a9389 ("acpi: nfit: 164 * intel: avoid multiple -Wflex-array-member-not-at-end warnings") 165 * 166 * Link: https://git.kernel.org/linus/5e54510a9389caa9 167 * 168 * @TYPE: Flexible structure type name, including "struct" keyword. 169 * @NAME: Name for a variable to define. 170 * @FAM: The flexible-array member within @TYPE 171 * @ATTRS: Any struct attributes (usually empty) 172 * @MEMBERS: Trailing overlapping members. 173 */ 174 #define __TRAILING_OVERLAP(TYPE, NAME, FAM, ATTRS, MEMBERS) \ 175 union { \ 176 TYPE NAME; \ 177 struct { \ 178 unsigned char __offset_to_FAM[offsetof(TYPE, FAM)]; \ 179 MEMBERS \ 180 } ATTRS; \ 181 } 182 183 /** 184 * TRAILING_OVERLAP() - Overlap a flexible-array member with trailing members. 185 * 186 * Creates a union between a flexible-array member (FAM) in a struct and a set 187 * of additional members that would otherwise follow it. 188 * 189 * @TYPE: Flexible structure type name, including "struct" keyword. 190 * @NAME: Name for a variable to define. 191 * @FAM: The flexible-array member within @TYPE 192 * @MEMBERS: Trailing overlapping members. 193 */ 194 #define TRAILING_OVERLAP(TYPE, NAME, FAM, MEMBERS) \ 195 __TRAILING_OVERLAP(TYPE, NAME, FAM, /* no attrs */, MEMBERS) 196 197 #endif 198