@@ -12,6 +12,7 @@ use std::time::{Instant};
1212use rustc:: util:: common:: { ProfQDumpParams , ProfileQueriesMsg , profq_msg, profq_set_chan} ;
1313use std:: sync:: mpsc:: { Receiver } ;
1414use std:: io:: { Write } ;
15+ use rustc:: dep_graph:: { DepNode } ;
1516
1617pub mod trace;
1718
@@ -52,6 +53,8 @@ enum ParseState {
5253 HaveQuery ( trace:: Query , Instant ) ,
5354 // Have "time-begin" information from the last message (doit flag, and message)
5455 HaveTimeBegin ( String , Instant ) ,
56+ // Have "task-begin" information from the last message
57+ HaveTaskBegin ( DepNode , Instant ) ,
5558}
5659struct StackFrame {
5760 pub parse_st : ParseState ,
@@ -170,7 +173,7 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
170173 }
171174 }
172175 }
173- } ,
176+ } ,
174177
175178
176179 ( ParseState :: Clear ,
@@ -212,19 +215,44 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
212215 } ,
213216 ( _, ProfileQueriesMsg :: TimeEnd ) => { panic ! ( "parse error" ) }
214217
218+ ( ParseState :: Clear ,
219+ ProfileQueriesMsg :: TaskBegin ( key) ) => {
220+ let start = Instant :: now ( ) ;
221+ frame. parse_st = ParseState :: HaveTaskBegin ( key, start) ;
222+ stack. push ( frame) ;
223+ frame = StackFrame { parse_st : ParseState :: Clear , traces : vec ! [ ] } ;
224+ } ,
225+ ( _, ProfileQueriesMsg :: TaskBegin ( _) ) =>
226+ panic ! ( "parse error; did not expect time begin here" ) ,
215227
216- // Parse State: HaveTimeBegin -- for timing old
217- // passes in driver (outside of query model, but
218- // still in use)
219- ( ParseState :: HaveTimeBegin ( _, _) ,
220- ProfileQueriesMsg :: ProviderBegin ) => {
228+ ( ParseState :: Clear ,
229+ ProfileQueriesMsg :: TaskEnd ) => {
230+ let provider_extent = frame. traces ;
231+ match stack. pop ( ) {
232+ None =>
233+ panic ! ( "parse error: expected a stack frame; found an empty stack" ) ,
234+ Some ( old_frame) => {
235+ match old_frame. parse_st {
236+ ParseState :: HaveTaskBegin ( key, start) => {
237+ let duration = start. elapsed ( ) ;
238+ frame = StackFrame {
239+ parse_st : ParseState :: Clear ,
240+ traces : old_frame. traces
241+ } ;
242+ let trace = Rec {
243+ effect : Effect :: TaskBegin ( key) ,
244+ extent : Box :: new ( provider_extent) ,
245+ start : start,
246+ duration : duration,
247+ } ;
248+ frame. traces . push ( trace ) ;
249+ } ,
250+ _ => panic ! ( "internal parse error: malformed parse stack" )
251+ }
252+ }
253+ }
221254 } ,
222- ( ParseState :: HaveTimeBegin ( _, _) ,
223- ProfileQueriesMsg :: CacheHit ) => { unreachable ! ( ) } ,
224- ( ParseState :: HaveTimeBegin ( _, _) ,
225- ProfileQueriesMsg :: QueryBegin ( _, _) ) => { unreachable ! ( ) } ,
226- ( ParseState :: HaveTimeBegin ( _, _) ,
227- ProfileQueriesMsg :: ProviderEnd ) => { unreachable ! ( ) } ,
255+ ( _, ProfileQueriesMsg :: TaskEnd ) => { panic ! ( "parse error" ) }
228256
229257 // Parse State: HaveQuery
230258 ( ParseState :: HaveQuery ( q, start) ,
@@ -244,6 +272,11 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
244272 stack. push ( frame) ;
245273 frame = StackFrame { parse_st : ParseState :: Clear , traces : vec ! [ ] } ;
246274 } ,
275+
276+ //
277+ //
278+ // Parse errors:
279+
247280 ( ParseState :: HaveQuery ( q, _) ,
248281 ProfileQueriesMsg :: ProviderEnd ) => {
249282 panic ! ( "parse error: unexpected ProviderEnd; \
@@ -255,7 +288,15 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
255288 earlier query is unfinished: {:?} and now {:?}",
256289 q1, Query { span: span2, msg: querymsg2} )
257290 } ,
291+
292+ ( ParseState :: HaveTimeBegin ( _, _) , _) => {
293+ unreachable ! ( )
294+ } ,
295+ ( ParseState :: HaveTaskBegin ( _, _) , _) => {
296+ unreachable ! ( )
297+ } ,
258298 }
299+
259300 }
260301 }
261302 }
0 commit comments