mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-29 18:23:49 +00:00
Auto merge of #38645 - nikomatsakis:incr-comp-fix-time-depth, r=nrc
propagate TIME_DEPTH to the helper threads for -Z time-passes Currently, the timing measurements for LLVM passes and the like don't come out indented, which messes up `perf.rust-lang.org`. r? @nrc
This commit is contained in:
commit
ebc293bcd3
@ -27,13 +27,27 @@ pub const FN_OUTPUT_NAME: &'static str = "Output";
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
pub struct ErrorReported;
|
||||
|
||||
thread_local!(static TIME_DEPTH: Cell<usize> = Cell::new(0));
|
||||
|
||||
/// Read the current depth of `time()` calls. This is used to
|
||||
/// encourage indentation across threads.
|
||||
pub fn time_depth() -> usize {
|
||||
TIME_DEPTH.with(|slot| slot.get())
|
||||
}
|
||||
|
||||
/// Set the current depth of `time()` calls. The idea is to call
|
||||
/// `set_time_depth()` with the result from `time_depth()` in the
|
||||
/// parent thread.
|
||||
pub fn set_time_depth(depth: usize) {
|
||||
TIME_DEPTH.with(|slot| slot.set(depth));
|
||||
}
|
||||
|
||||
pub fn time<T, F>(do_it: bool, what: &str, f: F) -> T where
|
||||
F: FnOnce() -> T,
|
||||
{
|
||||
thread_local!(static DEPTH: Cell<usize> = Cell::new(0));
|
||||
if !do_it { return f(); }
|
||||
|
||||
let old = DEPTH.with(|slot| {
|
||||
let old = TIME_DEPTH.with(|slot| {
|
||||
let r = slot.get();
|
||||
slot.set(r + 1);
|
||||
r
|
||||
@ -56,7 +70,7 @@ pub fn time<T, F>(do_it: bool, what: &str, f: F) -> T where
|
||||
mem_string,
|
||||
what);
|
||||
|
||||
DEPTH.with(|slot| slot.set(old));
|
||||
TIME_DEPTH.with(|slot| slot.set(old));
|
||||
|
||||
rv
|
||||
}
|
||||
|
@ -19,7 +19,7 @@ use llvm;
|
||||
use llvm::{ModuleRef, TargetMachineRef, PassManagerRef, DiagnosticInfoRef, ContextRef};
|
||||
use llvm::SMDiagnosticRef;
|
||||
use {CrateTranslation, ModuleLlvm, ModuleSource, ModuleTranslation};
|
||||
use util::common::time;
|
||||
use util::common::{time, time_depth, set_time_depth};
|
||||
use util::common::path2cstr;
|
||||
use util::fs::link_or_copy;
|
||||
use errors::{self, Handler, Level, DiagnosticBuilder};
|
||||
@ -1033,7 +1033,10 @@ fn run_work_multithreaded(sess: &Session,
|
||||
|
||||
let incr_comp_session_dir = sess.incr_comp_session_dir_opt().map(|r| r.clone());
|
||||
|
||||
let depth = time_depth();
|
||||
thread::Builder::new().name(format!("codegen-{}", i)).spawn(move || {
|
||||
set_time_depth(depth);
|
||||
|
||||
let diag_handler = Handler::with_emitter(true, false, box diag_emitter);
|
||||
|
||||
// Must construct cgcx inside the proc because it has non-Send
|
||||
|
Loading…
Reference in New Issue
Block a user