mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #13733 from ethereum/eofSetting
Add experimental EOF options for CLI and Standard JSON.
This commit is contained in:
+1
-1
@@ -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)
|
||||
|
||||
@@ -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{};
|
||||
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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;
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user