[PATCH] D12922: Add support for function attribute "notail"
Duncan P. N. Exon Smith via cfe-commits
cfe-commits at lists.llvm.org
Thu Sep 17 09:32:54 PDT 2015
I wonder if 'notailcall' be better, since it contains a verb (like 'noinline'). I don't have a strong opinion; just putting the alternative out there.
> On 2015-Sep-16, at 19:21, Akira Hatanaka via cfe-commits <cfe-commits at lists.llvm.org> wrote:
>
> ahatanak created this revision.
> ahatanak added a reviewer: aaron.ballman.
> ahatanak added a subscriber: cfe-commits.
>
> This patch adds support for a new function attribute "notail". The attribute is used to disable tail call optimization on calls to functions marked with the attribute.
>
> This is different from the attribute proposed in D12547, which disables tail call optimizations on call sites within the marked function.
>
> http://reviews.llvm.org/D12547
>
> http://reviews.llvm.org/D12922
>
> Files:
> include/clang/Basic/Attr.td
> include/clang/Basic/AttrDocs.td
> lib/CodeGen/CGCall.cpp
> lib/Sema/SemaDeclAttr.cpp
> test/CodeGen/attr-no-tail.c
>
> Index: test/CodeGen/attr-no-tail.c
> ===================================================================
> --- /dev/null
> +++ test/CodeGen/attr-no-tail.c
> @@ -0,0 +1,25 @@
> +// RUN: %clang_cc1 -triple x86_64-apple-macosx10.7.0 %s -emit-llvm -o - | FileCheck %s
> +
> +// CHECK: define i32 @callee0(i32 %a) [[ATTRNOTAIL0:#[0-9]+]] {
> +// CHECK: declare i32 @callee1(i32) [[ATTRNOTAIL1:#[0-9]+]]
> +// CHECK: declare i32 @callee2(i32) [[ATTRTAIL0:#[0-9]+]]
> +
> +int callee0(int a) __attribute__((notail)) {
> + return a + 1;
> +}
> +
> +int callee1(int) __attribute__((notail));
> +
> +int callee2(int);
> +
> +int caller0(int a) {
> + if (a > 0)
> + return callee0(a);
> + if (a < 0)
> + return callee1(a);
> + return callee2(a);
> +}
> +
> +// CHECK: attributes [[ATTRNOTAIL0]] = { {{.*}}notail{{.*}} }
> +// CHECK: attributes [[ATTRNOTAIL1]] = { {{.*}}notail{{.*}} }
> +// CHECK-NOT: attributes [[ATTRTAIL0]] = { {{.*}}notail{{.*}} }
> Index: lib/Sema/SemaDeclAttr.cpp
> ===================================================================
> --- lib/Sema/SemaDeclAttr.cpp
> +++ lib/Sema/SemaDeclAttr.cpp
> @@ -4878,6 +4878,9 @@
> case AttributeList::AT_ReturnsTwice:
> handleSimpleAttribute<ReturnsTwiceAttr>(S, D, Attr);
> break;
> + case AttributeList::AT_NoTail:
> + handleSimpleAttribute<NoTailAttr>(S, D, Attr);
> + break;
> case AttributeList::AT_Used:
> handleUsedAttr(S, D, Attr);
> break;
> Index: lib/CodeGen/CGCall.cpp
> ===================================================================
> --- lib/CodeGen/CGCall.cpp
> +++ lib/CodeGen/CGCall.cpp
> @@ -1414,6 +1414,8 @@
> FuncAttrs.addAttribute(llvm::Attribute::NoReturn);
> if (TargetDecl->hasAttr<NoDuplicateAttr>())
> FuncAttrs.addAttribute(llvm::Attribute::NoDuplicate);
> + if (TargetDecl->hasAttr<NoTailAttr>())
> + FuncAttrs.addAttribute(llvm::Attribute::NoTail);
>
> if (const FunctionDecl *Fn = dyn_cast<FunctionDecl>(TargetDecl)) {
> const FunctionProtoType *FPT = Fn->getType()->getAs<FunctionProtoType>();
> Index: include/clang/Basic/AttrDocs.td
> ===================================================================
> --- include/clang/Basic/AttrDocs.td
> +++ include/clang/Basic/AttrDocs.td
> @@ -1612,3 +1612,10 @@
> arguments, with arbitrary offsets.
> }];
> }
> +
> +def NoTailDocs : Documentation {
> + let Category = DocCatFunction;
> + let Content = [{
> +Tail call optimization is not performed on calls to a function marked ``notail``.
> + }];
> +}
> Index: include/clang/Basic/Attr.td
> ===================================================================
> --- include/clang/Basic/Attr.td
> +++ include/clang/Basic/Attr.td
> @@ -1020,6 +1020,12 @@
> let Documentation = [Undocumented];
> }
>
> +def NoTail : InheritableAttr {
> + let Spellings = [GNU<"notail">, CXX11<"clang", "notail">];
> + let Subjects = SubjectList<[Function, ObjCMethod]>;
> + let Documentation = [NoTailDocs];
> +}
> +
> def NoThrow : InheritableAttr {
> let Spellings = [GCC<"nothrow">, Declspec<"nothrow">];
> let Documentation = [Undocumented];
>
>
> <D12922.34960.patch>_______________________________________________
> cfe-commits mailing list
> cfe-commits at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
More information about the cfe-commits
mailing list