Skip to content

Commit b476f2f

Browse files
committed
rustc_metadata: Use CrateSource where appropriate
1 parent e8c28e2 commit b476f2f

File tree

3 files changed

+43
-67
lines changed

3 files changed

+43
-67
lines changed

src/librustc/middle/cstore.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,12 @@ pub struct CrateSource {
3232
pub rmeta: Option<(PathBuf, PathKind)>,
3333
}
3434

35+
impl CrateSource {
36+
pub fn paths(&self) -> impl Iterator<Item = &PathBuf> {
37+
self.dylib.iter().chain(self.rlib.iter()).chain(self.rmeta.iter()).map(|p| &p.0)
38+
}
39+
}
40+
3541
#[derive(RustcEncodable, RustcDecodable, Copy, Clone,
3642
Ord, PartialOrd, Eq, PartialEq, Debug, HashStable)]
3743
pub enum DepKind {

src/librustc_metadata/creader.rs

Lines changed: 11 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,7 @@ use log::{debug, info, log_enabled};
3434
use proc_macro::bridge::client::ProcMacro;
3535

3636
crate struct Library {
37-
pub dylib: Option<(PathBuf, PathKind)>,
38-
pub rlib: Option<(PathBuf, PathKind)>,
39-
pub rmeta: Option<(PathBuf, PathKind)>,
37+
pub source: CrateSource,
4038
pub metadata: MetadataBlob,
4139
}
4240

@@ -197,10 +195,10 @@ impl<'a> CrateLoader<'a> {
197195
dep_kind: DepKind,
198196
name: Symbol
199197
) -> (CrateNum, Lrc<cstore::CrateMetadata>) {
200-
let _prof_timer =
201-
self.sess.prof.generic_activity("metadata_register_crate");
198+
let _prof_timer = self.sess.prof.generic_activity("metadata_register_crate");
202199

203-
let crate_root = lib.metadata.get_root();
200+
let Library { source, metadata } = lib;
201+
let crate_root = metadata.get_root();
204202
self.verify_no_symbol_conflicts(span, &crate_root);
205203

206204
let private_dep = self.sess.opts.externs.get(&name.as_str())
@@ -218,28 +216,22 @@ impl<'a> CrateLoader<'a> {
218216
let root = if let Some(root) = root {
219217
root
220218
} else {
221-
crate_paths = CratePaths {
222-
ident: crate_root.name.to_string(),
223-
dylib: lib.dylib.clone().map(|p| p.0),
224-
rlib: lib.rlib.clone().map(|p| p.0),
225-
rmeta: lib.rmeta.clone().map(|p| p.0),
226-
};
219+
crate_paths = CratePaths { name: crate_root.name, source: source.clone() };
227220
&crate_paths
228221
};
229222

230-
let Library { dylib, rlib, rmeta, metadata } = lib;
231223
let cnum_map = self.resolve_crate_deps(root, &crate_root, &metadata, cnum, span, dep_kind);
232224

233225
let dependencies: Vec<CrateNum> = cnum_map.iter().cloned().collect();
234226

235227
let raw_proc_macros = crate_root.proc_macro_data.map(|_| {
236228
let temp_root;
237-
let (dlsym_dylib, dlsym_root) = match &host_lib {
229+
let (dlsym_source, dlsym_root) = match &host_lib {
238230
Some(host_lib) =>
239-
(&host_lib.dylib, { temp_root = host_lib.metadata.get_root(); &temp_root }),
240-
None => (&dylib, &crate_root),
231+
(&host_lib.source, { temp_root = host_lib.metadata.get_root(); &temp_root }),
232+
None => (&source, &crate_root),
241233
};
242-
let dlsym_dylib = dlsym_dylib.as_ref().expect("no dylib for a proc-macro crate");
234+
let dlsym_dylib = dlsym_source.dylib.as_ref().expect("no dylib for a proc-macro crate");
243235
self.dlsym_proc_macros(&dlsym_dylib.0, dlsym_root.disambiguator, span)
244236
});
245237

@@ -268,11 +260,7 @@ impl<'a> CrateLoader<'a> {
268260
source_map_import_info: RwLock::new(vec![]),
269261
alloc_decoding_state: AllocDecodingState::new(interpret_alloc_index),
270262
dep_kind: Lock::new(dep_kind),
271-
source: CrateSource {
272-
dylib,
273-
rlib,
274-
rmeta,
275-
},
263+
source,
276264
private_dep,
277265
raw_proc_macros,
278266
dep_node_index: AtomicCell::new(DepNodeIndex::INVALID),
@@ -558,7 +546,7 @@ impl<'a> CrateLoader<'a> {
558546
(data.source.dylib.clone(), PMDSource::Registered(data))
559547
}
560548
LoadResult::Loaded(library) => {
561-
let dylib = library.dylib.clone();
549+
let dylib = library.source.dylib.clone();
562550
let metadata = PMDSource::Owned(library);
563551
(dylib, metadata)
564552
}

src/librustc_metadata/locator.rs

Lines changed: 26 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ use crate::schema::{METADATA_HEADER, rustc_version};
219219
use rustc_data_structures::fx::FxHashSet;
220220
use rustc_data_structures::svh::Svh;
221221
use rustc_data_structures::sync::MetadataRef;
222-
use rustc::middle::cstore::MetadataLoader;
222+
use rustc::middle::cstore::{CrateSource, MetadataLoader};
223223
use rustc::session::{config, Session};
224224
use rustc::session::filesearch::{FileSearch, FileMatches, FileDoesntMatch};
225225
use rustc::session::search_paths::PathKind;
@@ -274,10 +274,8 @@ crate struct Context<'a> {
274274
}
275275

276276
crate struct CratePaths {
277-
pub ident: String,
278-
pub dylib: Option<PathBuf>,
279-
pub rlib: Option<PathBuf>,
280-
pub rmeta: Option<PathBuf>,
277+
pub name: Symbol,
278+
pub source: CrateSource,
281279
}
282280

283281
#[derive(Copy, Clone, PartialEq)]
@@ -297,12 +295,6 @@ impl fmt::Display for CrateFlavor {
297295
}
298296
}
299297

300-
impl CratePaths {
301-
fn paths(&self) -> Vec<PathBuf> {
302-
self.dylib.iter().chain(self.rlib.iter()).chain(self.rmeta.iter()).cloned().collect()
303-
}
304-
}
305-
306298
impl<'a> Context<'a> {
307299
crate fn reset(&mut self) {
308300
self.rejected_via_hash.clear();
@@ -324,7 +316,7 @@ impl<'a> Context<'a> {
324316
crate fn report_errs(self) -> ! {
325317
let add = match self.root {
326318
None => String::new(),
327-
Some(r) => format!(" which `{}` depends on", r.ident),
319+
Some(r) => format!(" which `{}` depends on", r.name),
328320
};
329321
let mut msg = "the following crate versions were found:".to_string();
330322
let mut err = if !self.rejected_via_hash.is_empty() {
@@ -342,8 +334,8 @@ impl<'a> Context<'a> {
342334
match self.root {
343335
None => {}
344336
Some(r) => {
345-
for path in r.paths().iter() {
346-
msg.push_str(&format!("\ncrate `{}`: {}", r.ident, path.display()));
337+
for path in r.source.paths() {
338+
msg.push_str(&format!("\ncrate `{}`: {}", r.name, path.display()));
347339
}
348340
}
349341
}
@@ -535,18 +527,8 @@ impl<'a> Context<'a> {
535527
// search is being performed for.
536528
let mut libraries = FxHashMap::default();
537529
for (_hash, (rlibs, rmetas, dylibs)) in candidates {
538-
let mut slot = None;
539-
let rlib = self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot);
540-
let rmeta = self.extract_one(rmetas, CrateFlavor::Rmeta, &mut slot);
541-
let dylib = self.extract_one(dylibs, CrateFlavor::Dylib, &mut slot);
542-
if let Some((h, m)) = slot {
543-
libraries.insert(h,
544-
Library {
545-
dylib,
546-
rlib,
547-
rmeta,
548-
metadata: m,
549-
});
530+
if let Some((svh, lib)) = self.extract_lib(rlibs, rmetas, dylibs) {
531+
libraries.insert(svh, lib);
550532
}
551533
}
552534

@@ -564,7 +546,7 @@ impl<'a> Context<'a> {
564546
self.crate_name);
565547
let candidates = libraries.iter().filter_map(|(_, lib)| {
566548
let crate_name = &lib.metadata.get_root().name.as_str();
567-
match &(&lib.dylib, &lib.rlib) {
549+
match &(&lib.source.dylib, &lib.source.rlib) {
568550
&(&Some((ref pd, _)), &Some((ref pr, _))) => {
569551
Some(format!("\ncrate `{}`: {}\n{:>padding$}",
570552
crate_name,
@@ -585,6 +567,21 @@ impl<'a> Context<'a> {
585567
}
586568
}
587569

570+
fn extract_lib(
571+
&mut self,
572+
rlibs: FxHashMap<PathBuf, PathKind>,
573+
rmetas: FxHashMap<PathBuf, PathKind>,
574+
dylibs: FxHashMap<PathBuf, PathKind>,
575+
) -> Option<(Svh, Library)> {
576+
let mut slot = None;
577+
let source = CrateSource {
578+
rlib: self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot),
579+
rmeta: self.extract_one(rmetas, CrateFlavor::Rmeta, &mut slot),
580+
dylib: self.extract_one(dylibs, CrateFlavor::Dylib, &mut slot),
581+
};
582+
slot.map(|(svh, metadata)| (svh, Library { source, metadata }))
583+
}
584+
588585
// Attempts to extract *one* library from the set `m`. If the set has no
589586
// elements, `None` is returned. If the set has more than one element, then
590587
// the errors and notes are emitted about the set of libraries.
@@ -829,23 +826,8 @@ impl<'a> Context<'a> {
829826
}
830827
};
831828

832-
// Extract the rlib/dylib pair.
833-
let mut slot = None;
834-
let rlib = self.extract_one(rlibs, CrateFlavor::Rlib, &mut slot);
835-
let rmeta = self.extract_one(rmetas, CrateFlavor::Rmeta, &mut slot);
836-
let dylib = self.extract_one(dylibs, CrateFlavor::Dylib, &mut slot);
837-
838-
if rlib.is_none() && rmeta.is_none() && dylib.is_none() {
839-
return None;
840-
}
841-
slot.map(|(_, metadata)|
842-
Library {
843-
dylib,
844-
rlib,
845-
rmeta,
846-
metadata,
847-
}
848-
)
829+
// Extract the dylib/rlib/rmeta triple.
830+
self.extract_lib(rlibs, rmetas, dylibs).map(|(_, lib)| lib)
849831
}
850832
}
851833

0 commit comments

Comments
 (0)