Skip to content

Commit f82023d

Browse files
authored
[clang][driver][arm][macho] Default to -mframe-pointer=non-leaf. (#154216)
The commit in [1] changes the behavior of the Arm backend for the attribute frame-pointer=all. Before [1], leaf functions marked with frame-pointer=all were not emitting the frame-pointer. After [1], frame-pointer=all started generating frame pointer for all functions, including leaf functions. However, the default behavior for the driver in clang is to emit the command line option `-mframe-pointer=all` on Arm, if no options for handling the frame pointer is specified at command line. This causes observable regressions. This patch addresses these regressions by configuring the driver so to emit `-mframe-pointer=non-leaf` when targeting Arm. Codegen tests dealing with frame pointer generation have been extended to handle functions with a tail call, since this configuration was missing. [1] 4a2bd78
1 parent 6d54d9f commit f82023d

File tree

6 files changed

+112
-14
lines changed

6 files changed

+112
-14
lines changed

clang/lib/Driver/ToolChains/CommonArgs.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,9 @@ static bool useLeafFramePointerForTargetByDefault(const llvm::Triple &Triple) {
156156
(Triple.isAndroid() && !Triple.isARM()))
157157
return false;
158158

159+
if ((Triple.isARM() || Triple.isThumb()) && Triple.isOSBinFormatMachO())
160+
return false;
161+
159162
return true;
160163
}
161164

clang/test/Driver/frame-pointer-elim.c

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -73,12 +73,12 @@
7373
// RUN: %clang -### -target armv7s-apple-ios -fomit-frame-pointer %s 2>&1 | \
7474
// RUN: FileCheck --check-prefix=WARN-OMIT-7S %s
7575
// WARN-OMIT-7S: warning: optimization flag '-fomit-frame-pointer' is not supported for target 'armv7s'
76-
// WARN-OMIT-7S: "-mframe-pointer=all"
76+
// WARN-OMIT-7S: "-mframe-pointer=non-leaf"
7777

7878
// RUN: %clang -### -target armv7k-apple-watchos -fomit-frame-pointer %s 2>&1 | \
7979
// RUN: FileCheck --check-prefix=WARN-OMIT-7K %s
8080
// WARN-OMIT-7K: warning: optimization flag '-fomit-frame-pointer' is not supported for target 'armv7k'
81-
// WARN-OMIT-7K: "-mframe-pointer=all"
81+
// WARN-OMIT-7K: "-mframe-pointer=non-leaf"
8282

8383
// RUN: %clang -### -target armv7s-apple-ios8.0 -momit-leaf-frame-pointer %s 2>&1 | \
8484
// RUN: FileCheck --check-prefix=WARN-OMIT-LEAF-7S %s
@@ -190,22 +190,34 @@
190190
// RUN: FileCheck --check-prefix=KEEP-NONE %s
191191

