Do not return DefId that doesn't have exported symbol in exported_symbols
This commit is contained in:
parent
d39f0c64b8
commit
99467349f2
5 changed files with 56 additions and 7 deletions
|
|
@ -19,7 +19,7 @@ use log::debug;
|
|||
|
||||
use rustc_driver::Compilation;
|
||||
use rustc_errors::emitter::{ColorConfig, HumanReadableErrorType};
|
||||
use rustc_hir::def_id::LOCAL_CRATE;
|
||||
use rustc_hir::{self as hir, def_id::LOCAL_CRATE, Node};
|
||||
use rustc_interface::interface::Config;
|
||||
use rustc_middle::{
|
||||
middle::exported_symbols::{ExportedSymbol, SymbolExportLevel},
|
||||
|
|
@ -109,12 +109,27 @@ impl rustc_driver::Callbacks for MiriBeRustCompilerCalls {
|
|||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L62-L63
|
||||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L174
|
||||
tcx.reachable_set(()).iter().filter_map(|&local_def_id| {
|
||||
tcx.codegen_fn_attrs(local_def_id)
|
||||
.contains_extern_indicator()
|
||||
.then_some((
|
||||
ExportedSymbol::NonGeneric(local_def_id.to_def_id()),
|
||||
SymbolExportLevel::C,
|
||||
))
|
||||
// Do the same filtering that rustc does:
|
||||
// https://github.com/rust-lang/rust/blob/2962e7c0089d5c136f4e9600b7abccfbbde4973d/compiler/rustc_codegen_ssa/src/back/symbol_export.rs#L84-L102
|
||||
// Otherwise it may cause unexpected behaviours and ICEs
|
||||
// (https://github.com/rust-lang/rust/issues/86261).
|
||||
let is_reachable_non_generic = matches!(
|
||||
tcx.hir().get(tcx.hir().local_def_id_to_hir_id(local_def_id)),
|
||||
Node::Item(&hir::Item {
|
||||
kind: hir::ItemKind::Static(..) | hir::ItemKind::Fn(..),
|
||||
..
|
||||
}) | Node::ImplItem(&hir::ImplItem {
|
||||
kind: hir::ImplItemKind::Fn(..),
|
||||
..
|
||||
})
|
||||
if !tcx.generics_of(local_def_id).requires_monomorphization(tcx)
|
||||
);
|
||||
(is_reachable_non_generic
|
||||
&& tcx.codegen_fn_attrs(local_def_id).contains_extern_indicator())
|
||||
.then_some((
|
||||
ExportedSymbol::NonGeneric(local_def_id.to_def_id()),
|
||||
SymbolExportLevel::C,
|
||||
))
|
||||
}),
|
||||
)
|
||||
}
|
||||
|
|
|
|||
5
test-cargo-miri/Cargo.lock
generated
5
test-cargo-miri/Cargo.lock
generated
|
|
@ -21,6 +21,7 @@ dependencies = [
|
|||
"issue_1691",
|
||||
"issue_1705",
|
||||
"issue_1760",
|
||||
"issue_rust_86261",
|
||||
"rand",
|
||||
"serde_derive",
|
||||
]
|
||||
|
|
@ -102,6 +103,10 @@ dependencies = [
|
|||
name = "issue_1760"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "issue_rust_86261"
|
||||
version = "0.1.0"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.92"
|
||||
|
|
|
|||
|
|
@ -15,6 +15,7 @@ issue_1567 = { path = "issue-1567" }
|
|||
issue_1691 = { path = "issue-1691" }
|
||||
issue_1705 = { path = "issue-1705" }
|
||||
issue_1760 = { path = "issue-1760" }
|
||||
issue_rust_86261 = { path = "issue-rust-86261" }
|
||||
|
||||
[dev-dependencies]
|
||||
rand = { version = "0.8", features = ["small_rng"] }
|
||||
|
|
|
|||
5
test-cargo-miri/issue-rust-86261/Cargo.toml
Normal file
5
test-cargo-miri/issue-rust-86261/Cargo.toml
Normal file
|
|
@ -0,0 +1,5 @@
|
|||
[package]
|
||||
name = "issue_rust_86261"
|
||||
version = "0.1.0"
|
||||
authors = ["Miri Team"]
|
||||
edition = "2018"
|
||||
23
test-cargo-miri/issue-rust-86261/src/lib.rs
Normal file
23
test-cargo-miri/issue-rust-86261/src/lib.rs
Normal file
|
|
@ -0,0 +1,23 @@
|
|||
#![allow(unused_imports, unused_attributes, no_mangle_generic_items)]
|
||||
|
||||
// Regression test for https://github.com/rust-lang/rust/issues/86261:
|
||||
// `#[no_mangle]` on a `use` item.
|
||||
#[no_mangle]
|
||||
use std::{thread,panic, io, boxed, any, string};
|
||||
|
||||
// `#[no_mangle]` on a struct has a similar problem.
|
||||
#[no_mangle]
|
||||
pub struct NoMangleStruct;
|
||||
|
||||
// If `#[no_mangle]` has effect on the `struct` above, calling `NoMangleStruct` will fail with
|
||||
// "multiple definitions of symbol `NoMangleStruct`" error.
|
||||
#[export_name = "NoMangleStruct"]
|
||||
fn no_mangle_struct() {}
|
||||
|
||||
// `#[no_mangle]` on a generic function can also cause ICEs.
|
||||
#[no_mangle]
|
||||
fn no_mangle_generic<T>() {}
|
||||
|
||||
// Same as `no_mangle_struct()` but for the `no_mangle_generic()` generic function.
|
||||
#[export_name = "no_mangle_generic"]
|
||||
fn no_mangle_generic2() {}
|
||||
Loading…
Add table
Add a link
Reference in a new issue