Skip to content

Commit 1003a36

Browse files
authored
Rollup merge of rust-lang#101738 - dpaoliello:linkname, r=petrochenkov
Fix `#[link kind="raw-dylib"]` to respect `#[link_name]` Issue Details: When using `#[link kind="raw-dylib"]` (rust-lang#58713), the Rust compiler ignored any `#[link_name]` attributes when generating the import library and so the resulting binary would fail to link due to missing symbols. Fix Details: Use the name from `#[link_name]` if present when generating the `raw-dylib` import library, otherwise default back to the actual symbol name.
2 parents 02e43ff + 3c184db commit 1003a36

File tree

13 files changed

+140
-4
lines changed

13 files changed

+140
-4
lines changed

compiler/rustc_metadata/src/native_libs.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -560,14 +560,13 @@ impl<'tcx> Collector<'tcx> {
560560
}
561561
};
562562

563-
let import_name_type = self
564-
.tcx
565-
.codegen_fn_attrs(item.id.def_id)
563+
let codegen_fn_attrs = self.tcx.codegen_fn_attrs(item.id.def_id);
564+
let import_name_type = codegen_fn_attrs
566565
.link_ordinal
567566
.map_or(import_name_type, |ord| Some(PeImportNameType::Ordinal(ord)));
568567

569568
DllImport {
570-
name: item.ident.name,
569+
name: codegen_fn_attrs.link_name.unwrap_or(item.ident.name),
571570
import_name_type,
572571
calling_convention,
573572
span: item.span,

src/test/run-make/raw-dylib-alt-calling-convention/extern.c

+15
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,11 @@ __declspec(dllexport) void __stdcall stdcall_fn_9(uint8_t x, double y) {
7070
fflush(stdout);
7171
}
7272

73+
__declspec(dllexport) void __stdcall stdcall_fn_10(int i) {
74+
printf("stdcall_fn_10(%d)\n", i);
75+
fflush(stdout);
76+
}
77+
7378
__declspec(dllexport) void __fastcall fastcall_fn_1(int i) {
7479
printf("fastcall_fn_1(%d)\n", i);
7580
fflush(stdout);
@@ -122,6 +127,11 @@ __declspec(dllexport) void __fastcall fastcall_fn_9(uint8_t x, double y) {
122127
fflush(stdout);
123128
}
124129

130+
__declspec(dllexport) void __fastcall fastcall_fn_10(int i) {
131+
printf("fastcall_fn_10(%d)\n", i);
132+
fflush(stdout);
133+
}
134+
125135
// GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
126136
#ifdef _MSC_VER
127137
__declspec(dllexport) void __vectorcall vectorcall_fn_1(int i) {
@@ -175,4 +185,9 @@ __declspec(dllexport) void __vectorcall vectorcall_fn_9(uint8_t x, double y) {
175185
printf("vectorcall_fn_9(%d, %.1f)\n", x, y);
176186
fflush(stdout);
177187
}
188+
189+
__declspec(dllexport) void __vectorcall vectorcall_fn_10(int i) {
190+
printf("vectorcall_fn_10(%d)\n", i);
191+
fflush(stdout);
192+
}
178193
#endif

src/test/run-make/raw-dylib-alt-calling-convention/lib.rs

+9
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ extern "stdcall" {
3232
fn stdcall_fn_7(a: S2, b: i32);
3333
fn stdcall_fn_8(a: S3, b: S3);
3434
fn stdcall_fn_9(x: u8, y: f64);
35+
#[link_name = "stdcall_fn_10"]
36+
fn stdcall_fn_10_renamed(i: i32);
3537
}
3638

3739
#[link(name = "extern", kind = "raw-dylib")]
@@ -45,6 +47,8 @@ extern "fastcall" {
4547
fn fastcall_fn_7(a: S2, b: i32);
4648
fn fastcall_fn_8(a: S3, b: S3);
4749
fn fastcall_fn_9(x: u8, y: f64);
50+
#[link_name = "fastcall_fn_10"]
51+
fn fastcall_fn_10_renamed(i: i32);
4852
}
4953

5054
#[cfg(target_env = "msvc")]
@@ -59,6 +63,8 @@ extern "vectorcall" {
5963
fn vectorcall_fn_7(a: S2, b: i32);
6064
fn vectorcall_fn_8(a: S3, b: S3);
6165
fn vectorcall_fn_9(x: u8, y: f64);
66+
#[link_name = "vectorcall_fn_10"]
67+
fn vectorcall_fn_10_renamed(i: i32);
6268
}
6369

6470
pub fn library_function(run_msvc_only: bool) {
@@ -73,6 +79,7 @@ pub fn library_function(run_msvc_only: bool) {
7379
stdcall_fn_7(S2 { x: 15, y: 16 }, 3);
7480
stdcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
7581
stdcall_fn_9(1, 3.0);
82+
stdcall_fn_10_renamed(19);
7683

7784
fastcall_fn_1(14);
7885
fastcall_fn_2(16, 3.5);
@@ -81,6 +88,7 @@ pub fn library_function(run_msvc_only: bool) {
8188
fastcall_fn_6(Some(&S { x: 10, y: 12 }));
8289
fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
8390
fastcall_fn_9(1, 3.0);
91+
fastcall_fn_10_renamed(19);
8492
} else {
8593
// FIXME: 91167
8694
// rustc generates incorrect code for the calls to fastcall_fn_5 and fastcall_fn_7
@@ -100,6 +108,7 @@ pub fn library_function(run_msvc_only: bool) {
100108
vectorcall_fn_7(S2 { x: 15, y: 16 }, 3);
101109
vectorcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
102110
vectorcall_fn_9(1, 3.0);
111+
vectorcall_fn_10_renamed(19);
103112
}
104113
}
105114
}

src/test/run-make/raw-dylib-alt-calling-convention/output.msvc.txt

+1
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ vectorcall_fn_6(S { x: 10, y: 12 })
99
vectorcall_fn_7(S2 { x: 15, y: 16 }, 3)
1010
vectorcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
1111
vectorcall_fn_9(1, 3.0)
12+
vectorcall_fn_10(19)

src/test/run-make/raw-dylib-alt-calling-convention/output.txt

+2
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,12 @@ stdcall_fn_6(S { x: 10, y: 12 })
77
stdcall_fn_7(S2 { x: 15, y: 16 }, 3)
88
stdcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
99
stdcall_fn_9(1, 3.0)
10+
stdcall_fn_10(19)
1011
fastcall_fn_1(14)
1112
fastcall_fn_2(16, 3.5)
1213
fastcall_fn_3(3.5)
1314
fastcall_fn_4(1, 2, 3.0)
1415
fastcall_fn_6(S { x: 10, y: 12 })
1516
fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
1617
fastcall_fn_9(1, 3.0)
18+
fastcall_fn_10(19)

src/test/run-make/raw-dylib-c/extern_1.c

+5
Original file line numberDiff line numberDiff line change
@@ -21,3 +21,8 @@ __declspec(dllexport) void extern_fn_with_long_name() {
2121
printf("extern_fn_with_long_name; got the rename\n");
2222
fflush(stdout);
2323
}
24+
25+
__declspec(dllexport) void extern_fn_4() {
26+
printf("extern_fn_4\n");
27+
fflush(stdout);
28+
}

src/test/run-make/raw-dylib-c/lib.rs

+3
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,15 @@ pub fn library_function() {
1616
fn extern_fn_2();
1717
fn print_extern_variable();
1818
static mut extern_variable: i32;
19+
#[link_name = "extern_fn_4"]
20+
fn extern_fn_4_renamed();
1921
}
2022

2123
unsafe {
2224
extern_fn_1();
2325
extern_fn_2();
2426
extern_fn_3();
27+
extern_fn_4_renamed();
2528
extern_variable = 42;
2629
print_extern_variable();
2730
extern_variable = -42;
+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
extern_fn_1
22
extern_fn_2; didn't get the rename
33
extern_fn_3
4+
extern_fn_4
45
extern_variable value: 42
56
extern_variable value: -42

src/test/run-make/raw-dylib-import-name-type/driver.rs

+46
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
#![feature(raw_dylib)]
2+
#![feature(abi_vectorcall)]
23

34
#[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
45
extern "C" {
56
fn cdecl_fn_undecorated(i: i32);
7+
#[link_name = "cdecl_fn_undecorated2"]
8+
fn cdecl_fn_undecorated_renamed(i: i32);
69
static mut extern_variable_undecorated: i32;
710
}
811

@@ -21,6 +24,8 @@ extern "C" {
2124
#[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
2225
extern "stdcall" {
2326
fn stdcall_fn_undecorated(i: i32);
27+
#[link_name = "stdcall_fn_undecorated2"]
28+
fn stdcall_fn_undecorated_renamed(i: i32);
2429
}
2530

2631
#[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
@@ -36,6 +41,8 @@ extern "stdcall" {
3641
#[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
3742
extern "fastcall" {
3843
fn fastcall_fn_undecorated(i: i32);
44+
#[link_name = "fastcall_fn_undecorated2"]
45+
fn fastcall_fn_undecorated_renamed(i: i32);
3946
}
4047

4148
#[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
@@ -48,6 +55,26 @@ extern "fastcall" {
4855
fn fastcall_fn_decorated(i: i32);
4956
}
5057

58+
#[cfg(target_env = "msvc")]
59+
#[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
60+
extern "vectorcall" {
61+
fn vectorcall_fn_undecorated(i: i32);
62+
#[link_name = "vectorcall_fn_undecorated2"]
63+
fn vectorcall_fn_undecorated_renamed(i: i32);
64+
}
65+
66+
#[cfg(target_env = "msvc")]
67+
#[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
68+
extern "vectorcall" {
69+
fn vectorcall_fn_noprefix(i: i32);
70+
}
71+
72+
#[cfg(target_env = "msvc")]
73+
#[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
74+
extern "vectorcall" {
75+
fn vectorcall_fn_decorated(i: i32);
76+
}
77+
5178
#[link(name = "extern", kind = "raw-dylib")]
5279
extern {
5380
fn print_extern_variable_undecorated();
@@ -58,14 +85,17 @@ extern {
5885
pub fn main() {
5986
unsafe {
6087
cdecl_fn_undecorated(1);
88+
cdecl_fn_undecorated_renamed(10);
6189
cdecl_fn_noprefix(2);
6290
cdecl_fn_decorated(3);
6391

6492
stdcall_fn_undecorated(4);
93+
stdcall_fn_undecorated_renamed(14);
6594
stdcall_fn_noprefix(5);
6695
stdcall_fn_decorated(6);
6796

6897
fastcall_fn_undecorated(7);
98+
fastcall_fn_undecorated_renamed(17);
6999
fastcall_fn_noprefix(8);
70100
fastcall_fn_decorated(9);
71101

@@ -75,5 +105,21 @@ pub fn main() {
75105
print_extern_variable_noprefix();
76106
extern_variable_decorated = 44;
77107
print_extern_variable_decorated();
108+
109+
// GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
110+
#[cfg(target_env = "msvc")]
111+
{
112+
vectorcall_fn_undecorated(10);
113+
vectorcall_fn_undecorated_renamed(20);
114+
vectorcall_fn_noprefix(11);
115+
vectorcall_fn_decorated(12);
116+
}
117+
#[cfg(not(target_env = "msvc"))]
118+
{
119+
println!("vectorcall_fn_undecorated(10)");
120+
println!("vectorcall_fn_undecorated2(20)");
121+
println!("vectorcall_fn_noprefix(11)");
122+
println!("vectorcall_fn_decorated(12)");
123+
}
78124
}
79125
}

src/test/run-make/raw-dylib-import-name-type/extern.c

+38
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ void _cdecl cdecl_fn_undecorated(int i) {
66
fflush(stdout);
77
}
88

9+
void _cdecl cdecl_fn_undecorated2(int i) {
10+
printf("cdecl_fn_undecorated2(%d)\n", i);
11+
fflush(stdout);
12+
}
13+
914
void _cdecl cdecl_fn_noprefix(int i) {
1015
printf("cdecl_fn_noprefix(%d)\n", i);
1116
fflush(stdout);
@@ -21,6 +26,11 @@ void __stdcall stdcall_fn_undecorated(int i) {
2126
fflush(stdout);
2227
}
2328

29+
void __stdcall stdcall_fn_undecorated2(int i) {
30+
printf("stdcall_fn_undecorated2(%d)\n", i);
31+
fflush(stdout);
32+
}
33+
2434
void __stdcall stdcall_fn_noprefix(int i) {
2535
printf("stdcall_fn_noprefix(%d)\n", i);
2636
fflush(stdout);
@@ -36,6 +46,11 @@ void __fastcall fastcall_fn_undecorated(int i) {
3646
fflush(stdout);
3747
}
3848

49+
void __fastcall fastcall_fn_undecorated2(int i) {
50+
printf("fastcall_fn_undecorated2(%d)\n", i);
51+
fflush(stdout);
52+
}
53+
3954
void __fastcall fastcall_fn_noprefix(int i) {
4055
printf("fastcall_fn_noprefix(%d)\n", i);
4156
fflush(stdout);
@@ -63,3 +78,26 @@ __declspec(dllexport) void print_extern_variable_decorated() {
6378
printf("extern_variable_decorated value: %d\n", extern_variable_decorated);
6479
fflush(stdout);
6580
}
81+
82+
// GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
83+
#ifdef _MSC_VER
84+
void __vectorcall vectorcall_fn_undecorated(int i) {
85+
printf("vectorcall_fn_undecorated(%d)\n", i);
86+
fflush(stdout);
87+
}
88+
89+
void __vectorcall vectorcall_fn_undecorated2(int i) {
90+
printf("vectorcall_fn_undecorated2(%d)\n", i);
91+
fflush(stdout);
92+
}
93+
94+
void __vectorcall vectorcall_fn_noprefix(int i) {
95+
printf("vectorcall_fn_noprefix(%d)\n", i);
96+
fflush(stdout);
97+
}
98+
99+
void __vectorcall vectorcall_fn_decorated(int i) {
100+
printf("vectorcall_fn_decorated(%d)\n", i);
101+
fflush(stdout);
102+
}
103+
#endif

src/test/run-make/raw-dylib-import-name-type/extern.gnu.def

+3
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
LIBRARY extern
22
EXPORTS
33
cdecl_fn_undecorated
4+
cdecl_fn_undecorated2
45
cdecl_fn_noprefix
56
cdecl_fn_decorated
67
stdcall_fn_undecorated
8+
stdcall_fn_undecorated2
79
stdcall_fn_noprefix@4
810
fastcall_fn_undecorated
11+
fastcall_fn_undecorated2
912
@fastcall_fn_decorated@4
1013

1114
;ld doesn't handle fully-decorated stdcall, or no-prefix fastcall

src/test/run-make/raw-dylib-import-name-type/extern.msvc.def

+7
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
LIBRARY extern
22
EXPORTS
33
cdecl_fn_undecorated
4+
cdecl_fn_undecorated2
45
cdecl_fn_noprefix
56
cdecl_fn_decorated
67
stdcall_fn_undecorated
8+
stdcall_fn_undecorated2
79
_stdcall_fn_decorated@4
810
fastcall_fn_undecorated
11+
fastcall_fn_undecorated2
912
@fastcall_fn_decorated@4
13+
vectorcall_fn_undecorated
14+
vectorcall_fn_undecorated2
15+
vectorcall_fn_decorated@@4
16+
vectorcall_fn_noprefix@@4
1017

1118
;MSVC doesn't seem to recognize the "no prefix" syntax.
1219
stdcall_fn_noprefix@4=_stdcall_fn_noprefix@4
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,19 @@
11
cdecl_fn_undecorated(1)
2+
cdecl_fn_undecorated2(10)
23
cdecl_fn_noprefix(2)
34
cdecl_fn_decorated(3)
45
stdcall_fn_undecorated(4)
6+
stdcall_fn_undecorated2(14)
57
stdcall_fn_noprefix(5)
68
stdcall_fn_decorated(6)
79
fastcall_fn_undecorated(7)
10+
fastcall_fn_undecorated2(17)
811
fastcall_fn_noprefix(8)
912
fastcall_fn_decorated(9)
1013
extern_variable_undecorated value: 42
1114
extern_variable_noprefix value: 43
1215
extern_variable_decorated value: 44
16+
vectorcall_fn_undecorated(10)
17+
vectorcall_fn_undecorated2(20)
18+
vectorcall_fn_noprefix(11)
19+
vectorcall_fn_decorated(12)

0 commit comments

Comments
 (0)