@@ -35,6 +35,7 @@ use std::io::fs;
35
35
use std:: os;
36
36
use arena:: TypedArena ;
37
37
use syntax:: ast;
38
+ use syntax:: ast_map;
38
39
use syntax:: attr;
39
40
use syntax:: attr:: { AttrMetaMethods } ;
40
41
use syntax:: diagnostics;
@@ -65,7 +66,7 @@ pub fn compile_input(sess: Session,
65
66
// large chunks of memory alive and we want to free them as soon as
66
67
// possible to keep the peak memory usage low
67
68
let ( outputs, trans, sess) = {
68
- let ( outputs, expanded_crate, ast_map , id) = {
69
+ let ( outputs, expanded_crate, id) = {
69
70
let krate = phase_1_parse_input ( & sess, cfg, input) ;
70
71
if stop_after_phase_1 ( & sess) { return ; }
71
72
let outputs = build_output_filenames ( input,
@@ -75,25 +76,28 @@ pub fn compile_input(sess: Session,
75
76
& sess) ;
76
77
let id = link:: find_crate_name ( Some ( & sess) , krate. attrs . as_slice ( ) ,
77
78
input) ;
78
- let ( expanded_crate, ast_map )
79
+ let expanded_crate
79
80
= match phase_2_configure_and_expand ( & sess, krate, id. as_slice ( ) ,
80
81
addl_plugins) {
81
82
None => return ,
82
- Some ( p ) => p ,
83
+ Some ( k ) => k
83
84
} ;
84
85
85
- ( outputs, expanded_crate, ast_map , id)
86
+ ( outputs, expanded_crate, id)
86
87
} ;
88
+
89
+ let mut forest = ast_map:: Forest :: new ( expanded_crate) ;
90
+ let ast_map = assign_node_ids_and_map ( & sess, & mut forest) ;
91
+
87
92
write_out_deps ( & sess, input, & outputs, id. as_slice ( ) ) ;
88
93
89
94
if stop_after_phase_2 ( & sess) { return ; }
90
95
91
96
let type_arena = TypedArena :: new ( ) ;
92
- let analysis = phase_3_run_analysis_passes ( sess, & expanded_crate,
93
- ast_map, & type_arena, id) ;
94
- phase_save_analysis ( & analysis. ty_cx . sess , & expanded_crate, & analysis, outdir) ;
97
+ let analysis = phase_3_run_analysis_passes ( sess, ast_map, & type_arena, id) ;
98
+ phase_save_analysis ( & analysis. ty_cx . sess , analysis. ty_cx . map . krate ( ) , & analysis, outdir) ;
95
99
if stop_after_phase_3 ( & analysis. ty_cx . sess ) { return ; }
96
- let ( tcx, trans) = phase_4_translate_to_llvm ( expanded_crate , analysis) ;
100
+ let ( tcx, trans) = phase_4_translate_to_llvm ( analysis) ;
97
101
98
102
// Discard interned strings as they are no longer required.
99
103
token:: get_ident_interner ( ) . clear ( ) ;
@@ -182,7 +186,7 @@ pub fn phase_2_configure_and_expand(sess: &Session,
182
186
mut krate : ast:: Crate ,
183
187
crate_name : & str ,
184
188
addl_plugins : Option < Plugins > )
185
- -> Option < ( ast:: Crate , syntax :: ast_map :: Map ) > {
189
+ -> Option < ast:: Crate > {
186
190
let time_passes = sess. time_passes ( ) ;
187
191
188
192
* sess. crate_types . borrow_mut ( ) =
@@ -294,20 +298,37 @@ pub fn phase_2_configure_and_expand(sess: &Session,
294
298
krate = time ( time_passes, "prelude injection" , krate, |krate|
295
299
front:: std_inject:: maybe_inject_prelude ( sess, krate) ) ;
296
300
297
- let ( krate, map) = time ( time_passes, "assigning node ids and indexing ast" , krate, |krate|
298
- front:: assign_node_ids_and_map:: assign_node_ids_and_map ( sess, krate) ) ;
301
+ time ( time_passes, "checking that all macro invocations are gone" , & krate, |krate|
302
+ syntax:: ext:: expand:: check_for_macros ( & sess. parse_sess , krate) ) ;
303
+
304
+ Some ( krate)
305
+ }
306
+
307
+ pub fn assign_node_ids_and_map < ' ast > ( sess : & Session ,
308
+ forest : & ' ast mut ast_map:: Forest )
309
+ -> ast_map:: Map < ' ast > {
310
+ struct NodeIdAssigner < ' a > {
311
+ sess : & ' a Session
312
+ }
313
+
314
+ impl < ' a > ast_map:: FoldOps for NodeIdAssigner < ' a > {
315
+ fn new_id ( & self , old_id : ast:: NodeId ) -> ast:: NodeId {
316
+ assert_eq ! ( old_id, ast:: DUMMY_NODE_ID ) ;
317
+ self . sess . next_node_id ( )
318
+ }
319
+ }
320
+
321
+ let map = time ( sess. time_passes ( ) , "assigning node ids and indexing ast" , forest, |forest|
322
+ ast_map:: map_crate ( forest, NodeIdAssigner { sess : sess } ) ) ;
299
323
300
324
if sess. opts . debugging_opts & config:: AST_JSON != 0 {
301
325
let mut stdout = io:: BufferedWriter :: new ( io:: stdout ( ) ) ;
302
326
let mut json = json:: PrettyEncoder :: new ( & mut stdout) ;
303
327
// unwrapping so IoError isn't ignored
304
- krate. encode ( & mut json) . unwrap ( ) ;
328
+ map . krate ( ) . encode ( & mut json) . unwrap ( ) ;
305
329
}
306
330
307
- time ( time_passes, "checking that all macro invocations are gone" , & krate, |krate|
308
- syntax:: ext:: expand:: check_for_macros ( & sess. parse_sess , krate) ) ;
309
-
310
- Some ( ( krate, map) )
331
+ map
311
332
}
312
333
313
334
pub struct CrateAnalysis < ' tcx > {
@@ -324,11 +345,11 @@ pub struct CrateAnalysis<'tcx> {
324
345
/// miscellaneous analysis passes on the crate. Return various
325
346
/// structures carrying the results of the analysis.
326
347
pub fn phase_3_run_analysis_passes < ' tcx > ( sess : Session ,
327
- krate : & ast:: Crate ,
328
- ast_map : syntax:: ast_map:: Map ,
348
+ ast_map : ast_map:: Map < ' tcx > ,
329
349
type_arena : & ' tcx TypedArena < ty:: t_box_ > ,
330
350
name : String ) -> CrateAnalysis < ' tcx > {
331
351
let time_passes = sess. time_passes ( ) ;
352
+ let krate = ast_map. krate ( ) ;
332
353
333
354
time ( time_passes, "external crate/lib resolution" , ( ) , |_|
334
355
creader:: read_crates ( & sess, krate) ) ;
@@ -353,7 +374,7 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
353
374
|_| middle:: resolve_lifetime:: krate ( & sess, krate) ) ;
354
375
355
376
time ( time_passes, "looking for entry point" , ( ) ,
356
- |_| middle:: entry:: find_entry_point ( & sess, krate , & ast_map) ) ;
377
+ |_| middle:: entry:: find_entry_point ( & sess, & ast_map) ) ;
357
378
358
379
sess. plugin_registrar_fn . set (
359
380
time ( time_passes, "looking for plugin registrar" , ( ) , |_|
@@ -385,43 +406,43 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
385
406
stability_index) ;
386
407
387
408
// passes are timed inside typeck
388
- typeck:: check_crate ( & ty_cx, trait_map, krate ) ;
409
+ typeck:: check_crate ( & ty_cx, trait_map) ;
389
410
390
411
time ( time_passes, "check static items" , ( ) , |_|
391
- middle:: check_static:: check_crate ( & ty_cx, krate ) ) ;
412
+ middle:: check_static:: check_crate ( & ty_cx) ) ;
392
413
393
414
// These next two const passes can probably be merged
394
415
time ( time_passes, "const marking" , ( ) , |_|
395
- middle:: const_eval:: process_crate ( krate , & ty_cx) ) ;
416
+ middle:: const_eval:: process_crate ( & ty_cx) ) ;
396
417
397
418
time ( time_passes, "const checking" , ( ) , |_|
398
- middle:: check_const:: check_crate ( krate , & ty_cx) ) ;
419
+ middle:: check_const:: check_crate ( & ty_cx) ) ;
399
420
400
421
let maps = ( external_exports, last_private_map) ;
401
422
let ( exported_items, public_items) =
402
423
time ( time_passes, "privacy checking" , maps, |( a, b) |
403
- middle:: privacy:: check_crate ( & ty_cx, & exp_map2, a, b, krate ) ) ;
424
+ middle:: privacy:: check_crate ( & ty_cx, & exp_map2, a, b) ) ;
404
425
405
426
time ( time_passes, "intrinsic checking" , ( ) , |_|
406
- middle:: intrinsicck:: check_crate ( & ty_cx, krate ) ) ;
427
+ middle:: intrinsicck:: check_crate ( & ty_cx) ) ;
407
428
408
429
time ( time_passes, "effect checking" , ( ) , |_|
409
- middle:: effect:: check_crate ( & ty_cx, krate ) ) ;
430
+ middle:: effect:: check_crate ( & ty_cx) ) ;
410
431
411
432
time ( time_passes, "match checking" , ( ) , |_|
412
- middle:: check_match:: check_crate ( & ty_cx, krate ) ) ;
433
+ middle:: check_match:: check_crate ( & ty_cx) ) ;
413
434
414
435
time ( time_passes, "liveness checking" , ( ) , |_|
415
- middle:: liveness:: check_crate ( & ty_cx, krate ) ) ;
436
+ middle:: liveness:: check_crate ( & ty_cx) ) ;
416
437
417
438
time ( time_passes, "borrow checking" , ( ) , |_|
418
- middle:: borrowck:: check_crate ( & ty_cx, krate ) ) ;
439
+ middle:: borrowck:: check_crate ( & ty_cx) ) ;
419
440
420
441
time ( time_passes, "rvalue checking" , ( ) , |_|
421
442
middle:: check_rvalues:: check_crate ( & ty_cx, krate) ) ;
422
443
423
444
time ( time_passes, "kind checking" , ( ) , |_|
424
- kind:: check_crate ( & ty_cx, krate ) ) ;
445
+ kind:: check_crate ( & ty_cx) ) ;
425
446
426
447
let reachable_map =
427
448
time ( time_passes, "reachability checking" , ( ) , |_|
@@ -430,12 +451,11 @@ pub fn phase_3_run_analysis_passes<'tcx>(sess: Session,
430
451
time ( time_passes, "death checking" , ( ) , |_| {
431
452
middle:: dead:: check_crate ( & ty_cx,
432
453
& exported_items,
433
- & reachable_map,
434
- krate)
454
+ & reachable_map)
435
455
} ) ;
436
456
437
457
time ( time_passes, "lint checking" , ( ) , |_|
438
- lint:: check_crate ( & ty_cx, krate , & exported_items) ) ;
458
+ lint:: check_crate ( & ty_cx, & exported_items) ) ;
439
459
440
460
CrateAnalysis {
441
461
exp_map2 : exp_map2,
@@ -475,16 +495,16 @@ pub struct CrateTranslation {
475
495
476
496
/// Run the translation phase to LLVM, after which the AST and analysis can
477
497
/// be discarded.
478
- pub fn phase_4_translate_to_llvm ( krate : ast :: Crate ,
479
- analysis : CrateAnalysis ) -> ( ty:: ctxt , CrateTranslation ) {
498
+ pub fn phase_4_translate_to_llvm < ' tcx > ( analysis : CrateAnalysis < ' tcx > )
499
+ -> ( ty:: ctxt < ' tcx > , CrateTranslation ) {
480
500
let time_passes = analysis. ty_cx . sess . time_passes ( ) ;
481
501
482
502
time ( time_passes, "resolving dependency formats" , ( ) , |_|
483
503
dependency_format:: calculate ( & analysis. ty_cx ) ) ;
484
504
485
505
// Option dance to work around the lack of stack once closures.
486
- time ( time_passes, "translation" , ( krate , analysis) , |( krate , analysis) |
487
- trans:: base:: trans_crate ( krate , analysis) )
506
+ time ( time_passes, "translation" , analysis, |analysis|
507
+ trans:: base:: trans_crate ( analysis) )
488
508
}
489
509
490
510
/// Run LLVM itself, producing a bitcode file, assembly file or object file
0 commit comments