@@ -12,6 +12,7 @@ use crate::util::style;
1212use crate :: util:: { CargoResult , GlobalContext } ;
1313use anyhow:: Context as _;
1414use cargo_util:: paths;
15+ use indexmap:: IndexMap ;
1516use std:: collections:: HashMap ;
1617use std:: io:: { BufWriter , Write } ;
1718use std:: thread:: available_parallelism;
@@ -64,8 +65,9 @@ pub struct Timings<'gctx> {
6465 cpu_usage : Vec < ( f64 , f64 ) > ,
6566}
6667
67- /// Section of compilation.
68- struct TimingSection {
68+ /// Section of compilation (e.g. frontend, backend, linking).
69+ #[ derive( Copy , Clone , serde:: Serialize ) ]
70+ pub struct CompilationSection {
6971 /// Start of the section, as an offset in seconds from `UnitTime::start`.
7072 start : f64 ,
7173 /// End of the section, as an offset in seconds from `UnitTime::start`.
@@ -89,7 +91,11 @@ struct UnitTime {
8991 /// Same as `unlocked_units`, but unlocked by rmeta.
9092 unlocked_rmeta_units : Vec < Unit > ,
9193 /// Individual compilation section durations, gathered from `--json=timings`.
92- sections : HashMap < String , TimingSection > ,
94+ sections : HashMap < String , CompilationSection > ,
95+ /// IndexMap is used to keep original insertion order, we want to be able to tell which
96+ /// sections were started in which order.
97+ sections : IndexMap < String , CompilationSection > ,
98+ }
9399}
94100
95101/// Periodic concurrency tracking information.
@@ -238,6 +244,7 @@ impl<'gctx> Timings<'gctx> {
238244 mode : unit_time. unit . mode ,
239245 duration : unit_time. duration ,
240246 rmeta_time : unit_time. rmeta_time ,
247+ sections : unit_time. sections . clone ( ) ,
241248 }
242249 . to_json_string ( ) ;
243250 crate :: drop_println!( self . gctx, "{}" , msg) ;
@@ -616,20 +623,20 @@ impl UnitTime {
616623 . sections
617624 . insert (
618625 name. to_string ( ) ,
619- TimingSection {
626+ CompilationSection {
620627 start : now - self . start ,
621628 end : None ,
622629 } ,
623630 )
624631 . is_some ( )
625632 {
626- warn ! ( "Compilation section {name} started more than once" ) ;
633+ warn ! ( "compilation section {name} started more than once" ) ;
627634 }
628635 }
629636
630637 fn end_section ( & mut self , name : & str , now : f64 ) {
631638 let Some ( section) = self . sections . get_mut ( name) else {
632- warn ! ( "Compilation section {name} ended, but it has no start recorded" ) ;
639+ warn ! ( "compilation section {name} ended, but it has no start recorded" ) ;
633640 return ;
634641 } ;
635642 section. end = Some ( now - self . start ) ;
0 commit comments