mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Add fuzzing steps for stacklimitevader, fakestacklimitevader, reasoningbasedsimplifier, and unusedfunctionparameterpruner
This commit is contained in:
parent
3b3c64efe2
commit
2eb1a1d075
@ -42,15 +42,19 @@
|
|||||||
#include <libyul/optimiser/MainFunction.h>
|
#include <libyul/optimiser/MainFunction.h>
|
||||||
#include <libyul/optimiser/NameDisplacer.h>
|
#include <libyul/optimiser/NameDisplacer.h>
|
||||||
#include <libyul/optimiser/Rematerialiser.h>
|
#include <libyul/optimiser/Rematerialiser.h>
|
||||||
|
#include <libyul/optimiser/StackLimitEvader.h>
|
||||||
#include <libyul/optimiser/ExpressionSimplifier.h>
|
#include <libyul/optimiser/ExpressionSimplifier.h>
|
||||||
|
#include <libyul/optimiser/UnusedFunctionParameterPruner.h>
|
||||||
#include <libyul/optimiser/UnusedPruner.h>
|
#include <libyul/optimiser/UnusedPruner.h>
|
||||||
#include <libyul/optimiser/ExpressionJoiner.h>
|
#include <libyul/optimiser/ExpressionJoiner.h>
|
||||||
#include <libyul/optimiser/OptimiserStep.h>
|
#include <libyul/optimiser/OptimiserStep.h>
|
||||||
#include <libyul/optimiser/SSAReverser.h>
|
#include <libyul/optimiser/SSAReverser.h>
|
||||||
#include <libyul/optimiser/SSATransform.h>
|
#include <libyul/optimiser/SSATransform.h>
|
||||||
|
#include <libyul/optimiser/ReasoningBasedSimplifier.h>
|
||||||
#include <libyul/optimiser/RedundantAssignEliminator.h>
|
#include <libyul/optimiser/RedundantAssignEliminator.h>
|
||||||
#include <libyul/optimiser/StructuralSimplifier.h>
|
#include <libyul/optimiser/StructuralSimplifier.h>
|
||||||
#include <libyul/optimiser/StackCompressor.h>
|
#include <libyul/optimiser/StackCompressor.h>
|
||||||
|
#include <libyul/optimiser/StackToMemoryMover.h>
|
||||||
#include <libyul/optimiser/Suite.h>
|
#include <libyul/optimiser/Suite.h>
|
||||||
#include <libyul/backends/evm/ConstantOptimiser.h>
|
#include <libyul/backends/evm/ConstantOptimiser.h>
|
||||||
#include <libyul/backends/evm/EVMDialect.h>
|
#include <libyul/backends/evm/EVMDialect.h>
|
||||||
@ -59,6 +63,7 @@
|
|||||||
#include <libyul/AsmPrinter.h>
|
#include <libyul/AsmPrinter.h>
|
||||||
#include <libyul/AsmAnalysis.h>
|
#include <libyul/AsmAnalysis.h>
|
||||||
#include <libyul/AssemblyStack.h>
|
#include <libyul/AssemblyStack.h>
|
||||||
|
#include <libyul/CompilabilityChecker.h>
|
||||||
#include <liblangutil/SourceReferenceFormatter.h>
|
#include <liblangutil/SourceReferenceFormatter.h>
|
||||||
|
|
||||||
#include <libsolidity/interface/OptimiserSettings.h>
|
#include <libsolidity/interface/OptimiserSettings.h>
|
||||||
@ -339,6 +344,71 @@ shared_ptr<Block> YulOptimizerStepTest::run()
|
|||||||
GasMeter meter(dynamic_cast<EVMDialect const&>(*m_dialect), false, 200);
|
GasMeter meter(dynamic_cast<EVMDialect const&>(*m_dialect), false, 200);
|
||||||
OptimiserSuite::run(*m_dialect, &meter, *m_object, true, solidity::frontend::OptimiserSettings::DefaultYulOptimiserSteps);
|
OptimiserSuite::run(*m_dialect, &meter, *m_object, true, solidity::frontend::OptimiserSettings::DefaultYulOptimiserSteps);
|
||||||
}
|
}
|
||||||
|
else if (m_optimizerStep == "stackLimitEvader")
|
||||||
|
{
|
||||||
|
yul::Object obj;
|
||||||
|
obj.code = m_object->code;
|
||||||
|
obj.analysisInfo = m_analysisInfo;
|
||||||
|
disambiguate();
|
||||||
|
StackLimitEvader::run(*m_context, obj, CompilabilityChecker{
|
||||||
|
*m_dialect,
|
||||||
|
obj,
|
||||||
|
true
|
||||||
|
}.unreachableVariables);
|
||||||
|
}
|
||||||
|
else if (m_optimizerStep == "fakeStackLimitEvader")
|
||||||
|
{
|
||||||
|
yul::Object obj;
|
||||||
|
obj.code = m_object->code;
|
||||||
|
obj.analysisInfo = m_analysisInfo;
|
||||||
|
disambiguate();
|
||||||
|
// Mark all variables with a name starting with "$" for escalation to memory.
|
||||||
|
struct FakeUnreachableGenerator: ASTWalker
|
||||||
|
{
|
||||||
|
map<YulString, set<YulString>> fakeUnreachables;
|
||||||
|
using ASTWalker::operator();
|
||||||
|
void operator()(FunctionDefinition const& _function) override
|
||||||
|
{
|
||||||
|
YulString originalFunctionName = m_currentFunction;
|
||||||
|
m_currentFunction = _function.name;
|
||||||
|
ASTWalker::operator()(_function);
|
||||||
|
m_currentFunction = originalFunctionName;
|
||||||
|
}
|
||||||
|
void visitVariableName(YulString _var)
|
||||||
|
{
|
||||||
|
if (!_var.empty() && _var.str().front() == '$')
|
||||||
|
fakeUnreachables[m_currentFunction].insert(_var);
|
||||||
|
}
|
||||||
|
void operator()(VariableDeclaration const& _varDecl) override
|
||||||
|
{
|
||||||
|
for (auto const& var: _varDecl.variables)
|
||||||
|
visitVariableName(var.name);
|
||||||
|
ASTWalker::operator()(_varDecl);
|
||||||
|
}
|
||||||
|
void operator()(Identifier const& _identifier) override
|
||||||
|
{
|
||||||
|
visitVariableName(_identifier.name);
|
||||||
|
ASTWalker::operator()(_identifier);
|
||||||
|
}
|
||||||
|
YulString m_currentFunction = YulString{};
|
||||||
|
};
|
||||||
|
FakeUnreachableGenerator fakeUnreachableGenerator;
|
||||||
|
fakeUnreachableGenerator(*obj.code);
|
||||||
|
StackLimitEvader::run(*m_context, obj, fakeUnreachableGenerator.fakeUnreachables);
|
||||||
|
}
|
||||||
|
else if (m_optimizerStep == "unusedFunctionParameterPruner")
|
||||||
|
{
|
||||||
|
disambiguate();
|
||||||
|
ForLoopInitRewriter::run(*m_context, *m_ast);
|
||||||
|
FunctionHoister::run(*m_context, *m_object->code);
|
||||||
|
LiteralRematerialiser::run(*m_context, *m_object->code);
|
||||||
|
UnusedFunctionParameterPruner::run(*m_context, *m_object->code);
|
||||||
|
}
|
||||||
|
else if (m_optimizerStep == "reasoningBasedSimplifier")
|
||||||
|
{
|
||||||
|
disambiguate();
|
||||||
|
ReasoningBasedSimplifier::run(*m_context, *m_object->code);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
solUnimplemented("Invalid optimization step");
|
solUnimplemented("Invalid optimization step");
|
||||||
|
|
||||||
|
|||||||
@ -1981,6 +1981,14 @@ string ProtoConverter::optStepToString(Program_OptimizerStep const& _x)
|
|||||||
return "ssaAndBack";
|
return "ssaAndBack";
|
||||||
case Program_OptimizerStep_STACKCOMPRESSION:
|
case Program_OptimizerStep_STACKCOMPRESSION:
|
||||||
return "stackCompressor";
|
return "stackCompressor";
|
||||||
|
case Program_OptimizerStep_FAKESTACKLIMITEVADER:
|
||||||
|
return "fakeStackLimitEvader";
|
||||||
|
case Program_OptimizerStep_STACKLIMITEVADER:
|
||||||
|
return "stackLimitEvader";
|
||||||
|
case Program_OptimizerStep_REASONINGBASEDSIMPLIFIER:
|
||||||
|
return "reasoningBasedSimplifier";
|
||||||
|
case Program_OptimizerStep_UNUSEDFUNCTIONPARAMPRUNER:
|
||||||
|
return "unusedFunctionParameterPruner";
|
||||||
default:
|
default:
|
||||||
return "fullSuite";
|
return "fullSuite";
|
||||||
}
|
}
|
||||||
|
|||||||
@ -447,6 +447,10 @@ message Program {
|
|||||||
SSAREVERSER = 33;
|
SSAREVERSER = 33;
|
||||||
SSAANDBACK = 34;
|
SSAANDBACK = 34;
|
||||||
STACKCOMPRESSION = 35;
|
STACKCOMPRESSION = 35;
|
||||||
|
FAKESTACKLIMITEVADER = 36;
|
||||||
|
STACKLIMITEVADER = 37;
|
||||||
|
REASONINGBASEDSIMPLIFIER = 38;
|
||||||
|
UNUSEDFUNCTIONPARAMPRUNER = 39;
|
||||||
}
|
}
|
||||||
oneof program_oneof {
|
oneof program_oneof {
|
||||||
Block block = 1;
|
Block block = 1;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user