[PATCH 04/31] stddef: Avoid warning with clang with offsetof()

Rasmus Villemoes rasmus.villemoes at prevas.dk
Thu Jan 13 09:08:13 CET 2022


On 01/11/2021 02.17, Simon Glass wrote:
> Some bright sparks have decided that a cast on a constant cannot be a
> constant, so offsetof() produces this warning on clang-10:
> 
> include/intel_gnvs.h:113:1: error: static_assert expression is not an
> 	integral constant expression
> check_member(acpi_global_nvs, unused2, GNVS_CHROMEOS_ACPI_OFFSET);
> ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/kernel.h:284:2: note: expanded from macro 'check_member'
>         offsetof(struct structure, member) == (offset), \
>         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> include/linux/stddef.h:20:32: note: expanded from macro 'offsetof'
>                                 ^
> include/intel_gnvs.h:113:1: note: cast that performs the conversions of
> 	a reinterpret_cast is ot allowed in a constant expression
> include/linux/stddef.h:20:33: note: expanded from macro 'offsetof'
> 
> Fix it by using the compiler built-in version, if available.
> 
> Signed-off-by: Simon Glass <sjg at chromium.org>
> ---
> 
>  include/linux/stddef.h | 8 +++++++-
>  1 file changed, 7 insertions(+), 1 deletion(-)
> 
> diff --git a/include/linux/stddef.h b/include/linux/stddef.h
> index c540f6100d4..a7f546fdfe5 100644
> --- a/include/linux/stddef.h
> +++ b/include/linux/stddef.h
> @@ -1,6 +1,8 @@
>  #ifndef _LINUX_STDDEF_H
>  #define _LINUX_STDDEF_H
>  
> +#include <linux/compiler_types.h>
> +
>  #undef NULL
>  #if defined(__cplusplus)
>  #define NULL 0
> @@ -14,7 +16,11 @@
>  
>  #ifndef __CHECKER__
>  #undef offsetof
> -#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
> +#ifdef __compiler_offsetof
> +#define offsetof(TYPE, MEMBER)	__compiler_offsetof(TYPE, MEMBER)
> +#else
> +#define offsetof(TYPE, MEMBER)	((size_t)&((TYPE *)0)->MEMBER)
> +#endif
>  #endif


Can we please just drop the useless indirections? Any compiler we care
about provides __builtin_offsetof(), so just make the whole thing

  #undef offsetof
  #define offsetof(TYPE, MEMBER)  __builtin_offsetof(TYPE, MEMBER)

And by "compilers we care about", that includes sparse - it has had
__builtin_offsetof ever since 2007.

And we can nuke the __compiler_offsetof definition in compiler_types.h,
and if any users exist, just mechanically convert them to offsetof().

Rasmus


More information about the U-Boot mailing list