Skip to content

Commit dee389f

Browse files
committed
Run module lint passes in parallel
1 parent cd32f9b commit dee389f

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

src/librustc/lint/context.rs

+10-14
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@
1717
use self::TargetLint::*;
1818

1919
use std::slice;
20-
use rustc_data_structures::sync::{ReadGuard, Lock, join};
20+
use rustc_data_structures::sync::{ReadGuard, Lock, ParallelIterator, join, par_iter};
2121
use crate::lint::{EarlyLintPass, LateLintPass, EarlyLintPassObject, LateLintPassObject};
2222
use crate::lint::{LintArray, Level, Lint, LintId, LintPass, LintBuffer};
2323
use crate::lint::builtin::BuiltinLintDiagnostics;
@@ -56,7 +56,7 @@ pub struct LintStore {
5656
pre_expansion_passes: Option<Vec<EarlyLintPassObject>>,
5757
early_passes: Option<Vec<EarlyLintPassObject>>,
5858
late_passes: Lock<Option<Vec<LateLintPassObject>>>,
59-
late_module_passes: Lock<Option<Vec<LateLintPassObject>>>,
59+
late_module_passes: Vec<LateLintPassObject>,
6060

6161
/// Lints indexed by name.
6262
by_name: FxHashMap<String, TargetLint>,
@@ -144,7 +144,7 @@ impl LintStore {
144144
pre_expansion_passes: Some(vec![]),
145145
early_passes: Some(vec![]),
146146
late_passes: Lock::new(Some(vec![])),
147-
late_module_passes: Lock::new(Some(vec![])),
147+
late_module_passes: vec![],
148148
by_name: Default::default(),
149149
future_incompatible: Default::default(),
150150
lint_groups: Default::default(),
@@ -200,7 +200,7 @@ impl LintStore {
200200
self.push_pass(sess, from_plugin, &pass);
201201
if !register_only {
202202
if per_module {
203-
self.late_module_passes.lock().as_mut().unwrap().push(pass);
203+
self.late_module_passes.push(pass);
204204
} else {
205205
self.late_passes.lock().as_mut().unwrap().push(pass);
206206
}
@@ -1277,14 +1277,12 @@ pub fn late_lint_mod<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
12771277

12781278
late_lint_mod_pass(tcx, module_def_id, builtin_lints);
12791279

1280-
let mut passes = tcx.sess.lint_store.borrow().late_module_passes.lock().take().unwrap();
1280+
let mut passes: Vec<_> = tcx.sess.lint_store.borrow().late_module_passes
1281+
.iter().map(|pass| pass.fresh_late_pass()).collect();
12811282

12821283
if !passes.is_empty() {
12831284
late_lint_mod_pass(tcx, module_def_id, LateLintPassObjects { lints: &mut passes[..] });
12841285
}
1285-
1286-
// Put the passes back in the session.
1287-
*tcx.sess.lint_store.borrow().late_module_passes.lock() = Some(passes);
12881286
}
12891287

12901288
fn late_lint_pass_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
@@ -1342,16 +1340,14 @@ fn late_lint_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
13421340
});
13431341
}
13441342

1345-
let mut passes = tcx.sess.lint_store.borrow().late_module_passes.lock().take().unwrap();
1343+
let mut passes: Vec<_> = tcx.sess.lint_store.borrow().late_module_passes
1344+
.iter().map(|pass| pass.fresh_late_pass()).collect();
13461345

13471346
for pass in &mut passes {
13481347
time(tcx.sess, &format!("running late module lint: {}", pass.name()), || {
13491348
late_lint_pass_crate(tcx, LateLintPassObjects { lints: slice::from_mut(pass) });
13501349
});
13511350
}
1352-
1353-
// Put the passes back in the session.
1354-
*tcx.sess.lint_store.borrow().late_module_passes.lock() = Some(passes);
13551351
}
13561352

13571353
// Put the passes back in the session.
@@ -1371,9 +1367,9 @@ pub fn check_crate<'tcx, T: for<'a> LateLintPass<'a, 'tcx>>(
13711367
}, || {
13721368
time(tcx.sess, "module lints", || {
13731369
// Run per-module lints
1374-
for &module in tcx.hir().krate().modules.keys() {
1370+
par_iter(&tcx.hir().krate().modules).for_each(|(&module, _)| {
13751371
tcx.ensure().lint_mod(tcx.hir().local_def_id(module));
1376-
}
1372+
});
13771373
});
13781374
});
13791375
}

src/librustc/lint/mod.rs

+3
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,9 @@ macro_rules! expand_lint_pass_methods {
273273
macro_rules! declare_late_lint_pass {
274274
([], [$hir:tt], [$($methods:tt)*]) => (
275275
pub trait LateLintPass<'a, $hir>: LintPass {
276+
fn fresh_late_pass(&self) -> LateLintPassObject {
277+
panic!()
278+
}
276279
expand_lint_pass_methods!(&LateContext<'a, $hir>, [$($methods)*]);
277280
}
278281
)

0 commit comments

Comments
 (0)