Auto merge of #86105 - bjorn3:link_info_refactor, r=petrochenkov
Refactor the generation of the metadata for linking
This commit is contained in:
commit
d2b04f075c
2 changed files with 18 additions and 29 deletions
|
@ -19,7 +19,7 @@ use rustc_hir::def_id::{DefId, LOCAL_CRATE};
|
||||||
use rustc_hir::lang_items::LangItem;
|
use rustc_hir::lang_items::LangItem;
|
||||||
use rustc_index::vec::Idx;
|
use rustc_index::vec::Idx;
|
||||||
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
|
use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrs;
|
||||||
use rustc_middle::middle::cstore::{self, EncodedMetadata};
|
use rustc_middle::middle::cstore::EncodedMetadata;
|
||||||
use rustc_middle::middle::lang_items;
|
use rustc_middle::middle::lang_items;
|
||||||
use rustc_middle::mir::mono::{CodegenUnit, CodegenUnitNameBuilder, MonoItem};
|
use rustc_middle::mir::mono::{CodegenUnit, CodegenUnitNameBuilder, MonoItem};
|
||||||
use rustc_middle::ty::layout::{HasTyCtxt, TyAndLayout};
|
use rustc_middle::ty::layout::{HasTyCtxt, TyAndLayout};
|
||||||
|
@ -775,6 +775,22 @@ impl CrateInfo {
|
||||||
subsystem.to_string()
|
subsystem.to_string()
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// This list is used when generating the command line to pass through to
|
||||||
|
// system linker. The linker expects undefined symbols on the left of the
|
||||||
|
// command line to be defined in libraries on the right, not the other way
|
||||||
|
// around. For more info, see some comments in the add_used_library function
|
||||||
|
// below.
|
||||||
|
//
|
||||||
|
// In order to get this left-to-right dependency ordering, we use the reverse
|
||||||
|
// postorder of all crates putting the leaves at the right-most positions.
|
||||||
|
let used_crates = tcx
|
||||||
|
.postorder_cnums(())
|
||||||
|
.iter()
|
||||||
|
.rev()
|
||||||
|
.copied()
|
||||||
|
.filter(|&cnum| !tcx.dep_kind(cnum).macros_only())
|
||||||
|
.collect();
|
||||||
|
|
||||||
let mut info = CrateInfo {
|
let mut info = CrateInfo {
|
||||||
target_cpu,
|
target_cpu,
|
||||||
exported_symbols,
|
exported_symbols,
|
||||||
|
@ -785,7 +801,7 @@ impl CrateInfo {
|
||||||
native_libraries: Default::default(),
|
native_libraries: Default::default(),
|
||||||
used_libraries: tcx.native_libraries(LOCAL_CRATE).iter().map(Into::into).collect(),
|
used_libraries: tcx.native_libraries(LOCAL_CRATE).iter().map(Into::into).collect(),
|
||||||
crate_name: Default::default(),
|
crate_name: Default::default(),
|
||||||
used_crates: cstore::used_crates(tcx),
|
used_crates,
|
||||||
used_crate_source: Default::default(),
|
used_crate_source: Default::default(),
|
||||||
lang_item_to_crate: Default::default(),
|
lang_item_to_crate: Default::default(),
|
||||||
missing_lang_items: Default::default(),
|
missing_lang_items: Default::default(),
|
||||||
|
|
|
@ -197,30 +197,3 @@ pub trait CrateStore {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub type CrateStoreDyn = dyn CrateStore + sync::Sync;
|
pub type CrateStoreDyn = dyn CrateStore + sync::Sync;
|
||||||
|
|
||||||
// This method is used when generating the command line to pass through to
|
|
||||||
// system linker. The linker expects undefined symbols on the left of the
|
|
||||||
// command line to be defined in libraries on the right, not the other way
|
|
||||||
// around. For more info, see some comments in the add_used_library function
|
|
||||||
// below.
|
|
||||||
//
|
|
||||||
// In order to get this left-to-right dependency ordering, we perform a
|
|
||||||
// topological sort of all crates putting the leaves at the right-most
|
|
||||||
// positions.
|
|
||||||
pub fn used_crates(tcx: TyCtxt<'_>) -> Vec<CrateNum> {
|
|
||||||
let mut libs = tcx
|
|
||||||
.crates(())
|
|
||||||
.iter()
|
|
||||||
.cloned()
|
|
||||||
.filter_map(|cnum| {
|
|
||||||
if tcx.dep_kind(cnum).macros_only() {
|
|
||||||
return None;
|
|
||||||
}
|
|
||||||
Some(cnum)
|
|
||||||
})
|
|
||||||
.collect::<Vec<_>>();
|
|
||||||
let mut ordering = tcx.postorder_cnums(()).to_owned();
|
|
||||||
ordering.reverse();
|
|
||||||
libs.sort_by_cached_key(|&a| ordering.iter().position(|x| *x == a));
|
|
||||||
libs
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue