1 ; RUN: llc %s -mtriple=x86_64-unknown-unknown -pass-remarks=stack-protector -o /dev/null 2>&1 | FileCheck %s
3 ; CHECK: function attribute_ssp
4 ; CHECK-SAME: a function attribute or command-line switch
5 ; CHECK-NOT: alloca_fixed_small_nossp
6 ; CHECK: function alloca_fixed_small_ssp
7 ; CHECK-SAME: a call to alloca or use of a variable length array
8 ; CHECK: function alloca_fixed_large_ssp
9 ; CHECK-SAME: a call to alloca or use of a variable length array
10 ; CHECK: function alloca_variable_ssp
11 ; CHECK-SAME: a call to alloca or use of a variable length array
12 ; CHECK: function buffer_ssp
13 ; CHECK-SAME: a stack allocated buffer or struct containing a buffer
14 ; CHECK: function struct_ssp
15 ; CHECK-SAME: a stack allocated buffer or struct containing a buffer
16 ; CHECK: function address_ssp
17 ; CHECK-SAME: the address of a local variable being taken
18 ; CHECK: function multiple_ssp
19 ; CHECK-SAME: a function attribute or command-line switch
20 ; CHECK: function multiple_ssp
21 ; CHECK-SAME: a stack allocated buffer or struct containing a buffer
22 ; CHECK: function multiple_ssp
23 ; CHECK-SAME: a stack allocated buffer or struct containing a buffer
24 ; CHECK: function multiple_ssp
25 ; CHECK-SAME: the address of a local variable being taken
26 ; CHECK: function multiple_ssp
27 ; CHECK-SAME: a call to alloca or use of a variable length array
29 ; Check that no remark is emitted when the switch is not specified.
30 ; RUN: llc %s -mtriple=x86_64-unknown-unknown -o /dev/null 2>&1 | FileCheck %s -check-prefix=NOREMARK -allow-empty
33 ; RUN: llc %s -mtriple=x86_64-unknown-unknown -o /dev/null -pass-remarks-output=%t.yaml
34 ; RUN: cat %t.yaml | FileCheck %s -check-prefix=YAML
36 ; YAML-NEXT: Pass: stack-protector
37 ; YAML-NEXT: Name: StackProtectorRequested
38 ; YAML-NEXT: Function: attribute_ssp
40 ; YAML-NEXT: - String: 'Stack protection applied to function '
41 ; YAML-NEXT: - Function: attribute_ssp
42 ; YAML-NEXT: - String: ' due to a function attribute or command-line switch'
45 define void @nossp() ssp {
49 define void @attribute_ssp() sspreq {
53 define void @alloca_fixed_small_nossp() ssp {
54 %1 = alloca i8, i64 2, align 16
58 define void @alloca_fixed_small_ssp() sspstrong {
59 %1 = alloca i8, i64 2, align 16
63 define void @alloca_fixed_large_ssp() ssp {
64 %1 = alloca i8, i64 64, align 16
68 define void @alloca_variable_ssp(i64 %x) ssp {
69 %1 = alloca i8, i64 %x, align 16
73 define void @buffer_ssp() sspstrong {
74 %x = alloca [64 x i32], align 16
78 %struct.X = type { [64 x i32] }
79 define void @struct_ssp() sspstrong {
80 %x = alloca %struct.X, align 4
84 define void @address_ssp() sspstrong {
86 %x = alloca i32, align 4
87 %y = alloca ptr, align 8
88 store i32 32, ptr %x, align 4
89 store ptr %x, ptr %y, align 8
93 define void @multiple_ssp() sspreq {
95 %x = alloca %struct.X, align 4
96 %y = alloca [64 x i32], align 16
97 %a = alloca i32, align 4
98 %b = alloca ptr, align 8
99 %0 = alloca i8, i64 2, align 16
100 store i32 32, ptr %a, align 4
101 store ptr %a, ptr %b, align 8