192192
// Check that for Apple bare metal targets, we're keeping frame pointers by default
193-
// RUN: %clang -### --target=thumbv6m-apple-none-macho -S %s 2>&1 | \
194-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
195-
// RUN: %clang -### --target=thumbv6m-apple-none-macho -S -fno-omit-frame-pointer %s 2>&1 | \
196-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
193+
// RUN: %clang -### --target=armv6m-apple-none-macho -S %s 2>&1 | \
194+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
195+
// RUN: %clang -### --target=armv6m-apple-none-macho -S -fno-omit-frame-pointer %s 2>&1 | \
196+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
197197
// RUN: %clang -### --target=arm-apple-none-macho -S %s 2>&1 | \
198-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
198+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
199199
// RUN: %clang -### --target=arm-apple-none-macho -S -fno-omit-frame-pointer %s 2>&1 | \
200-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
201-
// RUN: %clang -### --target=thumbv6m-apple-none-macho -S -O1 %s 2>&1 | \
202-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
203-
// RUN: %clang -### --target=thumbv6m-apple-none-macho -S -O1 -fno-omit-frame-pointer %s 2>&1 | \
204-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
200+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
201+
// RUN: %clang -### --target=armv6m-apple-none-macho -S -O1 %s 2>&1 | \
202+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
203+
// 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
205205
// RUN: %clang -### --target=arm-apple-none-macho -S -O1 %s 2>&1 | \
206-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
206+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
207207
// RUN: %clang -### --target=arm-apple-none-macho -S -O1 -fno-omit-frame-pointer %s 2>&1 | \
208-
// RUN: FileCheck --check-prefix=KEEP-ALL %s
208+
// RUN: FileCheck --check-prefix=KEEP-NON-LEAF %s
209+
210+
// RUN: %clang --target=armv7-apple-macho -### -S %s 2>&1 \
211+
// RUN: -fomit-frame-pointer \
212+
// RUN: | FileCheck -check-prefix=KEEP-NONE %s
213+
214+
// RUN: %clang --target=armv7-apple-macho -### -S %s 2>&1 \
215+
// RUN: -fno-omit-frame-pointer -mno-omit-leaf-frame-pointer \
216+
// RUN: | FileCheck -check-prefix=KEEP-ALL %s
217+
218+
// RUN: %clang --target=armv7-apple-macho -### -S %s 2>&1 \
219+
// RUN: -fomit-frame-pointer -mno-omit-leaf-frame-pointer \
220+
// RUN: | FileCheck -check-prefix=KEEP-NONE %s
209221

210222
// AArch64 bare metal targets behave like hosted targets
211223
// RUN: %clang -### --target=aarch64-none-elf -S %s 2>&1 | \

clang/test/Driver/frame-pointer.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,12 +80,16 @@
8080
// RUN: %clang --target=loongarch64 -### -S -O3 %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK3-64 %s
8181
// RUN: %clang --target=loongarch64 -### -S -Os %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECKs-64 %s
8282

83+
// RUN: %clang --target=armv7-apple-macho -### -S %s -o %t.s 2>&1 | FileCheck -check-prefix=CHECK-MACHO-32 %s
84+
8385
// CHECK0-32: -mframe-pointer=all
8486
// CHECK1-32-NOT: -mframe-pointer=all
8587
// CHECK2-32-NOT: -mframe-pointer=all
8688
// CHECK3-32-NOT: -mframe-pointer=all
8789
// CHECKs-32-NOT: -mframe-pointer=all
8890

91+
// CHECK-MACHO-32: -mframe-pointer=non-leaf
92+
8993
// CHECK0-64: -mframe-pointer=all
9094
// CHECK1-64-NOT: -mframe-pointer=all
9195
// CHECK2-64-NOT: -mframe-pointer=all

llvm/test/CodeGen/ARM/frame-chain.ll

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,3 +223,33 @@ define dso_local void @required_fp(i32 %0, i32 %1) {
223223
store i64 %8, ptr %6, align 8
224224
ret void
225225
}
226+
227+
define dso_local noundef i32 @leaf_tailcall(i32 noundef %0) {
228+
; LEAF-FP-LABEL: leaf_tailcall:
229+
; LEAF-FP: @ %bb.0:
230+
; LEAF-FP-NEXT: .save {r11, lr}
231+
; LEAF-FP-NEXT: push {r11, lr}
232+
; LEAF-FP-NEXT: .setfp r11, sp
233+
; LEAF-FP-NEXT: mov r11, sp
234+
; LEAF-FP-NEXT: pop {r11, lr}
235+
; LEAF-FP-NEXT: b leaf
236+
;
237+
; LEAF-FP-AAPCS-LABEL: leaf_tailcall:
238+
; LEAF-FP-AAPCS: @ %bb.0:
239+
; LEAF-FP-AAPCS-NEXT: .save {r11, lr}
240+
; LEAF-FP-AAPCS-NEXT: push {r11, lr}
241+
; LEAF-FP-AAPCS-NEXT: .setfp r11, sp
242+
; LEAF-FP-AAPCS-NEXT: mov r11, sp
243+
; LEAF-FP-AAPCS-NEXT: pop {r11, lr}
244+
; LEAF-FP-AAPCS-NEXT: b leaf
245+
;
246+
; LEAF-NOFP-LABEL: leaf_tailcall:
247+
; LEAF-NOFP: @ %bb.0:
248+
; LEAF-NOFP-NEXT: b leaf
249+
;
250+
; LEAF-NOFP-AAPCS-LABEL: leaf_tailcall:
251+
; LEAF-NOFP-AAPCS: @ %bb.0:
252+
; LEAF-NOFP-AAPCS-NEXT: b leaf
253+
%a = tail call noundef i32 @leaf(i32 noundef %0)
254+
ret i32 %a
255+
}

