Skip to content

Commit 753ce45

Browse files
committed
rustc_metadata: Merge cstore.rs into creader.rs
1 parent 3b1d60a commit 753ce45

File tree

8 files changed

+103
-121
lines changed

8 files changed

+103
-121
lines changed

src/librustc_interface/passes.rs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ use rustc_data_structures::{box_region_allow_access, declare_box_region_type, pa
2525
use rustc_data_structures::sync::{Lrc, ParallelIterator, par_iter};
2626
use rustc_errors::PResult;
2727
use rustc_incremental;
28-
use rustc_metadata::cstore;
2928
use rustc_mir as mir;
3029
use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str};
3130
use rustc_passes::{self, ast_validation, hir_stats, layout_test};
@@ -728,15 +727,15 @@ pub fn default_provide(providers: &mut ty::query::Providers<'_>) {
728727
rustc_passes::provide(providers);
729728
rustc_traits::provide(providers);
730729
middle::region::provide(providers);
731-
cstore::provide(providers);
730+
rustc_metadata::provide(providers);
732731
lint::provide(providers);
733732
rustc_lint::provide(providers);
734733
rustc_codegen_utils::provide(providers);
735734
rustc_codegen_ssa::provide(providers);
736735
}
737736

738737
pub fn default_provide_extern(providers: &mut ty::query::Providers<'_>) {
739-
cstore::provide_extern(providers);
738+
rustc_metadata::provide_extern(providers);
740739
rustc_codegen_ssa::provide_extern(providers);
741740
}
742741

src/librustc_metadata/creader.rs

Lines changed: 93 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
//! Validates all used crates and extern libraries and loads their metadata
22
3-
use crate::cstore::CStore;
43
use crate::locator::{CrateLocator, CratePaths};
54
use crate::rmeta::{CrateMetadata, CrateNumMap, CrateRoot, CrateDep, MetadataBlob};
65

76
use rustc::hir::def_id::CrateNum;
87
use rustc_data_structures::svh::Svh;
8+
use rustc_data_structures::sync::Lrc;
9+
use rustc_index::vec::IndexVec;
910
use rustc::middle::cstore::DepKind;
1011
use rustc::session::{Session, CrateDisambiguator};
1112
use rustc::session::config::{Sanitizer, self};
@@ -21,18 +22,22 @@ use std::{cmp, fs};
2122

2223
use syntax::ast;
2324
use syntax::attr;
25+
use syntax::edition::Edition;
2426
use syntax::expand::allocator::{global_allocator_spans, AllocatorKind};
2527
use syntax::symbol::{Symbol, sym};
2628
use syntax::span_fatal;
29+
use syntax_expand::base::SyntaxExtension;
2730
use syntax_pos::{Span, DUMMY_SP};
2831
use log::{debug, info, log_enabled};
2932
use proc_macro::bridge::client::ProcMacro;
3033

3134
use rustc_error_codes::*;
3235

33-
crate struct Library {
34-
pub source: CrateSource,
35-
pub metadata: MetadataBlob,
36+
#[derive(Clone)]
37+
pub struct CStore {
38+
metas: IndexVec<CrateNum, Option<Lrc<CrateMetadata>>>,
39+
crate injected_panic_runtime: Option<CrateNum>,
40+
crate allocator_kind: Option<AllocatorKind>,
3641
}
3742

3843
pub struct CrateLoader<'a> {
@@ -44,6 +49,33 @@ pub struct CrateLoader<'a> {
4449
cstore: CStore,
4550
}
4651

