// Copyright (c) 2020 Google LLC // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef SOURCE_FUZZ_CALL_GRAPH_H_ #define SOURCE_FUZZ_CALL_GRAPH_H_ #include #include #include "source/opt/ir_context.h" namespace spvtools { namespace fuzz { // Represents the acyclic call graph of a SPIR-V module. class CallGraph { public: // Creates a call graph corresponding to the given SPIR-V module. explicit CallGraph(opt::IRContext* context); // Returns a mapping from each function to its number of distinct callers. const std::map& GetFunctionInDegree() const { return function_in_degree_; } // Returns the ids of the functions that |function_id| directly invokes. const std::set& GetDirectCallees(uint32_t function_id) const { return call_graph_edges_.at(function_id); } // Returns the ids of the functions that |function_id| directly or indirectly // invokes. std::set GetIndirectCallees(uint32_t function_id) const; private: // Pushes the direct callees of |function_id| on to |queue|. void PushDirectCallees(uint32_t function_id, std::queue* queue) const; // Maps each function id to the ids of its immediate callees. std::map> call_graph_edges_; // For each function id, stores the number of distinct functions that call // the function. std::map function_in_degree_; }; } // namespace fuzz } // namespace spvtools #endif // SOURCE_FUZZ_CALL_GRAPH_H_