jdoerfert added a comment.

In D90275#2371764 <https://reviews.llvm.org/D90275#2371764>, @aqjune wrote:

> Hi,
>
> Naming is a hard thing... I have no special preference. :/
>
> However, I'd like to understand the details of this attribute.
>
> Would LTO be affected because `leaf` is guaranteed to untouch the current 
> translation unit only?
>
>   // a.c
>   int x;
>   void f1() {
>     f2();
>   }
>   void g() { x = 3; }
>   
>   // b.c
>   void f2() {
>     leaf();
>   }
>   
>   // leaf.c
>   attribute((leaf)) void leaf() {
>     g();
>   }
>
> IIUC this program is okay because g() and the caller of leaf() are in 
> different TUs.
> But, let's assume that a.c and b.c are LTO-ed, and leaf.c is separately 
> compiled.
> If LTO merges a.c and b.c into the same module, the two TUs cannot be 
> distinguished anymore; either `leaf` should be dropped, or LTO should somehow 
> conceptually keep two TUs.
> Would it be a valid concern? Then I think it should be mentioned.

As noted by the GCC docs, it doesn't mean anything on a definition so that you 
can safely merge TUs. I want us to forbid `leaf` on IR function definitions for 
that reason, it would not mean anything and be only confusing.

> Another question is more about the motivation of this attribute (well, I know 
> it is introduced by gcc first; just throwing a question :) )
> If the motivation is to support better data flow analysis, is there something 
> special in callback itself?
> The gcc document states that `sin()` is a leaf function, and IIUC this is 
> because `sin()` never touches the memory allocated at caller's TU (because 
> `errno` isn't at the caller's TU).

No, that is not it. It is `leaf` because it will not transfer control to the 
callers TU.

> I think things are easier if we simply say that `leaf` cannot touch the 
> memory of current TU, regardless of the existence of callbacks.
> Is there something important in the callback itself?

Not really, IMHO, `leaf` means you cannot transfer control to the callers TU 
without going threw the original call site (via return or throw).
It is not a memory thing. However, the "almost" matching memory property is 
called `inaccesiblememonly` so that is why I wanted to call this 
`inaccessiblecodeonly`.


Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D90275/new/

https://reviews.llvm.org/D90275

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to