[PATCH] Implement the no_split_stack attribute.
Alp Toker
alp at nuanti.com
Sat May 17 08:16:28 PDT 2014
On 17/05/2014 16:40, Aaron Ballman wrote:
> On Sat, May 17, 2014 at 2:23 AM, Peter Collingbourne <peter at pcc.me.uk> wrote:
>> This is a GNU attribute that allows split stacks to be turned off on a
>> per-function basis.
>>
>> http://reviews.llvm.org/D3817
>>
>> Files:
>> include/clang/Basic/Attr.td
>> lib/CodeGen/CGCall.cpp
>> lib/Sema/SemaDeclAttr.cpp
>> test/CodeGen/split-stacks.c
>>
>> Index: include/clang/Basic/Attr.td
>> ===================================================================
>> --- include/clang/Basic/Attr.td
>> +++ include/clang/Basic/Attr.td
>> @@ -823,6 +823,12 @@
>> let Documentation = [Undocumented];
>> }
>>
>> +def NoSplitStack : InheritableAttr {
>> + let Spellings = [GNU<"no_split_stack">];
> Should this be GCC instead of GNU? (so it can be spelled
> [[gnu::no_split_stack]] as well.)
>
>> + let Subjects = SubjectList<[Function]>;
> Should it also apply to templated functions? ObjC methods?
>
>> + let Documentation = [Undocumented];
> Please add documentation for this attribute.
>
>> +}
>> +
>> def NonNull : InheritableAttr {
>> let Spellings = [GCC<"nonnull">];
>> let Subjects = SubjectList<[ObjCMethod, HasFunctionProto, ParmVar], WarnDiag,
>> Index: lib/CodeGen/CGCall.cpp
>> ===================================================================
>> --- lib/CodeGen/CGCall.cpp
>> +++ lib/CodeGen/CGCall.cpp
>> @@ -1117,7 +1117,8 @@
>> FuncAttrs.addAttribute(llvm::Attribute::NoRedZone);
>> if (CodeGenOpts.NoImplicitFloat)
>> FuncAttrs.addAttribute(llvm::Attribute::NoImplicitFloat);
>> - if (CodeGenOpts.EnableSegmentedStacks)
>> + if (CodeGenOpts.EnableSegmentedStacks &&
>> + !(TargetDecl && TargetDecl->hasAttr<NoSplitStackAttr>()))
>> FuncAttrs.addAttribute("split-stack");
>>
>> if (AttrOnCallSite) {
>> Index: lib/Sema/SemaDeclAttr.cpp
>> ===================================================================
>> --- lib/Sema/SemaDeclAttr.cpp
>> +++ lib/Sema/SemaDeclAttr.cpp
>> @@ -4173,6 +4173,9 @@
>> case AttributeList::AT_NoCommon:
>> handleSimpleAttribute<NoCommonAttr>(S, D, Attr);
>> break;
>> + case AttributeList::AT_NoSplitStack:
>> + handleSimpleAttribute<NoSplitStackAttr>(S, D, Attr);
>> + break;
>> case AttributeList::AT_NonNull:
>> if (ParmVarDecl *PVD = dyn_cast<ParmVarDecl>(D))
>> handleNonNullAttrParameter(S, PVD, Attr);
>> Index: test/CodeGen/split-stacks.c
>> ===================================================================
>> --- test/CodeGen/split-stacks.c
>> +++ test/CodeGen/split-stacks.c
>> @@ -5,13 +5,21 @@
>> return 0;
>> }
>>
>> +__attribute__((no_split_stack))
>> +int nosplit() {
>> + return 0;
>> +}
>> +
>> int main() {
>> return foo();
>> }
>>
>> -// CHECK-SEGSTK: define i32 @foo() #0 {
>> -// CHECK-SEGSTK: define i32 @main() #0 {
>> -// CHECK-SEGSTK: #0 = { {{.*}} "split-stack" {{.*}} }
>> +// CHECK-SEGSTK: define i32 @foo() [[SS:#[0-9]+]] {
>> +// CHECK-SEGSTK: define i32 @nosplit() [[NSS:#[0-9]+]] {
>> +// CHECK-SEGSTK: define i32 @main() [[SS]] {
>> +// CHECK-SEGSTK-NOT: [[NSS]] = { {{.*}} "split-stack" {{.*}} }
>> +// CHECK-SEGSTK: [[SS]] = { {{.*}} "split-stack" {{.*}} }
>> +// CHECK-SEGSTK-NOT: [[NSS]] = { {{.*}} "split-stack" {{.*}} }
>>
>> // CHECK-NOSEGSTK: define i32 @foo() #0 {
>> // CHECK-NOSEGSTK: define i32 @main() #0 {
> Missing sema tests for the attribute (that it applies only to
> functions, takes no arguments, etc).
Actually I like how Peter's kept the tests concise. It seems reasonable
to trust the attribute machinery for subject/range checking, similar to
the way we only test the semantics of type trait expressions, compiler
builtins etc. where there's existing coverage for standard handling.
Alp.
--
http://www.nuanti.com
the browser experts
More information about the cfe-commits
mailing list