llvm/test/CodeGen/Thumb/frame-chain.ll

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,3 +273,44 @@ define dso_local void @required_fp(i32 %0, i32 %1) {
273273
store i64 %8, ptr %6, align 8
274274
ret void
275275
}
276+
277+
define dso_local noundef i32 @leaf_tailcall(i32 noundef %0) {
278+
; FP-LABEL: leaf_tailcall:
279+
; FP: @ %bb.0:
280+
; FP-NEXT: .save {r7, lr}
281+
; FP-NEXT: push {r7, lr}
282+
; FP-NEXT: .setfp r7, sp
283+
; FP-NEXT: add r7, sp, #0
284+
; FP-NEXT: bl leaf
285+
; FP-NEXT: pop {r7, pc}
286+
;
287+
; FP-AAPCS-LABEL: leaf_tailcall:
288+
; FP-AAPCS: @ %bb.0:
289+
; FP-AAPCS-NEXT: .save {lr}
290+
; FP-AAPCS-NEXT: push {lr}
291+
; FP-AAPCS-NEXT: mov r3, r11
292+
; FP-AAPCS-NEXT: .save {r11}
293+
; FP-AAPCS-NEXT: push {r3}
294+
; FP-AAPCS-NEXT: .setfp r11, sp
295+
; FP-AAPCS-NEXT: mov r11, sp
296+
; FP-AAPCS-NEXT: bl leaf
297+
; FP-AAPCS-NEXT: pop {r1}
298+
; FP-AAPCS-NEXT: mov r11, r1
299+
; FP-AAPCS-NEXT: pop {pc}
300+
;
301+
; NOFP-LABEL: leaf_tailcall:
302+
; NOFP: @ %bb.0:
303+
; NOFP-NEXT: .save {r7, lr}
304+
; NOFP-NEXT: push {r7, lr}
305+
; NOFP-NEXT: bl leaf
306+
; NOFP-NEXT: pop {r7, pc}
307+
;
308+
; NOFP-AAPCS-LABEL: leaf_tailcall:
309+
; NOFP-AAPCS: @ %bb.0:
310+
; NOFP-AAPCS-NEXT: .save {r7, lr}
311+
; NOFP-AAPCS-NEXT: push {r7, lr}
312+
; NOFP-AAPCS-NEXT: bl leaf
313+
; NOFP-AAPCS-NEXT: pop {r7, pc}
314+
%a = tail call noundef i32 @leaf(i32 noundef %0)
315+
ret i32 %a
316+
}

llvm/test/CodeGen/Thumb2/frame-pointer.ll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,14 @@ define void @call_nononleaffpelim() "frame-pointer"="non-leaf" {
9393
ret void
9494
}
9595

96+
define void @call_nononleaffpelim_tailcall() "frame-pointer"="non-leaf" {
97+
; CHECK-LABEL: call_nononleaffpelim_tailcall:
98+
; CHECK-NOT: push
99+
; CHECK: b foo
100+
tail call void @foo()
101+
ret void
102+
}
103+
96104
; Has a high register clobbered, no need for a frame pointer.
97105
define void @highreg() {
98106
; CHECK-LABEL: highreg:

0 commit comments

Comments
 (0)