From 9d67c84d59f601dd301d6f44183f60792167e005 Mon Sep 17 00:00:00 2001 From: Sukuna0007Abhi Date: Thu, 9 Apr 2026 13:31:55 +0530 Subject: [PATCH] cli: replace -O none/less/default/aggressive with standard -O0 -O1 -O2 -O3 -Os -Oz flags (fixes #534) Signed-off-by: Sukuna0007Abhi --- docs/running.rst | 7 +++++-- examples/polkadot/polkadot_config.toml | 4 ++-- examples/solana/solana_config.toml | 4 ++-- src/bin/cli/mod.rs | 18 +++++++++++------- src/bin/cli/test.rs | 14 +++++++------- src/codegen/mod.rs | 3 +++ 6 files changed, 30 insertions(+), 20 deletions(-) diff --git a/docs/running.rst b/docs/running.rst index 9f80fffa0..2c986c078 100644 --- a/docs/running.rst +++ b/docs/running.rst @@ -58,8 +58,11 @@ Options: Only compile the code for the specified contracts. If any those contracts cannot be found, produce an error. -O *optimization level* - This takes one argument, which can either be ``none``, ``less``, ``default``, - or ``aggressive``. These correspond to llvm optimization levels. + This takes one argument, which can be ``0``, ``1``, ``2``, ``3``, ``s``, + or ``z``. These correspond to standard GCC/Clang optimization levels. + ``s`` optimizes for size and ``z`` aggressively optimizes for size. + The default is ``2``. The old values ``none``, ``less``, ``default``, + and ``aggressive`` are still accepted for backward compatibility. \-\-importpath *directory* When resolving ``import`` directives, search this directory. By default ``import`` diff --git a/examples/polkadot/polkadot_config.toml b/examples/polkadot/polkadot_config.toml index 77f08716d..f36b8c468 100644 --- a/examples/polkadot/polkadot_config.toml +++ b/examples/polkadot/polkadot_config.toml @@ -44,8 +44,8 @@ common-subexpression-elimination = true # Valid wasm-opt passes are: Zero, One, Two, Three, Four, S, (focusing on code size) or Z (super-focusing on code size) wasm-opt = "Z" -# Valid LLVM optimization levels are: none, less, default, aggressive -llvm-IR-optimization-level = "aggressive" +# Valid LLVM optimization levels are: 0, 1, 2, 3, s, z (also accepts: none, less, default, aggressive) +llvm-IR-optimization-level = "3" [compiler-output] verbose = false diff --git a/examples/solana/solana_config.toml b/examples/solana/solana_config.toml index ed9725e62..ccfc96ee0 100644 --- a/examples/solana/solana_config.toml +++ b/examples/solana/solana_config.toml @@ -36,8 +36,8 @@ strength-reduce = true vector-to-slice = true common-subexpression-elimination = true -# Valid LLVM optimization levels are: none, less, default, aggressive -llvm-IR-optimization-level = "aggressive" +# Valid LLVM optimization levels are: 0, 1, 2, 3, s, z (also accepts: none, less, default, aggressive) +llvm-IR-optimization-level = "3" [compiler-output] verbose = false diff --git a/src/bin/cli/mod.rs b/src/bin/cli/mod.rs index 67839d9a2..2fff74752 100644 --- a/src/bin/cli/mod.rs +++ b/src/bin/cli/mod.rs @@ -392,7 +392,7 @@ pub struct Optimizations { )] pub common_subexpression_elimination: bool, - #[arg(name = "OPT", help = "Set llvm optimizer level ", short = 'O', default_value = "default", value_parser = ["none", "less", "default", "aggressive"], num_args = 1)] + #[arg(name = "OPT", help = "Set LLVM optimizer level (0, 1, 2, 3, s, z)", short = 'O', default_value = "2", value_parser = ["0", "1", "2", "3", "s", "z", "none", "less", "default", "aggressive"], num_args = 1)] #[serde(rename(deserialize = "llvm-IR-optimization-level"))] pub opt_level: Option, @@ -564,16 +564,19 @@ pub fn options_arg( optimizations: &Optimizations, compiler_inputs: &CompilePackage, ) -> Options { - let opt_level = if let Some(level) = &optimizations.opt_level { + let (opt_level, opt_size_level) = if let Some(level) = &optimizations.opt_level { match level.as_str() { - "none" => OptimizationLevel::None, - "less" => OptimizationLevel::Less, - "default" => OptimizationLevel::Default, - "aggressive" => OptimizationLevel::Aggressive, + // Standard GCC/Clang-style optimization levels + "0" | "none" => (OptimizationLevel::None, 0), + "1" | "less" => (OptimizationLevel::Less, 0), + "2" | "default" => (OptimizationLevel::Default, 0), + "3" | "aggressive" => (OptimizationLevel::Aggressive, 0), + "s" => (OptimizationLevel::Default, 1), + "z" => (OptimizationLevel::Default, 2), _ => unreachable!(), } } else { - OptimizationLevel::Default + (OptimizationLevel::Default, 0) }; Options { @@ -584,6 +587,7 @@ pub fn options_arg( common_subexpression_elimination: optimizations.common_subexpression_elimination, generate_debug_information: debug.generate_debug_info, opt_level, + opt_size_level, log_runtime_errors: debug.log_runtime_errors && !debug.release, log_prints: debug.log_prints && !debug.release, strict_soroban_types: debug.strict_soroban_types, diff --git a/src/bin/cli/test.rs b/src/bin/cli/test.rs index 99b744865..747da324f 100644 --- a/src/bin/cli/test.rs +++ b/src/bin/cli/test.rs @@ -15,7 +15,7 @@ mod tests { #[test] fn parse_compile_options() { - let mut command: Vec<&str> = "solang compile flipper.sol --target polkadot --value-length=31 --address-length=33 --no-dead-storage --no-constant-folding --no-strength-reduce --no-vector-to-slice --no-cse -O aggressive".split(' ').collect(); + let mut command: Vec<&str> = "solang compile flipper.sol --target polkadot --value-length=31 --address-length=33 --no-dead-storage --no-constant-folding --no-strength-reduce --no-vector-to-slice --no-cse -O 3".split(' ').collect(); let mut cli = Cli::parse_from(command); if let Commands::Compile(compile_args) = cli.command { @@ -31,7 +31,7 @@ mod tests { assert!(!compile_args.optimizations.dead_storage); assert!(!compile_args.optimizations.vector_to_slice); assert!(!compile_args.optimizations.strength_reduce); - assert_eq!(compile_args.optimizations.opt_level.unwrap(), "aggressive"); + assert_eq!(compile_args.optimizations.opt_level.unwrap(), "3"); } command = "solang compile flipper.sol --target polkadot --no-log-runtime-errors --no-prints -g --release".split(' ').collect(); @@ -121,7 +121,7 @@ mod tests { strength-reduce = false vector-to-slice = false common-subexpression-elimination = true - llvm-IR-optimization-level = "aggressive""#; + llvm-IR-optimization-level = "3""#; let opt: cli::Optimizations = toml::from_str(opt_toml).unwrap(); @@ -130,7 +130,7 @@ mod tests { assert!(!opt.constant_folding); assert!(!opt.strength_reduce); assert!(!opt.vector_to_slice); - assert_eq!(opt.opt_level.unwrap(), "aggressive"); + assert_eq!(opt.opt_level.unwrap(), "3"); } #[cfg(feature = "wasm_opt")] @@ -223,14 +223,14 @@ mod tests { strength_reduce: true, vector_to_slice: true, common_subexpression_elimination: true, - opt_level: Some("aggressive".to_owned()), + opt_level: Some("3".to_owned()), #[cfg(feature = "wasm_opt")] wasm_opt_passes: None } } ); - let command = "solang compile flipper.sol sesa.sol --config-file solang.toml --contract-authors not_sesa --target polkadot --value-length=31 --address-length=33 --no-dead-storage --no-constant-folding --no-strength-reduce --no-vector-to-slice --no-cse -O aggressive".split(' '); + let command = "solang compile flipper.sol sesa.sol --config-file solang.toml --contract-authors not_sesa --target polkadot --value-length=31 --address-length=33 --no-dead-storage --no-constant-folding --no-strength-reduce --no-vector-to-slice --no-cse -O 3".split(' '); let matches = Cli::command().get_matches_from(command); @@ -279,7 +279,7 @@ mod tests { strength_reduce: false, vector_to_slice: false, common_subexpression_elimination: false, - opt_level: Some("aggressive".to_owned()), + opt_level: Some("3".to_owned()), #[cfg(feature = "wasm_opt")] wasm_opt_passes: None } diff --git a/src/codegen/mod.rs b/src/codegen/mod.rs index f87fd8ce9..169064312 100644 --- a/src/codegen/mod.rs +++ b/src/codegen/mod.rs @@ -209,6 +209,8 @@ pub struct Options { pub common_subexpression_elimination: bool, pub generate_debug_information: bool, pub opt_level: OptimizationLevel, + /// Size optimization level: 0 = none, 1 = -Os, 2 = -Oz + pub opt_size_level: u32, pub log_runtime_errors: bool, pub log_prints: bool, pub strict_soroban_types: bool, @@ -227,6 +229,7 @@ impl Default for Options { common_subexpression_elimination: true, generate_debug_information: false, opt_level: OptimizationLevel::Default, + opt_size_level: 0, log_runtime_errors: false, log_prints: true, strict_soroban_types: false,