diff options
| author | Daniel Paoliello <danpao@microsoft.com> | 2022-11-16 15:34:12 -0800 |
|---|---|---|
| committer | Daniel Paoliello <danpao@microsoft.com> | 2022-11-18 11:38:31 -0800 |
| commit | 67e746cc688ec6f02a446c6e17d269ce81c1737b (patch) | |
| tree | c436aa87c223c12ff2ae1441a3614961de3b33c4 /compiler/rustc_codegen_llvm/src/callee.rs | |
| parent | e69336efe035c274f2ee66922cd9cac6015956ea (diff) | |
| download | rust-67e746cc688ec6f02a446c6e17d269ce81c1737b.tar.gz rust-67e746cc688ec6f02a446c6e17d269ce81c1737b.zip | |
Workaround for private global symbol issue
Diffstat (limited to 'compiler/rustc_codegen_llvm/src/callee.rs')
| -rw-r--r-- | compiler/rustc_codegen_llvm/src/callee.rs | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/compiler/rustc_codegen_llvm/src/callee.rs b/compiler/rustc_codegen_llvm/src/callee.rs index 6f0d1b7ce84..70ff5c9617b 100644 --- a/compiler/rustc_codegen_llvm/src/callee.rs +++ b/compiler/rustc_codegen_llvm/src/callee.rs @@ -83,7 +83,20 @@ pub fn get_fn<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>, instance: Instance<'tcx>) -> let llfn = if tcx.sess.target.arch == "x86" && let Some(dllimport) = common::get_dllimport(tcx, instance_def_id, sym) { - cx.declare_fn(&common::i686_decorated_name(&dllimport, common::is_mingw_gnu_toolchain(&tcx.sess.target), true), fn_abi) + // Fix for https://github.com/rust-lang/rust/issues/104453 + // On x86 Windows, LLVM uses 'L' as the prefix for any private + // global symbols, so when we create an undecorated function symbol + // that begins with an 'L' LLVM misinterprets that as a private + // global symbol that it created and so fails the compilation at a + // later stage since such a symbol must have a definition. + // + // To avoid this, we set the Storage Class to "DllImport" so that + // LLVM will prefix the name with `__imp_`. Ideally, we'd like the + // existing logic below to set the Storage Class, but it has an + // exemption for MinGW for backwards compatability. + let llfn = cx.declare_fn(&common::i686_decorated_name(&dllimport, common::is_mingw_gnu_toolchain(&tcx.sess.target), true), fn_abi); + unsafe { llvm::LLVMSetDLLStorageClass(llfn, llvm::DLLStorageClass::DllImport); } + llfn } else { cx.declare_fn(sym, fn_abi) }; |
