[opaque pointer type] Add textual IR support for explicit type parameter to the call...
[oota-llvm.git] / test / Transforms / Inline / inline_ssp.ll
1 ; RUN: opt -inline %s -S | FileCheck %s
2 ; Ensure SSP attributes are propagated correctly when inlining.
3
4 @.str = private unnamed_addr constant [11 x i8] c"fun_nossp\0A\00", align 1
5 @.str1 = private unnamed_addr constant [9 x i8] c"fun_ssp\0A\00", align 1
6 @.str2 = private unnamed_addr constant [15 x i8] c"fun_sspstrong\0A\00", align 1
7 @.str3 = private unnamed_addr constant [12 x i8] c"fun_sspreq\0A\00", align 1
8
9 ; These first four functions (@fun_sspreq, @fun_sspstrong, @fun_ssp, @fun_nossp)
10 ; are used by the remaining functions to ensure that the SSP attributes are
11 ; propagated correctly.  The caller should have its SSP attribute set as:
12 ; strictest(caller-ssp-attr, callee-ssp-attr), where strictness is ordered as:
13 ;  sspreq > sspstrong > ssp > [no ssp]
14 define internal void @fun_sspreq() nounwind sspreq uwtable {
15 entry:
16   %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([12 x i8], [12 x i8]* @.str3, i32 0, i32 0))
17   ret void
18 }
19
20 define internal void @fun_sspstrong() nounwind sspstrong uwtable {
21 entry:
22   %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([15 x i8], [15 x i8]* @.str2, i32 0, i32 0))
23   ret void
24 }
25
26 define internal void @fun_ssp() nounwind ssp uwtable {
27 entry:
28   %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str1, i32 0, i32 0))
29   ret void
30 }
31
32 define internal void @fun_nossp() nounwind uwtable {
33 entry:
34   %call = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str, i32 0, i32 0))
35   ret void
36 }
37
38 ; Tests start below 
39
40 define void @inline_req_req() nounwind sspreq uwtable {
41 entry:
42 ; CHECK: @inline_req_req() #0
43   call void @fun_sspreq()
44   ret void
45 }
46
47 define void @inline_req_strong() nounwind sspstrong uwtable {
48 entry:
49 ; CHECK: @inline_req_strong() #0
50   call void @fun_sspreq()
51   ret void
52 }
53
54 define void @inline_req_ssp() nounwind ssp uwtable {
55 entry:
56 ; CHECK: @inline_req_ssp() #0
57   call void @fun_sspreq()
58   ret void
59 }
60
61 define void @inline_req_nossp() nounwind uwtable {
62 entry:
63 ; CHECK: @inline_req_nossp() #0
64   call void @fun_sspreq()
65   ret void
66 }
67
68 define void @inline_strong_req() nounwind sspreq uwtable {
69 entry:
70 ; CHECK: @inline_strong_req() #0
71   call void @fun_sspstrong()
72   ret void
73 }
74
75
76 define void @inline_strong_strong() nounwind sspstrong uwtable {
77 entry:
78 ; CHECK: @inline_strong_strong() #1
79   call void @fun_sspstrong()
80   ret void
81 }
82
83 define void @inline_strong_ssp() nounwind ssp uwtable {
84 entry:
85 ; CHECK: @inline_strong_ssp() #1
86   call void @fun_sspstrong()
87   ret void
88 }
89
90 define void @inline_strong_nossp() nounwind uwtable {
91 entry:
92 ; CHECK: @inline_strong_nossp() #1
93   call void @fun_sspstrong()
94   ret void
95 }
96
97 define void @inline_ssp_req() nounwind sspreq uwtable {
98 entry:
99 ; CHECK: @inline_ssp_req() #0
100   call void @fun_ssp()
101   ret void
102 }
103
104
105 define void @inline_ssp_strong() nounwind sspstrong uwtable {
106 entry:
107 ; CHECK: @inline_ssp_strong() #1
108   call void @fun_ssp()
109   ret void
110 }
111
112 define void @inline_ssp_ssp() nounwind ssp uwtable {
113 entry:
114 ; CHECK: @inline_ssp_ssp() #2
115   call void @fun_ssp()
116   ret void
117 }
118
119 define void @inline_ssp_nossp() nounwind uwtable {
120 entry:
121 ; CHECK: @inline_ssp_nossp() #2
122   call void @fun_ssp()
123   ret void
124 }
125
126 define void @inline_nossp_req() nounwind uwtable sspreq {
127 entry:
128 ; CHECK: @inline_nossp_req() #0
129   call void @fun_nossp()
130   ret void
131 }
132
133
134 define void @inline_nossp_strong() nounwind sspstrong uwtable {
135 entry:
136 ; CHECK: @inline_nossp_strong() #1
137   call void @fun_nossp()
138   ret void
139 }
140
141 define void @inline_nossp_ssp() nounwind ssp uwtable {
142 entry:
143 ; CHECK: @inline_nossp_ssp() #2
144   call void @fun_nossp()
145   ret void
146 }
147
148 define void @inline_nossp_nossp() nounwind uwtable {
149 entry:
150 ; CHECK: @inline_nossp_nossp() #3
151   call void @fun_nossp()
152   ret void
153 }
154
155 declare i32 @printf(i8*, ...)
156
157 ; CHECK: attributes #0 = { nounwind sspreq uwtable }
158 ; CHECK: attributes #1 = { nounwind sspstrong uwtable }
159 ; CHECK: attributes #2 = { nounwind ssp uwtable }
160 ; CHECK: attributes #3 = { nounwind uwtable }