[libsolidity] Add basic optimizer support for assembly json import.

This commit is contained in:
Alexander Arlt 2021-11-08 20:05:41 -05:00
parent 4473b3ca2d
commit 4f2056ff8f
2 changed files with 21 additions and 6 deletions

View File

@ -661,12 +661,24 @@ bool CompilerStack::compile(State _stopAfter)
string const evmAssemblyJsonSource = m_evmAssemblyJson.begin()->first;
evmasm::Assembly::OptimiserSettings optimiserSettings;
optimiserSettings.evmVersion = m_evmVersion;
optimiserSettings.expectedExecutionsPerDeployment = m_optimiserSettings.expectedExecutionsPerDeployment;
optimiserSettings.runCSE = m_optimiserSettings.runCSE;
optimiserSettings.runConstantOptimiser = m_optimiserSettings.runConstantOptimiser;
optimiserSettings.runDeduplicate = m_optimiserSettings.runDeduplicate;
optimiserSettings.runInliner = m_optimiserSettings.runInliner;
optimiserSettings.runJumpdestRemover = m_optimiserSettings.runJumpdestRemover;
optimiserSettings.runPeephole = m_optimiserSettings.runPeephole;
m_contracts[evmAssemblyJsonSource].evmAssembly = make_shared<evmasm::Assembly>(evmAssemblyJsonSource);
m_contracts[evmAssemblyJsonSource].evmAssembly->loadFromAssemblyJSON(m_evmAssemblyJson[evmAssemblyJsonSource]);
m_contracts[evmAssemblyJsonSource].evmAssembly->optimise(optimiserSettings);
m_contracts[evmAssemblyJsonSource].object = m_contracts[evmAssemblyJsonSource].evmAssembly->assemble();
m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly = make_shared<evmasm::Assembly>(evmAssemblyJsonSource);
m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->loadFromAssemblyJSON(m_evmAssemblyJson[evmAssemblyJsonSource][".data"]["0"]);
m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->optimise(optimiserSettings);
m_contracts[evmAssemblyJsonSource].runtimeObject = m_contracts[evmAssemblyJsonSource].evmRuntimeAssembly->assemble();
}
else

View File

@ -1218,12 +1218,15 @@ bool CommandLineParser::processArgs()
}
if (m_options.optimizer.enabled && (m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm))
{
serr() <<
"Optimizer can only be used for strict assembly. Use --" <<
g_strStrictAssembly <<
"." <<
endl;
return false;
if (m_options.input.mode != InputMode::CompilerWithEvmAssemblyJsonImport)
{
serr() <<
"Optimizer can only be used for strict assembly or with assembly import. Use --" <<
g_strStrictAssembly <<
" or --" << g_strImportEvmAssemblerJson << "." <<
endl;
return false;
}
}
if (m_options.assembly.targetMachine == Machine::Ewasm && m_options.assembly.inputLanguage != Input::StrictAssembly && m_options.assembly.inputLanguage != Input::Ewasm)
{