]> git.lizzy.rs Git - rust.git/blob - tests/run-make/raw-dylib-import-name-type/driver.rs
Rollup merge of #106644 - alexcrichton:update-wasi-toolchain, r=cuviper
[rust.git] / tests / run-make / raw-dylib-import-name-type / driver.rs
1 #![feature(raw_dylib)]
2 #![feature(abi_vectorcall)]
3
4 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
5 extern "C" {
6     fn LooksLikeAPrivateGlobal(i: i32);
7     fn cdecl_fn_undecorated(i: i32);
8     #[link_name = "cdecl_fn_undecorated2"]
9     fn cdecl_fn_undecorated_renamed(i: i32);
10     static mut extern_variable_undecorated: i32;
11 }
12
13 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
14 extern "C" {
15     fn cdecl_fn_noprefix(i: i32);
16     static mut extern_variable_noprefix: i32;
17 }
18
19 #[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
20 extern "C" {
21     fn cdecl_fn_decorated(i: i32);
22     static mut extern_variable_decorated: i32;
23 }
24
25 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
26 extern "stdcall" {
27     fn stdcall_fn_undecorated(i: i32);
28     #[link_name = "stdcall_fn_undecorated2"]
29     fn stdcall_fn_undecorated_renamed(i: i32);
30 }
31
32 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
33 extern "stdcall" {
34     fn stdcall_fn_noprefix(i: i32);
35 }
36
37 #[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
38 extern "stdcall" {
39     fn stdcall_fn_decorated(i: i32);
40 }
41
42 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
43 extern "fastcall" {
44     fn fastcall_fn_undecorated(i: i32);
45     #[link_name = "fastcall_fn_undecorated2"]
46     fn fastcall_fn_undecorated_renamed(i: i32);
47 }
48
49 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
50 extern "fastcall" {
51     fn fastcall_fn_noprefix(i: i32);
52 }
53
54 #[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
55 extern "fastcall" {
56     fn fastcall_fn_decorated(i: i32);
57 }
58
59 #[cfg(target_env = "msvc")]
60 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
61 extern "vectorcall" {
62     fn vectorcall_fn_undecorated(i: i32);
63     #[link_name = "vectorcall_fn_undecorated2"]
64     fn vectorcall_fn_undecorated_renamed(i: i32);
65 }
66
67 #[cfg(target_env = "msvc")]
68 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
69 extern "vectorcall" {
70     fn vectorcall_fn_noprefix(i: i32);
71 }
72
73 #[cfg(target_env = "msvc")]
74 #[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
75 extern "vectorcall" {
76     fn vectorcall_fn_decorated(i: i32);
77 }
78
79 #[link(name = "extern", kind = "raw-dylib")]
80 extern {
81     fn print_extern_variable_undecorated();
82     fn print_extern_variable_noprefix();
83     fn print_extern_variable_decorated();
84 }
85
86 pub fn main() {
87     unsafe {
88         // Regression test for #104453
89         // On x86 LLVM uses 'L' as the prefix for private globals (PrivateGlobalPrefix), which
90         // causes it to believe that undecorated functions starting with 'L' are actually temporary
91         // symbols that it generated, which causes a later check to fail as the symbols we are
92         // creating don't have definitions (whereas all temporary symbols do).
93         LooksLikeAPrivateGlobal(13);
94
95         cdecl_fn_undecorated(1);
96         cdecl_fn_undecorated_renamed(10);
97         cdecl_fn_noprefix(2);
98         cdecl_fn_decorated(3);
99
100         stdcall_fn_undecorated(4);
101         stdcall_fn_undecorated_renamed(14);
102         stdcall_fn_noprefix(5);
103         stdcall_fn_decorated(6);
104
105         fastcall_fn_undecorated(7);
106         fastcall_fn_undecorated_renamed(17);
107         fastcall_fn_noprefix(8);
108         fastcall_fn_decorated(9);
109
110         extern_variable_undecorated = 42;
111         print_extern_variable_undecorated();
112         extern_variable_noprefix = 43;
113         print_extern_variable_noprefix();
114         extern_variable_decorated = 44;
115         print_extern_variable_decorated();
116
117         // GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
118         #[cfg(target_env = "msvc")]
119         {
120             vectorcall_fn_undecorated(10);
121             vectorcall_fn_undecorated_renamed(20);
122             vectorcall_fn_noprefix(11);
123             vectorcall_fn_decorated(12);
124         }
125         #[cfg(not(target_env = "msvc"))]
126         {
127             println!("vectorcall_fn_undecorated(10)");
128             println!("vectorcall_fn_undecorated2(20)");
129             println!("vectorcall_fn_noprefix(11)");
130             println!("vectorcall_fn_decorated(12)");
131         }
132     }
133 }