@@ -12,6 +12,7 @@ use std::time::{Instant};
12
12
use rustc:: util:: common:: { ProfQDumpParams , ProfileQueriesMsg , profq_msg, profq_set_chan} ;
13
13
use std:: sync:: mpsc:: { Receiver } ;
14
14
use std:: io:: { Write } ;
15
+ use rustc:: dep_graph:: { DepNode } ;
15
16
16
17
pub mod trace;
17
18
@@ -52,6 +53,8 @@ enum ParseState {
52
53
HaveQuery ( trace:: Query , Instant ) ,
53
54
// Have "time-begin" information from the last message (doit flag, and message)
54
55
HaveTimeBegin ( String , Instant ) ,
56
+ // Have "task-begin" information from the last message
57
+ HaveTaskBegin ( DepNode , Instant ) ,
55
58
}
56
59
struct StackFrame {
57
60
pub parse_st : ParseState ,
@@ -170,7 +173,7 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
170
173
}
171
174
}
172
175
}
173
- } ,
176
+ } ,
174
177
175
178
176
179
( ParseState :: Clear ,
@@ -212,19 +215,44 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
212
215
} ,
213
216
( _, ProfileQueriesMsg :: TimeEnd ) => { panic ! ( "parse error" ) }
214
217
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" ) ,
215
227
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
+ }
221
254
} ,
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" ) }
228
256
229
257
// Parse State: HaveQuery
230
258
( ParseState :: HaveQuery ( q, start) ,
@@ -244,6 +272,11 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
244
272
stack. push ( frame) ;
245
273
frame = StackFrame { parse_st : ParseState :: Clear , traces : vec ! [ ] } ;
246
274
} ,
275
+
276
+ //
277
+ //
278
+ // Parse errors:
279
+
247
280
( ParseState :: HaveQuery ( q, _) ,
248
281
ProfileQueriesMsg :: ProviderEnd ) => {
249
282
panic ! ( "parse error: unexpected ProviderEnd; \
@@ -255,7 +288,15 @@ fn profile_queries_thread(r:Receiver<ProfileQueriesMsg>) {
255
288
earlier query is unfinished: {:?} and now {:?}",
256
289
q1, Query { span: span2, msg: querymsg2} )
257
290
} ,
291
+
292
+ ( ParseState :: HaveTimeBegin ( _, _) , _) => {
293
+ unreachable ! ( )
294
+ } ,
295
+ ( ParseState :: HaveTaskBegin ( _, _) , _) => {
296
+ unreachable ! ( )
297
+ } ,
258
298
}
299
+
259
300
}
260
301
}
261
302
}
0 commit comments