about summary refs log tree commit diff
path: root/tests/assembly-llvm/c-variadic-arm.rs
diff options
context:
space:
mode:
authorFolkert de Vries <folkert@folkertdev.nl>2025-07-27 21:21:07 +0200
committerFolkert de Vries <folkert@folkertdev.nl>2025-09-08 13:46:28 +0200
commit94fbb2178ae5960894aaae199233b0d3ac020d79 (patch)
tree67f7797b8abe649ba9d01394e569f8fd17aee201 /tests/assembly-llvm/c-variadic-arm.rs
parent418900562cb189e68b21acd49116ed8235646578 (diff)
downloadrust-94fbb2178ae5960894aaae199233b0d3ac020d79.tar.gz
rust-94fbb2178ae5960894aaae199233b0d3ac020d79.zip
implement `va_arg` for arm in rustc itself
Diffstat (limited to 'tests/assembly-llvm/c-variadic-arm.rs')
-rw-r--r--tests/assembly-llvm/c-variadic-arm.rs26
1 files changed, 26 insertions, 0 deletions
diff --git a/tests/assembly-llvm/c-variadic-arm.rs b/tests/assembly-llvm/c-variadic-arm.rs
new file mode 100644
index 00000000000..2ef307405e1
--- /dev/null
+++ b/tests/assembly-llvm/c-variadic-arm.rs
@@ -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
+}