Skip to content

Commit b32da87

Browse files
committed
add pass name validation for --dump-after
1 parent afb8037 commit b32da87

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

crates/filament/src/main.rs

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use fil_ir as ir;
55
use filament::ir_passes::BuildDomination;
66
use filament::{ast_pass_pipeline, ir_pass_pipeline, log_pass, log_time};
77
use 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
};
1010
use serde::Deserialize;
1111
use 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): {}\nKnown 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.
2594
fn 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

Comments
 (0)