mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-10-30 08:02:30 +00:00
14e83077d5
(1) compiler_types.h is unconditionally included via an -include flag (see scripts/Makefile.lib), and it defines __compiler_offsetof unconditionally. So testing for definedness of __compiler_offsetof is mostly pointless. (2) Every relevant compiler provides __builtin_offsetof (even sparse has had that for 14 years), and if for whatever reason one would end up picking up the poor man's fallback definition (C file compiler with completely custom CFLAGS?), newer clang versions won't treat the result as an Integer Constant Expression, so if used in place where such is required (static initializer or static_assert), one would get errors like t.c:11:16: error: static_assert expression is not an integral constant expression t.c:11:16: note: cast that performs the conversions of a reinterpret_cast is not allowed in a constant expression t.c:4:33: note: expanded from macro 'offsetof' #define offsetof(TYPE, MEMBER) ((size_t)&((TYPE *)0)->MEMBER) So just define offsetof unconditionally and directly in terms of __builtin_offsetof. Link: https://lkml.kernel.org/r/20220202102147.326672-1-linux@rasmusvillemoes.dk Signed-off-by: Rasmus Villemoes <linux@rasmusvillemoes.dk> Reviewed-by: Miguel Ojeda <ojeda@kernel.org> Reviewed-by: Nathan Chancellor <nathan@kernel.org> Reviewed-by: Kees Cook <keescook@chromium.org> Acked-by: Nick Desaulniers <ndesaulniers@google.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
96 lines
3.2 KiB
C
96 lines
3.2 KiB
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef _LINUX_STDDEF_H
|
|
#define _LINUX_STDDEF_H
|
|
|
|
#include <uapi/linux/stddef.h>
|
|
|
|
#undef NULL
|
|
#define NULL ((void *)0)
|
|
|
|
enum {
|
|
false = 0,
|
|
true = 1
|
|
};
|
|
|
|
#undef offsetof
|
|
#define offsetof(TYPE, MEMBER) __builtin_offsetof(TYPE, MEMBER)
|
|
|
|
/**
|
|
* sizeof_field() - Report the size of a struct field in bytes
|
|
*
|
|
* @TYPE: The structure containing the field of interest
|
|
* @MEMBER: The field to return the size of
|
|
*/
|
|
#define sizeof_field(TYPE, MEMBER) sizeof((((TYPE *)0)->MEMBER))
|
|
|
|
/**
|
|
* offsetofend() - Report the offset of a struct field within the struct
|
|
*
|
|
* @TYPE: The type of the structure
|
|
* @MEMBER: The member within the structure to get the end offset of
|
|
*/
|
|
#define offsetofend(TYPE, MEMBER) \
|
|
(offsetof(TYPE, MEMBER) + sizeof_field(TYPE, MEMBER))
|
|
|
|
/**
|
|
* struct_group() - Wrap a set of declarations in a mirrored struct
|
|
*
|
|
* @NAME: The identifier name of the mirrored sub-struct
|
|
* @MEMBERS: The member declarations for the mirrored structs
|
|
*
|
|
* Used to create an anonymous union of two structs with identical
|
|
* layout and size: one anonymous and one named. The former can be
|
|
* used normally without sub-struct naming, and the latter can be
|
|
* used to reason about the start, end, and size of the group of
|
|
* struct members.
|
|
*/
|
|
#define struct_group(NAME, MEMBERS...) \
|
|
__struct_group(/* no tag */, NAME, /* no attrs */, MEMBERS)
|
|
|
|
/**
|
|
* struct_group_attr() - Create a struct_group() with trailing attributes
|
|
*
|
|
* @NAME: The identifier name of the mirrored sub-struct
|
|
* @ATTRS: Any struct attributes to apply
|
|
* @MEMBERS: The member declarations for the mirrored structs
|
|
*
|
|
* Used to create an anonymous union of two structs with identical
|
|
* layout and size: one anonymous and one named. The former can be
|
|
* used normally without sub-struct naming, and the latter can be
|
|
* used to reason about the start, end, and size of the group of
|
|
* struct members. Includes structure attributes argument.
|
|
*/
|
|
#define struct_group_attr(NAME, ATTRS, MEMBERS...) \
|
|
__struct_group(/* no tag */, NAME, ATTRS, MEMBERS)
|
|
|
|
/**
|
|
* struct_group_tagged() - Create a struct_group with a reusable tag
|
|
*
|
|
* @TAG: The tag name for the named sub-struct
|
|
* @NAME: The identifier name of the mirrored sub-struct
|
|
* @MEMBERS: The member declarations for the mirrored structs
|
|
*
|
|
* Used to create an anonymous union of two structs with identical
|
|
* layout and size: one anonymous and one named. The former can be
|
|
* used normally without sub-struct naming, and the latter can be
|
|
* used to reason about the start, end, and size of the group of
|
|
* struct members. Includes struct tag argument for the named copy,
|
|
* so the specified layout can be reused later.
|
|
*/
|
|
#define struct_group_tagged(TAG, NAME, MEMBERS...) \
|
|
__struct_group(TAG, NAME, /* no attrs */, MEMBERS)
|
|
|
|
/**
|
|
* DECLARE_FLEX_ARRAY() - Declare a flexible array usable in a union
|
|
*
|
|
* @TYPE: The type of each flexible array element
|
|
* @NAME: The name of the flexible array member
|
|
*
|
|
* In order to have a flexible array member in a union or alone in a
|
|
* struct, it needs to be wrapped in an anonymous struct with at least 1
|
|
* named member, but that member can be empty.
|
|
*/
|
|
#define DECLARE_FLEX_ARRAY(TYPE, NAME) \
|
|
__DECLARE_FLEX_ARRAY(TYPE, NAME)
|
|
|
|
#endif
|