rjmccall added a comment. In D96838#2578101 <https://reviews.llvm.org/D96838#2578101>, @MaskRay wrote:
> In D96838#2578097 <https://reviews.llvm.org/D96838#2578097>, @rjmccall wrote: > >> In D96838#2578083 <https://reviews.llvm.org/D96838#2578083>, @MaskRay wrote: >> >>> In D96838#2578073 <https://reviews.llvm.org/D96838#2578073>, @rjmccall >>> wrote: >>> >>>> GCC 11 hasn't been released yet, so can we still engage with GCC about the >>>> semantics of this attribute? This is a very low-level attribute, and I >>>> don't understand why it was made separate instead of just having `used` >>>> add the appropriate section flag on targets that support it. >>> >>> GCC did overload `used` with the linker garbage collection semantics. Then >>> after discussions (e.g. >>> https://gcc.gnu.org/pipermail/gcc-patches/2021-February/565478.html) they >>> decided to pick the earliest suggestion: add `retain`. >>> >>> This makes sense to me: `used` can emit a function which is only used by >>> inline assembly, but the user intention can still be that the whole thing >>> can be GCable. >> >> There's definitely some merit to distinguishing the cases here — `used` >> doesn't just force the object to be emitted, it also forces the compiler to >> treat it as if there might be accesses to the variable / function that it >> can't see. Thus, for example, a non-const `used` variable has to be assumed >> to be potentially mutated in arbitrary ways. I guess my concern is that >> this new attribute still doesn't feel like it covers the use cases very >> well, especially because `used` does have long-established semantics of >> affecting the linker on non-ELF targets. Basically, to get "full strength" >> semantics that affect the compiler and linker on all targets, you have to >> add a new attribute; > > Yes. > >> to get "partial strength" semantics that only affect the compiler, you can >> use the old attribute on ELF, but there's no way to spell it on non-ELF; and >> if you wanted to get "weak" semantics (e.g. to force the symbol to be >> preserved through linking without broadly disabling the optimizer), there's >> no way to spell that anywhere. > > The semantics can be represented on non-ELF, as long as the binary format > supports multiple sections of the same name. My concern is less whether the semantics are implementable and more whether there's a way of requesting them in the source language. `attribute((used))` is expected to prevent link-time stripping on Mach-O and PE/COFF. We can't just change the long-accepted semantics of the existing attribute after something like 20 years; this is documented behavior. That said, I can understand why GCC is reluctant to make `attribute((used))` alone start preventing the linker from stripping symbols that it's been able to strip for years. So I guess really the attribute just has to be understood to have a different meaning on different targets because of this historical divergence. This seems like something we need to document in the manual. If we wanted to implement the PE/COFF precision improvement, so that `used` only affected one specific declaration, that seems like something we could probably reasonably do, since that behavior is not documented (and may be inconsistent between linkages anyway, if I understand you right). Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D96838/new/ https://reviews.llvm.org/D96838 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits