rnk added inline comments.

================
Comment at: clang/include/clang/Basic/Attr.td:1799
+  let Spellings = [Clang<"nomerge">];
+  let Subjects = SubjectList<[Function]>;
+  let Documentation = [NoMergeDocs];
----------------
rnk wrote:
> aaron.ballman wrote:
> > zequanwu wrote:
> > > rnk wrote:
> > > > Clang supports many function-like things that are not functions, for 
> > > > example, Objective C method declarations are not considered 
> > > > FunctionDecls in the AST. Blocks are another function-like thing. I see 
> > > > below there is a `FunctionLike` subject type. Lets use that here.
> > > > 
> > > > I would like to make it possible to apply this attribute directly to 
> > > > call expressions as well, but I don't see a good example of how to do 
> > > > that in the existing attribute. I'd like to be able to do this, for 
> > > > example:
> > > > 
> > > > ```
> > > > void __attribute__((noreturn)) bar();
> > > > void foo(bool cond) {
> > > >   if (cond)
> > > >     [[clang::nomerge]] bar();
> > > >   else
> > > >     [[clang::nomerge]] bar();
> > > > }
> > > > ```
> > > > 
> > > > This gives the user fine-grained control. It allows them to call some 
> > > > existing API, like perhaps RaiseException, of which they do not control 
> > > > the declaration, and mark the calls as unmergeable.
> > > It seems like there is no exiting example of call site attributes. 
> > > https://github.com/llvm/llvm-project/blob/master/clang/lib/CodeGen/CGCall.cpp#L4767.
> > >  And the function `EmitCall` may not know existence of call site 
> > > attributes.
> > > I would like to make it possible to apply this attribute directly to call 
> > > expressions as well, but I don't see a good example of how to do that in 
> > > the existing attribute.
> > 
> > You would have to use a statement attribute rather than a declaration 
> > attribute for this, and we have a few of those but none that work on call 
> > expressions specifically.
> > 
> > One question I have about that idea is whether attributes give you fine 
> > enough levels of control (I don't know enough about `nomerge` to answer 
> > this myself). e.g., `foo(bar(), bar()); // Do you want to nomerge the bar() 
> > calls, the foo() call, or all three?` (You can only add the attribute to 
> > the statement expression, not to individual expressions.)
> I guess what I really wanted was an expression attribute, so you can put it 
> on the calls to `bar`. :)
> 
> But given that that doesn't exist, I think it would be OK to do either one of 
> the following:
> - Apply nomerge attribute to all call sites in the whole Stmt
> - Apply nomerge only to the first CallExpr found inside the Stmt
> 
> I think the simplest implementation is to, in CodeGenFunction, set a flag 
> (NoMerge) on CodeGenFunction when emitting such an attributed statement with 
> this attribute. Then set it back on exit. Something like that.
It's worth considering some test cases where the call expression is not the 
top-most AST node in the expression:
```
[[clang::nomerge]] (x = 42, abort());
[[clang::nomerge]] (void)(throwException());
```
We can probably make an ExprWithTemporaries wrapper, ParenExpr wrapper, or 
others.


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

https://reviews.llvm.org/D79121



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

Reply via email to