Skip to content

Commit ba20d77

Browse files
authored
Rollup merge of #145306 - Stypox:tracing-misc, r=RalfJung
Add tracing to various miscellaneous functions This PR adds tracing to: - `ty.fn_sig()`. There is only one place where `fn_sig` is called for real within `rustc_const_eval`. There are three other places where it's called, but one is inside `ConstCx::fn_sig` (which does not seem to be used anywhere), another is under `if cfg!(debug_assertions)`, and the last is within `call_main` and thus gets called only once. - the two possible things `find_mir_or_eval_fn` can do: "emulate_foreign_item" and "load_mir" - all calls to `Const.eval()` within the Miri or the `rustc_const_eval` codebase. - a separate commit also fixes the style of some tracing macros Those are all quite long-lived operations, that in total make up for 6-7% of the total time spent in the program. I found out about them by looking for long periods of time that were previously not traced at all, using this SQL query in ui.perfetto.dev: ```sql with ordered as (select s1.*, row_number() over (order by s1.ts) as rn from slices as s1 where s1.parent_id is null and s1.dur > 0 and s1.name != "frame" and s1.name != "step" and s1.name != "backtrace") select a.ts+a.dur as ts, b.ts-a.ts-a.dur as dur, a.id, a.track_id, a.category, a.depth, a.stack_id, a.parent_stack_id, a.parent_id, a.arg_set_id, a.thread_ts, a.thread_instruction_count, a.thread_instruction_delta, a.cat, a.slice_id, "empty" as name from ordered as a inner join ordered as b on a.rn=b.rn-1 /*where b.ts-a.ts-a.dur > 5000*/ order by b.ts-a.ts-a.dur desc ``` <details> <summary>How the table was obtained</summary> The above image was obtained in ui.perfetto.dev with the following SQL query after obtaining a trace file by running Miri on the following Rust code with `n=100`. ```sql select "TOTAL PROGRAM DURATION" as name, count(*), max(ts + dur) as "sum(dur)", 100.0 as "%", null as "min(dur)", null as "max(dur)", null as "avg(dur)", null as "stddev(dur)" from slices union select "TOTAL OVER ALL SPANS (excluding events)" as name, count(*), sum(dur), cast(cast(sum(dur) as float) / (select max(ts + dur) from slices) * 1000 as int) / 10.0 as "%", min(dur), max(dur), cast(avg(dur) as int) as "avg(dur)", cast(sqrt(avg(dur*dur)-avg(dur)*avg(dur)) as int) as "stddev(dur)" from slices where parent_id is null and name != "frame" and name != "step" and dur > 0 union select name, count(*), sum(dur), cast(cast(sum(dur) as float) / (select max(ts + dur) from slices) * 1000 as int) / 10.0 as "%", min(dur), max(dur), cast(avg(dur) as int) as "avg(dur)", cast(sqrt(avg(dur*dur)-avg(dur)*avg(dur)) as int) as "stddev(dur)" from slices where parent_id is null and name != "frame" and name != "step" group by name order by sum(dur) desc, count(*) desc ``` ```rust fn main() { let n: usize = std::env::args().nth(1).unwrap().parse().unwrap(); let mut v = (0..n).into_iter().collect::<Vec<_>>(); for i in &mut v { *i += 1; } } ``` </details> <img width="1689" height="317" alt="image" src="https://github.com/user-attachments/assets/ee2c81f5-d74a-4da5-b4b6-ab2770175b14" />
2 parents 0b378a7 + dc72692 commit ba20d77

File tree

5 files changed

+15
-5
lines changed

5 files changed

+15
-5
lines changed

