Skip to content

Commit 8d4031e

Browse files
compiler: set Apple frame pointers by architecture
Apple targets can now overriding this configuration and instead use the default based on their architecture, which means aarch64 targets now have less frame pointers in leaf functions.
1 parent 15825b7 commit 8d4031e

17 files changed

+24
-37
lines changed

compiler/rustc_target/src/spec/base/apple/mod.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,13 @@ pub(crate) fn base(
124124
// to v4, so we do the same.
125125
// https://github.com/llvm/llvm-project/blob/378778a0d10c2f8d5df8ceff81f95b6002984a4b/clang/lib/Driver/ToolChains/Darwin.cpp#L1203
126126
default_dwarf_version: 4,
127-
frame_pointer: FramePointer::Always,
127+
frame_pointer: match arch {
128+
// clang ignores `-fomit-frame-pointer` for Armv7, it only accepts `-momit-leaf-frame-pointer`
129+
Armv7k | Armv7s => FramePointer::Always,
130+
// clang supports omitting frame pointers for the rest, but... don't?
131+
Arm64 | Arm64e | Arm64_32 => FramePointer::NonLeaf,
132+
I386 | I686 | X86_64 | X86_64h => FramePointer::Always,
133+
},
128134
has_rpath: true,
129135
dll_suffix: ".dylib".into(),
130136
archive_format: "darwin".into(),

compiler/rustc_target/src/spec/targets/aarch64_apple_darwin.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("macos", Arch::Arm64, TargetAbi::Normal);
@@ -17,7 +17,6 @@ pub(crate) fn target() -> Target {
1717
arch,
1818
options: TargetOptions {
1919
mcount: "\u{1}mcount".into(),
20-
frame_pointer: FramePointer::NonLeaf,
2120
cpu: "apple-m1".into(),
2221
max_atomic_width: Some(128),
2322
// FIXME: The leak sanitizer currently fails the tests, see #88132.

compiler/rustc_target/src/spec/targets/aarch64_apple_ios.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("ios", Arch::Arm64, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a7".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/aarch64_apple_ios_macabi.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("ios", Arch::Arm64, TargetAbi::MacCatalyst);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a12".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::LEAK | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/aarch64_apple_ios_sim.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("ios", Arch::Arm64, TargetAbi::Simulator);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a7".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/aarch64_apple_tvos.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("tvos", Arch::Arm64, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a7".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
..opts
2322
},
2423
}

compiler/rustc_target/src/spec/targets/aarch64_apple_tvos_sim.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("tvos", Arch::Arm64, TargetAbi::Simulator);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a7".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
..opts
2322
},
2423
}

compiler/rustc_target/src/spec/targets/aarch64_apple_visionos.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("visionos", Arch::Arm64, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a16".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/aarch64_apple_visionos_sim.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("visionos", Arch::Arm64, TargetAbi::Simulator);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a16".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/aarch64_apple_watchos_sim.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("watchos", Arch::Arm64, TargetAbi::Simulator);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a7".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
..opts
2322
},
2423
}

compiler/rustc_target/src/spec/targets/arm64e_apple_darwin.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("macos", Arch::Arm64e, TargetAbi::Normal);
@@ -17,7 +17,6 @@ pub(crate) fn target() -> Target {
1717
arch,
1818
options: TargetOptions {
1919
mcount: "\u{1}mcount".into(),
20-
frame_pointer: FramePointer::NonLeaf,
2120
cpu: "apple-m1".into(),
2221
max_atomic_width: Some(128),
2322
// FIXME: The leak sanitizer currently fails the tests, see #88132.

compiler/rustc_target/src/spec/targets/arm64e_apple_ios.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("ios", Arch::Arm64e, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a12,+v8.3a,+pauth".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
supported_sanitizers: SanitizerSet::ADDRESS | SanitizerSet::THREAD,
2322
..opts
2423
},

compiler/rustc_target/src/spec/targets/arm64e_apple_tvos.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("tvos", Arch::Arm64e, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
features: "+neon,+fp-armv8,+apple-a12,+v8.3a,+pauth".into(),
2020
max_atomic_width: Some(128),
21-
frame_pointer: FramePointer::NonLeaf,
2221
..opts
2322
},
2423
}

compiler/rustc_target/src/spec/targets/i686_apple_darwin.rs

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("macos", Arch::I686, TargetAbi::Normal);
@@ -16,11 +16,6 @@ pub(crate) fn target() -> Target {
1616
i128:128-f64:32:64-f80:128-n8:16:32-S128"
1717
.into(),
1818
arch,
19-
options: TargetOptions {
20-
mcount: "\u{1}mcount".into(),
21-
max_atomic_width: Some(64),
22-
frame_pointer: FramePointer::Always,
23-
..opts
24-
},
19+
options: TargetOptions { mcount: "\u{1}mcount".into(), max_atomic_width: Some(64), ..opts },
2520
}
2621
}

compiler/rustc_target/src/spec/targets/x86_64_apple_darwin.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (opts, llvm_target, arch) = base("macos", Arch::X86_64, TargetAbi::Normal);
@@ -18,7 +18,6 @@ pub(crate) fn target() -> Target {
1818
options: TargetOptions {
1919
mcount: "\u{1}mcount".into(),
2020
max_atomic_width: Some(128), // penryn+ supports cmpxchg16b
21-
frame_pointer: FramePointer::Always,
2221
supported_sanitizers: SanitizerSet::ADDRESS
2322
| SanitizerSet::CFI
2423
| SanitizerSet::LEAK

compiler/rustc_target/src/spec/targets/x86_64h_apple_darwin.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
use crate::spec::base::apple::{Arch, TargetAbi, base};
2-
use crate::spec::{FramePointer, SanitizerSet, Target, TargetMetadata, TargetOptions};
2+
use crate::spec::{SanitizerSet, Target, TargetMetadata, TargetOptions};
33

44
pub(crate) fn target() -> Target {
55
let (mut opts, llvm_target, arch) = base("macos", Arch::X86_64h, TargetAbi::Normal);
66
opts.max_atomic_width = Some(128);
7-
opts.frame_pointer = FramePointer::Always;
87
opts.supported_sanitizers =
98
SanitizerSet::ADDRESS | SanitizerSet::CFI | SanitizerSet::LEAK | SanitizerSet::THREAD;
109

tests/codegen/frame-pointer.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ pub fn peach(x: u32) -> u32 {
2626

2727
// CHECK: attributes [[PEACH_ATTRS]] = {
2828
// x64-linux-NOT: {{.*}}"frame-pointer"{{.*}}
29-
// x64-apple-SAME: {{.*}}"frame-pointer"="all"
29+
// x64-apple-SAME: {{.*}}"frame-pointer"="non-leaf"
3030
// force-SAME: {{.*}}"frame-pointer"="all"
3131
//
3232
// AAPCS64 demands frame pointers:

0 commit comments

Comments
 (0)