Skip to content

Commit 57ed636

Browse files
compiler: add AbiMaps to targets
1 parent 0e18800 commit 57ed636

File tree

174 files changed

+367
-47
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

174 files changed

+367
-47
lines changed

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

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,15 @@ pub(crate) fn base(
106106
arch: Arch,
107107
abi: TargetAbi,
108108
) -> (TargetOptions, StaticCow<str>, StaticCow<str>) {
109+
let abi_map = match arch {
110+
Armv7k | Armv7s => super::arm_abi_map(),
111+
Arm64 | Arm64e | Arm64_32 => super::aarch64_abi_map(),
112+
I386 | I686 => super::x86_32_abi_map(),
113+
X86_64 | X86_64h => super::x86_64_abi_map(),
114+
};
109115
let mut opts = TargetOptions {
110116
abi: abi.target_abi().into(),
117+
abi_map,
111118
llvm_floatabi: Some(FloatAbi::Hard),
112119
os: os.into(),
113120
cpu: arch.target_cpu(abi).into(),

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

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,3 +39,108 @@ pub(crate) mod windows_msvc;
3939
pub(crate) mod windows_uwp_gnu;
4040
pub(crate) mod windows_uwp_msvc;
4141
pub(crate) mod xtensa;
42+
43+
use rustc_abi::{AbiMap, ArmCall, CanonAbi, X86Call};
44+
45+
pub(crate) fn x86_32_abi_map() -> AbiMap {
46+
AbiMap {
47+
system: CanonAbi::C,
48+
system_varargs: CanonAbi::C,
49+
efiapi: Some(CanonAbi::C),
50+
stdcall: Some(CanonAbi::X86(X86Call::Stdcall)),
51+
fastcall: Some(CanonAbi::X86(X86Call::Fastcall)),
52+
thiscall: Some(CanonAbi::X86(X86Call::Thiscall)),
53+
vectorcall: Some(CanonAbi::X86(X86Call::Vectorcall)),
54+
55+
x86_interrupt: true,
56+
57+
..Default::default()
58+
}
59+
}
60+
61+
pub(crate) fn x86_32_windows_abi_map() -> AbiMap {
62+
AbiMap {
63+
system: CanonAbi::X86(X86Call::Stdcall),
64+
system_varargs: CanonAbi::C,
65+
efiapi: Some(CanonAbi::C),
66+
stdcall: Some(CanonAbi::X86(X86Call::Stdcall)),
67+
fastcall: Some(CanonAbi::X86(X86Call::Fastcall)),
68+
thiscall: Some(CanonAbi::X86(X86Call::Thiscall)),
69+
vectorcall: Some(CanonAbi::X86(X86Call::Vectorcall)),
70+
71+
x86_interrupt: true,
72+
73+
..Default::default()
74+
}
75+
}
76+
77+
// // See commentary in `is_abi_supported`.
78+
// Stdcall { unwind } | Thiscall { unwind } | Fastcall { unwind } => {
79+
// if self.arch == "x86" { abi } else { C { unwind } }
80+
// }
81+
pub(crate) fn x86_64_abi_map() -> AbiMap {
82+
AbiMap {
83+
efiapi: Some(CanonAbi::X86(X86Call::Win64)),
84+
85+
win64: Some(CanonAbi::X86(X86Call::Win64)),
86+
sysv64: Some(CanonAbi::X86(X86Call::SysV64)),
87+
vectorcall: Some(CanonAbi::X86(X86Call::Vectorcall)),
88+
89+
x86_interrupt: true,
90+
91+
..Default::default()
92+
}
93+
}
94+
95+
pub(crate) fn x86_64_windows_abi_map() -> AbiMap {
96+
AbiMap {
97+
rust_cold: CanonAbi::Rust,
98+
99+
stdcall: Some(CanonAbi::C),
100+
thiscall: Some(CanonAbi::C),
101+
fastcall: Some(CanonAbi::C),
102+
103+
..x86_64_abi_map()
104+
}
105+
}
106+
107+
pub(crate) fn aarch64_abi_map() -> AbiMap {
108+
AbiMap { efiapi: Some(CanonAbi::C), ..Default::default() }
109+
}
110+
111+
pub(crate) fn aarch64_windows_abi_map() -> AbiMap {
112+
AbiMap {
113+
win64: Some(CanonAbi::C),
114+
sysv64: Some(CanonAbi::C),
115+
stdcall: Some(CanonAbi::C),
116+
thiscall: Some(CanonAbi::C),
117+
fastcall: Some(CanonAbi::C),
118+
119+
vectorcall: Some(CanonAbi::C),
120+
121+
..aarch64_abi_map()
122+
}
123+
}
124+
125+
pub(crate) fn arm_abi_map() -> AbiMap {
126+
AbiMap { aapcs: true, efiapi: Some(CanonAbi::Arm(ArmCall::Aapcs)), ..Default::default() }
127+
}
128+
129+
pub(crate) fn arm_windows_abi_map() -> AbiMap {
130+
AbiMap {
131+
aapcs: true,
132+
efiapi: Some(CanonAbi::Arm(ArmCall::Aapcs)),
133+
stdcall: Some(CanonAbi::C),
134+
thiscall: Some(CanonAbi::C),
135+
fastcall: Some(CanonAbi::C),
136+
137+
vectorcall: Some(CanonAbi::C),
138+
139+
..Default::default()
140+
}
141+
}
142+
143+
// bitness-invariant, for now
144+
pub(crate) fn riscv_abi_map() -> AbiMap {
145+
AbiMap { efiapi: Some(CanonAbi::C), riscv_interrupt: true, ..Default::default() }
146+
}

compiler/rustc_target/src/spec/base/nto_qnx.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ pub(crate) fn aarch64() -> Target {
4040
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(),
4141
arch: "aarch64".into(),
4242
options: TargetOptions {
43+
abi_map: super::aarch64_abi_map(),
4344
features: "+v8a".into(),
4445
max_atomic_width: Some(128),
4546
..opts()
@@ -56,6 +57,7 @@ pub(crate) fn x86_64() -> Target {
5657
"e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128".into(),
5758
arch: "x86_64".into(),
5859
options: TargetOptions {
60+
abi_map: super::x86_64_abi_map(),
5961
cpu: "x86-64".into(),
6062
plt_by_default: false,
6163
max_atomic_width: Some(64),

compiler/rustc_target/src/spec/base/thumb.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ use crate::spec::{Cc, FramePointer, LinkerFlavor, Lld, PanicStrategy, RelocModel
3232
pub(crate) fn opts() -> TargetOptions {
3333
// See rust-lang/rfcs#1645 for a discussion about these defaults
3434
TargetOptions {
35+
abi_map: super::arm_abi_map(),
3536
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
3637
// In most cases, LLD is good enough
3738
linker: Some("rust-lld".into()),

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub(crate) fn target() -> Target {
1515
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(),
1616
arch: "aarch64".into(),
1717
options: TargetOptions {
18+
abi_map: base::aarch64_abi_map(),
1819
features: "+v8a,+outline-atomics".into(),
1920
// the AAPCS64 expects use of non-leaf frame pointers per
2021
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use crate::spec::{FramePointer, StackProbeType, Target, TargetMetadata, TargetOp
44

55
pub(crate) fn target() -> Target {
66
let mut base = base::linux_gnu::opts();
7+
base.abi_map = base::aarch64_abi_map();
78
base.max_atomic_width = Some(128);
89

910
Target {

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub(crate) fn target() -> Target {
1515
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(),
1616
arch: "aarch64".into(),
1717
options: TargetOptions {
18+
abi_map: base::aarch64_abi_map(),
1819
mcount: "__mcount".into(),
1920
max_atomic_width: Some(128),
2021
stack_probes: StackProbeType::Inline,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub(crate) fn target() -> Target {
1414
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(),
1515
arch: "aarch64".into(),
1616
options: TargetOptions {
17+
abi_map: base::aarch64_abi_map(),
1718
linker: Some("aarch64-kmc-elf-gcc".into()),
1819
features: "+v8a,+neon,+fp-armv8".into(),
1920
relocation_model: RelocModel::Static,

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ pub(crate) fn target() -> Target {
1818
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(),
1919
arch: "aarch64".into(),
2020
options: TargetOptions {
21+
abi_map: base::aarch64_abi_map(),
2122
max_atomic_width: Some(128),
2223
// As documented in https://developer.android.com/ndk/guides/cpu-features.html
2324
// the neon (ASIMD) and FP must exist on all android aarch64 targets.

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::spec::{
22
Cc, LinkerFlavor, Lld, PanicStrategy, RelroLevel, StackProbeType, Target, TargetMetadata,
3-
TargetOptions,
3+
TargetOptions, base,
44
};
55

66
const LINKER_SCRIPT: &str = include_str!("./aarch64_nintendo_switch_freestanding_linker_script.ld");
@@ -19,6 +19,7 @@ pub(crate) fn target() -> Target {
1919
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(),
2020
arch: "aarch64".into(),
2121
options: TargetOptions {
22+
abi_map: base::aarch64_abi_map(),
2223
features: "+v8a".into(),
2324
linker_flavor: LinkerFlavor::Gnu(Cc::No, Lld::Yes),
2425
linker: Some("rust-lld".into()),

0 commit comments

Comments
 (0)