implement va_arg for arm in rustc itself
This commit is contained in:
parent
418900562c
commit
94fbb2178a
2 changed files with 41 additions and 0 deletions
|
|
@ -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(
|
||||
|
|
|
|||
26
tests/assembly-llvm/c-variadic-arm.rs
Normal file
26
tests/assembly-llvm/c-variadic-arm.rs
Normal file
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue