]> git.lizzy.rs Git - rust.git/commitdiff
Fix raw-dylib with link_name
authorDaniel Paoliello <danpao@microsoft.com>
Mon, 12 Sep 2022 21:03:19 +0000 (14:03 -0700)
committerDaniel Paoliello <danpao@microsoft.com>
Mon, 12 Sep 2022 21:03:19 +0000 (14:03 -0700)
13 files changed:
compiler/rustc_metadata/src/native_libs.rs
src/test/run-make/raw-dylib-alt-calling-convention/extern.c
src/test/run-make/raw-dylib-alt-calling-convention/lib.rs
src/test/run-make/raw-dylib-alt-calling-convention/output.msvc.txt
src/test/run-make/raw-dylib-alt-calling-convention/output.txt
src/test/run-make/raw-dylib-c/extern_1.c
src/test/run-make/raw-dylib-c/lib.rs
src/test/run-make/raw-dylib-c/output.txt
src/test/run-make/raw-dylib-import-name-type/driver.rs
src/test/run-make/raw-dylib-import-name-type/extern.c
src/test/run-make/raw-dylib-import-name-type/extern.gnu.def
src/test/run-make/raw-dylib-import-name-type/extern.msvc.def
src/test/run-make/raw-dylib-import-name-type/output.txt

index 3acabc4e69ce653b96d7d3a8a142c73b15a12f28..5017329200ef198a5b56dd511a9bb21a8eaccfc0 100644 (file)
@@ -495,14 +495,13 @@ fn build_dll_import(
             }
         };
 
-        let import_name_type = self
-            .tcx
-            .codegen_fn_attrs(item.id.def_id)
+        let codegen_fn_attrs = self.tcx.codegen_fn_attrs(item.id.def_id);
+        let import_name_type = codegen_fn_attrs
             .link_ordinal
             .map_or(import_name_type, |ord| Some(PeImportNameType::Ordinal(ord)));
 
         DllImport {
-            name: item.ident.name,
+            name: codegen_fn_attrs.link_name.unwrap_or(item.ident.name),
             import_name_type,
             calling_convention,
             span: item.span,
index 0c4d12af9b2ca62a3fa10d407408211a2c9a7c0a..344d4a6bf5a8d0394f890700404c4939e815932c 100644 (file)
@@ -70,6 +70,11 @@ __declspec(dllexport) void __stdcall stdcall_fn_9(uint8_t x, double y) {
     fflush(stdout);
 }
 
+__declspec(dllexport) void __stdcall stdcall_fn_10(int i) {
+    printf("stdcall_fn_10(%d)\n", i);
+    fflush(stdout);
+}
+
 __declspec(dllexport) void __fastcall fastcall_fn_1(int i) {
     printf("fastcall_fn_1(%d)\n", i);
     fflush(stdout);
@@ -122,6 +127,11 @@ __declspec(dllexport) void __fastcall fastcall_fn_9(uint8_t x, double y) {
     fflush(stdout);
 }
 
+__declspec(dllexport) void __fastcall fastcall_fn_10(int i) {
+    printf("fastcall_fn_10(%d)\n", i);
+    fflush(stdout);
+}
+
 // GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
 #ifdef _MSC_VER
 __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) {
     printf("vectorcall_fn_9(%d, %.1f)\n", x, y);
     fflush(stdout);
 }
+
+__declspec(dllexport) void __vectorcall vectorcall_fn_10(int i) {
+    printf("vectorcall_fn_10(%d)\n", i);
+    fflush(stdout);
+}
 #endif
index fe74fbfd2646f40cff5b57dd0b68d07f3bd31529..22f222c12c39bfd6e620f3a5f659dc9f7a662706 100644 (file)
@@ -32,6 +32,8 @@ struct S3 {
     fn stdcall_fn_7(a: S2, b: i32);
     fn stdcall_fn_8(a: S3, b: S3);
     fn stdcall_fn_9(x: u8, y: f64);
+    #[link_name = "stdcall_fn_10"]
+    fn stdcall_fn_10_renamed(i: i32);
 }
 
 #[link(name = "extern", kind = "raw-dylib")]
@@ -45,6 +47,8 @@ struct S3 {
     fn fastcall_fn_7(a: S2, b: i32);
     fn fastcall_fn_8(a: S3, b: S3);
     fn fastcall_fn_9(x: u8, y: f64);
+    #[link_name = "fastcall_fn_10"]
+    fn fastcall_fn_10_renamed(i: i32);
 }
 
 #[cfg(target_env = "msvc")]
@@ -59,6 +63,8 @@ struct S3 {
     fn vectorcall_fn_7(a: S2, b: i32);
     fn vectorcall_fn_8(a: S3, b: S3);
     fn vectorcall_fn_9(x: u8, y: f64);
+    #[link_name = "vectorcall_fn_10"]
+    fn vectorcall_fn_10_renamed(i: i32);
 }
 
 pub fn library_function(run_msvc_only: bool) {
@@ -73,6 +79,7 @@ pub fn library_function(run_msvc_only: bool) {
             stdcall_fn_7(S2 { x: 15, y: 16 }, 3);
             stdcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
             stdcall_fn_9(1, 3.0);
+            stdcall_fn_10_renamed(19);
 
             fastcall_fn_1(14);
             fastcall_fn_2(16, 3.5);
@@ -81,6 +88,7 @@ pub fn library_function(run_msvc_only: bool) {
             fastcall_fn_6(Some(&S { x: 10, y: 12 }));
             fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
             fastcall_fn_9(1, 3.0);
+            fastcall_fn_10_renamed(19);
         } else {
             // FIXME: 91167
             // 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) {
                 vectorcall_fn_7(S2 { x: 15, y: 16 }, 3);
                 vectorcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] });
                 vectorcall_fn_9(1, 3.0);
+                vectorcall_fn_10_renamed(19);
             }
         }
     }
index 9ddd1b11016253569c6f170fde51613a814852aa..a216835c4b62f8dbb96592b5f83056ea200daaf9 100644 (file)
@@ -9,3 +9,4 @@ vectorcall_fn_6(S { x: 10, y: 12 })
 vectorcall_fn_7(S2 { x: 15, y: 16 }, 3)
 vectorcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
 vectorcall_fn_9(1, 3.0)
+vectorcall_fn_10(19)
index 348bad63ed0ded02bf309200f3e633f62992ea0b..7622d31618b8061a6dd01e3003b031f2de4372e6 100644 (file)
@@ -7,6 +7,7 @@ stdcall_fn_6(S { x: 10, y: 12 })
 stdcall_fn_7(S2 { x: 15, y: 16 }, 3)
 stdcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
 stdcall_fn_9(1, 3.0)
+stdcall_fn_10(19)
 fastcall_fn_1(14)
 fastcall_fn_2(16, 3.5)
 fastcall_fn_3(3.5)
@@ -14,3 +15,4 @@ fastcall_fn_4(1, 2, 3.0)
 fastcall_fn_6(S { x: 10, y: 12 })
 fastcall_fn_8(S3 { x: [1, 2, 3, 4, 5] }, S3 { x: [6, 7, 8, 9, 10] })
 fastcall_fn_9(1, 3.0)
+fastcall_fn_10(19)
index ab1dc3a4105b7af70e61558c6c8d325d81af3ddf..5d695547d0f5e01693cf6d6b0cbd80adf1c186ae 100644 (file)
@@ -21,3 +21,8 @@ __declspec(dllexport) void extern_fn_with_long_name() {
     printf("extern_fn_with_long_name; got the rename\n");
     fflush(stdout);
 }