compiler/rustc_const_eval/src/interpret/eval_context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -325,8 +325,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
325325
let _trace = enter_trace_span!(
326326
M,
327327
"instantiate_from_frame_and_normalize_erasing_regions",
328-
"{}",
329-
frame.instance
328+
%frame.instance
330329
);
331330
frame
332331
.instance
@@ -583,6 +582,7 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
583582
span: Span,
584583
layout: Option<TyAndLayout<'tcx>>,
585584
) -> InterpResult<'tcx, OpTy<'tcx, M::Provenance>> {
585+
let _trace = enter_trace_span!(M, const_eval::eval_mir_constant, ?val);
586586
let const_val = val.eval(*self.tcx, self.typing_env, span).map_err(|err| {
587587
if M::ALL_CONSTS_ARE_PRECHECKED {
588588
match err {

compiler/rustc_const_eval/src/interpret/stack.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ use super::{
2020
MemoryKind, Operand, PlaceTy, Pointer, Provenance, ReturnAction, Scalar, from_known_layout,
2121
interp_ok, throw_ub, throw_unsup,
2222
};
23-
use crate::errors;
23+
use crate::{enter_trace_span, errors};
2424

2525
// The Phantomdata exists to prevent this type from being `Send`. If it were sent across a thread
2626
// boundary and dropped in the other thread, it would exit the span in the other thread.
@@ -386,6 +386,9 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
386386

387387
// Make sure all the constants required by this frame evaluate successfully (post-monomorphization check).
388388
for &const_ in body.required_consts() {
389+
// We can't use `eval_mir_constant` here as that assumes that all required consts have
390+
// already been checked, so we need a separate tracing call.
391+
let _trace = enter_trace_span!(M, const_eval::required_consts, ?const_.const_);
389392
let c =
390393
self.instantiate_from_current_frame_and_normalize_erasing_regions(const_.const_)?;
391394
c.eval(*self.tcx, self.typing_env, const_.span).map_err(|err| {

compiler/rustc_const_eval/src/interpret/step.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -436,7 +436,10 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
436436
.map(|arg| self.eval_fn_call_argument(&arg.node))
437437
.collect::<InterpResult<'tcx, Vec<_>>>()?;
438438

439-
let fn_sig_binder = func.layout.ty.fn_sig(*self.tcx);
439+
let fn_sig_binder = {
440+
let _trace = enter_trace_span!(M, "fn_sig", ty = ?func.layout.ty.kind());
441+
func.layout.ty.fn_sig(*self.tcx)
442+
};
440443
let fn_sig = self.tcx.normalize_erasing_late_bound_regions(self.typing_env, fn_sig_binder);
441444
let extra_args = &args[fn_sig.inputs().len()..];
442445
let extra_args =

compiler/rustc_const_eval/src/interpret/validity.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1418,7 +1418,9 @@ impl<'tcx, M: Machine<'tcx>> InterpCx<'tcx, M> {
14181418
let _trace = enter_trace_span!(
14191419
M,
14201420
"validate_operand",
1421-
"recursive={recursive}, reset_provenance_and_padding={reset_provenance_and_padding}, val={val:?}"
1421+
recursive,
1422+
reset_provenance_and_padding,
1423+
?val,
14221424
);
14231425

14241426
// Note that we *could* actually be in CTFE here with `-Zextra-const-ub-checks`, but it's

src/tools/miri/src/machine.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1111,6 +1111,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
11111111
) -> InterpResult<'tcx, Option<(&'tcx mir::Body<'tcx>, ty::Instance<'tcx>)>> {
11121112
// For foreign items, try to see if we can emulate them.
11131113
if ecx.tcx.is_foreign_item(instance.def_id()) {
1114+
let _trace = enter_trace_span!("emulate_foreign_item");
11141115
// An external function call that does not have a MIR body. We either find MIR elsewhere
11151116
// or emulate its effect.
11161117
// This will be Ok(None) if we're emulating the intrinsic entirely within Miri (no need
@@ -1123,6 +1124,7 @@ impl<'tcx> Machine<'tcx> for MiriMachine<'tcx> {
11231124
}
11241125

11251126
// Otherwise, load the MIR.
1127+
let _trace = enter_trace_span!("load_mir");
11261128
interp_ok(Some((ecx.load_mir(instance.def, None)?, instance)))
11271129
}
11281130

0 commit comments

Comments
 (0)