use feature(c_variadic_naked_functions) in tests

This commit is contained in:
Folkert de Vries
2025-11-09 14:34:41 +01:00
parent ebd173f512
commit 9129b902d0
2 changed files with 28 additions and 30 deletions
@@ -2,6 +2,7 @@
//@ only-arm
//@ ignore-thumb (this test uses arm assembly)
//@ only-eabihf (the assembly below requires float hardware support)
#![feature(c_variadic, c_variadic_naked_functions)]
// Check that multiple c-variadic calling conventions can be used in the same program.
//
@@ -9,14 +10,6 @@
// argument list, so C programs that use multiple c-variadic calling conventions are unlikely
// to come up. Here we validate that our codegen backends do in fact generate correct code.
extern "C" {
fn variadic_c(_: f64, _: ...) -> f64;
}
extern "aapcs" {
fn variadic_aapcs(_: f64, _: ...) -> f64;
}
fn main() {
unsafe {
assert_eq!(variadic_c(1.0, 2.0, 3.0), 1.0 + 2.0 + 3.0);
@@ -51,10 +44,11 @@ fn main() {
//
// > This section applies only to non-variadic functions. For a variadic function the base standard
// > is always used both for argument passing and result return.
core::arch::global_asm!(
r#"
{variadic_c}:
{variadic_aapcs}:
#[unsafe(naked)]
unsafe extern "aapcs" fn variadic_aapcs(_: f64, _: ...) -> f64 {
core::arch::naked_asm!(
r#"
sub sp, sp, #12
stmib sp, {{r2, r3}}
vmov d0, r0, r1
@@ -71,6 +65,10 @@ fn main() {
add sp, sp, #12
bx lr
"#,
variadic_c = sym variadic_c,
variadic_aapcs = sym variadic_aapcs,
);
)
}
#[unsafe(naked)]
unsafe extern "C" fn variadic_c(_: f64, _: ...) -> f64 {
core::arch::naked_asm!("b {}", sym variadic_aapcs)
}
@@ -1,5 +1,6 @@
//@ run-pass
//@ only-x86_64
#![feature(c_variadic, c_variadic_naked_functions)]
// Check that multiple c-variadic calling conventions can be used in the same program.
//
@@ -7,14 +8,6 @@
// argument list, so C programs that use multiple c-variadic calling conventions are unlikely
// to come up. Here we validate that our codegen backends do in fact generate correct code.
extern "sysv64" {
fn variadic_sysv64(_: u32, _: ...) -> u32;
}
extern "win64" {
fn variadic_win64(_: u32, _: ...) -> u32;
}
fn main() {
unsafe {
assert_eq!(variadic_win64(1, 2, 3), 1 + 2 + 3);
@@ -37,9 +30,11 @@ fn main() {
// a + b + c
// }
// ```
core::arch::global_asm!(
r#"
{variadic_sysv64}:
#[unsafe(naked)]
unsafe extern "sysv64" fn variadic_sysv64(_: u32, _: ...) -> u32 {
core::arch::naked_asm!(
r#"
sub rsp, 88
test al, al
je .LBB0_7
@@ -93,8 +88,14 @@ fn main() {
add eax, dword ptr [rcx]
add rsp, 88
ret
"#,
)
}
{variadic_win64}:
#[unsafe(naked)]
unsafe extern "win64" fn variadic_win64(_: u32, _: ...) -> u32 {
core::arch::naked_asm!(
r#"
push rax
mov qword ptr [rsp + 40], r9
mov qword ptr [rsp + 24], rdx
@@ -106,6 +107,5 @@ fn main() {
pop rcx
ret
"#,
variadic_win64 = sym variadic_win64,
variadic_sysv64 = sym variadic_sysv64,
);
)
}