diff options
author | chriseth <chris@ethereum.org> | 2017-05-24 00:57:06 +0800 |
---|---|---|
committer | chriseth <chris@ethereum.org> | 2017-05-26 21:03:29 +0800 |
commit | eaa13d42a09155200127418762940ca652b050c5 (patch) | |
tree | a91b776cfa3765899e8c7ef73b279183d79d2d6f /libsolidity | |
parent | f2804c49ed44583fbfd31857951810f8c3023bc9 (diff) | |
download | dexon-solidity-eaa13d42a09155200127418762940ca652b050c5.tar.gz dexon-solidity-eaa13d42a09155200127418762940ca652b050c5.tar.zst dexon-solidity-eaa13d42a09155200127418762940ca652b050c5.zip |
Support multiple assembly front and backends.
Diffstat (limited to 'libsolidity')
-rw-r--r-- | libsolidity/interface/MultiBackendAssemblyStack.cpp | 85 | ||||
-rw-r--r-- | libsolidity/interface/MultiBackendAssemblyStack.h | 85 |
2 files changed, 170 insertions, 0 deletions
diff --git a/libsolidity/interface/MultiBackendAssemblyStack.cpp b/libsolidity/interface/MultiBackendAssemblyStack.cpp new file mode 100644 index 00000000..cf16b627 --- /dev/null +++ b/libsolidity/interface/MultiBackendAssemblyStack.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 <http://www.gnu.org/licenses/>. +*/ +/** + * Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and + * eWasm as output. + */ + + +#include <libsolidity/interface/MultiBackendAssemblyStack.h> + +#include <libsolidity/parsing/Scanner.h> +#include <libsolidity/inlineasm/AsmPrinter.h> +#include <libsolidity/inlineasm/AsmParser.h> +#include <libsolidity/inlineasm/AsmAnalysis.h> +#include <libsolidity/inlineasm/AsmCodeGen.h> + +#include <libevmasm/Assembly.h> + +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<Scanner>(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::AsmAnalysisInfo>(); + 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 new file mode 100644 index 00000000..fed9e8f9 --- /dev/null +++ b/libsolidity/interface/MultiBackendAssemblyStack.h @@ -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 <http://www.gnu.org/licenses/>. +*/ +/** + * Full assembly stack that can support EVM-assembly and JULIA as input and EVM, EVM1.5 and + * eWasm as output. + */ + +#pragma once + +#include <libsolidity/interface/Exceptions.h> +#include <libsolidity/inlineasm/AsmAnalysisInfo.h> +#include <libevmasm/LinkerObject.h> + +#include <string> +#include <memory> + +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<Scanner> m_scanner; + + bool m_analysisSuccessful = false; + std::shared_ptr<assembly::Block> m_parserResult; + std::shared_ptr<assembly::AsmAnalysisInfo> m_analysisInfo; + ErrorList m_errors; +}; + +} +} |