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 ++++++++++++++++++++++ libsolidity/interface/AssemblyStack.h | 83 +++++++++++++++++++++ .../interface/MultiBackendAssemblyStack.cpp | 85 ---------------------- libsolidity/interface/MultiBackendAssemblyStack.h | 85 ---------------------- 4 files changed, 168 insertions(+), 170 deletions(-) create mode 100644 libsolidity/interface/AssemblyStack.cpp create mode 100644 libsolidity/interface/AssemblyStack.h delete mode 100644 libsolidity/interface/MultiBackendAssemblyStack.cpp delete mode 100644 libsolidity/interface/MultiBackendAssemblyStack.h (limited to 'libsolidity/interface') 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); +} diff --git a/libsolidity/interface/AssemblyStack.h b/libsolidity/interface/AssemblyStack.h new file mode 100644 index 00000000..4aba4846 --- /dev/null +++ b/libsolidity/interface/AssemblyStack.h @@ -0,0 +1,83 @@ +/* + 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. + */ + +#pragma once + +#include +#include +#include + +#include +#include + +namespace dev +{ +namespace solidity +{ +class Scanner; +namespace assembly +{ +struct AsmAnalysisInfo; +struct Block; +} + +/* + * Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and + * eWasm as output. + */ +class AssemblyStack +{ +public: + enum class Language { JULIA, Assembly }; + enum class Machine { EVM, EVM15, eWasm }; + + explicit AssemblyStack(Language _language = Language::Assembly): + m_language(_language) + {} + + /// @returns the scanner used during parsing + Scanner const& scanner() const; + + /// Runs parsing and analysis steps, returns false if input cannot be assembled. + bool parseAndAnalyze(std::string const& _sourceName, std::string const& _source); + + /// Run the assembly step (should only be called after parseAndAnalyze). + eth::LinkerObject assemble(Machine _machine); + + ErrorList const& errors() const { return m_errors; } + + /// Pretty-print the input after having parsed it. + std::string print(); + +private: + + Language m_language = Language::Assembly; + + std::shared_ptr m_scanner; + + bool m_analysisSuccessful = false; + std::shared_ptr m_parserResult; + std::shared_ptr m_analysisInfo; + ErrorList m_errors; +}; + +} +} diff --git a/libsolidity/interface/MultiBackendAssemblyStack.cpp b/libsolidity/interface/MultiBackendAssemblyStack.cpp deleted file mode 100644 index cf16b627..00000000 --- a/libsolidity/interface/MultiBackendAssemblyStack.cpp +++ /dev/null @@ -1,85 +0,0 @@ -/* - 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& MultiBackendAssemblyStack::scanner() const -{ - solAssert(m_scanner, ""); - return *m_scanner; -} - -bool MultiBackendAssemblyStack::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_input == Input::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 MultiBackendAssemblyStack::assemble() -{ - solAssert(m_analysisSuccessful, ""); - solAssert(m_parserResult, ""); - solAssert(m_analysisInfo, ""); - - switch (m_targetMachine) - { - 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 MultiBackendAssemblyStack::print() -{ - solAssert(m_parserResult, ""); - return assembly::AsmPrinter(m_input == Input::JULIA)(*m_parserResult); -} diff --git a/libsolidity/interface/MultiBackendAssemblyStack.h b/libsolidity/interface/MultiBackendAssemblyStack.h deleted file mode 100644 index fed9e8f9..00000000 --- a/libsolidity/interface/MultiBackendAssemblyStack.h +++ /dev/null @@ -1,85 +0,0 @@ -/* - 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. - */ - -#pragma once - -#include -#include -#include - -#include -#include - -namespace dev -{ -namespace solidity -{ -class Scanner; -namespace assembly -{ -struct AsmAnalysisInfo; -struct Block; -} - -/* - * Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and - * eWasm as output. - */ -class MultiBackendAssemblyStack -{ -public: - enum class Input { JULIA, Assembly }; - enum class Machine { EVM, EVM15, eWasm }; - - MultiBackendAssemblyStack(Input _input = Input::Assembly, Machine _targetMachine = Machine::EVM): - m_input(_input), - m_targetMachine(_targetMachine) - {} - - /// @returns the scanner used during parsing - Scanner const& scanner() const; - - /// Runs parsing and analysis steps, returns false if input cannot be assembled. - bool parseAndAnalyze(std::string const& _sourceName, std::string const& _source); - - /// Run the assembly step (should only be called after parseAndAnalyze). - eth::LinkerObject assemble(); - - ErrorList const& errors() const { return m_errors; } - - /// Pretty-print the input after having parsed it. - std::string print(); - -private: - - Input m_input = Input::Assembly; - Machine m_targetMachine = Machine::EVM; - - std::shared_ptr m_scanner; - - bool m_analysisSuccessful = false; - std::shared_ptr m_parserResult; - std::shared_ptr m_analysisInfo; - ErrorList m_errors; -}; - -} -} -- cgit v1.2.3