Auto merge of #95739 - lqd:proc-macro-expansions, r=wesleywiser
self-profiler: record spans for proc-macro expansions This PR is a follow-up to #95473, using the arg recorder feature from #95689: - it adds support code to easily record spans in the event's arguments, when using `generic_activity_with_arg_recorder`. - uses that to record the spans where proc-macro expansions happen in addition to their name. As for the other 2 PRs, the goal here is to provide visibility into proc-macro expansion performance, so that users can diagnose which uses of proc-macros in their code could be causing compile time issues. Some areas where I'd love feedback: - [x] the API and names: the `SpannedEventArgRecorder` trait and its method, much like #95689 had the same question about the `EventArgRecorder` naming - [x] we don't currently have a way to record the names of the event arguments, so should `record_arg_spanned` record the span as "location: {}" or similar ?
This commit is contained in:
commit
c2b4c2dffa
@ -9,6 +9,7 @@ use rustc_data_structures::sync::Lrc;
|
||||
use rustc_errors::ErrorGuaranteed;
|
||||
use rustc_parse::nt_to_tokenstream;
|
||||
use rustc_parse::parser::ForceCollect;
|
||||
use rustc_span::profiling::SpannedEventArgRecorder;
|
||||
use rustc_span::{Span, DUMMY_SP};
|
||||
|
||||
const EXEC_STRATEGY: pm::bridge::server::SameThread = pm::bridge::server::SameThread;
|
||||
@ -25,7 +26,10 @@ impl base::ProcMacro for BangProcMacro {
|
||||
input: TokenStream,
|
||||
) -> Result<TokenStream, ErrorGuaranteed> {
|
||||
let _timer =
|
||||
ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr());
|
||||
ecx.sess.prof.generic_activity_with_arg_recorder("expand_proc_macro", |recorder| {
|
||||
recorder.record_arg_with_span(ecx.expansion_descr(), span);
|
||||
});
|
||||
|
||||
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
|
||||
let server = proc_macro_server::Rustc::new(ecx);
|
||||
self.client.run(&EXEC_STRATEGY, server, input, proc_macro_backtrace).map_err(|e| {
|
||||
@ -51,7 +55,10 @@ impl base::AttrProcMacro for AttrProcMacro {
|
||||
annotated: TokenStream,
|
||||
) -> Result<TokenStream, ErrorGuaranteed> {
|
||||
let _timer =
|
||||
ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr());
|
||||
ecx.sess.prof.generic_activity_with_arg_recorder("expand_proc_macro", |recorder| {
|
||||
recorder.record_arg_with_span(ecx.expansion_descr(), span);
|
||||
});
|
||||
|
||||
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
|
||||
let server = proc_macro_server::Rustc::new(ecx);
|
||||
self.client
|
||||
@ -103,7 +110,9 @@ impl MultiItemModifier for ProcMacroDerive {
|
||||
|
||||
let stream = {
|
||||
let _timer =
|
||||
ecx.sess.prof.generic_activity_with_arg("expand_proc_macro", ecx.expansion_descr());
|
||||
ecx.sess.prof.generic_activity_with_arg_recorder("expand_proc_macro", |recorder| {
|
||||
recorder.record_arg_with_span(ecx.expansion_descr(), span);
|
||||
});
|
||||
let proc_macro_backtrace = ecx.ecfg.proc_macro_backtrace;
|
||||
let server = proc_macro_server::Rustc::new(ecx);
|
||||
match self.client.run(&EXEC_STRATEGY, server, input, proc_macro_backtrace) {
|
||||
|
@ -59,6 +59,8 @@ pub use symbol::{sym, Symbol};
|
||||
mod analyze_source_file;
|
||||
pub mod fatal_error;
|
||||
|
||||
pub mod profiling;
|
||||
|
||||
use rustc_data_structures::stable_hasher::{HashStable, StableHasher};
|
||||
use rustc_data_structures::sync::{Lock, Lrc};
|
||||
|
||||
|
35
compiler/rustc_span/src/profiling.rs
Normal file
35
compiler/rustc_span/src/profiling.rs
Normal file
@ -0,0 +1,35 @@
|
||||
use std::borrow::Borrow;
|
||||
|
||||
use rustc_data_structures::profiling::EventArgRecorder;
|
||||
|
||||
/// Extension trait for self-profiling purposes: allows to record spans within a generic activity's
|
||||
/// event arguments.
|
||||
pub trait SpannedEventArgRecorder {
|
||||
/// Records the following event arguments within the current generic activity being profiled:
|
||||
/// - the provided `event_arg`
|
||||
/// - a string representation of the provided `span`
|
||||
///
|
||||
/// Note: when self-profiling with costly event arguments, at least one argument
|
||||
/// needs to be recorded. A panic will be triggered if that doesn't happen.
|
||||
fn record_arg_with_span<A>(&mut self, event_arg: A, span: crate::Span)
|
||||
where
|
||||
A: Borrow<str> + Into<String>;
|
||||
}
|
||||
|
||||
impl SpannedEventArgRecorder for EventArgRecorder<'_> {
|
||||
fn record_arg_with_span<A>(&mut self, event_arg: A, span: crate::Span)
|
||||
where
|
||||
A: Borrow<str> + Into<String>,
|
||||
{
|
||||
self.record_arg(event_arg);
|
||||
|
||||
let span_arg = crate::with_session_globals(|session_globals| {
|
||||
if let Some(source_map) = &*session_globals.source_map.borrow() {
|
||||
source_map.span_to_embeddable_string(span)
|
||||
} else {
|
||||
format!("{:?}", span)
|
||||
}
|
||||
});
|
||||
self.record_arg(span_arg);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user