Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

tools/nolibc: compiler: introduce __nolibc_has_attribute()

Recent compilers support __has_attribute() to check if a certain
compiler attribute is supported.
Unfortunately we have to first check if __has_attribute is supported in
the first place and then if a specific attribute is present.
These two checks can't be folded into a single condition as that would
lead to errors.

Nesting the two conditions like below works, but becomes ugly as soon
as #else blocks are used as those need to be duplicated for both levels
of #if.

#if defined __has_attribute
# if __has_attribute (nonnull)
# define ATTR_NONNULL __attribute__ ((nonnull))
# endif
#endif

Introduce a new helper which makes the usage of __has_attribute() nicer
and migrate the current user to it.

Acked-by: Willy Tarreau <w@1wt.eu>
Link: https://lore.kernel.org/r/20240807-nolibc-llvm-v2-4-c20f2f5fc7c2@weissschuh.net
Signed-off-by: Thomas Weißschuh <linux@weissschuh.net>

+9 -7
+9 -7
tools/include/nolibc/compiler.h
··· 6 6 #ifndef _NOLIBC_COMPILER_H 7 7 #define _NOLIBC_COMPILER_H 8 8 9 + #if defined(__has_attribute) 10 + # define __nolibc_has_attribute(attr) __has_attribute(attr) 11 + #else 12 + # define __nolibc_has_attribute(attr) 0 13 + #endif 14 + 9 15 #if defined(__SSP__) || defined(__SSP_STRONG__) || defined(__SSP_ALL__) || defined(__SSP_EXPLICIT__) 10 16 11 17 #define _NOLIBC_STACKPROTECTOR 12 18 13 19 #endif /* defined(__SSP__) ... */ 14 20 15 - #if defined(__has_attribute) 16 - # if __has_attribute(no_stack_protector) 17 - # define __no_stack_protector __attribute__((no_stack_protector)) 18 - # else 19 - # define __no_stack_protector __attribute__((__optimize__("-fno-stack-protector"))) 20 - # endif 21 + #if __nolibc_has_attribute(no_stack_protector) 22 + # define __no_stack_protector __attribute__((no_stack_protector)) 21 23 #else 22 24 # define __no_stack_protector __attribute__((__optimize__("-fno-stack-protector"))) 23 - #endif /* defined(__has_attribute) */ 25 + #endif /* __nolibc_has_attribute(no_stack_protector) */ 24 26 25 27 #endif /* _NOLIBC_COMPILER_H */