]> git.lizzy.rs Git - rust.git/blob - src/test/assembly/nvptx-kernel-abi/nvptx-kernel-args-abi-v7.rs
Auto merge of #96280 - lygstate:ffi-fixes, r=joshtriplett
[rust.git] / src / test / assembly / nvptx-kernel-abi / nvptx-kernel-args-abi-v7.rs
1 // assembly-output: ptx-linker
2 // compile-flags: --crate-type cdylib -C target-cpu=sm_86
3 // only-nvptx64
4 // ignore-nvptx64
5
6 // The following ABI tests are made with nvcc 11.6 does.
7 //
8 // The PTX ABI stability is tied to major versions of the PTX ISA
9 // These tests assume major version 7
10 //
11 //
12 // The following correspondence between types are assumed:
13 // u<N> - uint<N>_t
14 // i<N> - int<N>_t
15 // [T, N] - std::array<T, N>
16 // &T - T const*
17 // &mut T - T*
18
19 // CHECK: .version 7
20
21 #![feature(abi_ptx, lang_items, no_core)]
22 #![no_core]
23
24 #[lang = "sized"]
25 trait Sized {}
26 #[lang = "copy"]
27 trait Copy {}
28
29 #[repr(C)]
30 pub struct SingleU8 {
31     f: u8,
32 }
33
34 #[repr(C)]
35 pub struct DoubleU8 {
36     f: u8,
37     g: u8,
38 }
39
40 #[repr(C)]
41 pub struct TripleU8 {
42     f: u8,
43     g: u8,
44     h: u8,
45 }
46
47 #[repr(C)]
48 pub struct TripleU16 {
49     f: u16,
50     g: u16,
51     h: u16,
52 }
53 #[repr(C)]
54 pub struct TripleU32 {
55     f: u32,
56     g: u32,
57     h: u32,
58 }
59 #[repr(C)]
60 pub struct TripleU64 {
61     f: u64,
62     g: u64,
63     h: u64,
64 }
65
66 #[repr(C)]
67 pub struct DoubleFloat {
68     f: f32,
69     g: f32,
70 }
71
72 #[repr(C)]
73 pub struct TripleFloat {
74     f: f32,
75     g: f32,
76     h: f32,
77 }
78
79 #[repr(C)]
80 pub struct TripleDouble {
81     f: f64,
82     g: f64,
83     h: f64,
84 }
85
86 #[repr(C)]
87 pub struct ManyIntegers {
88     f: u8,
89     g: u16,
90     h: u32,
91     i: u64,
92 }
93
94 #[repr(C)]
95 pub struct ManyNumerics {
96     f: u8,
97     g: u16,
98     h: u32,
99     i: u64,
100     j: f32,
101     k: f64,
102 }
103
104 // CHECK: .visible .entry f_u8_arg(
105 // CHECK: .param .u8 f_u8_arg_param_0
106 #[no_mangle]
107 pub unsafe extern "ptx-kernel" fn f_u8_arg(_a: u8) {}
108
109 // CHECK: .visible .entry f_u16_arg(
110 // CHECK: .param .u16 f_u16_arg_param_0
111 #[no_mangle]
112 pub unsafe extern "ptx-kernel" fn f_u16_arg(_a: u16) {}
113
114 // CHECK: .visible .entry f_u32_arg(
115 // CHECK: .param .u32 f_u32_arg_param_0
116 #[no_mangle]
117 pub unsafe extern "ptx-kernel" fn f_u32_arg(_a: u32) {}
118
119 // CHECK: .visible .entry f_u64_arg(
120 // CHECK: .param .u64 f_u64_arg_param_0
121 #[no_mangle]
122 pub unsafe extern "ptx-kernel" fn f_u64_arg(_a: u64) {}
123
124 // CHECK: .visible .entry f_u128_arg(
125 // CHECK: .param .align 16 .b8 f_u128_arg_param_0[16]
126 #[no_mangle]
127 pub unsafe extern "ptx-kernel" fn f_u128_arg(_a: u128) {}
128
129 // CHECK: .visible .entry f_i8_arg(
130 // CHECK: .param .u8 f_i8_arg_param_0
131 #[no_mangle]
132 pub unsafe extern "ptx-kernel" fn f_i8_arg(_a: i8) {}
133
134 // CHECK: .visible .entry f_i16_arg(
135 // CHECK: .param .u16 f_i16_arg_param_0
136 #[no_mangle]
137 pub unsafe extern "ptx-kernel" fn f_i16_arg(_a: i16) {}
138
139 // CHECK: .visible .entry f_i32_arg(
140 // CHECK: .param .u32 f_i32_arg_param_0
141 #[no_mangle]
142 pub unsafe extern "ptx-kernel" fn f_i32_arg(_a: i32) {}
143
144 // CHECK: .visible .entry f_i64_arg(
145 // CHECK: .param .u64 f_i64_arg_param_0
146 #[no_mangle]
147 pub unsafe extern "ptx-kernel" fn f_i64_arg(_a: i64) {}
148
149 // CHECK: .visible .entry f_i128_arg(
150 // CHECK: .param .align 16 .b8 f_i128_arg_param_0[16]
151 #[no_mangle]
152 pub unsafe extern "ptx-kernel" fn f_i128_arg(_a: i128) {}
153
154 // CHECK: .visible .entry f_f32_arg(
155 // CHECK: .param .f32 f_f32_arg_param_0
156 #[no_mangle]
157 pub unsafe extern "ptx-kernel" fn f_f32_arg(_a: f32) {}
158
159 // CHECK: .visible .entry f_f64_arg(
160 // CHECK: .param .f64 f_f64_arg_param_0
161 #[no_mangle]
162 pub unsafe extern "ptx-kernel" fn f_f64_arg(_a: f64) {}
163
164 // CHECK: .visible .entry f_single_u8_arg(
165 // CHECK: .param .align 1 .b8 f_single_u8_arg_param_0[1]
166 #[no_mangle]
167 pub unsafe extern "ptx-kernel" fn f_single_u8_arg(_a: SingleU8) {}
168
169 // CHECK: .visible .entry f_double_u8_arg(
170 // CHECK: .param .align 1 .b8 f_double_u8_arg_param_0[2]
171 #[no_mangle]
172 pub unsafe extern "ptx-kernel" fn f_double_u8_arg(_a: DoubleU8) {}
173
174 // CHECK: .visible .entry f_triple_u8_arg(
175 // CHECK: .param .align 1 .b8 f_triple_u8_arg_param_0[3]
176 #[no_mangle]
177 pub unsafe extern "ptx-kernel" fn f_triple_u8_arg(_a: TripleU8) {}
178
179 // CHECK: .visible .entry f_triple_u16_arg(
180 // CHECK: .param .align 2 .b8 f_triple_u16_arg_param_0[6]
181 #[no_mangle]
182 pub unsafe extern "ptx-kernel" fn f_triple_u16_arg(_a: TripleU16) {}
183
184 // CHECK: .visible .entry f_triple_u32_arg(
185 // CHECK: .param .align 4 .b8 f_triple_u32_arg_param_0[12]
186 #[no_mangle]
187 pub unsafe extern "ptx-kernel" fn f_triple_u32_arg(_a: TripleU32) {}
188
189 // CHECK: .visible .entry f_triple_u64_arg(
190 // CHECK: .param .align 8 .b8 f_triple_u64_arg_param_0[24]
191 #[no_mangle]
192 pub unsafe extern "ptx-kernel" fn f_triple_u64_arg(_a: TripleU64) {}
193
194 // CHECK: .visible .entry f_many_integers_arg(
195 // CHECK: .param .align 8 .b8 f_many_integers_arg_param_0[16]
196 #[no_mangle]
197 pub unsafe extern "ptx-kernel" fn f_many_integers_arg(_a: ManyIntegers) {}
198
199 // CHECK: .visible .entry f_double_float_arg(
200 // CHECK: .param .align 4 .b8 f_double_float_arg_param_0[8]
201 #[no_mangle]
202 pub unsafe extern "ptx-kernel" fn f_double_float_arg(_a: DoubleFloat) {}
203
204 // CHECK: .visible .entry f_triple_float_arg(
205 // CHECK: .param .align 4 .b8 f_triple_float_arg_param_0[12]
206 #[no_mangle]
207 pub unsafe extern "ptx-kernel" fn f_triple_float_arg(_a: TripleFloat) {}
208
209 // CHECK: .visible .entry f_triple_double_arg(
210 // CHECK: .param .align 8 .b8 f_triple_double_arg_param_0[24]
211 #[no_mangle]
212 pub unsafe extern "ptx-kernel" fn f_triple_double_arg(_a: TripleDouble) {}
213
214 // CHECK: .visible .entry f_many_numerics_arg(
215 // CHECK: .param .align 8 .b8 f_many_numerics_arg_param_0[32]
216 #[no_mangle]
217 pub unsafe extern "ptx-kernel" fn f_many_numerics_arg(_a: ManyNumerics) {}
218
219 // CHECK: .visible .entry f_byte_array_arg(
220 // CHECK: .param .align 1 .b8 f_byte_array_arg_param_0[5]
221 #[no_mangle]
222 pub unsafe extern "ptx-kernel" fn f_byte_array_arg(_a: [u8; 5]) {}
223
224 // CHECK: .visible .entry f_float_array_arg(
225 // CHECK: .param .align 4 .b8 f_float_array_arg_param_0[20]
226 #[no_mangle]
227 pub unsafe extern "ptx-kernel" fn f_float_array_arg(_a: [f32; 5]) {}
228
229 // CHECK: .visible .entry f_u128_array_arg(
230 // CHECK: .param .align 16 .b8 f_u128_array_arg_param_0[80]
231 #[no_mangle]
232 pub unsafe extern "ptx-kernel" fn f_u128_array_arg(_a: [u128; 5]) {}
233
234 // CHECK: .visible .entry f_u32_slice_arg(
235 // CHECK: .param .u64 f_u32_slice_arg_param_0
236 // CHECK: .param .u64 f_u32_slice_arg_param_1
237 #[no_mangle]
238 pub unsafe extern "ptx-kernel" fn f_u32_slice_arg(_a: &[u32]) {}
239
240 // CHECK: .visible .entry f_tuple_u8_u8_arg(
241 // CHECK: .param .align 1 .b8 f_tuple_u8_u8_arg_param_0[2]
242 #[no_mangle]
243 pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_arg(_a: (u8, u8)) {}
244
245 // CHECK: .visible .entry f_tuple_u32_u32_arg(
246 // CHECK: .param .align 4 .b8 f_tuple_u32_u32_arg_param_0[8]
247 #[no_mangle]
248 pub unsafe extern "ptx-kernel" fn f_tuple_u32_u32_arg(_a: (u32, u32)) {}
249
250
251 // CHECK: .visible .entry f_tuple_u8_u8_u32_arg(
252 // CHECK: .param .align 4 .b8 f_tuple_u8_u8_u32_arg_param_0[8]
253 #[no_mangle]
254 pub unsafe extern "ptx-kernel" fn f_tuple_u8_u8_u32_arg(_a: (u8, u8, u32)) {}