@@ -5,7 +5,7 @@ use fil_ir as ir;
55use filament:: ir_passes:: BuildDomination ;
66use filament:: { ast_pass_pipeline, ir_pass_pipeline, log_pass, log_time} ;
77use filament:: {
8- ast_passes as ap, cmdline, ir_passes as ip, resolver:: Resolver ,
8+ ast_passes as ap, ast_visitor :: Visitor as AstVisitor , cmdline, ir_passes as ip, ir_visitor :: Visitor as IrVisitor , resolver:: Resolver ,
99} ;
1010use serde:: Deserialize ;
1111use std:: collections:: HashMap ;
@@ -21,6 +21,75 @@ pub struct ProvidedBindings {
2121 params : HashMap < String , Vec < u64 > > ,
2222}
2323
24+ /// Helper function to add IR pass names to the collection
25+ fn add_ir_pass < P : IrVisitor > ( pass_names : & mut Vec < String > ) {
26+ pass_names. push ( P :: name ( ) . to_string ( ) ) ;
27+ }
28+
29+ /// Helper function to add AST pass names to the collection
30+ fn add_ast_pass < P : AstVisitor > ( pass_names : & mut Vec < String > ) {
31+ pass_names. push ( P :: name ( ) . to_string ( ) ) ;
32+ }
33+
34+ /// Collects all known pass names by calling name() on each pass type
35+ /// and including hardcoded pass names from log_pass! calls
36+ fn collect_known_pass_names ( ) -> Vec < String > {
37+ let mut pass_names = vec ! [
38+ // Hardcoded pass names from log_pass! calls
39+ "astconv" . to_string( ) ,
40+ "monomorphize" . to_string( ) ,
41+ // Pass name from log_time! call
42+ "compile" . to_string( ) ,
43+ ] ;
44+
45+ // IR pass names - call name() method on each pass type
46+ add_ir_pass :: < ip:: Assumptions > ( & mut pass_names) ;
47+ add_ir_pass :: < ip:: BuildDomination > ( & mut pass_names) ;
48+ add_ir_pass :: < ip:: TypeCheck > ( & mut pass_names) ;
49+ add_ir_pass :: < ip:: IntervalCheck > ( & mut pass_names) ;
50+ add_ir_pass :: < ip:: PhantomCheck > ( & mut pass_names) ;
51+ add_ir_pass :: < ip:: InferAssumes > ( & mut pass_names) ;
52+ add_ir_pass :: < ip:: Discharge > ( & mut pass_names) ;
53+ add_ir_pass :: < ip:: FSMAttributes > ( & mut pass_names) ;
54+ add_ir_pass :: < ip:: Simplify > ( & mut pass_names) ;
55+ add_ir_pass :: < ip:: AssignCheck > ( & mut pass_names) ;
56+ add_ir_pass :: < ip:: BundleElim > ( & mut pass_names) ;
57+
58+ // AST pass names
59+ add_ast_pass :: < ap:: TopLevel > ( & mut pass_names) ;
60+
61+ pass_names. sort ( ) ;
62+ pass_names. dedup ( ) ;
63+ pass_names
64+ }
65+
66+ /// Validates that all --dump-after pass names are known passes
67+ fn validate_dump_after_passes ( opts : & cmdline:: Opts ) -> Result < ( ) , String > {
68+ if opts. dump_after . is_empty ( ) {
69+ return Ok ( ( ) ) ;
70+ }
71+
72+ let known_passes = collect_known_pass_names ( ) ;
73+ let mut unknown_passes = Vec :: new ( ) ;
74+
75+ for pass_name in & opts. dump_after {
76+ if !known_passes. contains ( pass_name) {
77+ unknown_passes. push ( pass_name. clone ( ) ) ;
78+ }
79+ }
80+
81+ if !unknown_passes. is_empty ( ) {
82+ let error_msg = format ! (
83+ "Unknown pass name(s): {}\n Known passes are: {}" ,
84+ unknown_passes. join( ", " ) ,
85+ known_passes. join( ", " )
86+ ) ;
87+ return Err ( error_msg) ;
88+ }
89+
90+ Ok ( ( ) )
91+ }
92+
2493// Prints out the interface for main component in the input program.
2594fn run ( opts : & cmdline:: Opts ) -> Result < ( ) , u64 > {
2695 // enable tracing
@@ -32,6 +101,12 @@ fn run(opts: &cmdline::Opts) -> Result<(), u64> {
32101 . target ( env_logger:: Target :: Stderr )
33102 . init ( ) ;
34103
104+ // Validate --dump-after pass names
105+ if let Err ( e) = validate_dump_after_passes ( opts) {
106+ eprintln ! ( "Error: {}" , e) ;
107+ return Err ( 1 ) ;
108+ }
109+
35110 // Load the provided bindings
36111 let provided_bindings: ProvidedBindings = opts
37112 . bindings
0 commit comments