From 261731f7eea48902983c55163d377e26bbca07da Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 23 May 2017 19:21:14 +0200 Subject: Adapt EVM codegen to new namespace. --- libsolidity/interface/AssemblyStack.cpp | 85 +++++++++++++++++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 libsolidity/interface/AssemblyStack.cpp (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp new file mode 100644 index 00000000..c4bd63c4 --- /dev/null +++ b/libsolidity/interface/AssemblyStack.cpp @@ -0,0 +1,85 @@ +/* + This file is part of solidity. + + solidity is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + solidity is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with solidity. If not, see . +*/ +/** + * Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and + * eWasm as output. + */ + + +#include + +#include +#include +#include +#include +#include + +#include + +using namespace std; +using namespace dev; +using namespace dev::solidity; + + +Scanner const& AssemblyStack::scanner() const +{ + solAssert(m_scanner, ""); + return *m_scanner; +} + +bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string const& _source) +{ + m_analysisSuccessful = false; + m_scanner = make_shared(CharStream(_source), _sourceName); + m_parserResult = assembly::Parser(m_errors, m_language == Language::JULIA).parse(m_scanner); + if (!m_errors.empty()) + return false; + solAssert(m_parserResult, ""); + + m_analysisInfo = make_shared(); + assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errors); + m_analysisSuccessful = analyzer.analyze(*m_parserResult); + return m_analysisSuccessful; +} + +eth::LinkerObject AssemblyStack::assemble(Machine _machine) +{ + solAssert(m_analysisSuccessful, ""); + solAssert(m_parserResult, ""); + solAssert(m_analysisInfo, ""); + + switch (_machine) + { + case Machine::EVM: + { + auto assembly = assembly::CodeGenerator(m_errors).assemble(*m_parserResult, *m_analysisInfo); + return assembly.assemble(); + } + case Machine::EVM15: + solUnimplemented("EVM 1.5 backend is not yet implemented."); + case Machine::eWasm: + solUnimplemented("eWasm backend is not yet implemented."); + } + // unreachable + return eth::LinkerObject(); +} + +string AssemblyStack::print() +{ + solAssert(m_parserResult, ""); + return assembly::AsmPrinter(m_language == Language::JULIA)(*m_parserResult); +} -- cgit v1.2.3 From 89b60ffbd4c2dde26fa5e9f1d750729b5c89373e Mon Sep 17 00:00:00 2001 From: Rhett Aultman Date: Thu, 11 May 2017 06:26:35 -0700 Subject: Refactor error reporting This commit introduces ErrorReporter, a utility class which consolidates all of the error logging functionality into a common set of functions. It also replaces all direct interactions with an ErrorList with calls to an ErrorReporter. This commit resolves issue #2209 --- libsolidity/interface/AssemblyStack.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index c4bd63c4..b027ac3c 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -45,13 +45,13 @@ bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string { m_analysisSuccessful = false; m_scanner = make_shared(CharStream(_source), _sourceName); - m_parserResult = assembly::Parser(m_errors, m_language == Language::JULIA).parse(m_scanner); - if (!m_errors.empty()) + m_parserResult = assembly::Parser(m_errorReporter, m_language == Language::JULIA).parse(m_scanner); + if (!m_errorReporter.errors().empty()) return false; solAssert(m_parserResult, ""); m_analysisInfo = make_shared(); - assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errors); + assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter); m_analysisSuccessful = analyzer.analyze(*m_parserResult); return m_analysisSuccessful; } @@ -66,7 +66,7 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) { case Machine::EVM: { - auto assembly = assembly::CodeGenerator(m_errors).assemble(*m_parserResult, *m_analysisInfo); + auto assembly = assembly::CodeGenerator(m_errorReporter).assemble(*m_parserResult, *m_analysisInfo); return assembly.assemble(); } case Machine::EVM15: -- cgit v1.2.3 From 937c2083207f28e0b084959492f72ef01119c202 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Wed, 7 Jun 2017 14:41:44 +0100 Subject: Reset error list in parseAndAnalyze --- libsolidity/interface/AssemblyStack.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index b027ac3c..dc9d7db2 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -43,6 +43,7 @@ Scanner const& AssemblyStack::scanner() const bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string const& _source) { + m_errors.clear(); m_analysisSuccessful = false; m_scanner = make_shared(CharStream(_source), _sourceName); m_parserResult = assembly::Parser(m_errorReporter, m_language == Language::JULIA).parse(m_scanner); -- cgit v1.2.3 From 502304f30b1dfa45a936d500c173858baf5735df Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Sun, 28 May 2017 14:13:41 +0100 Subject: Add analyze(block) to AssemblyStack --- libsolidity/interface/AssemblyStack.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index dc9d7db2..a571a008 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -57,6 +57,20 @@ bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string return m_analysisSuccessful; } +bool AssemblyStack::analyze(assembly::Block const& _block, Scanner const* _scanner) +{ + m_errors.clear(); + m_analysisSuccessful = false; + if (_scanner) + m_scanner = make_shared(*_scanner); + m_parserResult = make_shared(_block); + + m_analysisInfo = make_shared(); + assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter); + m_analysisSuccessful = analyzer.analyze(*m_parserResult); + return m_analysisSuccessful; +} + eth::LinkerObject AssemblyStack::assemble(Machine _machine) { solAssert(m_analysisSuccessful, ""); -- cgit v1.2.3 From aa310f9fec9bba90da2f1f57d77270dab673c6f4 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 2 Jun 2017 21:52:48 +0100 Subject: Refactor AssemblyStack --- libsolidity/interface/AssemblyStack.cpp | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index a571a008..347de350 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -51,10 +51,7 @@ bool AssemblyStack::parseAndAnalyze(std::string const& _sourceName, std::string return false; solAssert(m_parserResult, ""); - m_analysisInfo = make_shared(); - assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter); - m_analysisSuccessful = analyzer.analyze(*m_parserResult); - return m_analysisSuccessful; + return analyzeParsed(); } bool AssemblyStack::analyze(assembly::Block const& _block, Scanner const* _scanner) @@ -65,6 +62,11 @@ bool AssemblyStack::analyze(assembly::Block const& _block, Scanner const* _scann m_scanner = make_shared(*_scanner); m_parserResult = make_shared(_block); + return analyzeParsed(); +} + +bool AssemblyStack::analyzeParsed() +{ m_analysisInfo = make_shared(); assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter); m_analysisSuccessful = analyzer.analyze(*m_parserResult); -- cgit v1.2.3 From 97cc968a133247e729ed1d189d35ef2b7b53b3d4 Mon Sep 17 00:00:00 2001 From: chriseth Date: Wed, 24 May 2017 18:34:19 +0200 Subject: Initial EVM1.5 assembly implementation. --- libsolidity/interface/AssemblyStack.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 347de350..c660058e 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -30,6 +30,9 @@ #include +#include +#include + using namespace std; using namespace dev; using namespace dev::solidity; @@ -87,7 +90,11 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) return assembly.assemble(); } case Machine::EVM15: - solUnimplemented("EVM 1.5 backend is not yet implemented."); + { + julia::EVMAssembly assembly(true); + julia::CodeTransform(m_errorReporter, assembly, *m_analysisInfo, true).run(*m_parserResult); + return assembly.finalize(); + } case Machine::eWasm: solUnimplemented("eWasm backend is not yet implemented."); } -- cgit v1.2.3 From ef3d5874fefa6a86a30d4afdcfd269d599edda5d Mon Sep 17 00:00:00 2001 From: chriseth Date: Tue, 6 Jun 2017 15:37:43 +0200 Subject: Remove error reporter from code generation phase. --- libsolidity/interface/AssemblyStack.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index c660058e..31d9e494 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -76,7 +76,7 @@ bool AssemblyStack::analyzeParsed() return m_analysisSuccessful; } -eth::LinkerObject AssemblyStack::assemble(Machine _machine) +eth::LinkerObject AssemblyStack::assemble(Machine _machine) const { solAssert(m_analysisSuccessful, ""); solAssert(m_parserResult, ""); @@ -86,13 +86,13 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) { case Machine::EVM: { - auto assembly = assembly::CodeGenerator(m_errorReporter).assemble(*m_parserResult, *m_analysisInfo); + auto assembly = assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo); return assembly.assemble(); } case Machine::EVM15: { julia::EVMAssembly assembly(true); - julia::CodeTransform(m_errorReporter, assembly, *m_analysisInfo, true).run(*m_parserResult); + julia::CodeTransform(assembly, *m_analysisInfo, true).run(*m_parserResult); return assembly.finalize(); } case Machine::eWasm: @@ -102,7 +102,7 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) return eth::LinkerObject(); } -string AssemblyStack::print() +string AssemblyStack::print() const { solAssert(m_parserResult, ""); return assembly::AsmPrinter(m_language == Language::JULIA)(*m_parserResult); -- cgit v1.2.3 From 1da3af161f94b28b816fd5522795aaae3af190f3 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 9 Jun 2017 12:45:56 +0100 Subject: Simplify CodeGenerator by remove seldom used case --- libsolidity/interface/AssemblyStack.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 31d9e494..b6151f56 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -86,7 +86,8 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) const { case Machine::EVM: { - auto assembly = assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo); + eth::Assembly assembly; + assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo, assembly); return assembly.assemble(); } case Machine::EVM15: -- cgit v1.2.3 From 8768080a02d6862849705ee106c81672368721e6 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 9 Jun 2017 12:47:05 +0100 Subject: Remove excess includes --- libsolidity/interface/AssemblyStack.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index b6151f56..75877881 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include -- cgit v1.2.3 From f0d213e6b56da5be8088008bf2ceadb7fd0030f7 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 29 May 2017 23:50:46 +0100 Subject: Introduce MachineAssemblyObject --- libsolidity/interface/AssemblyStack.cpp | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 75877881..6a5e5494 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -77,7 +77,7 @@ bool AssemblyStack::analyzeParsed() return m_analysisSuccessful; } -eth::LinkerObject AssemblyStack::assemble(Machine _machine) const +MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const { solAssert(m_analysisSuccessful, ""); solAssert(m_parserResult, ""); @@ -87,21 +87,27 @@ eth::LinkerObject AssemblyStack::assemble(Machine _machine) const { case Machine::EVM: { + MachineAssemblyObject object; eth::Assembly assembly; assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo, assembly); - return assembly.assemble(); + object.bytecode = make_shared(assembly.assemble()); + /// TODO: fill out text representation + return object; } case Machine::EVM15: { + MachineAssemblyObject object; julia::EVMAssembly assembly(true); julia::CodeTransform(assembly, *m_analysisInfo, true).run(*m_parserResult); - return assembly.finalize(); + object.bytecode = make_shared(assembly.finalize()); + /// TOOD: fill out text representation + return object; } case Machine::eWasm: solUnimplemented("eWasm backend is not yet implemented."); } // unreachable - return eth::LinkerObject(); + return MachineAssemblyObject(); } string AssemblyStack::print() const -- cgit v1.2.3 From ca92bda886740f7c59aaf44aaa8a15e25136c9dc Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Mon, 29 May 2017 23:58:03 +0100 Subject: Supply text representation of assembly --- libsolidity/interface/AssemblyStack.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 6a5e5494..7dc1edc7 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -91,7 +91,9 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const eth::Assembly assembly; assembly::CodeGenerator::assemble(*m_parserResult, *m_analysisInfo, assembly); object.bytecode = make_shared(assembly.assemble()); - /// TODO: fill out text representation + ostringstream tmp; + assembly.stream(tmp); + object.assembly = tmp.str(); return object; } case Machine::EVM15: -- cgit v1.2.3 From 868b5ad3aa9741609e9cd79d6033ee4b172dbe2f Mon Sep 17 00:00:00 2001 From: chriseth Date: Fri, 9 Jun 2017 13:59:16 +0200 Subject: Split block code generation into main and finalize. --- libsolidity/interface/AssemblyStack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 7dc1edc7..2d85895e 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -100,7 +100,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const { MachineAssemblyObject object; julia::EVMAssembly assembly(true); - julia::CodeTransform(assembly, *m_analysisInfo, true).run(*m_parserResult); + julia::CodeTransform(assembly, *m_analysisInfo, true)(*m_parserResult); object.bytecode = make_shared(assembly.finalize()); /// TOOD: fill out text representation return object; -- cgit v1.2.3 From a33a5e3c0846e7db8d87fdd5de890a63d359581d Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 9 Jun 2017 13:55:17 +0100 Subject: Run analyzer in Julia mode if requested in AssemblyStack --- libsolidity/interface/AssemblyStack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 2d85895e..7cda096e 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -72,7 +72,7 @@ bool AssemblyStack::analyze(assembly::Block const& _block, Scanner const* _scann bool AssemblyStack::analyzeParsed() { m_analysisInfo = make_shared(); - assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter); + assembly::AsmAnalyzer analyzer(*m_analysisInfo, m_errorReporter, m_language == Language::JULIA); m_analysisSuccessful = analyzer.analyze(*m_parserResult); return m_analysisSuccessful; } -- cgit v1.2.3 From 7798a2711213823de409577226f2f1c7f7f2e861 Mon Sep 17 00:00:00 2001 From: Alex Beregszaszi Date: Fri, 9 Jun 2017 14:38:23 +0100 Subject: Add Julia mode as an option to EVMCodeTransform --- libsolidity/interface/AssemblyStack.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'libsolidity/interface/AssemblyStack.cpp') diff --git a/libsolidity/interface/AssemblyStack.cpp b/libsolidity/interface/AssemblyStack.cpp index 7cda096e..23524bb3 100644 --- a/libsolidity/interface/AssemblyStack.cpp +++ b/libsolidity/interface/AssemblyStack.cpp @@ -100,7 +100,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const { MachineAssemblyObject object; julia::EVMAssembly assembly(true); - julia::CodeTransform(assembly, *m_analysisInfo, true)(*m_parserResult); + julia::CodeTransform(assembly, *m_analysisInfo, m_language == Language::JULIA, true)(*m_parserResult); object.bytecode = make_shared(assembly.finalize()); /// TOOD: fill out text representation return object; -- cgit v1.2.3