mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Make optimiser settings available to assembly stack.
This commit is contained in:
@@ -61,14 +61,13 @@ boost::optional<Error> parseAndReturnFirstError(
|
||||
AssemblyStack::Machine _machine = AssemblyStack::Machine::EVM
|
||||
)
|
||||
{
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion(), _language);
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion(), _language, dev::solidity::OptimiserSettings::none());
|
||||
bool success = false;
|
||||
try
|
||||
{
|
||||
success = stack.parseAndAnalyze("", _source);
|
||||
bool const optimize = false;
|
||||
if (success && _assemble)
|
||||
stack.assemble(_machine, optimize);
|
||||
stack.assemble(_machine);
|
||||
}
|
||||
catch (FatalError const&)
|
||||
{
|
||||
@@ -124,7 +123,7 @@ Error expectError(
|
||||
|
||||
void parsePrintCompare(string const& _source, bool _canWarn = false)
|
||||
{
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion());
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion(), AssemblyStack::Language::Assembly, OptimiserSettings::none());
|
||||
BOOST_REQUIRE(stack.parseAndAnalyze("", _source));
|
||||
if (_canWarn)
|
||||
BOOST_REQUIRE(Error::containsOnlyWarnings(stack.errors()));
|
||||
@@ -598,7 +597,7 @@ BOOST_AUTO_TEST_CASE(print_string_literal_unicode)
|
||||
{
|
||||
string source = "{ let x := \"\\u1bac\" }";
|
||||
string parsed = "object \"object\" {\n code {\n let x := \"\\xe1\\xae\\xac\"\n }\n}\n";
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion());
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion(), AssemblyStack::Language::Assembly, OptimiserSettings::none());
|
||||
BOOST_REQUIRE(stack.parseAndAnalyze("", source));
|
||||
BOOST_REQUIRE(stack.errors().empty());
|
||||
BOOST_CHECK_EQUAL(stack.print(), parsed);
|
||||
|
||||
@@ -65,7 +65,10 @@ pair<shared_ptr<Block>, shared_ptr<yul::AsmAnalysisInfo>> yul::test::parse(strin
|
||||
{
|
||||
AssemblyStack stack(
|
||||
dev::test::Options::get().evmVersion(),
|
||||
_yul ? AssemblyStack::Language::Yul : AssemblyStack::Language::StrictAssembly
|
||||
_yul ? AssemblyStack::Language::Yul : AssemblyStack::Language::StrictAssembly,
|
||||
dev::test::Options::get().optimize ?
|
||||
dev::solidity::OptimiserSettings::standard() :
|
||||
dev::solidity::OptimiserSettings::minimal()
|
||||
);
|
||||
if (!stack.parseAndAnalyze("", _source) || !stack.errors().empty())
|
||||
BOOST_FAIL("Invalid source.");
|
||||
|
||||
@@ -64,17 +64,20 @@ ObjectCompilerTest::ObjectCompilerTest(string const& _filename)
|
||||
|
||||
bool ObjectCompilerTest::run(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
||||
{
|
||||
AssemblyStack stack(EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
m_optimize ? OptimiserSettings::full() : OptimiserSettings::minimal()
|
||||
);
|
||||
if (!stack.parseAndAnalyze("source", m_source))
|
||||
{
|
||||
AnsiColorized(_stream, _formatted, {formatting::BOLD, formatting::RED}) << _linePrefix << "Error parsing source." << endl;
|
||||
printErrors(_stream, stack.errors());
|
||||
return false;
|
||||
}
|
||||
if (m_optimize)
|
||||
stack.optimize();
|
||||
stack.optimize();
|
||||
|
||||
MachineAssemblyObject obj = stack.assemble(AssemblyStack::Machine::EVM, m_optimize);
|
||||
MachineAssemblyObject obj = stack.assemble(AssemblyStack::Machine::EVM);
|
||||
solAssert(obj.bytecode, "");
|
||||
|
||||
m_obtainedResult = "Assembly:\n" + obj.assembly;
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
#include <libyul/AssemblyStack.h>
|
||||
|
||||
#include <libsolidity/interface/OptimiserSettings.h>
|
||||
|
||||
#include <boost/optional.hpp>
|
||||
#include <boost/algorithm/string/replace.hpp>
|
||||
|
||||
@@ -48,7 +50,8 @@ std::pair<bool, ErrorList> parse(string const& _source)
|
||||
{
|
||||
AssemblyStack asmStack(
|
||||
dev::test::Options::get().evmVersion(),
|
||||
AssemblyStack::Language::StrictAssembly
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::none()
|
||||
);
|
||||
bool success = asmStack.parseAndAnalyze("source", _source);
|
||||
return {success, asmStack.errors()};
|
||||
@@ -242,7 +245,8 @@ BOOST_AUTO_TEST_CASE(to_string)
|
||||
expectation = boost::replace_all_copy(expectation, "\t", " ");
|
||||
AssemblyStack asmStack(
|
||||
dev::test::Options::get().evmVersion(),
|
||||
AssemblyStack::Language::StrictAssembly
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::none()
|
||||
);
|
||||
BOOST_REQUIRE(asmStack.parseAndAnalyze("source", code));
|
||||
BOOST_CHECK_EQUAL(asmStack.print(), expectation);
|
||||
|
||||
@@ -34,9 +34,12 @@ namespace
|
||||
{
|
||||
string assemble(string const& _input)
|
||||
{
|
||||
AssemblyStack asmStack;
|
||||
dev::solidity::OptimiserSettings settings = dev::solidity::OptimiserSettings::full();
|
||||
settings.runYulOptimiser = false;
|
||||
settings.optimizeStackAllocation = true;
|
||||
AssemblyStack asmStack(langutil::EVMVersion{}, AssemblyStack::Language::StrictAssembly, settings);
|
||||
BOOST_REQUIRE_MESSAGE(asmStack.parseAndAnalyze("", _input), "Source did not parse: " + _input);
|
||||
return dev::eth::disassemble(asmStack.assemble(AssemblyStack::Machine::EVM, true).bytecode->bytecode);
|
||||
return dev::eth::disassemble(asmStack.assemble(AssemblyStack::Machine::EVM).bytecode->bytecode);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -107,7 +107,11 @@ void YulInterpreterTest::printIndented(ostream& _stream, string const& _output,
|
||||
|
||||
bool YulInterpreterTest::parse(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
||||
{
|
||||
AssemblyStack stack(dev::test::Options::get().evmVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
dev::test::Options::get().evmVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::none()
|
||||
);
|
||||
if (stack.parseAndAnalyze("", m_source))
|
||||
{
|
||||
m_ast = stack.parserResult()->code;
|
||||
|
||||
@@ -296,7 +296,8 @@ bool YulOptimizerTest::parse(ostream& _stream, string const& _linePrefix, bool c
|
||||
{
|
||||
AssemblyStack stack(
|
||||
dev::test::Options::get().evmVersion(),
|
||||
m_yul ? AssemblyStack::Language::Yul : AssemblyStack::Language::StrictAssembly
|
||||
m_yul ? AssemblyStack::Language::Yul : AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::none()
|
||||
);
|
||||
if (!stack.parseAndAnalyze("", m_source) || !stack.errors().empty())
|
||||
{
|
||||
|
||||
@@ -28,14 +28,18 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
|
||||
return 0;
|
||||
|
||||
string input(reinterpret_cast<char const*>(_data), _size);
|
||||
AssemblyStack stack(langutil::EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
langutil::EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::full()
|
||||
);
|
||||
|
||||
if (!stack.parseAndAnalyze("source", input))
|
||||
return 0;
|
||||
|
||||
try
|
||||
{
|
||||
MachineAssemblyObject obj = stack.assemble(AssemblyStack::Machine::EVM, /*optimize=*/true);
|
||||
MachineAssemblyObject obj = stack.assemble(AssemblyStack::Machine::EVM);
|
||||
solAssert(obj.bytecode, "");
|
||||
}
|
||||
catch (StackTooDeepError const&)
|
||||
|
||||
@@ -55,11 +55,18 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
|
||||
}))
|
||||
return 0;
|
||||
|
||||
AssemblyStack stack(EVMVersion::petersburg(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
EVMVersion::petersburg(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::full()
|
||||
);
|
||||
try
|
||||
{
|
||||
if (!stack.parseAndAnalyze("source", input) || !stack.parserResult()->code ||
|
||||
!stack.parserResult()->analysisInfo)
|
||||
if (
|
||||
!stack.parseAndAnalyze("source", input) ||
|
||||
!stack.parserResult()->code ||
|
||||
!stack.parserResult()->analysisInfo
|
||||
)
|
||||
return 0;
|
||||
}
|
||||
catch (Exception const&)
|
||||
|
||||
@@ -27,7 +27,11 @@ extern "C" int LLVMFuzzerTestOneInput(uint8_t const* _data, size_t _size)
|
||||
return 0;
|
||||
|
||||
string input(reinterpret_cast<char const*>(_data), _size);
|
||||
AssemblyStack stack(langutil::EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
langutil::EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::full()
|
||||
);
|
||||
|
||||
if (!stack.parseAndAnalyze("source", input))
|
||||
return 0;
|
||||
|
||||
@@ -46,7 +46,11 @@ DEFINE_PROTO_FUZZER(Function const& _input)
|
||||
}
|
||||
|
||||
// AssemblyStack entry point
|
||||
AssemblyStack stack(langutil::EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
langutil::EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::full()
|
||||
);
|
||||
|
||||
// Parse protobuf mutated YUL code
|
||||
if (!stack.parseAndAnalyze("source", yul_source))
|
||||
|
||||
@@ -52,7 +52,11 @@ DEFINE_PROTO_FUZZER(Function const& _input)
|
||||
}
|
||||
|
||||
// AssemblyStack entry point
|
||||
AssemblyStack stack(langutil::EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
langutil::EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
dev::solidity::OptimiserSettings::full()
|
||||
);
|
||||
|
||||
try
|
||||
{
|
||||
|
||||
@@ -63,7 +63,11 @@ void printErrors(ErrorList const& _errors)
|
||||
|
||||
pair<shared_ptr<Block>, shared_ptr<AsmAnalysisInfo>> parse(string const& _source)
|
||||
{
|
||||
AssemblyStack stack(langutil::EVMVersion(), AssemblyStack::Language::StrictAssembly);
|
||||
AssemblyStack stack(
|
||||
langutil::EVMVersion(),
|
||||
AssemblyStack::Language::StrictAssembly,
|
||||
solidity::OptimiserSettings::none()
|
||||
);
|
||||
if (stack.parseAndAnalyze("--INPUT--", _source))
|
||||
{
|
||||
yulAssert(stack.errors().empty(), "Parsed successfully but had errors.");
|
||||
|
||||
Reference in New Issue
Block a user