Side effects propagator.

This commit is contained in:
chriseth
2019-08-15 16:30:05 +02:00
parent c047803b80
commit a2a06d0318
5 changed files with 74 additions and 7 deletions
+28
View File
@@ -28,6 +28,7 @@
#include <libevmasm/SemanticInformation.h>
#include <libdevcore/CommonData.h>
#include <libdevcore/Algorithms.h>
using namespace std;
using namespace dev;
@@ -93,6 +94,33 @@ void MSizeFinder::operator()(FunctionCall const& _functionCall)
m_msizeFound = true;
}
map<YulString, SideEffects> SideEffectsPropagator::sideEffects(
Dialect const& _dialect,
map<YulString, std::set<YulString>> const& _directCallGraph
)
{
map<YulString, SideEffects> ret;
for (auto const& call: _directCallGraph)
{
YulString funName = call.first;
SideEffects sideEffects;
BreadthFirstSearch<YulString>{call.second, {funName}}.run(
[&](YulString _function, auto&& _addChild) {
if (sideEffects == SideEffects::worst())
return;
if (BuiltinFunction const* f = _dialect.builtin(_function))
sideEffects += f->sideEffects;
else
for (YulString callee: _directCallGraph.at(_function))
_addChild(callee);
}
);
ret[funName] = sideEffects;
}
return ret;
}
MovableChecker::MovableChecker(Dialect const& _dialect, Expression const& _expression):
MovableChecker(_dialect)
{