diff --git a/Cargo.lock b/Cargo.lock index 93c5c49c920..b9a3e920e4b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3893,9 +3893,13 @@ name = "rustc_session" version = "0.0.0" dependencies = [ "log", + "num_cpus", "rustc_data_structures", "rustc_errors", + "rustc_feature", + "rustc_fs_util", "rustc_index", + "rustc_target", "serialize", "syntax_pos", ] diff --git a/src/librustc/lib.rs b/src/librustc/lib.rs index 481ae3b9329..e708c5ab6e7 100644 --- a/src/librustc/lib.rs +++ b/src/librustc/lib.rs @@ -64,7 +64,6 @@ #![recursion_limit="512"] #[macro_use] extern crate bitflags; -extern crate getopts; #[macro_use] extern crate scoped_tls; #[cfg(windows)] extern crate libc; @@ -74,10 +73,6 @@ extern crate libc; #[macro_use] extern crate syntax; #[macro_use] extern crate smallvec; -// Use the test crate here so we depend on getopts through it. This allow tools to link to both -// librustc_driver and libtest. -extern crate test as _; - #[cfg(test)] mod tests; @@ -113,7 +108,7 @@ pub mod middle { } pub mod mir; -pub mod session; +pub use rustc_session as session; pub mod traits; pub mod ty; diff --git a/src/librustc_session/Cargo.toml b/src/librustc_session/Cargo.toml index f90ba129a45..dbbb4b92dea 100644 --- a/src/librustc_session/Cargo.toml +++ b/src/librustc_session/Cargo.toml @@ -11,7 +11,11 @@ path = "lib.rs" [dependencies] log = "0.4" rustc_errors = { path = "../librustc_errors" } +rustc_feature = { path = "../librustc_feature" } +rustc_target = { path = "../librustc_target" } rustc_serialize = { path = "../libserialize", package = "serialize" } rustc_data_structures = { path = "../librustc_data_structures" } syntax_pos = { path = "../libsyntax_pos" } rustc_index = { path = "../librustc_index" } +rustc_fs_util = { path = "../librustc_fs_util" } +num_cpus = "1.0" diff --git a/src/librustc/session/code_stats.rs b/src/librustc_session/code_stats.rs similarity index 100% rename from src/librustc/session/code_stats.rs rename to src/librustc_session/code_stats.rs diff --git a/src/librustc/session/config.rs b/src/librustc_session/config.rs similarity index 99% rename from src/librustc/session/config.rs rename to src/librustc_session/config.rs index b2ab9939d3f..c05704dbab5 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc_session/config.rs @@ -1,13 +1,13 @@ //! Contains infrastructure for configuring the compiler, including parsing //! command-line options. -use rustc_session::lint; -use rustc_session::utils::NativeLibraryKind; -use crate::session::{early_error, early_warn, Session}; -use crate::session::search_paths::SearchPath; +use crate::lint; +use crate::utils::NativeLibraryKind; +use crate::{early_error, early_warn, Session}; +use crate::search_paths::SearchPath; use rustc_data_structures::fx::FxHashSet; -use rustc_feature::UnstableFeatures; +use rustc_data_structures::impl_stable_hash_via_hash; use rustc_target::spec::{LinkerFlavor, MergeFunctions, PanicStrategy, RelroLevel}; use rustc_target::spec::{Target, TargetTriple}; @@ -15,12 +15,13 @@ use rustc_target::spec::{Target, TargetTriple}; // Duplicated from syntax::ast for now type CrateConfig = FxHashSet<(Symbol, Option)>; -use syntax::source_map::{FileName, FilePathMapping}; -use syntax::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION}; -use syntax::symbol::{sym, Symbol}; +use syntax_pos::source_map::{FileName, FilePathMapping}; +use syntax_pos::edition::{Edition, EDITION_NAME_LIST, DEFAULT_EDITION}; +use syntax_pos::symbol::{sym, Symbol}; +use rustc_feature::UnstableFeatures; -use errors::emitter::HumanReadableErrorType; -use errors::{ColorConfig, FatalError, Handler}; +use rustc_errors::emitter::HumanReadableErrorType; +use rustc_errors::{ColorConfig, FatalError, Handler}; use getopts; @@ -349,7 +350,7 @@ macro_rules! hash_option { ($opt_name:ident, $opt_expr:expr, $sub_hashes:expr, [TRACKED]) => ({ if $sub_hashes.insert(stringify!($opt_name), $opt_expr as &dyn dep_tracking::DepTrackingHash).is_some() { - bug!("duplicate key in CLI DepTrackingHash: {}", stringify!($opt_name)) + panic!("duplicate key in CLI DepTrackingHash: {}", stringify!($opt_name)) } }); } @@ -702,7 +703,7 @@ pub enum EntryFnType { impl_stable_hash_via_hash!(EntryFnType); -#[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash, Debug, HashStable)] +#[derive(Copy, PartialEq, PartialOrd, Clone, Ord, Eq, Hash, Debug)] pub enum CrateType { Executable, Dylib, @@ -712,6 +713,8 @@ pub enum CrateType { ProcMacro, } +impl_stable_hash_via_hash!(CrateType); + #[derive(Clone, Hash)] pub enum Passes { Some(Vec), @@ -782,7 +785,7 @@ macro_rules! options { value, $outputname, key, type_desc)) } - (None, None) => bug!() + (None, None) => panic!() } } found = true; @@ -2720,7 +2723,7 @@ pub mod nightly_options { use getopts; use rustc_feature::UnstableFeatures; use super::{ErrorOutputType, OptionStability, RustcOptGroup}; - use crate::session::early_error; + use crate::early_error; pub fn is_unstable_enabled(matches: &getopts::Matches) -> bool { is_nightly_build() @@ -2858,8 +2861,8 @@ impl PpMode { /// we have an opt-in scheme here, so one is hopefully forced to think about /// how the hash should be calculated when adding a new command-line argument. mod dep_tracking { - use rustc_session::lint; - use rustc_session::utils::NativeLibraryKind; + use crate::lint; + use crate::utils::NativeLibraryKind; use std::collections::BTreeMap; use std::hash::Hash; use std::path::PathBuf; @@ -2867,9 +2870,9 @@ mod dep_tracking { use super::{CrateType, DebugInfo, ErrorOutputType, OptLevel, OutputTypes, Passes, Sanitizer, LtoCli, LinkerPluginLto, SwitchWithOptPath, SymbolManglingVersion}; - use rustc_feature::UnstableFeatures; use rustc_target::spec::{MergeFunctions, PanicStrategy, RelroLevel, TargetTriple}; - use syntax::edition::Edition; + use syntax_pos::edition::Edition; + use rustc_feature::UnstableFeatures; pub trait DepTrackingHash { fn hash(&self, hasher: &mut DefaultHasher, error_format: ErrorOutputType); diff --git a/src/librustc/session/filesearch.rs b/src/librustc_session/filesearch.rs similarity index 96% rename from src/librustc/session/filesearch.rs rename to src/librustc_session/filesearch.rs index cf09d45ca38..a0bdc6a3254 100644 --- a/src/librustc/session/filesearch.rs +++ b/src/librustc_session/filesearch.rs @@ -7,8 +7,9 @@ use std::env; use std::fs; use std::path::{Path, PathBuf}; -use crate::session::search_paths::{SearchPath, PathKind}; +use crate::search_paths::{SearchPath, PathKind}; use rustc_fs_util::fix_windows_verbatim_for_gcc; +use log::debug; #[derive(Copy, Clone)] pub enum FileMatch { @@ -124,7 +125,7 @@ pub fn get_or_default_sysroot() -> PathBuf { // gcc chokes on verbatim paths which fs::canonicalize generates // so we try to avoid those kinds of paths. Ok(canon) => Some(fix_windows_verbatim_for_gcc(&canon)), - Err(e) => bug!("failed to get realpath: {}", e), + Err(e) => panic!("failed to get realpath: {}", e), } }) } @@ -133,7 +134,7 @@ pub fn get_or_default_sysroot() -> PathBuf { Ok(exe) => { match canonicalize(Some(exe)) { Some(mut p) => { p.pop(); p.pop(); p }, - None => bug!("can't determine value for sysroot") + None => panic!("can't determine value for sysroot") } } Err(ref e) => panic!(format!("failed to get current_exe: {}", e)) diff --git a/src/librustc_session/lib.rs b/src/librustc_session/lib.rs index d5ccb97a7f9..9d7c23100a0 100644 --- a/src/librustc_session/lib.rs +++ b/src/librustc_session/lib.rs @@ -1,6 +1,21 @@ +#![feature(test)] + +// Use the test crate here so we depend on getopts through it. This allow tools to link to both +// librustc_session and libtest. +extern crate test as _; +extern crate getopts; + pub mod cgu_reuse_tracker; pub mod utils; #[macro_use] pub mod lint; pub mod node_id; pub mod parse; + +mod code_stats; +pub mod config; +pub mod filesearch; +pub mod search_paths; + +mod session; +pub use session::*; diff --git a/src/librustc/session/search_paths.rs b/src/librustc_session/search_paths.rs similarity index 90% rename from src/librustc/session/search_paths.rs rename to src/librustc_session/search_paths.rs index 949dad751a1..b9f2ae7618b 100644 --- a/src/librustc/session/search_paths.rs +++ b/src/librustc_session/search_paths.rs @@ -1,6 +1,6 @@ use std::path::{Path, PathBuf}; -use crate::session::{early_error, config}; -use crate::session::filesearch::make_target_lib_path; +use crate::{early_error, config}; +use crate::filesearch::make_target_lib_path; #[derive(Clone, Debug)] pub struct SearchPath { @@ -9,7 +9,7 @@ pub struct SearchPath { pub files: Vec, } -#[derive(PartialEq, Clone, Copy, Debug, HashStable)] +#[derive(PartialEq, Clone, Copy, Debug, Hash, Eq)] pub enum PathKind { Native, Crate, @@ -19,6 +19,8 @@ pub enum PathKind { All, } +rustc_data_structures::impl_stable_hash_via_hash!(PathKind); + impl PathKind { pub fn matches(&self, kind: PathKind) -> bool { match (self, kind) { diff --git a/src/librustc/session/mod.rs b/src/librustc_session/session.rs similarity index 96% rename from src/librustc/session/mod.rs rename to src/librustc_session/session.rs index 38ee4deae03..9369c1771a3 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc_session/session.rs @@ -1,29 +1,32 @@ -pub use self::code_stats::{DataTypeKind, SizeKind, FieldInfo, VariantInfo}; -use self::code_stats::CodeStats; +pub use crate::code_stats::{DataTypeKind, SizeKind, FieldInfo, VariantInfo}; +use crate::code_stats::CodeStats; -use rustc_session::cgu_reuse_tracker::CguReuseTracker; +use crate::cgu_reuse_tracker::CguReuseTracker; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use rustc_session::lint; -use crate::session::config::{OutputType, PrintRequest, Sanitizer, SwitchWithOptPath}; -use crate::session::search_paths::{PathKind, SearchPath}; -use crate::util::common::{duration_to_secs_str, ErrorReported}; +use crate::lint; +use crate::filesearch; +use crate::config::{self, OutputType, PrintRequest, Sanitizer, SwitchWithOptPath}; +use crate::search_paths::{PathKind, SearchPath}; +use crate::utils::duration_to_secs_str; +use rustc_errors::ErrorReported; use rustc_data_structures::base_n; use rustc_data_structures::sync::{ self, Lrc, Lock, OneThread, Once, AtomicU64, AtomicUsize, Ordering, Ordering::SeqCst, }; +use rustc_data_structures::impl_stable_hash_via_hash; -use errors::{DiagnosticBuilder, DiagnosticId, Applicability}; -use errors::emitter::{Emitter, EmitterWriter}; -use errors::emitter::HumanReadableErrorType; -use errors::annotate_snippet_emitter_writer::{AnnotateSnippetEmitterWriter}; -use syntax::edition::Edition; -use errors::json::JsonEmitter; -use syntax::source_map; -use syntax::sess::ParseSess; +use rustc_errors::{DiagnosticBuilder, DiagnosticId, Applicability}; +use rustc_errors::emitter::{Emitter, EmitterWriter}; +use rustc_errors::emitter::HumanReadableErrorType; +use rustc_errors::annotate_snippet_emitter_writer::{AnnotateSnippetEmitterWriter}; +use syntax_pos::edition::Edition; +use rustc_errors::json::JsonEmitter; +use syntax_pos::source_map; +use crate::parse::ParseSess; use syntax_pos::{MultiSpan, Span}; use rustc_target::spec::{PanicStrategy, RelroLevel, Target, TargetTriple}; @@ -41,11 +44,6 @@ use std::path::PathBuf; use std::time::Duration; use std::sync::Arc; -mod code_stats; -pub mod config; -pub mod filesearch; -pub mod search_paths; - pub struct OptimizationFuel { /// If `-zfuel=crate=n` is specified, initially set to `n`, otherwise `0`. remaining: u64, @@ -334,7 +332,7 @@ impl Session { self.diagnostic().span_note_without_error(sp, msg) } - pub fn diagnostic(&self) -> &errors::Handler { + pub fn diagnostic(&self) -> &rustc_errors::Handler { &self.parse_sess.span_diagnostic } @@ -679,7 +677,7 @@ impl Session { if let IncrCompSession::NotInitialized = *incr_comp_session { } else { - bug!( + panic!( "Trying to initialize IncrCompSession `{:?}`", *incr_comp_session ) @@ -697,7 +695,7 @@ impl Session { if let IncrCompSession::Active { .. } = *incr_comp_session { } else { - bug!( + panic!( "trying to finalize `IncrCompSession` `{:?}`", *incr_comp_session ); @@ -718,7 +716,7 @@ impl Session { .. } => session_directory.clone(), IncrCompSession::InvalidBecauseOfErrors { .. } => return, - _ => bug!( + _ => panic!( "trying to invalidate `IncrCompSession` `{:?}`", *incr_comp_session ), @@ -735,7 +733,7 @@ impl Session { cell::Ref::map( incr_comp_session, |incr_comp_session| match *incr_comp_session { - IncrCompSession::NotInitialized => bug!( + IncrCompSession::NotInitialized => panic!( "trying to get session directory from `IncrCompSession`: {:?}", *incr_comp_session, ), @@ -915,7 +913,7 @@ impl Session { pub fn build_session( sopts: config::Options, local_crate_source_file: Option, - registry: errors::registry::Registry, + registry: rustc_errors::registry::Registry, ) -> Session { let file_path_mapping = sopts.file_path_mapping(); @@ -931,7 +929,7 @@ pub fn build_session( fn default_emitter( sopts: &config::Options, - registry: errors::registry::Registry, + registry: rustc_errors::registry::Registry, source_map: &Lrc, emitter_dest: Option>, ) -> Box { @@ -1000,7 +998,7 @@ pub enum DiagnosticOutput { pub fn build_session_with_source_map( sopts: config::Options, local_crate_source_file: Option, - registry: errors::registry::Registry, + registry: rustc_errors::registry::Registry, source_map: Lrc, diagnostics_output: DiagnosticOutput, lint_caps: FxHashMap, @@ -1031,9 +1029,9 @@ pub fn build_session_with_source_map( }; let emitter = default_emitter(&sopts, registry, &source_map, write_dest); - let diagnostic_handler = errors::Handler::with_emitter_and_flags( + let diagnostic_handler = rustc_errors::Handler::with_emitter_and_flags( emitter, - errors::HandlerFlags { + rustc_errors::HandlerFlags { can_emit_warnings, treat_err_as_bug, report_delayed_bugs, @@ -1055,7 +1053,7 @@ pub fn build_session_with_source_map( fn build_session_( sopts: config::Options, local_crate_source_file: Option, - span_diagnostic: errors::Handler, + span_diagnostic: rustc_errors::Handler, source_map: Lrc, driver_lint_caps: FxHashMap, ) -> Session { @@ -1280,9 +1278,9 @@ pub fn early_error(output: config::ErrorOutputType, msg: &str) -> ! { config::ErrorOutputType::Json { pretty, json_rendered } => Box::new(JsonEmitter::basic(pretty, json_rendered, false)), }; - let handler = errors::Handler::with_emitter(true, None, emitter); + let handler = rustc_errors::Handler::with_emitter(true, None, emitter); handler.struct_fatal(msg).emit(); - errors::FatalError.raise(); + rustc_errors::FatalError.raise(); } pub fn early_warn(output: config::ErrorOutputType, msg: &str) { @@ -1294,7 +1292,7 @@ pub fn early_warn(output: config::ErrorOutputType, msg: &str) { config::ErrorOutputType::Json { pretty, json_rendered } => Box::new(JsonEmitter::basic(pretty, json_rendered, false)), }; - let handler = errors::Handler::with_emitter(true, None, emitter); + let handler = rustc_errors::Handler::with_emitter(true, None, emitter); handler.struct_warn(msg).emit(); }