mirror of
https://github.com/rust-lang/rust.git
synced 2026-04-27 18:57:42 +03:00
implement va_arg for arm in rustc itself
This commit is contained in:
@@ -908,6 +908,21 @@ pub(super) fn emit_va_arg<'ll, 'tcx>(
|
||||
)
|
||||
}
|
||||
"aarch64" => emit_aapcs_va_arg(bx, addr, target_ty),
|
||||
"arm" => {
|
||||
// Types wider than 16 bytes are not currently supported. Clang has special logic for
|
||||
// such types, but `VaArgSafe` is not implemented for any type that is this large.
|
||||
assert!(bx.cx.size_of(target_ty).bytes() <= 16);
|
||||
|
||||
emit_ptr_va_arg(
|
||||
bx,
|
||||
addr,
|
||||
target_ty,
|
||||
PassMode::Direct,
|
||||
SlotSize::Bytes4,
|
||||
AllowHigherAlign::Yes,
|
||||
ForceRightAdjust::No,
|
||||
)
|
||||
}
|
||||
"s390x" => emit_s390x_va_arg(bx, addr, target_ty),
|
||||
"powerpc" => emit_powerpc_va_arg(bx, addr, target_ty),
|
||||
"powerpc64" | "powerpc64le" => emit_ptr_va_arg(
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
//@ assembly-output: emit-asm
|
||||
//@ compile-flags: -Copt-level=3
|
||||
//@ only-arm
|
||||
//@ ignore-thumb
|
||||
//@ ignore-android
|
||||
#![no_std]
|
||||
#![crate_type = "lib"]
|
||||
#![feature(c_variadic)]
|
||||
|
||||
// Check that the assembly that rustc generates matches what clang emits.
|
||||
|
||||
#[unsafe(no_mangle)]
|
||||
unsafe extern "C" fn variadic(a: f64, mut args: ...) -> f64 {
|
||||
// CHECK-LABEL: variadic
|
||||
// CHECK: sub sp, sp
|
||||
|
||||
// CHECK: vldr
|
||||
// CHECK: vadd.f64
|
||||
// CHECK: vldr
|
||||
// CHECK: vadd.f64
|
||||
let b = args.arg::<f64>();
|
||||
let c = args.arg::<f64>();
|
||||
a + b + c
|
||||
|
||||
// CHECK: add sp, sp
|
||||
}
|
||||
Reference in New Issue
Block a user