about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2024-06-28 23:43:57 +0000
committerbors <bors@rust-lang.org>2024-06-28 23:43:57 +0000
commit9ed2ab3790ff41bf741dd690befd6a1c1e2b23ca (patch)
treeba166ee8844fe984d39dbd1ba918aad35a6a7ec0
parente9e6e2e444c30c23a9c878a88fbc3978c2acad95 (diff)
parent57931e50409f9365791f7923a68f9ae1ec301c4c (diff)
downloadrust-9ed2ab3790ff41bf741dd690befd6a1c1e2b23ca.tar.gz
rust-9ed2ab3790ff41bf741dd690befd6a1c1e2b23ca.zip
Auto merge of #127099 - lqd:revert-126938, r=compiler-errors
Revert "miri: make sure we can find link_section statics even for the local crate"

This PR reverts #126938 as [requested by its author](https://github.com/rust-lang/rust/issues/127052#issuecomment-2196793473), to fix the #127052 regression.

Fixes #127052

We should probably improve the [`used` rmake test(s)](https://github.com/rust-lang/rust/blob/57931e50409f9365791f7923a68f9ae1ec301c4c/tests/run-make/used/rmake.rs#L7) in the future, but this should do for now.
-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() {}