Skip to content

Commit 2aad0a7

Browse files
authored
Merge pull request #16521 from argotorg/remove_cli_assemble
Deactivate --assemble in CLI
2 parents 995580c + 1f5822f commit 2aad0a7

25 files changed

+80
-151
lines changed

Changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ Language Features:
44
* General: Add a builtin that computes the base slot of a storage namespace using the `erc7201` formula from ERC-7201.
55

66
Compiler Features:
7+
* Commandline Interface: Disallow selecting the deprecated assembly input mode that was only accessible via `--assemble` instead of treating it as equivalent to `--strict-assembly`.
78
* Commandline Interface: Introduce `--experimental` flag required for enabling the experimental mode.
89
* General: Introduce the SSA CFG codegen (experimental).
910
* General: Restrict the existing experimental features (`generic-solidity`, `lsp`, `ethdebug`, `eof`, `evm`, `ast-import`, `evmasm-import`, `ir-ast`, `ssa-cfg`) to experimental mode.

libsolidity/interface/CompilerStack.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -850,7 +850,6 @@ YulStack CompilerStack::loadGeneratedIR(std::string const& _ir) const
850850
YulStack stack(
851851
m_evmVersion,
852852
m_eofVersion,
853-
YulStack::Language::StrictAssembly,
854853
m_optimiserSettings,
855854
m_debugInfoSelection,
856855
this, // _soliditySourceProvider

libsolidity/interface/StandardCompiler.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1755,7 +1755,6 @@ Json StandardCompiler::compileYul(InputsAndSettings _inputsAndSettings)
17551755
YulStack stack(
17561756
_inputsAndSettings.evmVersion,
17571757
_inputsAndSettings.eofVersion,
1758-
YulStack::Language::StrictAssembly,
17591758
_inputsAndSettings.optimiserSettings,
17601759
_inputsAndSettings.debugInfoSelection.has_value() ?
17611760
_inputsAndSettings.debugInfoSelection.value() :

libyul/ObjectOptimizer.cpp

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -43,17 +43,6 @@ using namespace solidity::util;
4343
using namespace solidity::yul;
4444

4545

46-
Dialect const& yul::languageToDialect(Language _language, EVMVersion _version, std::optional<uint8_t> _eofVersion)
47-
{
48-
switch (_language)
49-
{
50-
case Language::Assembly:
51-
case Language::StrictAssembly:
52-
return EVMDialect::strictAssemblyForEVMObjects(_version, _eofVersion);
53-
}
54-
util::unreachable();
55-
}
56-
5746
void ObjectOptimizer::optimize(Object& _object, Settings const& _settings)
5847
{
5948
yulAssert(_object.subId.empty(), "Not a top-level object.");
@@ -77,10 +66,8 @@ void ObjectOptimizer::optimize(Object& _object, Settings const& _settings, bool
7766
);
7867
}
7968

80-
Dialect const& dialect = languageToDialect(_settings.language, _settings.evmVersion, _settings.eofVersion);
81-
std::unique_ptr<GasMeter> meter;
82-
if (EVMDialect const* evmDialect = dynamic_cast<EVMDialect const*>(&dialect))
83-
meter = std::make_unique<GasMeter>(*evmDialect, _isCreation, _settings.expectedExecutionsPerDeployment);
69+
EVMDialect const& dialect = EVMDialect::strictAssemblyForEVMObjects(_settings.evmVersion, _settings.eofVersion);
70+
GasMeter const meter(dialect, _isCreation, _settings.expectedExecutionsPerDeployment);
8471

8572
std::optional<h256> cacheKey = calculateCacheKey(_object.code()->root(), *_object.debugData, _settings, _isCreation);
8673
if (cacheKey.has_value() && m_cachedObjects.count(*cacheKey) != 0)
@@ -90,7 +77,7 @@ void ObjectOptimizer::optimize(Object& _object, Settings const& _settings, bool
9077
}
9178

9279
OptimiserSuite::run(
93-
meter.get(),
80+
&meter,
9481
_object,
9582
_settings.optimizeStackAllocation,
9683
_settings.yulOptimiserSteps,
@@ -141,7 +128,7 @@ std::optional<h256> ObjectOptimizer::calculateCacheKey(
141128
)
142129
{
143130
AsmPrinter asmPrinter(
144-
languageToDialect(_settings.language, _settings.evmVersion, _settings.eofVersion),
131+
EVMDialect::strictAssemblyForEVMObjects(_settings.evmVersion, _settings.eofVersion),
145132
_debugData.sourceNames,
146133
DebugInfoSelection::All()
147134
);
@@ -153,7 +140,6 @@ std::optional<h256> ObjectOptimizer::calculateCacheKey(
153140
// we just regenerate them by reparsing the object.
154141
rawKey += keccak256(asmPrinter(_ast)).asBytes();
155142
rawKey += keccak256(_debugData.formatUseSrcComment()).asBytes();
156-
rawKey += h256(u256(_settings.language)).asBytes();
157143
static_assert(static_cast<uint8_t>(static_cast<bool>(2)) == 1);
158144
rawKey += FixedHash<1>(static_cast<uint8_t>(_settings.optimizeStackAllocation)).asBytes();
159145
rawKey += h256(u256(_settings.expectedExecutionsPerDeployment)).asBytes();

libyul/ObjectOptimizer.h

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -32,14 +32,6 @@
3232
namespace solidity::yul
3333
{
3434

35-
enum class Language
36-
{
37-
Assembly,
38-
StrictAssembly,
39-
};
40-
41-
Dialect const& languageToDialect(Language _language, langutil::EVMVersion _version, std::optional<uint8_t> _eofVersion);
42-
4335
/// Encapsulates logic for applying @a yul::OptimiserSuite to a whole hierarchy of Yul objects.
4436
/// Also, acts as a transparent cache for optimized objects.
4537
///
@@ -56,7 +48,6 @@ class ObjectOptimizer
5648
/// must uniquely determine the result of optimization.
5749
struct Settings
5850
{
59-
Language language;
6051
langutil::EVMVersion evmVersion;
6152
std::optional<uint8_t> eofVersion;
6253
bool optimizeStackAllocation;

libyul/YulStack.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ bool YulStack::parse(std::string const& _sourceName, std::string const& _source)
5858
{
5959
m_charStream = std::make_unique<CharStream>(_source, _sourceName);
6060
std::shared_ptr<Scanner> scanner = std::make_shared<Scanner>(*m_charStream);
61-
m_parserResult = ObjectParser(m_errorReporter, languageToDialect(m_language, m_evmVersion, m_eofVersion)).parse(scanner, false);
61+
m_parserResult = ObjectParser(m_errorReporter, EVMDialect::strictAssemblyForEVMObjects(m_evmVersion, m_eofVersion)).parse(scanner, false);
6262
}
6363
catch (UnimplementedFeatureError const& _error)
6464
{
@@ -130,7 +130,6 @@ void YulStack::optimize()
130130
m_objectOptimizer->optimize(
131131
*m_parserResult,
132132
ObjectOptimizer::Settings{
133-
m_language,
134133
m_evmVersion,
135134
m_eofVersion,
136135
optimizeStackAllocation,
@@ -166,7 +165,7 @@ bool YulStack::analyzeParsed(Object& _object)
166165
AsmAnalyzer analyzer(
167166
*_object.analysisInfo,
168167
m_errorReporter,
169-
languageToDialect(m_language, m_evmVersion, m_eofVersion),
168+
EVMDialect::strictAssemblyForEVMObjects(m_evmVersion, m_eofVersion),
170169
{},
171170
_object.summarizeStructure()
172171
);
@@ -210,7 +209,6 @@ void YulStack::reparse()
210209
YulStack cleanStack(
211210
m_evmVersion,
212211
m_eofVersion,
213-
m_language,
214212
m_optimiserSettings,
215213
m_debugInfoSelection,
216214
m_soliditySourceProvider,
@@ -400,7 +398,7 @@ Json YulStack::cfgJson() const
400398
// NOTE: The block Ids are reset for each object
401399
std::unique_ptr<ssa::ControlFlow> controlFlow = ssa::SSACFGBuilder::build(
402400
*_object.analysisInfo,
403-
languageToDialect(m_language, m_evmVersion, m_eofVersion),
401+
EVMDialect::strictAssemblyForEVMObjects(m_evmVersion, m_eofVersion),
404402
_object.code()->root(),
405403
keepLiteralAssignments
406404
);

libyul/YulStack.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,6 @@ struct MachineAssemblyObject
6969
class YulStack: public langutil::CharStreamProvider
7070
{
7171
public:
72-
using Language = yul::Language;
7372
enum class Machine { EVM };
7473
enum State {
7574
Empty,
@@ -81,7 +80,6 @@ class YulStack: public langutil::CharStreamProvider
8180
YulStack(
8281
langutil::EVMVersion{},
8382
std::nullopt,
84-
Language::Assembly,
8583
solidity::frontend::OptimiserSettings::none(),
8684
langutil::DebugInfoSelection::Default()
8785
)
@@ -90,13 +88,11 @@ class YulStack: public langutil::CharStreamProvider
9088
YulStack(
9189
langutil::EVMVersion _evmVersion,
9290
std::optional<uint8_t> _eofVersion,
93-
Language _language,
9491
solidity::frontend::OptimiserSettings _optimiserSettings,
9592
langutil::DebugInfoSelection const& _debugInfoSelection,
9693
langutil::CharStreamProvider const* _soliditySourceProvider = nullptr,
9794
std::shared_ptr<ObjectOptimizer> _objectOptimizer = nullptr
9895
):
99-
m_language(_language),
10096
m_evmVersion(_evmVersion),
10197
m_eofVersion(_eofVersion),
10298
m_optimiserSettings(std::move(_optimiserSettings)),
@@ -174,7 +170,6 @@ class YulStack: public langutil::CharStreamProvider
174170

175171
void reportUnimplementedFeatureError(langutil::UnimplementedFeatureError const& _error);
176172

177-
Language m_language = Language::Assembly;
178173
langutil::EVMVersion m_evmVersion;
179174
std::optional<uint8_t> m_eofVersion;
180175
solidity::frontend::OptimiserSettings m_optimiserSettings;

solc/CommandLineInterface.cpp

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -848,7 +848,7 @@ void CommandLineInterface::processInput()
848848
serveLSP();
849849
break;
850850
case InputMode::Assembler:
851-
assembleYul(m_options.assembly.inputLanguage, m_options.assembly.targetMachine);
851+
assembleYul(m_options.assembly.targetMachine);
852852
break;
853853
case InputMode::Linker:
854854
link();
@@ -1286,7 +1286,7 @@ std::string CommandLineInterface::objectWithLinkRefsHex(evmasm::LinkerObject con
12861286
return out;
12871287
}
12881288

1289-
void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::YulStack::Machine _targetMachine)
1289+
void CommandLineInterface::assembleYul(yul::YulStack::Machine _targetMachine)
12901290
{
12911291
solAssert(m_options.input.mode == InputMode::Assembler);
12921292

@@ -1298,7 +1298,6 @@ void CommandLineInterface::assembleYul(yul::YulStack::Language _language, yul::Y
12981298
auto& stack = yulStacks[sourceUnitName] = yul::YulStack(
12991299
m_options.output.evmVersion,
13001300
m_options.output.eofVersion,
1301-
_language,
13021301
m_options.optimiserSettings(),
13031302
m_options.output.debugInfoSelection.has_value() ?
13041303
m_options.output.debugInfoSelection.value() :

solc/CommandLineInterface.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ class CommandLineInterface
9595
/// @returns the full object with library placeholder hints in hex.
9696
static std::string objectWithLinkRefsHex(evmasm::LinkerObject const& _obj);
9797

98-
void assembleYul(yul::YulStack::Language _language, yul::YulStack::Machine _targetMachine);
98+
void assembleYul(yul::YulStack::Machine _targetMachine);
9999

100100
void outputCompilationResults();
101101

solc/CommandLineParser.cpp

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -630,11 +630,6 @@ General Information)").c_str(),
630630
"(experimental) Select desired EOF version. Currently the only valid value is 1. "
631631
"If not specified, non-EOF bytecode will be generated."
632632
)
633-
(
634-
g_strYul.c_str(),
635-
"(disabled) Switch to typed Yul mode. The typed Yul dialect is no longer supported. "
636-
"For regular Yul compilation use --strict-assembly instead."
637-
)
638633
(
639634
g_strExperimentalViaIR.c_str(),
640635
"Deprecated synonym of --via-ir."
@@ -681,10 +676,6 @@ General Information)").c_str(),
681676
("Switch to linker mode, ignoring all options apart from --" + g_strLibraries + " "
682677
"and modify binaries in place.").c_str()
683678
)
684-
(
685-
g_strAssemble.c_str(),
686-
"Switch to assembly mode and assume input is assembly."
687-
)
688679
(
689680
g_strStrictAssembly.c_str(),
690681
"Switch to strict assembly mode and assume input is strict assembly."
@@ -967,6 +958,12 @@ po::positional_options_description CommandLineParser::positionalOptionsDescripti
967958
void CommandLineParser::parseArgs(int _argc, char const* const* _argv)
968959
{
969960
po::options_description allOptions = optionsDescription();
961+
// Disabled options: still accepted for parsing so that we can produce a proper error message,
962+
// but hidden from --help output.
963+
allOptions.add_options()
964+
(g_strAssemble.c_str(), "")
965+
(g_strYul.c_str(), "")
966+
;
970967
po::positional_options_description filesPositions = positionalOptionsDescription();
971968

972969
m_options = {};
@@ -1004,7 +1001,6 @@ void CommandLineParser::processArgs()
10041001
g_strVersion,
10051002
g_strStandardJSON,
10061003
g_strLink,
1007-
g_strAssemble,
10081004
g_strStrictAssembly,
10091005
g_strImportAst,
10101006
g_strLSP,
@@ -1023,7 +1019,7 @@ void CommandLineParser::processArgs()
10231019
m_options.input.mode = InputMode::StandardJson;
10241020
else if (m_args.count(g_strLSP))
10251021
m_options.input.mode = InputMode::LanguageServer;
1026-
else if (m_args.count(g_strAssemble) > 0 || m_args.count(g_strStrictAssembly) > 0)
1022+
else if (m_args.contains(g_strStrictAssembly))
10271023
m_options.input.mode = InputMode::Assembler;
10281024
else if (m_args.count(g_strLink) > 0)
10291025
m_options.input.mode = InputMode::Linker;
@@ -1056,6 +1052,13 @@ void CommandLineParser::processArgs()
10561052
"please use --strict-assembly instead."
10571053
);
10581054

1055+
if (m_args.contains(g_strAssemble))
1056+
solThrow(
1057+
CommandLineValidationError,
1058+
"The assembly input mode formerly accessible via --assemble is no longer supported, "
1059+
"please use --strict-assembly instead."
1060+
);
1061+
10591062
std::map<std::string, std::set<InputMode>> validOptionInputModeCombinations = {
10601063
// TODO: This should eventually contain all options.
10611064
{g_strExperimentalViaIR, {InputMode::Compiler, InputMode::CompilerWithASTImport}},
@@ -1356,9 +1359,7 @@ void CommandLineParser::processArgs()
13561359
}
13571360

13581361
// switch to assembly mode
1359-
using Input = yul::YulStack::Language;
13601362
using Machine = yul::YulStack::Machine;
1361-
m_options.assembly.inputLanguage = m_args.count(g_strStrictAssembly) ? Input::StrictAssembly : Input::Assembly;
13621363

13631364
if (m_args.count(g_strMachine))
13641365
{
@@ -1368,30 +1369,15 @@ void CommandLineParser::processArgs()
13681369
else
13691370
solThrow(CommandLineValidationError, "Invalid option for --" + g_strMachine + ": " + machine);
13701371
}
1371-
if (m_args.count(g_strYulDialect))
1372+
if (m_args.contains(g_strYulDialect))
13721373
{
1373-
std::string dialect = m_args[g_strYulDialect].as<std::string>();
1374-
if (dialect == g_strEVM)
1375-
m_options.assembly.inputLanguage = Input::StrictAssembly;
1376-
else
1374+
auto const& dialect = m_args[g_strYulDialect].as<std::string>();
1375+
if (dialect != g_strEVM)
13771376
solThrow(CommandLineValidationError, "Invalid option for --" + g_strYulDialect + ": " + dialect);
13781377
}
1379-
if (
1380-
(m_options.optimizer.optimizeEvmasm || m_options.optimizer.optimizeYul) &&
1381-
m_options.assembly.inputLanguage != Input::StrictAssembly
1382-
)
1383-
solThrow(
1384-
CommandLineValidationError,
1385-
"Optimizer can only be used for strict assembly. Use --" + g_strStrictAssembly + "."
1386-
);
13871378

13881379
m_options.output.viaSSACFG = m_args.contains(g_strViaSSACFG);
1389-
if (m_options.output.viaSSACFG)
1390-
if (m_options.assembly.inputLanguage != Input::StrictAssembly)
1391-
solThrow(
1392-
CommandLineValidationError,
1393-
"--" + g_strViaSSACFG + " can only be used with strict assembly. Use --" + g_strStrictAssembly + "."
1394-
);
1380+
13951381
if (m_options.compiler.outputs.ethdebug || m_options.compiler.outputs.ethdebugRuntime)
13961382
{
13971383
if (m_options.output.viaSSACFG)

0 commit comments

Comments
 (0)