Add yulDetails.optimizerSteps to the standard JSON interface

This commit is contained in:
Kamil Śliwak
2020-04-24 17:30:56 +02:00
parent 35cc64e33d
commit c8b612536f
13 changed files with 151 additions and 2 deletions
+1
View File
@@ -1265,6 +1265,7 @@ string CompilerStack::createMetadata(Contract const& _contract) const
{
details["yulDetails"] = Json::objectValue;
details["yulDetails"]["stackAllocation"] = m_optimiserSettings.optimizeStackAllocation;
details["yulDetails"]["optimizerSteps"] = m_optimiserSettings.yulOptimiserSteps;
}
meta["settings"]["optimizer"]["details"] = std::move(details);
+31 -1
View File
@@ -25,6 +25,7 @@
#include <libsolidity/ast/ASTJsonConverter.h>
#include <libyul/AssemblyStack.h>
#include <libyul/Exceptions.h>
#include <libyul/optimiser/Suite.h>
#include <liblangutil/SourceReferenceFormatter.h>
#include <libevmasm/Instruction.h>
#include <libsolutil/JSON.h>
@@ -402,6 +403,33 @@ std::optional<Json::Value> checkOptimizerDetail(Json::Value const& _details, std
return {};
}
std::optional<Json::Value> checkOptimizerDetailSteps(Json::Value const& _details, std::string const& _name, string& _setting)
{
if (_details.isMember(_name))
{
if (_details[_name].isString())
{
try
{
yul::OptimiserSuite::validateSequence(_details[_name].asString());
}
catch (yul::OptimizerException const& _exception)
{
return formatFatalError(
"JSONError",
"Invalid optimizer step sequence in \"settings.optimizer.details." + _name + "\": " + _exception.what()
);
}
_setting = _details[_name].asString();
}
else
return formatFatalError("JSONError", "\"settings.optimizer.details." + _name + "\" must be a string");
}
return {};
}
std::optional<Json::Value> checkMetadataKeys(Json::Value const& _input)
{
if (_input.isObject())
@@ -511,10 +539,12 @@ boost::variant<OptimiserSettings, Json::Value> parseOptimizerSettings(Json::Valu
if (!settings.runYulOptimiser)
return formatFatalError("JSONError", "\"Providing yulDetails requires Yul optimizer to be enabled.");
if (auto result = checkKeys(details["yulDetails"], {"stackAllocation"}, "settings.optimizer.details.yulDetails"))
if (auto result = checkKeys(details["yulDetails"], {"stackAllocation", "optimizerSteps"}, "settings.optimizer.details.yulDetails"))
return *result;
if (auto error = checkOptimizerDetail(details["yulDetails"], "stackAllocation", settings.optimizeStackAllocation))
return *error;
if (auto error = checkOptimizerDetailSteps(details["yulDetails"], "optimizerSteps", settings.yulOptimiserSteps))
return *error;
}
}
return { std::move(settings) };