Add more *-unwind ABI variants
The following *-unwind ABIs are now supported: - "C-unwind" - "cdecl-unwind" - "stdcall-unwind" - "fastcall-unwind" - "vectorcall-unwind" - "thiscall-unwind" - "aapcs-unwind" - "win64-unwind" - "sysv64-unwind" - "system-unwind"
This commit is contained in:
parent
498eeb72f5
commit
547b4e601e
16 changed files with 342 additions and 80 deletions
|
@ -658,22 +658,24 @@ impl<'a, Ty> FnAbi<'a, Ty> {
|
|||
|
||||
match &cx.target_spec().arch[..] {
|
||||
"x86" => {
|
||||
let flavor = if abi == spec::abi::Abi::Fastcall {
|
||||
let flavor = if let spec::abi::Abi::Fastcall { .. } = abi {
|
||||
x86::Flavor::Fastcall
|
||||
} else {
|
||||
x86::Flavor::General
|
||||
};
|
||||
x86::compute_abi_info(cx, self, flavor);
|
||||
}
|
||||
"x86_64" => {
|
||||
if abi == spec::abi::Abi::SysV64 {
|
||||
x86_64::compute_abi_info(cx, self);
|
||||
} else if abi == spec::abi::Abi::Win64 || cx.target_spec().is_like_windows {
|
||||
x86_win64::compute_abi_info(self);
|
||||
} else {
|
||||
x86_64::compute_abi_info(cx, self);
|
||||
"x86_64" => match abi {
|
||||
spec::abi::Abi::SysV64 { .. } => x86_64::compute_abi_info(cx, self),
|
||||
spec::abi::Abi::Win64 { .. } => x86_win64::compute_abi_info(self),
|
||||
_ => {
|
||||
if cx.target_spec().is_like_windows {
|
||||
x86_win64::compute_abi_info(self)
|
||||
} else {
|
||||
x86_64::compute_abi_info(cx, self)
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"aarch64" => aarch64::compute_abi_info(cx, self),
|
||||
"amdgpu" => amdgpu::compute_abi_info(cx, self),
|
||||
"arm" => arm::compute_abi_info(cx, self),
|
||||
|
|
|
@ -13,14 +13,14 @@ pub enum Abi {
|
|||
// churn. The specific values are meaningless.
|
||||
Rust,
|
||||
C { unwind: bool },
|
||||
Cdecl,
|
||||
Cdecl { unwind: bool },
|
||||
Stdcall { unwind: bool },
|
||||
Fastcall,
|
||||
Vectorcall,
|
||||
Fastcall { unwind: bool },
|
||||
Vectorcall { unwind: bool },
|
||||
Thiscall { unwind: bool },
|
||||
Aapcs,
|
||||
Win64,
|
||||
SysV64,
|
||||
Aapcs { unwind: bool },
|
||||
Win64 { unwind: bool },
|
||||
SysV64 { unwind: bool },
|
||||
PtxKernel,
|
||||
Msp430Interrupt,
|
||||
X86Interrupt,
|
||||
|
@ -50,16 +50,22 @@ const AbiDatas: &[AbiData] = &[
|
|||
AbiData { abi: Abi::Rust, name: "Rust" },
|
||||
AbiData { abi: Abi::C { unwind: false }, name: "C" },
|
||||
AbiData { abi: Abi::C { unwind: true }, name: "C-unwind" },
|
||||
AbiData { abi: Abi::Cdecl, name: "cdecl" },
|
||||
AbiData { abi: Abi::Cdecl { unwind: false }, name: "cdecl" },
|
||||
AbiData { abi: Abi::Cdecl { unwind: true }, name: "cdecl-unwind" },
|
||||
AbiData { abi: Abi::Stdcall { unwind: false }, name: "stdcall" },
|
||||
AbiData { abi: Abi::Stdcall { unwind: true }, name: "stdcall-unwind" },
|
||||
AbiData { abi: Abi::Fastcall, name: "fastcall" },
|
||||
AbiData { abi: Abi::Vectorcall, name: "vectorcall" },
|
||||
AbiData { abi: Abi::Fastcall { unwind: false }, name: "fastcall" },
|
||||
AbiData { abi: Abi::Fastcall { unwind: true }, name: "fastcall-unwind" },
|
||||
AbiData { abi: Abi::Vectorcall { unwind: false }, name: "vectorcall" },
|
||||
AbiData { abi: Abi::Vectorcall { unwind: true }, name: "vectorcall-unwind" },
|
||||
AbiData { abi: Abi::Thiscall { unwind: false }, name: "thiscall" },
|
||||
AbiData { abi: Abi::Thiscall { unwind: true }, name: "thiscall-unwind" },
|
||||
AbiData { abi: Abi::Aapcs, name: "aapcs" },
|
||||
AbiData { abi: Abi::Win64, name: "win64" },
|
||||
AbiData { abi: Abi::SysV64, name: "sysv64" },
|
||||
AbiData { abi: Abi::Aapcs { unwind: false }, name: "aapcs" },
|
||||
AbiData { abi: Abi::Aapcs { unwind: true }, name: "aapcs-unwind" },
|
||||
AbiData { abi: Abi::Win64 { unwind: false }, name: "win64" },
|
||||
AbiData { abi: Abi::Win64 { unwind: true }, name: "win64-unwind" },
|
||||
AbiData { abi: Abi::SysV64 { unwind: false }, name: "sysv64" },
|
||||
AbiData { abi: Abi::SysV64 { unwind: true }, name: "sysv64-unwind" },
|
||||
AbiData { abi: Abi::PtxKernel, name: "ptx-kernel" },
|
||||
AbiData { abi: Abi::Msp430Interrupt, name: "msp430-interrupt" },
|
||||
AbiData { abi: Abi::X86Interrupt, name: "x86-interrupt" },
|
||||
|
@ -101,32 +107,38 @@ impl Abi {
|
|||
C { unwind: false } => 1,
|
||||
C { unwind: true } => 2,
|
||||
// Platform-specific ABIs
|
||||
Cdecl => 3,
|
||||
Stdcall { unwind: false } => 4,
|
||||
Stdcall { unwind: true } => 5,
|
||||
Fastcall => 6,
|
||||
Vectorcall => 7,
|
||||
Thiscall { unwind: false } => 8,
|
||||
Thiscall { unwind: true } => 9,
|
||||
Aapcs => 10,
|
||||
Win64 => 11,
|
||||
SysV64 => 12,
|
||||
PtxKernel => 13,
|
||||
Msp430Interrupt => 14,
|
||||
X86Interrupt => 15,
|
||||
AmdGpuKernel => 16,
|
||||
EfiApi => 17,
|
||||
AvrInterrupt => 18,
|
||||
AvrNonBlockingInterrupt => 19,
|
||||
CCmseNonSecureCall => 20,
|
||||
Wasm => 21,
|
||||
Cdecl { unwind: false } => 3,
|
||||
Cdecl { unwind: true } => 4,
|
||||
Stdcall { unwind: false } => 5,
|
||||
Stdcall { unwind: true } => 6,
|
||||
Fastcall { unwind: false } => 7,
|
||||
Fastcall { unwind: true } => 8,
|
||||
Vectorcall { unwind: false } => 9,
|
||||
Vectorcall { unwind: true } => 10,
|
||||
Thiscall { unwind: false } => 11,
|
||||
Thiscall { unwind: true } => 12,
|
||||
Aapcs { unwind: false } => 13,
|
||||
Aapcs { unwind: true } => 14,
|
||||
Win64 { unwind: false } => 15,
|
||||
Win64 { unwind: true } => 16,
|
||||
SysV64 { unwind: false } => 17,
|
||||
SysV64 { unwind: true } => 18,
|
||||
PtxKernel => 19,
|
||||
Msp430Interrupt => 20,
|
||||
X86Interrupt => 21,
|
||||
AmdGpuKernel => 22,
|
||||
EfiApi => 23,
|
||||
AvrInterrupt => 24,
|
||||
AvrNonBlockingInterrupt => 25,
|
||||
CCmseNonSecureCall => 26,
|
||||
Wasm => 27,
|
||||
// Cross-platform ABIs
|
||||
System { unwind: false } => 22,
|
||||
System { unwind: true } => 23,
|
||||
RustIntrinsic => 24,
|
||||
RustCall => 25,
|
||||
PlatformIntrinsic => 26,
|
||||
Unadjusted => 27,
|
||||
System { unwind: false } => 28,
|
||||
System { unwind: true } => 29,
|
||||
RustIntrinsic => 30,
|
||||
RustCall => 31,
|
||||
PlatformIntrinsic => 32,
|
||||
Unadjusted => 33,
|
||||
};
|
||||
debug_assert!(
|
||||
AbiDatas
|
||||
|
|
|
@ -1556,15 +1556,15 @@ impl Target {
|
|||
Abi::Stdcall { unwind }
|
||||
}
|
||||
Abi::System { unwind } => Abi::C { unwind },
|
||||
Abi::EfiApi if self.arch == "x86_64" => Abi::Win64,
|
||||
Abi::EfiApi if self.arch == "x86_64" => Abi::Win64 { unwind: false },
|
||||
Abi::EfiApi => Abi::C { unwind: false },
|
||||
|
||||
// See commentary in `is_abi_supported`.
|
||||
Abi::Stdcall { .. } | Abi::Thiscall { .. } if self.arch == "x86" => abi,
|
||||
Abi::Stdcall { unwind } | Abi::Thiscall { unwind } => Abi::C { unwind },
|
||||
Abi::Fastcall if self.arch == "x86" => abi,
|
||||
Abi::Vectorcall if ["x86", "x86_64"].contains(&&self.arch[..]) => abi,
|
||||
Abi::Fastcall | Abi::Vectorcall => Abi::C { unwind: false },
|
||||
Abi::Fastcall { .. } if self.arch == "x86" => abi,
|
||||
Abi::Vectorcall { .. } if ["x86", "x86_64"].contains(&&self.arch[..]) => abi,
|
||||
Abi::Fastcall { unwind } | Abi::Vectorcall { unwind } => Abi::C { unwind },
|
||||
|
||||
abi => abi,
|
||||
}
|
||||
|
@ -1581,12 +1581,12 @@ impl Target {
|
|||
| RustCall
|
||||
| PlatformIntrinsic
|
||||
| Unadjusted
|
||||
| Cdecl
|
||||
| Cdecl { .. }
|
||||
| EfiApi => true,
|
||||
X86Interrupt => ["x86", "x86_64"].contains(&&self.arch[..]),
|
||||
Aapcs => "arm" == self.arch,
|
||||
Aapcs { .. } => "arm" == self.arch,
|
||||
CCmseNonSecureCall => ["arm", "aarch64"].contains(&&self.arch[..]),
|
||||
Win64 | SysV64 => self.arch == "x86_64",
|
||||
Win64 { .. } | SysV64 { .. } => self.arch == "x86_64",
|
||||
PtxKernel => self.arch == "nvptx64",
|
||||
Msp430Interrupt => self.arch == "msp430",
|
||||
AmdGpuKernel => self.arch == "amdgcn",
|
||||
|
@ -1623,13 +1623,13 @@ impl Target {
|
|||
// > convention is used.
|
||||
//
|
||||
// -- https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions
|
||||
Stdcall { .. } | Fastcall | Vectorcall if self.is_like_windows => true,
|
||||
Stdcall { .. } | Fastcall { .. } | Vectorcall { .. } if self.is_like_windows => true,
|
||||
// Outside of Windows we want to only support these calling conventions for the
|
||||
// architectures for which these calling conventions are actually well defined.
|
||||
Stdcall { .. } | Fastcall if self.arch == "x86" => true,
|
||||
Vectorcall if ["x86", "x86_64"].contains(&&self.arch[..]) => true,
|
||||
Stdcall { .. } | Fastcall { .. } if self.arch == "x86" => true,
|
||||
Vectorcall { .. } if ["x86", "x86_64"].contains(&&self.arch[..]) => true,
|
||||
// Return a `None` for other cases so that we know to emit a future compat lint.
|
||||
Stdcall { .. } | Fastcall | Vectorcall => return None,
|
||||
Stdcall { .. } | Fastcall { .. } | Vectorcall { .. } => return None,
|
||||
})
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue