Skip to content

Commit e57b4b1

Browse files
encode compiler team acceptance of -Cforce-frame-pointers change
1 parent a6b62d8 commit e57b4b1

File tree

1 file changed

+30
-5
lines changed

1 file changed

+30
-5
lines changed

tests/codegen/frame-pointer-cli-control.rs

Lines changed: 30 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,37 @@
88
//@ [aarch64-apple-on] compile-flags: --target=aarch64-apple-darwin -Cforce-frame-pointers=on
99
//@ [aarch64-apple-off] needs-llvm-components: aarch64
1010
//@ [aarch64-apple-off] compile-flags: --target=aarch64-apple-darwin -Cforce-frame-pointers=off
11-
/*
12-
Tests that the frame pointers can be controlled by the CLI. We find aarch64-apple-darwin useful
13-
because of its icy-clear policy regarding frame pointers (software SHALL be compiled with them),
14-
e.g. https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms says:
11+
/*!
12+
13+
Tests the extent to which frame pointers can be controlled by the CLI.
14+
The behavior of our frame pointer options, at present, is an irreversible ratchet, where
15+
a "weaker" option that allows omitting frame pointers may be overridden by the target demanding
16+
that all code (or all non-leaf code, more often) must be compiled with frame pointers.
17+
This was discussed on 2025-05-22 in the T-compiler meeting and accepted as an intentional change,
18+
ratifying the prior decisions by compiler contributors and reviewers as correct,
19+
though it was also acknowledged that the flag allows somewhat confusing inputs.
20+
21+
We find aarch64-apple-darwin useful because of its icy-clear policy regarding frame pointers,
22+
e.g. <https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms> says:
1523
1624
* The frame pointer register (x29) must always address a valid frame record. Some functions —
1725
such as leaf functions or tail calls — may opt not to create an entry in this list.
1826
As a result, stack traces are always meaningful, even without debug information.
27+
28+
Many Rust fn, if externally visible, may be expected to follow target ABI by tools or asm code!
29+
This can make it a problem to generate ABI-incorrect code, which may mean "with frame pointers".
30+
For this and other reasons, `-Cforce-frame-pointers=off` cannot override the target definition.
31+
This can cause some confusion because it is "reverse polarity" relative to C compilers, which have
32+
commands like `-fomit-frame-pointer`, `-fomit-leaf-frame-pointer`, or `-fno-omit-frame-pointer`!
33+
34+
Specific cases where platforms or tools rely on frame pointers for sound or correct unwinding:
35+
- illumos: <https://smartos.org/bugview/OS-7515>
36+
- aarch64-windows: <https://github.com/rust-lang/rust/issues/123686>
37+
- aarch64-linux: <https://github.com/rust-lang/rust/issues/123733>
38+
- dtrace (freebsd and openbsd): <https://github.com/rust-lang/rust/issues/97723>
39+
- openbsd: <https://github.com/rust-lang/rust/issues/43575>
40+
- i686-msvc <https://github.com/rust-lang/backtrace-rs/pull/584#issuecomment-1966177530>
41+
- i686-mingw: <https://github.com/rust-lang/rust/commit/3f1d3948d6d434b34dd47f132c126a6cb6b8a4ab>
1942
*/
2043
#![feature(no_core, lang_items)]
2144
#![no_core]
@@ -32,5 +55,7 @@ pub fn peach(x: u32) -> u32 {
3255
// force-on-SAME: {{.*}}"frame-pointer"="all"
3356
// aarch64-apple-SAME: {{.*}}"frame-pointer"="non-leaf"
3457
// aarch64-apple-on-SAME: {{.*}}"frame-pointer"="all"
35-
// aarch64-apple-off-NOT: {{.*}}"frame-pointer"{{.*}}
58+
//
59+
// yes, we are testing this doesn't do anything:
60+
// aarch64-apple-off-SAME: {{.*}}"frame-pointer"="non-leaf"
3661
// CHECK-SAME: }

0 commit comments

Comments
 (0)