1 use rustc_middle::ty::{self, ClosureSizeProfileData, Instance, TyCtxt};
2 use std::fs::OpenOptions;
3 use std::io::prelude::*;
5 /// For a given closure, writes out the data for the profiling the impact of RFC 2229 on
6 /// closure size into a CSV.
8 /// During the same compile all closures dump the information in the same file
9 /// "closure_profile_XXXXX.csv", which is created in the directory where the compiler is invoked.
10 pub(crate) fn dump_closure_profile<'tcx>(tcx: TyCtxt<'tcx>, closure_instance: Instance<'tcx>) {
11 let Ok(mut file) = OpenOptions::new()
14 .open(&format!("closure_profile_{}.csv", std::process::id()))
16 eprintln!("Cound't open file for writing closure profile");
20 let closure_def_id = closure_instance.def_id().expect_local();
21 let typeck_results = tcx.typeck(closure_def_id);
23 if typeck_results.closure_size_eval.contains_key(&closure_def_id) {
24 let param_env = ty::ParamEnv::reveal_all();
26 let ClosureSizeProfileData { before_feature_tys, after_feature_tys } =
27 typeck_results.closure_size_eval[&closure_def_id];
29 let before_feature_tys = tcx.subst_and_normalize_erasing_regions(
30 closure_instance.substs,
34 let after_feature_tys = tcx.subst_and_normalize_erasing_regions(
35 closure_instance.substs,
41 .layout_of(param_env.and(after_feature_tys))
42 .map(|l| format!("{:?}", l.size.bytes()))
43 .unwrap_or_else(|e| format!("Failed {:?}", e));
46 .layout_of(param_env.and(before_feature_tys))
47 .map(|l| format!("{:?}", l.size.bytes()))
48 .unwrap_or_else(|e| format!("Failed {:?}", e));
50 let closure_span = tcx.def_span(closure_def_id);
51 let src_file = tcx.sess.source_map().span_to_filename(closure_span);
55 .span_to_lines(closure_span)
56 .map(|l| format!("{:?} {:?}", l.lines.first(), l.lines.last()))
57 .unwrap_or_else(|e| format!("{:?}", e));
59 if let Err(e) = writeln!(
64 src_file.prefer_local(),
67 eprintln!("Error writing to file {}", e)