[PATCH] D79121: Add nomerge function attribute to clang
Reid Kleckner via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Apr 29 15:06:24 PDT 2020
rnk added inline comments.
================
Comment at: clang/include/clang/Basic/Attr.td:1799
+ let Spellings = [Clang<"nomerge">];
+ let Subjects = SubjectList<[Function]>;
+ let Documentation = [NoMergeDocs];
----------------
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.
================
Comment at: clang/test/CodeGen/attr-nomerge.c:15
+// CHECK: attributes #1 = { nomerge {{.*}} }
+// CHECK: attributes #2 = { nomerge }
----------------
These numbers can be unstable. Generally the best practice is to do something like this:
// CHECK: declare void @bar() #[[NOMERGEATTR:\d+]]
// CHECK: attributes #[[NOMERGEATTR]] = { nomerge {{.*}} }
This makes the test more readable and more resilient in the case that the attribute set numbers change.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D79121/new/
https://reviews.llvm.org/D79121
More information about the cfe-commits
mailing list