Skip to content

Commit

Permalink
Allow to specify profiling data output directory as -Zself-profile ar…
Browse files Browse the repository at this point in the history
…gument.
  • Loading branch information
michaelwoerister committed May 28, 2019
1 parent 837b72c commit 53f1c38
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 8 deletions.
2 changes: 1 addition & 1 deletion src/librustc/session/config.rs
Expand Up @@ -1447,7 +1447,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options,
"don't interleave execution of lints; allows benchmarking individual lints"),
crate_attr: Vec<String> = (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<Vec<String>> = (None, parse_opt_comma_list, [UNTRACKED],
"specifies which kinds of events get recorded by the self profiler"),
Expand Down
16 changes: 13 additions & 3 deletions src/librustc/session/mod.rs
Expand Up @@ -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};
Expand Down Expand Up @@ -1137,8 +1137,18 @@ fn build_session_(
driver_lint_caps: FxHashMap<lint::LintId, lint::Level>,
) -> 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);
Expand Down
17 changes: 13 additions & 4 deletions 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;
Expand Down Expand Up @@ -71,10 +73,17 @@ pub struct SelfProfiler {
}

impl SelfProfiler {
pub fn new(event_filters: &Option<Vec<String>>) -> Result<SelfProfiler, Box<dyn Error>> {
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<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 generic_activity_event_kind = profiler.alloc_string("GenericActivity");
Expand Down

0 comments on commit 53f1c38

Please sign in to comment.