|
| 1 | +//@ add-core-stubs |
| 2 | +//@ compile-flags: --crate-type=rlib -Copt-level=0 |
| 3 | +//@ revisions: force-on aarch64-apple aarch64-apple-on aarch64-apple-off |
| 4 | +//@ [force-on] compile-flags: -Cforce-frame-pointers=on |
| 5 | +//@ [aarch64-apple] needs-llvm-components: aarch64 |
| 6 | +//@ [aarch64-apple] compile-flags: --target=aarch64-apple-darwin |
| 7 | +//@ [aarch64-apple-on] needs-llvm-components: aarch64 |
| 8 | +//@ [aarch64-apple-on] compile-flags: --target=aarch64-apple-darwin -Cforce-frame-pointers=on |
| 9 | +//@ [aarch64-apple-off] needs-llvm-components: aarch64 |
| 10 | +//@ [aarch64-apple-off] compile-flags: --target=aarch64-apple-darwin -Cforce-frame-pointers=off |
| 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: |
| 23 | +
|
| 24 | +* The frame pointer register (x29) must always address a valid frame record. Some functions — |
| 25 | + such as leaf functions or tail calls — may opt not to create an entry in this list. |
| 26 | + 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> |
| 42 | +*/ |
| 43 | +#![feature(no_core, lang_items)] |
| 44 | +#![no_core] |
| 45 | + |
| 46 | +extern crate minicore; |
| 47 | + |
| 48 | +// CHECK: define i32 @peach{{.*}}[[PEACH_ATTRS:\#[0-9]+]] { |
| 49 | +#[no_mangle] |
| 50 | +pub fn peach(x: u32) -> u32 { |
| 51 | + x |
| 52 | +} |
| 53 | + |
| 54 | +// CHECK: attributes [[PEACH_ATTRS]] = { |
| 55 | +// force-on-SAME: {{.*}}"frame-pointer"="all" |
| 56 | +// aarch64-apple-SAME: {{.*}}"frame-pointer"="non-leaf" |
| 57 | +// aarch64-apple-on-SAME: {{.*}}"frame-pointer"="all" |
| 58 | +// |
| 59 | +// yes, we are testing this doesn't do anything: |
| 60 | +// aarch64-apple-off-SAME: {{.*}}"frame-pointer"="non-leaf" |
| 61 | +// CHECK-SAME: } |
0 commit comments