From 0bd049c849d9ccd4a5b8e9b18fd7fe8d79b49a74 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 13 Feb 2019 12:07:20 +0100 Subject: [PATCH] Adapet uses of AssemblyStack. --- libyul/AssemblyStack.cpp | 59 ++++++++++++++--------------- libyul/AssemblyStack.h | 13 ++----- solc/CommandLineInterface.cpp | 34 +++++++++-------- solc/CommandLineInterface.h | 4 +- test/libsolidity/InlineAssembly.cpp | 11 ++++-- test/libyul/ObjectCompilerTest.cpp | 2 +- test/libyul/ObjectParser.cpp | 15 +++----- test/libyul/StackReuseCodegen.cpp | 9 ++--- 8 files changed, 71 insertions(+), 76 deletions(-) diff --git a/libyul/AssemblyStack.cpp b/libyul/AssemblyStack.cpp index 6eca638bc..0b5cc2ffb 100644 --- a/libyul/AssemblyStack.cpp +++ b/libyul/AssemblyStack.cpp @@ -20,10 +20,7 @@ */ -#include - -#include -#include +#include #include #include @@ -37,26 +34,28 @@ #include #include +#include +#include + using namespace std; -using namespace dev; using namespace langutil; -using namespace dev::solidity; +using namespace yul; namespace { -shared_ptr languageToDialect(AssemblyStack::Language _language) +shared_ptr languageToDialect(AssemblyStack::Language _language) { switch (_language) { case AssemblyStack::Language::Assembly: - return yul::EVMDialect::looseAssemblyForEVM(); + return EVMDialect::looseAssemblyForEVM(); case AssemblyStack::Language::StrictAssembly: - return yul::EVMDialect::strictAssemblyForEVMObjects(); + return EVMDialect::strictAssemblyForEVMObjects(); case AssemblyStack::Language::Yul: - return yul::Dialect::yul(); + return Dialect::yul(); } solAssert(false, ""); - return yul::Dialect::yul(); + return Dialect::yul(); } } @@ -73,7 +72,7 @@ bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string m_errors.clear(); m_analysisSuccessful = false; m_scanner = make_shared(CharStream(_source, _sourceName)); - m_parserResult = yul::ObjectParser(m_errorReporter, languageToDialect(m_language)).parse(m_scanner, false); + m_parserResult = ObjectParser(m_errorReporter, languageToDialect(m_language)).parse(m_scanner, false); if (!m_errorReporter.errors().empty()) return false; solAssert(m_parserResult, ""); @@ -99,43 +98,43 @@ bool AssemblyStack::analyzeParsed() return m_analysisSuccessful; } -bool AssemblyStack::analyzeParsed(yul::Object& _object) +bool AssemblyStack::analyzeParsed(Object& _object) { solAssert(_object.code, ""); - _object.analysisInfo = make_shared(); - yul::AsmAnalyzer analyzer(*_object.analysisInfo, m_errorReporter, m_evmVersion, boost::none, languageToDialect(m_language)); + _object.analysisInfo = make_shared(); + AsmAnalyzer analyzer(*_object.analysisInfo, m_errorReporter, m_evmVersion, boost::none, languageToDialect(m_language)); bool success = analyzer.analyze(*_object.code); for (auto& subNode: _object.subObjects) - if (auto subObject = dynamic_cast(subNode.get())) + if (auto subObject = dynamic_cast(subNode.get())) if (!analyzeParsed(*subObject)) success = false; return success; } -void AssemblyStack::compileEVM(yul::AbstractAssembly& _assembly, bool _evm15, bool _optimize) const +void AssemblyStack::compileEVM(AbstractAssembly& _assembly, bool _evm15, bool _optimize) const { - shared_ptr dialect; + shared_ptr dialect; if (m_language == Language::Assembly) - dialect = yul::EVMDialect::looseAssemblyForEVM(); + dialect = EVMDialect::looseAssemblyForEVM(); else if (m_language == AssemblyStack::Language::StrictAssembly) - dialect = yul::EVMDialect::strictAssemblyForEVMObjects(); + dialect = EVMDialect::strictAssemblyForEVMObjects(); else if (m_language == AssemblyStack::Language::Yul) - dialect = yul::EVMDialect::yulForEVM(); + dialect = EVMDialect::yulForEVM(); else solAssert(false, "Invalid language."); - yul::EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _evm15, _optimize); + EVMObjectCompiler::compile(*m_parserResult, _assembly, *dialect, _evm15, _optimize); } -void AssemblyStack::optimize(yul::Object& _object) +void AssemblyStack::optimize(Object& _object) { solAssert(_object.code, ""); solAssert(_object.analysisInfo, ""); for (auto& subNode: _object.subObjects) - if (auto subObject = dynamic_cast(subNode.get())) + if (auto subObject = dynamic_cast(subNode.get())) optimize(*subObject); - yul::OptimiserSuite::run(languageToDialect(m_language), *_object.code, *_object.analysisInfo); + OptimiserSuite::run(languageToDialect(m_language), *_object.code, *_object.analysisInfo); } MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize) const @@ -150,19 +149,19 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine, bool _optimize) case Machine::EVM: { MachineAssemblyObject object; - eth::Assembly assembly; - yul::EthAssemblyAdapter adapter(assembly); + dev::eth::Assembly assembly; + EthAssemblyAdapter adapter(assembly); compileEVM(adapter, false, _optimize); - object.bytecode = make_shared(assembly.assemble()); + object.bytecode = make_shared(assembly.assemble()); object.assembly = assembly.assemblyString(); return object; } case Machine::EVM15: { MachineAssemblyObject object; - yul::EVMAssembly assembly(true); + EVMAssembly assembly(true); compileEVM(assembly, true, _optimize); - object.bytecode = make_shared(assembly.finalize()); + object.bytecode = make_shared(assembly.finalize()); /// TODO: fill out text representation return object; } diff --git a/libyul/AssemblyStack.h b/libyul/AssemblyStack.h index 01db6b617..c79eb46f7 100644 --- a/libyul/AssemblyStack.h +++ b/libyul/AssemblyStack.h @@ -36,19 +36,15 @@ namespace langutil { class Scanner; } + namespace yul { class AbstractAssembly; -} -namespace dev -{ -namespace solidity -{ struct MachineAssemblyObject { - std::shared_ptr bytecode; + std::shared_ptr bytecode; std::string assembly; }; @@ -62,7 +58,7 @@ public: enum class Language { Yul, Assembly, StrictAssembly }; enum class Machine { EVM, EVM15, eWasm }; - explicit AssemblyStack(EVMVersion _evmVersion = EVMVersion(), Language _language = Language::Assembly): + explicit AssemblyStack(dev::solidity::EVMVersion _evmVersion = dev::solidity::EVMVersion(), Language _language = Language::Assembly): m_language(_language), m_evmVersion(_evmVersion), m_errorReporter(m_errors) {} @@ -95,7 +91,7 @@ private: void optimize(yul::Object& _object); Language m_language = Language::Assembly; - EVMVersion m_evmVersion; + dev::solidity::EVMVersion m_evmVersion; std::shared_ptr m_scanner; @@ -106,4 +102,3 @@ private: }; } -} diff --git a/solc/CommandLineInterface.cpp b/solc/CommandLineInterface.cpp index 5485d3b05..cdb6f6c41 100644 --- a/solc/CommandLineInterface.cpp +++ b/solc/CommandLineInterface.cpp @@ -20,28 +20,30 @@ * @date 2014 * Solidity command line interface. */ -#include "CommandLineInterface.h" +#include #include "solidity/BuildInfo.h" #include "license.h" #include -#include #include #include #include #include -#include #include #include -#include -#include #include -#include + +#include #include #include +#include +#include +#include +#include + #include #include #include @@ -841,8 +843,8 @@ bool CommandLineInterface::processInput() { // switch to assembly mode m_onlyAssemble = true; - using Input = AssemblyStack::Language; - using Machine = AssemblyStack::Machine; + using Input = yul::AssemblyStack::Language; + using Machine = yul::AssemblyStack::Machine; Input inputLanguage = m_args.count(g_argYul) ? Input::Yul : (m_args.count(g_argStrictAssembly) ? Input::StrictAssembly : Input::Assembly); Machine targetMachine = Machine::EVM; bool optimize = m_args.count(g_argOptimize); @@ -1216,16 +1218,16 @@ string CommandLineInterface::objectWithLinkRefsHex(eth::LinkerObject const& _obj } bool CommandLineInterface::assemble( - AssemblyStack::Language _language, - AssemblyStack::Machine _targetMachine, + yul::AssemblyStack::Language _language, + yul::AssemblyStack::Machine _targetMachine, bool _optimize ) { bool successful = true; - map assemblyStacks; + map assemblyStacks; for (auto const& src: m_sourceCodes) { - auto& stack = assemblyStacks[src.first] = AssemblyStack(m_evmVersion, _language); + auto& stack = assemblyStacks[src.first] = yul::AssemblyStack(m_evmVersion, _language); try { if (!stack.parseAndAnalyze(src.first, src.second)) @@ -1272,16 +1274,16 @@ bool CommandLineInterface::assemble( for (auto const& src: m_sourceCodes) { string machine = - _targetMachine == AssemblyStack::Machine::EVM ? "EVM" : - _targetMachine == AssemblyStack::Machine::EVM15 ? "EVM 1.5" : + _targetMachine == yul::AssemblyStack::Machine::EVM ? "EVM" : + _targetMachine == yul::AssemblyStack::Machine::EVM15 ? "EVM 1.5" : "eWasm"; sout() << endl << "======= " << src.first << " (" << machine << ") =======" << endl; - AssemblyStack& stack = assemblyStacks[src.first]; + yul::AssemblyStack& stack = assemblyStacks[src.first]; sout() << endl << "Pretty printed source:" << endl; sout() << stack.print() << endl; - MachineAssemblyObject object; + yul::MachineAssemblyObject object; try { object = stack.assemble(_targetMachine); diff --git a/solc/CommandLineInterface.h b/solc/CommandLineInterface.h index 2b74f3e5e..cc425134b 100644 --- a/solc/CommandLineInterface.h +++ b/solc/CommandLineInterface.h @@ -22,7 +22,7 @@ #pragma once #include -#include +#include #include #include @@ -57,7 +57,7 @@ private: /// @returns the full object with library placeholder hints in hex. static std::string objectWithLinkRefsHex(eth::LinkerObject const& _obj); - bool assemble(AssemblyStack::Language _language, AssemblyStack::Machine _targetMachine, bool _optimize); + bool assemble(yul::AssemblyStack::Language _language, yul::AssemblyStack::Machine _targetMachine, bool _optimize); void outputCompilationResults(); diff --git a/test/libsolidity/InlineAssembly.cpp b/test/libsolidity/InlineAssembly.cpp index 92e4dcf6d..03e74befb 100644 --- a/test/libsolidity/InlineAssembly.cpp +++ b/test/libsolidity/InlineAssembly.cpp @@ -22,11 +22,15 @@ #include -#include +#include + +#include + +#include + #include #include -#include -#include + #include #include @@ -37,6 +41,7 @@ using namespace std; using namespace langutil; +using namespace yul; namespace dev { diff --git a/test/libyul/ObjectCompilerTest.cpp b/test/libyul/ObjectCompilerTest.cpp index d4a3a55d1..c710cfd4b 100644 --- a/test/libyul/ObjectCompilerTest.cpp +++ b/test/libyul/ObjectCompilerTest.cpp @@ -19,7 +19,7 @@ #include -#include +#include #include diff --git a/test/libyul/ObjectParser.cpp b/test/libyul/ObjectParser.cpp index 13a95788c..fc05a3e7a 100644 --- a/test/libyul/ObjectParser.cpp +++ b/test/libyul/ObjectParser.cpp @@ -23,7 +23,7 @@ #include -#include +#include #include #include @@ -34,8 +34,6 @@ using namespace std; using namespace langutil; -namespace dev -{ namespace yul { namespace test @@ -48,9 +46,9 @@ std::pair parse(string const& _source) { try { - solidity::AssemblyStack asmStack( + AssemblyStack asmStack( dev::test::Options::get().evmVersion(), - solidity::AssemblyStack::Language::StrictAssembly + AssemblyStack::Language::StrictAssembly ); bool success = asmStack.parseAndAnalyze("source", _source); return {success, asmStack.errors()}; @@ -107,7 +105,7 @@ do \ { \ Error err = expectError((text), false); \ BOOST_CHECK(err.type() == (Error::Type::typ)); \ - BOOST_CHECK(solidity::searchErrorMessage(err, (substring))); \ + BOOST_CHECK(dev::solidity::searchErrorMessage(err, (substring))); \ } while(0) BOOST_AUTO_TEST_SUITE(YulObjectParser) @@ -242,9 +240,9 @@ BOOST_AUTO_TEST_CASE(to_string) } )"; expectation = boost::replace_all_copy(expectation, "\t", " "); - solidity::AssemblyStack asmStack( + AssemblyStack asmStack( dev::test::Options::get().evmVersion(), - solidity::AssemblyStack::Language::StrictAssembly + AssemblyStack::Language::StrictAssembly ); BOOST_REQUIRE(asmStack.parseAndAnalyze("source", code)); BOOST_CHECK_EQUAL(asmStack.print(), expectation); @@ -284,4 +282,3 @@ BOOST_AUTO_TEST_SUITE_END() } } -} // end namespaces diff --git a/test/libyul/StackReuseCodegen.cpp b/test/libyul/StackReuseCodegen.cpp index 97be11d35..e1a3fd8c3 100644 --- a/test/libyul/StackReuseCodegen.cpp +++ b/test/libyul/StackReuseCodegen.cpp @@ -20,13 +20,11 @@ #include -#include +#include #include using namespace std; -namespace dev -{ namespace yul { namespace test @@ -36,9 +34,9 @@ namespace { string assemble(string const& _input) { - solidity::AssemblyStack asmStack; + AssemblyStack asmStack; BOOST_REQUIRE_MESSAGE(asmStack.parseAndAnalyze("", _input), "Source did not parse: " + _input); - return solidity::disassemble(asmStack.assemble(solidity::AssemblyStack::Machine::EVM, true).bytecode->bytecode); + return dev::solidity::disassemble(asmStack.assemble(AssemblyStack::Machine::EVM, true).bytecode->bytecode); } } @@ -350,4 +348,3 @@ BOOST_AUTO_TEST_SUITE_END() } } -}