Merge pull request #13733 from ethereum/eofSetting

Add experimental EOF options for CLI and Standard JSON.
This commit is contained in:
Daniel
2022-11-23 20:37:24 +01:00
committed by GitHub
38 changed files with 198 additions and 22 deletions
+1 -1
View File
@@ -164,7 +164,7 @@ void YulStack::compileEVM(AbstractAssembly& _assembly, bool _optimize) const
break;
}
EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _optimize);
EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _optimize, m_eofVersion);
}
void YulStack::optimize(Object& _object, bool _isCreation)
+4
View File
@@ -72,6 +72,7 @@ public:
YulStack():
YulStack(
langutil::EVMVersion{},
std::nullopt,
Language::Assembly,
solidity::frontend::OptimiserSettings::none(),
langutil::DebugInfoSelection::Default()
@@ -80,12 +81,14 @@ public:
YulStack(
langutil::EVMVersion _evmVersion,
std::optional<uint8_t> _eofVersion,
Language _language,
solidity::frontend::OptimiserSettings _optimiserSettings,
langutil::DebugInfoSelection const& _debugInfoSelection
):
m_language(_language),
m_evmVersion(_evmVersion),
m_eofVersion(_eofVersion),
m_optimiserSettings(std::move(_optimiserSettings)),
m_debugInfoSelection(_debugInfoSelection),
m_errorReporter(m_errors)
@@ -146,6 +149,7 @@ private:
Language m_language = Language::Assembly;
langutil::EVMVersion m_evmVersion;
std::optional<uint8_t> m_eofVersion;
solidity::frontend::OptimiserSettings m_optimiserSettings;
langutil::DebugInfoSelection m_debugInfoSelection{};
+14 -3
View File
@@ -35,9 +35,15 @@
using namespace solidity::yul;
using namespace std;
void EVMObjectCompiler::compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize)
void EVMObjectCompiler::compile(
Object& _object,
AbstractAssembly& _assembly,
EVMDialect const& _dialect,
bool _optimize,
std::optional<uint8_t> _eofVersion
)
{
EVMObjectCompiler compiler(_assembly, _dialect);
EVMObjectCompiler compiler(_assembly, _dialect, _eofVersion);
compiler.run(_object, _optimize);
}
@@ -54,7 +60,7 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
auto subAssemblyAndID = m_assembly.createSubAssembly(isCreation, subObject->name.str());
context.subIDs[subObject->name] = subAssemblyAndID.second;
subObject->subId = subAssemblyAndID.second;
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize);
compile(*subObject, *subAssemblyAndID.first, m_dialect, _optimize, m_eofVersion);
}
else
{
@@ -68,6 +74,11 @@ void EVMObjectCompiler::run(Object& _object, bool _optimize)
yulAssert(_object.analysisInfo, "No analysis info.");
yulAssert(_object.code, "No code.");
if (m_eofVersion.has_value())
yulAssert(
_optimize && (m_dialect.evmVersion() == langutil::EVMVersion()),
"Experimental EOF support is only available for optimized via-IR compilation and the most recent EVM version."
);
if (_optimize && m_dialect.evmVersion().canOverchargeGasForCall())
{
auto stackErrors = OptimizedEVMCodeTransform::run(
+13 -3
View File
@@ -21,6 +21,9 @@
#pragma once
#include <optional>
#include <cstdint>
namespace solidity::yul
{
struct Object;
@@ -30,16 +33,23 @@ struct EVMDialect;
class EVMObjectCompiler
{
public:
static void compile(Object& _object, AbstractAssembly& _assembly, EVMDialect const& _dialect, bool _optimize);
static void compile(
Object& _object,
AbstractAssembly& _assembly,
EVMDialect const& _dialect,
bool _optimize,
std::optional<uint8_t> _eofVersion
);
private:
EVMObjectCompiler(AbstractAssembly& _assembly, EVMDialect const& _dialect):
m_assembly(_assembly), m_dialect(_dialect)
EVMObjectCompiler(AbstractAssembly& _assembly, EVMDialect const& _dialect, std::optional<uint8_t> _eofVersion):
m_assembly(_assembly), m_dialect(_dialect), m_eofVersion(_eofVersion)
{}
void run(Object& _object, bool _optimize);
AbstractAssembly& m_assembly;
EVMDialect const& m_dialect;
std::optional<uint8_t> m_eofVersion;
};
}