Skip to content

Commit 9f5a530

Browse files
committed
rustc_metadata: Minimize use of Lrc in crate store
Crate metadatas are still stored as `Lrc<CrateMetadata>` in `CStore` because crate store has to be cloneable due to `Resolver::clone_outputs`.
1 parent c5fee33 commit 9f5a530

File tree

5 files changed

+41
-47
lines changed

5 files changed

+41
-47
lines changed

src/librustc/middle/cstore.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ use syntax::ast;
1616
use syntax::symbol::Symbol;
1717
use syntax_pos::Span;
1818
use rustc_target::spec::Target;
19-
use rustc_data_structures::sync::{self, MetadataRef, Lrc};
19+
use rustc_data_structures::sync::{self, MetadataRef};
2020
use rustc_macros::HashStable;
2121

2222
pub use self::NativeLibraryKind::*;
@@ -203,13 +203,13 @@ pub type MetadataLoaderDyn = dyn MetadataLoader + Sync;
203203
/// (it'd break incremental compilation) and should only be called pre-HIR (e.g.
204204
/// during resolve)
205205
pub trait CrateStore {
206-
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any>;
206+
fn crate_data_as_any(&self, cnum: CrateNum) -> &dyn Any;
207207

208208
// resolve
209209
fn def_key(&self, def: DefId) -> DefKey;
210210
fn def_path(&self, def: DefId) -> hir_map::DefPath;
211211
fn def_path_hash(&self, def: DefId) -> hir_map::DefPathHash;
212-
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable>;
212+
fn def_path_table(&self, cnum: CrateNum) -> &DefPathTable;
213213

214214
// "queries" used in resolve that aren't tracked for incremental compilation
215215
fn crate_name_untracked(&self, cnum: CrateNum) -> Symbol;

src/librustc/ty/context.rs

+8-15
Original file line numberDiff line numberDiff line change
@@ -1213,34 +1213,27 @@ impl<'tcx> TyCtxt<'tcx> {
12131213
let common_consts = CommonConsts::new(&interners, &common_types);
12141214
let dep_graph = hir.dep_graph.clone();
12151215
let cstore = resolutions.cstore;
1216-
let max_cnum = cstore.crates_untracked().iter().map(|c| c.as_usize()).max().unwrap_or(0);
1216+
let crates = cstore.crates_untracked();
1217+
let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0);
12171218
let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1);
12181219
providers[LOCAL_CRATE] = local_providers;
12191220

