aaron.ballman added inline comments.

================
Comment at: clang/include/clang/Basic/Attr.td:1435
+  let Spellings = [GCC<"leaf">];
+  let Subjects = SubjectList<[Function]>;
+  let Documentation = [Undocumented];
----------------
gulfem wrote:
> aaron.ballman wrote:
> > gulfem wrote:
> > > aaron.ballman wrote:
> > > > Should this attribute also be supported on things like ObjC method 
> > > > decls or other function-like interfaces?
> > > Do I need to do anything else to support this attribute in Objective-C as 
> > > well?
> > > I think we should support it in all the C languages family.
> > >I think we should support it in all the C languages family.
> > 
> > That's already happening automatically -- there's a C and C++ spelling 
> > available for it and the attribute doesn't specify that it requires a 
> > particular language mode or target.
> > 
> > > Do I need to do anything else to support this attribute in Objective-C as 
> > > well?
> > You can add multiple subjects to the list here, so you can have this apply 
> > to `Function, ObjCMethod` for both of those. Another one to consider is 
> > whether this attribute can be written on a block declaration (like a 
> > lambda, but with different syntax). Beyond that, it's mostly just 
> > documentation, devising the test cases to ensure the ObjC functionality 
> > behaves as expected, possibly some codegen changes, etc.
> AFAIK, users can specify function attributes in lambda expressions.
> Lambda functions can only be accessed/called by the functions in the same 
> translation unit, right?
> Leaf attribute does not have any effect on the functions that are defined in 
> the same translation unit.
> For this reason, I'm thinking that leaf attribute would not have any effect 
> if they are used in lambda expressions.
> Do you agree with me?
> AFAIK, users can specify function attributes in lambda expressions.

I always forget that you can do that for declaration attributes using GNU-style 
syntax...

> Lambda functions can only be accessed/called by the functions in the same 
> translation unit, right?

Not necessarily, you could pass one across TU boundaries like a function 
pointer, for instance. e.g.,
```
// TU1.cpp
void foo() {
  auto l = []() { ... };
  bar(l);
}

// TU2.cpp
void bar(auto func) {
  func();
}
```


================
Comment at: clang/include/clang/Basic/AttrDocs.td:3910
+in library functions. 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.
----------------
gulfem wrote:
> aaron.ballman wrote:
> > gulfem wrote:
> > > I think this property is transitive. 
> > > If a leaf function somehow enters into caller's translation unit (either 
> > > via direct call or a via its call chain), it will violate the rule that 
> > > says "Calls to external functions with this attribute must return to the 
> > > current compilation unit only by return or by exception handling". 
> > > Entering via its call chain is not a return or an exception handling.
> > > Do you agree with that?
> > > I think this property is transitive. ... Do you agree with that?
> > 
> > That makes sense to me! I think I'd recommend a slight modification to the 
> > docs then:
> > 
> > ```
> > 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, possibly transitive, external function call, use of 
> > ``longjmp``, or other means.
> > ```
> > The last question is: by "direct" does the GCC docs imply that calls back 
> > to the caller's TU through a function *pointer* are not UB? I'd imagine 
> > those would also be bad, but I'd like to make sure (and perhaps we can 
> > remove the `direct` from the wording if calls through function pointers are 
> > disallowed).
> I think the idea is that the control-flow should never come back to the 
> caller's translation unit by any kind of control-flow changing mechanism 
> (direct/indirect and call/jump).
> The compiler might use this hint to do optimizations based on that 
> assumption, so the user should ensure that.
> Could you please explain what do you mean by calling back via function 
> pointer?
> I thought that callback function is basically calling back via a function 
> pointer. 
> Could you please explain what do you mean by calling back via function 
> pointer?
> I thought that callback function is basically calling back via a function 
> pointer.

I had confused myself -- I think @jdoerfert answered my confusion in an earlier 
comment and I just wasn't thinking about that case hard enough. I think we want 
to drop the word "direct" from "external function call" because it doesn't 
matter whether the user says:
```
void bar(void); // Assume calling this is bad
bar();
```
and
```
void bar(void); // Assume calling this is bad
void (*fp)(void) = bar;
fp();
```


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