|
|
@@ -1,11 +1,12 @@ |
|
|
//! Validates all used crates and extern libraries and loads their metadata |
|
|
|
|
|
use crate::cstore::CStore; |
|
|
use crate::locator::{CrateLocator, CratePaths}; |
|
|
use crate::rmeta::{CrateMetadata, CrateNumMap, CrateRoot, CrateDep, MetadataBlob}; |
|
|
|
|
|
use rustc::hir::def_id::CrateNum; |
|
|
use rustc_data_structures::svh::Svh; |
|
|
use rustc_data_structures::sync::Lrc; |
|
|
use rustc_index::vec::IndexVec; |
|
|
use rustc::middle::cstore::DepKind; |
|
|
use rustc::session::{Session, CrateDisambiguator}; |
|
|
use rustc::session::config::{Sanitizer, self}; |
|
@@ -21,18 +22,22 @@ use std::{cmp, fs}; |
|
|
|
|
|
use syntax::ast; |
|
|
use syntax::attr; |
|
|
use syntax::edition::Edition; |
|
|
use syntax::expand::allocator::{global_allocator_spans, AllocatorKind}; |
|
|
use syntax::symbol::{Symbol, sym}; |
|
|
use syntax::span_fatal; |
|
|
use syntax_expand::base::SyntaxExtension; |
|
|
use syntax_pos::{Span, DUMMY_SP}; |
|
|
use log::{debug, info, log_enabled}; |
|
|
use proc_macro::bridge::client::ProcMacro; |
|
|
|
|
|
use rustc_error_codes::*; |
|
|
|
|
|
crate struct Library { |
|
|
pub source: CrateSource, |
|
|
pub metadata: MetadataBlob, |
|
|
#[derive(Clone)] |
|
|
pub struct CStore { |
|
|
metas: IndexVec<CrateNum, Option<Lrc<CrateMetadata>>>, |
|
|
crate injected_panic_runtime: Option<CrateNum>, |
|
|
crate allocator_kind: Option<AllocatorKind>, |
|
|
} |
|
|
|
|
|
pub struct CrateLoader<'a> { |
|
@@ -44,6 +49,33 @@ pub struct CrateLoader<'a> { |
|
|
cstore: CStore, |
|
|
} |
|
|
|
|
|
pub enum LoadedMacro { |
|
|
MacroDef(ast::Item, Edition), |
|
|
ProcMacro(SyntaxExtension), |
|
|
} |
|
|
|
|
|
crate struct Library { |
|
|
pub source: CrateSource, |
|
|
pub metadata: MetadataBlob, |
|
|
} |
|
|
|
|
|
enum LoadResult { |
|
|
Previous(CrateNum), |
|
|
Loaded(Library), |
|
|
} |
|
|
|
|
|
enum LoadError<'a> { |
|
|
LocatorError(CrateLocator<'a>), |
|
|
} |
|
|
|
|
|
impl<'a> LoadError<'a> { |
|
|
fn report(self) -> ! { |
|
|
match self { |
|
|
LoadError::LocatorError(locator) => locator.report_errs(), |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
fn dump_crates(cstore: &CStore) { |
|
|
info!("resolved crates:"); |
|
|
cstore.iter_crate_data(|cnum, data| { |
|
@@ -58,21 +90,58 @@ fn dump_crates(cstore: &CStore) { |
|
|
}); |
|
|
} |
|
|
|
|
|
enum LoadResult { |
|
|
Previous(CrateNum), |
|
|
Loaded(Library), |
|
|
} |
|
|
impl CStore { |
|
|
crate fn alloc_new_crate_num(&mut self) -> CrateNum { |
|
|
self.metas.push(None); |
|
|
CrateNum::new(self.metas.len() - 1) |
|
|
} |
|
|
|
|
|
enum LoadError<'a> { |
|
|
LocatorError(CrateLocator<'a>), |
|
|
} |
|
|
crate fn get_crate_data(&self, cnum: CrateNum) -> &CrateMetadata { |
|
|
self.metas[cnum].as_ref() |
|
|
.unwrap_or_else(|| panic!("Failed to get crate data for {:?}", cnum)) |
|
|
} |
|
|
|
|
|
impl<'a> LoadError<'a> { |
|
|
fn report(self) -> ! { |
|
|
match self { |
|
|
LoadError::LocatorError(locator) => locator.report_errs(), |
|
|
crate fn set_crate_data(&mut self, cnum: CrateNum, data: CrateMetadata) { |
|
|
assert!(self.metas[cnum].is_none(), "Overwriting crate metadata entry"); |
|
|
self.metas[cnum] = Some(Lrc::new(data)); |
|
|
} |
|
|
|
|
|
crate fn iter_crate_data(&self, mut f: impl FnMut(CrateNum, &CrateMetadata)) { |
|
|
for (cnum, data) in self.metas.iter_enumerated() { |
|
|
if let Some(data) = data { |
|
|
f(cnum, data); |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
fn push_dependencies_in_postorder(&self, deps: &mut Vec<CrateNum>, cnum: CrateNum) { |
|
|
if !deps.contains(&cnum) { |
|
|
let data = self.get_crate_data(cnum); |
|
|
for &dep in data.dependencies().iter() { |
|
|
if dep != cnum { |
|
|
self.push_dependencies_in_postorder(deps, dep); |
|
|
} |
|
|
} |
|
|
|
|
|
deps.push(cnum); |
|
|
} |
|
|
} |
|
|
|
|
|
crate fn crate_dependencies_in_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> { |
|
|
let mut deps = Vec::new(); |
|
|
if cnum == LOCAL_CRATE { |
|
|
self.iter_crate_data(|cnum, _| self.push_dependencies_in_postorder(&mut deps, cnum)); |
|
|
} else { |
|
|
self.push_dependencies_in_postorder(&mut deps, cnum); |
|
|
} |
|
|
deps |
|
|
} |
|
|
|
|
|
crate fn crate_dependencies_in_reverse_postorder(&self, cnum: CrateNum) -> Vec<CrateNum> { |
|
|
let mut deps = self.crate_dependencies_in_postorder(cnum); |
|
|
deps.reverse(); |
|
|
deps |
|
|
} |
|
|
} |
|
|
|
|
|
impl<'a> CrateLoader<'a> { |
|
@@ -85,7 +154,15 @@ impl<'a> CrateLoader<'a> { |
|
|
sess, |
|
|
metadata_loader, |
|
|
local_crate_name: Symbol::intern(local_crate_name), |
|
|
cstore: Default::default(), |
|
|
cstore: CStore { |
|
|
// We add an empty entry for LOCAL_CRATE (which maps to zero) in |
|
|
// order to make array indices in `metas` match with the |
|
|
// corresponding `CrateNum`. This first entry will always remain |
|
|
// `None`. |
|
|
metas: IndexVec::from_elem_n(None, 1), |
|
|
injected_panic_runtime: None, |
|
|
allocator_kind: None, |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
0 comments on commit
753ce45