Skip to content

Commit 12f50ec

Browse files
authored
Merge pull request #11730 from ethereum/deduplicate-cli-optimizer-initialization
[CLI] Deduplicate optimizer initialization
2 parents 8fafdea + 1e4cef8 commit 12f50ec

File tree

46 files changed

+116
-103
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+116
-103
lines changed

Changelog.md

Lines changed: 2 additions & 1 deletion

solc/CommandLineInterface.cpp

Lines changed: 11 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -551,13 +551,7 @@ bool CommandLineInterface::processInput()
551551
}
552552
case InputMode::Assembler:
553553
{
554-
return assemble(
555-
m_options.assembly.inputLanguage,
556-
m_options.assembly.targetMachine,
557-
m_options.optimizer.enabled,
558-
m_options.optimizer.expectedExecutionsPerDeployment,
559-
m_options.optimizer.yulSteps
560-
);
554+
return assemble(m_options.assembly.inputLanguage, m_options.assembly.targetMachine);
561555
}
562556
case InputMode::Linker:
563557
return link();
@@ -595,16 +589,7 @@ bool CommandLineInterface::compile()
595589
m_compiler->enableIRGeneration(m_options.compiler.outputs.ir || m_options.compiler.outputs.irOptimized);
596590
m_compiler->enableEwasmGeneration(m_options.compiler.outputs.ewasm);
597591

598-
OptimiserSettings settings = m_options.optimizer.enabled ? OptimiserSettings::standard() : OptimiserSettings::minimal();
599-
if (m_options.optimizer.expectedExecutionsPerDeployment.has_value())
600-
settings.expectedExecutionsPerDeployment = m_options.optimizer.expectedExecutionsPerDeployment.value();
601-
if (m_options.optimizer.noOptimizeYul)
602-
settings.runYulOptimiser = false;
603-
604-
if (m_options.optimizer.yulSteps.has_value())
605-
settings.yulOptimiserSteps = m_options.optimizer.yulSteps.value();
606-
settings.optimizeStackAllocation = settings.runYulOptimiser;
607-
m_compiler->setOptimiserSettings(settings);
592+
m_compiler->setOptimiserSettings(m_options.optimiserSettings());
608593

609594
if (m_options.input.mode == InputMode::CompilerWithASTImport)
610595
{
@@ -939,27 +924,21 @@ string CommandLineInterface::objectWithLinkRefsHex(evmasm::LinkerObject const& _
939924
return out;
940925
}
941926

942-
bool CommandLineInterface::assemble(
943-
yul::AssemblyStack::Language _language,
944-
yul::AssemblyStack::Machine _targetMachine,
945-
bool _optimize,
946-
optional<unsigned int> _expectedExecutionsPerDeployment,
947-
optional<string> _yulOptimiserSteps
948-
)
927+
bool CommandLineInterface::assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine)
949928
{
950-
solAssert(_optimize || !_yulOptimiserSteps.has_value(), "");
951-
952929
bool successful = true;
953930
map<string, yul::AssemblyStack> assemblyStacks;
954931
for (auto const& src: m_fileReader.sourceCodes())
955932
{
956-
OptimiserSettings settings = _optimize ? OptimiserSettings::full() : OptimiserSettings::minimal();
957-
if (_expectedExecutionsPerDeployment.has_value())
958-
settings.expectedExecutionsPerDeployment = _expectedExecutionsPerDeployment.value();
959-
if (_yulOptimiserSteps.has_value())
960-
settings.yulOptimiserSteps = _yulOptimiserSteps.value();
933+
// --no-optimize-yul option is not accepted in assembly mode.
934+
solAssert(!m_options.optimizer.noOptimizeYul, "");
935+
936+
auto& stack = assemblyStacks[src.first] = yul::AssemblyStack(
937+
m_options.output.evmVersion,
938+
_language,
939+
m_options.optimiserSettings()
940+
);
961941

962-
auto& stack = assemblyStacks[src.first] = yul::AssemblyStack(m_options.output.evmVersion, _language, settings);
963942
try
964943
{
965944
if (!stack.parseAndAnalyze(src.first, src.second))

solc/CommandLineInterface.h

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -74,13 +74,7 @@ class CommandLineInterface
7474
/// @returns the full object with library placeholder hints in hex.
7575
static std::string objectWithLinkRefsHex(evmasm::LinkerObject const& _obj);
7676

77-
bool assemble(
78-
yul::AssemblyStack::Language _language,
79-
yul::AssemblyStack::Machine _targetMachine,
80-
bool _optimize,
81-
std::optional<unsigned int> _expectedExecutionsPerDeployment = std::nullopt,
82-
std::optional<std::string> _yulOptimiserSteps = std::nullopt
83-
);
77+
bool assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine);
8478

8579
void outputCompilationResults();
8680

solc/CommandLineParser.cpp

Lines changed: 71 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,27 @@ bool CommandLineOptions::operator==(CommandLineOptions const& _other) const noex
302302
modelChecker.settings == _other.modelChecker.settings;
303303
}
304304

305+
OptimiserSettings CommandLineOptions::optimiserSettings() const
306+
{
307+
OptimiserSettings settings;
308+
309+
if (optimizer.enabled)
310+
settings = OptimiserSettings::standard();
311+
else
312+
settings = OptimiserSettings::minimal();
313+
314+
if (optimizer.noOptimizeYul)
315+
settings.runYulOptimiser = false;
316+
317+
if (optimizer.expectedExecutionsPerDeployment.has_value())
318+
settings.expectedExecutionsPerDeployment = optimizer.expectedExecutionsPerDeployment.value();
319+
320+
if (optimizer.yulSteps.has_value())
321+
settings.yulOptimiserSteps = optimizer.yulSteps.value();
322+
323+
return settings;
324+
}
325+
305326
bool CommandLineParser::parseInputPathsAndRemappings()
306327
{
307328
m_options.input.ignoreMissingFiles = (m_args.count(g_strIgnoreMissingFiles) > 0);
@@ -940,6 +961,26 @@ General Information)").c_str(),
940961
if (!parseInputPathsAndRemappings())
941962
return false;
942963

964+
if (
965+
m_options.input.mode != InputMode::Compiler &&
966+
m_options.input.mode != InputMode::CompilerWithASTImport &&
967+
m_options.input.mode != InputMode::Assembler
968+
)
969+
{
970+
if (!m_args[g_strOptimizeRuns].defaulted())
971+
{
972+
serr() << "Option --" << g_strOptimizeRuns << " is only valid in compiler and assembler modes." << endl;
973+
return false;
974+
}
975+
976+
for (string const& option: {g_strOptimize, g_strNoOptimizeYul, g_strOptimizeYul, g_strYulOptimizations})
977+
if (m_args.count(option) > 0)
978+
{
979+
serr() << "Option --" << option << " is only valid in compiler and assembler modes." << endl;
980+
return false;
981+
}
982+
}
983+
943984
if (m_options.input.mode == InputMode::StandardJson)
944985
return true;
945986

@@ -948,6 +989,9 @@ General Information)").c_str(),
948989
if (!parseLibraryOption(library))
949990
return false;
950991