52+
pub enum LoadedMacro {
53+
MacroDef(ast::Item, Edition),
54+
ProcMacro(SyntaxExtension),
55+
}
56+
57+
crate struct Library {
58+
pub source: CrateSource,
59+
pub metadata: MetadataBlob,
60+
}
61+
62+
enum LoadResult {
63+
Previous(CrateNum),
64+
Loaded(Library),
65+
}
66+
67+
enum LoadError<'a> {
68+
LocatorError(CrateLocator<'a>),
69+
}
70+
71+
impl<'a> LoadError<'a> {
72+
fn report(self) -> ! {
73+
match self {
74+
LoadError::LocatorError(locator) => locator.report_errs(),
75+
}
76+
}
77+
}
78+
4779
fn dump_crates(cstore: &CStore) {
4880
info!("resolved crates:");
4981
cstore.iter_crate_data(|cnum, data| {
@@ -58,21 +90,58 @@ fn dump_crates(cstore: &CStore) {
5890
});
5991
}
6092

61-
enum LoadResult {
62-
Previous(CrateNum),
63-
Loaded(Library),
64-
}
93+
impl CStore {
94+
crate fn alloc_new_crate_num(&mut self) -> CrateNum {
95+
self.metas.push(None);
96+
CrateNum::new(self.metas.len() - 1)
97+
}
6598

66-
enum LoadError<'a> {
67-
LocatorError(CrateLocator<'a>),
68-
}
99+
crate fn get_crate_data(&self, cnum: CrateNum) -> &CrateMetadata {
100+
self.metas[cnum].as_ref()
101+
.unwrap_or_else(|| panic!("Failed to get crate data for {:?}", cnum))
102+
}
69103

70-
impl<'a> LoadError<'a> {
71-
fn report(self) -> ! {
72-
match self {
73-
LoadError::LocatorError(locator) => locator.report_errs(),
104+
crate fn set_crate_data(&mut self, cnum: CrateNum, data: CrateMetadata) {
105+
assert!(self.metas[cnum].is_none(), "Overwriting crate metadata entry");
106+
self.metas[cnum] = Some(Lrc::new(data));
107+
}
108+
109+
crate fn iter_crate_data(&self, mut f: impl FnMut(CrateNum, &CrateMetadata)) {
110+
for (cnum, data) in self.metas.iter_enumerated() {
111+
if let Some(data) = data {
112+
f(cnum, data);
113+
}
114+
}
115+
}
116+
117+
fn push_dependencies_in_postorder(&self, deps: &mut Vec<CrateNum>, cnum: CrateNum) {
118+
if !deps.contains(&cnum) {
119+
let data = self.get_crate_data(cnum);
120+
for &dep in data.dependencies().iter() {
121+
if dep != cnum {
122+
self.push_dependencies_in_postorder(deps, dep);
123+
}
124+
}
125+
126+
deps.push(cnum);
74127
}
75128
}
129+
130+
crate fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
131+
let mut deps = Vec::new();
132+
if cnum == LOCAL_CRATE {
133+
self.iter_crate_data(|cnum, _| self.push_dependencies_in_postorder(&mut deps, cnum));
134+
} else {
135+
self.push_dependencies_in_postorder(&mut deps, cnum);
136+
}
137+
deps
138+
}
139+
140+
crate fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> {
141+
let mut deps = self.crate_dependencies_in_postorder(cnum);
142+
deps.reverse();
143+
deps
144+
}
76145
}
77146

78147
impl<'a> CrateLoader<'a> {
@@ -85,7 +154,15 @@ impl<'a> CrateLoader<'a> {
85154
sess,
86155
metadata_loader,
87156
local_crate_name: Symbol::intern(local_crate_name),
88-
cstore: Default::default(),
157+
cstore: CStore {
158+
// We add an empty entry for LOCAL_CRATE (which maps to zero) in
159+
// order to make array indices in `metas` match with the
160+
// corresponding `CrateNum`. This first entry will always remain
161+
// `None`.
162+
metas: IndexVec::from_elem_n(None, 1),
163+
injected_panic_runtime: None,
164+
allocator_kind: None,
165+
}
89166
}
90167
}
91168

src/librustc_metadata/cstore.rs

Lines changed: 0 additions & 94 deletions
This file was deleted.

src/librustc_metadata/lib.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,14 +24,15 @@ extern crate rustc;
2424
#[macro_use]
2525
extern crate rustc_data_structures;
2626

27+
pub use rmeta::{provide, provide_extern};
28+
2729
mod dependency_format;
2830
mod foreign_modules;
2931
mod link_args;
3032
mod native_libs;
3133
mod rmeta;
3234

3335
pub mod creader;
34-
pub mod cstore;
3536
pub mod dynamic_lib;
3637
pub mod locator;
3738

src/librustc_metadata/rmeta/decoder/cstore_impl.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::cstore::{self, LoadedMacro};
1+
use crate::creader::{CStore, LoadedMacro};
22
use crate::link_args;
33
use crate::native_libs;
44
use crate::foreign_modules;
@@ -382,7 +382,7 @@ pub fn provide(providers: &mut Providers<'_>) {
382382
};
383383
}
384384

385-
impl cstore::CStore {
385+
impl CStore {
386386
pub fn export_macros_untracked(&self, cnum: CrateNum) {
387387
let data = self.get_crate_data(cnum);
388388
let mut dep_kind = data.dep_kind.lock();
@@ -458,7 +458,7 @@ impl cstore::CStore {
458458
}
459459
}
460460

461-
impl CrateStore for cstore::CStore {
461+
impl CrateStore for CStore {
462462
fn crate_data_as_any(&self, cnum: CrateNum) -> &dyn Any {
463463
self.get_crate_data(cnum)
464464
}

src/librustc_resolve/build_reduced_graph.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use rustc::hir::def::{self, *};
1919
use rustc::hir::def_id::{CRATE_DEF_INDEX, LOCAL_CRATE, DefId};
2020
use rustc::ty;
2121
use rustc::middle::cstore::CrateStore;
22-
use rustc_metadata::cstore::LoadedMacro;
22+
use rustc_metadata::creader::LoadedMacro;
2323

2424
use std::cell::Cell;
2525
use std::ptr;

src/librustc_resolve/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,8 +32,7 @@ use rustc::ty::{self, DefIdTree, ResolverOutputs};
3232
use rustc::util::nodemap::{NodeMap, NodeSet, FxHashMap, FxHashSet, DefIdMap};
3333
use rustc::span_bug;
3434

35-
use rustc_metadata::creader::CrateLoader;
36-
use rustc_metadata::cstore::CStore;
35+
use rustc_metadata::creader::{CrateLoader, CStore};
3736

3837
use syntax::{struct_span_err, unwrap_or};
3938
use syntax::ast::{self, Name, NodeId, Ident, FloatTy, IntTy, UintTy};

src/librustdoc/clean/inline.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ use syntax_pos::Span;
1010
use rustc::hir;
1111
use rustc::hir::def::{Res, DefKind, CtorKind};
1212
use rustc::hir::def_id::DefId;
13-
use rustc_metadata::cstore::LoadedMacro;
13+
use rustc_metadata::creader::LoadedMacro;
1414
use rustc::ty;
1515
use rustc::util::nodemap::FxHashSet;
1616

0 commit comments

Comments
 (0)