12201221
let def_path_hash_to_def_id = if s.opts.build_dep_graph() {
1221-
let upstream_def_path_tables: Vec<(CrateNum, Lrc<_>)> = cstore
1222-
.crates_untracked()
1222+
let def_path_tables = crates
12231223
.iter()
12241224
.map(|&cnum| (cnum, cstore.def_path_table(cnum)))
1225-
.collect();
1226-
1227-
let def_path_tables = || {
1228-
upstream_def_path_tables
1229-
.iter()
1230-
.map(|&(cnum, ref rc)| (cnum, &**rc))
1231-
.chain(iter::once((LOCAL_CRATE, hir.definitions().def_path_table())))
1232-
};
1225+
.chain(iter::once((LOCAL_CRATE, hir.definitions().def_path_table())));
12331226

12341227
// Precompute the capacity of the hashmap so we don't have to
12351228
// re-allocate when populating it.
1236-
let capacity = def_path_tables().map(|(_, t)| t.size()).sum::<usize>();
1229+
let capacity = def_path_tables.clone().map(|(_, t)| t.size()).sum::<usize>();
12371230

12381231
let mut map: FxHashMap<_, _> = FxHashMap::with_capacity_and_hasher(
12391232
capacity,
12401233
::std::default::Default::default()
12411234
);
12421235

1243-
for (cnum, def_path_table) in def_path_tables() {
1236+
for (cnum, def_path_table) in def_path_tables {
12441237
def_path_table.add_def_path_hashes_to(cnum, &mut map);
12451238
}
12461239

@@ -1417,8 +1410,8 @@ impl<'tcx> TyCtxt<'tcx> {
14171410

14181411
// Note that this is *untracked* and should only be used within the query
14191412
// system if the result is otherwise tracked through queries
1420-
pub fn crate_data_as_rc_any(self, cnum: CrateNum) -> Lrc<dyn Any> {
1421-
self.cstore.crate_data_as_rc_any(cnum)
1413+
pub fn crate_data_as_any(self, cnum: CrateNum) -> &'tcx dyn Any {
1414+
self.cstore.crate_data_as_any(cnum)
14221415
}
14231416

14241417
#[inline(always)]

src/librustc_metadata/creader.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
use crate::cstore::{self, CStore, MetadataBlob};
44
use crate::locator::{self, CratePaths};
55
use crate::schema::{CrateRoot, CrateDep};
6-
use rustc_data_structures::sync::{Lrc, RwLock, Lock, AtomicCell};
6+
use rustc_data_structures::sync::{RwLock, Lock, AtomicCell};
77

88
use rustc::hir::def_id::CrateNum;
99
use rustc_data_structures::svh::Svh;
@@ -186,7 +186,7 @@ impl<'a> CrateLoader<'a> {
186186
lib: Library,
187187
dep_kind: DepKind,
188188
name: Symbol
189-
) -> (CrateNum, Lrc<cstore::CrateMetadata>) {
189+
) -> CrateNum {
190190
let _prof_timer = self.sess.prof.generic_activity("metadata_register_crate");
191191

192192
let Library { source, metadata } = lib;
@@ -240,9 +240,9 @@ impl<'a> CrateLoader<'a> {
240240
crate_root.def_path_table.decode((&metadata, self.sess))
241241
});
242242

243-
let cmeta = cstore::CrateMetadata {
243+
self.cstore.set_crate_data(cnum, cstore::CrateMetadata {
244244
extern_crate: Lock::new(None),
245-
def_path_table: Lrc::new(def_path_table),
245+
def_path_table,
246246
trait_impls,
247247
root: crate_root,
248248
blob: metadata,
@@ -256,11 +256,9 @@ impl<'a> CrateLoader<'a> {
256256
private_dep,
257257
raw_proc_macros,
258258
dep_node_index: AtomicCell::new(DepNodeIndex::INVALID),
259-
};
259+
});
260260

261-
let cmeta = Lrc::new(cmeta);
262-
self.cstore.set_crate_data(cnum, cmeta.clone());
263-
(cnum, cmeta)
261+
cnum
264262
}
265263

266264
fn load_proc_macro<'b>(
@@ -324,7 +322,7 @@ impl<'a> CrateLoader<'a> {
324322
span: Span,
325323
dep_kind: DepKind,
326324
dep: Option<(&'b CratePaths, &'b CrateDep)>,
327-
) -> (CrateNum, Lrc<cstore::CrateMetadata>) {
325+
) -> CrateNum {
328326
self.maybe_resolve_crate(name, span, dep_kind, dep).unwrap_or_else(|err| err.report())
329327
}
330328

@@ -334,7 +332,7 @@ impl<'a> CrateLoader<'a> {
334332
span: Span,
335333
mut dep_kind: DepKind,
336334
dep: Option<(&'b CratePaths, &'b CrateDep)>,
337-
) -> Result<(CrateNum, Lrc<cstore::CrateMetadata>), LoadError<'b>> {
335+
) -> Result<CrateNum, LoadError<'b>> {
338336
info!("resolving crate `{}`", name);
339337
let (root, hash, extra_filename, path_kind) = match dep {
340338
Some((root, dep)) =>
@@ -380,7 +378,7 @@ impl<'a> CrateLoader<'a> {
380378
data.dep_kind.with_lock(|data_dep_kind| {
381379
*data_dep_kind = cmp::max(*data_dep_kind, dep_kind);
382380
});
383-
Ok((cnum, data))
381+
Ok(cnum)
384382
}
385383
(LoadResult::Loaded(library), host_library) => {
386384
Ok(self.register_crate(host_library, root, span, library, dep_kind, name))
@@ -484,7 +482,7 @@ impl<'a> CrateLoader<'a> {
484482
DepKind::MacrosOnly => DepKind::MacrosOnly,
485483
_ => dep.kind,
486484
};
487-
self.resolve_crate(dep.name, span, dep_kind, Some((root, &dep))).0
485+
self.resolve_crate(dep.name, span, dep_kind, Some((root, &dep)))
488486
})).collect()
489487
}
490488

@@ -581,7 +579,8 @@ impl<'a> CrateLoader<'a> {
581579
};
582580
info!("panic runtime not found -- loading {}", name);
583581

584-
let (cnum, data) = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None);
582+
let cnum = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None);
583+
let data = self.cstore.get_crate_data(cnum);
585584

586585
// Sanity check the loaded crate to ensure it is indeed a panic runtime
587586
// and the panic strategy is indeed what we thought it was.
@@ -685,7 +684,8 @@ impl<'a> CrateLoader<'a> {
685684
});
686685
info!("loading sanitizer: {}", name);
687686

688-
let data = self.resolve_crate(name, DUMMY_SP, DepKind::Explicit, None).1;
687+
let cnum = self.resolve_crate(name, DUMMY_SP, DepKind::Explicit, None);
688+
let data = self.cstore.get_crate_data(cnum);
689689

