MaskRay added a comment.

In D96838#2578127 <https://reviews.llvm.org/D96838#2578127>, @rjmccall wrote:

> 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.

I have documented the behaviors in `clang/include/clang/Basic/AttrDocs.td`. Do 
you have suggestions on the wording?

> 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

Reply via email to