/src/solidity/libsolutil/Algorithms.h
Line | Count | Source |
1 | | /* |
2 | | This file is part of solidity. |
3 | | |
4 | | solidity is free software: you can redistribute it and/or modify |
5 | | it under the terms of the GNU General Public License as published by |
6 | | the Free Software Foundation, either version 3 of the License, or |
7 | | (at your option) any later version. |
8 | | |
9 | | solidity is distributed in the hope that it will be useful, |
10 | | but WITHOUT ANY WARRANTY; without even the implied warranty of |
11 | | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
12 | | GNU General Public License for more details. |
13 | | |
14 | | You should have received a copy of the GNU General Public License |
15 | | along with solidity. If not, see <http://www.gnu.org/licenses/>. |
16 | | */ |
17 | | // SPDX-License-Identifier: GPL-3.0 |
18 | | #pragma once |
19 | | |
20 | | |
21 | | #include <functional> |
22 | | #include <list> |
23 | | #include <set> |
24 | | |
25 | | namespace solidity::util |
26 | | { |
27 | | |
28 | | /** |
29 | | * Detector for cycles in directed graphs. It returns the first |
30 | | * vertex on the path towards a cycle or a nullptr if there is |
31 | | * no reachable cycle starting from a given vertex. |
32 | | */ |
33 | | template <typename V> |
34 | | class CycleDetector |
35 | | { |
36 | | public: |
37 | | using Visitor = std::function<void(V const&, CycleDetector&, size_t)>; |
38 | | |
39 | | /// Initializes the cycle detector |
40 | | /// @param _visit function that is given the current vertex |
41 | | /// and is supposed to call @a run on all |
42 | | /// adjacent vertices. |
43 | | explicit CycleDetector(Visitor _visit): |
44 | 25.1k | m_visit(std::move(_visit)) |
45 | 25.1k | { }solidity::util::CycleDetector<solidity::frontend::ContractDefinition>::CycleDetector(std::__1::function<void (solidity::frontend::ContractDefinition const&, solidity::util::CycleDetector<solidity::frontend::ContractDefinition>&, unsigned long)>) Line | Count | Source | 44 | 14.8k | m_visit(std::move(_visit)) | 45 | 14.8k | { } |
solidity::util::CycleDetector<solidity::frontend::StructDefinition>::CycleDetector(std::__1::function<void (solidity::frontend::StructDefinition const&, solidity::util::CycleDetector<solidity::frontend::StructDefinition>&, unsigned long)>) Line | Count | Source | 44 | 9.28k | m_visit(std::move(_visit)) | 45 | 9.28k | { } |
solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>::CycleDetector(std::__1::function<void (solidity::frontend::VariableDeclaration const&, solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>&, unsigned long)>) Line | Count | Source | 44 | 1.01k | m_visit(std::move(_visit)) | 45 | 1.01k | { } |
|
46 | | |
47 | | /// Recursively perform cycle detection starting |
48 | | /// (or continuing) with @param _vertex |
49 | | /// @returns the first vertex on the path towards a cycle from @a _vertex |
50 | | /// or nullptr if no cycle is reachable from @a _vertex. |
51 | | V const* run(V const& _vertex) |
52 | 66.5k | { |
53 | 66.5k | if (m_firstCycleVertex) |
54 | 0 | return m_firstCycleVertex; |
55 | 66.5k | if (m_processed.count(&_vertex)) |
56 | 249 | return nullptr; |
57 | 66.2k | else if (m_processing.count(&_vertex)) |
58 | 195 | return m_firstCycleVertex = &_vertex; |
59 | 66.0k | m_processing.insert(&_vertex); |
60 | | |
61 | 66.0k | m_depth++; |
62 | 66.0k | m_visit(_vertex, *this, m_depth); |
63 | 66.0k | m_depth--; |
64 | 66.0k | if (m_firstCycleVertex && m_depth == 1) |
65 | 175 | m_firstCycleVertex = &_vertex; |
66 | | |
67 | 66.0k | m_processing.erase(&_vertex); |
68 | 66.0k | m_processed.insert(&_vertex); |
69 | 66.0k | return m_firstCycleVertex; |
70 | 66.5k | } solidity::util::CycleDetector<solidity::frontend::ContractDefinition>::run(solidity::frontend::ContractDefinition const&) Line | Count | Source | 52 | 15.1k | { | 53 | 15.1k | if (m_firstCycleVertex) | 54 | 0 | return m_firstCycleVertex; | 55 | 15.1k | if (m_processed.count(&_vertex)) | 56 | 0 | return nullptr; | 57 | 15.1k | else if (m_processing.count(&_vertex)) | 58 | 33 | return m_firstCycleVertex = &_vertex; | 59 | 15.1k | m_processing.insert(&_vertex); | 60 | | | 61 | 15.1k | m_depth++; | 62 | 15.1k | m_visit(_vertex, *this, m_depth); | 63 | 15.1k | m_depth--; | 64 | 15.1k | if (m_firstCycleVertex && m_depth == 1) | 65 | 29 | m_firstCycleVertex = &_vertex; | 66 | | | 67 | 15.1k | m_processing.erase(&_vertex); | 68 | 15.1k | m_processed.insert(&_vertex); | 69 | 15.1k | return m_firstCycleVertex; | 70 | 15.1k | } |
solidity::util::CycleDetector<solidity::frontend::StructDefinition>::run(solidity::frontend::StructDefinition const&) Line | Count | Source | 52 | 49.6k | { | 53 | 49.6k | if (m_firstCycleVertex) | 54 | 0 | return m_firstCycleVertex; | 55 | 49.6k | if (m_processed.count(&_vertex)) | 56 | 219 | return nullptr; | 57 | 49.3k | else if (m_processing.count(&_vertex)) | 58 | 7 | return m_firstCycleVertex = &_vertex; | 59 | 49.3k | m_processing.insert(&_vertex); | 60 | | | 61 | 49.3k | m_depth++; | 62 | 49.3k | m_visit(_vertex, *this, m_depth); | 63 | 49.3k | m_depth--; | 64 | 49.3k | if (m_firstCycleVertex && m_depth == 1) | 65 | 5 | m_firstCycleVertex = &_vertex; | 66 | | | 67 | 49.3k | m_processing.erase(&_vertex); | 68 | 49.3k | m_processed.insert(&_vertex); | 69 | 49.3k | return m_firstCycleVertex; | 70 | 49.6k | } |
solidity::util::CycleDetector<solidity::frontend::VariableDeclaration>::run(solidity::frontend::VariableDeclaration const&) Line | Count | Source | 52 | 1.76k | { | 53 | 1.76k | if (m_firstCycleVertex) | 54 | 0 | return m_firstCycleVertex; | 55 | 1.76k | if (m_processed.count(&_vertex)) | 56 | 30 | return nullptr; | 57 | 1.73k | else if (m_processing.count(&_vertex)) | 58 | 155 | return m_firstCycleVertex = &_vertex; | 59 | 1.58k | m_processing.insert(&_vertex); | 60 | | | 61 | 1.58k | m_depth++; | 62 | 1.58k | m_visit(_vertex, *this, m_depth); | 63 | 1.58k | m_depth--; | 64 | 1.58k | if (m_firstCycleVertex && m_depth == 1) | 65 | 141 | m_firstCycleVertex = &_vertex; | 66 | | | 67 | 1.58k | m_processing.erase(&_vertex); | 68 | 1.58k | m_processed.insert(&_vertex); | 69 | 1.58k | return m_firstCycleVertex; | 70 | 1.76k | } |
|
71 | | |
72 | | private: |
73 | | Visitor m_visit; |
74 | | std::set<V const*> m_processing; |
75 | | std::set<V const*> m_processed; |
76 | | size_t m_depth = 0; |
77 | | V const* m_firstCycleVertex = nullptr; |
78 | | }; |
79 | | |
80 | | /** |
81 | | * Generic breadth first search. |
82 | | * |
83 | | * Note that V needs to be a comparable value type or a pointer. |
84 | | * |
85 | | * Example: Gather all (recursive) children in a graph starting at (and including) ``root``: |
86 | | * |
87 | | * Node const* root = ...; |
88 | | * std::set<Node const*> allNodes = BreadthFirstSearch<Node const*>{{root}}.run([](Node const* _node, auto&& _addChild) { |
89 | | * // Potentially process ``_node``. |
90 | | * for (Node const& _child: _node->children()) |
91 | | * // Potentially filter the children to be visited. |
92 | | * _addChild(&_child); |
93 | | * }).visited; |
94 | | */ |
95 | | template<typename V> |
96 | | struct BreadthFirstSearch |
97 | | { |
98 | | /// Runs the breadth first search. The verticesToTraverse member of the struct needs to be initialized. |
99 | | /// @param _forEachChild is a callable of the form [...](V const& _node, auto&& _addChild) { ... } |
100 | | /// that is called for each visited node and is supposed to call _addChild(childNode) for every child |
101 | | /// node of _node. |
102 | | template<typename ForEachChild> |
103 | | BreadthFirstSearch& run(ForEachChild&& _forEachChild) |
104 | 5.12M | { |
105 | 34.5M | while (!verticesToTraverse.empty()) |
106 | 29.4M | { |
107 | 29.4M | V v = std::move(verticesToTraverse.front()); |
108 | 29.4M | verticesToTraverse.pop_front(); |
109 | | |
110 | 29.4M | if (!visited.insert(v).second) |
111 | 4.92M | continue; |
112 | | |
113 | 25.4M | _forEachChild(v, [this](V _vertex) { |
114 | 25.4M | verticesToTraverse.emplace_back(std::move(_vertex)); |
115 | 25.4M | }); ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0&&)::{lambda(solidity::frontend::CFGNode const*)#1}::operator()(solidity::frontend::CFGNode const*) constLine | Count | Source | 113 | 171k | _forEachChild(v, [this](V _vertex) { | 114 | 171k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 171k | }); |
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1&&)::{lambda(solidity::frontend::CFGNode const*)#1}::operator()(solidity::frontend::CFGNode const*) constLine | Count | Source | 113 | 218k | _forEachChild(v, [this](V _vertex) { | 114 | 218k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 218k | }); |
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0>(solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0&&)::{lambda(solidity::frontend::CFGNode*)#1}::operator()(solidity::frontend::CFGNode*) constLine | Count | Source | 113 | 107k | _forEachChild(v, [this](V _vertex) { | 114 | 107k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 107k | }); |
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0>(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0&&)::{lambda(solidity::frontend::CFGNode*)#1}::operator()(solidity::frontend::CFGNode*) constLine | Count | Source | 113 | 171k | _forEachChild(v, [this](V _vertex) { | 114 | 171k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 171k | }); |
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::containsNestedMapping() const::$_0>(solidity::frontend::StructType::containsNestedMapping() const::$_0&&)::{lambda(solidity::frontend::StructDefinition const*)#1}::operator()(solidity::frontend::StructDefinition const*) constLine | Count | Source | 113 | 41.0k | _forEachChild(v, [this](V _vertex) { | 114 | 41.0k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 41.0k | }); |
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::interfaceType(bool) const::$_0>(solidity::frontend::StructType::interfaceType(bool) const::$_0&&)::{lambda(solidity::frontend::StructDefinition const*)#1}::operator()(solidity::frontend::StructDefinition const*) constLine | Count | Source | 113 | 22 | _forEachChild(v, [this](V _vertex) { | 114 | 22 | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 22 | }); |
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}>(solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}&&)::{lambda(solidity::frontend::Type const*)#1}::operator()(solidity::frontend::Type const*) constCHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>::run<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0>(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0&&)::{lambda(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare)#1}::operator()(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare) constLine | Count | Source | 113 | 4.59k | _forEachChild(v, [this](V _vertex) { | 114 | 4.59k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 4.59k | }); |
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<unsigned int>::run<solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3>(solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3&&)::{lambda(unsigned int)#1}::operator()(unsigned int) constSMTEncoder.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0>(solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0&&)::{lambda(solidity::frontend::Type const*)#1}::operator()(solidity::frontend::Type const*) constLine | Count | Source | 113 | 9.75k | _forEachChild(v, [this](V _vertex) { | 114 | 9.75k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 9.75k | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 1.97M | _forEachChild(v, [this](V _vertex) { | 114 | 1.97M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.97M | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1>(solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 1.66M | _forEachChild(v, [this](V _vertex) { | 114 | 1.66M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.66M | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 2.85M | _forEachChild(v, [this](V _vertex) { | 114 | 2.85M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.85M | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0>(solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 2.53M | _forEachChild(v, [this](V _vertex) { | 114 | 2.53M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.53M | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 2.03M | _forEachChild(v, [this](V _vertex) { | 114 | 2.03M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.03M | }); |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3&&)::{lambda(solidity::yul::CFG::BasicBlock const*)#1}::operator()(solidity::yul::CFG::BasicBlock const*) constLine | Count | Source | 113 | 2.85M | _forEachChild(v, [this](V _vertex) { | 114 | 2.85M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.85M | }); |
Unexecuted instantiation: JSONExporter.cpp:solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>::run<(anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0>((anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0&&)::{lambda(solidity::yul::ssa::BlockId)#1}::operator()(solidity::yul::ssa::BlockId) constControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3>((anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) constLine | Count | Source | 113 | 3.66M | _forEachChild(v, [this](V _vertex) { | 114 | 3.66M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 3.66M | }); |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) constLine | Count | Source | 113 | 1.48M | _forEachChild(v, [this](V _vertex) { | 114 | 1.48M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.48M | }); |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1&&)::{lambda(solidity::yul::CFG::FunctionCall*)#1}::operator()(solidity::yul::CFG::FunctionCall*) constLine | Count | Source | 113 | 2.73M | _forEachChild(v, [this](V _vertex) { | 114 | 2.73M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.73M | }); |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0>((anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0&&)::{lambda(solidity::yul::CFG::BasicBlock*)#1}::operator()(solidity::yul::CFG::BasicBlock*) constLine | Count | Source | 113 | 1.35M | _forEachChild(v, [this](V _vertex) { | 114 | 1.35M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.35M | }); |
CircularReferencesPruner.cpp:solidity::util::BreadthFirstSearch<solidity::yul::YulString>::run<solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0>(solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0&&)::{lambda(solidity::yul::YulString)#1}::operator()(solidity::yul::YulString) constLine | Count | Source | 113 | 1.53M | _forEachChild(v, [this](V _vertex) { | 114 | 1.53M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.53M | }); |
|
116 | 24.5M | } |
117 | 5.12M | return *this; |
118 | 5.12M | } ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_0&&) Line | Count | Source | 104 | 18.4k | { | 105 | 208k | while (!verticesToTraverse.empty()) | 106 | 189k | { | 107 | 189k | V v = std::move(verticesToTraverse.front()); | 108 | 189k | verticesToTraverse.pop_front(); | 109 | | | 110 | 189k | if (!visited.insert(v).second) | 111 | 44.3k | continue; | 112 | | | 113 | 145k | _forEachChild(v, [this](V _vertex) { | 114 | 145k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 145k | }); | 116 | 145k | } | 117 | 18.4k | return *this; | 118 | 18.4k | } |
ControlFlowAnalyzer.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode const*>::run<solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1>(solidity::frontend::ControlFlowAnalyzer::checkUnreachable(solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*, solidity::frontend::CFGNode const*)::$_1&&) Line | Count | Source | 104 | 18.4k | { | 105 | 291k | while (!verticesToTraverse.empty()) | 106 | 273k | { | 107 | 273k | V v = std::move(verticesToTraverse.front()); | 108 | 273k | verticesToTraverse.pop_front(); | 109 | | | 110 | 273k | if (!visited.insert(v).second) | 111 | 46.2k | continue; | 112 | | | 113 | 227k | _forEachChild(v, [this](V _vertex) { | 114 | 227k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 227k | }); | 116 | 227k | } | 117 | 18.4k | return *this; | 118 | 18.4k | } |
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0>(solidity::frontend::ControlFlowRevertPruner::findRevertStates()::$_0&&) Line | Count | Source | 104 | 19.0k | { | 105 | 145k | while (!verticesToTraverse.empty()) | 106 | 126k | { | 107 | 126k | V v = std::move(verticesToTraverse.front()); | 108 | 126k | verticesToTraverse.pop_front(); | 109 | | | 110 | 126k | if (!visited.insert(v).second) | 111 | 23.7k | continue; | 112 | | | 113 | 102k | _forEachChild(v, [this](V _vertex) { | 114 | 102k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 102k | }); | 116 | 102k | } | 117 | 19.0k | return *this; | 118 | 19.0k | } |
ControlFlowRevertPruner.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>& solidity::util::BreadthFirstSearch<solidity::frontend::CFGNode*>::run<solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0>(solidity::frontend::ControlFlowRevertPruner::modifyFunctionFlows()::$_0&&) Line | Count | Source | 104 | 18.4k | { | 105 | 208k | while (!verticesToTraverse.empty()) | 106 | 189k | { | 107 | 189k | V v = std::move(verticesToTraverse.front()); | 108 | 189k | verticesToTraverse.pop_front(); | 109 | | | 110 | 189k | if (!visited.insert(v).second) | 111 | 44.3k | continue; | 112 | | | 113 | 145k | _forEachChild(v, [this](V _vertex) { | 114 | 145k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 145k | }); | 116 | 145k | } | 117 | 18.4k | return *this; | 118 | 18.4k | } |
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>& solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::containsNestedMapping() const::$_0>(solidity::frontend::StructType::containsNestedMapping() const::$_0&&) Line | Count | Source | 104 | 8.43k | { | 105 | 57.9k | while (!verticesToTraverse.empty()) | 106 | 49.4k | { | 107 | 49.4k | V v = std::move(verticesToTraverse.front()); | 108 | 49.4k | verticesToTraverse.pop_front(); | 109 | | | 110 | 49.4k | if (!visited.insert(v).second) | 111 | 42 | continue; | 112 | | | 113 | 49.4k | _forEachChild(v, [this](V _vertex) { | 114 | 49.4k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 49.4k | }); | 116 | 49.4k | } | 117 | 8.43k | return *this; | 118 | 8.43k | } |
Types.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>& solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::run<solidity::frontend::StructType::interfaceType(bool) const::$_0>(solidity::frontend::StructType::interfaceType(bool) const::$_0&&) Line | Count | Source | 104 | 84 | { | 105 | 184 | while (!verticesToTraverse.empty()) | 106 | 100 | { | 107 | 100 | V v = std::move(verticesToTraverse.front()); | 108 | 100 | verticesToTraverse.pop_front(); | 109 | | | 110 | 100 | if (!visited.insert(v).second) | 111 | 5 | continue; | 112 | | | 113 | 95 | _forEachChild(v, [this](V _vertex) { | 114 | 95 | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 95 | }); | 116 | 95 | } | 117 | 84 | return *this; | 118 | 84 | } |
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>& solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}>(solidity::frontend::CHC::defineExternalFunctionInterface(solidity::frontend::FunctionDefinition const&, solidity::frontend::ContractDefinition const&)::$_0::operator()(solidity::frontend::VariableDeclaration const*) const::{lambda(auto:1, auto:2&&)#1}&&)CHC.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>& solidity::util::BreadthFirstSearch<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::ASTNodeCompare>::run<solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0>(solidity::frontend::CHC::transactionVerificationTargetsIds(solidity::frontend::ASTNode const*)::$_0&&) Line | Count | Source | 104 | 24.7k | { | 105 | 54.0k | while (!verticesToTraverse.empty()) | 106 | 29.3k | { | 107 | 29.3k | V v = std::move(verticesToTraverse.front()); | 108 | 29.3k | verticesToTraverse.pop_front(); | 109 | | | 110 | 29.3k | if (!visited.insert(v).second) | 111 | 1.34k | continue; | 112 | | | 113 | 28.0k | _forEachChild(v, [this](V _vertex) { | 114 | 28.0k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 28.0k | }); | 116 | 28.0k | } | 117 | 24.7k | return *this; | 118 | 24.7k | } |
Unexecuted instantiation: CHC.cpp:solidity::util::BreadthFirstSearch<unsigned int>& solidity::util::BreadthFirstSearch<unsigned int>::run<solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3>(solidity::frontend::CHC::generateCounterexample(solidity::smtutil::CHCSolverInterface::CexGraph const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&)::$_3&&) SMTEncoder.cpp:solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>& solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::run<solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0>(solidity::frontend::SMTEncoder::sameTypeOrSubtype(solidity::frontend::Type const*, solidity::frontend::Type const*)::$_0&&) Line | Count | Source | 104 | 18.6k | { | 105 | 47.1k | while (!verticesToTraverse.empty()) | 106 | 28.4k | { | 107 | 28.4k | V v = std::move(verticesToTraverse.front()); | 108 | 28.4k | verticesToTraverse.pop_front(); | 109 | | | 110 | 28.4k | if (!visited.insert(v).second) | 111 | 1.18k | continue; | 112 | | | 113 | 27.2k | _forEachChild(v, [this](V _vertex) { | 114 | 27.2k | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 27.2k | }); | 116 | 27.2k | } | 117 | 18.6k | return *this; | 118 | 18.6k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_0::operator()(solidity::yul::CFG::BasicBlock const*, unsigned long) const::{lambda(solidity::yul::CFG::BasicBlock const*, auto:1)#1}&&)Line | Count | Source | 104 | 180k | { | 105 | 2.34M | while (!verticesToTraverse.empty()) | 106 | 2.16M | { | 107 | 2.16M | V v = std::move(verticesToTraverse.front()); | 108 | 2.16M | verticesToTraverse.pop_front(); | 109 | | | 110 | 2.16M | if (!visited.insert(v).second) | 111 | 443k | continue; | 112 | | | 113 | 1.71M | _forEachChild(v, [this](V _vertex) { | 114 | 1.71M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.71M | }); | 116 | 1.71M | } | 117 | 180k | return *this; | 118 | 180k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1>(solidity::yul::StackLayoutGenerator::processEntryPoint(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_1&&) Line | Count | Source | 104 | 342k | { | 105 | 2.34M | while (!verticesToTraverse.empty()) | 106 | 2.00M | { | 107 | 2.00M | V v = std::move(verticesToTraverse.front()); | 108 | 2.00M | verticesToTraverse.pop_front(); | 109 | | | 110 | 2.00M | if (!visited.insert(v).second) | 111 | 252k | continue; | 112 | | | 113 | 1.75M | _forEachChild(v, [this](V _vertex) { | 114 | 1.75M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.75M | }); | 116 | 1.75M | } | 117 | 342k | return *this; | 118 | 342k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::collectBackwardsJumps(solidity::yul::CFG::BasicBlock const&) const::$_0&&) Line | Count | Source | 104 | 578k | { | 105 | 4.01M | while (!verticesToTraverse.empty()) | 106 | 3.43M | { | 107 | 3.43M | V v = std::move(verticesToTraverse.front()); | 108 | 3.43M | verticesToTraverse.pop_front(); | 109 | | | 110 | 3.43M | if (!visited.insert(v).second) | 111 | 590k | continue; | 112 | | | 113 | 2.84M | _forEachChild(v, [this](V _vertex) { | 114 | 2.84M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.84M | }); | 116 | 2.84M | } | 117 | 578k | return *this; | 118 | 578k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0>(solidity::yul::StackLayoutGenerator::stitchConditionalJumps(solidity::yul::CFG::BasicBlock const&)::$_0&&) Line | Count | Source | 104 | 578k | { | 105 | 3.69M | while (!verticesToTraverse.empty()) | 106 | 3.11M | { | 107 | 3.11M | V v = std::move(verticesToTraverse.front()); | 108 | 3.11M | verticesToTraverse.pop_front(); | 109 | | | 110 | 3.11M | if (!visited.insert(v).second) | 111 | 268k | continue; | 112 | | | 113 | 2.84M | _forEachChild(v, [this](V _vertex) { | 114 | 2.84M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.84M | }); | 116 | 2.84M | } | 117 | 578k | return *this; | 118 | 578k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0>(solidity::yul::StackLayoutGenerator::reportStackTooDeep(solidity::yul::CFG::BasicBlock const&) const::$_0&&) Line | Count | Source | 104 | 430k | { | 105 | 2.89M | while (!verticesToTraverse.empty()) | 106 | 2.46M | { | 107 | 2.46M | V v = std::move(verticesToTraverse.front()); | 108 | 2.46M | verticesToTraverse.pop_front(); | 109 | | | 110 | 2.46M | if (!visited.insert(v).second) | 111 | 177k | continue; | 112 | | | 113 | 2.28M | _forEachChild(v, [this](V _vertex) { | 114 | 2.28M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.28M | }); | 116 | 2.28M | } | 117 | 430k | return *this; | 118 | 430k | } |
StackLayoutGenerator.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock const*>::run<solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3>(solidity::yul::StackLayoutGenerator::fillInJunk(solidity::yul::CFG::BasicBlock const&, solidity::yul::CFG::FunctionInfo const*)::$_3&&) Line | Count | Source | 104 | 578k | { | 105 | 4.01M | while (!verticesToTraverse.empty()) | 106 | 3.43M | { | 107 | 3.43M | V v = std::move(verticesToTraverse.front()); | 108 | 3.43M | verticesToTraverse.pop_front(); | 109 | | | 110 | 3.43M | if (!visited.insert(v).second) | 111 | 590k | continue; | 112 | | | 113 | 2.84M | _forEachChild(v, [this](V _vertex) { | 114 | 2.84M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.84M | }); | 116 | 2.84M | } | 117 | 578k | return *this; | 118 | 578k | } |
Unexecuted instantiation: JSONExporter.cpp:solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>& solidity::util::BreadthFirstSearch<solidity::yul::ssa::BlockId>::run<(anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0>((anonymous namespace)::exportBlock(solidity::yul::ssa::SSACFG const&, solidity::yul::ssa::BlockId, solidity::yul::ssa::LivenessAnalysis const*, solidity::yul::ssa::ControlFlowGraphs const&)::$_0&&) ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3>((anonymous namespace)::cleanUnreachable(solidity::yul::CFG&)::$_3&&) Line | Count | Source | 104 | 185k | { | 105 | 4.03M | while (!verticesToTraverse.empty()) | 106 | 3.84M | { | 107 | 3.84M | V v = std::move(verticesToTraverse.front()); | 108 | 3.84M | verticesToTraverse.pop_front(); | 109 | | | 110 | 3.84M | if (!visited.insert(v).second) | 111 | 1.00M | continue; | 112 | | | 113 | 2.84M | _forEachChild(v, [this](V _vertex) { | 114 | 2.84M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.84M | }); | 116 | 2.84M | } | 117 | 185k | return *this; | 118 | 185k | } |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_0::operator()(solidity::yul::CFG::BasicBlock*) const::{lambda(solidity::yul::CFG::BasicBlock*, auto:1)#1}&&)Line | Count | Source | 104 | 392k | { | 105 | 2.27M | while (!verticesToTraverse.empty()) | 106 | 1.87M | { | 107 | 1.87M | V v = std::move(verticesToTraverse.front()); | 108 | 1.87M | verticesToTraverse.pop_front(); | 109 | | | 110 | 1.87M | if (!visited.insert(v).second) | 111 | 283k | continue; | 112 | | | 113 | 1.59M | _forEachChild(v, [this](V _vertex) { | 114 | 1.59M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.59M | }); | 116 | 1.59M | } | 117 | 392k | return *this; | 118 | 392k | } |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::run<(anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1>((anonymous namespace)::markRecursiveCalls(solidity::yul::CFG&)::$_1&&) Line | Count | Source | 104 | 455k | { | 105 | 2.46M | while (!verticesToTraverse.empty()) | 106 | 2.00M | { | 107 | 2.00M | V v = std::move(verticesToTraverse.front()); | 108 | 2.00M | verticesToTraverse.pop_front(); | 109 | | | 110 | 2.00M | if (!visited.insert(v).second) | 111 | 505k | continue; | 112 | | | 113 | 1.50M | _forEachChild(v, [this](V _vertex) { | 114 | 1.50M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.50M | }); | 116 | 1.50M | } | 117 | 455k | return *this; | 118 | 455k | } |
ControlFlowGraphBuilder.cpp:solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>& solidity::util::BreadthFirstSearch<solidity::yul::CFG::BasicBlock*>::run<(anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0>((anonymous namespace)::markNeedsCleanStack(solidity::yul::CFG&)::$_0&&) Line | Count | Source | 104 | 438k | { | 105 | 2.23M | while (!verticesToTraverse.empty()) | 106 | 1.79M | { | 107 | 1.79M | V v = std::move(verticesToTraverse.front()); | 108 | 1.79M | verticesToTraverse.pop_front(); | 109 | | | 110 | 1.79M | if (!visited.insert(v).second) | 111 | 252k | continue; | 112 | | | 113 | 1.54M | _forEachChild(v, [this](V _vertex) { | 114 | 1.54M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 1.54M | }); | 116 | 1.54M | } | 117 | 438k | return *this; | 118 | 438k | } |
CircularReferencesPruner.cpp:solidity::util::BreadthFirstSearch<solidity::yul::YulString>& solidity::util::BreadthFirstSearch<solidity::yul::YulString>::run<solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0>(solidity::yul::CircularReferencesPruner::functionsCalledFromOutermostContext(solidity::yul::CallGraph const&)::$_0&&) Line | Count | Source | 104 | 837k | { | 105 | 3.24M | while (!verticesToTraverse.empty()) | 106 | 2.40M | { | 107 | 2.40M | V v = std::move(verticesToTraverse.front()); | 108 | 2.40M | verticesToTraverse.pop_front(); | 109 | | | 110 | 2.40M | if (!visited.insert(v).second) | 111 | 395k | continue; | 112 | | | 113 | 2.00M | _forEachChild(v, [this](V _vertex) { | 114 | 2.00M | verticesToTraverse.emplace_back(std::move(_vertex)); | 115 | 2.00M | }); | 116 | 2.00M | } | 117 | 837k | return *this; | 118 | 837k | } |
|
119 | | void abort() |
120 | 32.1k | { |
121 | 32.1k | verticesToTraverse.clear(); |
122 | 32.1k | } solidity::util::BreadthFirstSearch<solidity::frontend::StructDefinition const*>::abort() Line | Count | Source | 120 | 53 | { | 121 | 53 | verticesToTraverse.clear(); | 122 | 53 | } |
solidity::util::BreadthFirstSearch<solidity::frontend::Type const*>::abort() Line | Count | Source | 120 | 1.91k | { | 121 | 1.91k | verticesToTraverse.clear(); | 122 | 1.91k | } |
Unexecuted instantiation: solidity::util::BreadthFirstSearch<unsigned int>::abort() solidity::util::BreadthFirstSearch<solidity::yul::CFG::FunctionCall*>::abort() Line | Count | Source | 120 | 30.1k | { | 121 | 30.1k | verticesToTraverse.clear(); | 122 | 30.1k | } |
|
123 | | |
124 | | std::list<V> verticesToTraverse; |
125 | | std::set<V> visited{}; |
126 | | }; |
127 | | |
128 | | } |