Skip to content

Commit b5f9a0d

Browse files
committed
Auto merge of #140832 - workingjubilee:aarch64-linux-should-use-frame-pointers, r=<try>
aarch64-linux: Default to FramePointer::NonLeaf For aarch64-apple and aarch64-windows, platform docs state that code must use frame pointers correctly. This is because the AAPCS64 mandates that a platform specify its frame pointer conformance requirements: - Apple: https://developer.apple.com/documentation/xcode/writing-arm64-code-for-apple-platforms#Respect-the-purpose-of-specific-CPU-registers - Windows: https://learn.microsoft.com/en-us/cpp/build/arm64-windows-abi-conventions?view=msvc-170#integer-registers - AAPCS64: https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer Unwinding code either requires unwind tables or frame pointers, and on aarch64 the expectation is that one can use frame pointers for this. Most Linux targets represent a motley variety of possible distributions, so it is unclear who to defer to on conformance, other than perhaps Arm. In the absence of a specific edict for a given aarch64-linux target, Rust will assume aarch64-linux targets also use non-leaf frame pointers. r? ghost try-job: aarch64-gnu try-job: aarch64-gnu-debug try-job: arm-android try-job: armhf-gnu try-job: dist-aarch64-linux try-job: dist-ohos try-job: test-various
2 parents 50aa041 + fbaf582 commit b5f9a0d

8 files changed

+49
-9
lines changed

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_abi::Endian;
22

3-
use crate::spec::{StackProbeType, Target, TargetMetadata, TargetOptions, base};
3+
use crate::spec::{FramePointer, StackProbeType, Target, TargetMetadata, TargetOptions, base};
44