992+
if (m_options.input.mode == InputMode::Linker)
993+
return true;
994+
951995
if (m_args.count(g_strEVMVersion))
952996
{
953997
string versionOptionStr = m_args[g_strEVMVersion].as<string>();
@@ -960,6 +1004,33 @@ General Information)").c_str(),
9601004
m_options.output.evmVersion = *versionOption;
9611005
}
9621006

1007+
m_options.optimizer.enabled = (m_args.count(g_strOptimize) > 0);
1008+
m_options.optimizer.noOptimizeYul = (m_args.count(g_strNoOptimizeYul) > 0);
1009+
if (!m_args[g_strOptimizeRuns].defaulted())
1010+
m_options.optimizer.expectedExecutionsPerDeployment = m_args.at(g_strOptimizeRuns).as<unsigned>();
1011+
1012+
if (m_args.count(g_strYulOptimizations))
1013+
{
1014+
OptimiserSettings optimiserSettings = m_options.optimiserSettings();
1015+
if (!optimiserSettings.runYulOptimiser)
1016+
{
1017+
serr() << "--" << g_strYulOptimizations << " is invalid if Yul optimizer is disabled" << endl;
1018+
return false;
1019+
}
1020+
1021+
try
1022+
{
1023+
yul::OptimiserSuite::validateSequence(m_args[g_strYulOptimizations].as<string>());
1024+
}
1025+
catch (yul::OptimizerException const& _exception)
1026+
{
1027+
serr() << "Invalid optimizer step sequence in --" << g_strYulOptimizations << ": " << _exception.what() << endl;
1028+
return false;
1029+
}
1030+
1031+
m_options.optimizer.yulSteps = m_args[g_strYulOptimizations].as<string>();
1032+
}
1033+
9631034
if (m_options.input.mode == InputMode::Assembler)
9641035
{
9651036
vector<string> const nonAssemblyModeOptions = {
@@ -987,32 +1058,6 @@ General Information)").c_str(),
9871058
using Input = yul::AssemblyStack::Language;
9881059
using Machine = yul::AssemblyStack::Machine;
9891060
m_options.assembly.inputLanguage = m_args.count(g_strYul) ? Input::Yul : (m_args.count(g_strStrictAssembly) ? Input::StrictAssembly : Input::Assembly);
990-
m_options.optimizer.enabled = (m_args.count(g_strOptimize) > 0);
991-
m_options.optimizer.noOptimizeYul = (m_args.count(g_strNoOptimizeYul) > 0);
992-
993-
if (!m_args[g_strOptimizeRuns].defaulted())
994-
m_options.optimizer.expectedExecutionsPerDeployment = m_args.at(g_strOptimizeRuns).as<unsigned>();
995-
996-
if (m_args.count(g_strYulOptimizations))
997-
{
998-
if (!m_options.optimizer.enabled)
999-
{
1000-
serr() << "--" << g_strYulOptimizations << " is invalid if Yul optimizer is disabled" << endl;
1001-
return false;
1002-
}
1003-
1004-
try
1005-
{
1006-
yul::OptimiserSuite::validateSequence(m_args[g_strYulOptimizations].as<string>());
1007-
}
1008-
catch (yul::OptimizerException const& _exception)
1009-
{
1010-
serr() << "Invalid optimizer step sequence in --" << g_strYulOptimizations << ": " << _exception.what() << endl;
1011-
return false;
1012-
}
1013-
1014-
m_options.optimizer.yulSteps = m_args[g_strYulOptimizations].as<string>();
1015-
}
10161061

10171062
if (m_args.count(g_strMachine))
10181063
{
@@ -1078,9 +1123,6 @@ General Information)").c_str(),
10781123
return false;
10791124
}
10801125

