mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-01 15:50:05 +03:00
5da3de7527
This is done in order to simplify the filename overhaul and those places don't need to the embeddable path anyway.
65 lines
2.5 KiB
Rust
65 lines
2.5 KiB
Rust
use std::fs::OpenOptions;
|
|
use std::io::prelude::*;
|
|
|
|
use rustc_middle::ty::{self, ClosureSizeProfileData, Instance, TyCtxt};
|
|
|
|
/// For a given closure, writes out the data for the profiling the impact of RFC 2229 on
|
|
/// closure size into a CSV.
|
|
///
|
|
/// During the same compile all closures dump the information in the same file
|
|
/// "closure_profile_XXXXX.csv", which is created in the directory where the compiler is invoked.
|
|
pub(crate) fn dump_closure_profile<'tcx>(tcx: TyCtxt<'tcx>, closure_instance: Instance<'tcx>) {
|
|
let Ok(mut file) = OpenOptions::new()
|
|
.create(true)
|
|
.append(true)
|
|
.open(&format!("closure_profile_{}.csv", std::process::id()))
|
|
else {
|
|
eprintln!("Couldn't open file for writing closure profile");
|
|
return;
|
|
};
|
|
|
|
let closure_def_id = closure_instance.def_id().expect_local();
|
|
let typeck_results = tcx.typeck(closure_def_id);
|
|
|
|
if typeck_results.closure_size_eval.contains_key(&closure_def_id) {
|
|
let typing_env = ty::TypingEnv::fully_monomorphized();
|
|
|
|
let ClosureSizeProfileData { before_feature_tys, after_feature_tys } =
|
|
typeck_results.closure_size_eval[&closure_def_id];
|
|
|
|
let before_feature_tys = tcx.instantiate_and_normalize_erasing_regions(
|
|
closure_instance.args,
|
|
typing_env,
|
|
ty::EarlyBinder::bind(before_feature_tys),
|
|
);
|
|
let after_feature_tys = tcx.instantiate_and_normalize_erasing_regions(
|
|
closure_instance.args,
|
|
typing_env,
|
|
ty::EarlyBinder::bind(after_feature_tys),
|
|
);
|
|
|
|
let new_size = tcx
|
|
.layout_of(typing_env.as_query_input(after_feature_tys))
|
|
.map(|l| format!("{:?}", l.size.bytes()))
|
|
.unwrap_or_else(|e| format!("Failed {e:?}"));
|
|
|
|
let old_size = tcx
|
|
.layout_of(typing_env.as_query_input(before_feature_tys))
|
|
.map(|l| format!("{:?}", l.size.bytes()))
|
|
.unwrap_or_else(|e| format!("Failed {e:?}"));
|
|
|
|
let closure_span = tcx.def_span(closure_def_id);
|
|
let src_file = tcx.sess.source_map().span_to_diagnostic_string(closure_span);
|
|
let line_nos = tcx
|
|
.sess
|
|
.source_map()
|
|
.span_to_lines(closure_span)
|
|
.map(|l| format!("{:?} {:?}", l.lines.first(), l.lines.last()))
|
|
.unwrap_or_else(|e| format!("{e:?}"));
|
|
|
|
if let Err(e) = writeln!(file, "{}, {}, {}, {:?}", old_size, new_size, src_file, line_nos) {
|
|
eprintln!("Error writing to file {e}")
|
|
}
|
|
}
|
|
}
|