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