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 crate fn dump_closure_profile(tcx
: TyCtxt
<'tcx
>, closure_instance
: Instance
<'tcx
>) {
11 let mut file
= if let Ok(file
) = OpenOptions
::new()
14 .open(&format
!("closure_profile_{}.csv", std
::process
::id()))
18 eprintln
!("Cound't open file for writing closure profile");
22 let closure_def_id
= closure_instance
.def_id();
23 let typeck_results
= tcx
.typeck(closure_def_id
.expect_local());
25 if typeck_results
.closure_size_eval
.contains_key(&closure_def_id
) {
26 let param_env
= ty
::ParamEnv
::reveal_all();
28 let ClosureSizeProfileData { before_feature_tys, after_feature_tys }
=
29 typeck_results
.closure_size_eval
[&closure_def_id
];
31 let before_feature_tys
= tcx
.subst_and_normalize_erasing_regions(
32 closure_instance
.substs
,
36 let after_feature_tys
= tcx
.subst_and_normalize_erasing_regions(
37 closure_instance
.substs
,
43 .layout_of(param_env
.and(after_feature_tys
))
44 .map(|l
| format
!("{:?}", l
.size
.bytes()))
45 .unwrap_or_else(|e
| format
!("Failed {:?}", e
));
48 .layout_of(param_env
.and(before_feature_tys
))
49 .map(|l
| format
!("{:?}", l
.size
.bytes()))
50 .unwrap_or_else(|e
| format
!("Failed {:?}", e
));
52 let closure_hir_id
= tcx
.hir().local_def_id_to_hir_id(closure_def_id
.expect_local());
53 let closure_span
= tcx
.hir().span(closure_hir_id
);
54 let src_file
= tcx
.sess
.source_map().span_to_filename(closure_span
);
58 .span_to_lines(closure_span
)
59 .map(|l
| format
!("{:?} {:?}", l
.lines
.first(), l
.lines
.last()))
60 .unwrap_or_else(|e
| format
!("{:?}", e
));
62 if let Err(e
) = writeln
!(
67 src_file
.prefer_local(),
70 eprintln
!("Error writting to file {}", e
.to_string())