diff --git a/rust_compiler/Cargo.lock b/rust_compiler/Cargo.lock index ca51170..17bf0df 100644 --- a/rust_compiler/Cargo.lock +++ b/rust_compiler/Cargo.lock @@ -930,7 +930,7 @@ checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" [[package]] name = "slang" -version = "0.3.0" +version = "0.3.1" dependencies = [ "anyhow", "clap", diff --git a/rust_compiler/libs/compiler/src/v1.rs b/rust_compiler/libs/compiler/src/v1.rs index e5647fb..1cf26e6 100644 --- a/rust_compiler/libs/compiler/src/v1.rs +++ b/rust_compiler/libs/compiler/src/v1.rs @@ -264,7 +264,7 @@ impl<'a> Compiler<'a> { fn next_label_name(&mut self) -> Cow<'a, str> { self.label_counter += 1; - Cow::from(format!("L{}", self.label_counter)) + Cow::from(format!("__internal_L{}", self.label_counter)) } fn expression( diff --git a/rust_compiler/libs/optimizer/src/leaf_function.rs b/rust_compiler/libs/optimizer/src/leaf_function.rs index f8783f1..1d88555 100644 --- a/rust_compiler/libs/optimizer/src/leaf_function.rs +++ b/rust_compiler/libs/optimizer/src/leaf_function.rs @@ -14,6 +14,10 @@ pub fn find_leaf_functions(instructions: &[InstructionNode]) -> HashSet for node in instructions { match &node.instruction { Instruction::LabelDef(label) => { + if label.starts_with("__internal_L") { + continue; + } + // If we were tracking a function, and it remained a leaf until now, save it. if let Some(name) = current_label.take() && is_current_leaf diff --git a/rust_compiler/libs/optimizer/src/lib.rs b/rust_compiler/libs/optimizer/src/lib.rs index e4397e6..ffd97e1 100644 --- a/rust_compiler/libs/optimizer/src/lib.rs +++ b/rust_compiler/libs/optimizer/src/lib.rs @@ -99,7 +99,7 @@ fn optimize_leaf_functions<'a>( // First scan: Identify instructions to remove and capture RA offsets for (i, node) in input.iter().enumerate() { match &node.instruction { - Instruction::LabelDef(label) => { + Instruction::LabelDef(label) if !label.starts_with("__internal_L") => { current_function = Some(label.to_string()); function_start_indices.insert(label.to_string(), i); } diff --git a/rust_compiler/src/main.rs b/rust_compiler/src/main.rs index da60b84..47494bb 100644 --- a/rust_compiler/src/main.rs +++ b/rust_compiler/src/main.rs @@ -53,6 +53,9 @@ struct Args { /// The output file for the compiled program. If not set, output will go to stdout. #[arg(short, long)] output_file: Option, + /// Should Slang attempt to optimize the output? + #[arg(short = 'z', long)] + optimize: bool, } fn run_logic<'a>() -> Result<(), Error<'a>> { @@ -107,7 +110,11 @@ fn run_logic<'a>() -> Result<(), Error<'a>> { } } - optimizer::optimize(instructions).write(&mut writer)?; + if args.optimize { + optimizer::optimize(instructions).write(&mut writer)?; + } else { + instructions.write(&mut writer)?; + } writer.flush()?;