mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #8054 from ethereum/wasm
Rename some generic Wasm helpers from Ewasm
This commit is contained in:
commit
12dac24871
@ -51,10 +51,6 @@
|
|||||||
|
|
||||||
#include <libyul/YulString.h>
|
#include <libyul/YulString.h>
|
||||||
#include <libyul/AsmPrinter.h>
|
#include <libyul/AsmPrinter.h>
|
||||||
#include <libyul/backends/wasm/EVMToEWasmTranslator.h>
|
|
||||||
#include <libyul/backends/wasm/EWasmObjectCompiler.h>
|
|
||||||
#include <libyul/backends/wasm/WasmDialect.h>
|
|
||||||
#include <libyul/backends/evm/EVMDialect.h>
|
|
||||||
#include <libyul/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
|
|
||||||
#include <liblangutil/Scanner.h>
|
#include <liblangutil/Scanner.h>
|
||||||
|
@ -33,8 +33,8 @@
|
|||||||
#include <libyul/backends/evm/EVMObjectCompiler.h>
|
#include <libyul/backends/evm/EVMObjectCompiler.h>
|
||||||
#include <libyul/backends/evm/EVMMetrics.h>
|
#include <libyul/backends/evm/EVMMetrics.h>
|
||||||
#include <libyul/backends/wasm/WasmDialect.h>
|
#include <libyul/backends/wasm/WasmDialect.h>
|
||||||
#include <libyul/backends/wasm/EWasmObjectCompiler.h>
|
#include <libyul/backends/wasm/WasmObjectCompiler.h>
|
||||||
#include <libyul/backends/wasm/EVMToEWasmTranslator.h>
|
#include <libyul/backends/wasm/EVMToEwasmTranslator.h>
|
||||||
#include <libyul/optimiser/Metrics.h>
|
#include <libyul/optimiser/Metrics.h>
|
||||||
#include <libyul/ObjectParser.h>
|
#include <libyul/ObjectParser.h>
|
||||||
#include <libyul/optimiser/Suite.h>
|
#include <libyul/optimiser/Suite.h>
|
||||||
@ -112,7 +112,7 @@ void AssemblyStack::translate(AssemblyStack::Language _targetLanguage)
|
|||||||
"Invalid language combination"
|
"Invalid language combination"
|
||||||
);
|
);
|
||||||
|
|
||||||
*m_parserResult = EVMToEWasmTranslator(
|
*m_parserResult = EVMToEwasmTranslator(
|
||||||
languageToDialect(m_language, m_evmVersion)
|
languageToDialect(m_language, m_evmVersion)
|
||||||
).run(*parserResult());
|
).run(*parserResult());
|
||||||
|
|
||||||
@ -220,7 +220,7 @@ MachineAssemblyObject AssemblyStack::assemble(Machine _machine) const
|
|||||||
Dialect const& dialect = languageToDialect(m_language, EVMVersion{});
|
Dialect const& dialect = languageToDialect(m_language, EVMVersion{});
|
||||||
|
|
||||||
MachineAssemblyObject object;
|
MachineAssemblyObject object;
|
||||||
auto result = EWasmObjectCompiler::compile(*m_parserResult, dialect);
|
auto result = WasmObjectCompiler::compile(*m_parserResult, dialect);
|
||||||
object.assembly = std::move(result.first);
|
object.assembly = std::move(result.first);
|
||||||
object.bytecode = make_shared<dev::eth::LinkerObject>();
|
object.bytecode = make_shared<dev::eth::LinkerObject>();
|
||||||
object.bytecode->bytecode = std::move(result.second);
|
object.bytecode->bytecode = std::move(result.second);
|
||||||
|
@ -44,18 +44,18 @@ add_library(yul
|
|||||||
backends/evm/EVMMetrics.h
|
backends/evm/EVMMetrics.h
|
||||||
backends/evm/NoOutputAssembly.h
|
backends/evm/NoOutputAssembly.h
|
||||||
backends/evm/NoOutputAssembly.cpp
|
backends/evm/NoOutputAssembly.cpp
|
||||||
backends/wasm/EVMToEWasmTranslator.cpp
|
backends/wasm/EVMToEwasmTranslator.cpp
|
||||||
backends/wasm/EVMToEWasmTranslator.h
|
backends/wasm/EVMToEwasmTranslator.h
|
||||||
backends/wasm/EWasmCodeTransform.cpp
|
|
||||||
backends/wasm/EWasmCodeTransform.h
|
|
||||||
backends/wasm/EWasmObjectCompiler.cpp
|
|
||||||
backends/wasm/EWasmObjectCompiler.h
|
|
||||||
backends/wasm/BinaryTransform.cpp
|
backends/wasm/BinaryTransform.cpp
|
||||||
backends/wasm/BinaryTransform.h
|
backends/wasm/BinaryTransform.h
|
||||||
backends/wasm/TextTransform.cpp
|
backends/wasm/TextTransform.cpp
|
||||||
backends/wasm/TextTransform.h
|
backends/wasm/TextTransform.h
|
||||||
|
backends/wasm/WasmCodeTransform.cpp
|
||||||
|
backends/wasm/WasmCodeTransform.h
|
||||||
backends/wasm/WasmDialect.cpp
|
backends/wasm/WasmDialect.cpp
|
||||||
backends/wasm/WasmDialect.h
|
backends/wasm/WasmDialect.h
|
||||||
|
backends/wasm/WasmObjectCompiler.cpp
|
||||||
|
backends/wasm/WasmObjectCompiler.h
|
||||||
backends/wasm/WordSizeTransform.cpp
|
backends/wasm/WordSizeTransform.cpp
|
||||||
backends/wasm/WordSizeTransform.h
|
backends/wasm/WordSizeTransform.h
|
||||||
optimiser/ASTCopier.cpp
|
optimiser/ASTCopier.cpp
|
||||||
|
@ -15,10 +15,10 @@
|
|||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* Translates Yul code from EVM dialect to eWasm dialect.
|
* Translates Yul code from EVM dialect to Ewasm dialect.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libyul/backends/wasm/EVMToEWasmTranslator.h>
|
#include <libyul/backends/wasm/EVMToEwasmTranslator.h>
|
||||||
|
|
||||||
#include <libyul/backends/wasm/WordSizeTransform.h>
|
#include <libyul/backends/wasm/WordSizeTransform.h>
|
||||||
#include <libyul/backends/wasm/WasmDialect.h>
|
#include <libyul/backends/wasm/WasmDialect.h>
|
||||||
@ -701,7 +701,7 @@ function invalid() {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Object EVMToEWasmTranslator::run(Object const& _object)
|
Object EVMToEwasmTranslator::run(Object const& _object)
|
||||||
{
|
{
|
||||||
if (!m_polyfill)
|
if (!m_polyfill)
|
||||||
parsePolyfill();
|
parsePolyfill();
|
||||||
@ -749,7 +749,7 @@ Object EVMToEWasmTranslator::run(Object const& _object)
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EVMToEWasmTranslator::parsePolyfill()
|
void EVMToEwasmTranslator::parsePolyfill()
|
||||||
{
|
{
|
||||||
ErrorList errors;
|
ErrorList errors;
|
||||||
ErrorReporter errorReporter(errors);
|
ErrorReporter errorReporter(errors);
|
@ -15,7 +15,7 @@
|
|||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* Translates Yul code from EVM dialect to eWasm dialect.
|
* Translates Yul code from EVM dialect to Ewasm dialect.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -28,10 +28,10 @@ namespace yul
|
|||||||
{
|
{
|
||||||
struct Object;
|
struct Object;
|
||||||
|
|
||||||
class EVMToEWasmTranslator: public ASTModifier
|
class EVMToEwasmTranslator: public ASTModifier
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EVMToEWasmTranslator(Dialect const& _evmDialect): m_dialect(_evmDialect) {}
|
EVMToEwasmTranslator(Dialect const& _evmDialect): m_dialect(_evmDialect) {}
|
||||||
Object run(Object const& _object);
|
Object run(Object const& _object);
|
||||||
|
|
||||||
private:
|
private:
|
@ -15,10 +15,10 @@
|
|||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* Common code generator for translating Yul / inline assembly to EWasm.
|
* Common code generator for translating Yul / inline assembly to Wasm.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libyul/backends/wasm/EWasmCodeTransform.h>
|
#include <libyul/backends/wasm/WasmCodeTransform.h>
|
||||||
|
|
||||||
#include <libyul/optimiser/NameCollector.h>
|
#include <libyul/optimiser/NameCollector.h>
|
||||||
|
|
||||||
@ -36,11 +36,11 @@ using namespace std;
|
|||||||
using namespace dev;
|
using namespace dev;
|
||||||
using namespace yul;
|
using namespace yul;
|
||||||
|
|
||||||
wasm::Module EWasmCodeTransform::run(Dialect const& _dialect, yul::Block const& _ast)
|
wasm::Module WasmCodeTransform::run(Dialect const& _dialect, yul::Block const& _ast)
|
||||||
{
|
{
|
||||||
wasm::Module module;
|
wasm::Module module;
|
||||||
|
|
||||||
EWasmCodeTransform transform(_dialect, _ast);
|
WasmCodeTransform transform(_dialect, _ast);
|
||||||
|
|
||||||
for (auto const& statement: _ast.statements)
|
for (auto const& statement: _ast.statements)
|
||||||
{
|
{
|
||||||
@ -59,7 +59,7 @@ wasm::Module EWasmCodeTransform::run(Dialect const& _dialect, yul::Block const&
|
|||||||
return module;
|
return module;
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::generateMultiAssignment(
|
wasm::Expression WasmCodeTransform::generateMultiAssignment(
|
||||||
vector<string> _variableNames,
|
vector<string> _variableNames,
|
||||||
unique_ptr<wasm::Expression> _firstValue
|
unique_ptr<wasm::Expression> _firstValue
|
||||||
)
|
)
|
||||||
@ -82,7 +82,7 @@ wasm::Expression EWasmCodeTransform::generateMultiAssignment(
|
|||||||
return { std::move(block) };
|
return { std::move(block) };
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(VariableDeclaration const& _varDecl)
|
wasm::Expression WasmCodeTransform::operator()(VariableDeclaration const& _varDecl)
|
||||||
{
|
{
|
||||||
vector<string> variableNames;
|
vector<string> variableNames;
|
||||||
for (auto const& var: _varDecl.variables)
|
for (auto const& var: _varDecl.variables)
|
||||||
@ -97,7 +97,7 @@ wasm::Expression EWasmCodeTransform::operator()(VariableDeclaration const& _varD
|
|||||||
return wasm::BuiltinCall{"nop", {}};
|
return wasm::BuiltinCall{"nop", {}};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Assignment const& _assignment)
|
wasm::Expression WasmCodeTransform::operator()(Assignment const& _assignment)
|
||||||
{
|
{
|
||||||
vector<string> variableNames;
|
vector<string> variableNames;
|
||||||
for (auto const& var: _assignment.variableNames)
|
for (auto const& var: _assignment.variableNames)
|
||||||
@ -105,12 +105,12 @@ wasm::Expression EWasmCodeTransform::operator()(Assignment const& _assignment)
|
|||||||
return generateMultiAssignment(move(variableNames), visit(*_assignment.value));
|
return generateMultiAssignment(move(variableNames), visit(*_assignment.value));
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(ExpressionStatement const& _statement)
|
wasm::Expression WasmCodeTransform::operator()(ExpressionStatement const& _statement)
|
||||||
{
|
{
|
||||||
return visitReturnByValue(_statement.expression);
|
return visitReturnByValue(_statement.expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(FunctionCall const& _call)
|
wasm::Expression WasmCodeTransform::operator()(FunctionCall const& _call)
|
||||||
{
|
{
|
||||||
bool typeConversionNeeded = false;
|
bool typeConversionNeeded = false;
|
||||||
|
|
||||||
@ -171,19 +171,19 @@ wasm::Expression EWasmCodeTransform::operator()(FunctionCall const& _call)
|
|||||||
return {std::move(funCall)};
|
return {std::move(funCall)};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Identifier const& _identifier)
|
wasm::Expression WasmCodeTransform::operator()(Identifier const& _identifier)
|
||||||
{
|
{
|
||||||
return wasm::LocalVariable{_identifier.name.str()};
|
return wasm::LocalVariable{_identifier.name.str()};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Literal const& _literal)
|
wasm::Expression WasmCodeTransform::operator()(Literal const& _literal)
|
||||||
{
|
{
|
||||||
u256 value = valueOfLiteral(_literal);
|
u256 value = valueOfLiteral(_literal);
|
||||||
yulAssert(value <= numeric_limits<uint64_t>::max(), "Literal too large: " + value.str());
|
yulAssert(value <= numeric_limits<uint64_t>::max(), "Literal too large: " + value.str());
|
||||||
return wasm::Literal{uint64_t(value)};
|
return wasm::Literal{uint64_t(value)};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(If const& _if)
|
wasm::Expression WasmCodeTransform::operator()(If const& _if)
|
||||||
{
|
{
|
||||||
// TODO converting i64 to i32 might not always be needed.
|
// TODO converting i64 to i32 might not always be needed.
|
||||||
|
|
||||||
@ -197,7 +197,7 @@ wasm::Expression EWasmCodeTransform::operator()(If const& _if)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Switch const& _switch)
|
wasm::Expression WasmCodeTransform::operator()(Switch const& _switch)
|
||||||
{
|
{
|
||||||
wasm::Block block;
|
wasm::Block block;
|
||||||
string condition = m_nameDispenser.newName("condition"_yulstring).str();
|
string condition = m_nameDispenser.newName("condition"_yulstring).str();
|
||||||
@ -237,13 +237,13 @@ wasm::Expression EWasmCodeTransform::operator()(Switch const& _switch)
|
|||||||
return { std::move(block) };
|
return { std::move(block) };
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(FunctionDefinition const&)
|
wasm::Expression WasmCodeTransform::operator()(FunctionDefinition const&)
|
||||||
{
|
{
|
||||||
yulAssert(false, "Should not have visited here.");
|
yulAssert(false, "Should not have visited here.");
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(ForLoop const& _for)
|
wasm::Expression WasmCodeTransform::operator()(ForLoop const& _for)
|
||||||
{
|
{
|
||||||
string breakLabel = newLabel();
|
string breakLabel = newLabel();
|
||||||
string continueLabel = newLabel();
|
string continueLabel = newLabel();
|
||||||
@ -262,37 +262,37 @@ wasm::Expression EWasmCodeTransform::operator()(ForLoop const& _for)
|
|||||||
return { wasm::Block{breakLabel, make_vector<wasm::Expression>(move(loop))} };
|
return { wasm::Block{breakLabel, make_vector<wasm::Expression>(move(loop))} };
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Break const&)
|
wasm::Expression WasmCodeTransform::operator()(Break const&)
|
||||||
{
|
{
|
||||||
return wasm::Break{wasm::Label{m_breakContinueLabelNames.top().first}};
|
return wasm::Break{wasm::Label{m_breakContinueLabelNames.top().first}};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Continue const&)
|
wasm::Expression WasmCodeTransform::operator()(Continue const&)
|
||||||
{
|
{
|
||||||
return wasm::Break{wasm::Label{m_breakContinueLabelNames.top().second}};
|
return wasm::Break{wasm::Label{m_breakContinueLabelNames.top().second}};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Leave const&)
|
wasm::Expression WasmCodeTransform::operator()(Leave const&)
|
||||||
{
|
{
|
||||||
return wasm::Return{};
|
return wasm::Return{};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::operator()(Block const& _block)
|
wasm::Expression WasmCodeTransform::operator()(Block const& _block)
|
||||||
{
|
{
|
||||||
return wasm::Block{{}, visit(_block.statements)};
|
return wasm::Block{{}, visit(_block.statements)};
|
||||||
}
|
}
|
||||||
|
|
||||||
unique_ptr<wasm::Expression> EWasmCodeTransform::visit(yul::Expression const& _expression)
|
unique_ptr<wasm::Expression> WasmCodeTransform::visit(yul::Expression const& _expression)
|
||||||
{
|
{
|
||||||
return make_unique<wasm::Expression>(std::visit(*this, _expression));
|
return make_unique<wasm::Expression>(std::visit(*this, _expression));
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::visitReturnByValue(yul::Expression const& _expression)
|
wasm::Expression WasmCodeTransform::visitReturnByValue(yul::Expression const& _expression)
|
||||||
{
|
{
|
||||||
return std::visit(*this, _expression);
|
return std::visit(*this, _expression);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<wasm::Expression> EWasmCodeTransform::visit(vector<yul::Expression> const& _expressions)
|
vector<wasm::Expression> WasmCodeTransform::visit(vector<yul::Expression> const& _expressions)
|
||||||
{
|
{
|
||||||
vector<wasm::Expression> ret;
|
vector<wasm::Expression> ret;
|
||||||
for (auto const& e: _expressions)
|
for (auto const& e: _expressions)
|
||||||
@ -300,12 +300,12 @@ vector<wasm::Expression> EWasmCodeTransform::visit(vector<yul::Expression> const
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::visit(yul::Statement const& _statement)
|
wasm::Expression WasmCodeTransform::visit(yul::Statement const& _statement)
|
||||||
{
|
{
|
||||||
return std::visit(*this, _statement);
|
return std::visit(*this, _statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<wasm::Expression> EWasmCodeTransform::visit(vector<yul::Statement> const& _statements)
|
vector<wasm::Expression> WasmCodeTransform::visit(vector<yul::Statement> const& _statements)
|
||||||
{
|
{
|
||||||
vector<wasm::Expression> ret;
|
vector<wasm::Expression> ret;
|
||||||
for (auto const& s: _statements)
|
for (auto const& s: _statements)
|
||||||
@ -313,7 +313,7 @@ vector<wasm::Expression> EWasmCodeTransform::visit(vector<yul::Statement> const&
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::FunctionDefinition EWasmCodeTransform::translateFunction(yul::FunctionDefinition const& _fun)
|
wasm::FunctionDefinition WasmCodeTransform::translateFunction(yul::FunctionDefinition const& _fun)
|
||||||
{
|
{
|
||||||
wasm::FunctionDefinition fun;
|
wasm::FunctionDefinition fun;
|
||||||
fun.name = _fun.name.str();
|
fun.name = _fun.name.str();
|
||||||
@ -344,7 +344,7 @@ wasm::FunctionDefinition EWasmCodeTransform::translateFunction(yul::FunctionDefi
|
|||||||
return fun;
|
return fun;
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Expression EWasmCodeTransform::injectTypeConversionIfNeeded(wasm::FunctionCall _call) const
|
wasm::Expression WasmCodeTransform::injectTypeConversionIfNeeded(wasm::FunctionCall _call) const
|
||||||
{
|
{
|
||||||
wasm::FunctionImport const& import = m_functionsToImport.at(YulString{_call.functionName});
|
wasm::FunctionImport const& import = m_functionsToImport.at(YulString{_call.functionName});
|
||||||
for (size_t i = 0; i < _call.arguments.size(); ++i)
|
for (size_t i = 0; i < _call.arguments.size(); ++i)
|
||||||
@ -361,7 +361,7 @@ wasm::Expression EWasmCodeTransform::injectTypeConversionIfNeeded(wasm::Function
|
|||||||
return {std::move(_call)};
|
return {std::move(_call)};
|
||||||
}
|
}
|
||||||
|
|
||||||
vector<wasm::Expression> EWasmCodeTransform::injectTypeConversionIfNeeded(
|
vector<wasm::Expression> WasmCodeTransform::injectTypeConversionIfNeeded(
|
||||||
vector<wasm::Expression> _arguments,
|
vector<wasm::Expression> _arguments,
|
||||||
vector<Type> const& _parameterTypes
|
vector<Type> const& _parameterTypes
|
||||||
) const
|
) const
|
||||||
@ -378,12 +378,12 @@ vector<wasm::Expression> EWasmCodeTransform::injectTypeConversionIfNeeded(
|
|||||||
return _arguments;
|
return _arguments;
|
||||||
}
|
}
|
||||||
|
|
||||||
string EWasmCodeTransform::newLabel()
|
string WasmCodeTransform::newLabel()
|
||||||
{
|
{
|
||||||
return m_nameDispenser.newName("label_"_yulstring).str();
|
return m_nameDispenser.newName("label_"_yulstring).str();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EWasmCodeTransform::allocateGlobals(size_t _amount)
|
void WasmCodeTransform::allocateGlobals(size_t _amount)
|
||||||
{
|
{
|
||||||
while (m_globalVariables.size() < _amount)
|
while (m_globalVariables.size() < _amount)
|
||||||
m_globalVariables.emplace_back(wasm::GlobalVariableDeclaration{
|
m_globalVariables.emplace_back(wasm::GlobalVariableDeclaration{
|
@ -15,7 +15,7 @@
|
|||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
/**
|
/**
|
||||||
* Common code generator for translating Yul / inline assembly to EWasm.
|
* Common code generator for translating Yul / inline assembly to Wasm.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
@ -32,7 +32,7 @@ namespace yul
|
|||||||
{
|
{
|
||||||
struct AsmAnalysisInfo;
|
struct AsmAnalysisInfo;
|
||||||
|
|
||||||
class EWasmCodeTransform
|
class WasmCodeTransform
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static wasm::Module run(Dialect const& _dialect, yul::Block const& _ast);
|
static wasm::Module run(Dialect const& _dialect, yul::Block const& _ast);
|
||||||
@ -54,7 +54,7 @@ public:
|
|||||||
wasm::Expression operator()(yul::Block const& _block);
|
wasm::Expression operator()(yul::Block const& _block);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
EWasmCodeTransform(
|
WasmCodeTransform(
|
||||||
Dialect const& _dialect,
|
Dialect const& _dialect,
|
||||||
Block const& _ast
|
Block const& _ast
|
||||||
):
|
):
|
@ -18,9 +18,9 @@
|
|||||||
* Compiler that transforms Yul Objects to Wasm text and binary representation (Ewasm flavoured).
|
* Compiler that transforms Yul Objects to Wasm text and binary representation (Ewasm flavoured).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <libyul/backends/wasm/EWasmObjectCompiler.h>
|
#include <libyul/backends/wasm/WasmObjectCompiler.h>
|
||||||
|
|
||||||
#include <libyul/backends/wasm/EWasmCodeTransform.h>
|
#include <libyul/backends/wasm/WasmCodeTransform.h>
|
||||||
#include <libyul/backends/wasm/BinaryTransform.h>
|
#include <libyul/backends/wasm/BinaryTransform.h>
|
||||||
#include <libyul/backends/wasm/TextTransform.h>
|
#include <libyul/backends/wasm/TextTransform.h>
|
||||||
|
|
||||||
@ -32,25 +32,25 @@
|
|||||||
using namespace yul;
|
using namespace yul;
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
pair<string, dev::bytes> EWasmObjectCompiler::compile(Object& _object, Dialect const& _dialect)
|
pair<string, dev::bytes> WasmObjectCompiler::compile(Object& _object, Dialect const& _dialect)
|
||||||
{
|
{
|
||||||
EWasmObjectCompiler compiler(_dialect);
|
WasmObjectCompiler compiler(_dialect);
|
||||||
wasm::Module module = compiler.run(_object);
|
wasm::Module module = compiler.run(_object);
|
||||||
return {wasm::TextTransform().run(module), wasm::BinaryTransform::run(module)};
|
return {wasm::TextTransform().run(module), wasm::BinaryTransform::run(module)};
|
||||||
}
|
}
|
||||||
|
|
||||||
wasm::Module EWasmObjectCompiler::run(Object& _object)
|
wasm::Module WasmObjectCompiler::run(Object& _object)
|
||||||
{
|
{
|
||||||
yulAssert(_object.analysisInfo, "No analysis info.");
|
yulAssert(_object.analysisInfo, "No analysis info.");
|
||||||
yulAssert(_object.code, "No code.");
|
yulAssert(_object.code, "No code.");
|
||||||
|
|
||||||
wasm::Module module = EWasmCodeTransform::run(m_dialect, *_object.code);
|
wasm::Module module = WasmCodeTransform::run(m_dialect, *_object.code);
|
||||||
|
|
||||||
for (auto& subNode: _object.subObjects)
|
for (auto& subNode: _object.subObjects)
|
||||||
if (Object* subObject = dynamic_cast<Object*>(subNode.get()))
|
if (Object* subObject = dynamic_cast<Object*>(subNode.get()))
|
||||||
module.subModules[subObject->name.str()] = run(*subObject);
|
module.subModules[subObject->name.str()] = run(*subObject);
|
||||||
else
|
else
|
||||||
yulAssert(false, "Data is not yet supported for EWasm.");
|
yulAssert(false, "Data is not yet supported for Wasm.");
|
||||||
|
|
||||||
return module;
|
return module;
|
||||||
}
|
}
|
@ -28,6 +28,7 @@ namespace dev
|
|||||||
{
|
{
|
||||||
using bytes = std::vector<uint8_t>;
|
using bytes = std::vector<uint8_t>;
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace yul
|
namespace yul
|
||||||
{
|
{
|
||||||
struct Object;
|
struct Object;
|
||||||
@ -37,13 +38,13 @@ namespace wasm
|
|||||||
struct Module;
|
struct Module;
|
||||||
}
|
}
|
||||||
|
|
||||||
class EWasmObjectCompiler
|
class WasmObjectCompiler
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
/// Compiles the given object and returns the WAST and the binary representation.
|
/// Compiles the given object and returns the Wasm text and binary representation.
|
||||||
static std::pair<std::string, dev::bytes> compile(Object& _object, Dialect const& _dialect);
|
static std::pair<std::string, dev::bytes> compile(Object& _object, Dialect const& _dialect);
|
||||||
private:
|
private:
|
||||||
EWasmObjectCompiler(Dialect const& _dialect):
|
WasmObjectCompiler(Dialect const& _dialect):
|
||||||
m_dialect(_dialect)
|
m_dialect(_dialect)
|
||||||
{}
|
{}
|
||||||
|
|
@ -131,8 +131,8 @@ set(libyul_sources
|
|||||||
libyul/Common.cpp
|
libyul/Common.cpp
|
||||||
libyul/Common.h
|
libyul/Common.h
|
||||||
libyul/CompilabilityChecker.cpp
|
libyul/CompilabilityChecker.cpp
|
||||||
libyul/EWasmTranslationTest.cpp
|
libyul/EwasmTranslationTest.cpp
|
||||||
libyul/EWasmTranslationTest.h
|
libyul/EwasmTranslationTest.h
|
||||||
libyul/FunctionSideEffects.cpp
|
libyul/FunctionSideEffects.cpp
|
||||||
libyul/FunctionSideEffects.h
|
libyul/FunctionSideEffects.h
|
||||||
libyul/Inliner.cpp
|
libyul/Inliner.cpp
|
||||||
|
@ -25,7 +25,7 @@
|
|||||||
#include <test/libsolidity/SemanticTest.h>
|
#include <test/libsolidity/SemanticTest.h>
|
||||||
#include <test/libsolidity/SMTCheckerTest.h>
|
#include <test/libsolidity/SMTCheckerTest.h>
|
||||||
#include <test/libsolidity/SMTCheckerJSONTest.h>
|
#include <test/libsolidity/SMTCheckerJSONTest.h>
|
||||||
#include <test/libyul/EWasmTranslationTest.h>
|
#include <test/libyul/EwasmTranslationTest.h>
|
||||||
#include <test/libyul/YulOptimizerTest.h>
|
#include <test/libyul/YulOptimizerTest.h>
|
||||||
#include <test/libyul/YulInterpreterTest.h>
|
#include <test/libyul/YulInterpreterTest.h>
|
||||||
#include <test/libyul/ObjectCompilerTest.h>
|
#include <test/libyul/ObjectCompilerTest.h>
|
||||||
@ -56,7 +56,7 @@ struct Testsuite
|
|||||||
Testsuite const g_interactiveTestsuites[] = {
|
Testsuite const g_interactiveTestsuites[] = {
|
||||||
/*
|
/*
|
||||||
Title Path Subpath SMT NeedsVM Creator function */
|
Title Path Subpath SMT NeedsVM Creator function */
|
||||||
{"EWasm Translation", "libyul", "ewasmTranslationTests",false,false, &yul::test::EWasmTranslationTest::create},
|
{"Ewasm Translation", "libyul", "ewasmTranslationTests",false,false, &yul::test::EwasmTranslationTest::create},
|
||||||
{"Yul Optimizer", "libyul", "yulOptimizerTests", false, false, &yul::test::YulOptimizerTest::create},
|
{"Yul Optimizer", "libyul", "yulOptimizerTests", false, false, &yul::test::YulOptimizerTest::create},
|
||||||
{"Yul Interpreter", "libyul", "yulInterpreterTests", false, false, &yul::test::YulInterpreterTest::create},
|
{"Yul Interpreter", "libyul", "yulInterpreterTests", false, false, &yul::test::YulInterpreterTest::create},
|
||||||
{"Yul Object Compiler", "libyul", "objectCompiler", false, false, &yul::test::ObjectCompilerTest::create},
|
{"Yul Object Compiler", "libyul", "objectCompiler", false, false, &yul::test::ObjectCompilerTest::create},
|
||||||
|
@ -15,7 +15,7 @@
|
|||||||
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
along with solidity. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <test/libyul/EWasmTranslationTest.h>
|
#include <test/libyul/EwasmTranslationTest.h>
|
||||||
|
|
||||||
#include <test/tools/yulInterpreter/Interpreter.h>
|
#include <test/tools/yulInterpreter/Interpreter.h>
|
||||||
|
|
||||||
@ -23,7 +23,7 @@
|
|||||||
|
|
||||||
#include <libyul/backends/evm/EVMDialect.h>
|
#include <libyul/backends/evm/EVMDialect.h>
|
||||||
#include <libyul/backends/wasm/WasmDialect.h>
|
#include <libyul/backends/wasm/WasmDialect.h>
|
||||||
#include <libyul/backends/wasm/EVMToEWasmTranslator.h>
|
#include <libyul/backends/wasm/EVMToEwasmTranslator.h>
|
||||||
#include <libyul/AsmParser.h>
|
#include <libyul/AsmParser.h>
|
||||||
#include <libyul/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
#include <libyul/AsmAnalysisInfo.h>
|
#include <libyul/AsmAnalysisInfo.h>
|
||||||
@ -47,7 +47,7 @@ using namespace dev::solidity::test;
|
|||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
EWasmTranslationTest::EWasmTranslationTest(string const& _filename)
|
EwasmTranslationTest::EwasmTranslationTest(string const& _filename)
|
||||||
{
|
{
|
||||||
boost::filesystem::path path(_filename);
|
boost::filesystem::path path(_filename);
|
||||||
|
|
||||||
@ -60,12 +60,12 @@ EWasmTranslationTest::EWasmTranslationTest(string const& _filename)
|
|||||||
m_expectation = parseSimpleExpectations(file);
|
m_expectation = parseSimpleExpectations(file);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestCase::TestResult EWasmTranslationTest::run(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
TestCase::TestResult EwasmTranslationTest::run(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
||||||
{
|
{
|
||||||
if (!parse(_stream, _linePrefix, _formatted))
|
if (!parse(_stream, _linePrefix, _formatted))
|
||||||
return TestResult::FatalError;
|
return TestResult::FatalError;
|
||||||
|
|
||||||
*m_object = EVMToEWasmTranslator(
|
*m_object = EVMToEwasmTranslator(
|
||||||
EVMDialect::strictAssemblyForEVMObjects(dev::test::Options::get().evmVersion())
|
EVMDialect::strictAssemblyForEVMObjects(dev::test::Options::get().evmVersion())
|
||||||
).run(*m_object);
|
).run(*m_object);
|
||||||
|
|
||||||
@ -89,17 +89,17 @@ TestCase::TestResult EWasmTranslationTest::run(ostream& _stream, string const& _
|
|||||||
return TestResult::Success;
|
return TestResult::Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
void EWasmTranslationTest::printSource(ostream& _stream, string const& _linePrefix, bool const) const
|
void EwasmTranslationTest::printSource(ostream& _stream, string const& _linePrefix, bool const) const
|
||||||
{
|
{
|
||||||
printIndented(_stream, m_source, _linePrefix);
|
printIndented(_stream, m_source, _linePrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EWasmTranslationTest::printUpdatedExpectations(ostream& _stream, string const& _linePrefix) const
|
void EwasmTranslationTest::printUpdatedExpectations(ostream& _stream, string const& _linePrefix) const
|
||||||
{
|
{
|
||||||
printIndented(_stream, m_obtainedResult, _linePrefix);
|
printIndented(_stream, m_obtainedResult, _linePrefix);
|
||||||
}
|
}
|
||||||
|
|
||||||
void EWasmTranslationTest::printIndented(ostream& _stream, string const& _output, string const& _linePrefix) const
|
void EwasmTranslationTest::printIndented(ostream& _stream, string const& _output, string const& _linePrefix) const
|
||||||
{
|
{
|
||||||
stringstream output(_output);
|
stringstream output(_output);
|
||||||
string line;
|
string line;
|
||||||
@ -107,7 +107,7 @@ void EWasmTranslationTest::printIndented(ostream& _stream, string const& _output
|
|||||||
_stream << _linePrefix << line << endl;
|
_stream << _linePrefix << line << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool EWasmTranslationTest::parse(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
bool EwasmTranslationTest::parse(ostream& _stream, string const& _linePrefix, bool const _formatted)
|
||||||
{
|
{
|
||||||
AssemblyStack stack(
|
AssemblyStack stack(
|
||||||
dev::test::Options::get().evmVersion(),
|
dev::test::Options::get().evmVersion(),
|
||||||
@ -127,7 +127,7 @@ bool EWasmTranslationTest::parse(ostream& _stream, string const& _linePrefix, bo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
string EWasmTranslationTest::interpret()
|
string EwasmTranslationTest::interpret()
|
||||||
{
|
{
|
||||||
InterpreterState state;
|
InterpreterState state;
|
||||||
state.maxTraceSize = 10000;
|
state.maxTraceSize = 10000;
|
||||||
@ -147,7 +147,7 @@ string EWasmTranslationTest::interpret()
|
|||||||
return result.str();
|
return result.str();
|
||||||
}
|
}
|
||||||
|
|
||||||
void EWasmTranslationTest::printErrors(ostream& _stream, ErrorList const& _errors)
|
void EwasmTranslationTest::printErrors(ostream& _stream, ErrorList const& _errors)
|
||||||
{
|
{
|
||||||
SourceReferenceFormatter formatter(_stream);
|
SourceReferenceFormatter formatter(_stream);
|
||||||
|
|
@ -32,15 +32,15 @@ namespace yul
|
|||||||
namespace test
|
namespace test
|
||||||
{
|
{
|
||||||
|
|
||||||
class EWasmTranslationTest: public dev::solidity::test::EVMVersionRestrictedTestCase
|
class EwasmTranslationTest: public dev::solidity::test::EVMVersionRestrictedTestCase
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static std::unique_ptr<TestCase> create(Config const& _config)
|
static std::unique_ptr<TestCase> create(Config const& _config)
|
||||||
{
|
{
|
||||||
return std::make_unique<EWasmTranslationTest>(_config.filename);
|
return std::make_unique<EwasmTranslationTest>(_config.filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
explicit EWasmTranslationTest(std::string const& _filename);
|
explicit EwasmTranslationTest(std::string const& _filename);
|
||||||
|
|
||||||
TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool const _formatted = false) override;
|
TestResult run(std::ostream& _stream, std::string const& _linePrefix = "", bool const _formatted = false) override;
|
||||||
|
|
@ -32,7 +32,7 @@ add_executable(isoltest
|
|||||||
../libsolidity/SMTCheckerTest.cpp
|
../libsolidity/SMTCheckerTest.cpp
|
||||||
../libsolidity/SMTCheckerJSONTest.cpp
|
../libsolidity/SMTCheckerJSONTest.cpp
|
||||||
../libyul/Common.cpp
|
../libyul/Common.cpp
|
||||||
../libyul/EWasmTranslationTest.cpp
|
../libyul/EwasmTranslationTest.cpp
|
||||||
../libyul/FunctionSideEffects.cpp
|
../libyul/FunctionSideEffects.cpp
|
||||||
../libyul/ObjectCompilerTest.cpp
|
../libyul/ObjectCompilerTest.cpp
|
||||||
../libyul/YulOptimizerTest.cpp
|
../libyul/YulOptimizerTest.cpp
|
||||||
|
Loading…
Reference in New Issue
Block a user