mirror of
https://github.com/rust-lang/rust
synced 2024-10-14 12:33:57 +00:00
Wrap the self-profiler in an Arc<Mutex<>>
This will allow us to send it across threads and measure things like LLVM time.
This commit is contained in:
parent
c0086b9e89
commit
25b8c614f0
|
@ -2625,6 +2625,7 @@ dependencies = [
|
||||||
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"parking_lot 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc 0.0.0",
|
"rustc 0.0.0",
|
||||||
"rustc-demangle 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rustc-demangle 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc_allocator 0.0.0",
|
"rustc_allocator 0.0.0",
|
||||||
|
|
|
@ -44,7 +44,9 @@
|
||||||
use std::io::Write;
|
use std::io::Write;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
use std::sync::mpsc;
|
use std::sync::{Arc, mpsc};
|
||||||
|
|
||||||
|
use parking_lot::Mutex as PlMutex;
|
||||||
|
|
||||||
mod code_stats;
|
mod code_stats;
|
||||||
pub mod config;
|
pub mod config;
|
||||||
|
@ -127,11 +129,8 @@ pub struct Session {
|
||||||
/// Used by `-Z profile-queries` in `util::common`.
|
/// Used by `-Z profile-queries` in `util::common`.
|
||||||
pub profile_channel: Lock<Option<mpsc::Sender<ProfileQueriesMsg>>>,
|
pub profile_channel: Lock<Option<mpsc::Sender<ProfileQueriesMsg>>>,
|
||||||
|
|
||||||
/// Used by `-Z self-profile`.
|
/// Used by -Z self-profile
|
||||||
pub self_profiling_active: bool,
|
pub self_profiling: Option<Arc<PlMutex<SelfProfiler>>>,
|
||||||
|
|
||||||
/// Used by `-Z self-profile`.
|
|
||||||
pub self_profiling: Lock<SelfProfiler>,
|
|
||||||
|
|
||||||
/// Some measurements that are being gathered during compilation.
|
/// Some measurements that are being gathered during compilation.
|
||||||
pub perf_stats: PerfStats,
|
pub perf_stats: PerfStats,
|
||||||
|
@ -834,27 +833,23 @@ pub fn incr_comp_session_dir_opt(&self) -> Option<cell::Ref<'_, PathBuf>> {
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
#[cold]
|
#[cold]
|
||||||
fn profiler_active<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
fn profiler_active<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
||||||
let mut profiler = self.self_profiling.borrow_mut();
|
match &self.self_profiling {
|
||||||
f(&mut profiler);
|
None => bug!("profiler_active() called but there was no profiler active"),
|
||||||
|
Some(profiler) => {
|
||||||
|
let mut p = profiler.lock();
|
||||||
|
|
||||||
|
f(&mut p);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn profiler<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
pub fn profiler<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
||||||
if unlikely!(self.self_profiling_active) {
|
if unlikely!(self.self_profiling.is_some()) {
|
||||||
self.profiler_active(f)
|
self.profiler_active(f)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn print_profiler_results(&self) {
|
|
||||||
let mut profiler = self.self_profiling.borrow_mut();
|
|
||||||
profiler.print_results(&self.opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn save_json_results(&self) {
|
|
||||||
let profiler = self.self_profiling.borrow();
|
|
||||||
profiler.save_results(&self.opts);
|
|
||||||
}
|
|
||||||
|
|
||||||
pub fn print_perf_stats(&self) {
|
pub fn print_perf_stats(&self) {
|
||||||
println!(
|
println!(
|
||||||
"Total time spent computing symbol hashes: {}",
|
"Total time spent computing symbol hashes: {}",
|
||||||
|
@ -1136,6 +1131,13 @@ pub fn build_session_(
|
||||||
source_map: Lrc<source_map::SourceMap>,
|
source_map: Lrc<source_map::SourceMap>,
|
||||||
driver_lint_caps: FxHashMap<lint::LintId, lint::Level>,
|
driver_lint_caps: FxHashMap<lint::LintId, lint::Level>,
|
||||||
) -> Session {
|
) -> Session {
|
||||||
|
let self_profiling_active = sopts.debugging_opts.self_profile ||
|
||||||
|
sopts.debugging_opts.profile_json;
|
||||||
|
|
||||||
|
let self_profiler =
|
||||||
|
if self_profiling_active { Some(Arc::new(PlMutex::new(SelfProfiler::new()))) }
|
||||||
|
else { None };
|
||||||
|
|
||||||
let host_triple = TargetTriple::from_triple(config::host_triple());
|
let host_triple = TargetTriple::from_triple(config::host_triple());
|
||||||
let host = Target::search(&host_triple).unwrap_or_else(|e|
|
let host = Target::search(&host_triple).unwrap_or_else(|e|
|
||||||
span_diagnostic
|
span_diagnostic
|
||||||
|
@ -1185,9 +1187,6 @@ pub fn build_session_(
|
||||||
CguReuseTracker::new_disabled()
|
CguReuseTracker::new_disabled()
|
||||||
};
|
};
|
||||||
|
|
||||||
let self_profiling_active = sopts.debugging_opts.self_profile ||
|
|
||||||
sopts.debugging_opts.profile_json;
|
|
||||||
|
|
||||||
let sess = Session {
|
let sess = Session {
|
||||||
target: target_cfg,
|
target: target_cfg,
|
||||||
host,
|
host,
|
||||||
|
@ -1216,8 +1215,7 @@ pub fn build_session_(
|
||||||
imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())),
|
imported_macro_spans: OneThread::new(RefCell::new(FxHashMap::default())),
|
||||||
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
incr_comp_session: OneThread::new(RefCell::new(IncrCompSession::NotInitialized)),
|
||||||
cgu_reuse_tracker,
|
cgu_reuse_tracker,
|
||||||
self_profiling_active,
|
self_profiling: self_profiler,
|
||||||
self_profiling: Lock::new(SelfProfiler::new()),
|
|
||||||
profile_channel: Lock::new(None),
|
profile_channel: Lock::new(None),
|
||||||
perf_stats: PerfStats {
|
perf_stats: PerfStats {
|
||||||
symbol_hash_time: Lock::new(Duration::from_secs(0)),
|
symbol_hash_time: Lock::new(Duration::from_secs(0)),
|
||||||
|
|
|
@ -19,6 +19,7 @@ memmap = "0.6"
|
||||||
log = "0.4.5"
|
log = "0.4.5"
|
||||||
libc = "0.2.44"
|
libc = "0.2.44"
|
||||||
jobserver = "0.1.11"
|
jobserver = "0.1.11"
|
||||||
|
parking_lot = "0.7"
|
||||||
|
|
||||||
serialize = { path = "../libserialize" }
|
serialize = { path = "../libserialize" }
|
||||||
syntax = { path = "../libsyntax" }
|
syntax = { path = "../libsyntax" }
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
use rustc::hir::def_id::{CrateNum, LOCAL_CRATE};
|
||||||
use rustc::ty::TyCtxt;
|
use rustc::ty::TyCtxt;
|
||||||
use rustc::util::common::{time_depth, set_time_depth, print_time_passes_entry};
|
use rustc::util::common::{time_depth, set_time_depth, print_time_passes_entry};
|
||||||
|
use rustc::util::profiling::SelfProfiler;
|
||||||
use rustc_fs_util::link_or_copy;
|
use rustc_fs_util::link_or_copy;
|
||||||
use rustc_data_structures::svh::Svh;
|
use rustc_data_structures::svh::Svh;
|
||||||
use rustc_errors::{Handler, Level, DiagnosticBuilder, FatalError, DiagnosticId};
|
use rustc_errors::{Handler, Level, DiagnosticBuilder, FatalError, DiagnosticId};
|
||||||
|
@ -29,6 +30,7 @@
|
||||||
use syntax_pos::MultiSpan;
|
use syntax_pos::MultiSpan;
|
||||||
use syntax_pos::symbol::Symbol;
|
use syntax_pos::symbol::Symbol;
|
||||||
use jobserver::{Client, Acquired};
|
use jobserver::{Client, Acquired};
|
||||||
|
use parking_lot::Mutex as PlMutex;
|
||||||
|
|
||||||
use std::any::Any;
|
use std::any::Any;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
|
@ -201,6 +203,7 @@ pub struct CodegenContext<B: WriteBackendMethods> {
|
||||||
// Resources needed when running LTO
|
// Resources needed when running LTO
|
||||||
pub backend: B,
|
pub backend: B,
|
||||||
pub time_passes: bool,
|
pub time_passes: bool,
|
||||||
|
pub profiler: Option<Arc<PlMutex<SelfProfiler>>>,
|
||||||
pub lto: Lto,
|
pub lto: Lto,
|
||||||
pub no_landing_pads: bool,
|
pub no_landing_pads: bool,
|
||||||
pub save_temps: bool,
|
pub save_temps: bool,
|
||||||
|
@ -254,6 +257,26 @@ pub fn config(&self, kind: ModuleKind) -> &ModuleConfig {
|
||||||
ModuleKind::Allocator => &self.allocator_module_config,
|
ModuleKind::Allocator => &self.allocator_module_config,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline(never)]
|
||||||
|
#[cold]
|
||||||
|
fn profiler_active<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
||||||
|
match &self.profiler {
|
||||||
|
None => bug!("profiler_active() called but there was no profiler active"),
|
||||||
|
Some(profiler) => {
|
||||||
|
let mut p = profiler.lock();
|
||||||
|
|
||||||
|
f(&mut p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(always)]
|
||||||
|
pub fn profile<F: FnOnce(&mut SelfProfiler) -> ()>(&self, f: F) {
|
||||||
|
if unlikely!(self.profiler.is_some()) {
|
||||||
|
self.profiler_active(f)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn generate_lto_work<B: ExtraBackendMethods>(
|
fn generate_lto_work<B: ExtraBackendMethods>(
|
||||||
|
@ -1033,6 +1056,7 @@ fn start_executing_work<B: ExtraBackendMethods>(
|
||||||
save_temps: sess.opts.cg.save_temps,
|
save_temps: sess.opts.cg.save_temps,
|
||||||
opts: Arc::new(sess.opts.clone()),
|
opts: Arc::new(sess.opts.clone()),
|
||||||
time_passes: sess.time_passes(),
|
time_passes: sess.time_passes(),
|
||||||
|
profiler: sess.self_profiling.clone(),
|
||||||
exported_symbols,
|
exported_symbols,
|
||||||
plugin_passes: sess.plugin_llvm_passes.borrow().clone(),
|
plugin_passes: sess.plugin_llvm_passes.borrow().clone(),
|
||||||
remark: sess.opts.cg.remark.clone(),
|
remark: sess.opts.cg.remark.clone(),
|
||||||
|
|
|
@ -2,9 +2,11 @@
|
||||||
|
|
||||||
#![feature(box_patterns)]
|
#![feature(box_patterns)]
|
||||||
#![feature(box_syntax)]
|
#![feature(box_syntax)]
|
||||||
|
#![feature(core_intrinsics)]
|
||||||
#![feature(custom_attribute)]
|
#![feature(custom_attribute)]
|
||||||
#![feature(libc)]
|
#![feature(libc)]
|
||||||
#![feature(rustc_diagnostic_macros)]
|
#![feature(rustc_diagnostic_macros)]
|
||||||
|
#![feature(stmt_expr_attributes)]
|
||||||
#![feature(in_band_lifetimes)]
|
#![feature(in_band_lifetimes)]
|
||||||
#![feature(nll)]
|
#![feature(nll)]
|
||||||
#![allow(unused_attributes)]
|
#![allow(unused_attributes)]
|
||||||
|
@ -20,6 +22,7 @@
|
||||||
|
|
||||||
#[macro_use] extern crate log;
|
#[macro_use] extern crate log;
|
||||||
#[macro_use] extern crate rustc;
|
#[macro_use] extern crate rustc;
|
||||||
|
#[macro_use] extern crate rustc_data_structures;
|
||||||
#[macro_use] extern crate syntax;
|
#[macro_use] extern crate syntax;
|
||||||
|
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
|
|
@ -349,14 +349,6 @@ macro_rules! controller_entry_point {
|
||||||
sess.print_perf_stats();
|
sess.print_perf_stats();
|
||||||
}
|
}
|
||||||
|
|
||||||
if sess.opts.debugging_opts.self_profile {
|
|
||||||
sess.print_profiler_results();
|
|
||||||
}
|
|
||||||
|
|
||||||
if sess.opts.debugging_opts.profile_json {
|
|
||||||
sess.save_json_results();
|
|
||||||
}
|
|
||||||
|
|
||||||
controller_entry_point!(
|
controller_entry_point!(
|
||||||
compilation_done,
|
compilation_done,
|
||||||
sess,
|
sess,
|
||||||
|
|
|
@ -276,6 +276,15 @@ macro_rules! do_or_return {($expr: expr, $sess: expr) => {
|
||||||
&control)
|
&control)
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
if sess.opts.debugging_opts.self_profile {
|
||||||
|
sess.profiler(|p| p.print_results(&sess.opts));
|
||||||
|
}
|
||||||
|
|
||||||
|
if sess.opts.debugging_opts.profile_json {
|
||||||
|
sess.profiler(|p| p.save_results(&sess.opts));
|
||||||
|
}
|
||||||
|
|
||||||
(result, Some(sess))
|
(result, Some(sess))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue