diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2017-08-28 15:55:32 -0700 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2017-09-05 07:37:11 -0700 |
| commit | dff0c074e467a1fbbeab44ffbd8da4882683b694 (patch) | |
| tree | 08c1104e31ab1dde70b97eb6eaedd7f97dc3bfa1 /src/librustc_trans | |
| parent | 2f1ef9ef1181298d46e79d5dde6bafeb6483926f (diff) | |
| download | rust-dff0c074e467a1fbbeab44ffbd8da4882683b694.tar.gz rust-dff0c074e467a1fbbeab44ffbd8da4882683b694.zip | |
rustc: Move a few more cstore methods to queries
This comit applies the following changes: * Deletes the `is_allocator` query as it's no longer used * Moves the `is_sanitizer_runtime` method to a query * Moves the `is_profiler_runtime` method to a query * Moves the `panic_strategy` method to a query * Moves the `is_no_builtins` method to a query * Deletes the cstore method of `is_compiler_builtins`. The query was added in #42588 but the `CrateStore` method was not deleted A good bit of these methods were used late in linking during trans so a new dedicated structure was created to ship a calculated form of this information over to the linker rather than having to ship the whole of `TyCtxt` over to linking.
Diffstat (limited to 'src/librustc_trans')
| -rw-r--r-- | src/librustc_trans/back/link.rs | 30 | ||||
| -rw-r--r-- | src/librustc_trans/back/symbol_export.rs | 3 | ||||
| -rw-r--r-- | src/librustc_trans/back/write.rs | 9 | ||||
| -rw-r--r-- | src/librustc_trans/base.rs | 36 | ||||
| -rw-r--r-- | src/librustc_trans/lib.rs | 14 |
5 files changed, 74 insertions, 18 deletions
diff --git a/src/librustc_trans/back/link.rs b/src/librustc_trans/back/link.rs index 4b56376ad9b..e69a2322aaa 100644 --- a/src/librustc_trans/back/link.rs +++ b/src/librustc_trans/back/link.rs @@ -22,7 +22,7 @@ use rustc::session::Session; use rustc::middle::cstore::{LinkMeta, NativeLibrary, LibSource, LinkagePreference, NativeLibraryKind}; use rustc::middle::dependency_format::Linkage; -use CrateTranslation; +use {CrateTranslation, CrateInfo}; use rustc::util::common::time; use rustc::util::fs::fix_windows_verbatim_for_gcc; use rustc::dep_graph::{DepKind, DepNode}; @@ -260,12 +260,12 @@ pub fn each_linked_rlib(sess: &Session, /// It's unusual for a crate to not participate in LTO. Typically only /// compiler-specific and unstable crates have a reason to not participate in /// LTO. -pub fn ignored_for_lto(sess: &Session, cnum: CrateNum) -> bool { +pub fn ignored_for_lto(info: &CrateInfo, cnum: CrateNum) -> bool { // `#![no_builtins]` crates don't participate in LTO because the state // of builtins gets messed up (our crate isn't tagged with no builtins). // Similarly `#![compiler_builtins]` doesn't participate because we want // those builtins! - sess.cstore.is_no_builtins(cnum) || sess.cstore.is_compiler_builtins(cnum) + info.is_no_builtins.contains(&cnum) || info.compiler_builtins == Some(cnum) } fn out_filename(sess: &Session, @@ -634,7 +634,7 @@ fn link_staticlib(sess: &Session, }); ab.add_rlib(path, &name.as_str(), - sess.lto() && !ignored_for_lto(sess, cnum), + sess.lto() && !ignored_for_lto(&trans.crate_info, cnum), skip_object_files).unwrap(); all_native_libs.extend(sess.cstore.native_libraries(cnum)); @@ -1001,7 +1001,7 @@ fn link_args(cmd: &mut Linker, // in this DAG so far because they're only dylibs and dylibs can only depend // on other dylibs (e.g. other native deps). add_local_native_libraries(cmd, sess); - add_upstream_rust_crates(cmd, sess, crate_type, tmpdir); + add_upstream_rust_crates(cmd, sess, trans, crate_type, tmpdir); add_upstream_native_libraries(cmd, sess, crate_type); // Tell the linker what we're doing. @@ -1088,6 +1088,7 @@ fn add_local_native_libraries(cmd: &mut Linker, sess: &Session) { // the intermediate rlib version) fn add_upstream_rust_crates(cmd: &mut Linker, sess: &Session, + trans: &CrateTranslation, crate_type: config::CrateType, tmpdir: &Path) { // All of the heavy lifting has previously been accomplished by the @@ -1113,22 +1114,22 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // symbols from the dylib. let src = sess.cstore.used_crate_source(cnum); match data[cnum.as_usize() - 1] { - _ if sess.cstore.is_profiler_runtime(cnum) => { - add_static_crate(cmd, sess, tmpdir, crate_type, cnum); + _ if trans.crate_info.profiler_runtime == Some(cnum) => { + add_static_crate(cmd, sess, trans, tmpdir, crate_type, cnum); } - _ if sess.cstore.is_sanitizer_runtime(cnum) => { + _ if trans.crate_info.sanitizer_runtime == Some(cnum) => { link_sanitizer_runtime(cmd, sess, tmpdir, cnum); } // compiler-builtins are always placed last to ensure that they're // linked correctly. - _ if sess.cstore.is_compiler_builtins(cnum) => { + _ if trans.crate_info.compiler_builtins == Some(cnum) => { assert!(compiler_builtins.is_none()); compiler_builtins = Some(cnum); } Linkage::NotLinked | Linkage::IncludedFromDylib => {} Linkage::Static => { - add_static_crate(cmd, sess, tmpdir, crate_type, cnum); + add_static_crate(cmd, sess, trans, tmpdir, crate_type, cnum); } Linkage::Dynamic => { add_dynamic_crate(cmd, sess, &src.dylib.unwrap().0) @@ -1142,7 +1143,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // was already "included" in a dylib (e.g. `libstd` when `-C prefer-dynamic` // is used) if let Some(cnum) = compiler_builtins { - add_static_crate(cmd, sess, tmpdir, crate_type, cnum); + add_static_crate(cmd, sess, trans, tmpdir, crate_type, cnum); } // Converts a library file-stem into a cc -l argument @@ -1228,6 +1229,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // we're at the end of the dependency chain. fn add_static_crate(cmd: &mut Linker, sess: &Session, + trans: &CrateTranslation, tmpdir: &Path, crate_type: config::CrateType, cnum: CrateNum) { @@ -1242,7 +1244,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, lib.kind == NativeLibraryKind::NativeStatic && !relevant_lib(sess, lib) }); - if (!sess.lto() || ignored_for_lto(sess, cnum)) && + if (!sess.lto() || ignored_for_lto(&trans.crate_info, cnum)) && crate_type != config::CrateTypeDylib && !skip_native { cmd.link_rlib(&fix_windows_verbatim_for_gcc(cratepath)); @@ -1284,7 +1286,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // LTO module. Note that `#![no_builtins]` is excluded from LTO, // though, so we let that object file slide. let skip_because_lto = sess.lto() && is_rust_object && - !sess.cstore.is_no_builtins(cnum); + !trans.crate_info.is_no_builtins.contains(&cnum); if skip_because_cfg_say_so || skip_because_lto { archive.remove_file(&f); @@ -1306,7 +1308,7 @@ fn add_upstream_rust_crates(cmd: &mut Linker, // compiler-builtins crate (e.g. compiler-rt) because it'll get // repeatedly linked anyway. if crate_type == config::CrateTypeDylib && - !sess.cstore.is_compiler_builtins(cnum) { + trans.crate_info.compiler_builtins != Some(cnum) { cmd.link_whole_rlib(&fix_windows_verbatim_for_gcc(&dst)); } else { cmd.link_rlib(&fix_windows_verbatim_for_gcc(&dst)); diff --git a/src/librustc_trans/back/symbol_export.rs b/src/librustc_trans/back/symbol_export.rs index 971483e91b6..729573a0f3a 100644 --- a/src/librustc_trans/back/symbol_export.rs +++ b/src/librustc_trans/back/symbol_export.rs @@ -128,8 +128,7 @@ impl ExportedSymbols { // Down below we'll hardwire all of the symbols to the `Rust` export // level instead. let special_runtime_crate = - tcx.is_panic_runtime(cnum.as_def_id()) || - tcx.sess.cstore.is_compiler_builtins(cnum); + tcx.is_panic_runtime(cnum) || tcx.is_compiler_builtins(cnum); let crate_exports = tcx .sess diff --git a/src/librustc_trans/back/write.rs b/src/librustc_trans/back/write.rs index 3f9b28d3d61..ed7a745e440 100644 --- a/src/librustc_trans/back/write.rs +++ b/src/librustc_trans/back/write.rs @@ -22,6 +22,7 @@ use llvm; use llvm::{ModuleRef, TargetMachineRef, PassManagerRef, DiagnosticInfoRef}; use llvm::SMDiagnosticRef; use {CrateTranslation, ModuleSource, ModuleTranslation, CompiledModule, ModuleKind}; +use CrateInfo; use rustc::hir::def_id::CrateNum; use rustc::util::common::{time, time_depth, set_time_depth, path2cstr, print_time_passes_entry}; use rustc::util::fs::{link_or_copy, rename_or_copy_remove}; @@ -675,6 +676,7 @@ pub fn start_async_translation(sess: &Session, no_builtins: bool, windows_subsystem: Option<String>, linker_info: LinkerInfo, + crate_info: CrateInfo, no_integrated_as: bool) -> OngoingCrateTranslation { let output_types_override = if no_integrated_as { @@ -774,6 +776,7 @@ pub fn start_async_translation(sess: &Session, let (coordinator_send, coordinator_receive) = channel(); let coordinator_thread = start_executing_work(sess, + &crate_info, shared_emitter, trans_worker_send, coordinator_send.clone(), @@ -788,6 +791,7 @@ pub fn start_async_translation(sess: &Session, windows_subsystem, linker_info, no_integrated_as, + crate_info, regular_module_config: modules_config, metadata_module_config: metadata_config, @@ -1101,6 +1105,7 @@ enum MainThreadWorkerState { } fn start_executing_work(sess: &Session, + crate_info: &CrateInfo, shared_emitter: SharedEmitter, trans_worker_send: Sender<Message>, coordinator_send: Sender<Message>, @@ -1126,7 +1131,7 @@ fn start_executing_work(sess: &Session, let mut each_linked_rlib_for_lto = Vec::new(); drop(link::each_linked_rlib(sess, &mut |cnum, path| { - if link::ignored_for_lto(sess, cnum) { + if link::ignored_for_lto(crate_info, cnum) { return } each_linked_rlib_for_lto.push((cnum, path.to_path_buf())); @@ -1802,6 +1807,7 @@ pub struct OngoingCrateTranslation { windows_subsystem: Option<String>, linker_info: LinkerInfo, no_integrated_as: bool, + crate_info: CrateInfo, output_filenames: OutputFilenames, regular_module_config: ModuleConfig, @@ -1850,6 +1856,7 @@ impl OngoingCrateTranslation { metadata: self.metadata, windows_subsystem: self.windows_subsystem, linker_info: self.linker_info, + crate_info: self.crate_info, modules: compiled_modules.modules, allocator_module: compiled_modules.allocator_module, diff --git a/src/librustc_trans/base.rs b/src/librustc_trans/base.rs index a6c6b0efcfa..3da8d07f9d7 100644 --- a/src/librustc_trans/base.rs +++ b/src/librustc_trans/base.rs @@ -75,6 +75,7 @@ use type_::Type; use type_of; use value::Value; use rustc::util::nodemap::{NodeSet, FxHashMap, FxHashSet}; +use CrateInfo; use libc::c_uint; use std::ffi::{CStr, CString}; @@ -970,6 +971,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, } else { None }; + let crate_info = CrateInfo::new(tcx); // Skip crate items and just output metadata in -Z no-trans mode. if tcx.sess.opts.debugging_opts.no_trans || @@ -987,6 +989,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, no_builtins, None, linker_info, + crate_info, false); ongoing_translation.submit_pre_translated_module_to_llvm(tcx.sess, metadata_module, true); @@ -1039,6 +1042,7 @@ pub fn trans_crate<'a, 'tcx>(tcx: TyCtxt<'a, 'tcx, 'tcx>, no_builtins, windows_subsystem, linker_info, + crate_info, no_integrated_as); // Translate an allocator shim, if any @@ -1502,3 +1506,35 @@ fn collect_and_partition_translation_items<'a, 'tcx>(scx: &SharedCrateContext<'a (translation_items, codegen_units) } + +impl CrateInfo { + pub fn new(tcx: TyCtxt) -> CrateInfo { + let mut info = CrateInfo { + panic_runtime: None, + compiler_builtins: None, + profiler_runtime: None, + sanitizer_runtime: None, + is_no_builtins: FxHashSet(), + }; + + for cnum in tcx.sess.cstore.crates() { + if tcx.is_panic_runtime(cnum) { + info.panic_runtime = Some(cnum); + } + if tcx.is_compiler_builtins(cnum) { + info.compiler_builtins = Some(cnum); + } + if tcx.is_profiler_runtime(cnum) { + info.profiler_runtime = Some(cnum); + } + if tcx.is_sanitizer_runtime(cnum) { + info.sanitizer_runtime = Some(cnum); + } + if tcx.is_no_builtins(cnum) { + info.is_no_builtins.insert(cnum); + } + } + + return info + } +} diff --git a/src/librustc_trans/lib.rs b/src/librustc_trans/lib.rs index 1758e331129..42aa47436c8 100644 --- a/src/librustc_trans/lib.rs +++ b/src/librustc_trans/lib.rs @@ -65,6 +65,8 @@ pub use back::symbol_names::provide; pub use metadata::LlvmMetadataLoader; pub use llvm_util::{init, target_features, print_version, print_passes, print, enable_llvm_debug}; +use rustc::hir::def_id::CrateNum; +use rustc::util::nodemap::FxHashSet; pub mod back { mod archive; @@ -216,7 +218,17 @@ pub struct CrateTranslation { pub link: rustc::middle::cstore::LinkMeta, pub metadata: rustc::middle::cstore::EncodedMetadata, windows_subsystem: Option<String>, - linker_info: back::linker::LinkerInfo + linker_info: back::linker::LinkerInfo, + crate_info: CrateInfo, +} + +// Misc info we load from metadata to persist beyond the tcx +pub struct CrateInfo { + panic_runtime: Option<CrateNum>, + compiler_builtins: Option<CrateNum>, + profiler_runtime: Option<CrateNum>, + sanitizer_runtime: Option<CrateNum>, + is_no_builtins: FxHashSet<CrateNum>, } __build_diagnostic_array! { librustc_trans, DIAGNOSTICS } |
