blob: 4ffe486a2c571d2fb029cfb70a600ec5688506c6 [file] [log] [blame] [edit]
//! This module defines the different ffi_abi values for each platform.
//!
//! This module is set-up to define all the constants for each platform, but only export those which
//! are actually relevant to the target arch. This is done as a compile check to ensure the code
//! paths in less utilized architectures largely continue to compile.
#![allow(unused)]
/// From libffi:src/x86/ffitarget.h.
/// See: <https://github.com/libffi/libffi/blob/369ef49f71186fc9d6ab15614488ad466fac3fc1/src/x86/ffitarget.h#L80>
mod x86 {
pub mod x86_win64 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_WIN64: ffi_abi = 1;
pub const ffi_abi_FFI_GNUW64: ffi_abi = 2;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 3;
mod gnu {
pub const ffi_abi_FFI_DEFAULT_ABI: crate::ffi_abi = super::ffi_abi_FFI_GNUW64;
}
mod msvc {
pub const ffi_abi_FFI_DEFAULT_ABI: crate::ffi_abi = super::ffi_abi_FFI_GNUW64;
}
#[cfg(target_env = "gnu")]
pub use gnu::*;
#[cfg(target_env = "msvc")]
pub use msvc::*;
// See: https://github.com/libffi/libffi/blob/0f2dd369cd5edcefad29b3fca4e1d08cb34f8f19/src/x86/ffitarget.h#L141
pub const FFI_TRAMPOLINE_SIZE: usize = 32;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
pub mod x86_64 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 1;
pub const ffi_abi_FFI_UNIX64: ffi_abi = 2;
pub const ffi_abi_FFI_WIN64: ffi_abi = 3;
pub const ffi_abi_FFI_EFI64: ffi_abi = ffi_abi_FFI_WIN64;
pub const ffi_abi_FFI_GNUW64: ffi_abi = 4;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 5;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_UNIX64;
// See: https://github.com/libffi/libffi/blob/0f2dd369cd5edcefad29b3fca4e1d08cb34f8f19/src/x86/ffitarget.h#L141
pub const FFI_TRAMPOLINE_SIZE: usize = 32;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
pub mod x86_win32 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_FFI_STDCALL: ffi_abi = 2;
pub const ffi_abi_FFI_THISCALL: ffi_abi = 3;
pub const ffi_abi_FFI_FASTCALL: ffi_abi = 4;
pub const ffi_abi_FFI_MS_CDECL: ffi_abi = 5;
pub const ffi_abi_FFI_PASCAL: ffi_abi = 6;
pub const ffi_abi_FFI_REGISTER: ffi_abi = 7;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 8;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_MS_CDECL;
// See: https://github.com/libffi/libffi/blob/369ef49f71186fc9d6ab15614488ad466fac3fc1/src/x86/ffitarget.h#L137
pub const FFI_TRAMPOLINE_SIZE: usize = 12;
pub const FFI_NATIVE_RAW_API: u32 = 1;
}
pub mod x86 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_FFI_THISCALL: ffi_abi = 3;
pub const ffi_abi_FFI_FASTCALL: ffi_abi = 4;
pub const ffi_abi_FFI_STDCALL: ffi_abi = 5;
pub const ffi_abi_FFI_PASCAL: ffi_abi = 6;
pub const ffi_abi_FFI_REGISTER: ffi_abi = 7;
pub const ffi_abi_FFI_MS_CDECL: ffi_abi = 8;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 9;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV;
// See: https://github.com/libffi/libffi/blob/369ef49f71186fc9d6ab15614488ad466fac3fc1/src/x86/ffitarget.h#L137
pub const FFI_TRAMPOLINE_SIZE: usize = 12;
pub const FFI_NATIVE_RAW_API: u32 = 1;
}
pub const FFI_GO_CLOSURES: u32 = 1;
}
#[cfg(all(target_arch = "x86_64", windows))]
pub use x86::x86_win64::*;
#[cfg(all(target_arch = "x86_64", unix))]
pub use x86::x86_64::*;
#[cfg(all(target_arch = "x86", windows))]
pub use x86::x86_win32::*;
#[cfg(all(target_arch = "x86", unix))]
pub use x86::x86::*;
/// From libffi:src/arm/ffitarget.h.
/// See: <https://github.com/libffi/libffi/blob/db5706ff285c476aa3c0f811ff2b188319ac3ebe/src/arm/ffitarget.h>
mod arm {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_FFI_VFP: ffi_abi = 2;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 3;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV;
// See: <https://github.com/libffi/libffi/blob/db5706ff285c476aa3c0f811ff2b188319ac3ebe/src/arm/ffitarget.h#L84>
pub const FFI_GO_CLOSURES: u32 = 1;
pub const FFI_TRAMPOLINE_SIZE: usize = 12;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
#[cfg(target_arch = "arm")]
pub use arm::*;
/// From libffi:src/aarch64/ffitarget.h.
/// See: <https://github.com/libffi/libffi/blob/c2a6859012d928b67a83619bd5087674a96b9254/src/aarch64/ffitarget.h#L44>
mod aarch64 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 2;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV;
pub const FFI_NATIVE_RAW_API: u32 = 0;
#[cfg(target_vendor = "apple")]
pub const FFI_TRAMPOLINE_SIZE: usize = 16;
#[cfg(not(target_vendor = "apple"))]
pub const FFI_TRAMPOLINE_SIZE: usize = 32;
// No GO_CLOSURES on iOS or Windows
#[cfg(not(any(target_os = "windows", target_vendor = "apple")))]
pub const FFI_GO_CLOSURES: u32 = 1;
}
#[cfg(target_arch = "aarch64")]
pub use aarch64::*;
/// From libffi:src/powerpc/ffitarget.h.
/// See: <https://github.com/libffi/libffi/blob/73dd43afc8a447ba98ea02e9aad4c6898dc77fb0/src/powerpc/ffitarget.h#L60>
mod powerpc {
pub mod powerpc {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV_SOFT_FLOAT: ffi_abi = 0b000001;
pub const ffi_abi_FFI_SYSV_STRUCT_RET: ffi_abi = 0b000010;
pub const ffi_abi_FFI_SYSV_IBM_LONG_DOUBLE: ffi_abi = 0b000100;
pub const ffi_abi_FFI_SYSV: ffi_abi = 0b001000;
pub const ffi_abi_FFI_SYSV_LONG_DOUBLE_128: ffi_abi = 0b010000;
mod fprs {
pub const SOFT_FLOAT_FLAG: crate::ffi_abi = 0b0;
}
mod no_fprs {
pub const SOFT_FLOAT_FLAG: crate::ffi_abi = super::ffi_abi_FFI_SYSV_SOFT_FLOAT;
}
#[cfg(target_env = "gnuspe")]
use no_fprs::*;
#[cfg(not(target_feature = "gnuspe"))]
use fprs::*;
mod struct_ret {
pub const STRUCT_RET_FLAG: crate::ffi_abi = super::ffi_abi_FFI_SYSV_STRUCT_RET;
}
mod no_struct_ret {
pub const STRUCT_RET_FLAG: crate::ffi_abi = 0b0;
}
#[cfg(target_os = "netbsd")]
use struct_ret::*;
#[cfg(not(target_os = "netbsd"))]
use no_struct_ret::*;
mod long_double_64 {
pub const LONG_DOUBLE_128_FLAG: crate::ffi_abi = 0b0;
}
mod long_double_128 {
pub const LONG_DOUBLE_128_FLAG: crate::ffi_abi =
super::ffi_abi_FFI_SYSV_LONG_DOUBLE_128;
}
// IEEE128 is not supported on BSD or when targeting musl:
// https://github.com/rust-lang/llvm-project/blob/cb7f903994646c5b9223e0bb6cee3792190991f7/clang/lib/Basic/Targets/PPC.h#L379
#[cfg(any(target_os = "netbsd", target_os = "freebsd", target_env = "musl"))]
use long_double_64::*;
#[cfg(not(any(target_os = "netbsd", target_os = "freebsd", target_env = "musl")))]
use long_double_128::*;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV
| ffi_abi_FFI_SYSV_IBM_LONG_DOUBLE
| SOFT_FLOAT_FLAG
| STRUCT_RET_FLAG
| LONG_DOUBLE_128_FLAG;
pub const FFI_TRAMPOLINE_SIZE: usize = 40;
pub const FFI_NATIVE_RAW_API: u32 = 0;
pub const FFI_GO_CLOSURES: u32 = 1;
}
pub mod powerpc64 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_LINUX_STRUCT_ALIGN: ffi_abi = 0b000001;
pub const ffi_abi_FFI_LINUX_LONG_DOUBLE_128: ffi_abi = 0b000010;
pub const ffi_abi_FFI_LINUX_LONG_DOUBLE_IEEE128: ffi_abi = 0b000100;
pub const ffi_abi_FFI_LINUX: ffi_abi = 0b001000;
mod elfv1 {
pub const STRUCT_ALIGN_FLAG: crate::ffi_abi = 0b0;
pub const FFI_TRAMPOLINE_SIZE: usize = 24;
}
mod elfv2 {
pub const STRUCT_ALIGN_FLAG: crate::ffi_abi = super::ffi_abi_FFI_LINUX_STRUCT_ALIGN;
pub const FFI_TRAMPOLINE_SIZE: usize = 32;
}
// I think this should be something like `target_abi = "elf_v2"`, but that's not yet
// supported.
// Discussion: https://github.com/rust-lang/rust/issues/60617
// RFC: https://github.com/rust-lang/rfcs/pull/2992
//
// Instead, this is based on the current defaults at the time of this writing:
// https://github.com/rust-lang/rust/blob/50d2c3abd59af8cbed7e001b5b4e2f6a9a011112/src/librustc_target/abi/call/powerpc64.rs#L122
#[cfg(any(
// ELFv1 is the used for powerpc64 when not targeting musl
all(target_arch = "powerpc64", target_endian="big", not(target_env = "musl")),
// Use empty flags when targeting a non-PowerPC target, too, just so code compiles.
not(all(target_arch = "powerpc64", target_endian="little"))
))]
mod elf {
pub use super::elfv1::*;
}
// ELFv2 is used for Little-Endian powerpc64 and with musl
#[cfg(any(
all(target_arch = "powerpc64", target_endian = "big", target_env = "musl"),
all(target_arch = "powerpc64", target_endian = "little")
))]
mod elf {
pub use super::elfv2::*;
}
pub use elf::FFI_TRAMPOLINE_SIZE;
use elf::STRUCT_ALIGN_FLAG;
mod long_double_64 {
pub const LONG_DOUBLE_128_FLAG: crate::ffi_abi = 0b0;
}
mod long_double_128 {
pub const LONG_DOUBLE_128_FLAG: crate::ffi_abi =
super::ffi_abi_FFI_LINUX_LONG_DOUBLE_128;
}
// IEEE128 is not supported on BSD or when targeting musl:
// https://github.com/rust-lang/llvm-project/blob/cb7f903994646c5b9223e0bb6cee3792190991f7/clang/lib/Basic/Targets/PPC.h#L417
#[cfg(any(target_os = "netbsd", target_os = "freebsd", target_env = "musl"))]
use long_double_64::*;
#[cfg(not(any(target_os = "netbsd", target_os = "freebsd", target_env = "musl")))]
use long_double_128::*;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi =
ffi_abi_FFI_LINUX | STRUCT_ALIGN_FLAG | LONG_DOUBLE_128_FLAG;
pub const FFI_NATIVE_RAW_API: u32 = 0;
pub const FFI_GO_CLOSURES: u32 = 1;
}
}
#[cfg(target_arch = "powerpc")]
pub use powerpc::powerpc::*;
#[cfg(target_arch = "powerpc64")]
pub use powerpc::powerpc64::*;
/// From libffi:src/riscv/ffitarget.h
/// See: <https://github.com/libffi/libffi/blob/4cb776bc8075332d2f3e59f51785d621fcda48f6/src/riscv/ffitarget.h>
mod riscv {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_FFI_UNUSED_1: ffi_abi = 2;
pub const ffi_abi_FFI_UNUSED_2: ffi_abi = 3;
pub const ffi_abi_FFI_UNUSED_3: ffi_abi = 4;
pub const ffi_abi_LAST_ABI: ffi_abi = 5;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV;
// See: <https://github.com/libffi/libffi/blob/4cb776bc8075332d2f3e59f51785d621fcda48f6/src/riscv/ffitarget.h#L63>
pub const FFI_GO_CLOSURES: u32 = 1;
pub const FFI_TRAMPOLINE_SIZE: usize = 24;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
#[cfg(target_arch = "riscv")]
pub use riscv::*;
#[cfg(target_arch = "riscv64")]
pub use riscv::*;
/// From libffi:src/s390/ffitarget.h
/// See: <https://github.com/libffi/libffi/blob/c6dc125afba294b9b9613392c492ae18df3ede84/src/s390/ffitarget.h>
mod s390x {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_SYSV: ffi_abi = 1;
pub const ffi_abi_LAST_ABI: ffi_abi = 2;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_SYSV;
pub const FFI_GO_CLOSURES: u32 = 1;
pub const FFI_TRAMPOLINE_SIZE: usize = 32;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
#[cfg(target_arch = "s390x")]
pub use s390x::*;
/// From libffi:src/loongarch64/ffitarget.h.
/// See: <https://github.com/libffi/libffi/blob/f24180be1367f942824365b131ae894b9c769c7d/src/loongarch64/ffitarget.h#L47>
mod loongarch64 {
use crate::ffi_abi;
pub const ffi_abi_FFI_FIRST_ABI: ffi_abi = 0;
pub const ffi_abi_FFI_LP64S: ffi_abi = 1;
pub const ffi_abi_FFI_LP64F: ffi_abi = 2;
pub const ffi_abi_FFI_LP64D: ffi_abi = 3;
pub const ffi_abi_FFI_LAST_ABI: ffi_abi = 4;
pub const ffi_abi_FFI_DEFAULT_ABI: ffi_abi = ffi_abi_FFI_LP64D;
pub const FFI_GO_CLOSURES: u32 = 1;
pub const FFI_TRAMPOLINE_SIZE: usize = 24;
pub const FFI_NATIVE_RAW_API: u32 = 0;
}
#[cfg(target_arch = "loongarch64")]
pub use loongarch64::*;