|
2 | 2 | // KEEP-ALL: "-mframe-pointer=all" |
3 | 3 | // KEEP-NON-LEAF-NOT: warning: argument unused |
4 | 4 | // KEEP-NON-LEAF: "-mframe-pointer=non-leaf" |
| 5 | +// KEEP-NON-LEAF-NO-RESERVE-NOT: warning: argument unused |
| 6 | +// KEEP-NON-LEAF-NO-RESERVE: "-mframe-pointer=non-leaf-no-reserve" |
5 | 7 | // KEEP-NONE-NOT: warning: argument unused |
6 | 8 | // KEEP-NONE: "-mframe-pointer=none" |
7 | 9 | // KEEP-RESERVED-NOT: warning: argument unused |
|
24 | 26 | // -momit-leaf-frame-pointer omits leaf frame pointer. |
25 | 27 | // -fno-omit-frame-pointer loses out to -momit-leaf-frame-pointer. |
26 | 28 | // RUN: %clang -### --target=i386 -S -momit-leaf-frame-pointer %s 2>&1 | \ |
27 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 29 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
28 | 30 | // RUN: %clang -### --target=i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer %s 2>&1 | \ |
29 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 31 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
30 | 32 | // RUN: %clang -### --target=i386-linux -S -O1 -momit-leaf-frame-pointer %s 2>&1 | \ |
31 | 33 | // RUN: FileCheck --check-prefix=KEEP-NONE %s |
32 | 34 |
|
| 35 | +// -momit-leaf-frame-pointer -mreserve-frame-pointer-reg results in the frame pointer reg being reserved |
| 36 | +// RUN: %clang -### --target=i386 -S -momit-leaf-frame-pointer -mreserve-frame-pointer-reg %s 2>&1 | \ |
| 37 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 38 | + |
| 39 | +// -fomit-frame-pointer -mreserve-frame-pointer-reg results in the frame pointer reg being reserved |
| 40 | +// RUN: %clang -### --target=i386 -S -fomit-frame-pointer -mreserve-frame-pointer-reg %s 2>&1 | \ |
| 41 | +// RUN: FileCheck --check-prefix=KEEP-RESERVED %s |
| 42 | + |
33 | 43 | // fno-omit-frame-pointer -momit-leaf-frame-pointer can be overwritten by |
34 | 44 | // fomit-frame-pointer later on the command without warning |
35 | 45 | // RUN: %clang -### --target=i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer -fomit-frame-pointer %s 2>&1 | \ |
36 | 46 | // RUN: FileCheck --check-prefix=KEEP-NONE %s |
37 | 47 |
|
38 | 48 | // RUN: %clang -### --target=i386-linux -S -O1 -fno-omit-frame-pointer -momit-leaf-frame-pointer %s 2>&1 | \ |
39 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 49 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
40 | 50 | // Explicit or default -fomit-frame-pointer wins over -mno-omit-leaf-frame-pointer. |
41 | 51 | // RUN: %clang -### --target=i386 -S %s -fomit-frame-pointer -mno-omit-leaf-frame-pointer 2>&1 | \ |
42 | 52 | // RUN: FileCheck --check-prefix=KEEP-NONE %s |
|
68 | 78 | // RUN: FileCheck --check-prefix=KEEP-NONE %s |
69 | 79 |
|
70 | 80 | // RUN: %clang -### --target=i386-darwin -S -momit-leaf-frame-pointer %s 2>&1 | \ |
71 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 81 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
72 | 82 |
|
73 | 83 | // RUN: %clang -### -target armv7s-apple-ios -fomit-frame-pointer %s 2>&1 | \ |
74 | 84 | // RUN: FileCheck --check-prefix=WARN-OMIT-7S %s |
75 | 85 | // WARN-OMIT-7S: warning: optimization flag '-fomit-frame-pointer' is not supported for target 'armv7s' |
76 | | -// WARN-OMIT-7S: "-mframe-pointer=non-leaf" |
| 86 | +// WARN-OMIT-7S: "-mframe-pointer=non-leaf-no-reserve" |
77 | 87 |
|
78 | 88 | // RUN: %clang -### -target armv7k-apple-watchos -fomit-frame-pointer %s 2>&1 | \ |
79 | 89 | // RUN: FileCheck --check-prefix=WARN-OMIT-7K %s |
80 | 90 | // WARN-OMIT-7K: warning: optimization flag '-fomit-frame-pointer' is not supported for target 'armv7k' |
81 | | -// WARN-OMIT-7K: "-mframe-pointer=non-leaf" |
| 91 | +// WARN-OMIT-7K: "-mframe-pointer=non-leaf-no-reserve" |
82 | 92 |
|
83 | 93 | // RUN: %clang -### -target armv7s-apple-ios8.0 -momit-leaf-frame-pointer %s 2>&1 | \ |
84 | 94 | // RUN: FileCheck --check-prefix=WARN-OMIT-LEAF-7S %s |
85 | 95 | // WARN-OMIT-LEAF-7S-NOT: warning: optimization flag '-momit-leaf-frame-pointer' is not supported for target 'armv7s' |
86 | | -// WARN-OMIT-LEAF-7S: "-mframe-pointer=non-leaf" |
| 96 | +// WARN-OMIT-LEAF-7S: "-mframe-pointer=non-leaf-no-reserve" |
87 | 97 |
|
88 | 98 | // On AArch64, PS4, PS5, and VE, default to omitting the frame pointer on leaf |
89 | 99 | // functions |
90 | 100 | // RUN: %clang -### --target=aarch64 -S %s 2>&1 | \ |
91 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 101 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
92 | 102 | // RUN: %clang -### --target=x86_64-scei-ps4 -S %s 2>&1 | \ |
93 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 103 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
94 | 104 | // RUN: %clang -### --target=x86_64-scei-ps4 -S -O2 %s 2>&1 | \ |
95 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 105 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
96 | 106 | // RUN: %clang -### --target=x86_64-sie-ps5 -S %s 2>&1 | \ |
97 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 107 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
98 | 108 | // RUN: %clang -### --target=x86_64-sie-ps5 -S -O2 %s 2>&1 | \ |
99 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 109 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
100 | 110 | // RUN: %clang -### -target aarch64-apple-darwin -arch arm64_32 -S %s 2>&1 | \ |
101 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 111 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
102 | 112 | // RUN: %clang -### --target=ve-unknown-linux-gnu -S %s 2>&1 | \ |
103 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 113 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
104 | 114 | // RUN: %clang -### --target=aarch64-linux-android -S %s 2>&1 | \ |
105 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 115 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
106 | 116 | // RUN: %clang -### --target=aarch64-linux-android -S -O2 %s 2>&1 | \ |
107 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 117 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
108 | 118 | // RUN: %clang -### --target=aarch64-linux-android -S -Os %s 2>&1 | \ |
109 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 119 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
110 | 120 |
|
111 | 121 | // RUN: %clang -### --target=powerpc64 -S %s 2>&1 | \ |
112 | 122 | // RUN: FileCheck --check-prefix=KEEP-ALL %s |
|
161 | 171 | // RUN: %clang -### --target=armv7a-linux-androideabi- -mthumb -mbig-endian -O1 -S %s 2>&1 | \ |
162 | 172 | // RUN: FileCheck --check-prefix=KEEP-ALL %s |
163 | 173 | // RUN: %clang -### --target=riscv64-linux-android -O1 -S %s 2>&1 | \ |
164 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 174 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
165 | 175 | // RUN: %clang -### --target=riscv64-linux-android -mbig-endian -O1 -S %s 2>&1 | \ |
166 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 176 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
167 | 177 |
|
168 | 178 | // On ARM backend bare metal targets, frame pointer is omitted |
169 | 179 | // RUN: %clang -### --target=arm-arm-none-eabi -S %s 2>&1 | \ |
|
191 | 201 |
|
192 | 202 | // Check that for Apple bare metal targets, we're keeping frame pointers by default |
193 | 203 | // RUN: %clang -### --target=armv6m-apple-none-macho -S %s 2>&1 | \ |
194 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 204 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
195 | 205 | // RUN: %clang -### --target=armv6m-apple-none-macho -S -fno-omit-frame-pointer %s 2>&1 | \ |
196 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 206 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
197 | 207 | // RUN: %clang -### --target=arm-apple-none-macho -S %s 2>&1 | \ |
198 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 208 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
199 | 209 | // RUN: %clang -### --target=arm-apple-none-macho -S -fno-omit-frame-pointer %s 2>&1 | \ |
200 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 210 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
201 | 211 | // RUN: %clang -### --target=armv6m-apple-none-macho -S -O1 %s 2>&1 | \ |
202 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 212 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
203 | 213 | // RUN: %clang -### --target=armv6m-apple-none-macho -S -O1 -fno-omit-frame-pointer %s 2>&1 | \ |
204 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 214 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
205 | 215 | // RUN: %clang -### --target=arm-apple-none-macho -S -O1 %s 2>&1 | \ |
206 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 216 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
207 | 217 | // RUN: %clang -### --target=arm-apple-none-macho -S -O1 -fno-omit-frame-pointer %s 2>&1 | \ |
208 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 218 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
209 | 219 |
|
210 | 220 | // RUN: %clang --target=armv7-apple-macho -### -S %s 2>&1 \ |
211 | 221 | // RUN: -fomit-frame-pointer \ |
|
221 | 231 |
|
222 | 232 | // AArch64 bare metal targets behave like hosted targets |
223 | 233 | // RUN: %clang -### --target=aarch64-none-elf -S %s 2>&1 | \ |
224 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 234 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
225 | 235 | // RUN: %clang -### --target=aarch64-none-elf -S -O1 %s 2>&1 | \ |
226 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 236 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
227 | 237 | // RUN: %clang -### --target=aarch64-none-elf -S -fno-omit-frame-pointer %s 2>&1 | \ |
228 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 238 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
229 | 239 | // RUN: %clang -### --target=aarch64-none-elf -S -O1 -fno-omit-frame-pointer %s 2>&1 | \ |
230 | | -// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s |
| 240 | +// RUN: FileCheck --check-prefix=KEEP-NON-LEAF-NO-RESERVE %s |
231 | 241 |
|
232 | 242 | // AArch64 Windows requires that the frame pointer be reserved |
233 | 243 | // RUN: %clang -### --target=aarch64-pc-windows-msvc -S -fomit-frame-pointer %s 2>&1 | \ |
234 | 244 | // RUN: FileCheck --check-prefix=KEEP-RESERVED %s |
235 | 245 |
|
| 246 | +// -mno-reserve-frame-pointer-reg overrides platform defaults |
| 247 | +// But -mno-reserve-frame-pointer-reg should override the target platform default |
| 248 | +// RUN: %clang -### --target=aarch64-pc-windows-msvc -S -fomit-frame-pointer -mno-reserve-frame-pointer-reg %s 2>&1 | \ |
| 249 | +// RUN: FileCheck --check-prefix=KEEP-NONE %s |
| 250 | + |
236 | 251 | void f0() {} |
237 | 252 | void f1() { f0(); } |
0 commit comments