690690
// Sanity check the loaded crate to ensure it is indeed a sanitizer runtime
691691
if !data.root.sanitizer_runtime {
@@ -705,7 +705,8 @@ impl<'a> CrateLoader<'a> {
705705
info!("loading profiler");
706706

707707
let name = Symbol::intern("profiler_builtins");
708-
let data = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None).1;
708+
let cnum = self.resolve_crate(name, DUMMY_SP, DepKind::Implicit, None);
709+
let data = self.cstore.get_crate_data(cnum);
709710

710711
// Sanity check the loaded crate to ensure it is indeed a profiler runtime
711712
if !data.root.profiler_runtime {
@@ -886,7 +887,7 @@ impl<'a> CrateLoader<'a> {
886887
DepKind::Explicit
887888
};
888889

889-
let cnum = self.resolve_crate(name, item.span, dep_kind, None).0;
890+
let cnum = self.resolve_crate(name, item.span, dep_kind, None);
890891

891892
let def_id = definitions.opt_local_def_id(item.id).unwrap();
892893
let path_len = definitions.def_path(def_id.index).data.len();
@@ -907,7 +908,7 @@ impl<'a> CrateLoader<'a> {
907908
}
908909

909910
pub fn process_path_extern(&mut self, name: Symbol, span: Span) -> CrateNum {
910-
let cnum = self.resolve_crate(name, span, DepKind::Explicit, None).0;
911+
let cnum = self.resolve_crate(name, span, DepKind::Explicit, None);
911912

912913
self.update_extern_crate(
913914
cnum,
@@ -925,7 +926,7 @@ impl<'a> CrateLoader<'a> {
925926
}
926927

927928
pub fn maybe_process_path_extern(&mut self, name: Symbol, span: Span) -> Option<CrateNum> {
928-
let cnum = self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()?.0;
929+
let cnum = self.maybe_resolve_crate(name, span, DepKind::Explicit, None).ok()?;
929930

930931
self.update_extern_crate(
931932
cnum,

src/librustc_metadata/cstore.rs

+6-6
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ crate struct CrateMetadata {
5454
/// hashmap, which gives the reverse mapping. This allows us to
5555
/// quickly retrace a `DefPath`, which is needed for incremental
5656
/// compilation support.
57-
crate def_path_table: Lrc<DefPathTable>,
57+
crate def_path_table: DefPathTable,
5858
/// Trait impl data.
5959
/// FIXME: Used only from queries and can use query cache,
6060
/// so pre-decoding can probably be avoided.
@@ -123,18 +123,18 @@ impl CStore {
123123
CrateNum::new(self.metas.len() - 1)
124124
}
125125

126-
crate fn get_crate_data(&self, cnum: CrateNum) -> Lrc<CrateMetadata> {
127-
self.metas[cnum].clone()
126+
crate fn get_crate_data(&self, cnum: CrateNum) -> &CrateMetadata {
127+
self.metas[cnum].as_ref()
128128
.unwrap_or_else(|| panic!("Failed to get crate data for {:?}", cnum))
129129
}
130130

131-
crate fn set_crate_data(&mut self, cnum: CrateNum, data: Lrc<CrateMetadata>) {
131+
crate fn set_crate_data(&mut self, cnum: CrateNum, data: CrateMetadata) {
132132
assert!(self.metas[cnum].is_none(), "Overwriting crate metadata entry");
133-
self.metas[cnum] = Some(data);
133+
self.metas[cnum] = Some(Lrc::new(data));
134134
}
135135

136136
crate fn iter_crate_data<I>(&self, mut i: I)
137-
where I: FnMut(CrateNum, &Lrc<CrateMetadata>)
137+
where I: FnMut(CrateNum, &CrateMetadata)
138138
{
139139
for (k, v) in self.metas.iter_enumerated() {
140140
if let &Some(ref v) = v {

src/librustc_metadata/cstore_impl.rs

+5-5
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@ macro_rules! provide {
5353
let ($def_id, $other) = def_id_arg.into_args();
5454
assert!(!$def_id.is_local());
5555

56-
let $cdata = $tcx.crate_data_as_rc_any($def_id.krate);
56+
let $cdata = $tcx.crate_data_as_any($def_id.krate);
5757
let $cdata = $cdata.downcast_ref::<cstore::CrateMetadata>()
5858
.expect("CrateStore created data is not a CrateMetadata");
5959

@@ -478,8 +478,8 @@ impl cstore::CStore {
478478
}
479479

480480
impl CrateStore for cstore::CStore {
481-
fn crate_data_as_rc_any(&self, krate: CrateNum) -> Lrc<dyn Any> {
482-
self.get_crate_data(krate)
481+
fn crate_data_as_any(&self, cnum: CrateNum) -> &dyn Any {
482+
self.get_crate_data(cnum)
483483
}
484484

485485
fn item_generics_cloned_untracked(&self, def: DefId, sess: &Session) -> ty::Generics {
@@ -520,8 +520,8 @@ impl CrateStore for cstore::CStore {
520520
self.get_crate_data(def.krate).def_path_hash(def.index)
521521
}
522522

523-
fn def_path_table(&self, cnum: CrateNum) -> Lrc<DefPathTable> {
524-
self.get_crate_data(cnum).def_path_table.clone()
523+
fn def_path_table(&self, cnum: CrateNum) -> &DefPathTable {
524+
&self.get_crate_data(cnum).def_path_table
525525
}
526526

527527
fn crates_untracked(&self) -> Vec<CrateNum>

0 commit comments

Comments
 (0)