Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 5 additions & 2 deletions docs/running.rst
Original file line number Diff line number Diff line change
Expand Up @@ -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``
Expand Down
4 changes: 2 additions & 2 deletions examples/polkadot/polkadot_config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions examples/solana/solana_config.toml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
18 changes: 11 additions & 7 deletions src/bin/cli/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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<String>,

Expand Down Expand Up @@ -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 {
Expand All @@ -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,
Expand Down
14 changes: 7 additions & 7 deletions src/bin/cli/test.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand All @@ -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();
Expand Down Expand Up @@ -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();

Expand All @@ -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")]
Expand Down Expand Up @@ -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);

Expand Down Expand Up @@ -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
}
Expand Down
3 changes: 3 additions & 0 deletions src/codegen/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand All @@ -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,
Expand Down