Skip to content

Commit c8f2716

Browse files
authored
fix(chisel): disable compiler optimizations (#11990)
Add --ir-minimum like in `forge coverage`, and disable optimizations since we rely on source maps to inspect expressions.
1 parent 1361d07 commit c8f2716

File tree

5 files changed

+41
-21
lines changed

5 files changed

+41
-21
lines changed

crates/chisel/src/args.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ pub async fn run_command(args: Chisel) -> Result<()> {
5151
evm_opts,
5252
backend: None,
5353
calldata: None,
54+
ir_minimum: args.ir_minimum,
5455
})?;
5556

5657
// Execute prelude Solidity source files

crates/chisel/src/opts.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,13 @@ pub struct Chisel {
3131
))]
3232
pub no_vm: bool,
3333

34+
/// Enable viaIR with minimum optimization
35+
///
36+
/// This can fix most of the "stack too deep" errors while resulting a
37+
/// relatively accurate source map.
38+
#[arg(long, help_heading = "REPL options")]
39+
pub ir_minimum: bool,
40+
3441
#[command(flatten)]
3542
pub build: BuildOpts,
3643

crates/chisel/src/source.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,11 @@ pub struct SessionSourceConfig {
382382
pub traces: bool,
383383
/// Optionally set calldata for the REPL contract execution
384384
pub calldata: Option<Vec<u8>>,
385+
/// Enable viaIR with minimum optimization
386+
///
387+
/// This can fix most of the "stack too deep" errors while resulting a
388+
/// relatively accurate source map.
389+
pub ir_minimum: bool,
385390
}
386391

387392
impl SessionSourceConfig {
@@ -603,7 +608,8 @@ impl SessionSource {
603608
fn compile(&self) -> Result<ProjectCompileOutput> {
604609
let sources = self.get_sources();
605610

606-
let project = self.config.foundry_config.ephemeral_project()?;
611+
let mut project = self.config.foundry_config.ephemeral_project()?;
612+
self.config.foundry_config.disable_optimizations(&mut project, self.config.ir_minimum);
607613
let mut output = ProjectCompiler::with_sources(&project, sources)?.compile()?;
608614

609615
if output.has_compiler_errors() {

crates/config/src/lib.rs

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use foundry_compilers::{
3737
},
3838
error::SolcError,
3939
multi::{MultiCompilerParser, MultiCompilerRestrictions},
40-
solc::{CliSettings, SolcSettings},
40+
solc::{CliSettings, SolcLanguage, SolcSettings},
4141
};
4242
use regex::Regex;
4343
use revm::primitives::hardfork::SpecId;
@@ -1177,6 +1177,28 @@ impl Config {
11771177
Ok(project)
11781178
}
11791179

1180+
/// Disables optimizations and enables viaIR with minimum optimization if `ir_minimum` is true.
1181+
pub fn disable_optimizations(&self, project: &mut Project, ir_minimum: bool) {
1182+
if ir_minimum {
1183+
// Enable viaIR with minimum optimization: https://github.com/ethereum/solidity/issues/12533#issuecomment-1013073350
1184+
// And also in new releases of Solidity: https://github.com/ethereum/solidity/issues/13972#issuecomment-1628632202
1185+
project.settings.solc.settings = std::mem::take(&mut project.settings.solc.settings)
1186+
.with_via_ir_minimum_optimization();
1187+
1188+
// Sanitize settings for solc 0.8.4 if version cannot be detected: https://github.com/foundry-rs/foundry/issues/9322
1189+
// But keep the EVM version: https://github.com/ethereum/solidity/issues/15775
1190+
let evm_version = project.settings.solc.evm_version;
1191+
let version = self.solc_version().unwrap_or_else(|| Version::new(0, 8, 4));
1192+
project.settings.solc.settings.sanitize(&version, SolcLanguage::Solidity);
1193+
project.settings.solc.evm_version = evm_version;
1194+
} else {
1195+
project.settings.solc.optimizer.disable();
1196+
project.settings.solc.optimizer.runs = None;
1197+
project.settings.solc.optimizer.details = None;
1198+
project.settings.solc.via_ir = None;
1199+
}
1200+
}
1201+
11801202
/// Cleans the project.
11811203
pub fn cleanup<C: Compiler, T: ArtifactOutput<CompilerContract = C::CompilerContract>>(
11821204
&self,

crates/forge/src/cmd/coverage.rs

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ use foundry_cli::utils::{LoadConfig, STATIC_FUZZ_SEED};
1212
use foundry_common::{compile::ProjectCompiler, errors::convert_solar_errors};
1313
use foundry_compilers::{
1414
Artifact, ArtifactId, Project, ProjectCompileOutput, ProjectPathsConfig, VYPER_EXTENSIONS,
15-
artifacts::{CompactBytecode, CompactDeployedBytecode, SolcLanguage, sourcemap::SourceMap},
15+
artifacts::{CompactBytecode, CompactDeployedBytecode, sourcemap::SourceMap},
1616
};
1717
use foundry_config::Config;
1818
use foundry_evm::{core::ic::IcPcMap, opts::EvmOpts};
@@ -131,39 +131,23 @@ impl CoverageArgs {
131131
let mut project = config.ephemeral_project()?;
132132

133133
if self.ir_minimum {
134-
// print warning message
135134
sh_warn!(
136135
"`--ir-minimum` enables `viaIR` with minimum optimization, \
137136
which can result in inaccurate source mappings.\n\
138137
Only use this flag as a workaround if you are experiencing \"stack too deep\" errors.\n\
139138
Note that `viaIR` is production ready since Solidity 0.8.13 and above.\n\
140139
See more: https://github.com/foundry-rs/foundry/issues/3357"
141140
)?;
142-
143-
// Enable viaIR with minimum optimization: https://github.com/ethereum/solidity/issues/12533#issuecomment-1013073350
144-
// And also in new releases of Solidity: https://github.com/ethereum/solidity/issues/13972#issuecomment-1628632202
145-
project.settings.solc.settings =
146-
project.settings.solc.settings.with_via_ir_minimum_optimization();
147-
148-
// Sanitize settings for solc 0.8.4 if version cannot be detected: https://github.com/foundry-rs/foundry/issues/9322
149-
// But keep the EVM version: https://github.com/ethereum/solidity/issues/15775
150-
let evm_version = project.settings.solc.evm_version;
151-
let version = config.solc_version().unwrap_or_else(|| Version::new(0, 8, 4));
152-
project.settings.solc.settings.sanitize(&version, SolcLanguage::Solidity);
153-
project.settings.solc.evm_version = evm_version;
154141
} else {
155142
sh_warn!(
156143
"optimizer settings and `viaIR` have been disabled for accurate coverage reports.\n\
157144
If you encounter \"stack too deep\" errors, consider using `--ir-minimum` which \
158145
enables `viaIR` with minimum optimization resolving most of the errors"
159146
)?;
160-
161-
project.settings.solc.optimizer.disable();
162-
project.settings.solc.optimizer.runs = None;
163-
project.settings.solc.optimizer.details = None;
164-
project.settings.solc.via_ir = None;
165147
}
166148

149+
config.disable_optimizations(&mut project, self.ir_minimum);
150+
167151
let output = ProjectCompiler::default()
168152
.compile(&project)?
169153
.with_stripped_file_prefixes(project.root());

0 commit comments

Comments
 (0)