diff --git a/libyul/CMakeLists.txt b/libyul/CMakeLists.txt index 18a96049d..59fb6d468 100644 --- a/libyul/CMakeLists.txt +++ b/libyul/CMakeLists.txt @@ -129,6 +129,8 @@ add_library(yul optimiser/FullInliner.h optimiser/FunctionCallFinder.cpp optimiser/FunctionCallFinder.h + optimiser/FunctionDefinitionCollector.cpp + optimiser/FunctionDefinitionCollector.h optimiser/FunctionGrouper.cpp optimiser/FunctionGrouper.h optimiser/FunctionHoister.cpp diff --git a/libyul/optimiser/FunctionDefinitionCollector.cpp b/libyul/optimiser/FunctionDefinitionCollector.cpp new file mode 100644 index 000000000..70f2a268d --- /dev/null +++ b/libyul/optimiser/FunctionDefinitionCollector.cpp @@ -0,0 +1,36 @@ +/* + 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 . +*/ + +#include +#include + +using namespace std; +using namespace solidity; +using namespace solidity::yul; + +map FunctionDefinitionCollector::run(Block& _block) +{ + FunctionDefinitionCollector functionDefinitionCollector; + functionDefinitionCollector(_block); + return functionDefinitionCollector.m_functionDefinitions; +} + +void FunctionDefinitionCollector::operator()(FunctionDefinition const& _functionDefinition) +{ + m_functionDefinitions[_functionDefinition.name] = &_functionDefinition; + ASTWalker::operator()(_functionDefinition); +} diff --git a/libyul/optimiser/FunctionDefinitionCollector.h b/libyul/optimiser/FunctionDefinitionCollector.h new file mode 100644 index 000000000..c97f20d67 --- /dev/null +++ b/libyul/optimiser/FunctionDefinitionCollector.h @@ -0,0 +1,44 @@ +/* + 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 . +*/ +/** + * AST walker that finds all function definitions and stores them into a map indexed by the function names. + */ +#pragma once + +#include + +#include + +namespace solidity::yul +{ + +/** + * AST walker that finds all function definitions and stores them into a map indexed by the function names. + * + * Prerequisite: Disambiguator + */ +class FunctionDefinitionCollector: ASTWalker +{ +public: + static std::map run(Block& _block); +private: + using ASTWalker::operator(); + void operator()(FunctionDefinition const& _functionDefinition) override; + std::map m_functionDefinitions; +}; + +}