diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt index bc686ddf3..dee8d1224 100644 --- a/libyul/CMakeLists.txt +++ b/libyul/CMakeLists.txt @@ -62,6 +62,8 @@ add_library(yul optimiser/BlockFlattener.h optimiser/BlockHasher.cpp optimiser/BlockHasher.h + optimiser/CallGraphGenerator.cpp + optimiser/CallGraphGenerator.h optimiser/CommonSubexpressionEliminator.cpp optimiser/CommonSubexpressionEliminator.h optimiser/ControlFlowSimplifier.cpp diff --git a/libyul/optimiser/CallGraphGenerator.cpp b/libyul/optimiser/CallGraphGenerator.cpp new file mode 100644 index 000000000..0e2a63578 --- /dev/null +++ b/libyul/optimiser/CallGraphGenerator.cpp @@ -0,0 +1,54 @@ +/* + 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 . +*/ +/** + * Specific AST walker that generates the call graph. + */ + +#include +#include + +#include + +#include + +using namespace std; +using namespace dev; +using namespace yul; + + +void CallGraphGenerator::operator()(FunctionalInstruction const& _functionalInstruction) +{ + m_callGraph.insert(m_currentFunction, YulString{ + dev::eth::instructionInfo(_functionalInstruction.instruction).name + }); + ASTWalker::operator()(_functionalInstruction); +} + +void CallGraphGenerator::operator()(FunctionCall const& _functionCall) +{ + m_callGraph.insert(m_currentFunction, _functionCall.functionName.name); + ASTWalker::operator()(_functionCall); +} + +void CallGraphGenerator::operator()(FunctionDefinition const& _functionDefinition) +{ + YulString previousFunction = m_currentFunction; + m_currentFunction = _functionDefinition.name; + ASTWalker::operator()(_functionDefinition); + m_currentFunction = previousFunction; +} + diff --git a/libyul/optimiser/CallGraphGenerator.h b/libyul/optimiser/CallGraphGenerator.h new file mode 100644 index 000000000..212d29d04 --- /dev/null +++ b/libyul/optimiser/CallGraphGenerator.h @@ -0,0 +1,57 @@ +/* + 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 . +*/ +/** + * Specific AST walker that generates the call graph. + */ + +#pragma once + +#include + +#include + +#include + +#include +#include + +namespace yul +{ + +/** + * Specific AST walker that generates the call graph. + * + * The outermost (non-function) context is denoted by the empty string. + */ +class CallGraphGenerator: public ASTWalker +{ +public: + /// @returns the call graph of the visited AST. + InvertibleRelation const& callGraph() const { return m_callGraph; } + + using ASTWalker::operator(); + void operator()(FunctionalInstruction const& _functionalInstruction) override; + void operator()(FunctionCall const& _functionCall) override; + void operator()(FunctionDefinition const& _functionDefinition) override; + +private: + InvertibleRelation m_callGraph; + /// The name of the function we are currently visiting during traversal. + YulString m_currentFunction; +}; + +}