]> git.lizzy.rs Git - rust.git/blob - src/test/run-make/raw-dylib-alt-calling-convention/lib.rs
Rollup merge of #100167 - chenyukang:require-suggestion, r=estebank
[rust.git] / src / test / run-make / raw-dylib-alt-calling-convention / lib.rs
1 #![feature(raw_dylib)]
2 #![feature(abi_vectorcall)]
3
4 #[repr(C)]
5 #[derive(Clone)]
6 struct S {
7     x: u8,
8     y: i32,
9 }
10
11 #[repr(C)]
12 #[derive(Clone)]
13 struct S2 {
14     x: i32,
15     y: u8,
16 }
17
18 #[repr(C)]
19 #[derive(Clone)]
20 struct S3 {
21     x: [u8; 5],
22 }
23
24 #[link(name = "extern", kind = "raw-dylib")]
25 extern "stdcall" {
26     fn stdcall_fn_1(i: i32);
27     fn stdcall_fn_2(c: u8, f: f32);
28     fn stdcall_fn_3(d: f64);
29     fn stdcall_fn_4(i: u8, j: u8, f: f32);
30     fn stdcall_fn_5(a: S, b: i32);
31     fn stdcall_fn_6(a: Option<&S>);
32     fn stdcall_fn_7(a: S2, b: i32);
33     fn stdcall_fn_8(a: S3, b: S3);
34     fn stdcall_fn_9(x: u8, y: f64);
35 }
36
37 #[link(name = "extern", kind = "raw-dylib")]
38 extern "fastcall" {
39     fn fastcall_fn_1(i: i32);
40     fn fastcall_fn_2(c: u8, f: f32);
41     fn fastcall_fn_3(d: f64);
42     fn fastcall_fn_4(i: u8, j: u8, f: f32);
43     fn fastcall_fn_5(a: S, b: i32);
44     fn fastcall_fn_6(a: Option<&S>);
45     fn fastcall_fn_7(a: S2, b: i32);
46     fn fastcall_fn_8(a: S3, b: S3);
47     fn fastcall_fn_9(x: u8, y: f64);
48 }
49
50 #[cfg(target_env = "msvc")]
51 #[link(name = "extern", kind = "raw-dylib")]
52 extern "vectorcall" {
53     fn vectorcall_fn_1(i: i32);
54     fn vectorcall_fn_2(c: u8, f: f32);
55     fn vectorcall_fn_3(d: f64);
56     fn vectorcall_fn_4(i: u8, j: u8, f: f32);
57     fn vectorcall_fn_5(a: S, b: i32);
58     fn vectorcall_fn_6(a: Option<&S>);
59     fn vectorcall_fn_7(a: S2, b: i32);
60     fn vectorcall_fn_8(a: S3, b: S3);
61     fn vectorcall_fn_9(x: u8, y: f64);
62 }
63
64 pub fn library_function(run_msvc_only: bool) {
65     unsafe {
66         if !run_msvc_only {
67             stdcall_fn_1(14);
68             stdcall_fn_2(16, 3.5);
69             stdcall_fn_3(3.5);
70             stdcall_fn_4(1, 2, 3.0);
71             stdcall_fn_5(S { x: 1, y: 2 }, 16);
72             stdcall_fn_6(Some(&S { x: 10, y: 12 }));
73             stdcall_fn_7(S2 { x: 15, y: 16 }, 3);
74             stdcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
75             stdcall_fn_9(1, 3.0);
76
77             fastcall_fn_1(14);
78             fastcall_fn_2(16, 3.5);
79             fastcall_fn_3(3.5);
80             fastcall_fn_4(1, 2, 3.0);
81             fastcall_fn_6(Some(&S { x: 10, y: 12 }));
82             fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
83             fastcall_fn_9(1, 3.0);
84         } else {
85             // FIXME: 91167
86             // rustc generates incorrect code for the calls to fastcall_fn_5 and fastcall_fn_7
87             // on i686-pc-windows-gnu; disabling these until the indicated issue is fixed.
88             fastcall_fn_5(S { x: 1, y: 2 }, 16);
89             fastcall_fn_7(S2 { x: 15, y: 16 }, 3);
90
91             // GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
92             #[cfg(target_env = "msvc")]
93             {
94                 vectorcall_fn_1(14);
95                 vectorcall_fn_2(16, 3.5);
96                 vectorcall_fn_3(3.5);
97                 vectorcall_fn_4(1, 2, 3.0);
98                 vectorcall_fn_5(S { x: 1, y: 2 }, 16);
99                 vectorcall_fn_6(Some(&S { x: 10, y: 12 }));
100                 vectorcall_fn_7(S2 { x: 15, y: 16 }, 3);
101                 vectorcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
102                 vectorcall_fn_9(1, 3.0);
103             }
104         }
105     }
106 }