Branch data Line data Source code
1 : : /* Symbol table.
2 : : Copyright (C) 2012-2024 Free Software Foundation, Inc.
3 : : Contributed by Jan Hubicka
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify it under
8 : : the terms of the GNU General Public License as published by the Free
9 : : Software Foundation; either version 3, or (at your option) any later
10 : : version.
11 : :
12 : : GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 : : WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 : : FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
15 : : 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 : : #include "config.h"
22 : : #include "system.h"
23 : : #include "coretypes.h"
24 : : #include "backend.h"
25 : : #include "target.h"
26 : : #include "rtl.h"
27 : : #include "tree.h"
28 : : #include "gimple.h"
29 : : #include "timevar.h"
30 : : #include "cgraph.h"
31 : : #include "lto-streamer.h"
32 : : #include "print-tree.h"
33 : : #include "varasm.h"
34 : : #include "langhooks.h"
35 : : #include "output.h"
36 : : #include "ipa-utils.h"
37 : : #include "calls.h"
38 : : #include "stringpool.h"
39 : : #include "attribs.h"
40 : : #include "builtins.h"
41 : : #include "fold-const.h"
42 : :
43 : : static const char *ipa_ref_use_name[] = {"read","write","addr","alias"};
44 : :
45 : : const char * const ld_plugin_symbol_resolution_names[]=
46 : : {
47 : : "",
48 : : "undef",
49 : : "prevailing_def",
50 : : "prevailing_def_ironly",
51 : : "preempted_reg",
52 : : "preempted_ir",
53 : : "resolved_ir",
54 : : "resolved_exec",
55 : : "resolved_dyn",
56 : : "prevailing_def_ironly_exp"
57 : : };
58 : :
59 : : /* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at ALIAS
60 : : until we find an identifier that is not itself a transparent alias. */
61 : :
62 : : static inline tree
63 : 186 : ultimate_transparent_alias_target (tree alias)
64 : : {
65 : 186 : tree target = alias;
66 : :
67 : 186 : while (IDENTIFIER_TRANSPARENT_ALIAS (target))
68 : : {
69 : 0 : gcc_checking_assert (TREE_CHAIN (target));
70 : 0 : target = TREE_CHAIN (target);
71 : : }
72 : 186 : gcc_checking_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
73 : : && ! TREE_CHAIN (target));
74 : :
75 : 186 : return target;
76 : : }
77 : :
78 : :
79 : : /* Hash asmnames ignoring the user specified marks. */
80 : :
81 : : hashval_t
82 : 534416357 : symbol_table::decl_assembler_name_hash (const_tree asmname)
83 : : {
84 : 534416357 : if (IDENTIFIER_POINTER (asmname)[0] == '*')
85 : : {
86 : 2897586 : const char *decl_str = IDENTIFIER_POINTER (asmname) + 1;
87 : 2897586 : size_t ulp_len = strlen (user_label_prefix);
88 : :
89 : 2897586 : if (ulp_len == 0)
90 : : ;
91 : 85 : else if (strncmp (decl_str, user_label_prefix, ulp_len) == 0)
92 : 85 : decl_str += ulp_len;
93 : :
94 : 2897586 : return htab_hash_string (decl_str);
95 : : }
96 : :
97 : 531518771 : return htab_hash_string (IDENTIFIER_POINTER (asmname));
98 : : }
99 : :
100 : : /* Return true if assembler names NAME1 and NAME2 leads to the same symbol
101 : : name. */
102 : :
103 : : bool
104 : 463663592 : symbol_table::assembler_names_equal_p (const char *name1, const char *name2)
105 : : {
106 : 463663592 : if (name1 != name2)
107 : : {
108 : 463663493 : if (name1[0] == '*')
109 : : {
110 : 2447016 : size_t ulp_len = strlen (user_label_prefix);
111 : :
112 : 2447016 : name1 ++;
113 : :
114 : 2447016 : if (ulp_len == 0)
115 : : ;
116 : 30 : else if (strncmp (name1, user_label_prefix, ulp_len) == 0)
117 : 30 : name1 += ulp_len;
118 : : else
119 : : return false;
120 : : }
121 : 463663493 : if (name2[0] == '*')
122 : : {
123 : 2281408 : size_t ulp_len = strlen (user_label_prefix);
124 : :
125 : 2281408 : name2 ++;
126 : :
127 : 2281408 : if (ulp_len == 0)
128 : : ;
129 : 18 : else if (strncmp (name2, user_label_prefix, ulp_len) == 0)
130 : 18 : name2 += ulp_len;
131 : : else
132 : : return false;
133 : : }
134 : 463663493 : return !strcmp (name1, name2);
135 : : }
136 : : return true;
137 : : }
138 : :
139 : : /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
140 : :
141 : : bool
142 : 554200936 : symbol_table::decl_assembler_name_equal (tree decl, const_tree asmname)
143 : : {
144 : 554200936 : tree decl_asmname = DECL_ASSEMBLER_NAME (decl);
145 : 554200936 : const char *decl_str;
146 : 554200936 : const char *asmname_str;
147 : :
148 : 554200936 : if (decl_asmname == asmname)
149 : : return true;
150 : :
151 : 463663493 : decl_str = IDENTIFIER_POINTER (decl_asmname);
152 : 463663493 : asmname_str = IDENTIFIER_POINTER (asmname);
153 : 463663493 : return assembler_names_equal_p (decl_str, asmname_str);
154 : : }
155 : :
156 : :
157 : : /* Returns nonzero if P1 and P2 are equal. */
158 : :
159 : : /* Insert NODE to assembler name hash. */
160 : :
161 : : void
162 : 122985709 : symbol_table::insert_to_assembler_name_hash (symtab_node *node,
163 : : bool with_clones)
164 : : {
165 : 146544086 : if (is_a <varpool_node *> (node) && DECL_HARD_REGISTER (node->decl))
166 : : return;
167 : 122985500 : gcc_checking_assert (!node->previous_sharing_asm_name
168 : : && !node->next_sharing_asm_name);
169 : 122985500 : if (assembler_name_hash)
170 : : {
171 : 10973586 : symtab_node **aslot;
172 : 10973586 : cgraph_node *cnode;
173 : 10973586 : tree decl = node->decl;
174 : :
175 : 10973586 : tree name = DECL_ASSEMBLER_NAME (node->decl);
176 : :
177 : : /* C++ FE can produce decls without associated assembler name and insert
178 : : them to symtab to hold section or TLS information. */
179 : 10973586 : if (!name)
180 : 0 : return;
181 : :
182 : 10973586 : hashval_t hash = decl_assembler_name_hash (name);
183 : 10973586 : aslot = assembler_name_hash->find_slot_with_hash (name, hash, INSERT);
184 : 10973586 : gcc_assert (*aslot != node);
185 : 10973586 : node->next_sharing_asm_name = (symtab_node *)*aslot;
186 : 10973586 : if (*aslot != NULL)
187 : 2644365 : (*aslot)->previous_sharing_asm_name = node;
188 : 10973586 : *aslot = node;
189 : :
190 : : /* Update also possible inline clones sharing a decl. */
191 : 21947172 : cnode = dyn_cast <cgraph_node *> (node);
192 : 7647704 : if (cnode && cnode->clones && with_clones)
193 : 16 : for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
194 : 10 : if (cnode->decl == decl)
195 : 2 : insert_to_assembler_name_hash (cnode, true);
196 : : }
197 : :
198 : : }
199 : :
200 : : /* Remove NODE from assembler name hash. */
201 : :
202 : : void
203 : 107885966 : symbol_table::unlink_from_assembler_name_hash (symtab_node *node,
204 : : bool with_clones)
205 : : {
206 : 107885966 : if (assembler_name_hash)
207 : : {
208 : 4328980 : cgraph_node *cnode;
209 : 4328980 : tree decl = node->decl;
210 : :
211 : 4328980 : if (node->next_sharing_asm_name)
212 : 2264372 : node->next_sharing_asm_name->previous_sharing_asm_name
213 : 2264372 : = node->previous_sharing_asm_name;
214 : 4328980 : if (node->previous_sharing_asm_name)
215 : : {
216 : 845731 : node->previous_sharing_asm_name->next_sharing_asm_name
217 : 845731 : = node->next_sharing_asm_name;
218 : : }
219 : : else
220 : : {
221 : 3483249 : tree name = DECL_ASSEMBLER_NAME (node->decl);
222 : 3483249 : symtab_node **slot;
223 : :
224 : 3483249 : if (!name)
225 : 0 : return;
226 : :
227 : 3483249 : hashval_t hash = decl_assembler_name_hash (name);
228 : 3483249 : slot = assembler_name_hash->find_slot_with_hash (name, hash,
229 : : NO_INSERT);
230 : 3483249 : gcc_assert (*slot == node);
231 : 3483249 : if (!node->next_sharing_asm_name)
232 : 1855806 : assembler_name_hash->clear_slot (slot);
233 : : else
234 : 1627443 : *slot = node->next_sharing_asm_name;
235 : : }
236 : 4328980 : node->next_sharing_asm_name = NULL;
237 : 4328980 : node->previous_sharing_asm_name = NULL;
238 : :
239 : : /* Update also possible inline clones sharing a decl. */
240 : 4328980 : cnode = dyn_cast <cgraph_node *> (node);
241 : 4230101 : if (cnode && cnode->clones && with_clones)
242 : 16 : for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
243 : 10 : if (cnode->decl == decl)
244 : 2 : unlink_from_assembler_name_hash (cnode, true);
245 : : }
246 : : }
247 : :
248 : : /* Arrange node to be first in its entry of assembler_name_hash. */
249 : :
250 : : void
251 : 2026 : symbol_table::symtab_prevail_in_asm_name_hash (symtab_node *node)
252 : : {
253 : 2026 : unlink_from_assembler_name_hash (node, false);
254 : 2026 : insert_to_assembler_name_hash (node, false);
255 : 2026 : }
256 : :
257 : : /* Initialize asm name hash unless. */
258 : :
259 : : void
260 : 80130215 : symbol_table::symtab_initialize_asm_name_hash (void)
261 : : {
262 : 80130215 : symtab_node *node;
263 : 80130215 : if (!assembler_name_hash)
264 : : {
265 : 237666 : assembler_name_hash = hash_table<asmname_hasher>::create_ggc (10);
266 : 8450975 : FOR_EACH_SYMBOL (node)
267 : 8213309 : insert_to_assembler_name_hash (node, false);
268 : : }
269 : 80130215 : }
270 : :
271 : : /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */
272 : :
273 : : void
274 : 2729062 : symbol_table::change_decl_assembler_name (tree decl, tree name)
275 : : {
276 : 2729062 : symtab_node *node = NULL;
277 : :
278 : : /* We can have user ASM names on things, like global register variables, that
279 : : are not in the symbol table. */
280 : 12980 : if ((VAR_P (decl) && (TREE_STATIC (decl) || DECL_EXTERNAL (decl)))
281 : 2730143 : || TREE_CODE (decl) == FUNCTION_DECL)
282 : 2727981 : node = symtab_node::get (decl);
283 : 2729062 : if (!DECL_ASSEMBLER_NAME_SET_P (decl))
284 : : {
285 : 1764448 : SET_DECL_ASSEMBLER_NAME (decl, name);
286 : 1764448 : if (node)
287 : 11 : insert_to_assembler_name_hash (node, true);
288 : : }
289 : : else
290 : : {
291 : 964614 : if (name == DECL_ASSEMBLER_NAME (decl))
292 : : return;
293 : :
294 : 152078 : tree alias = (IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl))
295 : 152078 : ? TREE_CHAIN (DECL_ASSEMBLER_NAME (decl))
296 : 152078 : : NULL);
297 : 152078 : if (node)
298 : 7533 : unlink_from_assembler_name_hash (node, true);
299 : :
300 : 152078 : const char *old_name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
301 : 152078 : if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
302 : 152078 : && DECL_RTL_SET_P (decl))
303 : 0 : warning (0, "%qD renamed after being referenced in assembly", decl);
304 : :
305 : 152078 : SET_DECL_ASSEMBLER_NAME (decl, name);
306 : 152078 : if (alias)
307 : : {
308 : 0 : IDENTIFIER_TRANSPARENT_ALIAS (name) = 1;
309 : 0 : TREE_CHAIN (name) = alias;
310 : : }
311 : : /* If we change assembler name, also all transparent aliases must
312 : : be updated. There are three kinds - those having same assembler name,
313 : : those being renamed in varasm.cc and weakref being renamed by the
314 : : assembler. */
315 : 152078 : if (node)
316 : : {
317 : 7533 : insert_to_assembler_name_hash (node, true);
318 : 7533 : ipa_ref *ref;
319 : 7555 : for (unsigned i = 0; node->iterate_direct_aliases (i, ref); i++)
320 : : {
321 : 22 : struct symtab_node *alias = ref->referring;
322 : 22 : if (alias->transparent_alias && !alias->weakref
323 : 22 : && symbol_table::assembler_names_equal_p
324 : 0 : (old_name, IDENTIFIER_POINTER (
325 : : DECL_ASSEMBLER_NAME (alias->decl))))
326 : 0 : change_decl_assembler_name (alias->decl, name);
327 : 22 : else if (alias->transparent_alias
328 : 22 : && IDENTIFIER_TRANSPARENT_ALIAS (alias->decl))
329 : : {
330 : 0 : gcc_assert (TREE_CHAIN (DECL_ASSEMBLER_NAME (alias->decl))
331 : : && IDENTIFIER_TRANSPARENT_ALIAS
332 : : (DECL_ASSEMBLER_NAME (alias->decl)));
333 : :
334 : 0 : TREE_CHAIN (DECL_ASSEMBLER_NAME (alias->decl)) =
335 : : ultimate_transparent_alias_target
336 : 0 : (DECL_ASSEMBLER_NAME (node->decl));
337 : : }
338 : : #ifdef ASM_OUTPUT_WEAKREF
339 : 22 : else gcc_assert (!alias->transparent_alias || alias->weakref);
340 : : #else
341 : : else gcc_assert (!alias->transparent_alias);
342 : : #endif
343 : : }
344 : 7533 : gcc_assert (!node->transparent_alias || !node->definition
345 : : || node->weakref
346 : : || TREE_CHAIN (DECL_ASSEMBLER_NAME (decl))
347 : : || symbol_table::assembler_names_equal_p
348 : : (IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)),
349 : : IDENTIFIER_POINTER
350 : : (DECL_ASSEMBLER_NAME
351 : : (node->get_alias_target ()->decl))));
352 : : }
353 : : }
354 : : }
355 : :
356 : : /* Hash sections by their names. */
357 : :
358 : : hashval_t
359 : 12191081 : section_name_hasher::hash (section_hash_entry *n)
360 : : {
361 : 12191081 : return htab_hash_string (n->name);
362 : : }
363 : :
364 : : /* Return true if section P1 name equals to P2. */
365 : :
366 : : bool
367 : 12135847 : section_name_hasher::equal (section_hash_entry *n1, const char *name)
368 : : {
369 : 12135847 : return n1->name == name || !strcmp (n1->name, name);
370 : : }
371 : :
372 : : /* Bump the reference count on ENTRY so that it is retained. */
373 : :
374 : : static section_hash_entry *
375 : 46915 : retain_section_hash_entry (section_hash_entry *entry)
376 : : {
377 : 46915 : entry->ref_count++;
378 : 46915 : return entry;
379 : : }
380 : :
381 : : /* Drop the reference count on ENTRY and remove it if the reference
382 : : count drops to zero. */
383 : :
384 : : static void
385 : 1848703 : release_section_hash_entry (section_hash_entry *entry)
386 : : {
387 : 1848703 : if (entry)
388 : : {
389 : 27669 : entry->ref_count--;
390 : 27669 : if (!entry->ref_count)
391 : : {
392 : 24160 : hashval_t hash = htab_hash_string (entry->name);
393 : 24160 : section_hash_entry **slot
394 : 24160 : = symtab->section_hash->find_slot_with_hash (entry->name,
395 : : hash, INSERT);
396 : 24160 : ggc_free (entry);
397 : 24160 : symtab->section_hash->clear_slot (slot);
398 : : }
399 : : }
400 : 1848703 : }
401 : :
402 : : /* Add node into symbol table. This function is not used directly, but via
403 : : cgraph/varpool node creation routines. */
404 : :
405 : : void
406 : 114762828 : symtab_node::register_symbol (void)
407 : : {
408 : 114762828 : symtab->register_symbol (this);
409 : :
410 : 114762828 : if (!decl->decl_with_vis.symtab_node)
411 : 112251607 : decl->decl_with_vis.symtab_node = this;
412 : :
413 : 114762828 : ref_list.clear ();
414 : :
415 : : /* Be sure to do this last; C++ FE might create new nodes via
416 : : DECL_ASSEMBLER_NAME langhook! */
417 : 114762828 : symtab->insert_to_assembler_name_hash (this, false);
418 : 114762828 : }
419 : :
420 : : /* Remove NODE from same comdat group. */
421 : :
422 : : void
423 : 117498617 : symtab_node::remove_from_same_comdat_group (void)
424 : : {
425 : 117498617 : if (same_comdat_group)
426 : : {
427 : : symtab_node *prev;
428 : : for (prev = same_comdat_group;
429 : 13401093 : prev->same_comdat_group != this;
430 : : prev = prev->same_comdat_group)
431 : : ;
432 : 12659770 : if (same_comdat_group == prev)
433 : 12205943 : prev->same_comdat_group = NULL;
434 : : else
435 : 453827 : prev->same_comdat_group = same_comdat_group;
436 : 12659770 : same_comdat_group = NULL;
437 : 12659770 : set_comdat_group (NULL);
438 : : }
439 : 117498617 : }
440 : :
441 : : /* Remove node from symbol table. This function is not used directly, but via
442 : : cgraph/varpool node removal routines.
443 : : INFO is a clone info to attach to new root of clone tree (if any). */
444 : :
445 : : void
446 : 107876406 : symtab_node::unregister (clone_info *info)
447 : : {
448 : 107876406 : remove_all_references ();
449 : 107876406 : remove_all_referring ();
450 : :
451 : : /* Remove reference to section. */
452 : 107876406 : set_section_for_node (NULL);
453 : :
454 : 107876406 : remove_from_same_comdat_group ();
455 : :
456 : 107876406 : symtab->unregister (this);
457 : :
458 : : /* During LTO symtab merging we temporarily corrupt decl to symtab node
459 : : hash. */
460 : 107876406 : gcc_assert (decl->decl_with_vis.symtab_node || in_lto_p);
461 : 107876406 : if (decl->decl_with_vis.symtab_node == this)
462 : : {
463 : 105776041 : symtab_node *replacement_node = NULL;
464 : 105776041 : if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
465 : 88811343 : replacement_node = cnode->find_replacement (info);
466 : 105776041 : decl->decl_with_vis.symtab_node = replacement_node;
467 : : }
468 : 107876406 : if (!is_a <varpool_node *> (this) || !DECL_HARD_REGISTER (decl))
469 : 107876405 : symtab->unlink_from_assembler_name_hash (this, false);
470 : 107876406 : if (in_init_priority_hash)
471 : 99 : symtab->init_priority_hash->remove (this);
472 : 107876406 : }
473 : :
474 : :
475 : : /* Remove symbol from symbol table. */
476 : :
477 : : void
478 : 103539306 : symtab_node::remove (void)
479 : : {
480 : 103539306 : if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
481 : 86690448 : cnode->remove ();
482 : 16848858 : else if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
483 : 16848858 : vnode->remove ();
484 : 103539306 : }
485 : :
486 : : /* Add NEW_ to the same comdat group that OLD is in. */
487 : :
488 : : void
489 : 12728700 : symtab_node::add_to_same_comdat_group (symtab_node *old_node)
490 : : {
491 : 12728700 : gcc_assert (old_node->get_comdat_group ());
492 : 12728700 : gcc_assert (!same_comdat_group);
493 : 12728700 : gcc_assert (this != old_node);
494 : :
495 : 12728700 : set_comdat_group (old_node->get_comdat_group ());
496 : 12728700 : same_comdat_group = old_node;
497 : 12728700 : if (!old_node->same_comdat_group)
498 : 12257554 : old_node->same_comdat_group = this;
499 : : else
500 : : {
501 : : symtab_node *n;
502 : : for (n = old_node->same_comdat_group;
503 : 864278 : n->same_comdat_group != old_node;
504 : : n = n->same_comdat_group)
505 : : ;
506 : 471146 : n->same_comdat_group = this;
507 : : }
508 : :
509 : 12728700 : cgraph_node *n;
510 : 12739469 : if (comdat_local_p ()
511 : 12739462 : && (n = dyn_cast <cgraph_node *> (this)) != NULL)
512 : : {
513 : 19989 : for (cgraph_edge *e = n->callers; e; e = e->next_caller)
514 : 9227 : if (e->caller->inlined_to)
515 : 3264 : e->caller->inlined_to->calls_comdat_local = true;
516 : : else
517 : 5963 : e->caller->calls_comdat_local = true;
518 : : }
519 : 12728700 : }
520 : :
521 : : /* Dissolve the same_comdat_group list in which NODE resides. */
522 : :
523 : : void
524 : 1972 : symtab_node::dissolve_same_comdat_group_list (void)
525 : : {
526 : 1972 : symtab_node *n = this;
527 : 1972 : symtab_node *next;
528 : :
529 : 1972 : if (!same_comdat_group)
530 : : return;
531 : 3879 : do
532 : : {
533 : 3879 : next = n->same_comdat_group;
534 : 3879 : n->same_comdat_group = NULL;
535 : 3879 : if (dyn_cast <cgraph_node *> (n))
536 : 3609 : dyn_cast <cgraph_node *> (n)->calls_comdat_local = false;
537 : : /* Clear comdat_group for comdat locals, since
538 : : make_decl_local doesn't. */
539 : 3879 : if (!TREE_PUBLIC (n->decl))
540 : 2077 : n->set_comdat_group (NULL);
541 : 3879 : n = next;
542 : : }
543 : 3879 : while (n != this);
544 : : }
545 : :
546 : : /* Return printable assembler name of NODE.
547 : : This function is used only for debugging. When assembler name
548 : : is unknown go with identifier name. */
549 : :
550 : : const char *
551 : 43250 : symtab_node::asm_name () const
552 : : {
553 : 43250 : if (!DECL_ASSEMBLER_NAME_SET_P (decl))
554 : 195 : return name ();
555 : 43055 : return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
556 : : }
557 : :
558 : : /* Return printable identifier name. */
559 : :
560 : : const char *
561 : 42692 : symtab_node::name () const
562 : : {
563 : 42692 : if (!DECL_NAME (decl))
564 : : {
565 : 0 : if (DECL_ASSEMBLER_NAME_SET_P (decl))
566 : 0 : return asm_name ();
567 : : else
568 : : return "<unnamed>";
569 : : }
570 : 42692 : return lang_hooks.decl_printable_name (decl, 2);
571 : : }
572 : :
573 : : const char *
574 : 77300 : symtab_node::get_dump_name (bool asm_name_p) const
575 : : {
576 : : #define EXTRA 16
577 : 77300 : const char *fname = asm_name_p ? asm_name () : name ();
578 : 77300 : unsigned l = strlen (fname);
579 : :
580 : 77300 : char *s = (char *)ggc_internal_cleared_alloc (l + EXTRA);
581 : 77300 : snprintf (s, l + EXTRA, "%s/%d", fname, order);
582 : :
583 : 77300 : return s;
584 : : }
585 : :
586 : : const char *
587 : 34224 : symtab_node::dump_name () const
588 : : {
589 : 34224 : return get_dump_name (false);
590 : : }
591 : :
592 : : const char *
593 : 43076 : symtab_node::dump_asm_name () const
594 : : {
595 : 43076 : return get_dump_name (true);
596 : : }
597 : :
598 : : /* Return ipa reference from this symtab_node to
599 : : REFERRED_NODE or REFERRED_VARPOOL_NODE. USE_TYPE specify type
600 : : of the use. */
601 : :
602 : : ipa_ref *
603 : 6378779 : symtab_node::create_reference (symtab_node *referred_node,
604 : : enum ipa_ref_use use_type)
605 : : {
606 : 6378779 : return create_reference (referred_node, use_type, NULL);
607 : : }
608 : :
609 : :
610 : : /* Return ipa reference from this symtab_node to
611 : : REFERRED_NODE or REFERRED_VARPOOL_NODE. USE_TYPE specify type
612 : : of the use and STMT the statement (if it exists). */
613 : :
614 : : ipa_ref *
615 : 39054341 : symtab_node::create_reference (symtab_node *referred_node,
616 : : enum ipa_ref_use use_type, gimple *stmt)
617 : : {
618 : 39054341 : ipa_ref *ref = NULL, *ref2 = NULL;
619 : 39054341 : ipa_ref_list *list, *list2;
620 : 39054341 : ipa_ref_t *old_references;
621 : :
622 : 39054341 : gcc_checking_assert (!stmt || is_a <cgraph_node *> (this));
623 : 39054341 : gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt);
624 : :
625 : 39054341 : list = &ref_list;
626 : 39054341 : old_references = list->references.address ();
627 : 65820527 : list->references.safe_grow (list->references.length () + 1, false);
628 : 39054341 : ref = &list->references.last ();
629 : :
630 : 39054341 : list2 = &referred_node->ref_list;
631 : :
632 : : /* IPA_REF_ALIAS is always inserted at the beginning of the list. */
633 : 39054341 : if(use_type == IPA_REF_ALIAS)
634 : : {
635 : 6643401 : list2->referring.safe_insert (0, ref);
636 : 6643401 : ref->referred_index = 0;
637 : :
638 : 6832520 : for (unsigned int i = 1; i < list2->referring.length (); i++)
639 : 189119 : list2->referring[i]->referred_index = i;
640 : : }
641 : : else
642 : : {
643 : 32410940 : list2->referring.safe_push (ref);
644 : 64821880 : ref->referred_index = list2->referring.length () - 1;
645 : : }
646 : :
647 : 39054341 : ref->referring = this;
648 : 39054341 : ref->referred = referred_node;
649 : 39054341 : ref->stmt = stmt;
650 : 39054341 : ref->lto_stmt_uid = 0;
651 : 39054341 : ref->speculative_id = 0;
652 : 39054341 : ref->use = use_type;
653 : 39054341 : ref->speculative = 0;
654 : :
655 : : /* If vector was moved in memory, update pointers. */
656 : 78108682 : if (old_references != list->references.address ())
657 : : {
658 : : int i;
659 : 49224220 : for (i = 0; iterate_reference(i, ref2); i++)
660 : 35594590 : ref2->referred_ref_list ()->referring[ref2->referred_index] = ref2;
661 : : }
662 : 39054341 : return ref;
663 : : }
664 : :
665 : : ipa_ref *
666 : 41406 : symtab_node::maybe_create_reference (tree val, gimple *stmt)
667 : : {
668 : 41406 : STRIP_NOPS (val);
669 : 41406 : ipa_ref_use use_type;
670 : :
671 : 41406 : switch (TREE_CODE (val))
672 : : {
673 : : case VAR_DECL:
674 : : use_type = IPA_REF_LOAD;
675 : : break;
676 : 6630 : case ADDR_EXPR:
677 : 6630 : use_type = IPA_REF_ADDR;
678 : 6630 : break;
679 : 34466 : default:
680 : 34466 : gcc_assert (!handled_component_p (val));
681 : : return NULL;
682 : : }
683 : :
684 : 6940 : val = get_base_var (val);
685 : 6940 : if (val && VAR_OR_FUNCTION_DECL_P (val))
686 : : {
687 : 3810 : symtab_node *referred = symtab_node::get (val);
688 : 3810 : gcc_checking_assert (referred);
689 : 3810 : return create_reference (referred, use_type, stmt);
690 : : }
691 : : return NULL;
692 : : }
693 : :
694 : : /* Clone all references from symtab NODE to this symtab_node. */
695 : :
696 : : void
697 : 2620717 : symtab_node::clone_references (symtab_node *node)
698 : : {
699 : 2620717 : ipa_ref *ref = NULL, *ref2 = NULL;
700 : 2620717 : int i;
701 : 3358843 : for (i = 0; node->iterate_reference (i, ref); i++)
702 : : {
703 : 738126 : bool speculative = ref->speculative;
704 : 738126 : unsigned int stmt_uid = ref->lto_stmt_uid;
705 : 738126 : unsigned int spec_id = ref->speculative_id;
706 : :
707 : 738126 : ref2 = create_reference (ref->referred, ref->use, ref->stmt);
708 : 738126 : ref2->speculative = speculative;
709 : 738126 : ref2->lto_stmt_uid = stmt_uid;
710 : 738126 : ref2->speculative_id = spec_id;
711 : : }
712 : 2620717 : }
713 : :
714 : : /* Clone all referring from symtab NODE to this symtab_node. */
715 : :
716 : : void
717 : 2624 : symtab_node::clone_referring (symtab_node *node)
718 : : {
719 : 2624 : ipa_ref *ref = NULL, *ref2 = NULL;
720 : 2624 : int i;
721 : 4535 : for (i = 0; node->iterate_referring(i, ref); i++)
722 : : {
723 : 1911 : bool speculative = ref->speculative;
724 : 1911 : unsigned int stmt_uid = ref->lto_stmt_uid;
725 : 1911 : unsigned int spec_id = ref->speculative_id;
726 : :
727 : 1911 : ref2 = ref->referring->create_reference (this, ref->use, ref->stmt);
728 : 1911 : ref2->speculative = speculative;
729 : 1911 : ref2->lto_stmt_uid = stmt_uid;
730 : 1911 : ref2->speculative_id = spec_id;
731 : : }
732 : 2624 : }
733 : :
734 : : /* Clone reference REF to this symtab_node and set its stmt to STMT. */
735 : :
736 : : ipa_ref *
737 : 9679 : symtab_node::clone_reference (ipa_ref *ref, gimple *stmt)
738 : : {
739 : 9679 : bool speculative = ref->speculative;
740 : 9679 : unsigned int stmt_uid = ref->lto_stmt_uid;
741 : 9679 : unsigned int spec_id = ref->speculative_id;
742 : 9679 : ipa_ref *ref2;
743 : :
744 : 9679 : ref2 = create_reference (ref->referred, ref->use, stmt);
745 : 9679 : ref2->speculative = speculative;
746 : 9679 : ref2->lto_stmt_uid = stmt_uid;
747 : 9679 : ref2->speculative_id = spec_id;
748 : 9679 : return ref2;
749 : : }
750 : :
751 : : /* Find the structure describing a reference to REFERRED_NODE of USE_TYPE and
752 : : associated with statement STMT or LTO_STMT_UID. */
753 : :
754 : : ipa_ref *
755 : 6253 : symtab_node::find_reference (symtab_node *referred_node,
756 : : gimple *stmt, unsigned int lto_stmt_uid,
757 : : enum ipa_ref_use use_type)
758 : : {
759 : 6253 : ipa_ref *r = NULL;
760 : 6253 : int i;
761 : :
762 : 32018 : for (i = 0; iterate_reference (i, r); i++)
763 : 32015 : if (r->referred == referred_node
764 : 10911 : && !r->speculative
765 : 10911 : && r->use == use_type
766 : 8877 : && ((stmt && r->stmt == stmt)
767 : 3100 : || (lto_stmt_uid && r->lto_stmt_uid == lto_stmt_uid)
768 : 2981 : || (!stmt && !lto_stmt_uid && !r->stmt && !r->lto_stmt_uid)))
769 : : return r;
770 : : return NULL;
771 : : }
772 : :
773 : : /* Remove all references that are associated with statement STMT. */
774 : :
775 : : void
776 : 105594 : symtab_node::remove_stmt_references (gimple *stmt)
777 : : {
778 : 105594 : ipa_ref *r = NULL;
779 : 105594 : int i = 0;
780 : :
781 : 106666 : while (iterate_reference (i, r))
782 : 1072 : if (r->stmt == stmt)
783 : 0 : r->remove_reference ();
784 : : else
785 : 1072 : i++;
786 : 105594 : }
787 : :
788 : : /* Remove all stmt references in non-speculative references in THIS
789 : : and all clones.
790 : : Those are not maintained during inlining & cloning.
791 : : The exception are speculative references that are updated along
792 : : with callgraph edges associated with them. */
793 : :
794 : : void
795 : 1958027 : symtab_node::clear_stmts_in_references (void)
796 : : {
797 : 1958027 : ipa_ref *r = NULL;
798 : 1958027 : int i;
799 : :
800 : 8263021 : for (i = 0; iterate_reference (i, r); i++)
801 : 6304994 : if (!r->speculative)
802 : : {
803 : 6300935 : r->stmt = NULL;
804 : 6300935 : r->lto_stmt_uid = 0;
805 : 6300935 : r->speculative_id = 0;
806 : : }
807 : 1958027 : cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
808 : 1958027 : if (cnode)
809 : : {
810 : 1958027 : if (cnode->clones)
811 : 534498 : for (cnode = cnode->clones; cnode; cnode = cnode->next_sibling_clone)
812 : 439816 : cnode->clear_stmts_in_references ();
813 : : }
814 : 1958027 : }
815 : :
816 : : /* Remove all references in ref list. */
817 : :
818 : : void
819 : 226800167 : symtab_node::remove_all_references (void)
820 : : {
821 : 261643698 : while (ref_list.references.length ())
822 : 34843531 : ref_list.references.last ().remove_reference ();
823 : 226800167 : ref_list.references.release ();
824 : 226800167 : }
825 : :
826 : : /* Remove all referring items in ref list. */
827 : :
828 : : void
829 : 107876406 : symtab_node::remove_all_referring (void)
830 : : {
831 : 107976170 : while (ref_list.referring.length ())
832 : 99764 : ref_list.referring.last ()->remove_reference ();
833 : 107876406 : ref_list.referring.release ();
834 : 107876406 : }
835 : :
836 : : /* Dump references in ref list to FILE. */
837 : :
838 : : void
839 : 8070 : symtab_node::dump_references (FILE *file)
840 : : {
841 : 8070 : ipa_ref *ref = NULL;
842 : 8070 : int i;
843 : 14968 : for (i = 0; iterate_reference (i, ref); i++)
844 : : {
845 : 6898 : fprintf (file, "%s (%s) ", ref->referred->dump_asm_name (),
846 : 6898 : ipa_ref_use_name[ref->use]);
847 : 6898 : if (ref->speculative)
848 : 46 : fprintf (file, "(speculative) ");
849 : : }
850 : 8070 : fprintf (file, "\n");
851 : 8070 : }
852 : :
853 : : /* Dump referring in list to FILE. */
854 : :
855 : : void
856 : 8070 : symtab_node::dump_referring (FILE *file)
857 : : {
858 : 8070 : ipa_ref *ref = NULL;
859 : 8070 : int i;
860 : 12917 : for (i = 0; iterate_referring(i, ref); i++)
861 : : {
862 : 4847 : fprintf (file, "%s (%s) ", ref->referring->dump_asm_name (),
863 : 4847 : ipa_ref_use_name[ref->use]);
864 : 4847 : if (ref->speculative)
865 : 46 : fprintf (file, "(speculative) ");
866 : : }
867 : 8070 : fprintf (file, "\n");
868 : 8070 : }
869 : :
870 : : static const char * const symtab_type_names[] = {"symbol", "function", "variable"};
871 : :
872 : : /* Dump the visibility of the symbol. */
873 : :
874 : : const char *
875 : 0 : symtab_node::get_visibility_string () const
876 : : {
877 : 0 : static const char * const visibility_types[]
878 : : = { "default", "protected", "hidden", "internal" };
879 : 0 : return visibility_types[DECL_VISIBILITY (decl)];
880 : : }
881 : :
882 : : /* Dump the type_name of the symbol. */
883 : : const char *
884 : 0 : symtab_node::get_symtab_type_string () const
885 : : {
886 : 0 : return symtab_type_names[type];
887 : : }
888 : :
889 : : /* Dump base fields of symtab nodes to F. Not to be used directly. */
890 : :
891 : : void
892 : 8070 : symtab_node::dump_base (FILE *f)
893 : : {
894 : 8070 : static const char * const visibility_types[] = {
895 : : "default", "protected", "hidden", "internal"
896 : : };
897 : :
898 : 8070 : fprintf (f, "%s (%s)", dump_asm_name (), name ());
899 : 8070 : if (dump_flags & TDF_ADDRESS)
900 : 103 : dump_addr (f, " @", (void *)this);
901 : 8070 : fprintf (f, "\n Type: %s", symtab_type_names[type]);
902 : :
903 : 8070 : if (definition)
904 : 6173 : fprintf (f, " definition");
905 : 8070 : if (analyzed)
906 : 6170 : fprintf (f, " analyzed");
907 : 8070 : if (alias)
908 : 100 : fprintf (f, " alias");
909 : 8070 : if (transparent_alias)
910 : 0 : fprintf (f, " transparent_alias");
911 : 8070 : if (weakref)
912 : 0 : fprintf (f, " weakref");
913 : 8070 : if (symver)
914 : 0 : fprintf (f, " symver");
915 : 8070 : if (cpp_implicit_alias)
916 : 81 : fprintf (f, " cpp_implicit_alias");
917 : 8070 : if (alias_target)
918 : 0 : fprintf (f, " target:%s",
919 : 0 : DECL_P (alias_target)
920 : 0 : ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME
921 : : (alias_target))
922 : 0 : : IDENTIFIER_POINTER (alias_target));
923 : 8070 : if (body_removed)
924 : 619 : fprintf (f, "\n Body removed by symtab_remove_unreachable_nodes");
925 : 8070 : fprintf (f, "\n Visibility:");
926 : 8070 : if (in_other_partition)
927 : 0 : fprintf (f, " in_other_partition");
928 : 8070 : if (used_from_other_partition)
929 : 0 : fprintf (f, " used_from_other_partition");
930 : 8070 : if (force_output)
931 : 635 : fprintf (f, " force_output");
932 : 8070 : if (forced_by_abi)
933 : 540 : fprintf (f, " forced_by_abi");
934 : 8070 : if (externally_visible)
935 : 3810 : fprintf (f, " externally_visible");
936 : 8070 : if (semantic_interposition)
937 : 7657 : fprintf (f, " semantic_interposition");
938 : 8070 : if (no_reorder)
939 : 555 : fprintf (f, " no_reorder");
940 : 8070 : if (resolution != LDPR_UNKNOWN)
941 : 1048 : fprintf (f, " %s",
942 : 1048 : ld_plugin_symbol_resolution_names[(int)resolution]);
943 : 8070 : if (TREE_ASM_WRITTEN (decl))
944 : 194 : fprintf (f, " asm_written");
945 : 8070 : if (DECL_EXTERNAL (decl))
946 : 1640 : fprintf (f, " external");
947 : 8070 : if (TREE_PUBLIC (decl))
948 : 6279 : fprintf (f, " public");
949 : 8070 : if (DECL_COMMON (decl))
950 : 17 : fprintf (f, " common");
951 : 8070 : if (DECL_WEAK (decl))
952 : 1476 : fprintf (f, " weak");
953 : 8070 : if (DECL_DLLIMPORT_P (decl))
954 : 0 : fprintf (f, " dll_import");
955 : 8070 : if (DECL_COMDAT (decl))
956 : 1440 : fprintf (f, " comdat");
957 : 8070 : if (get_comdat_group ())
958 : 2704 : fprintf (f, " comdat_group:%s",
959 : 1352 : IDENTIFIER_POINTER (get_comdat_group_id ()));
960 : 8070 : if (DECL_ONE_ONLY (decl))
961 : 1398 : fprintf (f, " one_only");
962 : 8070 : if (get_section ())
963 : 38 : fprintf (f, " section:%s",
964 : : get_section ());
965 : 8070 : if (implicit_section)
966 : 36 : fprintf (f," (implicit_section)");
967 : 8070 : if (DECL_VISIBILITY_SPECIFIED (decl))
968 : 565 : fprintf (f, " visibility_specified");
969 : 8070 : if (DECL_VISIBILITY (decl))
970 : 40 : fprintf (f, " visibility:%s",
971 : 20 : visibility_types [DECL_VISIBILITY (decl)]);
972 : 8070 : if (DECL_VIRTUAL_P (decl))
973 : 1268 : fprintf (f, " virtual");
974 : 8070 : if (DECL_ARTIFICIAL (decl))
975 : 2257 : fprintf (f, " artificial");
976 : 8070 : if (TREE_CODE (decl) == FUNCTION_DECL)
977 : : {
978 : 5675 : if (DECL_STATIC_CONSTRUCTOR (decl))
979 : 44 : fprintf (f, " constructor");
980 : 5675 : if (DECL_STATIC_DESTRUCTOR (decl))
981 : 6 : fprintf (f, " destructor");
982 : : }
983 : 8070 : if (ifunc_resolver)
984 : 3 : fprintf (f, " ifunc_resolver");
985 : 8070 : fprintf (f, "\n");
986 : :
987 : 8070 : if (same_comdat_group)
988 : 158 : fprintf (f, " Same comdat group as: %s\n",
989 : : same_comdat_group->dump_asm_name ());
990 : 8070 : if (next_sharing_asm_name)
991 : 350 : fprintf (f, " next sharing asm name: %i\n",
992 : : next_sharing_asm_name->order);
993 : 8070 : if (previous_sharing_asm_name)
994 : 317 : fprintf (f, " previous sharing asm name: %i\n",
995 : : previous_sharing_asm_name->order);
996 : :
997 : 8070 : if (address_taken)
998 : 850 : fprintf (f, " Address is taken.\n");
999 : 8070 : if (aux)
1000 : : {
1001 : 511 : fprintf (f, " Aux:");
1002 : 511 : dump_addr (f, " @", (void *)aux);
1003 : 511 : fprintf (f, "\n");
1004 : : }
1005 : :
1006 : 8070 : fprintf (f, " References: ");
1007 : 8070 : dump_references (f);
1008 : 8070 : fprintf (f, " Referring: ");
1009 : 8070 : dump_referring (f);
1010 : 8070 : if (lto_file_data)
1011 : 186 : fprintf (f, " Read from file: %s\n",
1012 : : lto_file_data->file_name);
1013 : 8070 : }
1014 : :
1015 : : /* Dump symtab node to F. */
1016 : :
1017 : : void
1018 : 7227 : symtab_node::dump (FILE *f)
1019 : : {
1020 : 7227 : if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
1021 : 4832 : cnode->dump (f);
1022 : 2395 : else if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
1023 : 2395 : vnode->dump (f);
1024 : 7227 : }
1025 : :
1026 : : void
1027 : 0 : symtab_node::dump_graphviz (FILE *f)
1028 : : {
1029 : 0 : if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
1030 : 0 : cnode->dump_graphviz (f);
1031 : 0 : }
1032 : :
1033 : : void
1034 : 1224 : symbol_table::dump (FILE *f)
1035 : : {
1036 : 1224 : symtab_node *node;
1037 : 1224 : fprintf (f, "Symbol table:\n\n");
1038 : 8448 : FOR_EACH_SYMBOL (node)
1039 : 7224 : node->dump (f);
1040 : 1224 : }
1041 : :
1042 : : void
1043 : 0 : symbol_table::dump_graphviz (FILE *f)
1044 : : {
1045 : 0 : symtab_node *node;
1046 : 0 : fprintf (f, "digraph symtab {\n");
1047 : 0 : FOR_EACH_SYMBOL (node)
1048 : 0 : node->dump_graphviz (f);
1049 : 0 : fprintf (f, "}\n");
1050 : 0 : }
1051 : :
1052 : : DEBUG_FUNCTION void
1053 : 0 : symbol_table::debug (void)
1054 : : {
1055 : 0 : dump (stderr);
1056 : 0 : }
1057 : :
1058 : : /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
1059 : : Return NULL if there's no such node. */
1060 : :
1061 : : symtab_node *
1062 : 79654937 : symtab_node::get_for_asmname (const_tree asmname)
1063 : : {
1064 : 79654937 : symtab_node *node;
1065 : :
1066 : 79654937 : symtab->symtab_initialize_asm_name_hash ();
1067 : 79654937 : hashval_t hash = symtab->decl_assembler_name_hash (asmname);
1068 : 79654937 : symtab_node **slot
1069 : 79654937 : = symtab->assembler_name_hash->find_slot_with_hash (asmname, hash,
1070 : : NO_INSERT);
1071 : :
1072 : 79654937 : if (slot)
1073 : : {
1074 : 79651800 : node = *slot;
1075 : 79651800 : return node;
1076 : : }
1077 : : return NULL;
1078 : : }
1079 : :
1080 : : /* Dump symtab node NODE to stderr. */
1081 : :
1082 : : DEBUG_FUNCTION void
1083 : 0 : symtab_node::debug (void)
1084 : : {
1085 : 0 : dump (stderr);
1086 : 0 : }
1087 : :
1088 : : /* Verify common part of symtab nodes. */
1089 : :
1090 : : #if __GNUC__ >= 10
1091 : : /* Disable warnings about missing quoting in GCC diagnostics for
1092 : : the verification errors. Their format strings don't follow GCC
1093 : : diagnostic conventions and the calls are ultimately followed by
1094 : : one to internal_error. */
1095 : : # pragma GCC diagnostic push
1096 : : # pragma GCC diagnostic ignored "-Wformat-diag"
1097 : : #endif
1098 : :
1099 : : DEBUG_FUNCTION bool
1100 : 80124432 : symtab_node::verify_base (void)
1101 : : {
1102 : 80124432 : bool error_found = false;
1103 : 80124432 : symtab_node *hashed_node;
1104 : :
1105 : 80124432 : if (is_a <cgraph_node *> (this))
1106 : : {
1107 : 48596023 : if (TREE_CODE (decl) != FUNCTION_DECL)
1108 : : {
1109 : 0 : error ("function symbol is not function");
1110 : 0 : error_found = true;
1111 : : }
1112 : 48596023 : else if ((lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))
1113 : 48596023 : != NULL)
1114 : 48596023 : != dyn_cast <cgraph_node *> (this)->ifunc_resolver)
1115 : : {
1116 : 0 : error ("inconsistent %<ifunc%> attribute");
1117 : 0 : error_found = true;
1118 : : }
1119 : : }
1120 : 31528409 : else if (is_a <varpool_node *> (this))
1121 : : {
1122 : 31528409 : if (!VAR_P (decl))
1123 : : {
1124 : 0 : error ("variable symbol is not variable");
1125 : 0 : error_found = true;
1126 : : }
1127 : : }
1128 : : else
1129 : : {
1130 : 0 : error ("node has unknown type");
1131 : 0 : error_found = true;
1132 : : }
1133 : 80124432 : if (order < 0 || order >= symtab->order)
1134 : : {
1135 : 0 : error ("node has invalid order %i", order);
1136 : 0 : error_found = true;
1137 : : }
1138 : :
1139 : 80124432 : if (symtab->state != LTO_STREAMING)
1140 : : {
1141 : 79972732 : hashed_node = symtab_node::get (decl);
1142 : 79972732 : if (!hashed_node)
1143 : : {
1144 : 0 : error ("node not found node->decl->decl_with_vis.symtab_node");
1145 : 0 : error_found = true;
1146 : : }
1147 : 79972732 : if (hashed_node != this
1148 : 84508060 : && (!is_a <cgraph_node *> (this)
1149 : 4535328 : || !dyn_cast <cgraph_node *> (this)->clone_of
1150 : 4535328 : || dyn_cast <cgraph_node *> (this)->clone_of->decl != decl))
1151 : : {
1152 : 0 : error ("node differs from node->decl->decl_with_vis.symtab_node");
1153 : 0 : error_found = true;
1154 : : }
1155 : : }
1156 : 80124432 : if (symtab->assembler_name_hash)
1157 : : {
1158 : 79575112 : hashed_node = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (decl));
1159 : 79575112 : if (hashed_node)
1160 : : {
1161 : 79574307 : if (hashed_node->previous_sharing_asm_name)
1162 : : {
1163 : 0 : error ("assembler name hash list corrupted");
1164 : 0 : error_found = true;
1165 : : }
1166 : 79574307 : else if (previous_sharing_asm_name == NULL)
1167 : : {
1168 : 74808027 : if (hashed_node != this)
1169 : : {
1170 : 0 : error ("assembler name hash list corrupted");
1171 : 0 : error_found = true;
1172 : : }
1173 : : }
1174 : 4766280 : else if (!(is_a <varpool_node *> (this) && DECL_HARD_REGISTER (decl)))
1175 : : {
1176 : 4766280 : if (!asmname_hasher::equal (previous_sharing_asm_name,
1177 : 4766280 : DECL_ASSEMBLER_NAME (decl)))
1178 : : {
1179 : 0 : error ("node not found in symtab assembler name hash");
1180 : 0 : error_found = true;
1181 : : }
1182 : : }
1183 : : }
1184 : : }
1185 : 80124432 : if (previous_sharing_asm_name
1186 : 4766280 : && previous_sharing_asm_name->next_sharing_asm_name != this)
1187 : : {
1188 : 0 : error ("double linked list of assembler names corrupted");
1189 : 0 : error_found = true;
1190 : : }
1191 : 80124432 : if (body_removed && definition)
1192 : : {
1193 : 0 : error ("node has body_removed but is definition");
1194 : 0 : error_found = true;
1195 : : }
1196 : 80124432 : if (analyzed && !definition)
1197 : : {
1198 : 0 : error ("node is analyzed but it is not a definition");
1199 : 0 : error_found = true;
1200 : : }
1201 : 80124432 : if (cpp_implicit_alias && !alias)
1202 : : {
1203 : 0 : error ("node is alias but not implicit alias");
1204 : 0 : error_found = true;
1205 : : }
1206 : 80124432 : if (alias && !definition && !weakref)
1207 : : {
1208 : 0 : error ("node is alias but not definition");
1209 : 0 : error_found = true;
1210 : : }
1211 : 80124432 : if (weakref && !transparent_alias)
1212 : : {
1213 : 0 : error ("node is weakref but not an transparent_alias");
1214 : 0 : error_found = true;
1215 : : }
1216 : 80124432 : if (transparent_alias && !alias)
1217 : : {
1218 : 0 : error ("node is transparent_alias but not an alias");
1219 : 0 : error_found = true;
1220 : : }
1221 : 80124432 : if (symver && !alias)
1222 : : {
1223 : 0 : error ("node is symver but not alias");
1224 : 0 : error_found = true;
1225 : : }
1226 : : /* Limitation of gas requires us to output targets of symver aliases as
1227 : : global symbols. This is binutils PR 25295. */
1228 : 80124432 : if (symver
1229 : 80124432 : && (!TREE_PUBLIC (get_alias_target ()->decl)
1230 : 16 : || DECL_VISIBILITY (get_alias_target ()->decl) != VISIBILITY_DEFAULT))
1231 : : {
1232 : 0 : error ("symver target is not exported with default visibility");
1233 : 0 : error_found = true;
1234 : : }
1235 : 80124432 : if (symver
1236 : 80124432 : && (!TREE_PUBLIC (decl)
1237 : 16 : || DECL_VISIBILITY (decl) != VISIBILITY_DEFAULT))
1238 : : {
1239 : 0 : error ("symver is not exported with default visibility");
1240 : 0 : error_found = true;
1241 : : }
1242 : 80124432 : if (same_comdat_group)
1243 : : {
1244 : 3083303 : symtab_node *n = same_comdat_group;
1245 : :
1246 : 3083303 : if (!n->get_comdat_group ())
1247 : : {
1248 : 0 : error ("node is in same_comdat_group list but has no comdat_group");
1249 : 0 : error_found = true;
1250 : : }
1251 : 3083303 : if (n->get_comdat_group () != get_comdat_group ())
1252 : : {
1253 : 0 : error ("same_comdat_group list across different groups");
1254 : 0 : error_found = true;
1255 : : }
1256 : 3083303 : if (n->type != type)
1257 : : {
1258 : 0 : error ("mixing different types of symbol in same comdat groups is not supported");
1259 : 0 : error_found = true;
1260 : : }
1261 : 3083303 : if (n == this)
1262 : : {
1263 : 0 : error ("node is alone in a comdat group");
1264 : 0 : error_found = true;
1265 : : }
1266 : 5653282 : do
1267 : : {
1268 : 5653282 : if (!n->same_comdat_group)
1269 : : {
1270 : 0 : error ("same_comdat_group is not a circular list");
1271 : 0 : error_found = true;
1272 : 0 : break;
1273 : : }
1274 : 5653282 : n = n->same_comdat_group;
1275 : : }
1276 : 5653282 : while (n != this);
1277 : 3083303 : if (comdat_local_p ())
1278 : : {
1279 : 46486 : ipa_ref *ref = NULL;
1280 : :
1281 : 47891 : for (int i = 0; iterate_referring (i, ref); ++i)
1282 : : {
1283 : 1405 : if (!in_same_comdat_group_p (ref->referring))
1284 : : {
1285 : 0 : error ("comdat-local symbol referred to by %s outside its "
1286 : : "comdat",
1287 : : identifier_to_locale (ref->referring->name()));
1288 : 0 : error_found = true;
1289 : : }
1290 : : }
1291 : : }
1292 : : }
1293 : 95470870 : if (implicit_section && !get_section ())
1294 : : {
1295 : 0 : error ("implicit_section flag is set but section isn%'t");
1296 : 0 : error_found = true;
1297 : : }
1298 : 95475013 : if (get_section () && get_comdat_group ()
1299 : 2819809 : && !implicit_section
1300 : 15350791 : && !lookup_attribute ("section", DECL_ATTRIBUTES (decl)))
1301 : : {
1302 : 0 : error ("Both section and comdat group is set");
1303 : 0 : error_found = true;
1304 : : }
1305 : : /* TODO: Add string table for sections, so we do not keep holding duplicated
1306 : : strings. */
1307 : 80124432 : if (alias && definition
1308 : 1516726 : && get_section () != get_alias_target ()->get_section ()
1309 : 80124432 : && (!get_section()
1310 : 0 : || !get_alias_target ()->get_section ()
1311 : 0 : || strcmp (get_section(),
1312 : : get_alias_target ()->get_section ())))
1313 : : {
1314 : 0 : error ("Alias and target%'s section differs");
1315 : 0 : get_alias_target ()->dump (stderr);
1316 : 0 : error_found = true;
1317 : : }
1318 : 80124432 : if (alias && definition
1319 : 80124432 : && get_comdat_group () != get_alias_target ()->get_comdat_group ())
1320 : : {
1321 : 0 : error ("Alias and target%'s comdat groups differs");
1322 : 0 : get_alias_target ()->dump (stderr);
1323 : 0 : error_found = true;
1324 : : }
1325 : 80124432 : if (transparent_alias && definition && !weakref)
1326 : : {
1327 : 93 : symtab_node *to = get_alias_target ();
1328 : 93 : const char *name1
1329 : 93 : = IDENTIFIER_POINTER (
1330 : : ultimate_transparent_alias_target (DECL_ASSEMBLER_NAME (decl)));
1331 : 93 : const char *name2
1332 : 93 : = IDENTIFIER_POINTER (
1333 : : ultimate_transparent_alias_target (DECL_ASSEMBLER_NAME (to->decl)));
1334 : 93 : if (!symbol_table::assembler_names_equal_p (name1, name2))
1335 : : {
1336 : 0 : error ("Transparent alias and target%'s assembler names differs");
1337 : 0 : get_alias_target ()->dump (stderr);
1338 : 0 : error_found = true;
1339 : : }
1340 : : }
1341 : 80124432 : if (transparent_alias && definition
1342 : 80124432 : && get_alias_target()->transparent_alias && get_alias_target()->analyzed)
1343 : : {
1344 : 0 : error ("Chained transparent aliases");
1345 : 0 : get_alias_target ()->dump (stderr);
1346 : 0 : error_found = true;
1347 : : }
1348 : :
1349 : 80124432 : return error_found;
1350 : : }
1351 : :
1352 : : /* Verify consistency of NODE. */
1353 : :
1354 : : DEBUG_FUNCTION void
1355 : 80126395 : symtab_node::verify (void)
1356 : : {
1357 : 80126395 : if (seen_error ())
1358 : : return;
1359 : :
1360 : 80124432 : timevar_push (TV_CGRAPH_VERIFY);
1361 : 80124432 : if (cgraph_node *node = dyn_cast <cgraph_node *> (this))
1362 : 48596023 : node->verify_node ();
1363 : : else
1364 : 31528409 : if (verify_base ())
1365 : : {
1366 : 0 : debug ();
1367 : 0 : internal_error ("symtab_node::verify failed");
1368 : : }
1369 : 80124432 : timevar_pop (TV_CGRAPH_VERIFY);
1370 : : }
1371 : :
1372 : : /* Return true and set *DATA to true if NODE is an ifunc resolver. */
1373 : :
1374 : : static bool
1375 : 5277605 : check_ifunc_resolver (cgraph_node *node, void *data)
1376 : : {
1377 : 5277605 : if (node->ifunc_resolver)
1378 : : {
1379 : 400 : bool *is_ifunc_resolver = (bool *) data;
1380 : 400 : *is_ifunc_resolver = true;
1381 : 400 : return true;
1382 : : }
1383 : : return false;
1384 : : }
1385 : :
1386 : : static bitmap ifunc_ref_map;
1387 : :
1388 : : /* Return true if any caller of NODE is an ifunc resolver. */
1389 : :
1390 : : static bool
1391 : 4922446 : is_caller_ifunc_resolver (cgraph_node *node)
1392 : : {
1393 : 4922446 : bool is_ifunc_resolver = false;
1394 : :
1395 : 14305091 : for (cgraph_edge *e = node->callers; e; e = e->next_caller)
1396 : : {
1397 : : /* Return true if caller is known to be an IFUNC resolver. */
1398 : 9382923 : if (e->caller->called_by_ifunc_resolver)
1399 : : return true;
1400 : :
1401 : : /* Check for recursive call. */
1402 : 9382783 : if (e->caller == node)
1403 : 10195 : continue;
1404 : :
1405 : : /* Skip if it has been visited. */
1406 : 9372588 : unsigned int uid = e->caller->get_uid ();
1407 : 9372588 : if (!bitmap_set_bit (ifunc_ref_map, uid))
1408 : 7637499 : continue;
1409 : :
1410 : 1735089 : if (is_caller_ifunc_resolver (e->caller))
1411 : : {
1412 : : /* Return true if caller is an IFUNC resolver. */
1413 : 22 : e->caller->called_by_ifunc_resolver = true;
1414 : 22 : return true;
1415 : : }
1416 : :
1417 : : /* Check if caller's alias is an IFUNC resolver. */
1418 : 1735067 : e->caller->call_for_symbol_and_aliases (check_ifunc_resolver,
1419 : : &is_ifunc_resolver,
1420 : : true);
1421 : 1735067 : if (is_ifunc_resolver)
1422 : : {
1423 : : /* Return true if caller's alias is an IFUNC resolver. */
1424 : 116 : e->caller->called_by_ifunc_resolver = true;
1425 : 116 : return true;
1426 : : }
1427 : : }
1428 : :
1429 : : return false;
1430 : : }
1431 : :
1432 : : /* Check symbol table for callees of IFUNC resolvers. */
1433 : :
1434 : : void
1435 : 237991 : symtab_node::check_ifunc_callee_symtab_nodes (void)
1436 : : {
1437 : 237991 : symtab_node *node;
1438 : :
1439 : 237991 : bitmap_obstack_initialize (NULL);
1440 : 237991 : ifunc_ref_map = BITMAP_ALLOC (NULL);
1441 : :
1442 : 8446123 : FOR_EACH_SYMBOL (node)
1443 : : {
1444 : 8208132 : cgraph_node *cnode = dyn_cast <cgraph_node *> (node);
1445 : 8208132 : if (!cnode)
1446 : 5020491 : continue;
1447 : :
1448 : 4922730 : unsigned int uid = cnode->get_uid ();
1449 : 4922730 : if (bitmap_bit_p (ifunc_ref_map, uid))
1450 : 1735089 : continue;
1451 : 3187641 : bitmap_set_bit (ifunc_ref_map, uid);
1452 : :
1453 : 3187641 : bool is_ifunc_resolver = false;
1454 : 3187641 : cnode->call_for_symbol_and_aliases (check_ifunc_resolver,
1455 : : &is_ifunc_resolver, true);
1456 : 3187641 : if (is_ifunc_resolver || is_caller_ifunc_resolver (cnode))
1457 : 540 : cnode->called_by_ifunc_resolver = true;
1458 : : }
1459 : :
1460 : 237991 : BITMAP_FREE (ifunc_ref_map);
1461 : 237991 : bitmap_obstack_release (NULL);
1462 : 237991 : }
1463 : :
1464 : : /* Verify symbol table for internal consistency. */
1465 : :
1466 : : DEBUG_FUNCTION void
1467 : 2119961 : symtab_node::verify_symtab_nodes (void)
1468 : : {
1469 : 2119961 : symtab_node *node;
1470 : 2119961 : hash_map<tree, symtab_node *> comdat_head_map (251);
1471 : 2119961 : asm_node *anode;
1472 : :
1473 : 2238411 : for (anode = symtab->first_asm_symbol (); anode; anode = anode->next)
1474 : 118450 : if (anode->order < 0 || anode->order >= symtab->order)
1475 : : {
1476 : 0 : error ("invalid order in asm node %i", anode->order);
1477 : 0 : internal_error ("symtab_node::verify failed");
1478 : : }
1479 : :
1480 : 72842694 : FOR_EACH_SYMBOL (node)
1481 : : {
1482 : 70722733 : node->verify ();
1483 : 70722733 : if (node->get_comdat_group ())
1484 : : {
1485 : 9658676 : symtab_node **entry, *s;
1486 : 9658676 : bool existed;
1487 : :
1488 : 9658676 : entry = &comdat_head_map.get_or_insert (node->get_comdat_group (),
1489 : : &existed);
1490 : 9658676 : if (!existed)
1491 : 8379512 : *entry = node;
1492 : 1279164 : else if (!DECL_EXTERNAL (node->decl))
1493 : : {
1494 : 1279018 : for (s = (*entry)->same_comdat_group;
1495 : 2429421 : s != NULL && s != node && s != *entry;
1496 : 1150403 : s = s->same_comdat_group)
1497 : : ;
1498 : 1279018 : if (!s || s == *entry)
1499 : : {
1500 : 0 : error ("Two symbols with same comdat_group are not linked by "
1501 : : "the same_comdat_group list.");
1502 : 0 : (*entry)->debug ();
1503 : 0 : node->debug ();
1504 : 0 : internal_error ("symtab_node::verify failed");
1505 : : }
1506 : : }
1507 : : }
1508 : : }
1509 : 2119961 : }
1510 : :
1511 : : #if __GNUC__ >= 10
1512 : : # pragma GCC diagnostic pop
1513 : : #endif
1514 : :
1515 : : /* Make DECL local. FIXME: We shouldn't need to mess with rtl this early,
1516 : : but other code such as notice_global_symbol generates rtl. */
1517 : :
1518 : : void
1519 : 3571477 : symtab_node::make_decl_local (void)
1520 : : {
1521 : 3571477 : rtx rtl, symbol;
1522 : :
1523 : 3571477 : if (weakref)
1524 : : {
1525 : 0 : weakref = false;
1526 : 0 : IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl)) = 0;
1527 : 0 : TREE_CHAIN (DECL_ASSEMBLER_NAME (decl)) = NULL_TREE;
1528 : 0 : symtab->change_decl_assembler_name
1529 : 0 : (decl, DECL_ASSEMBLER_NAME (get_alias_target ()->decl));
1530 : 0 : DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
1531 : 0 : DECL_ATTRIBUTES (decl));
1532 : : }
1533 : : /* Avoid clearing comdat_groups on comdat-local decls. */
1534 : 3571477 : else if (TREE_PUBLIC (decl) == 0)
1535 : 3571463 : return;
1536 : :
1537 : : /* Localizing a symbol also make all its transparent aliases local. */
1538 : : ipa_ref *ref;
1539 : 97506 : for (unsigned i = 0; iterate_direct_aliases (i, ref); i++)
1540 : : {
1541 : 1819 : struct symtab_node *alias = ref->referring;
1542 : 1819 : if (alias->transparent_alias)
1543 : 5 : alias->make_decl_local ();
1544 : : }
1545 : :
1546 : 95687 : if (VAR_P (decl))
1547 : : {
1548 : 11983 : DECL_COMMON (decl) = 0;
1549 : : /* ADDRESSABLE flag is not defined for public symbols. */
1550 : 11983 : TREE_ADDRESSABLE (decl) = 1;
1551 : 11983 : TREE_STATIC (decl) = 1;
1552 : : }
1553 : : else
1554 : 83704 : gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1555 : :
1556 : 95687 : DECL_COMDAT (decl) = 0;
1557 : 95687 : DECL_WEAK (decl) = 0;
1558 : 95687 : DECL_EXTERNAL (decl) = 0;
1559 : 95687 : DECL_VISIBILITY_SPECIFIED (decl) = 0;
1560 : 95687 : DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
1561 : 95687 : TREE_PUBLIC (decl) = 0;
1562 : 95687 : DECL_DLLIMPORT_P (decl) = 0;
1563 : 95687 : if (!DECL_RTL_SET_P (decl))
1564 : : return;
1565 : :
1566 : : /* Update rtl flags. */
1567 : 14 : make_decl_rtl (decl);
1568 : :
1569 : 14 : rtl = DECL_RTL (decl);
1570 : 14 : if (!MEM_P (rtl))
1571 : : return;
1572 : :
1573 : 14 : symbol = XEXP (rtl, 0);
1574 : 14 : if (GET_CODE (symbol) != SYMBOL_REF)
1575 : : return;
1576 : :
1577 : 14 : SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
1578 : : }
1579 : :
1580 : : /* Copy visibility from N.
1581 : : This is useful when THIS becomes a transparent alias of N. */
1582 : :
1583 : : void
1584 : 0 : symtab_node::copy_visibility_from (symtab_node *n)
1585 : : {
1586 : 0 : gcc_checking_assert (n->weakref == weakref);
1587 : :
1588 : : ipa_ref *ref;
1589 : 0 : for (unsigned i = 0; iterate_direct_aliases (i, ref); i++)
1590 : : {
1591 : 0 : struct symtab_node *alias = ref->referring;
1592 : 0 : if (alias->transparent_alias)
1593 : 0 : alias->copy_visibility_from (n);
1594 : : }
1595 : :
1596 : 0 : if (VAR_P (decl))
1597 : : {
1598 : 0 : DECL_COMMON (decl) = DECL_COMMON (n->decl);
1599 : : /* ADDRESSABLE flag is not defined for public symbols. */
1600 : 0 : if (TREE_PUBLIC (decl) && !TREE_PUBLIC (n->decl))
1601 : 0 : TREE_ADDRESSABLE (decl) = 1;
1602 : 0 : TREE_STATIC (decl) = TREE_STATIC (n->decl);
1603 : : }
1604 : 0 : else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1605 : :
1606 : 0 : DECL_COMDAT (decl) = DECL_COMDAT (n->decl);
1607 : 0 : DECL_WEAK (decl) = DECL_WEAK (n->decl);
1608 : 0 : DECL_EXTERNAL (decl) = DECL_EXTERNAL (n->decl);
1609 : 0 : DECL_VISIBILITY_SPECIFIED (decl) = DECL_VISIBILITY_SPECIFIED (n->decl);
1610 : 0 : DECL_VISIBILITY (decl) = DECL_VISIBILITY (n->decl);
1611 : 0 : TREE_PUBLIC (decl) = TREE_PUBLIC (n->decl);
1612 : 0 : DECL_DLLIMPORT_P (decl) = DECL_DLLIMPORT_P (n->decl);
1613 : 0 : resolution = n->resolution;
1614 : 0 : set_comdat_group (n->get_comdat_group ());
1615 : 0 : set_section (*n);
1616 : 0 : externally_visible = n->externally_visible;
1617 : 0 : if (!DECL_RTL_SET_P (decl))
1618 : 0 : return;
1619 : :
1620 : : /* Update rtl flags. */
1621 : 0 : make_decl_rtl (decl);
1622 : :
1623 : 0 : rtx rtl = DECL_RTL (decl);
1624 : 0 : if (!MEM_P (rtl))
1625 : : return;
1626 : :
1627 : 0 : rtx symbol = XEXP (rtl, 0);
1628 : 0 : if (GET_CODE (symbol) != SYMBOL_REF)
1629 : : return;
1630 : :
1631 : 0 : SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
1632 : : }
1633 : :
1634 : : /* Walk the alias chain to return the symbol NODE is alias of.
1635 : : If NODE is not an alias, return NODE.
1636 : : Assumes NODE is known to be alias. */
1637 : :
1638 : : symtab_node *
1639 : 31604047 : symtab_node::ultimate_alias_target_1 (enum availability *availability,
1640 : : symtab_node *ref)
1641 : : {
1642 : 31604047 : bool transparent_p = false;
1643 : :
1644 : : /* To determine visibility of the target, we follow ELF semantic of aliases.
1645 : : Here alias is an alternative assembler name of a given definition. Its
1646 : : availability prevails the availability of its target (i.e. static alias of
1647 : : weak definition is available.
1648 : :
1649 : : Transparent alias is just alternative name of a given symbol used within
1650 : : one compilation unit and is translated prior hitting the object file. It
1651 : : inherits the visibility of its target.
1652 : : Weakref is a different animal (and noweak definition is weak).
1653 : :
1654 : : If we ever get into supporting targets with different semantics, a target
1655 : : hook will be needed here. */
1656 : :
1657 : 31604047 : if (availability)
1658 : : {
1659 : 9660134 : transparent_p = transparent_alias;
1660 : 9660134 : if (!transparent_p)
1661 : 9654359 : *availability = get_availability (ref);
1662 : : else
1663 : 5775 : *availability = AVAIL_NOT_AVAILABLE;
1664 : : }
1665 : :
1666 : : symtab_node *node = this;
1667 : 63201854 : while (node)
1668 : : {
1669 : 63201854 : if (node->alias && node->analyzed)
1670 : 31597807 : node = node->get_alias_target ();
1671 : : else
1672 : : {
1673 : 31604047 : if (!availability || (!transparent_p && node->analyzed))
1674 : : ;
1675 : 44278 : else if (node->analyzed && !node->transparent_alias)
1676 : 310 : *availability = node->get_availability (ref);
1677 : : else
1678 : 43968 : *availability = AVAIL_NOT_AVAILABLE;
1679 : 31604047 : return node;
1680 : : }
1681 : 31597807 : if (node && availability && transparent_p
1682 : 446 : && node->transparent_alias)
1683 : : {
1684 : 22 : *availability = node->get_availability (ref);
1685 : 22 : transparent_p = false;
1686 : : }
1687 : : }
1688 : 0 : if (availability)
1689 : 0 : *availability = AVAIL_NOT_AVAILABLE;
1690 : : return NULL;
1691 : : }
1692 : :
1693 : : /* C++ FE sometimes change linkage flags after producing same body aliases.
1694 : :
1695 : : FIXME: C++ produce implicit aliases for virtual functions and vtables that
1696 : : are obviously equivalent. The way it is doing so is however somewhat
1697 : : kludgy and interferes with the visibility code. As a result we need to
1698 : : copy the visibility from the target to get things right. */
1699 : :
1700 : : void
1701 : 6942391 : symtab_node::fixup_same_cpp_alias_visibility (symtab_node *target)
1702 : : {
1703 : 6942391 : if (is_a <cgraph_node *> (this))
1704 : : {
1705 : 20812062 : DECL_DECLARED_INLINE_P (decl)
1706 : 6937354 : = DECL_DECLARED_INLINE_P (target->decl);
1707 : 20812062 : DECL_DISREGARD_INLINE_LIMITS (decl)
1708 : 6937354 : = DECL_DISREGARD_INLINE_LIMITS (target->decl);
1709 : : }
1710 : : /* FIXME: It is not really clear why those flags should not be copied for
1711 : : functions, too. */
1712 : : else
1713 : : {
1714 : 5037 : DECL_WEAK (decl) = DECL_WEAK (target->decl);
1715 : 5037 : DECL_EXTERNAL (decl) = DECL_EXTERNAL (target->decl);
1716 : 5037 : DECL_VISIBILITY (decl) = DECL_VISIBILITY (target->decl);
1717 : : }
1718 : 6942391 : if (TREE_PUBLIC (decl))
1719 : : {
1720 : 6916133 : tree group;
1721 : :
1722 : 6916133 : DECL_EXTERNAL (decl) = DECL_EXTERNAL (target->decl);
1723 : 6916133 : DECL_COMDAT (decl) = DECL_COMDAT (target->decl);
1724 : 6916133 : group = target->get_comdat_group ();
1725 : 6916133 : set_comdat_group (group);
1726 : 6916133 : if (group && !same_comdat_group)
1727 : 0 : add_to_same_comdat_group (target);
1728 : : }
1729 : 6942391 : externally_visible = target->externally_visible;
1730 : 6942391 : }
1731 : :
1732 : : /* Set section, do not recurse into aliases.
1733 : : When one wants to change section of a symbol and its aliases,
1734 : : use set_section. */
1735 : :
1736 : : void
1737 : 109700204 : symtab_node::set_section_for_node (const char *section)
1738 : : {
1739 : 109700204 : const char *current = get_section ();
1740 : :
1741 : 109700204 : if (current == section
1742 : 1841924 : || (current && section
1743 : 0 : && !strcmp (current, section)))
1744 : : return;
1745 : :
1746 : 1841924 : release_section_hash_entry (x_section);
1747 : 1841924 : if (!section)
1748 : : {
1749 : 27079 : x_section = NULL;
1750 : 27079 : implicit_section = false;
1751 : 27079 : return;
1752 : : }
1753 : 1814845 : if (!symtab->section_hash)
1754 : 34443 : symtab->section_hash = hash_table<section_name_hasher>::create_ggc (10);
1755 : 1814845 : section_hash_entry **slot = symtab->section_hash->find_slot_with_hash
1756 : 1814845 : (section, htab_hash_string (section), INSERT);
1757 : 1814845 : if (*slot)
1758 : 40144 : x_section = retain_section_hash_entry (*slot);
1759 : : else
1760 : : {
1761 : 1774701 : int len = strlen (section);
1762 : 1774701 : *slot = x_section = ggc_cleared_alloc<section_hash_entry> ();
1763 : 1774701 : x_section->ref_count = 1;
1764 : 1774701 : x_section->name = ggc_vec_alloc<char> (len + 1);
1765 : 1774701 : memcpy (x_section->name, section, len + 1);
1766 : : }
1767 : : }
1768 : :
1769 : : /* Set the section of node THIS to be the same as the section
1770 : : of node OTHER. Keep reference counts of the sections
1771 : : up-to-date as needed. */
1772 : :
1773 : : void
1774 : 19762889 : symtab_node::set_section_for_node (const symtab_node &other)
1775 : : {
1776 : 19762889 : if (x_section == other.x_section)
1777 : : return;
1778 : 7361 : if (get_section () && other.get_section ())
1779 : 582 : gcc_checking_assert (strcmp (get_section (), other.get_section ()) != 0);
1780 : 6779 : release_section_hash_entry (x_section);
1781 : 6779 : if (other.x_section)
1782 : 6771 : x_section = retain_section_hash_entry (other.x_section);
1783 : : else
1784 : : {
1785 : 8 : x_section = NULL;
1786 : 8 : implicit_section = false;
1787 : : }
1788 : : }
1789 : :
1790 : : /* Workers for set_section. */
1791 : :
1792 : : bool
1793 : 1821296 : symtab_node::set_section_from_string (symtab_node *n, void *s)
1794 : : {
1795 : 1821296 : n->set_section_for_node ((char *)s);
1796 : 1821296 : return false;
1797 : : }
1798 : :
1799 : : /* Set the section of node N to be the same as the section
1800 : : of node O. */
1801 : :
1802 : : bool
1803 : 19762889 : symtab_node::set_section_from_node (symtab_node *n, void *o)
1804 : : {
1805 : 19762889 : const symtab_node &other = *static_cast<const symtab_node *> (o);
1806 : 19762889 : n->set_section_for_node (other);
1807 : 19762889 : return false;
1808 : : }
1809 : :
1810 : : /* Set section of symbol and its aliases. */
1811 : :
1812 : : void
1813 : 1779677 : symtab_node::set_section (const char *section)
1814 : : {
1815 : 1779677 : gcc_assert (!this->alias || !this->analyzed);
1816 : 1779677 : call_for_symbol_and_aliases
1817 : 1779677 : (symtab_node::set_section_from_string, const_cast<char *>(section), true);
1818 : 1779677 : }
1819 : :
1820 : : void
1821 : 19762646 : symtab_node::set_section (const symtab_node &other)
1822 : : {
1823 : 19762646 : call_for_symbol_and_aliases
1824 : 19762646 : (symtab_node::set_section_from_node, const_cast<symtab_node *>(&other), true);
1825 : 19762646 : }
1826 : :
1827 : : /* Return the initialization priority. */
1828 : :
1829 : : priority_type
1830 : 40034 : symtab_node::get_init_priority ()
1831 : : {
1832 : 40034 : if (!this->in_init_priority_hash)
1833 : : return DEFAULT_INIT_PRIORITY;
1834 : :
1835 : 3791 : symbol_priority_map *h = symtab->init_priority_hash->get (this);
1836 : 3791 : return h ? h->init : DEFAULT_INIT_PRIORITY;
1837 : : }
1838 : :
1839 : : /* Return the finalization priority. */
1840 : :
1841 : : priority_type
1842 : 1831 : cgraph_node::get_fini_priority ()
1843 : : {
1844 : 1831 : if (!this->in_init_priority_hash)
1845 : : return DEFAULT_INIT_PRIORITY;
1846 : 1759 : symbol_priority_map *h = symtab->init_priority_hash->get (this);
1847 : 1759 : return h ? h->fini : DEFAULT_INIT_PRIORITY;
1848 : : }
1849 : :
1850 : : /* Return the initialization and finalization priority information for
1851 : : DECL. If there is no previous priority information, a freshly
1852 : : allocated structure is returned. */
1853 : :
1854 : : symbol_priority_map *
1855 : 5151 : symtab_node::priority_info (void)
1856 : : {
1857 : 5151 : if (!symtab->init_priority_hash)
1858 : 3465 : symtab->init_priority_hash = hash_map<symtab_node *, symbol_priority_map>::create_ggc (13);
1859 : :
1860 : 5151 : bool existed;
1861 : 5151 : symbol_priority_map *h
1862 : 5151 : = &symtab->init_priority_hash->get_or_insert (this, &existed);
1863 : 5151 : if (!existed)
1864 : : {
1865 : 5131 : h->init = DEFAULT_INIT_PRIORITY;
1866 : 5131 : h->fini = DEFAULT_INIT_PRIORITY;
1867 : 5131 : in_init_priority_hash = true;
1868 : : }
1869 : :
1870 : 5151 : return h;
1871 : : }
1872 : :
1873 : : /* Set initialization priority to PRIORITY. */
1874 : :
1875 : : void
1876 : 22222 : symtab_node::set_init_priority (priority_type priority)
1877 : : {
1878 : 22222 : symbol_priority_map *h;
1879 : :
1880 : 22222 : if (is_a <cgraph_node *> (this))
1881 : 22193 : gcc_assert (DECL_STATIC_CONSTRUCTOR (this->decl));
1882 : :
1883 : 22222 : if (priority == DEFAULT_INIT_PRIORITY)
1884 : : {
1885 : 18627 : gcc_assert (get_init_priority() == priority);
1886 : : return;
1887 : : }
1888 : 3595 : h = priority_info ();
1889 : 3595 : h->init = priority;
1890 : : }
1891 : :
1892 : : /* Set finalization priority to PRIORITY. */
1893 : :
1894 : : void
1895 : 1569 : cgraph_node::set_fini_priority (priority_type priority)
1896 : : {
1897 : 1569 : symbol_priority_map *h;
1898 : :
1899 : 1569 : gcc_assert (DECL_STATIC_DESTRUCTOR (this->decl));
1900 : :
1901 : 1569 : if (priority == DEFAULT_INIT_PRIORITY)
1902 : : {
1903 : 13 : gcc_assert (get_fini_priority() == priority);
1904 : : return;
1905 : : }
1906 : 1556 : h = priority_info ();
1907 : 1556 : h->fini = priority;
1908 : : }
1909 : :
1910 : : /* Worker for symtab_resolve_alias. */
1911 : :
1912 : : bool
1913 : 3117 : symtab_node::set_implicit_section (symtab_node *n,
1914 : : void *data ATTRIBUTE_UNUSED)
1915 : : {
1916 : 3117 : n->implicit_section = true;
1917 : 3117 : return false;
1918 : : }
1919 : :
1920 : : /* Add reference recording that symtab node is alias of TARGET.
1921 : : The function can fail in the case of aliasing cycles; in this case
1922 : : it returns false. */
1923 : :
1924 : : bool
1925 : 6630862 : symtab_node::resolve_alias (symtab_node *target, bool transparent)
1926 : : {
1927 : 6630862 : symtab_node *n;
1928 : :
1929 : 6630862 : gcc_assert (!analyzed && !ref_list.references.length ());
1930 : :
1931 : : /* Never let cycles to creep into the symbol table alias references;
1932 : : those will make alias walkers to be infinite. */
1933 : 6682033 : for (n = target; n && n->alias;
1934 : 51171 : n = n->analyzed ? n->get_alias_target () : NULL)
1935 : 51173 : if (n == this)
1936 : : {
1937 : 2 : if (is_a <cgraph_node *> (this))
1938 : 2 : error ("function %q+D part of alias cycle", decl);
1939 : 0 : else if (is_a <varpool_node *> (this))
1940 : 0 : error ("variable %q+D part of alias cycle", decl);
1941 : : else
1942 : 0 : gcc_unreachable ();
1943 : 2 : alias = false;
1944 : 2 : return false;
1945 : : }
1946 : :
1947 : : /* "analyze" the node - i.e. mark the reference. */
1948 : 6630860 : definition = true;
1949 : 6630860 : alias = true;
1950 : 6630860 : analyzed = true;
1951 : 6630860 : transparent |= transparent_alias;
1952 : 6630860 : transparent_alias = transparent;
1953 : 6630860 : if (transparent)
1954 : 54 : while (target->transparent_alias && target->analyzed)
1955 : 0 : target = target->get_alias_target ();
1956 : 6630860 : create_reference (target, IPA_REF_ALIAS, NULL);
1957 : :
1958 : : /* Add alias into the comdat group of its target unless it is already there. */
1959 : 6630860 : if (same_comdat_group)
1960 : 3074527 : remove_from_same_comdat_group ();
1961 : 6630860 : set_comdat_group (NULL);
1962 : 6630860 : if (target->get_comdat_group ())
1963 : 6358572 : add_to_same_comdat_group (target);
1964 : :
1965 : 6630873 : if ((get_section () != target->get_section ()
1966 : 6630865 : || target->get_comdat_group ()) && get_section () && !implicit_section)
1967 : : {
1968 : 2 : error ("section of alias %q+D must match section of its target", decl);
1969 : : }
1970 : 6630860 : set_section (*target);
1971 : 6630860 : if (target->implicit_section)
1972 : 2935 : call_for_symbol_and_aliases (set_implicit_section, NULL, true);
1973 : :
1974 : : /* Alias targets become redundant after alias is resolved into an reference.
1975 : : We do not want to keep it around or we would have to mind updating them
1976 : : when renaming symbols. */
1977 : 6630860 : alias_target = NULL;
1978 : :
1979 : 6630860 : if (!transparent && cpp_implicit_alias && symtab->state >= CONSTRUCTION)
1980 : 136831 : fixup_same_cpp_alias_visibility (target);
1981 : :
1982 : : /* If alias has address taken, so does the target. */
1983 : 6630860 : if (address_taken)
1984 : 982 : target->ultimate_alias_target ()->address_taken = true;
1985 : :
1986 : : /* All non-transparent aliases of THIS are now in fact aliases of TARGET.
1987 : : If alias is transparent, also all transparent aliases of THIS are now
1988 : : aliases of TARGET.
1989 : : Also merge same comdat group lists. */
1990 : : ipa_ref *ref;
1991 : 6631103 : for (unsigned i = 0; iterate_direct_aliases (i, ref);)
1992 : : {
1993 : 243 : struct symtab_node *alias_alias = ref->referring;
1994 : 243 : if (alias_alias->get_comdat_group ())
1995 : : {
1996 : 180 : alias_alias->remove_from_same_comdat_group ();
1997 : 180 : alias_alias->set_comdat_group (NULL);
1998 : 180 : if (target->get_comdat_group ())
1999 : 180 : alias_alias->add_to_same_comdat_group (target);
2000 : : }
2001 : 243 : if ((!alias_alias->transparent_alias
2002 : 243 : && !alias_alias->symver)
2003 : 12 : || transparent)
2004 : : {
2005 : 243 : alias_alias->remove_all_references ();
2006 : 243 : alias_alias->create_reference (target, IPA_REF_ALIAS, NULL);
2007 : : }
2008 : 0 : else i++;
2009 : : }
2010 : : return true;
2011 : : }
2012 : :
2013 : : /* Worker searching noninterposable alias. */
2014 : :
2015 : : bool
2016 : 58303 : symtab_node::noninterposable_alias (symtab_node *node, void *data)
2017 : : {
2018 : 58303 : if (!node->transparent_alias && decl_binds_to_current_def_p (node->decl))
2019 : : {
2020 : 55775 : symtab_node *fn = node->ultimate_alias_target ();
2021 : :
2022 : : /* Ensure that the alias is well formed this may not be the case
2023 : : of user defined aliases and currently it is not always the case
2024 : : of C++ same body aliases (that is a bug). */
2025 : 55775 : if (TREE_TYPE (node->decl) != TREE_TYPE (fn->decl)
2026 : 55775 : || DECL_CONTEXT (node->decl) != DECL_CONTEXT (fn->decl)
2027 : 55775 : || (TREE_CODE (node->decl) == FUNCTION_DECL
2028 : 111550 : && flags_from_decl_or_type (node->decl)
2029 : 55775 : != flags_from_decl_or_type (fn->decl))
2030 : 111532 : || DECL_ATTRIBUTES (node->decl) != DECL_ATTRIBUTES (fn->decl))
2031 : 22 : return false;
2032 : 55753 : *(symtab_node **)data = node;
2033 : 55753 : return true;
2034 : : }
2035 : : return false;
2036 : : }
2037 : :
2038 : : /* If node cannot be overwriten by static or dynamic linker to point to
2039 : : different definition, return NODE. Otherwise look for alias with such
2040 : : property and if none exists, introduce new one. */
2041 : :
2042 : : symtab_node *
2043 : 56998 : symtab_node::noninterposable_alias (void)
2044 : : {
2045 : 56998 : tree new_decl;
2046 : 56998 : symtab_node *new_node = NULL;
2047 : :
2048 : : /* First try to look up existing alias or base object
2049 : : (if that is already non-overwritable). */
2050 : 56998 : symtab_node *node = ultimate_alias_target ();
2051 : 56998 : gcc_assert (!node->alias && !node->weakref);
2052 : 56998 : node->call_for_symbol_and_aliases (symtab_node::noninterposable_alias,
2053 : : (void *)&new_node, true);
2054 : 56998 : if (new_node)
2055 : : return new_node;
2056 : :
2057 : : /* If aliases aren't supported by the assembler, fail. */
2058 : 1245 : if (!TARGET_SUPPORTS_ALIASES)
2059 : : return NULL;
2060 : 1245 : else if (lookup_attribute ("target_clones", DECL_ATTRIBUTES (node->decl)))
2061 : : return NULL;
2062 : :
2063 : : /* Otherwise create a new one. */
2064 : 1244 : new_decl = copy_node (node->decl);
2065 : 1244 : DECL_DLLIMPORT_P (new_decl) = 0;
2066 : 1244 : tree name = clone_function_name (node->decl, "localalias");
2067 : 1244 : if (!flag_wpa)
2068 : : {
2069 : : unsigned long num = 0;
2070 : : /* In the rare case we already have a localalias, but the above
2071 : : node->call_for_symbol_and_aliases call didn't find any suitable,
2072 : : iterate until we find one not used yet. */
2073 : 1238 : while (symtab_node::get_for_asmname (name))
2074 : 0 : name = clone_function_name (node->decl, "localalias", num++);
2075 : : }
2076 : 1244 : DECL_NAME (new_decl) = name;
2077 : 1244 : if (TREE_CODE (new_decl) == FUNCTION_DECL)
2078 : 1242 : DECL_STRUCT_FUNCTION (new_decl) = NULL;
2079 : 1244 : DECL_INITIAL (new_decl) = NULL;
2080 : 1244 : SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
2081 : 1244 : SET_DECL_RTL (new_decl, NULL);
2082 : :
2083 : : /* Update the properties. */
2084 : 1244 : DECL_EXTERNAL (new_decl) = 0;
2085 : 1244 : TREE_PUBLIC (new_decl) = 0;
2086 : 1244 : DECL_COMDAT (new_decl) = 0;
2087 : 1244 : DECL_WEAK (new_decl) = 0;
2088 : :
2089 : : /* Since the aliases can be added to vtables, keep DECL_VIRTUAL flag. */
2090 : 1244 : DECL_VIRTUAL_P (new_decl) = DECL_VIRTUAL_P (node->decl);
2091 : 1244 : if (TREE_CODE (new_decl) == FUNCTION_DECL)
2092 : : {
2093 : 1242 : DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
2094 : 1242 : DECL_STATIC_DESTRUCTOR (new_decl) = 0;
2095 : 1242 : new_node = cgraph_node::create_alias (new_decl, node->decl);
2096 : :
2097 : 2484 : cgraph_node *new_cnode = dyn_cast <cgraph_node *> (new_node),
2098 : 1242 : *cnode = dyn_cast <cgraph_node *> (node);
2099 : :
2100 : 1242 : new_cnode->unit_id = cnode->unit_id;
2101 : 1242 : new_cnode->merged_comdat = cnode->merged_comdat;
2102 : 1242 : new_cnode->merged_extern_inline = cnode->merged_extern_inline;
2103 : : }
2104 : : else
2105 : : {
2106 : 2 : TREE_READONLY (new_decl) = TREE_READONLY (node->decl);
2107 : 2 : DECL_INITIAL (new_decl) = error_mark_node;
2108 : 2 : new_node = varpool_node::create_alias (new_decl, node->decl);
2109 : : }
2110 : 1244 : new_node->resolve_alias (node);
2111 : 1244 : gcc_assert (decl_binds_to_current_def_p (new_decl)
2112 : : && targetm.binds_local_p (new_decl));
2113 : 1244 : return new_node;
2114 : : }
2115 : :
2116 : : /* Return true if symtab node and TARGET represents
2117 : : semantically equivalent symbols. */
2118 : :
2119 : : bool
2120 : 303978 : symtab_node::semantically_equivalent_p (symtab_node *target)
2121 : : {
2122 : 303978 : enum availability avail;
2123 : 303978 : symtab_node *ba;
2124 : 303978 : symtab_node *bb;
2125 : :
2126 : : /* Equivalent functions are equivalent. */
2127 : 303978 : if (decl == target->decl)
2128 : : return true;
2129 : :
2130 : : /* If symbol is not overwritable by different implementation,
2131 : : walk to the base object it defines. */
2132 : 231215 : ba = ultimate_alias_target (&avail);
2133 : 231215 : if (avail >= AVAIL_AVAILABLE)
2134 : : {
2135 : 39807 : if (target == ba)
2136 : : return true;
2137 : : }
2138 : : else
2139 : : ba = this;
2140 : 231200 : bb = target->ultimate_alias_target (&avail);
2141 : 231200 : if (avail >= AVAIL_AVAILABLE)
2142 : : {
2143 : 39439 : if (this == bb)
2144 : : return true;
2145 : : }
2146 : : else
2147 : : bb = target;
2148 : 231141 : return bb == ba;
2149 : : }
2150 : :
2151 : : /* Classify symbol symtab node for partitioning. */
2152 : :
2153 : : enum symbol_partitioning_class
2154 : 2268392 : symtab_node::get_partitioning_class (void)
2155 : : {
2156 : : /* Inline clones are always duplicated.
2157 : : This include external declarations. */
2158 : 2268392 : cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2159 : :
2160 : 2268392 : if (DECL_ABSTRACT_P (decl))
2161 : : return SYMBOL_EXTERNAL;
2162 : :
2163 : 2268392 : if (cnode && (cnode->inlined_to || cnode->declare_variant_alt))
2164 : : return SYMBOL_DUPLICATE;
2165 : :
2166 : : /* Transparent aliases are always duplicated. */
2167 : 2203292 : if (transparent_alias)
2168 : 66 : return definition ? SYMBOL_DUPLICATE : SYMBOL_EXTERNAL;
2169 : :
2170 : : /* External declarations are external. */
2171 : 2203226 : if (DECL_EXTERNAL (decl))
2172 : : return SYMBOL_EXTERNAL;
2173 : :
2174 : : /* Even static aliases of external functions as external. Those can happen
2175 : : when COMDAT got resolved to non-IL implementation. */
2176 : 2053956 : if (alias && DECL_EXTERNAL (ultimate_alias_target ()->decl))
2177 : : return SYMBOL_EXTERNAL;
2178 : :
2179 : 2053956 : if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
2180 : : {
2181 : 919698 : if (alias && definition && !ultimate_alias_target ()->definition)
2182 : : return SYMBOL_EXTERNAL;
2183 : : /* Constant pool references use local symbol names that cannot
2184 : : be promoted global. We should never put into a constant pool
2185 : : objects that cannot be duplicated across partitions. */
2186 : 919698 : if (DECL_IN_CONSTANT_POOL (decl))
2187 : : return SYMBOL_DUPLICATE;
2188 : 919526 : if (DECL_HARD_REGISTER (decl))
2189 : : return SYMBOL_DUPLICATE;
2190 : 919430 : gcc_checking_assert (vnode->definition);
2191 : : }
2192 : : /* Functions that are cloned may stay in callgraph even if they are unused.
2193 : : Handle them as external; compute_ltrans_boundary take care to make
2194 : : proper things to happen (i.e. to make them appear in the boundary but
2195 : : with body streamed, so clone can me materialized). */
2196 : 1134258 : else if (!dyn_cast <cgraph_node *> (this)->function_symbol ()->definition)
2197 : : return SYMBOL_EXTERNAL;
2198 : :
2199 : : /* Linker discardable symbols are duplicated to every use unless they are
2200 : : keyed. */
2201 : 2064317 : if (DECL_ONE_ONLY (decl)
2202 : : && !force_output
2203 : 13729 : && !forced_by_abi
2204 : 2062722 : && !used_from_object_file_p ())
2205 : : return SYMBOL_DUPLICATE;
2206 : :
2207 : : return SYMBOL_PARTITION;
2208 : : }
2209 : :
2210 : : /* Return true when symbol is known to be non-zero, assume that
2211 : : flag_delete_null_pointer_checks is equal to delete_null_pointer_checks. */
2212 : :
2213 : : bool
2214 : 13548884 : symtab_node::nonzero_address (bool delete_null_pointer_checks)
2215 : : {
2216 : : /* Weakrefs may be NULL when their target is not defined. */
2217 : 13548884 : if (alias && weakref)
2218 : : {
2219 : 2807 : if (analyzed)
2220 : : {
2221 : 196 : symtab_node *target = ultimate_alias_target ();
2222 : :
2223 : 196 : if (target->alias && target->weakref)
2224 : : return false;
2225 : : /* We cannot recurse to target::nonzero. It is possible that the
2226 : : target is used only via the alias.
2227 : : We may walk references and look for strong use, but we do not know
2228 : : if this strong use will survive to final binary, so be
2229 : : conservative here.
2230 : : ??? Maybe we could do the lookup during late optimization that
2231 : : could be useful to eliminate the NULL pointer checks in LTO
2232 : : programs. */
2233 : 0 : if (target->definition && !DECL_EXTERNAL (target->decl))
2234 : : return true;
2235 : 0 : if (target->resolution != LDPR_UNKNOWN
2236 : : && target->resolution != LDPR_UNDEF
2237 : 0 : && !target->can_be_discarded_p ()
2238 : 0 : && delete_null_pointer_checks)
2239 : : return true;
2240 : 0 : return false;
2241 : : }
2242 : : else
2243 : : return false;
2244 : : }
2245 : :
2246 : : /* With !flag_delete_null_pointer_checks we assume that symbols may
2247 : : bind to NULL. This is on by default on embedded targets only.
2248 : :
2249 : : Otherwise all non-WEAK symbols must be defined and thus non-NULL or
2250 : : linking fails. Important case of WEAK we want to do well are comdats,
2251 : : which also must be defined somewhere.
2252 : :
2253 : : When parsing, beware the cases when WEAK attribute is added later. */
2254 : 17013516 : if ((!DECL_WEAK (decl) || DECL_COMDAT (decl))
2255 : 14262397 : && delete_null_pointer_checks)
2256 : : {
2257 : 10784951 : refuse_visibility_changes = true;
2258 : 10784951 : return true;
2259 : : }
2260 : :
2261 : : /* If target is defined and not extern, we know it will be
2262 : : output and thus it will bind to non-NULL.
2263 : : Play safe for flag_delete_null_pointer_checks where weak definition may
2264 : : be re-defined by NULL. */
2265 : 2736821 : if (definition && !DECL_EXTERNAL (decl)
2266 : 5497946 : && (delete_null_pointer_checks || !DECL_WEAK (decl)))
2267 : : {
2268 : 2736092 : if (!DECL_WEAK (decl))
2269 : 8425 : refuse_visibility_changes = true;
2270 : 2736092 : return true;
2271 : : }
2272 : :
2273 : : /* As the last resort, check the resolution info. */
2274 : 25034 : if (resolution != LDPR_UNKNOWN
2275 : : && resolution != LDPR_UNDEF
2276 : 0 : && !can_be_discarded_p ()
2277 : 25034 : && delete_null_pointer_checks)
2278 : : return true;
2279 : : return false;
2280 : : }
2281 : :
2282 : : /* Return true when symbol is known to be non-zero. */
2283 : :
2284 : : bool
2285 : 13548267 : symtab_node::nonzero_address ()
2286 : : {
2287 : 13548267 : return nonzero_address (flag_delete_null_pointer_checks);
2288 : : }
2289 : :
2290 : : /* Return 0 if symbol is known to have different address than S2,
2291 : : Return 1 if symbol is known to have same address as S2,
2292 : : return -1 otherwise.
2293 : :
2294 : : If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
2295 : : and S2 is going to be accessed. This eliminates the situations when
2296 : : either THIS or S2 is NULL and is useful for comparing bases when deciding
2297 : : about memory aliasing. */
2298 : : int
2299 : 84360747 : symtab_node::equal_address_to (symtab_node *s2, bool memory_accessed)
2300 : : {
2301 : 84360747 : enum availability avail1, avail2;
2302 : :
2303 : : /* A Shortcut: equivalent symbols are always equivalent. */
2304 : 84360747 : if (this == s2)
2305 : : return 1;
2306 : :
2307 : : /* Unwind transparent aliases first; those are always equal to their
2308 : : target. */
2309 : 83792926 : if (this->transparent_alias && this->analyzed)
2310 : 0 : return this->get_alias_target ()->equal_address_to (s2);
2311 : 83792926 : while (s2->transparent_alias && s2->analyzed)
2312 : 0 : s2 = s2->get_alias_target();
2313 : :
2314 : 83792926 : if (this == s2)
2315 : : return 1;
2316 : :
2317 : : /* For non-interposable aliases, lookup and compare their actual definitions.
2318 : : Also check if the symbol needs to bind to given definition. */
2319 : 83792926 : symtab_node *rs1 = ultimate_alias_target (&avail1);
2320 : 83792926 : symtab_node *rs2 = s2->ultimate_alias_target (&avail2);
2321 : 83792926 : bool binds_local1 = rs1->analyzed && decl_binds_to_current_def_p (this->decl);
2322 : 83792926 : bool binds_local2 = rs2->analyzed && decl_binds_to_current_def_p (s2->decl);
2323 : 83792926 : bool really_binds_local1 = binds_local1;
2324 : 83792926 : bool really_binds_local2 = binds_local2;
2325 : :
2326 : : /* Addresses of vtables and virtual functions cannot be used by user
2327 : : code and are used only within speculation. In this case we may make
2328 : : symbol equivalent to its alias even if interposition may break this
2329 : : rule. Doing so will allow us to turn speculative inlining into
2330 : : non-speculative more aggressively. */
2331 : 83792926 : if (DECL_VIRTUAL_P (this->decl) && avail1 >= AVAIL_AVAILABLE)
2332 : : binds_local1 = true;
2333 : 83792926 : if (DECL_VIRTUAL_P (s2->decl) && avail2 >= AVAIL_AVAILABLE)
2334 : 83792926 : binds_local2 = true;
2335 : :
2336 : : /* If both definitions are available we know that even if they are bound
2337 : : to other unit they must be defined same way and therefore we can use
2338 : : equivalence test. */
2339 : 83792926 : if (rs1 != rs2 && avail1 >= AVAIL_AVAILABLE && avail2 >= AVAIL_AVAILABLE)
2340 : : binds_local1 = binds_local2 = true;
2341 : :
2342 : 83792926 : if (binds_local1 && binds_local2 && rs1 == rs2)
2343 : : {
2344 : : /* We made use of the fact that alias is not weak. */
2345 : 360 : if (rs1 != this)
2346 : 226 : refuse_visibility_changes = true;
2347 : 360 : if (rs2 != s2)
2348 : 134 : s2->refuse_visibility_changes = true;
2349 : 360 : return 1;
2350 : : }
2351 : :
2352 : : /* If both symbols may resolve to NULL, we cannot really prove them
2353 : : different. */
2354 : 83792566 : if (!memory_accessed && !nonzero_address () && !s2->nonzero_address ())
2355 : : return -1;
2356 : :
2357 : : /* Except for NULL, functions and variables never overlap. */
2358 : 83792505 : if (TREE_CODE (decl) != TREE_CODE (s2->decl))
2359 : : return 0;
2360 : :
2361 : : /* If one of the symbols is unresolved alias, punt. */
2362 : 83647557 : if (rs1->alias || rs2->alias)
2363 : : return -1;
2364 : :
2365 : : /* If we have a non-interposable definition of at least one of the symbols
2366 : : and the other symbol is different, we know other unit cannot interpose
2367 : : it to the first symbol; all aliases of the definition needs to be
2368 : : present in the current unit. */
2369 : 83647549 : if (((really_binds_local1 || really_binds_local2)
2370 : : /* If we have both definitions and they are different, we know they
2371 : : will be different even in units they binds to. */
2372 : 11418583 : || (binds_local1 && binds_local2))
2373 : 72310321 : && rs1 != rs2)
2374 : : {
2375 : : /* We make use of the fact that one symbol is not alias of the other
2376 : : and that the definition is non-interposable. */
2377 : 72310224 : refuse_visibility_changes = true;
2378 : 72310224 : s2->refuse_visibility_changes = true;
2379 : 72310224 : rs1->refuse_visibility_changes = true;
2380 : 72310224 : rs2->refuse_visibility_changes = true;
2381 : 72310224 : return 0;
2382 : : }
2383 : :
2384 : 11337325 : if (rs1 == rs2)
2385 : : return -1;
2386 : :
2387 : : /* If the FE tells us at least one of the decls will never be aliased nor
2388 : : overlapping with other vars in some other way, return 0. */
2389 : 11337221 : if (VAR_P (decl)
2390 : 11337221 : && (lookup_attribute ("non overlapping", DECL_ATTRIBUTES (decl))
2391 : 11334535 : || lookup_attribute ("non overlapping", DECL_ATTRIBUTES (s2->decl))))
2392 : 2659 : return 0;
2393 : :
2394 : : /* TODO: Alias oracle basically assume that addresses of global variables
2395 : : are different unless they are declared as alias of one to another while
2396 : : the code folding comparisons doesn't.
2397 : : We probably should be consistent and use this fact here, too, but for
2398 : : the moment return false only when we are called from the alias oracle.
2399 : : Return 0 in C constant initializers and C++ manifestly constant
2400 : : expressions, the likelyhood that different vars will be aliases is
2401 : : small and returning -1 lets us reject too many initializers. */
2402 : 11334562 : if (memory_accessed || folding_initializer)
2403 : : return 0;
2404 : :
2405 : : return -1;
2406 : : }
2407 : :
2408 : : /* Worker for call_for_symbol_and_aliases. */
2409 : :
2410 : : bool
2411 : 144278 : symtab_node::call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *,
2412 : : void *),
2413 : : void *data,
2414 : : bool include_overwritable)
2415 : : {
2416 : 144278 : ipa_ref *ref;
2417 : 309300 : FOR_EACH_ALIAS (this, ref)
2418 : : {
2419 : 166305 : symtab_node *alias = ref->referring;
2420 : 166305 : if (include_overwritable
2421 : 166305 : || alias->get_availability () > AVAIL_INTERPOSABLE)
2422 : 166305 : if (alias->call_for_symbol_and_aliases (callback, data,
2423 : : include_overwritable))
2424 : : return true;
2425 : : }
2426 : : return false;
2427 : : }
2428 : :
2429 : : /* Return true if address of N is possibly compared. */
2430 : :
2431 : : static bool
2432 : 601467 : address_matters_1 (symtab_node *n, void *)
2433 : : {
2434 : 601467 : struct ipa_ref *ref;
2435 : :
2436 : 601467 : if (!n->address_can_be_compared_p ())
2437 : : return false;
2438 : 589863 : if (n->externally_visible || n->force_output)
2439 : : return true;
2440 : :
2441 : 495168 : for (unsigned int i = 0; n->iterate_referring (i, ref); i++)
2442 : 441383 : if (ref->address_matters_p ())
2443 : : return true;
2444 : : return false;
2445 : : }
2446 : :
2447 : : /* Return true if symbol's address may possibly be compared to other
2448 : : symbol's address. */
2449 : :
2450 : : bool
2451 : 579330 : symtab_node::address_matters_p ()
2452 : : {
2453 : 579330 : gcc_assert (!alias);
2454 : 579330 : return call_for_symbol_and_aliases (address_matters_1, NULL, true);
2455 : : }
2456 : :
2457 : : /* Return true if symbol's alignment may be increased. */
2458 : :
2459 : : bool
2460 : 21810 : symtab_node::can_increase_alignment_p (void)
2461 : : {
2462 : 21810 : symtab_node *target = ultimate_alias_target ();
2463 : :
2464 : : /* For now support only variables. */
2465 : 21810 : if (!VAR_P (decl))
2466 : : return false;
2467 : :
2468 : : /* With -fno-toplevel-reorder we may have already output the constant. */
2469 : 21810 : if (TREE_ASM_WRITTEN (target->decl))
2470 : : return false;
2471 : :
2472 : : /* If target is already placed in an anchor, we cannot touch its
2473 : : alignment. */
2474 : 21123 : if (DECL_RTL_SET_P (target->decl)
2475 : 10304 : && MEM_P (DECL_RTL (target->decl))
2476 : 31427 : && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (DECL_RTL (target->decl), 0)))
2477 : : return false;
2478 : :
2479 : : /* Constant pool entries may be shared. */
2480 : 21123 : if (DECL_IN_CONSTANT_POOL (target->decl))
2481 : : return false;
2482 : :
2483 : : /* We cannot change alignment of symbols that may bind to symbols
2484 : : in other translation unit that may contain a definition with lower
2485 : : alignment. */
2486 : 19459 : if (!decl_binds_to_current_def_p (decl))
2487 : : return false;
2488 : :
2489 : : /* When compiling partition, be sure the symbol is not output by other
2490 : : partition. */
2491 : 13661 : if (flag_ltrans
2492 : 13661 : && (target->in_other_partition
2493 : 134 : || target->get_partitioning_class () == SYMBOL_DUPLICATE))
2494 : 0 : return false;
2495 : :
2496 : : /* Do not override the alignment as specified by the ABI when the used
2497 : : attribute is set. */
2498 : 13661 : if (DECL_PRESERVE_P (decl) || DECL_PRESERVE_P (target->decl))
2499 : : return false;
2500 : :
2501 : : /* Do not override explicit alignment set by the user when an explicit
2502 : : section name is also used. This is a common idiom used by many
2503 : : software projects. */
2504 : 13661 : if (DECL_SECTION_NAME (target->decl) != NULL && !target->implicit_section)
2505 : : return false;
2506 : :
2507 : : return true;
2508 : : }
2509 : :
2510 : : /* Worker for symtab_node::increase_alignment. */
2511 : :
2512 : : static bool
2513 : 6159 : increase_alignment_1 (symtab_node *n, void *v)
2514 : : {
2515 : 6159 : unsigned int align = (size_t)v;
2516 : 6159 : if (DECL_ALIGN (n->decl) < align
2517 : 6159 : && n->can_increase_alignment_p ())
2518 : : {
2519 : 4369 : SET_DECL_ALIGN (n->decl, align);
2520 : 4369 : DECL_USER_ALIGN (n->decl) = 1;
2521 : : }
2522 : 6159 : return false;
2523 : : }
2524 : :
2525 : : /* Increase alignment of THIS to ALIGN. */
2526 : :
2527 : : void
2528 : 4455 : symtab_node::increase_alignment (unsigned int align)
2529 : : {
2530 : 4455 : gcc_assert (can_increase_alignment_p () && align <= MAX_OFILE_ALIGNMENT);
2531 : 4455 : ultimate_alias_target()->call_for_symbol_and_aliases (increase_alignment_1,
2532 : 4455 : (void *)(size_t) align,
2533 : : true);
2534 : 4455 : gcc_assert (DECL_ALIGN (decl) >= align);
2535 : 4455 : }
2536 : :
2537 : : /* Helper for symtab_node::definition_alignment. */
2538 : :
2539 : : static bool
2540 : 1628080 : get_alignment_1 (symtab_node *n, void *v)
2541 : : {
2542 : 1628080 : *((unsigned int *)v) = MAX (*((unsigned int *)v), DECL_ALIGN (n->decl));
2543 : 1628080 : return false;
2544 : : }
2545 : :
2546 : : /* Return desired alignment of the definition. This is NOT alignment useful
2547 : : to access THIS, because THIS may be interposable and DECL_ALIGN should
2548 : : be used instead. It however must be guaranteed when output definition
2549 : : of THIS. */
2550 : :
2551 : : unsigned int
2552 : 1568918 : symtab_node::definition_alignment ()
2553 : : {
2554 : 1568918 : unsigned int align = 0;
2555 : 1568918 : gcc_assert (!alias);
2556 : 1568918 : call_for_symbol_and_aliases (get_alignment_1, &align, true);
2557 : 1568918 : return align;
2558 : : }
2559 : :
2560 : : /* Return symbol used to separate symbol name from suffix. */
2561 : :
2562 : : char
2563 : 276545 : symbol_table::symbol_suffix_separator ()
2564 : : {
2565 : : #ifndef NO_DOT_IN_LABEL
2566 : 276545 : return '.';
2567 : : #elif !defined NO_DOLLAR_IN_LABEL
2568 : : return '$';
2569 : : #else
2570 : : return '_';
2571 : : #endif
2572 : : }
2573 : :
2574 : : /* Return true when references to this symbol from REF must bind to current
2575 : : definition in final executable. */
2576 : :
2577 : : bool
2578 : 75836187 : symtab_node::binds_to_current_def_p (symtab_node *ref)
2579 : : {
2580 : 75836187 : if (!definition && !in_other_partition)
2581 : : return false;
2582 : 37776466 : if (transparent_alias)
2583 : 13 : return definition
2584 : 13 : && get_alias_target()->binds_to_current_def_p (ref);
2585 : 37776453 : cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2586 : 37776453 : if (cnode && cnode->ifunc_resolver)
2587 : : return false;
2588 : 37776360 : if (decl_binds_to_current_def_p (decl))
2589 : : return true;
2590 : :
2591 : : /* Inline clones always binds locally. */
2592 : 16065458 : if (cnode && cnode->inlined_to)
2593 : : return true;
2594 : :
2595 : 16039678 : if (DECL_EXTERNAL (decl))
2596 : : return false;
2597 : :
2598 : 13562490 : gcc_assert (externally_visible);
2599 : :
2600 : 13562490 : if (ref)
2601 : : {
2602 : 125482 : cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2603 : 125482 : if (cref)
2604 : 125482 : ref = cref->inlined_to;
2605 : : }
2606 : :
2607 : : /* If this is a reference from symbol itself and there are no aliases, we
2608 : : may be sure that the symbol was not interposed by something else because
2609 : : the symbol itself would be unreachable otherwise. This is important
2610 : : to optimize recursive functions well.
2611 : :
2612 : : This assumption may be broken by inlining: if symbol is interposable
2613 : : but the body is available (i.e. declared inline), inliner may make
2614 : : the body reachable even with interposition. */
2615 : 4610 : if (this == ref && !has_aliases_p ()
2616 : 130034 : && (!cnode
2617 : 4552 : || symtab->state >= IPA_SSA_AFTER_INLINING
2618 : 0 : || get_availability () >= AVAIL_INTERPOSABLE))
2619 : 4552 : return true;
2620 : :
2621 : :
2622 : : /* References within one comdat group are always bound in a group. */
2623 : 13557938 : if (ref
2624 : 65850 : && symtab->state >= IPA_SSA_AFTER_INLINING
2625 : 65850 : && get_comdat_group ()
2626 : 13623784 : && get_comdat_group () == ref->get_comdat_group ())
2627 : : return true;
2628 : :
2629 : : return false;
2630 : : }
2631 : :
2632 : : /* Return true if symbol should be output to the symbol table. */
2633 : :
2634 : : bool
2635 : 1187502 : symtab_node::output_to_lto_symbol_table_p (void)
2636 : : {
2637 : : /* Only externally visible symbols matter. */
2638 : 1187502 : if (!TREE_PUBLIC (decl))
2639 : : return false;
2640 : 1118894 : if (!real_symbol_p ())
2641 : : return false;
2642 : : /* FIXME: variables probably should not be considered as real symbols at
2643 : : first place. */
2644 : 1118894 : if (VAR_P (decl) && DECL_HARD_REGISTER (decl))
2645 : : return false;
2646 : 654358 : if (TREE_CODE (decl) == FUNCTION_DECL && !definition
2647 : 1581008 : && fndecl_built_in_p (decl))
2648 : : {
2649 : : /* Builtins like those for most math functions have actual implementations
2650 : : in libraries so make sure to output references into the symbol table to
2651 : : make those libraries referenced. Note this is incomplete handling for
2652 : : now and only covers math functions. */
2653 : 39808 : return builtin_with_linkage_p (decl);
2654 : : }
2655 : :
2656 : : /* We have real symbol that should be in symbol table. However try to trim
2657 : : down the references to libraries bit more because linker will otherwise
2658 : : bring unnecessary object files into the final link.
2659 : : FIXME: The following checks can easily be confused i.e. by self recursive
2660 : : function or self-referring variable. */
2661 : :
2662 : : /* We keep external functions in symtab for sake of inlining
2663 : : and devirtualization. We do not want to see them in symbol table as
2664 : : references unless they are really used. */
2665 : 1079062 : cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2666 : 614550 : if (cnode && (!definition || DECL_EXTERNAL (decl))
2667 : 422714 : && cnode->callers)
2668 : : return true;
2669 : :
2670 : : /* Ignore all references from external vars initializers - they are not really
2671 : : part of the compilation unit until they are used by folding. Some symbols,
2672 : : like references to external construction vtables cannot be referred to at
2673 : : all. We decide this at can_refer_decl_in_current_unit_p. */
2674 : 1058194 : if (!definition || DECL_EXTERNAL (decl))
2675 : : {
2676 : : int i;
2677 : : struct ipa_ref *ref;
2678 : 408220 : for (i = 0; iterate_referring (i, ref); i++)
2679 : : {
2680 : 408158 : if (ref->use == IPA_REF_ALIAS)
2681 : 62 : continue;
2682 : 816254 : if (is_a <cgraph_node *> (ref->referring))
2683 : : return true;
2684 : 403018 : if (!DECL_EXTERNAL (ref->referring->decl))
2685 : : return true;
2686 : : }
2687 : : return false;
2688 : : }
2689 : : return true;
2690 : : }
|