mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-22 06:44:35 +00:00
miri: make sure we can find link_section statics even for the local crate
This commit is contained in:
parent
fc555cd832
commit
d9a3423288
@ -30,7 +30,7 @@ use rustc_hir::def_id::{DefId, LocalDefId};
|
|||||||
use rustc_hir::intravisit::{self, Visitor};
|
use rustc_hir::intravisit::{self, Visitor};
|
||||||
use rustc_hir::Node;
|
use rustc_hir::Node;
|
||||||
use rustc_middle::bug;
|
use rustc_middle::bug;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs};
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||||
use rustc_middle::middle::privacy::{self, Level};
|
use rustc_middle::middle::privacy::{self, Level};
|
||||||
use rustc_middle::mir::interpret::{ConstAllocation, ErrorHandled, GlobalAlloc};
|
use rustc_middle::mir::interpret::{ConstAllocation, ErrorHandled, GlobalAlloc};
|
||||||
use rustc_middle::query::Providers;
|
use rustc_middle::query::Providers;
|
||||||
@ -178,15 +178,7 @@ impl<'tcx> ReachableContext<'tcx> {
|
|||||||
if !self.any_library {
|
if !self.any_library {
|
||||||
// If we are building an executable, only explicitly extern
|
// If we are building an executable, only explicitly extern
|
||||||
// types need to be exported.
|
// types need to be exported.
|
||||||
let codegen_attrs = if self.tcx.def_kind(search_item).has_codegen_attrs() {
|
if has_custom_linkage(self.tcx, search_item) {
|
||||||
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);
|
self.reachable_symbols.insert(search_item);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
16
src/tools/miri/tests/pass/tls/win_tls_callback.rs
Normal file
16
src/tools/miri/tests/pass/tls/win_tls_callback.rs
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
//! 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() {}
|
1
src/tools/miri/tests/pass/tls/win_tls_callback.stderr
Normal file
1
src/tools/miri/tests/pass/tls/win_tls_callback.stderr
Normal file
@ -0,0 +1 @@
|
|||||||
|
in tls_callback
|
Loading…
Reference in New Issue
Block a user