+
+__declspec(dllexport) void extern_fn_4() {
+    printf("extern_fn_4\n");
+    fflush(stdout);
+}
index 74e0d3813d9462dad366b341911f5b07058ace55..005ffcdda5c2ed84b76a5c32109a17c6fe9ff0e5 100644 (file)
@@ -16,12 +16,15 @@ pub fn library_function() {
         fn extern_fn_2();
         fn print_extern_variable();
         static mut extern_variable: i32;
+        #[link_name = "extern_fn_4"]
+        fn extern_fn_4_renamed();
     }
 
     unsafe {
         extern_fn_1();
         extern_fn_2();
         extern_fn_3();
+        extern_fn_4_renamed();
         extern_variable = 42;
         print_extern_variable();
         extern_variable = -42;
index cd9fe47bee473f0a8a41311c38f93a27d2c32def..cc970cef7bcaa63766ae39057c3c70631d0e8c98 100644 (file)
@@ -1,5 +1,6 @@
 extern_fn_1
 extern_fn_2; didn't get the rename
 extern_fn_3
+extern_fn_4
 extern_variable value: 42
 extern_variable value: -42
index 74e9a89fbdf3274c413358eb93a8ed8ad4412609..a38849fc8130a3d3c186dcecca2e1eb4c133dbe0 100644 (file)
@@ -1,8 +1,11 @@
 #![feature(raw_dylib)]
+#![feature(abi_vectorcall)]
 
 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
 extern "C" {
     fn cdecl_fn_undecorated(i: i32);
+    #[link_name = "cdecl_fn_undecorated2"]
+    fn cdecl_fn_undecorated_renamed(i: i32);
     static mut extern_variable_undecorated: i32;
 }
 
@@ -21,6 +24,8 @@
 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
 extern "stdcall" {
     fn stdcall_fn_undecorated(i: i32);
+    #[link_name = "stdcall_fn_undecorated2"]
+    fn stdcall_fn_undecorated_renamed(i: i32);
 }
 
 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
@@ -36,6 +41,8 @@
 #[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
 extern "fastcall" {
     fn fastcall_fn_undecorated(i: i32);
+    #[link_name = "fastcall_fn_undecorated2"]
+    fn fastcall_fn_undecorated_renamed(i: i32);
 }
 
 #[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
     fn fastcall_fn_decorated(i: i32);
 }
 
