Auto merge of #103092 - petrochenkov:weaklto, r=wesleywiser
linker: Fix weak lang item linking with combination windows-gnu + LLD + LTO In https://github.com/rust-lang/rust/pull/100404 this logic was originally disabled for MSVC due to issues with LTO, but the same issues appear on windows-gnu with LLD because that LLD uses the same underlying logic as MSVC LLD, just with re-syntaxed command line options. So this PR just disables it for LTO builds in general.
This commit is contained in:
commit
5ffa67d730
@ -2715,7 +2715,7 @@ fn relevant_lib(sess: &Session, lib: &NativeLib) -> bool {
|
||||
}
|
||||
}
|
||||
|
||||
fn are_upstream_rust_objects_already_included(sess: &Session) -> bool {
|
||||
pub(crate) fn are_upstream_rust_objects_already_included(sess: &Session) -> bool {
|
||||
match sess.lto() {
|
||||
config::Lto::Fat => true,
|
||||
config::Lto::Thin => {
|
||||
|
@ -1,3 +1,4 @@
|
||||
use crate::back::link::are_upstream_rust_objects_already_included;
|
||||
use crate::back::metadata::create_compressed_metadata_file;
|
||||
use crate::back::write::{
|
||||
compute_per_cgu_lto_type, start_async_codegen, submit_codegened_module_to_llvm,
|
||||
@ -892,10 +893,14 @@ impl CrateInfo {
|
||||
|
||||
// Handle circular dependencies in the standard library.
|
||||
// See comment before `add_linked_symbol_object` function for the details.
|
||||
// With msvc-like linkers it's both unnecessary (they support circular dependencies),
|
||||
// and causes linking issues (when weak lang item symbols are "privatized" by LTO).
|
||||
// If global LTO is enabled then almost everything (*) is glued into a single object file,
|
||||
// so this logic is not necessary and can cause issues on some targets (due to weak lang
|
||||
// item symbols being "privatized" to that object file), so we disable it.
|
||||
// (*) Native libs, and `#[compiler_builtins]` and `#[no_builtins]` crates are not glued,
|
||||
// and we assume that they cannot define weak lang items. This is not currently enforced
|
||||
// by the compiler, but that's ok because all this stuff is unstable anyway.
|
||||
let target = &tcx.sess.target;
|
||||
if !target.is_like_msvc {
|
||||
if !are_upstream_rust_objects_already_included(tcx.sess) {
|
||||
let missing_weak_lang_items: FxHashSet<&Symbol> = info
|
||||
.used_crates
|
||||
.iter()
|
||||
|
Loading…
x
Reference in New Issue
Block a user