// 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}