@@ -12,6 +12,7 @@ use crate::util::style;
12
12
use crate :: util:: { CargoResult , GlobalContext } ;
13
13
use anyhow:: Context as _;
14
14
use cargo_util:: paths;
15
+ use indexmap:: IndexMap ;
15
16
use std:: collections:: HashMap ;
16
17
use std:: io:: { BufWriter , Write } ;
17
18
use std:: thread:: available_parallelism;
@@ -64,8 +65,9 @@ pub struct Timings<'gctx> {
64
65
cpu_usage : Vec < ( f64 , f64 ) > ,
65
66
}
66
67
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 {
69
71
/// Start of the section, as an offset in seconds from `UnitTime::start`.
70
72
start : f64 ,
71
73
/// End of the section, as an offset in seconds from `UnitTime::start`.
@@ -88,8 +90,9 @@ struct UnitTime {
88
90
unlocked_units : Vec < Unit > ,
89
91
/// Same as `unlocked_units`, but unlocked by rmeta.
90
92
unlocked_rmeta_units : Vec < Unit > ,
91
- /// Individual compilation section durations, gathered from `--json=timings`.
92
- sections : HashMap < String , TimingSection > ,
93
+ /// IndexMap is used to keep original insertion order, we want to be able to tell which
94
+ /// sections were started in which order.
95
+ sections : IndexMap < String , CompilationSection > ,
93
96
}
94
97
95
98
/// Periodic concurrency tracking information.
@@ -238,6 +241,7 @@ impl<'gctx> Timings<'gctx> {
238
241
mode : unit_time. unit . mode ,
239
242
duration : unit_time. duration ,
240
243
rmeta_time : unit_time. rmeta_time ,
244
+ sections : unit_time. sections . clone ( ) . into_iter ( ) . collect ( ) ,
241
245
}
242
246
. to_json_string ( ) ;
243
247
crate :: drop_println!( self . gctx, "{}" , msg) ;
@@ -616,20 +620,20 @@ impl UnitTime {
616
620
. sections
617
621
. insert (
618
622
name. to_string ( ) ,
619
- TimingSection {
623
+ CompilationSection {
620
624
start : now - self . start ,
621
625
end : None ,
622
626
} ,
623
627
)
624
628
. is_some ( )
625
629
{
626
- warn ! ( "Compilation section {name} started more than once" ) ;
630
+ warn ! ( "compilation section {name} started more than once" ) ;
627
631
}
628
632
}
629
633
630
634
fn end_section ( & mut self , name : & str , now : f64 ) {
631
635
let Some ( section) = self . sections . get_mut ( name) else {
632
- warn ! ( "Compilation section {name} ended, but it has no start recorded" ) ;
636
+ warn ! ( "compilation section {name} ended, but it has no start recorded" ) ;
633
637
return ;
634
638
} ;
635
639
section. end = Some ( now - self . start ) ;
0 commit comments