@@ -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+
305326bool 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
0 commit comments