https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99587

--- Comment #6 from Fangrui Song <i at maskray dot me> ---
(In reply to Jakub Jelinek from comment #5)
> (In reply to Florian Weimer from comment #4)
> > For retain, something along these lines might work:
> > 
> > diff --git a/gcc/c-family/c-attribs.c b/gcc/c-family/c-attribs.c
> > index c1f652d1dc9..cdae464ab8a 100644
> > --- a/gcc/c-family/c-attribs.c
> > +++ b/gcc/c-family/c-attribs.c
> > @@ -329,8 +329,10 @@ const struct attribute_spec c_common_attribute_table[] 
> > =
> >                               handle_used_attribute, NULL },
> >    { "unused",                 0, 0, false, false, false, false,
> >                               handle_unused_attribute, NULL },
> > +#if SUPPORTS_SHF_GNU_RETAIN
> >    { "retain",                 0, 0, true,  false, false, false,
> >                               handle_retain_attribute, NULL },
> > +#endif
> >    { "externally_visible",     0, 0, true,  false, false, false,
> >                               handle_externally_visible_attribute, NULL },
> >    { "no_reorder",            0, 0, true, false, false, false,
> > 
> > In other cases, it's more difficult because those are subtarget-dependent.
> 
> Doing the above would "fix" __has_attribute, but on the other side would mean
> the compiler would not know how many and what kind of operands the attribute
> has, whether it is for function declarations, other declarations, types or
> what
> etc., so for invalid code it would have inconsistent diagnostics.

Are you willing to properly fix it? :)

I implemented the attribute on clang (https://reviews.llvm.org/D97447).
__has_attribute(retain) is always 1 and there is no ignored diagnostic,
regardless of the target (even if non-ELF), and __has_attribute(retain) works
in assembly mode as well. This is intentional so that: with bleeding-edge
toolchain, non-ELF targets don't need macros to decide whether 'retain' should
be added.


Ultimately, I want the glibc static linking problem with ld -z start-stop-gc
fixed
https://sourceware.org/pipermail/libc-alpha/2021-March/123833.html
(glibc has -Wattributes, so __has_attribute(retain)=1 && "warning: ‘retain’
attribute ignored" can cause some inconvenience.)

And I hope eventually ld -z start-stop-gc can be the default.

Reply via email to