| //@ assembly-output: ptx-linker |
| //@ compile-flags: --crate-type cdylib -C target-cpu=sm_86 -Z unstable-options -Clinker-flavor=llbc |
| //@ only-nvptx64 |
| |
| // The PTX ABI stability is tied to major versions of the PTX ISA |
| // These tests assume major version 7 |
| |
| // CHECK: .version 7 |
| |
| #![feature(abi_ptx, lang_items, no_core)] |
| #![no_core] |
| |
| #[lang = "sized"] |
| trait Sized {} |
| #[lang = "copy"] |
| trait Copy {} |
| |
| #[repr(C)] |
| pub struct SingleU8 { |
| f: u8, |
| } |
| |
| #[repr(C)] |
| pub struct DoubleU8 { |
| f: u8, |
| g: u8, |
| } |
| |
| #[repr(C)] |
| pub struct TripleU8 { |
| f: u8, |
| g: u8, |
| h: u8, |
| } |
| |
| #[repr(C)] |
| pub struct TripleU16 { |
| f: u16, |
| g: u16, |
| h: u16, |
| } |
| #[repr(C)] |
| pub struct DoubleI32 { |
| f: i32, |
| g: i32, |
| } |
| #[repr(C)] |
| pub struct TripleU32 { |
| f: u32, |
| g: u32, |
| h: u32, |
| } |
| #[repr(C)] |
| pub struct TripleU64 { |
| f: u64, |
| g: u64, |
| h: u64, |
| } |
| |
| #[repr(C)] |
| pub struct DoubleFloat { |
| f: f32, |
| g: f32, |
| } |
| |
| #[repr(C)] |
| pub struct TripleFloat { |
| f: f32, |
| g: f32, |
| h: f32, |
| } |
| |
| #[repr(C)] |
| pub struct TripleDouble { |
| f: f64, |
| g: f64, |
| h: f64, |
| } |
| |
| #[repr(C)] |
| pub struct ManyIntegers { |
| f: u8, |
| g: u16, |
| h: u32, |
| i: u64, |
| } |
| |
| #[repr(C)] |
| pub struct ManyNumerics { |
| f: u8, |
| g: u16, |
| h: u32, |
| i: u64, |
| j: f32, |
| k: f64, |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_u8_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_u8_ret() -> u8 { |
| 0 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_u16_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_u16_ret() -> u16 { |
| 1 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_u32_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_u32_ret() -> u32 { |
| 2 |
| } |
| |
| // CHECK: .visible .func (.param .b64 func_retval0) f_u64_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_u64_ret() -> u64 { |
| 3 |
| } |
| |
| // CHECK: .visible .func (.param .align 16 .b8 func_retval0[16]) f_u128_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_u128_ret() -> u128 { |
| 4 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_i8_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_i8_ret() -> i8 { |
| 5 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_i16_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_i16_ret() -> i16 { |
| 6 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_i32_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_i32_ret() -> i32 { |
| 7 |
| } |
| |
| // CHECK: .visible .func (.param .b64 func_retval0) f_i64_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_i64_ret() -> i64 { |
| 8 |
| } |
| |
| // CHECK: .visible .func (.param .align 16 .b8 func_retval0[16]) f_i128_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_i128_ret() -> i128 { |
| 9 |
| } |
| |
| // CHECK: .visible .func (.param .b32 func_retval0) f_f32_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_f32_ret() -> f32 { |
| 10.0 |
| } |
| |
| // CHECK: .visible .func (.param .b64 func_retval0) f_f64_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_f64_ret() -> f64 { |
| 11.0 |
| } |
| |
| // CHECK: .visible .func (.param .align 1 .b8 func_retval0[1]) f_single_u8_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_single_u8_ret() -> SingleU8 { |
| SingleU8 { f: 12 } |
| } |
| |
| // CHECK: .visible .func (.param .align 1 .b8 func_retval0[2]) f_double_u8_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_double_u8_ret() -> DoubleU8 { |
| DoubleU8 { f: 13, g: 14 } |
| } |
| |
| // CHECK: .visible .func (.param .align 1 .b8 func_retval0[3]) f_triple_u8_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_u8_ret() -> TripleU8 { |
| TripleU8 { f: 15, g: 16, h: 17 } |
| } |
| |
| // CHECK: .visible .func (.param .align 2 .b8 func_retval0[6]) f_triple_u16_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_u16_ret() -> TripleU16 { |
| TripleU16 { f: 18, g: 19, h: 20 } |
| } |
| |
| // CHECK: .visible .func (.param .align 4 .b8 func_retval0[8]) f_double_i32_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_double_i32_ret() -> DoubleI32 { |
| DoubleI32 { f: 1, g: 2 } |
| } |
| |
| // CHECK: .visible .func (.param .align 4 .b8 func_retval0[12]) f_triple_u32_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_u32_ret() -> TripleU32 { |
| TripleU32 { f: 20, g: 21, h: 22 } |
| } |
| |
| // CHECK: .visible .func (.param .align 8 .b8 func_retval0[24]) f_triple_u64_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_u64_ret() -> TripleU64 { |
| TripleU64 { f: 23, g: 24, h: 25 } |
| } |
| |
| // CHECK: .visible .func (.param .align 8 .b8 func_retval0[16]) f_many_integers_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_many_integers_ret() -> ManyIntegers { |
| ManyIntegers { f: 26, g: 27, h: 28, i: 29 } |
| } |
| |
| // CHECK: .visible .func (.param .align 4 .b8 func_retval0[8]) f_double_float_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_double_float_ret() -> DoubleFloat { |
| DoubleFloat { f: 29.0, g: 30.0 } |
| } |
| |
| // CHECK: .visible .func (.param .align 4 .b8 func_retval0[12]) f_triple_float_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_float_ret() -> TripleFloat { |
| TripleFloat { f: 31.0, g: 32.0, h: 33.0 } |
| } |
| |
| // CHECK: .visible .func (.param .align 8 .b8 func_retval0[24]) f_triple_double_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_triple_double_ret() -> TripleDouble { |
| TripleDouble { f: 34.0, g: 35.0, h: 36.0 } |
| } |
| |
| // CHECK: .visible .func (.param .align 8 .b8 func_retval0[32]) f_many_numerics_ret( |
| #[no_mangle] |
| pub unsafe extern "C" fn f_many_numerics_ret() -> ManyNumerics { |
| ManyNumerics { f: 37, g: 38, h: 39, i: 40, j: 41.0, k: 43.0 } |
| } |