summaryrefslogtreecommitdiffstats
path: root/compiler/rustc_session/src/session.rs
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_session/src/session.rs')
-rw-r--r--compiler/rustc_session/src/session.rs135
1 files changed, 119 insertions, 16 deletions
diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs
index b484978ee..80a549b30 100644
--- a/compiler/rustc_session/src/session.rs
+++ b/compiler/rustc_session/src/session.rs
@@ -1,8 +1,8 @@
-use crate::cgu_reuse_tracker::CguReuseTracker;
use crate::code_stats::CodeStats;
pub use crate::code_stats::{DataTypeKind, FieldInfo, FieldKind, SizeKind, VariantInfo};
use crate::config::{
- self, CrateType, InstrumentCoverage, OptLevel, OutFileName, OutputType, SwitchWithOptPath,
+ self, CrateType, InstrumentCoverage, OptLevel, OutFileName, OutputType,
+ RemapPathScopeComponents, SwitchWithOptPath,
};
use crate::config::{ErrorOutputType, Input};
use crate::errors;
@@ -31,8 +31,8 @@ use rustc_errors::{
use rustc_macros::HashStable_Generic;
pub use rustc_span::def_id::StableCrateId;
use rustc_span::edition::Edition;
-use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap, Span};
-use rustc_span::{SourceFileHashAlgorithm, Symbol};
+use rustc_span::source_map::{FileLoader, RealFileLoader, SourceMap};
+use rustc_span::{SourceFileHashAlgorithm, Span, Symbol};
use rustc_target::asm::InlineAsmArch;
use rustc_target::spec::{CodeModel, PanicStrategy, RelocModel, RelroLevel};
use rustc_target::spec::{
@@ -45,7 +45,7 @@ use std::fmt;
use std::ops::{Div, Mul};
use std::path::{Path, PathBuf};
use std::str::FromStr;
-use std::sync::Arc;
+use std::sync::{atomic::AtomicBool, Arc};
use std::time::Duration;
pub struct OptimizationFuel {
@@ -153,9 +153,6 @@ pub struct Session {
pub io: CompilerIO,
incr_comp_session: OneThread<RefCell<IncrCompSession>>,
- /// Used for incremental compilation tests. Will only be populated if
- /// `-Zquery-dep-graph` is specified.
- pub cgu_reuse_tracker: CguReuseTracker,
/// Used by `-Z self-profile`.
pub prof: SelfProfilerRef,
@@ -205,6 +202,12 @@ pub struct Session {
/// The version of the rustc process, possibly including a commit hash and description.
pub cfg_version: &'static str,
+ /// The inner atomic value is set to true when a feature marked as `internal` is
+ /// enabled. Makes it so that "please report a bug" is hidden, as ICEs with
+ /// internal features are wontfix, and they are usually the cause of the ICEs.
+ /// None signifies that this is not tracked.
+ pub using_internal_features: Arc<AtomicBool>,
+
/// All commandline args used to invoke the compiler, with @file args fully expanded.
/// This will only be used within debug info, e.g. in the pdb file on windows
/// This is mainly useful for other tools that reads that debuginfo to figure out
@@ -258,7 +261,11 @@ impl Session {
pub fn local_crate_source_file(&self) -> Option<PathBuf> {
let path = self.io.input.opt_path()?;
- Some(self.opts.file_path_mapping().map_prefix(path).0.into_owned())
+ if self.should_prefer_remapped_for_codegen() {
+ Some(self.opts.file_path_mapping().map_prefix(path).0.into_owned())
+ } else {
+ Some(path.to_path_buf())
+ }
}
fn check_miri_unleashed_features(&self) {
@@ -701,6 +708,10 @@ impl Session {
self.opts.cg.instrument_coverage() != InstrumentCoverage::Off
}
+ pub fn instrument_coverage_branch(&self) -> bool {
+ self.opts.cg.instrument_coverage() == InstrumentCoverage::Branch
+ }
+
pub fn instrument_coverage_except_unused_generics(&self) -> bool {
self.opts.cg.instrument_coverage() == InstrumentCoverage::ExceptUnusedGenerics
}
@@ -1247,6 +1258,53 @@ impl Session {
pub fn link_dead_code(&self) -> bool {
self.opts.cg.link_dead_code.unwrap_or(false)
}
+
+ pub fn should_prefer_remapped_for_codegen(&self) -> bool {
+ // bail out, if any of the requested crate types aren't:
+ // "compiled executables or libraries"
+ for crate_type in &self.opts.crate_types {
+ match crate_type {
+ CrateType::Executable
+ | CrateType::Dylib
+ | CrateType::Rlib
+ | CrateType::Staticlib
+ | CrateType::Cdylib => continue,
+ CrateType::ProcMacro => return false,
+ }
+ }
+
+ let has_split_debuginfo = match self.split_debuginfo() {
+ SplitDebuginfo::Off => false,
+ SplitDebuginfo::Packed => true,
+ SplitDebuginfo::Unpacked => true,
+ };
+
+ let remap_path_scopes = &self.opts.unstable_opts.remap_path_scope;
+ let mut prefer_remapped = false;
+
+ if remap_path_scopes.contains(RemapPathScopeComponents::UNSPLIT_DEBUGINFO) {
+ prefer_remapped |= !has_split_debuginfo;
+ }
+
+ if remap_path_scopes.contains(RemapPathScopeComponents::SPLIT_DEBUGINFO) {
+ prefer_remapped |= has_split_debuginfo;
+ }
+
+ prefer_remapped
+ }
+
+ pub fn should_prefer_remapped_for_split_debuginfo_paths(&self) -> bool {
+ let has_split_debuginfo = match self.split_debuginfo() {
+ SplitDebuginfo::Off => false,
+ SplitDebuginfo::Packed | SplitDebuginfo::Unpacked => true,
+ };
+
+ self.opts
+ .unstable_opts
+ .remap_path_scope
+ .contains(RemapPathScopeComponents::SPLIT_DEBUGINFO_PATH)
+ && has_split_debuginfo
+ }
}
// JUSTIFICATION: part of session construction
@@ -1337,6 +1395,7 @@ pub fn build_session(
target_override: Option<Target>,
cfg_version: &'static str,
ice_file: Option<PathBuf>,
+ using_internal_features: Arc<AtomicBool>,
expanded_args: Vec<String>,
) -> Session {
// FIXME: This is not general enough to make the warning lint completely override
@@ -1431,12 +1490,6 @@ pub fn build_session(
});
let print_fuel = AtomicU64::new(0);
- let cgu_reuse_tracker = if sopts.unstable_opts.query_dep_graph {
- CguReuseTracker::new()
- } else {
- CguReuseTracker::new_disabled()
- };
-
let prof = SelfProfilerRef::new(
self_profiler,
sopts.unstable_opts.time_passes.then(|| sopts.unstable_opts.time_passes_format),
@@ -1461,7 +1514,6 @@ pub fn build_session(
sysroot,
io,
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
- cgu_reuse_tracker,
prof,
perf_stats: PerfStats {
symbol_hash_time: Lock::new(Duration::from_secs(0)),
@@ -1480,6 +1532,7 @@ pub fn build_session(
target_features: Default::default(),
unstable_target_features: Default::default(),
cfg_version,
+ using_internal_features,
expanded_args,
};
@@ -1763,3 +1816,53 @@ fn mk_emitter(output: ErrorOutputType) -> Box<DynEmitter> {
};
emitter
}
+
+pub trait RemapFileNameExt {
+ type Output<'a>
+ where
+ Self: 'a;
+
+ fn for_scope(&self, sess: &Session, scopes: RemapPathScopeComponents) -> Self::Output<'_>;
+
+ fn for_codegen(&self, sess: &Session) -> Self::Output<'_>;
+}
+
+impl RemapFileNameExt for rustc_span::FileName {
+ type Output<'a> = rustc_span::FileNameDisplay<'a>;
+
+ fn for_scope(&self, sess: &Session, scopes: RemapPathScopeComponents) -> Self::Output<'_> {
+ if sess.opts.unstable_opts.remap_path_scope.contains(scopes) {
+ self.prefer_remapped_unconditionaly()
+ } else {
+ self.prefer_local()
+ }
+ }
+
+ fn for_codegen(&self, sess: &Session) -> Self::Output<'_> {
+ if sess.should_prefer_remapped_for_codegen() {
+ self.prefer_remapped_unconditionaly()
+ } else {
+ self.prefer_local()
+ }
+ }
+}
+
+impl RemapFileNameExt for rustc_span::RealFileName {
+ type Output<'a> = &'a Path;
+
+ fn for_scope(&self, sess: &Session, scopes: RemapPathScopeComponents) -> Self::Output<'_> {
+ if sess.opts.unstable_opts.remap_path_scope.contains(scopes) {
+ self.remapped_path_if_available()
+ } else {
+ self.local_path_if_available()
+ }
+ }
+
+ fn for_codegen(&self, sess: &Session) -> Self::Output<'_> {
+ if sess.should_prefer_remapped_for_codegen() {
+ self.remapped_path_if_available()
+ } else {
+ self.local_path_if_available()
+ }
+ }
+}