mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Finish word size transform.
This commit is contained in:
@@ -18,6 +18,8 @@
|
||||
#include <libyul/AsmData.h>
|
||||
#include <libyul/backends/wasm/WordSizeTransform.h>
|
||||
#include <libyul/Utilities.h>
|
||||
#include <libyul/Dialect.h>
|
||||
#include <libyul/optimiser/NameDisplacer.h>
|
||||
|
||||
#include <libdevcore/CommonData.h>
|
||||
|
||||
@@ -41,6 +43,10 @@ void WordSizeTransform::operator()(FunctionalInstruction& _ins)
|
||||
|
||||
void WordSizeTransform::operator()(FunctionCall& _fc)
|
||||
{
|
||||
if (BuiltinFunction const* fun = m_inputDialect.builtin(_fc.functionName.name))
|
||||
if (fun->literalArguments)
|
||||
return;
|
||||
|
||||
rewriteFunctionCallArguments(_fc.arguments);
|
||||
}
|
||||
|
||||
@@ -48,7 +54,7 @@ void WordSizeTransform::operator()(If& _if)
|
||||
{
|
||||
_if.condition = make_unique<Expression>(FunctionCall{
|
||||
locationOf(*_if.condition),
|
||||
Identifier{locationOf(*_if.condition), "or_bool"_yulstring}, // TODO make sure this is not used
|
||||
Identifier{locationOf(*_if.condition), "or_bool"_yulstring},
|
||||
expandValueToVector(*_if.condition)
|
||||
});
|
||||
(*this)(_if.body);
|
||||
@@ -59,6 +65,18 @@ void WordSizeTransform::operator()(Switch&)
|
||||
yulAssert(false, "Switch statement not implemented.");
|
||||
}
|
||||
|
||||
void WordSizeTransform::operator()(ForLoop& _for)
|
||||
{
|
||||
(*this)(_for.pre);
|
||||
_for.condition = make_unique<Expression>(FunctionCall{
|
||||
locationOf(*_for.condition),
|
||||
Identifier{locationOf(*_for.condition), "or_bool"_yulstring},
|
||||
expandValueToVector(*_for.condition)
|
||||
});
|
||||
(*this)(_for.post);
|
||||
(*this)(_for.body);
|
||||
}
|
||||
|
||||
void WordSizeTransform::operator()(Block& _block)
|
||||
{
|
||||
iterateReplacing(
|
||||
@@ -142,9 +160,11 @@ void WordSizeTransform::operator()(Block& _block)
|
||||
);
|
||||
}
|
||||
|
||||
void WordSizeTransform::run(Block& _ast, NameDispenser& _nameDispenser)
|
||||
void WordSizeTransform::run(Dialect const& _inputDialect, Block& _ast, NameDispenser& _nameDispenser)
|
||||
{
|
||||
WordSizeTransform{_nameDispenser}(_ast);
|
||||
// Free the name `or_bool`.
|
||||
NameDisplacer{_nameDispenser, {"or_bool"_yulstring}}(_ast);
|
||||
WordSizeTransform{_inputDialect, _nameDispenser}(_ast);
|
||||
}
|
||||
|
||||
void WordSizeTransform::rewriteVarDeclList(TypedNameList& _nameList)
|
||||
|
||||
Reference in New Issue
Block a user