55
pub(crate) fn target() -> Target {
66
Target {
@@ -16,6 +16,10 @@ pub(crate) fn target() -> Target {
1616
arch: "aarch64".into(),
1717
options: TargetOptions {
1818
features: "+v8a,+outline-atomics".into(),
19+
// the AAPCS64 expects use of non-leaf frame pointers per
20+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
21+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
22+
frame_pointer: FramePointer::NonLeaf,
1923
max_atomic_width: Some(128),
2024
stack_probes: StackProbeType::Inline,
2125
mcount: "\u{1}_mcount".into(),

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use rustc_abi::Endian;
22

3-
use crate::spec::{StackProbeType, Target, TargetMetadata, TargetOptions, base};
3+
use crate::spec::{FramePointer, StackProbeType, Target, TargetMetadata, TargetOptions, base};
44

55
pub(crate) fn target() -> Target {
66
let mut base = base::linux_gnu::opts();
@@ -20,6 +20,10 @@ pub(crate) fn target() -> Target {
2020
options: TargetOptions {
2121
abi: "ilp32".into(),
2222
features: "+v8a,+outline-atomics".into(),
23+
// the AAPCS64 expects use of non-leaf frame pointers per
24+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
25+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
26+
frame_pointer: FramePointer::NonLeaf,
2327
stack_probes: StackProbeType::Inline,
2428
mcount: "\u{1}_mcount".into(),
2529
endian: Endian::Big,

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::spec::{SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base};
1+
use crate::spec::{
2+
FramePointer, SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base,
3+
};
24

35
// See https://developer.android.com/ndk/guides/abis.html#arm64-v8a
46
// for target ABI requirements.
@@ -20,6 +22,10 @@ pub(crate) fn target() -> Target {
2022
// As documented in https://developer.android.com/ndk/guides/cpu-features.html
2123
// the neon (ASIMD) and FP must exist on all android aarch64 targets.
2224
features: "+v8a,+neon,+fp-armv8".into(),
25+
// the AAPCS64 expects use of non-leaf frame pointers per
26+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
27+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
28+
frame_pointer: FramePointer::NonLeaf,
2329
stack_probes: StackProbeType::Inline,
2430
supported_sanitizers: SanitizerSet::CFI
2531
| SanitizerSet::HWADDRESS

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::spec::{SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base};
1+
use crate::spec::{
2+
FramePointer, SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base,
3+
};
24

35
pub(crate) fn target() -> Target {
46
Target {
@@ -14,6 +16,10 @@ pub(crate) fn target() -> Target {
1416
arch: "aarch64".into(),
1517
options: TargetOptions {
1618
features: "+v8a,+outline-atomics".into(),
19+
// the AAPCS64 expects use of non-leaf frame pointers per
20+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
21+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
22+
frame_pointer: FramePointer::NonLeaf,
1723
mcount: "\u{1}_mcount".into(),
1824
max_atomic_width: Some(128),
1925
stack_probes: StackProbeType::Inline,

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

+5-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::spec::{StackProbeType, Target, TargetMetadata, TargetOptions, base};
1+
use crate::spec::{FramePointer, StackProbeType, Target, TargetMetadata, TargetOptions, base};
22

33
pub(crate) fn target() -> Target {
44
Target {
@@ -15,6 +15,10 @@ pub(crate) fn target() -> Target {
1515
options: TargetOptions {
1616
abi: "ilp32".into(),
1717
features: "+v8a,+outline-atomics".into(),
18+
// the AAPCS64 expects use of non-leaf frame pointers per
19+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
20+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
21+
frame_pointer: FramePointer::NonLeaf,
1822
max_atomic_width: Some(128),
1923
stack_probes: StackProbeType::Inline,
2024
mcount: "\u{1}_mcount".into(),

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

+10-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::spec::{SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base};
1+
use crate::spec::{
2+
FramePointer, SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base,
3+
};
24

35
pub(crate) fn target() -> Target {
46
let mut base = base::linux_musl::opts();
@@ -26,6 +28,12 @@ pub(crate) fn target() -> Target {
2628
pointer_width: 64,
2729
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
2830
arch: "aarch64".into(),
29-
options: TargetOptions { mcount: "\u{1}_mcount".into(), ..base },
31+
options: TargetOptions {
32+
// the AAPCS64 expects use of non-leaf frame pointers per
33+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
34+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
35+
frame_pointer: FramePointer::NonLeaf,
36+
mcount: "\u{1}_mcount".into(), ..base
37+
},
3038
}
3139
}

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

+7-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
use crate::spec::{SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base};
1+
use crate::spec::{
2+
FramePointer, SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base,
3+
};
24

35
pub(crate) fn target() -> Target {
46
let mut base = base::linux_ohos::opts();
@@ -16,6 +18,10 @@ pub(crate) fn target() -> Target {
1618
data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
1719
arch: "aarch64".into(),
1820
options: TargetOptions {
21+
// the AAPCS64 expects use of non-leaf frame pointers per
22+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
23+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
24+
frame_pointer: FramePointer::NonLeaf,
1925
mcount: "\u{1}_mcount".into(),
2026
stack_probes: StackProbeType::Inline,
2127
supported_sanitizers: SanitizerSet::ADDRESS

tests/codegen/frame-pointer.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -26,8 +26,10 @@ pub fn peach(x: u32) -> u32 {
2626

2727
// CHECK: attributes [[PEACH_ATTRS]] = {
2828
// x64-linux-NOT: {{.*}}"frame-pointer"{{.*}}
29-
// aarch64-linux-NOT: {{.*}}"frame-pointer"{{.*}}
3029
// x64-apple-SAME: {{.*}}"frame-pointer"="all"
3130
// force-SAME: {{.*}}"frame-pointer"="all"
31+
//
32+
// AAPCS64 demands frame pointers:
33+
// aarch64-linux-SAME: {{.*}}"frame-pointer"="non-leaf"
3234
// aarch64-apple-SAME: {{.*}}"frame-pointer"="non-leaf"
3335
// CHECK-SAME: }

0 commit comments

Comments
 (0)