diff options
| author | Michael Woerister <michaelwoerister@posteo.net> | 2017-05-31 14:53:39 +0200 |
|---|---|---|
| committer | Michael Woerister <michaelwoerister@posteo.net> | 2017-05-31 14:53:39 +0200 |
| commit | f854f8b366c8243ef096f1dcc0e7a9a8f9f05992 (patch) | |
| tree | 58c43e66f20a50bbe016b1689b40caa8227df41b | |
| parent | 59ebe8e1155720d56cfde1890fc2f6b9bdb33243 (diff) | |
| download | rust-f854f8b366c8243ef096f1dcc0e7a9a8f9f05992.tar.gz rust-f854f8b366c8243ef096f1dcc0e7a9a8f9f05992.zip | |
Build DefPathHash->DefId table when incr.comp. is enabled
| -rw-r--r-- | src/librustc/hir/map/definitions.rs | 24 | ||||
| -rw-r--r-- | src/librustc/middle/cstore.rs | 7 | ||||
| -rw-r--r-- | src/librustc/ty/context.rs | 41 | ||||
| -rw-r--r-- | src/librustc_metadata/creader.rs | 2 | ||||
| -rw-r--r-- | src/librustc_metadata/cstore.rs | 2 | ||||
| -rw-r--r-- | src/librustc_metadata/cstore_impl.rs | 5 |
6 files changed, 77 insertions, 4 deletions
diff --git a/src/librustc/hir/map/definitions.rs b/src/librustc/hir/map/definitions.rs index 7f91e8e0c30..745af53e7a3 100644 --- a/src/librustc/hir/map/definitions.rs +++ b/src/librustc/hir/map/definitions.rs @@ -126,6 +126,30 @@ impl DefPathTable { Some(index) } + + pub fn add_def_path_hashes_to(&self, + cnum: CrateNum, + out: &mut FxHashMap<DefPathHash, DefId>) { + for address_space in &[DefIndexAddressSpace::Low, DefIndexAddressSpace::High] { + let start_index = address_space.start(); + out.extend( + (&self.def_path_hashes[address_space.index()]) + .iter() + .enumerate() + .map(|(index, &hash)| { + let def_id = DefId { + krate: cnum, + index: DefIndex::new(index + start_index), + }; + (hash, def_id) + }) + ); + } + } + + pub fn size(&self) -> usize { + self.key_to_index.len() + } } diff --git a/src/librustc/middle/cstore.rs b/src/librustc/middle/cstore.rs index 55a6de62732..71b066c6688 100644 --- a/src/librustc/middle/cstore.rs +++ b/src/librustc/middle/cstore.rs @@ -26,7 +26,8 @@ use hir::def; use dep_graph::DepNode; use hir::def_id::{CrateNum, DefId, DefIndex}; use hir::map as hir_map; -use hir::map::definitions::{Definitions, DefKey, DisambiguatedDefPathData}; +use hir::map::definitions::{Definitions, DefKey, DisambiguatedDefPathData, + DefPathTable}; use hir::svh::Svh; use ich; use middle::lang_items; @@ -282,6 +283,7 @@ pub trait CrateStore { fn def_key(&self, def: DefId) -> DefKey; fn def_path(&self, def: DefId) -> hir_map::DefPath; fn def_path_hash(&self, def: DefId) -> hir_map::DefPathHash; + fn def_path_table(&self, cnum: CrateNum) -> Rc<DefPathTable>; fn struct_field_names(&self, def: DefId) -> Vec<ast::Name>; fn item_children(&self, did: DefId) -> Vec<def::Export>; fn load_macro(&self, did: DefId, sess: &Session) -> LoadedMacro; @@ -415,6 +417,9 @@ impl CrateStore for DummyCrateStore { fn def_path_hash(&self, def: DefId) -> hir_map::DefPathHash { bug!("def_path_hash") } + fn def_path_table(&self, cnum: CrateNum) -> Rc<DefPathTable> { + bug!("def_path_table") + } fn struct_field_names(&self, def: DefId) -> Vec<ast::Name> { bug!("struct_field_names") } fn item_children(&self, did: DefId) -> Vec<def::Export> { bug!("item_children") } fn load_macro(&self, did: DefId, sess: &Session) -> LoadedMacro { bug!("load_macro") } diff --git a/src/librustc/ty/context.rs b/src/librustc/ty/context.rs index 7316d45dc21..17e06571394 100644 --- a/src/librustc/ty/context.rs +++ b/src/librustc/ty/context.rs @@ -18,7 +18,7 @@ use hir::TraitMap; use hir::def::{Def, ExportMap}; use hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; use hir::map as hir_map; -use hir::map::DisambiguatedDefPathData; +use hir::map::{DisambiguatedDefPathData, DefPathHash}; use middle::free_region::FreeRegionMap; use middle::lang_items; use middle::resolve_lifetime; @@ -448,6 +448,10 @@ pub struct GlobalCtxt<'tcx> { pub hir: hir_map::Map<'tcx>, + /// A map from DefPathHash -> DefId. Includes DefIds from the local crate + /// as well as all upstream crates. Only populated in incremental mode. + pub def_path_hash_to_def_id: Option<FxHashMap<DefPathHash, DefId>>, + pub maps: maps::Maps<'tcx>, pub mir_passes: Rc<Passes>, @@ -676,6 +680,40 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { let max_cnum = s.cstore.crates().iter().map(|c| c.as_usize()).max().unwrap_or(0); let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1); providers[LOCAL_CRATE] = local_providers; + + let def_path_hash_to_def_id = if s.opts.build_dep_graph() { + let upstream_def_path_tables: Vec<(CrateNum, Rc<_>)> = s + .cstore + .crates() + .iter() + .map(|&cnum| (cnum, s.cstore.def_path_table(cnum))) + .collect(); + + let def_path_tables = || { + upstream_def_path_tables + .iter() + .map(|&(cnum, ref rc)| (cnum, &**rc)) + .chain(iter::once((LOCAL_CRATE, hir.definitions().def_path_table()))) + }; + + // Precompute the capacity of the hashmap so we don't have to + // re-allocate when populating it. + let capacity = def_path_tables().map(|(_, t)| t.size()).sum::<usize>(); + + let mut map: FxHashMap<_, _> = FxHashMap::with_capacity_and_hasher( + capacity, + ::std::default::Default::default() + ); + + for (cnum, def_path_table) in def_path_tables() { + def_path_table.add_def_path_hashes_to(cnum, &mut map); + } + + Some(map) + } else { + None + }; + tls::enter_global(GlobalCtxt { sess: s, trans_trait_caches: traits::trans::TransTraitCaches::new(dep_graph.clone()), @@ -689,6 +727,7 @@ impl<'a, 'gcx, 'tcx> TyCtxt<'a, 'gcx, 'tcx> { export_map: resolutions.export_map, fulfilled_predicates: RefCell::new(fulfilled_predicates), hir: hir, + def_path_hash_to_def_id: def_path_hash_to_def_id, maps: maps::Maps::new(providers), mir_passes, freevars: RefCell::new(resolutions.freevars), diff --git a/src/librustc_metadata/creader.rs b/src/librustc_metadata/creader.rs index ec6947b4a48..51f152991fd 100644 --- a/src/librustc_metadata/creader.rs +++ b/src/librustc_metadata/creader.rs @@ -326,7 +326,7 @@ impl<'a> CrateLoader<'a> { let mut cmeta = cstore::CrateMetadata { name: name, extern_crate: Cell::new(None), - def_path_table: def_path_table, + def_path_table: Rc::new(def_path_table), exported_symbols: exported_symbols, trait_impls: trait_impls, proc_macros: crate_root.macro_derive_registrar.map(|_| { diff --git a/src/librustc_metadata/cstore.rs b/src/librustc_metadata/cstore.rs index 64fccb0314e..5066b927c11 100644 --- a/src/librustc_metadata/cstore.rs +++ b/src/librustc_metadata/cstore.rs @@ -76,7 +76,7 @@ pub struct CrateMetadata { /// hashmap, which gives the reverse mapping. This allows us to /// quickly retrace a `DefPath`, which is needed for incremental /// compilation support. - pub def_path_table: DefPathTable, + pub def_path_table: Rc<DefPathTable>, pub exported_symbols: Tracked<FxHashSet<DefIndex>>, diff --git a/src/librustc_metadata/cstore_impl.rs b/src/librustc_metadata/cstore_impl.rs index c6695ebc4bf..dcc55846b53 100644 --- a/src/librustc_metadata/cstore_impl.rs +++ b/src/librustc_metadata/cstore_impl.rs @@ -25,6 +25,7 @@ use rustc::hir::def_id::{CrateNum, DefId, DefIndex, CRATE_DEF_INDEX, LOCAL_CRATE use rustc::dep_graph::{DepNode, GlobalMetaDataKind}; use rustc::hir::map::{DefKey, DefPath, DisambiguatedDefPathData, DefPathHash}; +use rustc::hir::map::definitions::DefPathTable; use rustc::util::nodemap::{NodeSet, DefIdMap}; use rustc_back::PanicStrategy; @@ -337,6 +338,10 @@ impl CrateStore for cstore::CStore { self.get_crate_data(def.krate).def_path_hash(def.index) } + fn def_path_table(&self, cnum: CrateNum) -> Rc<DefPathTable> { + self.get_crate_data(cnum).def_path_table.clone() + } + fn struct_field_names(&self, def: DefId) -> Vec<ast::Name> { self.dep_graph.read(DepNode::MetaData(def)); |