1081-
if (m_options.input.mode == InputMode::Linker)
1082-
return true;
1083-
10841126
if (m_args.count(g_strMetadataHash))
10851127
{
10861128
string hashStr = m_args[g_strMetadataHash].as<string>();
@@ -1164,36 +1206,6 @@ General Information)").c_str(),
11641206
m_args.count(g_strModelCheckerTargets) ||
11651207
m_args.count(g_strModelCheckerTimeout);
11661208
m_options.output.experimentalViaIR = (m_args.count(g_strExperimentalViaIR) > 0);
1167-
if (!m_args[g_strOptimizeRuns].defaulted())
1168-
m_options.optimizer.expectedExecutionsPerDeployment = m_args.at(g_strOptimizeRuns).as<unsigned>();
1169-
1170-
m_options.optimizer.enabled = (m_args.count(g_strOptimize) > 0);
1171-
m_options.optimizer.noOptimizeYul = (m_args.count(g_strNoOptimizeYul) > 0);
1172-
1173-
OptimiserSettings settings = m_options.optimizer.enabled ? OptimiserSettings::standard() : OptimiserSettings::minimal();
1174-
if (m_options.optimizer.noOptimizeYul)
1175-
settings.runYulOptimiser = false;
1176-
if (m_args.count(g_strYulOptimizations))
1177-
{
1178-
if (!settings.runYulOptimiser)
1179-
{
1180-
serr() << "--" << g_strYulOptimizations << " is invalid if Yul optimizer is disabled" << endl;
1181-
return false;
1182-
}
1183-
1184-
try
1185-
{
1186-
yul::OptimiserSuite::validateSequence(m_args[g_strYulOptimizations].as<string>());
1187-
}
1188-
catch (yul::OptimizerException const& _exception)
1189-
{
1190-
serr() << "Invalid optimizer step sequence in --" << g_strYulOptimizations << ": " << _exception.what() << endl;
1191-
return false;
1192-
}
1193-
1194-
m_options.optimizer.yulSteps = m_args[g_strYulOptimizations].as<string>();
1195-
}
1196-
11971209
if (m_options.input.mode == InputMode::Compiler)
11981210
m_options.input.errorRecovery = (m_args.count(g_strErrorRecovery) > 0);
11991211

solc/CommandLineParser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,7 @@ struct CommandLineOptions
102102
bool operator==(CommandLineOptions const& _other) const noexcept;
103103
bool operator!=(CommandLineOptions const& _other) const noexcept { return !(*this == _other); }
104104

105+
OptimiserSettings optimiserSettings() const;
105106

106107
struct
107108
{
@@ -169,7 +170,6 @@ struct CommandLineOptions
169170
bool initialize = false;
170171
ModelCheckerSettings settings;
171172
} modelChecker;
172-
173173
};
174174

175175
/// Parses the command-line arguments and produces a filled-out CommandLineOptions structure.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--no-optimize-yul --link --libraries input.sol:L=0x1234567890123456789012345678901234567890
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Option --no-optimize-yul is only valid in compiler and assembler modes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
1

test/cmdlineTests/linker_mode_invalid_option_no_optimize_yul/input.bin

Whitespace-only changes.
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
--optimize --link --libraries input.sol:L=0x1234567890123456789012345678901234567890

0 commit comments

Comments
 (0)