aaron.ballman added inline comments.

================
Comment at: clang/include/clang/Basic/AttrDocs.td:3909
+The ``leaf`` attribute is used as a compiler hint to improve dataflow analysis 
in library functions.
+Functions marked as ``leaf`` attribute are not allowed to enter their caller's 
translation unit.
+Therefore, they cannot use or modify any data that does not escape the current 
compilation unit.
----------------
gulfem wrote:
> aaron.ballman wrote:
> > as leaf -> with the leaf
> > 
> > I'm not certain how to interpret that functions are not allowed to enter 
> > their caller's translation unit. I sort of read that as leaf functions are 
> > not allowed to call (or otherwise jump) out of the translation unit in 
> > which they're defined -- is that about right?
> I think the description is a little confusing.
> As far as I understand, leaf functions can actually call or jump out the the 
> translation unit that they are defined ("Leaf functions might still call 
> functions from other compilation units").
> The manual refers caller function's translation unit as **current 
> translation** unit.
> "Calls to external functions with this attribute must return to the current 
> compilation unit only by return or by exception handling. In particular, a 
> leaf function is not allowed to invoke callback functions passed to it from 
> the current compilation unit, directly call functions exported by the unit, 
> or longjmp into the unit."
> My interpretation of this statement is that a function marked with a leaf 
> attribute can only return to its caller translation unit by a return or an 
> exception, but it cannot enter into callers translation unit by invoking a 
> callback function. 
> Does that make sense?
> 
> 
Ah, thank you for the explanation! How about: `Functions marked with the 
''leaf'' attribute are not allowed to jump back into the caller's translation 
unit, whether through invoking a callback function, a direct external function 
call, use of 'longjmp', or other means.`?

Is this property transitive? e.g.,
```
// TU1.c
void func(void) {
  leaf();
}

void bar(void) {}

// TU2.c
__attribute__((leaf)) void leaf(void) {
  baz(); // Is this not allowed?
}

// TU3.c
void baz(void) {
  bar();
}
```
The "directly call functions exported by the unit" makes me think the above 
code is fine but it could also be that "direct" in this case means "through a 
function designator rather than a function pointer".


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