about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_passes/src/reachable.rs12
-rw-r--r--src/tools/miri/tests/pass/tls/win_tls_callback.rs16
-rw-r--r--src/tools/miri/tests/pass/tls/win_tls_callback.stderr1
-rw-r--r--tests/ui/linkage-attr/unreferenced-used-static-issue-127052.rs9
4 files changed, 19 insertions, 19 deletions
diff --git a/compiler/rustc_passes/src/reachable.rs b/compiler/rustc_passes/src/reachable.rs
index da4435ebebe..6dd8eaf7e67 100644
--- a/compiler/rustc_passes/src/reachable.rs
+++ b/compiler/rustc_passes/src/reachable.rs
@@ -30,7 +30,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
 use rustc_hir::intravisit::{self, Visitor};
 use rustc_hir::Node;
 use rustc_middle::bug;
-use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
+use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
 use rustc_middle::middle::privacy::{self, Level};
 use rustc_middle::mir::interpret::{ConstAllocation, ErrorHandled, GlobalAlloc};
 use rustc_middle::query::Providers;
@@ -178,7 +178,15 @@ impl<'tcx> ReachableContext<'tcx> {
         if !self.any_library {
             // If we are building an executable, only explicitly extern
             // types need to be exported.
-            if has_custom_linkage(self.tcx, search_item) {
+            let codegen_attrs = if self.tcx.def_kind(search_item).has_codegen_attrs() {
+                self.tcx.codegen_fn_attrs(search_item)
+            } else {
+                CodegenFnAttrs::EMPTY
+            };
+            let is_extern = codegen_attrs.contains_extern_indicator();
+            let std_internal =
+                codegen_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL);
+            if is_extern || std_internal {
                 self.reachable_symbols.insert(search_item);
             }
         } else {
diff --git a/src/tools/miri/tests/pass/tls/win_tls_callback.rs b/src/tools/miri/tests/pass/tls/win_tls_callback.rs
deleted file mode 100644
index 99a8de29e91..00000000000
--- a/src/tools/miri/tests/pass/tls/win_tls_callback.rs
+++ /dev/null
@@ -1,16 +0,0 @@
-//! Ensure that we call Windows TLS callbacks in the local crate.
-//@only-target-windows
-// Calling eprintln in the callback seems to (re-)initialize some thread-local storage
-// and then leak the memory allocated for that. Let's just ignore these leaks,
-// that's not what this test is about.
-//@compile-flags: -Zmiri-ignore-leaks
-
-#[link_section = ".CRT$XLB"]
-#[used] // Miri only considers explicitly `#[used]` statics for `lookup_link_section`
-pub static CALLBACK: unsafe extern "system" fn(*const (), u32, *const ()) = tls_callback;
-
-unsafe extern "system" fn tls_callback(_h: *const (), _dw_reason: u32, _pv: *const ()) {
-    eprintln!("in tls_callback");
-}
-
-fn main() {}
diff --git a/src/tools/miri/tests/pass/tls/win_tls_callback.stderr b/src/tools/miri/tests/pass/tls/win_tls_callback.stderr
deleted file mode 100644
index 84795589544..00000000000
--- a/src/tools/miri/tests/pass/tls/win_tls_callback.stderr
+++ /dev/null
@@ -1 +0,0 @@
-in tls_callback
diff --git a/tests/ui/linkage-attr/unreferenced-used-static-issue-127052.rs b/tests/ui/linkage-attr/unreferenced-used-static-issue-127052.rs
new file mode 100644
index 00000000000..aa8236b7431
--- /dev/null
+++ b/tests/ui/linkage-attr/unreferenced-used-static-issue-127052.rs
@@ -0,0 +1,9 @@
+// This is a non-regression test for issue #127052 where unreferenced `#[used]` statics couldn't be
+// removed by the MSVC linker, causing linking errors.
+
+//@ build-pass: needs linking
+//@ only-msvc
+
+#[used]
+static FOO: u32 = 0;
+fn main() {}