| // RUN: %clang -target x86_64-apple-darwin -emit-llvm -S -o - %s | FileCheck %s |
| // RUN: %clang -target x86_64-apple-darwin -emit-llvm -S -o - %s -fstack-protector | FileCheck %s |
| // RUN: %clang -target x86_64-apple-darwin -emit-llvm -S -o - %s -fstack-protector-all | FileCheck %s |
| // RUN: %clang -target x86_64-apple-darwin -emit-llvm -Xclang -verify -fstack-protector-all %s -o %t -c |
| |
| typedef __SIZE_TYPE__ size_t; |
| |
| int printf(const char * _Format, ...); |
| char *strcpy(char *s1, const char *s2); |
| |
| struct S { |
| S(); |
| int a[4]; |
| }; |
| |
| // CHECK: define {{.*}} @_Z5test1PKc |
| // CHECK: %{{.*}} = alloca [1000 x i8], align {{.*}}, !stack-protector ![[A:.*]] |
| void test1(const char *msg) { |
| __attribute__((stack_protector_ignore)) |
| char a[1000]; // expected-warning {{'stack_protector_ignore' attribute ignored due to '-fstack-protector-all' option}} |
| strcpy(a, msg); |
| printf("%s\n", a); |
| } |
| |
| // CHECK: define {{.*}} @_Z5test2 |
| // CHECK-NOT: %{{.*}} = alloca [1000 x i8], align {{.*}}, !stack-protector |
| void test2(const char *msg) { |
| char b[1000]; |
| strcpy(b, msg); |
| printf("%s\n", b); |
| } |
| |
| // CHECK: define {{.*}} @_Z5test3v |
| // CHECK: %{{.*}} = alloca %struct.S, align {{.*}}, !stack-protector ![[A:.*]] |
| S test3() { |
| __attribute__((stack_protector_ignore)) |
| S s; // expected-warning {{'stack_protector_ignore' attribute ignored due to '-fstack-protector-all' option}} |
| return s; |
| } |
| |
| // CHECK: define {{.*}} @_Z5test4b |
| // CHECK: %{{.*}} = alloca %struct.S, align {{.*}}, !stack-protector ![[A:.*]] |
| // CHECK: call void @_ZN1SC1Ev |
| S test4(bool b) { |
| __attribute__((stack_protector_ignore)) |
| S s; // expected-warning {{'stack_protector_ignore' attribute ignored due to '-fstack-protector-all' option}} |
| if ( b ) |
| return s; |
| else |
| return s; |
| } |
| |
| // CHECK: define {{.*}} @_Z5test5b |
| // CHECK: %{{.*}} = alloca %struct.S, align {{.*}} |
| // CHECK-NOT: stack-protector |
| // CHECK: %{{.*}} = alloca %struct.S, align {{.*}}, !stack-protector ![[A:.*]] |
| // CHECK: %{{.*}} = alloca %struct.S, align {{.*}} |
| // CHECK-NOT: stack-protector |
| // CHECK: call void @_ZN1SC1Ev |
| // CHECK: call void @_ZN1SC1Ev |
| S test5(bool b) { |
| __attribute__((stack_protector_ignore)) |
| S s1; // expected-warning {{'stack_protector_ignore' attribute ignored due to '-fstack-protector-all' option}} |
| S s2; |
| if ( b ) |
| return s1; |
| else |
| return s2; |
| } |
| |
| // CHECK: ![[A]] = !{i32 0} |