annotate gcc/symbol-summary.h @ 158:494b0b89df80 default tip

...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 25 May 2020 18:13:55 +0900
parents 1830386684a0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 /* Callgraph summary data structure.
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
2 Copyright (C) 2014-2020 Free Software Foundation, Inc.
111
kono
parents:
diff changeset
3 Contributed by Martin Liska
kono
parents:
diff changeset
4
kono
parents:
diff changeset
5 This file is part of GCC.
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 GCC is free software; you can redistribute it and/or modify it under
kono
parents:
diff changeset
8 the terms of the GNU General Public License as published by the Free
kono
parents:
diff changeset
9 Software Foundation; either version 3, or (at your option) any later
kono
parents:
diff changeset
10 version.
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
kono
parents:
diff changeset
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
kono
parents:
diff changeset
14 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
kono
parents:
diff changeset
15 for more details.
kono
parents:
diff changeset
16
kono
parents:
diff changeset
17 You should have received a copy of the GNU General Public License
kono
parents:
diff changeset
18 along with GCC; see the file COPYING3. If not see
kono
parents:
diff changeset
19 <http://www.gnu.org/licenses/>. */
kono
parents:
diff changeset
20
kono
parents:
diff changeset
21 #ifndef GCC_SYMBOL_SUMMARY_H
kono
parents:
diff changeset
22 #define GCC_SYMBOL_SUMMARY_H
kono
parents:
diff changeset
23
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
24 /* Base class for function_summary and fast_function_summary classes. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
25
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
26 template <class T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
27 class function_summary_base
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
28 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
29 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
30 /* Default construction takes SYMTAB as an argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
31 function_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
32 m_symtab (symtab),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
33 m_insertion_enabled (true),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
34 m_allocator ("function summary" PASS_MEM_STAT)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
35 {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
36
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
37 /* Basic implementation of insert operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
38 virtual void insert (cgraph_node *, T *) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
39
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
40 /* Basic implementation of removal operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
41 virtual void remove (cgraph_node *, T *) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
42
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
43 /* Basic implementation of duplication operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
44 virtual void duplicate (cgraph_node *, cgraph_node *, T *, T *) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
45
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
46 /* Enable insertion hook invocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
47 void enable_insertion_hook ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
48 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
49 m_insertion_enabled = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
50 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
51
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
52 /* Enable insertion hook invocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
53 void disable_insertion_hook ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
54 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
55 m_insertion_enabled = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
56 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
57
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
58 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
59 /* Allocates new data that are stored within map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
60 T* allocate_new ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
61 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
62 /* Call gcc_internal_because we do not want to call finalizer for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
63 a type T. We call dtor explicitly. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
64 return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
65 : m_allocator.allocate () ;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
66 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
67
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
68 /* Release an item that is stored within map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
69 void release (T *item)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
70 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
71 if (is_ggc ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
72 ggc_delete (item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
73 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
74 m_allocator.remove (item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
75 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
76
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
77 /* Unregister all call-graph hooks. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
78 void unregister_hooks ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
79
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
80 /* Internal summary insertion hook pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
81 cgraph_node_hook_list *m_symtab_insertion_hook;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
82 /* Internal summary removal hook pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
83 cgraph_node_hook_list *m_symtab_removal_hook;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
84 /* Internal summary duplication hook pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
85 cgraph_2node_hook_list *m_symtab_duplication_hook;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
86 /* Symbol table the summary is registered to. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
87 symbol_table *m_symtab;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
88
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
89 /* Indicates if insertion hook is enabled. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
90 bool m_insertion_enabled;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
91
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
92 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
93 /* Return true when the summary uses GGC memory for allocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
94 virtual bool is_ggc () = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
95
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
96 /* Object allocator for heap allocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
97 object_allocator<T> m_allocator;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
98 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
99
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
100 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
101 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
102 function_summary_base<T>::unregister_hooks ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
103 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
104 m_symtab->remove_cgraph_insertion_hook (m_symtab_insertion_hook);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
105 m_symtab->remove_cgraph_removal_hook (m_symtab_removal_hook);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
106 m_symtab->remove_cgraph_duplication_hook (m_symtab_duplication_hook);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
107 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
108
111
kono
parents:
diff changeset
109 /* We want to pass just pointer types as argument for function_summary
kono
parents:
diff changeset
110 template class. */
kono
parents:
diff changeset
111
kono
parents:
diff changeset
112 template <class T>
kono
parents:
diff changeset
113 class function_summary
kono
parents:
diff changeset
114 {
kono
parents:
diff changeset
115 private:
kono
parents:
diff changeset
116 function_summary();
kono
parents:
diff changeset
117 };
kono
parents:
diff changeset
118
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
119 /* Function summary is a helper class that is used to associate a data structure
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
120 related to a callgraph node. Typical usage can be seen in IPA passes which
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
121 create a temporary pass-related structures. The summary class registers
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
122 hooks that are triggered when a new node is inserted, duplicated and deleted.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
123 A user of a summary class can ovewrite virtual methods than are triggered by
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
124 the summary if such hook is triggered. Apart from a callgraph node, the user
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
125 is given a data structure tied to the node.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
126
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
127 The function summary class can work both with a heap-allocated memory and
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
128 a memory gained by garbage collected memory. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
129
111
kono
parents:
diff changeset
130 template <class T>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
131 class GTY((user)) function_summary <T *>: public function_summary_base<T>
111
kono
parents:
diff changeset
132 {
kono
parents:
diff changeset
133 public:
kono
parents:
diff changeset
134 /* Default construction takes SYMTAB as an argument. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
135 function_summary (symbol_table *symtab, bool ggc = false CXX_MEM_STAT_INFO);
111
kono
parents:
diff changeset
136
kono
parents:
diff changeset
137 /* Destructor. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
138 virtual ~function_summary ();
111
kono
parents:
diff changeset
139
kono
parents:
diff changeset
140 /* Traverses all summarys with a function F called with
kono
parents:
diff changeset
141 ARG as argument. */
kono
parents:
diff changeset
142 template<typename Arg, bool (*f)(const T &, Arg)>
kono
parents:
diff changeset
143 void traverse (Arg a) const
kono
parents:
diff changeset
144 {
kono
parents:
diff changeset
145 m_map.traverse <f> (a);
kono
parents:
diff changeset
146 }
kono
parents:
diff changeset
147
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
148 /* Getter for summary callgraph node pointer. If a summary for a node
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
149 does not exist it will be created. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
150 T* get_create (cgraph_node *node)
111
kono
parents:
diff changeset
151 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
152 bool existed;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
153 T **v = &m_map.get_or_insert (node->get_uid (), &existed);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
154 if (!existed)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
155 *v = this->allocate_new ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
156
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
157 return *v;
111
kono
parents:
diff changeset
158 }
kono
parents:
diff changeset
159
kono
parents:
diff changeset
160 /* Getter for summary callgraph node pointer. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
161 T* get (cgraph_node *node) ATTRIBUTE_PURE
111
kono
parents:
diff changeset
162 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
163 T **v = m_map.get (node->get_uid ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
164 return v == NULL ? NULL : *v;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
165 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
166
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
167 /* Remove node from summary. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
168 using function_summary_base<T>::remove;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
169 void remove (cgraph_node *node)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
170 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
171 int uid = node->get_uid ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
172 T **v = m_map.get (uid);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
173 if (v)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
174 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
175 m_map.remove (uid);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
176 this->release (*v);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
177 }
111
kono
parents:
diff changeset
178 }
kono
parents:
diff changeset
179
kono
parents:
diff changeset
180 /* Return true if a summary for the given NODE already exists. */
kono
parents:
diff changeset
181 bool exists (cgraph_node *node)
kono
parents:
diff changeset
182 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
183 return m_map.get (node->get_uid ()) != NULL;
111
kono
parents:
diff changeset
184 }
kono
parents:
diff changeset
185
kono
parents:
diff changeset
186 /* Symbol insertion hook that is registered to symbol table. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
187 static void symtab_insertion (cgraph_node *node, void *data);
111
kono
parents:
diff changeset
188
kono
parents:
diff changeset
189 /* Symbol removal hook that is registered to symbol table. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
190 static void symtab_removal (cgraph_node *node, void *data);
111
kono
parents:
diff changeset
191
kono
parents:
diff changeset
192 /* Symbol duplication hook that is registered to symbol table. */
kono
parents:
diff changeset
193 static void symtab_duplication (cgraph_node *node, cgraph_node *node2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
194 void *data);
111
kono
parents:
diff changeset
195
kono
parents:
diff changeset
196 protected:
kono
parents:
diff changeset
197 /* Indication if we use ggc summary. */
kono
parents:
diff changeset
198 bool m_ggc;
kono
parents:
diff changeset
199
kono
parents:
diff changeset
200 private:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
201 /* Indication if we use ggc summary. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
202 virtual bool is_ggc ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
203 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
204 return m_ggc;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
205 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
206
111
kono
parents:
diff changeset
207 typedef int_hash <int, 0, -1> map_hash;
kono
parents:
diff changeset
208
kono
parents:
diff changeset
209 /* Main summary store, where summary ID is used as key. */
kono
parents:
diff changeset
210 hash_map <map_hash, T *> m_map;
kono
parents:
diff changeset
211
kono
parents:
diff changeset
212 template <typename U> friend void gt_ggc_mx (function_summary <U *> * const &);
kono
parents:
diff changeset
213 template <typename U> friend void gt_pch_nx (function_summary <U *> * const &);
kono
parents:
diff changeset
214 template <typename U> friend void gt_pch_nx (function_summary <U *> * const &,
kono
parents:
diff changeset
215 gt_pointer_operator, void *);
kono
parents:
diff changeset
216 };
kono
parents:
diff changeset
217
kono
parents:
diff changeset
218 template <typename T>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
219 function_summary<T *>::function_summary (symbol_table *symtab, bool ggc
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
220 MEM_STAT_DECL):
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
221 function_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
222 m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
223 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
224 this->m_symtab_insertion_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
225 = this->m_symtab->add_cgraph_insertion_hook (function_summary::symtab_insertion,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
226 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
227 this->m_symtab_removal_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
228 = this->m_symtab->add_cgraph_removal_hook (function_summary::symtab_removal,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
229 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
230 this->m_symtab_duplication_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
231 = this->m_symtab->add_cgraph_duplication_hook (function_summary::symtab_duplication,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
232 this);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
233 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
234
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
235 template <typename T>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
236 function_summary<T *>::~function_summary ()
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
237 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
238 this->unregister_hooks ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
239
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
240 /* Release all summaries. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
241 typedef typename hash_map <map_hash, T *>::iterator map_iterator;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
242 for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
243 this->release ((*it).second);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
244 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
245
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
246 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
247 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
248 function_summary<T *>::symtab_insertion (cgraph_node *node, void *data)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
249 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
250 gcc_checking_assert (node->get_uid ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
251 function_summary *summary = (function_summary <T *> *) (data);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
252
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
253 if (summary->m_insertion_enabled)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
254 summary->insert (node, summary->get_create (node));
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
255 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
256
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
257 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
258 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
259 function_summary<T *>::symtab_removal (cgraph_node *node, void *data)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
260 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
261 gcc_checking_assert (node->get_uid ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
262 function_summary *summary = (function_summary <T *> *) (data);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
263 summary->remove (node);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
264 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
265
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
266 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
267 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
268 function_summary<T *>::symtab_duplication (cgraph_node *node,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
269 cgraph_node *node2, void *data)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
270 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
271 function_summary *summary = (function_summary <T *> *) (data);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
272 T *v = summary->get (node);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
273
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
274 if (v)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
275 summary->duplicate (node, node2, v, summary->get_create (node2));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
276 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
277
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
278 template <typename T>
111
kono
parents:
diff changeset
279 void
kono
parents:
diff changeset
280 gt_ggc_mx(function_summary<T *>* const &summary)
kono
parents:
diff changeset
281 {
kono
parents:
diff changeset
282 gcc_checking_assert (summary->m_ggc);
kono
parents:
diff changeset
283 gt_ggc_mx (&summary->m_map);
kono
parents:
diff changeset
284 }
kono
parents:
diff changeset
285
kono
parents:
diff changeset
286 template <typename T>
kono
parents:
diff changeset
287 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
288 gt_pch_nx (function_summary<T *> *const &)
111
kono
parents:
diff changeset
289 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
290 gcc_unreachable ();
111
kono
parents:
diff changeset
291 }
kono
parents:
diff changeset
292
kono
parents:
diff changeset
293 template <typename T>
kono
parents:
diff changeset
294 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
295 gt_pch_nx (function_summary<T *> *const &, gt_pointer_operator, void *)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
296 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
297 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
298 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
299
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
300 /* Help template from std c++11. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
301
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
302 template<typename T, typename U>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
303 struct is_same
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
304 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
305 static const bool value = false;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
306 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
307
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
308 template<typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
309 struct is_same<T,T> //specialization
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
310 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
311 static const bool value = true;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
312 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
313
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
314 /* We want to pass just pointer types as argument for fast_function_summary
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
315 template class. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
316
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
317 template <class T, class V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
318 class fast_function_summary
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
319 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
320 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
321 fast_function_summary ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
322 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
323
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
324 /* Function vector summary is a fast implementation of function_summary that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
325 utilizes vector as primary storage of summaries. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
326
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
327 template <class T, class V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
328 class GTY((user)) fast_function_summary <T *, V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
329 : public function_summary_base<T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
330 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
331 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
332 /* Default construction takes SYMTAB as an argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
333 fast_function_summary (symbol_table *symtab CXX_MEM_STAT_INFO);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
334
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
335 /* Destructor. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
336 virtual ~fast_function_summary ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
337
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
338 /* Traverses all summarys with a function F called with
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
339 ARG as argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
340 template<typename Arg, bool (*f)(const T &, Arg)>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
341 void traverse (Arg a) const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
342 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
343 for (unsigned i = 0; i < m_vector->length (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
344 if ((*m_vector[i]) != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
345 f ((*m_vector)[i], a);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
346 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
347
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
348 /* Getter for summary callgraph node pointer. If a summary for a node
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
349 does not exist it will be created. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
350 T* get_create (cgraph_node *node)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
351 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
352 int id = node->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
353 if (id == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
354 id = this->m_symtab->assign_summary_id (node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
355
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
356 if ((unsigned int)id >= m_vector->length ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
357 vec_safe_grow_cleared (m_vector,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
358 this->m_symtab->cgraph_max_summary_id);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
359
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
360 if ((*m_vector)[id] == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
361 (*m_vector)[id] = this->allocate_new ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
362
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
363 return (*m_vector)[id];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
364 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
365
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
366 /* Getter for summary callgraph node pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
367 T* get (cgraph_node *node) ATTRIBUTE_PURE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
368 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
369 return exists (node) ? (*m_vector)[node->get_summary_id ()] : NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
370 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
371
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
372 using function_summary_base<T>::remove;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
373 void remove (cgraph_node *node)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
374 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
375 if (exists (node))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
376 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
377 int id = node->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
378 this->release ((*m_vector)[id]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
379 (*m_vector)[id] = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
380 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
381 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
382
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
383 /* Return true if a summary for the given NODE already exists. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
384 bool exists (cgraph_node *node)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
385 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
386 int id = node->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
387 return (id != -1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
388 && (unsigned int)id < m_vector->length ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
389 && (*m_vector)[id] != NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
390 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
391
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
392 /* Symbol insertion hook that is registered to symbol table. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
393 static void symtab_insertion (cgraph_node *node, void *data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
394
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
395 /* Symbol removal hook that is registered to symbol table. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
396 static void symtab_removal (cgraph_node *node, void *data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
397
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
398 /* Symbol duplication hook that is registered to symbol table. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
399 static void symtab_duplication (cgraph_node *node, cgraph_node *node2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
400 void *data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
401
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
402 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
403 virtual bool is_ggc ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
404
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
405 /* Summary is stored in the vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
406 vec <T *, V> *m_vector;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
407
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
408 template <typename U> friend void gt_ggc_mx (fast_function_summary <U *, va_gc> * const &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
409 template <typename U> friend void gt_pch_nx (fast_function_summary <U *, va_gc> * const &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
410 template <typename U> friend void gt_pch_nx (fast_function_summary <U *, va_gc> * const &,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
411 gt_pointer_operator, void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
412 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
413
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
414 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
415 fast_function_summary<T *, V>::fast_function_summary (symbol_table *symtab MEM_STAT_DECL):
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
416 function_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
417 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
418 vec_alloc (m_vector, 13 PASS_MEM_STAT);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
419 this->m_symtab_insertion_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
420 = this->m_symtab->add_cgraph_insertion_hook (fast_function_summary::symtab_insertion,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
421 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
422 this->m_symtab_removal_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
423 = this->m_symtab->add_cgraph_removal_hook (fast_function_summary::symtab_removal,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
424 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
425 this->m_symtab_duplication_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
426 = this->m_symtab->add_cgraph_duplication_hook (fast_function_summary::symtab_duplication,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
427 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
428 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
429
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
430 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
431 fast_function_summary<T *, V>::~fast_function_summary ()
111
kono
parents:
diff changeset
432 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
433 this->unregister_hooks ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
434
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
435 /* Release all summaries. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
436 for (unsigned i = 0; i < m_vector->length (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
437 if ((*m_vector)[i] != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
438 this->release ((*m_vector)[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
439 vec_free (m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
440 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
441
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
442 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
443 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
444 fast_function_summary<T *, V>::symtab_insertion (cgraph_node *node, void *data)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
445 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
446 gcc_checking_assert (node->get_uid ());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
447 fast_function_summary *summary = (fast_function_summary <T *, V> *) (data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
448
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
449 if (summary->m_insertion_enabled)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
450 summary->insert (node, summary->get_create (node));
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
451 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
452
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
453 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
454 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
455 fast_function_summary<T *, V>::symtab_removal (cgraph_node *node, void *data)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
456 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
457 gcc_checking_assert (node->get_uid ());
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
458 fast_function_summary *summary = (fast_function_summary <T *, V> *) (data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
459
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
460 if (summary->exists (node))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
461 summary->remove (node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
462 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
463
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
464 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
465 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
466 fast_function_summary<T *, V>::symtab_duplication (cgraph_node *node,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
467 cgraph_node *node2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
468 void *data)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
469 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
470 fast_function_summary *summary = (fast_function_summary <T *, V> *) (data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
471 T *v = summary->get (node);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
472
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
473 if (v)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
474 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
475 T *duplicate = summary->get_create (node2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
476 summary->duplicate (node, node2, v, duplicate);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
477 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
478 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
479
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
480 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
481 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
482 fast_function_summary<T *, V>::is_ggc ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
483 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
484 return is_same<V, va_gc>::value;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
485 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
486
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
487 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
488 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
489 gt_ggc_mx (fast_function_summary<T *, va_heap>* const &)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
490 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
491 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
492
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
493 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
494 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
495 gt_pch_nx (fast_function_summary<T *, va_heap>* const &)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
496 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
497 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
498
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
499 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
500 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
501 gt_pch_nx (fast_function_summary<T *, va_heap>* const&, gt_pointer_operator,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
502 void *)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
503 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
504 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
505
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
506 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
507 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
508 gt_ggc_mx (fast_function_summary<T *, va_gc>* const &summary)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
509 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
510 ggc_test_and_set_mark (summary->m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
511 gt_ggc_mx (summary->m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
512 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
513
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
514 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
515 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
516 gt_pch_nx (fast_function_summary<T *, va_gc> *const &)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
517 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
518 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
519 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
520
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
521 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
522 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
523 gt_pch_nx (fast_function_summary<T *, va_gc> *const &, gt_pointer_operator,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
524 void *)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
525 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
526 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
527 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
528
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
529 /* Base class for call_summary and fast_call_summary classes. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
530
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
531 template <class T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
532 class call_summary_base
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
533 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
534 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
535 /* Default construction takes SYMTAB as an argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
536 call_summary_base (symbol_table *symtab CXX_MEM_STAT_INFO):
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
537 m_symtab (symtab),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
538 m_initialize_when_cloning (false),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
539 m_allocator ("call summary" PASS_MEM_STAT)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
540 {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
541
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
542 /* Basic implementation of removal operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
543 virtual void remove (cgraph_edge *, T *) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
544
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
545 /* Basic implementation of duplication operation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
546 virtual void duplicate (cgraph_edge *, cgraph_edge *, T *, T *) {}
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
547
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
548 protected:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
549 /* Allocates new data that are stored within map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
550 T* allocate_new ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
551 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
552 /* Call gcc_internal_because we do not want to call finalizer for
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
553 a type T. We call dtor explicitly. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
554 return is_ggc () ? new (ggc_internal_alloc (sizeof (T))) T ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
555 : m_allocator.allocate ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
556 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
557
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
558 /* Release an item that is stored within map. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
559 void release (T *item)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
560 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
561 if (is_ggc ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
562 ggc_delete (item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
563 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
564 m_allocator.remove (item);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
565 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
566
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
567 /* Unregister all call-graph hooks. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
568 void unregister_hooks ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
569
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
570 /* Symbol table the summary is registered to. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
571 symbol_table *m_symtab;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
572
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
573 /* Internal summary removal hook pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
574 cgraph_edge_hook_list *m_symtab_removal_hook;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
575 /* Internal summary duplication hook pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
576 cgraph_2edge_hook_list *m_symtab_duplication_hook;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
577 /* Initialize summary for an edge that is cloned. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
578 bool m_initialize_when_cloning;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
579
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
580 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
581 /* Return true when the summary uses GGC memory for allocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
582 virtual bool is_ggc () = 0;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
583
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
584 /* Object allocator for heap allocation. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
585 object_allocator<T> m_allocator;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
586 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
587
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
588 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
589 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
590 call_summary_base<T>::unregister_hooks ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
591 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
592 m_symtab->remove_edge_removal_hook (m_symtab_removal_hook);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
593 m_symtab->remove_edge_duplication_hook (m_symtab_duplication_hook);
111
kono
parents:
diff changeset
594 }
kono
parents:
diff changeset
595
kono
parents:
diff changeset
596 /* An impossible class templated by non-pointers so, which makes sure that only
kono
parents:
diff changeset
597 summaries gathering pointers can be created. */
kono
parents:
diff changeset
598
kono
parents:
diff changeset
599 template <class T>
kono
parents:
diff changeset
600 class call_summary
kono
parents:
diff changeset
601 {
kono
parents:
diff changeset
602 private:
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
603 call_summary ();
111
kono
parents:
diff changeset
604 };
kono
parents:
diff changeset
605
kono
parents:
diff changeset
606 /* Class to store auxiliary information about call graph edges. */
kono
parents:
diff changeset
607
kono
parents:
diff changeset
608 template <class T>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
609 class GTY((user)) call_summary <T *>: public call_summary_base<T>
111
kono
parents:
diff changeset
610 {
kono
parents:
diff changeset
611 public:
kono
parents:
diff changeset
612 /* Default construction takes SYMTAB as an argument. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
613 call_summary (symbol_table *symtab, bool ggc = false
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
614 CXX_MEM_STAT_INFO)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
615 : call_summary_base<T> (symtab PASS_MEM_STAT), m_ggc (ggc),
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
616 m_map (13, ggc, true, GATHER_STATISTICS PASS_MEM_STAT)
111
kono
parents:
diff changeset
617 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
618 this->m_symtab_removal_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
619 = this->m_symtab->add_edge_removal_hook (call_summary::symtab_removal,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
620 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
621 this->m_symtab_duplication_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
622 = this->m_symtab->add_edge_duplication_hook (call_summary::symtab_duplication,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
623 this);
111
kono
parents:
diff changeset
624 }
kono
parents:
diff changeset
625
kono
parents:
diff changeset
626 /* Destructor. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
627 virtual ~call_summary ();
111
kono
parents:
diff changeset
628
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
629 /* Traverses all summarys with an edge E called with
111
kono
parents:
diff changeset
630 ARG as argument. */
kono
parents:
diff changeset
631 template<typename Arg, bool (*f)(const T &, Arg)>
kono
parents:
diff changeset
632 void traverse (Arg a) const
kono
parents:
diff changeset
633 {
kono
parents:
diff changeset
634 m_map.traverse <f> (a);
kono
parents:
diff changeset
635 }
kono
parents:
diff changeset
636
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
637 /* Getter for summary callgraph edge pointer.
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
638 If a summary for an edge does not exist, it will be created. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
639 T* get_create (cgraph_edge *edge)
111
kono
parents:
diff changeset
640 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
641 bool existed;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
642 T **v = &m_map.get_or_insert (edge->get_uid (), &existed);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
643 if (!existed)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
644 *v = this->allocate_new ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
645
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
646 return *v;
111
kono
parents:
diff changeset
647 }
kono
parents:
diff changeset
648
kono
parents:
diff changeset
649 /* Getter for summary callgraph edge pointer. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
650 T* get (cgraph_edge *edge) ATTRIBUTE_PURE
111
kono
parents:
diff changeset
651 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
652 T **v = m_map.get (edge->get_uid ());
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
653 return v == NULL ? NULL : *v;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
654 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
655
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
656 /* Remove edge from summary. */
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
657 using call_summary_base<T>::remove;
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
658 void remove (cgraph_edge *edge)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
659 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
660 int uid = edge->get_uid ();
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
661 T **v = m_map.get (uid);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
662 if (v)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
663 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
664 m_map.remove (uid);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
665 this->release (*v);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
666 }
111
kono
parents:
diff changeset
667 }
kono
parents:
diff changeset
668
kono
parents:
diff changeset
669 /* Return true if a summary for the given EDGE already exists. */
kono
parents:
diff changeset
670 bool exists (cgraph_edge *edge)
kono
parents:
diff changeset
671 {
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
672 return m_map.get (edge->get_uid ()) != NULL;
111
kono
parents:
diff changeset
673 }
kono
parents:
diff changeset
674
kono
parents:
diff changeset
675 /* Symbol removal hook that is registered to symbol table. */
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
676 static void symtab_removal (cgraph_edge *edge, void *data);
111
kono
parents:
diff changeset
677
kono
parents:
diff changeset
678 /* Symbol duplication hook that is registered to symbol table. */
kono
parents:
diff changeset
679 static void symtab_duplication (cgraph_edge *edge1, cgraph_edge *edge2,
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
680 void *data);
111
kono
parents:
diff changeset
681
kono
parents:
diff changeset
682 protected:
kono
parents:
diff changeset
683 /* Indication if we use ggc summary. */
kono
parents:
diff changeset
684 bool m_ggc;
kono
parents:
diff changeset
685
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
686 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
687 /* Indication if we use ggc summary. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
688 virtual bool is_ggc ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
689 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
690 return m_ggc;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
691 }
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
692
111
kono
parents:
diff changeset
693 typedef int_hash <int, 0, -1> map_hash;
kono
parents:
diff changeset
694
kono
parents:
diff changeset
695 /* Main summary store, where summary ID is used as key. */
kono
parents:
diff changeset
696 hash_map <map_hash, T *> m_map;
kono
parents:
diff changeset
697
kono
parents:
diff changeset
698 template <typename U> friend void gt_ggc_mx (call_summary <U *> * const &);
kono
parents:
diff changeset
699 template <typename U> friend void gt_pch_nx (call_summary <U *> * const &);
kono
parents:
diff changeset
700 template <typename U> friend void gt_pch_nx (call_summary <U *> * const &,
kono
parents:
diff changeset
701 gt_pointer_operator, void *);
kono
parents:
diff changeset
702 };
kono
parents:
diff changeset
703
kono
parents:
diff changeset
704 template <typename T>
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
705 call_summary<T *>::~call_summary ()
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
706 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
707 this->unregister_hooks ();
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
708
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
709 /* Release all summaries. */
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
710 typedef typename hash_map <map_hash, T *>::iterator map_iterator;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
711 for (map_iterator it = m_map.begin (); it != m_map.end (); ++it)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
712 this->release ((*it).second);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
713 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
714
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
715 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
716 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
717 call_summary<T *>::symtab_removal (cgraph_edge *edge, void *data)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
718 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
719 call_summary *summary = (call_summary <T *> *) (data);
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
720 summary->remove (edge);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
721 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
722
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
723 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
724 void
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
725 call_summary<T *>::symtab_duplication (cgraph_edge *edge1,
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
726 cgraph_edge *edge2, void *data)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
727 {
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
728 call_summary *summary = (call_summary <T *> *) (data);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
729 T *edge1_summary = NULL;
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
730
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
731 if (summary->m_initialize_when_cloning)
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
732 edge1_summary = summary->get_create (edge1);
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
733 else
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
734 edge1_summary = summary->get (edge1);
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
735
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
736 if (edge1_summary)
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
737 summary->duplicate (edge1, edge2, edge1_summary,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
738 summary->get_create (edge2));
131
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
739 }
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
740
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
741 template <typename T>
84e7813d76e9 gcc-8.2
mir3636
parents: 111
diff changeset
742 void
111
kono
parents:
diff changeset
743 gt_ggc_mx(call_summary<T *>* const &summary)
kono
parents:
diff changeset
744 {
kono
parents:
diff changeset
745 gcc_checking_assert (summary->m_ggc);
kono
parents:
diff changeset
746 gt_ggc_mx (&summary->m_map);
kono
parents:
diff changeset
747 }
kono
parents:
diff changeset
748
kono
parents:
diff changeset
749 template <typename T>
kono
parents:
diff changeset
750 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
751 gt_pch_nx (call_summary<T *> *const &)
111
kono
parents:
diff changeset
752 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
753 gcc_unreachable ();
111
kono
parents:
diff changeset
754 }
kono
parents:
diff changeset
755
kono
parents:
diff changeset
756 template <typename T>
kono
parents:
diff changeset
757 void
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
758 gt_pch_nx (call_summary<T *> *const &, gt_pointer_operator, void *)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
759 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
760 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
761 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
762
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
763 /* We want to pass just pointer types as argument for fast_call_summary
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
764 template class. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
765
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
766 template <class T, class V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
767 class fast_call_summary
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
768 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
769 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
770 fast_call_summary ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
771 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
772
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
773 /* Call vector summary is a fast implementation of call_summary that
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
774 utilizes vector as primary storage of summaries. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
775
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
776 template <class T, class V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
777 class GTY((user)) fast_call_summary <T *, V>: public call_summary_base<T>
111
kono
parents:
diff changeset
778 {
145
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
779 public:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
780 /* Default construction takes SYMTAB as an argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
781 fast_call_summary (symbol_table *symtab CXX_MEM_STAT_INFO)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
782 : call_summary_base<T> (symtab PASS_MEM_STAT), m_vector (NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
783 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
784 vec_alloc (m_vector, 13 PASS_MEM_STAT);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
785 this->m_symtab_removal_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
786 = this->m_symtab->add_edge_removal_hook (fast_call_summary::symtab_removal,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
787 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
788 this->m_symtab_duplication_hook
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
789 = this->m_symtab->add_edge_duplication_hook (fast_call_summary::symtab_duplication,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
790 this);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
791 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
792
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
793 /* Destructor. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
794 virtual ~fast_call_summary ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
795
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
796 /* Traverses all summarys with an edge F called with
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
797 ARG as argument. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
798 template<typename Arg, bool (*f)(const T &, Arg)>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
799 void traverse (Arg a) const
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
800 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
801 for (unsigned i = 0; i < m_vector->length (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
802 if ((*m_vector[i]) != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
803 f ((*m_vector)[i], a);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
804 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
805
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
806 /* Getter for summary callgraph edge pointer.
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
807 If a summary for an edge does not exist, it will be created. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
808 T* get_create (cgraph_edge *edge)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
809 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
810 int id = edge->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
811 if (id == -1)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
812 id = this->m_symtab->assign_summary_id (edge);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
813
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
814 if ((unsigned)id >= m_vector->length ())
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
815 vec_safe_grow_cleared (m_vector, this->m_symtab->edges_max_summary_id);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
816
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
817 if ((*m_vector)[id] == NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
818 (*m_vector)[id] = this->allocate_new ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
819
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
820 return (*m_vector)[id];
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
821 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
822
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
823 /* Getter for summary callgraph edge pointer. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
824 T* get (cgraph_edge *edge) ATTRIBUTE_PURE
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
825 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
826 return exists (edge) ? (*m_vector)[edge->get_summary_id ()] : NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
827 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
828
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
829 /* Remove edge from summary. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
830 using call_summary_base<T>::remove;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
831 void remove (cgraph_edge *edge)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
832 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
833 if (exists (edge))
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
834 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
835 int id = edge->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
836 this->release ((*m_vector)[id]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
837 (*m_vector)[id] = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
838 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
839 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
840
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
841 /* Return true if a summary for the given EDGE already exists. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
842 bool exists (cgraph_edge *edge)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
843 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
844 int id = edge->get_summary_id ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
845 return (id != -1
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
846 && (unsigned)id < m_vector->length ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
847 && (*m_vector)[id] != NULL);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
848 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
849
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
850 /* Symbol removal hook that is registered to symbol table. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
851 static void symtab_removal (cgraph_edge *edge, void *data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
852
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
853 /* Symbol duplication hook that is registered to symbol table. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
854 static void symtab_duplication (cgraph_edge *edge1, cgraph_edge *edge2,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
855 void *data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
856
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
857 private:
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
858 virtual bool is_ggc ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
859
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
860 /* Summary is stored in the vector. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
861 vec <T *, V> *m_vector;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
862
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
863 template <typename U> friend void gt_ggc_mx (fast_call_summary <U *, va_gc> * const &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
864 template <typename U> friend void gt_pch_nx (fast_call_summary <U *, va_gc> * const &);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
865 template <typename U> friend void gt_pch_nx (fast_call_summary <U *, va_gc> * const &,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
866 gt_pointer_operator, void *);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
867 };
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
868
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
869 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
870 fast_call_summary<T *, V>::~fast_call_summary ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
871 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
872 this->unregister_hooks ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
873
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
874 /* Release all summaries. */
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
875 for (unsigned i = 0; i < m_vector->length (); i++)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
876 if ((*m_vector)[i] != NULL)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
877 this->release ((*m_vector)[i]);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
878 vec_free (m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
879 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
880
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
881 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
882 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
883 fast_call_summary<T *, V>::symtab_removal (cgraph_edge *edge, void *data)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
884 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
885 fast_call_summary *summary = (fast_call_summary <T *, V> *) (data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
886 summary->remove (edge);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
887 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
888
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
889 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
890 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
891 fast_call_summary<T *, V>::symtab_duplication (cgraph_edge *edge1,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
892 cgraph_edge *edge2, void *data)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
893 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
894 fast_call_summary *summary = (fast_call_summary <T *, V> *) (data);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
895 T *edge1_summary = NULL;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
896
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
897 if (summary->m_initialize_when_cloning)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
898 edge1_summary = summary->get_create (edge1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
899 else
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
900 edge1_summary = summary->get (edge1);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
901
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
902 if (edge1_summary)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
903 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
904 T *duplicate = summary->get_create (edge2);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
905 summary->duplicate (edge1, edge2, edge1_summary, duplicate);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
906 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
907 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
908
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
909 template <typename T, typename V>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
910 inline bool
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
911 fast_call_summary<T *, V>::is_ggc ()
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
912 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
913 return is_same<V, va_gc>::value;
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
914 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
915
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
916 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
917 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
918 gt_ggc_mx (fast_call_summary<T *, va_heap>* const &summary ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
919 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
920 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
921
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
922 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
923 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
924 gt_pch_nx (fast_call_summary<T *, va_heap>* const &summary ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
925 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
926 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
927
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
928 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
929 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
930 gt_pch_nx (fast_call_summary<T *, va_heap>* const& summary ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
931 gt_pointer_operator op ATTRIBUTE_UNUSED,
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
932 void *cookie ATTRIBUTE_UNUSED)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
933 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
934 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
935
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
936 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
937 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
938 gt_ggc_mx (fast_call_summary<T *, va_gc>* const &summary)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
939 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
940 ggc_test_and_set_mark (summary->m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
941 gt_ggc_mx (&summary->m_vector);
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
942 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
943
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
944 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
945 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
946 gt_pch_nx (fast_call_summary<T *, va_gc> *const &)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
947 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
948 gcc_unreachable ();
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
949 }
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
950
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
951 template <typename T>
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
952 void
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
953 gt_pch_nx (fast_call_summary<T *, va_gc> *const &, gt_pointer_operator, void *)
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
954 {
1830386684a0 gcc-9.2.0
anatofuz
parents: 131
diff changeset
955 gcc_unreachable ();
111
kono
parents:
diff changeset
956 }
kono
parents:
diff changeset
957
kono
parents:
diff changeset
958 #endif /* GCC_SYMBOL_SUMMARY_H */