mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 04:57:19 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //! Test calling variadic functions with various ABIs.
 | |
| //@ add-core-stubs
 | |
| //@ compile-flags: -Z merge-functions=disabled
 | |
| //@ revisions: x86_32 x86_32_win x86_64 aarch64 arm32
 | |
| //@[x86_64] compile-flags: --target x86_64-unknown-linux-gnu
 | |
| //@[x86_64] needs-llvm-components: x86
 | |
| //@[x86_32_win] compile-flags: --target i686-pc-windows-msvc
 | |
| //@[x86_32_win] needs-llvm-components: x86
 | |
| //@[x86_32] compile-flags: --target i686-unknown-linux-gnu
 | |
| //@[x86_32] needs-llvm-components: x86
 | |
| //@[aarch64] compile-flags: --target aarch64-unknown-linux-gnu
 | |
| //@[aarch64] needs-llvm-components: aarch64
 | |
| //@[arm32] compile-flags: --target armv7-unknown-linux-gnueabihf
 | |
| //@[arm32] needs-llvm-components: arm
 | |
| #![crate_type = "lib"]
 | |
| #![feature(no_core)]
 | |
| #![feature(extended_varargs_abi_support, extern_system_varargs)]
 | |
| #![no_core]
 | |
| 
 | |
| extern crate minicore;
 | |
| 
 | |
| // CHECK-LABEL: @c
 | |
| #[unsafe(no_mangle)]
 | |
| fn c(f: extern "C" fn(i32, ...)) {
 | |
|     // CHECK: call void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: @system
 | |
| #[unsafe(no_mangle)]
 | |
| fn system(f: extern "system" fn(i32, ...)) {
 | |
|     // Crucially, this is *always* the C calling convention, even on Windows.
 | |
|     // CHECK: call void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // x86_32-LABEL: @cdecl
 | |
| #[unsafe(no_mangle)]
 | |
| #[cfg(target_arch = "x86")]
 | |
| fn cdecl(f: extern "cdecl" fn(i32, ...)) {
 | |
|     // x86_32: call void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // x86_64-LABEL: @sysv
 | |
| #[unsafe(no_mangle)]
 | |
| #[cfg(target_arch = "x86_64")]
 | |
| fn sysv(f: extern "sysv64" fn(i32, ...)) {
 | |
|     // x86_64: call x86_64_sysvcc void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // x86_64-LABEL: @win
 | |
| #[unsafe(no_mangle)]
 | |
| #[cfg(target_arch = "x86_64")]
 | |
| fn win(f: extern "win64" fn(i32, ...)) {
 | |
|     // x86_64: call win64cc void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: @efiapi
 | |
| #[unsafe(no_mangle)]
 | |
| #[cfg(any(
 | |
|     target_arch = "arm",
 | |
|     target_arch = "aarch64",
 | |
|     target_arch = "riscv32",
 | |
|     target_arch = "riscv64",
 | |
|     target_arch = "x86",
 | |
|     target_arch = "x86_64"
 | |
| ))]
 | |
| fn efiapi(f: extern "efiapi" fn(i32, ...)) {
 | |
|     // x86_32: call void (i32, ...)
 | |
|     // x86_32_win: call void (i32, ...)
 | |
|     // x86_64: call win64cc void (i32, ...)
 | |
|     // aarch64: call void (i32, ...)
 | |
|     // arm32: call arm_aapcscc void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | |
| 
 | |
| // arm32-LABEL: @aapcs
 | |
| #[unsafe(no_mangle)]
 | |
| #[cfg(target_arch = "arm")]
 | |
| fn aapcs(f: extern "aapcs" fn(i32, ...)) {
 | |
|     // arm32: call arm_aapcscc void (i32, ...)
 | |
|     f(22, 44);
 | |
| }
 | 
