1 /* Trimming an exploded graph to a subset of nodes and edges. 2 Copyright (C) 2021-2022 Free Software Foundation, Inc. 3 Contributed by David Malcolm <dmalcolm@redhat.com>. 4 5 This file is part of GCC. 6 7 GCC is free software; you can redistribute it and/or modify it 8 under the terms of the GNU General Public License as published by 9 the Free Software Foundation; either version 3, or (at your option) 10 any later version. 11 12 GCC is distributed in the hope that it will be useful, but 13 WITHOUT ANY WARRANTY; without even the implied warranty of 14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15 General Public License for more details. 16 17 You should have received a copy of the GNU General Public License 18 along with GCC; see the file COPYING3. If not see 19 <http://www.gnu.org/licenses/>. */ 20 21 #ifndef GCC_ANALYZER_TRIMMED_GRAPH_H 22 #define GCC_ANALYZER_TRIMMED_GRAPH_H 23 24 namespace ana { 25 26 /* Forward decls. */ 27 28 class trimmed_node; 29 class trimmed_edge; 30 class trimmed_graph; 31 class trimmed_cluster; 32 33 /* A traits class for trimming a digraph to a subset of nodes and edges. */ 34 35 struct tg_traits 36 { 37 typedef trimmed_node node_t; 38 typedef trimmed_edge edge_t; 39 typedef trimmed_graph graph_t; 40 struct dump_args_t 41 { 42 typedef typename eg_traits::dump_args_t inner_args_t; 43 dump_args_ttg_traits::dump_args_t44 dump_args_t (const inner_args_t &inner_args) 45 : m_inner_args (inner_args) 46 { 47 } 48 49 const inner_args_t &m_inner_args; 50 }; 51 typedef trimmed_cluster cluster_t; 52 }; 53 54 /* A node within the trimmed_graph, corresponding to an "inner node" 55 within the original exploded_graph. */ 56 57 class trimmed_node : public dnode<tg_traits> 58 { 59 public: trimmed_node(const exploded_node * inner_node)60 trimmed_node (const exploded_node *inner_node) 61 : m_inner_node (inner_node) {} 62 63 void dump_dot (graphviz_out *gv, 64 const dump_args_t &args) const FINAL OVERRIDE; 65 66 private: 67 const exploded_node *m_inner_node; 68 }; 69 70 /* An edge within the trimmed_graph, corresponding to an "inner edge" 71 within the original exploded_graph. */ 72 73 class trimmed_edge : public dedge<tg_traits> 74 { 75 public: 76 trimmed_edge (trimmed_node *src, trimmed_node *dest, 77 const exploded_edge *inner_edge); 78 79 void dump_dot (graphviz_out *gv, 80 const dump_args_t &args) const FINAL OVERRIDE; 81 82 private: 83 const exploded_edge *m_inner_edge; 84 }; 85 86 /* A digraph for trimming an exploded_graph to the subset of nodes and edges 87 from which paths reach INNER_DST_NODE (along with a precanned way to print 88 these in .dot form). */ 89 90 class trimmed_graph : public digraph <tg_traits> 91 { 92 public: 93 trimmed_graph (const exploded_graph &inner_graph, 94 const exploded_node *inner_dst_node); 95 contains_p(const exploded_edge * eedge)96 bool contains_p (const exploded_edge *eedge) const 97 { 98 hash_set <const exploded_edge *> & mut 99 = const_cast <hash_set <const exploded_edge *> &> (m_eedges); 100 return mut.contains (eedge); 101 } 102 103 void log_stats (logger *logger) const; 104 105 private: 106 /* The subset of nodes in the inner graph that are in the 107 trimmed graph. */ 108 hash_set <const exploded_node *> m_enodes; 109 /* Likewise for edges. */ 110 hash_set <const exploded_edge *> m_eedges; 111 112 typedef hash_map<const exploded_node *, trimmed_node *> map_t; 113 map_t m_map_from_enode_to_tnode; 114 }; 115 116 class trimmed_cluster : public cluster <tg_traits> 117 { 118 }; 119 120 } // namespace ana 121 122 #endif /* GCC_ANALYZER_TRIMMED_GRAPH_H */ 123