diff --git a/src/librustc/session/config.rs b/src/librustc/session/config.rs index 44b6e03655773..6dae25dcd5dda 100644 --- a/src/librustc/session/config.rs +++ b/src/librustc/session/config.rs @@ -1447,7 +1447,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "don't interleave execution of lints; allows benchmarking individual lints"), crate_attr: Vec = (Vec::new(), parse_string_push, [TRACKED], "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"), self_profile_events: Option> = (None, parse_opt_comma_list, [UNTRACKED], "specifies which kinds of events get recorded by the self profiler"), diff --git a/src/librustc/session/mod.rs b/src/librustc/session/mod.rs index 3d8092f6e0070..d8d71035dbfa6 100644 --- a/src/librustc/session/mod.rs +++ b/src/librustc/session/mod.rs @@ -9,7 +9,7 @@ use crate::lint; use crate::lint::builtin::BuiltinLintDiagnostics; use crate::middle::allocator::AllocatorKind; 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::util::nodemap::{FxHashMap, FxHashSet}; use crate::util::common::{duration_to_secs_str, ErrorReported}; @@ -1137,8 +1137,18 @@ fn build_session_( driver_lint_caps: FxHashMap, ) -> Session { let self_profiler = - if sopts.debugging_opts.self_profile { - let profiler = SelfProfiler::new(&sopts.debugging_opts.self_profile_events); + if let PgoGenerate::Enabled(ref d) = sopts.debugging_opts.self_profile { + 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 { Ok(profiler) => { crate::ty::query::QueryName::register_with_profiler(&profiler); diff --git a/src/librustc/util/profiling.rs b/src/librustc/util/profiling.rs index 585970e64df8d..8624856a4f55c 100644 --- a/src/librustc/util/profiling.rs +++ b/src/librustc/util/profiling.rs @@ -1,6 +1,8 @@ use std::borrow::Cow; use std::error::Error; +use std::fs; use std::mem::{self, Discriminant}; +use std::path::Path; use std::process; use std::thread::ThreadId; use std::u32; @@ -71,10 +73,17 @@ pub struct SelfProfiler { } impl SelfProfiler { - pub fn new(event_filters: &Option>) -> Result> { - let filename = format!("pid-{}.rustc_profile", process::id()); - let path = std::path::Path::new(&filename); - let profiler = Profiler::new(path)?; + pub fn new( + output_directory: &Path, + crate_name: Option<&str>, + event_filters: &Option> + ) -> Result> { + 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 generic_activity_event_kind = profiler.alloc_string("GenericActivity");