+#[cfg(target_env = "msvc")]
+#[link(name = "extern", kind = "raw-dylib", import_name_type = "undecorated")]
+extern "vectorcall" {
+    fn vectorcall_fn_undecorated(i: i32);
+    #[link_name = "vectorcall_fn_undecorated2"]
+    fn vectorcall_fn_undecorated_renamed(i: i32);
+}
+
+#[cfg(target_env = "msvc")]
+#[link(name = "extern", kind = "raw-dylib", import_name_type = "noprefix")]
+extern "vectorcall" {
+    fn vectorcall_fn_noprefix(i: i32);
+}
+
+#[cfg(target_env = "msvc")]
+#[link(name = "extern", kind = "raw-dylib", import_name_type = "decorated")]
+extern "vectorcall" {
+    fn vectorcall_fn_decorated(i: i32);
+}
+
 #[link(name = "extern", kind = "raw-dylib")]
 extern {
     fn print_extern_variable_undecorated();
 pub fn main() {
     unsafe {
         cdecl_fn_undecorated(1);
+        cdecl_fn_undecorated_renamed(10);
         cdecl_fn_noprefix(2);
         cdecl_fn_decorated(3);
 
         stdcall_fn_undecorated(4);
+        stdcall_fn_undecorated_renamed(14);
         stdcall_fn_noprefix(5);
         stdcall_fn_decorated(6);
 
         fastcall_fn_undecorated(7);
+        fastcall_fn_undecorated_renamed(17);
         fastcall_fn_noprefix(8);
         fastcall_fn_decorated(9);
 
@@ -75,5 +105,21 @@ pub fn main() {
         print_extern_variable_noprefix();
         extern_variable_decorated = 44;
         print_extern_variable_decorated();
+
+        // GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
+        #[cfg(target_env = "msvc")]
+        {
+            vectorcall_fn_undecorated(10);
+            vectorcall_fn_undecorated_renamed(20);
+            vectorcall_fn_noprefix(11);
+            vectorcall_fn_decorated(12);
+        }
+        #[cfg(not(target_env = "msvc"))]
+        {
+            println!("vectorcall_fn_undecorated(10)");
+            println!("vectorcall_fn_undecorated2(20)");
+            println!("vectorcall_fn_noprefix(11)");
+            println!("vectorcall_fn_decorated(12)");
+        }
     }
 }
index 1102158e2494eb1885bc26b0d4f2b9ca14955236..195126d51294ccb58d47eb8d894286b06723fe12 100644 (file)
@@ -6,6 +6,11 @@ void _cdecl cdecl_fn_undecorated(int i) {
     fflush(stdout);
 }
 
+void _cdecl cdecl_fn_undecorated2(int i) {
+    printf("cdecl_fn_undecorated2(%d)\n", i);
+    fflush(stdout);
+}
+
 void _cdecl cdecl_fn_noprefix(int i) {
     printf("cdecl_fn_noprefix(%d)\n", i);
     fflush(stdout);
@@ -21,6 +26,11 @@ void __stdcall stdcall_fn_undecorated(int i) {
     fflush(stdout);
 }
 
+void __stdcall stdcall_fn_undecorated2(int i) {
+    printf("stdcall_fn_undecorated2(%d)\n", i);
+    fflush(stdout);
+}
+
 void __stdcall stdcall_fn_noprefix(int i) {
     printf("stdcall_fn_noprefix(%d)\n", i);
     fflush(stdout);
@@ -36,6 +46,11 @@ void __fastcall fastcall_fn_undecorated(int i) {
     fflush(stdout);
 }
 
+void __fastcall fastcall_fn_undecorated2(int i) {
+    printf("fastcall_fn_undecorated2(%d)\n", i);
+    fflush(stdout);
+}
+
 void __fastcall fastcall_fn_noprefix(int i) {
     printf("fastcall_fn_noprefix(%d)\n", i);
     fflush(stdout);
@@ -63,3 +78,26 @@ __declspec(dllexport) void print_extern_variable_decorated() {
     printf("extern_variable_decorated value: %d\n", extern_variable_decorated);
     fflush(stdout);
 }
+
+// GCC doesn't support vectorcall: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=89485
+#ifdef _MSC_VER
+void __vectorcall vectorcall_fn_undecorated(int i) {
+    printf("vectorcall_fn_undecorated(%d)\n", i);
+    fflush(stdout);
+}
+
+void __vectorcall vectorcall_fn_undecorated2(int i) {
+    printf("vectorcall_fn_undecorated2(%d)\n", i);
+    fflush(stdout);
+}
+
+void __vectorcall vectorcall_fn_noprefix(int i) {
+    printf("vectorcall_fn_noprefix(%d)\n", i);
+    fflush(stdout);
+}
+
+void __vectorcall vectorcall_fn_decorated(int i) {
+    printf("vectorcall_fn_decorated(%d)\n", i);
+    fflush(stdout);
+}
+#endif
index f06ce67e0308b3e8e0bc3cb3baeaf1ece63bf4f4..a523c959a4744c1d218642eb0863559331136e32 100644 (file)
@@ -1,11 +1,14 @@
 LIBRARY extern
 EXPORTS
     cdecl_fn_undecorated
+    cdecl_fn_undecorated2
     cdecl_fn_noprefix
     cdecl_fn_decorated
     stdcall_fn_undecorated
+    stdcall_fn_undecorated2
     stdcall_fn_noprefix@4
     fastcall_fn_undecorated
+    fastcall_fn_undecorated2
     @fastcall_fn_decorated@4
 
     ;ld doesn't handle fully-decorated stdcall, or no-prefix fastcall
index 9dc333707cb0a7d49581b446e2f974dbc6aaecf0..dbff32d4c90b0a68dede31c0181892e3df9aabd4 100644 (file)
@@ -1,12 +1,19 @@
 LIBRARY extern
 EXPORTS
     cdecl_fn_undecorated
+    cdecl_fn_undecorated2
     cdecl_fn_noprefix
     cdecl_fn_decorated
     stdcall_fn_undecorated
+    stdcall_fn_undecorated2
     _stdcall_fn_decorated@4
     fastcall_fn_undecorated
+    fastcall_fn_undecorated2
     @fastcall_fn_decorated@4
+    vectorcall_fn_undecorated
+    vectorcall_fn_undecorated2
+    vectorcall_fn_decorated@@4
+    vectorcall_fn_noprefix@@4
 
     ;MSVC doesn't seem to recognize the "no prefix" syntax.
     stdcall_fn_noprefix@4=_stdcall_fn_noprefix@4
index 855b20a86457500364994fa17506b21a733f69bb..707faf403aecab506d2a0f4ae428212b8b26518c 100644 (file)
@@ -1,12 +1,19 @@
 cdecl_fn_undecorated(1)
+cdecl_fn_undecorated2(10)
 cdecl_fn_noprefix(2)
 cdecl_fn_decorated(3)
 stdcall_fn_undecorated(4)
+stdcall_fn_undecorated2(14)
 stdcall_fn_noprefix(5)
 stdcall_fn_decorated(6)
 fastcall_fn_undecorated(7)
+fastcall_fn_undecorated2(17)
 fastcall_fn_noprefix(8)
 fastcall_fn_decorated(9)
 extern_variable_undecorated value: 42
 extern_variable_noprefix value: 43
 extern_variable_decorated value: 44
+vectorcall_fn_undecorated(10)
+vectorcall_fn_undecorated2(20)
+vectorcall_fn_noprefix(11)
+vectorcall_fn_decorated(12)