1
Fork 0

Allow to specify profiling data output directory as -Zself-profile argument.

This commit is contained in:
Michael Woerister 2019-05-24 16:36:44 +02:00
parent 837b72c805
commit 53f1c38734
3 changed files with 27 additions and 8 deletions

View file

@ -1447,7 +1447,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
"don't interleave execution of lints; allows benchmarking individual lints"), "don't interleave execution of lints; allows benchmarking individual lints"),
crate_attr: Vec<String> = (Vec::new(), parse_string_push, [TRACKED], crate_attr: Vec<String> = (Vec::new(), parse_string_push, [TRACKED],
"inject the given attribute in the crate"), "inject the given attribute in the crate"),
self_profile: bool = (false, parse_bool, [UNTRACKED], self_profile: PgoGenerate = (PgoGenerate::Disabled, parse_pgo_generate, [UNTRACKED],
"run the self profiler and output the raw event data"), "run the self profiler and output the raw event data"),
self_profile_events: Option<Vec<String>> = (None, parse_opt_comma_list, [UNTRACKED], self_profile_events: Option<Vec<String>> = (None, parse_opt_comma_list, [UNTRACKED],
"specifies which kinds of events get recorded by the self profiler"), "specifies which kinds of events get recorded by the self profiler"),

View file

@ -9,7 +9,7 @@ use crate::lint;
use crate::lint::builtin::BuiltinLintDiagnostics; use crate::lint::builtin::BuiltinLintDiagnostics;
use crate::middle::allocator::AllocatorKind; use crate::middle::allocator::AllocatorKind;
use crate::middle::dependency_format; use crate::middle::dependency_format;
use crate::session::config::OutputType; use crate::session::config::{OutputType, PgoGenerate};
use crate::session::search_paths::{PathKind, SearchPath}; use crate::session::search_paths::{PathKind, SearchPath};
use crate::util::nodemap::{FxHashMap, FxHashSet}; use crate::util::nodemap::{FxHashMap, FxHashSet};
use crate::util::common::{duration_to_secs_str, ErrorReported}; use crate::util::common::{duration_to_secs_str, ErrorReported};
@ -1137,8 +1137,18 @@ fn build_session_(
driver_lint_caps: FxHashMap<lint::LintId, lint::Level>, driver_lint_caps: FxHashMap<lint::LintId, lint::Level>,
) -> Session { ) -> Session {
let self_profiler = let self_profiler =
if sopts.debugging_opts.self_profile { if let PgoGenerate::Enabled(ref d) = sopts.debugging_opts.self_profile {
let profiler = SelfProfiler::new(&sopts.debugging_opts.self_profile_events); let directory = if let Some(ref directory) = d {
directory
} else {
std::path::Path::new(".")
};
let profiler = SelfProfiler::new(
directory,
sopts.crate_name.as_ref().map(|s| &s[..]),
&sopts.debugging_opts.self_profile_events
);
match profiler { match profiler {
Ok(profiler) => { Ok(profiler) => {
crate::ty::query::QueryName::register_with_profiler(&profiler); crate::ty::query::QueryName::register_with_profiler(&profiler);

View file

@ -1,6 +1,8 @@
use std::borrow::Cow; use std::borrow::Cow;
use std::error::Error; use std::error::Error;
use std::fs;
use std::mem::{self, Discriminant}; use std::mem::{self, Discriminant};
use std::path::Path;
use std::process; use std::process;
use std::thread::ThreadId; use std::thread::ThreadId;
use std::u32; use std::u32;
@ -71,10 +73,17 @@ pub struct SelfProfiler {
} }
impl SelfProfiler { impl SelfProfiler {
pub fn new(event_filters: &Option<Vec<String>>) -> Result<SelfProfiler, Box<dyn Error>> { pub fn new(
let filename = format!("pid-{}.rustc_profile", process::id()); output_directory: &Path,
let path = std::path::Path::new(&filename); crate_name: Option<&str>,
let profiler = Profiler::new(path)?; event_filters: &Option<Vec<String>>
) -> Result<SelfProfiler, Box<dyn Error>> {
fs::create_dir_all(output_directory)?;
let crate_name = crate_name.unwrap_or("unknown-crate");
let filename = format!("{}-{}.rustc_profile", crate_name, process::id());
let path = output_directory.join(&filename);
let profiler = Profiler::new(&path)?;
let query_event_kind = profiler.alloc_string("Query"); let query_event_kind = profiler.alloc_string("Query");
let generic_activity_event_kind = profiler.alloc_string("GenericActivity"); let generic_activity_event_kind = profiler.alloc_string("GenericActivity");