Auto merge of #105381 - uweigand:s390x-ffi-vaarg, r=nikic
Implement va_list and va_arg for s390x FFI Following the s390x ELF ABI and based on the clang implementation, provide appropriate definitions of va_list in library/core/src/ffi/mod.rs and va_arg handling in compiler/rustc_codegen_llvm/src/va_arg.rs. Fixes the following test cases on s390x: src/test/run-make-fulldeps/c-link-to-rust-va-list-fn src/test/ui/abi/variadic-ffi.rs Fixes https://github.com/rust-lang/rust/issues/84628.
This commit is contained in:
commit
d6da428f34
2 changed files with 134 additions and 5 deletions
|
@ -227,7 +227,12 @@ impl fmt::Debug for c_void {
|
|||
/// Basic implementation of a `va_list`.
|
||||
// The name is WIP, using `VaListImpl` for now.
|
||||
#[cfg(any(
|
||||
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
|
||||
all(
|
||||
not(target_arch = "aarch64"),
|
||||
not(target_arch = "powerpc"),
|
||||
not(target_arch = "s390x"),
|
||||
not(target_arch = "x86_64")
|
||||
),
|
||||
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
|
||||
target_family = "wasm",
|
||||
target_arch = "asmjs",
|
||||
|
@ -251,7 +256,12 @@ pub struct VaListImpl<'f> {
|
|||
}
|
||||
|
||||
#[cfg(any(
|
||||
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
|
||||
all(
|
||||
not(target_arch = "aarch64"),
|
||||
not(target_arch = "powerpc"),
|
||||
not(target_arch = "s390x"),
|
||||
not(target_arch = "x86_64")
|
||||
),
|
||||
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
|
||||
target_family = "wasm",
|
||||
target_arch = "asmjs",
|
||||
|
@ -319,6 +329,25 @@ pub struct VaListImpl<'f> {
|
|||
_marker: PhantomData<&'f mut &'f c_void>,
|
||||
}
|
||||
|
||||
/// s390x ABI implementation of a `va_list`.
|
||||
#[cfg(target_arch = "s390x")]
|
||||
#[repr(C)]
|
||||
#[derive(Debug)]
|
||||
#[unstable(
|
||||
feature = "c_variadic",
|
||||
reason = "the `c_variadic` feature has not been properly tested on \
|
||||
all supported platforms",
|
||||
issue = "44930"
|
||||
)]
|
||||
#[lang = "va_list"]
|
||||
pub struct VaListImpl<'f> {
|
||||
gpr: i64,
|
||||
fpr: i64,
|
||||
overflow_arg_area: *mut c_void,
|
||||
reg_save_area: *mut c_void,
|
||||
_marker: PhantomData<&'f mut &'f c_void>,
|
||||
}
|
||||
|
||||
/// x86_64 ABI implementation of a `va_list`.
|
||||
#[cfg(all(target_arch = "x86_64", not(target_os = "uefi"), not(windows)))]
|
||||
#[repr(C)]
|
||||
|
@ -352,6 +381,7 @@ pub struct VaList<'a, 'f: 'a> {
|
|||
all(
|
||||
not(target_arch = "aarch64"),
|
||||
not(target_arch = "powerpc"),
|
||||
not(target_arch = "s390x"),
|
||||
not(target_arch = "x86_64")
|
||||
),
|
||||
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
|
||||
|
@ -363,7 +393,12 @@ pub struct VaList<'a, 'f: 'a> {
|
|||
inner: VaListImpl<'f>,
|
||||
|
||||
#[cfg(all(
|
||||
any(target_arch = "aarch64", target_arch = "powerpc", target_arch = "x86_64"),
|
||||
any(
|
||||
target_arch = "aarch64",
|
||||
target_arch = "powerpc",
|
||||
target_arch = "s390x",
|
||||
target_arch = "x86_64"
|
||||
),
|
||||
any(not(target_arch = "aarch64"), not(any(target_os = "macos", target_os = "ios"))),
|
||||
not(target_family = "wasm"),
|
||||
not(target_arch = "asmjs"),
|
||||
|
@ -376,7 +411,12 @@ pub struct VaList<'a, 'f: 'a> {
|
|||
}
|
||||
|
||||
#[cfg(any(
|
||||
all(not(target_arch = "aarch64"), not(target_arch = "powerpc"), not(target_arch = "x86_64")),
|
||||
all(
|
||||
not(target_arch = "aarch64"),
|
||||
not(target_arch = "powerpc"),
|
||||
not(target_arch = "s390x"),
|
||||
not(target_arch = "x86_64")
|
||||
),
|
||||
all(target_arch = "aarch64", any(target_os = "macos", target_os = "ios")),
|
||||
target_family = "wasm",
|
||||
target_arch = "asmjs",
|
||||
|
@ -398,7 +438,12 @@ impl<'f> VaListImpl<'f> {
|
|||
}
|
||||
|
||||
#[cfg(all(
|
||||
any(target_arch = "aarch64", target_arch = "powerpc", target_arch = "x86_64"),
|
||||
any(
|
||||
target_arch = "aarch64",
|
||||
target_arch = "powerpc",
|
||||
target_arch = "s390x",
|
||||
target_arch = "x86_64"
|
||||
),
|
||||
any(not(target_arch = "aarch64"), not(any(target_os = "macos", target_os = "ios"))),
|
||||
not(target_family = "wasm"),
|
||||
not(target_arch = "asmjs"),
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue