On Sun, Jul 28, 2024 at 12:09:58PM +0200, Thomas Weißschuh wrote: > The current entrypoint attributes optimize("Os", "omit-frame-pointer") > are intended to avoid all compiler generated code, like function > porologue and epilogue. > This is the exact usecase implemented by the attribute "naked". > > Unfortunately this is not implemented by GCC for all targets, > so only use it where available. > This also provides compatibility with clang, which recognizes the > "naked" attribute but not the previously used attribute "optimized". > > Signed-off-by: Thomas Weißschuh <linux@xxxxxxxxxxxxxx> > --- > tools/include/nolibc/compiler.h | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/tools/include/nolibc/compiler.h b/tools/include/nolibc/compiler.h > index fe3701863634..f77bb7d3e1a8 100644 > --- a/tools/include/nolibc/compiler.h > +++ b/tools/include/nolibc/compiler.h > @@ -9,6 +9,15 @@ > #define __entrypoint __attribute__((optimize("Os", "omit-frame-pointer"))) > #define __entrypoint_epilogue() __builtin_unreachable() > > +#if defined(__has_attribute) > +# if __has_attribute(naked) > +# undef __entrypoint > +# define __entrypoint __attribute__((naked)) > +# undef __entrypoint_epilogue > +# define __entrypoint_epilogue() > +# endif > +#endif /* defined(__has_attribute) */ I would find it cleaner to enclose the previous declaration with the #if rather than #undef everything just after it has been defined. Also it's not very common to undo declarations just after they've been done, and it makes quick code analysis harder. I think that it can resolve to roughly this: #if defined(__has_attribute) && __has_attribute(naked) # define __entrypoint __attribute__((naked)) # define __entrypoint_epilogue() #else # define __entrypoint __attribute__((optimize("Os", "omit-frame-pointer"))) # define __entrypoint_epilogue() __builtin_unreachable() #endif What do you think ? Willy