Rollup merge of #112794 - bjorn3:fix_lib_global_alloc, r=oli-obk
Fix linker failures when #[global_allocator] is used in a dependency Fixes https://github.com/rust-lang/rust/issues/112715
This commit is contained in:
commit
0688182f9b
@ -13,7 +13,7 @@ use crate::mir::place::PlaceRef;
|
|||||||
use crate::traits::*;
|
use crate::traits::*;
|
||||||
use crate::{CachedModuleCodegen, CompiledModule, CrateInfo, MemFlags, ModuleCodegen, ModuleKind};
|
use crate::{CachedModuleCodegen, CompiledModule, CrateInfo, MemFlags, ModuleCodegen, ModuleKind};
|
||||||
|
|
||||||
use rustc_ast::expand::allocator::AllocatorKind;
|
use rustc_ast::expand::allocator::{global_fn_name, AllocatorKind, ALLOCATOR_METHODS};
|
||||||
use rustc_attr as attr;
|
use rustc_attr as attr;
|
||||||
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
use rustc_data_structures::fx::{FxHashMap, FxHashSet};
|
||||||
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
|
use rustc_data_structures::profiling::{get_resident_set_size, print_time_passes_entry};
|
||||||
@ -921,7 +921,21 @@ impl CrateInfo {
|
|||||||
missing_weak_lang_items
|
missing_weak_lang_items
|
||||||
.iter()
|
.iter()
|
||||||
.map(|item| (format!("{prefix}{item}"), SymbolExportKind::Text)),
|
.map(|item| (format!("{prefix}{item}"), SymbolExportKind::Text)),
|
||||||
)
|
);
|
||||||
|
if tcx.allocator_kind(()).is_some() {
|
||||||
|
// At least one crate needs a global allocator. This crate may be placed
|
||||||
|
// after the crate that defines it in the linker order, in which case some
|
||||||
|
// linkers return an error. By adding the global allocator shim methods to
|
||||||
|
// the linked_symbols list, linking the generated symbols.o will ensure that
|
||||||
|
// circular dependencies involving the global allocator don't lead to linker
|
||||||
|
// errors.
|
||||||
|
linked_symbols.extend(ALLOCATOR_METHODS.iter().map(|method| {
|
||||||
|
(
|
||||||
|
format!("{prefix}{}", global_fn_name(method.name).as_str()),
|
||||||
|
SymbolExportKind::Text,
|
||||||
|
)
|
||||||
|
}));
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
7
tests/run-make/allocator-shim-circular-deps/Makefile
Normal file
7
tests/run-make/allocator-shim-circular-deps/Makefile
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# ignore-cross-compile
|
||||||
|
include ../tools.mk
|
||||||
|
|
||||||
|
all:
|
||||||
|
rm -rf $(TMPDIR) && mkdir $(TMPDIR)
|
||||||
|
$(RUSTC) my_lib.rs
|
||||||
|
$(RUSTC) main.rs --test --extern my_lib=$(TMPDIR)/libmy_lib.rlib
|
5
tests/run-make/allocator-shim-circular-deps/main.rs
Normal file
5
tests/run-make/allocator-shim-circular-deps/main.rs
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#![crate_type = "bin"]
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
my_lib::do_something();
|
||||||
|
}
|
10
tests/run-make/allocator-shim-circular-deps/my_lib.rs
Normal file
10
tests/run-make/allocator-shim-circular-deps/my_lib.rs
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
#![crate_type = "lib"]
|
||||||
|
|
||||||
|
use std::alloc::System;
|
||||||
|
|
||||||
|
#[global_allocator]
|
||||||
|
static ALLOCATOR: System = System;
|
||||||
|
|
||||||
|
pub fn do_something() {
|
||||||
|
format!("allocating a string!");
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user