From e43df3b72ae7e6c03ce632a8bf86c763683cf380 Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 7 May 2019 17:25:02 +0200 Subject: [PATCH 1/2] Move compile to cpp file. --- .../SolidityExecutionFramework.cpp | 59 +++++++++++++++++++ test/libsolidity/SolidityExecutionFramework.h | 50 +--------------- 2 files changed, 60 insertions(+), 49 deletions(-) diff --git a/test/libsolidity/SolidityExecutionFramework.cpp b/test/libsolidity/SolidityExecutionFramework.cpp index 1b2322e89..73ec95849 100644 --- a/test/libsolidity/SolidityExecutionFramework.cpp +++ b/test/libsolidity/SolidityExecutionFramework.cpp @@ -24,9 +24,11 @@ #include #include +using namespace dev; using namespace dev::test; using namespace dev::solidity; using namespace dev::solidity::test; +using namespace std; SolidityExecutionFramework::SolidityExecutionFramework(): ExecutionFramework() @@ -37,3 +39,60 @@ SolidityExecutionFramework::SolidityExecutionFramework(std::string const& _ipcPa ExecutionFramework(_ipcPath, _evmVersion) { } + +bytes SolidityExecutionFramework::compileContract( + string const& _sourceCode, + string const& _contractName, + map const& _libraryAddresses +) +{ + // Silence compiler version warning + std::string sourceCode = "pragma solidity >=0.0;\n"; + if ( + dev::test::Options::get().useABIEncoderV2 && + _sourceCode.find("pragma experimental ABIEncoderV2;") == std::string::npos + ) + sourceCode += "pragma experimental ABIEncoderV2;\n"; + sourceCode += _sourceCode; + m_compiler.reset(); + m_compiler.setSources({{"", sourceCode}}); + m_compiler.setLibraries(_libraryAddresses); + m_compiler.setEVMVersion(m_evmVersion); + m_compiler.setOptimiserSettings(m_optimiserSettings); + m_compiler.enableIRGeneration(m_compileViaYul); + if (!m_compiler.compile()) + { + langutil::SourceReferenceFormatter formatter(std::cerr); + + for (auto const& error: m_compiler.errors()) + formatter.printErrorInformation(*error); + BOOST_ERROR("Compiling contract failed"); + } + eth::LinkerObject obj; + if (m_compileViaYul) + { + yul::AssemblyStack asmStack( + m_evmVersion, + yul::AssemblyStack::Language::StrictAssembly, + // Ignore optimiser settings here because we need Yul optimisation to + // get code that does not exhaust the stack. + OptimiserSettings::full() + ); + if (!asmStack.parseAndAnalyze("", m_compiler.yulIROptimized( + _contractName.empty() ? m_compiler.lastContractName() : _contractName + ))) + { + langutil::SourceReferenceFormatter formatter(std::cerr); + + for (auto const& error: m_compiler.errors()) + formatter.printErrorInformation(*error); + BOOST_ERROR("Assembly contract failed. IR: " + m_compiler.yulIROptimized({})); + } + asmStack.optimize(); + obj = std::move(*asmStack.assemble(yul::AssemblyStack::Machine::EVM).bytecode); + } + else + obj = m_compiler.object(_contractName.empty() ? m_compiler.lastContractName() : _contractName); + BOOST_REQUIRE(obj.linkReferences.empty()); + return obj.bytecode; +} diff --git a/test/libsolidity/SolidityExecutionFramework.h b/test/libsolidity/SolidityExecutionFramework.h index 49c016699..f96940b44 100644 --- a/test/libsolidity/SolidityExecutionFramework.h +++ b/test/libsolidity/SolidityExecutionFramework.h @@ -65,55 +65,7 @@ public: std::string const& _sourceCode, std::string const& _contractName = "", std::map const& _libraryAddresses = std::map() - ) - { - // Silence compiler version warning - std::string sourceCode = "pragma solidity >=0.0;\n"; - if (dev::test::Options::get().useABIEncoderV2 && _sourceCode.find("pragma experimental ABIEncoderV2;") == std::string::npos) - sourceCode += "pragma experimental ABIEncoderV2;\n"; - sourceCode += _sourceCode; - m_compiler.reset(); - m_compiler.setSources({{"", sourceCode}}); - m_compiler.setLibraries(_libraryAddresses); - m_compiler.setEVMVersion(m_evmVersion); - m_compiler.setOptimiserSettings(m_optimiserSettings); - m_compiler.enableIRGeneration(m_compileViaYul); - if (!m_compiler.compile()) - { - langutil::SourceReferenceFormatter formatter(std::cerr); - - for (auto const& error: m_compiler.errors()) - formatter.printErrorInformation(*error); - BOOST_ERROR("Compiling contract failed"); - } - eth::LinkerObject obj; - if (m_compileViaYul) - { - yul::AssemblyStack asmStack( - m_evmVersion, - yul::AssemblyStack::Language::StrictAssembly, - // Ignore optimiser settings here because we need Yul optimisation to - // get code that does not exhaust the stack. - OptimiserSettings::full() - ); - if (!asmStack.parseAndAnalyze("", m_compiler.yulIROptimized( - _contractName.empty() ? m_compiler.lastContractName() : _contractName - ))) - { - langutil::SourceReferenceFormatter formatter(std::cerr); - - for (auto const& error: m_compiler.errors()) - formatter.printErrorInformation(*error); - BOOST_ERROR("Assembly contract failed. IR: " + m_compiler.yulIROptimized({})); - } - asmStack.optimize(); - obj = std::move(*asmStack.assemble(yul::AssemblyStack::Machine::EVM).bytecode); - } - else - obj = m_compiler.object(_contractName.empty() ? m_compiler.lastContractName() : _contractName); - BOOST_REQUIRE(obj.linkReferences.empty()); - return obj.bytecode; - } + ); protected: dev::solidity::CompilerStack m_compiler; From 701aed4bebf1b161b5cbbab7e9133e02d5d28bdd Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 7 May 2019 17:31:23 +0200 Subject: [PATCH 2/2] Also run some end to end tests via yul. --- test/libsolidity/SolidityEndToEndTest.cpp | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/test/libsolidity/SolidityEndToEndTest.cpp b/test/libsolidity/SolidityEndToEndTest.cpp index b90a47ddb..07bc1658b 100644 --- a/test/libsolidity/SolidityEndToEndTest.cpp +++ b/test/libsolidity/SolidityEndToEndTest.cpp @@ -43,6 +43,13 @@ using namespace std; using namespace std::placeholders; using namespace dev::test; +#define ALSO_VIA_YUL(CODE) \ +{ \ + { CODE } \ + m_compileViaYul = true; \ + { CODE } \ +} + namespace dev { namespace solidity @@ -92,8 +99,10 @@ BOOST_AUTO_TEST_CASE(empty_contract) char const* sourceCode = R"( contract test { } )"; - compileAndRun(sourceCode); - BOOST_CHECK(callContractFunction("i_am_not_there()", bytes()).empty()); + ALSO_VIA_YUL( + compileAndRun(sourceCode); + BOOST_CHECK(callContractFunction("i_am_not_there()", bytes()).empty()); + ) } BOOST_AUTO_TEST_CASE(exp_operator)