pr70100.c: Add -mvsx.
[official-gcc.git] / gcc / symtab.c
blobee9723c34534ff64540ced7c38e30b45c329f47c
1 /* Symbol table.
2 Copyright (C) 2012-2019 Free Software Foundation, Inc.
3 Contributed by Jan Hubicka
5 This file is part of GCC.
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.
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.
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/>. */
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"
42 static const char *ipa_ref_use_name[] = {"read","write","addr","alias"};
44 const char * const ld_plugin_symbol_resolution_names[]=
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"
58 /* Follow the IDENTIFIER_TRANSPARENT_ALIAS chain starting at ALIAS
59 until we find an identifier that is not itself a transparent alias. */
61 static inline tree
62 ultimate_transparent_alias_target (tree alias)
64 tree target = alias;
66 while (IDENTIFIER_TRANSPARENT_ALIAS (target))
68 gcc_checking_assert (TREE_CHAIN (target));
69 target = TREE_CHAIN (target);
71 gcc_checking_assert (! IDENTIFIER_TRANSPARENT_ALIAS (target)
72 && ! TREE_CHAIN (target));
74 return target;
78 /* Hash asmnames ignoring the user specified marks. */
80 hashval_t
81 symbol_table::decl_assembler_name_hash (const_tree asmname)
83 if (IDENTIFIER_POINTER (asmname)[0] == '*')
85 const char *decl_str = IDENTIFIER_POINTER (asmname) + 1;
86 size_t ulp_len = strlen (user_label_prefix);
88 if (ulp_len == 0)
90 else if (strncmp (decl_str, user_label_prefix, ulp_len) == 0)
91 decl_str += ulp_len;
93 return htab_hash_string (decl_str);
96 return htab_hash_string (IDENTIFIER_POINTER (asmname));
99 /* Return true if assembler names NAME1 and NAME2 leads to the same symbol
100 name. */
102 bool
103 symbol_table::assembler_names_equal_p (const char *name1, const char *name2)
105 if (name1 != name2)
107 if (name1[0] == '*')
109 size_t ulp_len = strlen (user_label_prefix);
111 name1 ++;
113 if (ulp_len == 0)
115 else if (strncmp (name1, user_label_prefix, ulp_len) == 0)
116 name1 += ulp_len;
117 else
118 return false;
120 if (name2[0] == '*')
122 size_t ulp_len = strlen (user_label_prefix);
124 name2 ++;
126 if (ulp_len == 0)
128 else if (strncmp (name2, user_label_prefix, ulp_len) == 0)
129 name2 += ulp_len;
130 else
131 return false;
133 return !strcmp (name1, name2);
135 return true;
138 /* Compare ASMNAME with the DECL_ASSEMBLER_NAME of DECL. */
140 bool
141 symbol_table::decl_assembler_name_equal (tree decl, const_tree asmname)
143 tree decl_asmname = DECL_ASSEMBLER_NAME (decl);
144 const char *decl_str;
145 const char *asmname_str;
147 if (decl_asmname == asmname)
148 return true;
150 decl_str = IDENTIFIER_POINTER (decl_asmname);
151 asmname_str = IDENTIFIER_POINTER (asmname);
152 return assembler_names_equal_p (decl_str, asmname_str);
156 /* Returns nonzero if P1 and P2 are equal. */
158 /* Insert NODE to assembler name hash. */
160 void
161 symbol_table::insert_to_assembler_name_hash (symtab_node *node,
162 bool with_clones)
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)
170 symtab_node **aslot;
171 cgraph_node *cnode;
172 tree decl = node->decl;
174 tree name = DECL_ASSEMBLER_NAME (node->decl);
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;
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;
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);
199 /* Remove NODE from assembler name hash. */
201 void
202 symbol_table::unlink_from_assembler_name_hash (symtab_node *node,
203 bool with_clones)
205 if (assembler_name_hash)
207 cgraph_node *cnode;
208 tree decl = node->decl;
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)
215 node->previous_sharing_asm_name->next_sharing_asm_name
216 = node->next_sharing_asm_name;
218 else
220 tree name = DECL_ASSEMBLER_NAME (node->decl);
221 symtab_node **slot;
223 if (!name)
224 return;
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;
235 node->next_sharing_asm_name = NULL;
236 node->previous_sharing_asm_name = NULL;
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);
247 /* Arrange node to be first in its entry of assembler_name_hash. */
249 void
250 symbol_table::symtab_prevail_in_asm_name_hash (symtab_node *node)
252 unlink_from_assembler_name_hash (node, false);
253 insert_to_assembler_name_hash (node, false);
256 /* Initalize asm name hash unless. */
258 void
259 symbol_table::symtab_initialize_asm_name_hash (void)
261 symtab_node *node;
262 if (!assembler_name_hash)
264 assembler_name_hash = hash_table<asmname_hasher>::create_ggc (10);
265 FOR_EACH_SYMBOL (node)
266 insert_to_assembler_name_hash (node, false);
270 /* Set the DECL_ASSEMBLER_NAME and update symtab hashtables. */
272 void
273 symbol_table::change_decl_assembler_name (tree decl, tree name)
275 symtab_node *node = NULL;
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))
284 SET_DECL_ASSEMBLER_NAME (decl, name);
285 if (node)
286 insert_to_assembler_name_hash (node, true);
288 else
290 if (name == DECL_ASSEMBLER_NAME (decl))
291 return;
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);
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);
304 SET_DECL_ASSEMBLER_NAME (decl, name);
305 if (alias)
307 IDENTIFIER_TRANSPARENT_ALIAS (name) = 1;
308 TREE_CHAIN (name) = alias;
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)
316 insert_to_assembler_name_hash (node, true);
317 ipa_ref *ref;
318 for (unsigned i = 0; node->iterate_direct_aliases (i, ref); i++)
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))
329 gcc_assert (TREE_CHAIN (DECL_ASSEMBLER_NAME (alias->decl))
330 && IDENTIFIER_TRANSPARENT_ALIAS
331 (DECL_ASSEMBLER_NAME (alias->decl)));
333 TREE_CHAIN (DECL_ASSEMBLER_NAME (alias->decl)) =
334 ultimate_transparent_alias_target
335 (DECL_ASSEMBLER_NAME (node->decl));
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
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))));
355 /* Hash sections by their names. */
357 hashval_t
358 section_name_hasher::hash (section_hash_entry *n)
360 return htab_hash_string (n->name);
363 /* Return true if section P1 name equals to P2. */
365 bool
366 section_name_hasher::equal (section_hash_entry *n1, const char *name)
368 return n1->name == name || !strcmp (n1->name, name);
371 /* Add node into symbol table. This function is not used directly, but via
372 cgraph/varpool node creation routines. */
374 void
375 symtab_node::register_symbol (void)
377 symtab->register_symbol (this);
379 if (!decl->decl_with_vis.symtab_node)
380 decl->decl_with_vis.symtab_node = this;
382 ref_list.clear ();
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);
389 /* Remove NODE from same comdat group. */
391 void
392 symtab_node::remove_from_same_comdat_group (void)
394 if (same_comdat_group)
396 symtab_node *prev;
397 for (prev = same_comdat_group;
398 prev->same_comdat_group != this;
399 prev = prev->same_comdat_group)
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);
410 /* Remove node from symbol table. This function is not used directly, but via
411 cgraph/varpool node removal routines. */
413 void
414 symtab_node::unregister (void)
416 remove_all_references ();
417 remove_all_referring ();
419 /* Remove reference to section. */
420 set_section_for_node (NULL);
422 remove_from_same_comdat_group ();
424 symtab->unregister (this);
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)
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;
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);
443 /* Remove symbol from symbol table. */
445 void
446 symtab_node::remove (void)
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 ();
454 /* Add NEW_ to the same comdat group that OLD is in. */
456 void
457 symtab_node::add_to_same_comdat_group (symtab_node *old_node)
459 gcc_assert (old_node->get_comdat_group ());
460 gcc_assert (!same_comdat_group);
461 gcc_assert (this != old_node);
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
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)
474 n->same_comdat_group = this;
478 /* Dissolve the same_comdat_group list in which NODE resides. */
480 void
481 symtab_node::dissolve_same_comdat_group_list (void)
483 symtab_node *n = this;
484 symtab_node *next;
486 if (!same_comdat_group)
487 return;
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;
498 while (n != this);
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. */
505 const char *
506 symtab_node::asm_name () const
508 if (!DECL_ASSEMBLER_NAME_SET_P (decl))
509 return name ();
510 return IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
513 /* Return printable identifier name. */
515 const char *
516 symtab_node::name () const
518 if (!DECL_NAME (decl))
520 if (DECL_ASSEMBLER_NAME_SET_P (decl))
521 return asm_name ();
522 else
523 return "<unnamed>";
525 return lang_hooks.decl_printable_name (decl, 2);
528 const char *
529 symtab_node::get_dump_name (bool asm_name_p) const
531 #define EXTRA 16
532 const char *fname = asm_name_p ? asm_name () : name ();
533 unsigned l = strlen (fname);
535 char *s = (char *)ggc_internal_cleared_alloc (l + EXTRA);
536 snprintf (s, l + EXTRA, "%s/%d", fname, order);
538 return s;
541 const char *
542 symtab_node::dump_name () const
544 return get_dump_name (false);
547 const char *
548 symtab_node::dump_asm_name () const
550 return get_dump_name (true);
553 /* Return ipa reference from this symtab_node to
554 REFERED_NODE or REFERED_VARPOOL_NODE. USE_TYPE specify type
555 of the use. */
557 ipa_ref *
558 symtab_node::create_reference (symtab_node *referred_node,
559 enum ipa_ref_use use_type)
561 return create_reference (referred_node, use_type, NULL);
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). */
569 ipa_ref *
570 symtab_node::create_reference (symtab_node *referred_node,
571 enum ipa_ref_use use_type, gimple *stmt)
573 ipa_ref *ref = NULL, *ref2 = NULL;
574 ipa_ref_list *list, *list2;
575 ipa_ref_t *old_references;
577 gcc_checking_assert (!stmt || is_a <cgraph_node *> (this));
578 gcc_checking_assert (use_type != IPA_REF_ALIAS || !stmt);
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 ();
585 list2 = &referred_node->ref_list;
587 /* IPA_REF_ALIAS is always inserted at the beginning of the list. */
588 if(use_type == IPA_REF_ALIAS)
590 list2->referring.safe_insert (0, ref);
591 ref->referred_index = 0;
593 for (unsigned int i = 1; i < list2->referring.length (); i++)
594 list2->referring[i]->referred_index = i;
596 else
598 list2->referring.safe_push (ref);
599 ref->referred_index = list2->referring.length () - 1;
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;
609 /* If vector was moved in memory, update pointers. */
610 if (old_references != list->references->address ())
612 int i;
613 for (i = 0; iterate_reference(i, ref2); i++)
614 ref2->referred_ref_list ()->referring[ref2->referred_index] = ref2;
616 return ref;
619 ipa_ref *
620 symtab_node::maybe_create_reference (tree val, gimple *stmt)
622 STRIP_NOPS (val);
623 ipa_ref_use use_type;
625 switch (TREE_CODE (val))
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;
638 val = get_base_var (val);
639 if (val && VAR_OR_FUNCTION_DECL_P (val))
641 symtab_node *referred = symtab_node::get (val);
642 gcc_checking_assert (referred);
643 return create_reference (referred, use_type, stmt);
645 return NULL;
648 /* Clone all references from symtab NODE to this symtab_node. */
650 void
651 symtab_node::clone_references (symtab_node *node)
653 ipa_ref *ref = NULL, *ref2 = NULL;
654 int i;
655 for (i = 0; node->iterate_reference (i, ref); i++)
657 bool speculative = ref->speculative;
658 unsigned int stmt_uid = ref->lto_stmt_uid;
660 ref2 = create_reference (ref->referred, ref->use, ref->stmt);
661 ref2->speculative = speculative;
662 ref2->lto_stmt_uid = stmt_uid;
666 /* Clone all referring from symtab NODE to this symtab_node. */
668 void
669 symtab_node::clone_referring (symtab_node *node)
671 ipa_ref *ref = NULL, *ref2 = NULL;
672 int i;
673 for (i = 0; node->iterate_referring(i, ref); i++)
675 bool speculative = ref->speculative;
676 unsigned int stmt_uid = ref->lto_stmt_uid;
678 ref2 = ref->referring->create_reference (this, ref->use, ref->stmt);
679 ref2->speculative = speculative;
680 ref2->lto_stmt_uid = stmt_uid;
684 /* Clone reference REF to this symtab_node and set its stmt to STMT. */
686 ipa_ref *
687 symtab_node::clone_reference (ipa_ref *ref, gimple *stmt)
689 bool speculative = ref->speculative;
690 unsigned int stmt_uid = ref->lto_stmt_uid;
691 ipa_ref *ref2;
693 ref2 = create_reference (ref->referred, ref->use, stmt);
694 ref2->speculative = speculative;
695 ref2->lto_stmt_uid = stmt_uid;
696 return ref2;
699 /* Find the structure describing a reference to REFERRED_NODE
700 and associated with statement STMT. */
702 ipa_ref *
703 symtab_node::find_reference (symtab_node *referred_node,
704 gimple *stmt, unsigned int lto_stmt_uid)
706 ipa_ref *r = NULL;
707 int i;
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;
719 /* Remove all references that are associated with statement STMT. */
721 void
722 symtab_node::remove_stmt_references (gimple *stmt)
724 ipa_ref *r = NULL;
725 int i = 0;
727 while (iterate_reference (i, r))
728 if (r->stmt == stmt)
729 r->remove_reference ();
730 else
731 i++;
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. */
739 void
740 symtab_node::clear_stmts_in_references (void)
742 ipa_ref *r = NULL;
743 int i;
745 for (i = 0; iterate_reference (i, r); i++)
746 if (!r->speculative)
748 r->stmt = NULL;
749 r->lto_stmt_uid = 0;
753 /* Remove all references in ref list. */
755 void
756 symtab_node::remove_all_references (void)
758 while (vec_safe_length (ref_list.references))
759 ref_list.references->last ().remove_reference ();
760 vec_free (ref_list.references);
763 /* Remove all referring items in ref list. */
765 void
766 symtab_node::remove_all_referring (void)
768 while (ref_list.referring.length ())
769 ref_list.referring.last ()->remove_reference ();
770 ref_list.referring.release ();
773 /* Dump references in ref list to FILE. */
775 void
776 symtab_node::dump_references (FILE *file)
778 ipa_ref *ref = NULL;
779 int i;
780 for (i = 0; iterate_reference (i, ref); i++)
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)");
788 fprintf (file, "\n");
791 /* Dump referring in list to FILE. */
793 void
794 symtab_node::dump_referring (FILE *file)
796 ipa_ref *ref = NULL;
797 int i;
798 for (i = 0; iterate_referring(i, ref); i++)
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)");
806 fprintf (file, "\n");
809 static const char * const symtab_type_names[] = {"symbol", "function", "variable"};
811 /* Dump the visibility of the symbol. */
813 const char *
814 symtab_node::get_visibility_string () const
816 static const char * const visibility_types[]
817 = { "default", "protected", "hidden", "internal" };
818 return visibility_types[DECL_VISIBILITY (decl)];
821 /* Dump the type_name of the symbol. */
822 const char *
823 symtab_node::get_symtab_type_string () const
825 return symtab_type_names[type];
828 /* Dump base fields of symtab nodes to F. Not to be used directly. */
830 void
831 symtab_node::dump_base (FILE *f)
833 static const char * const visibility_types[] = {
834 "default", "protected", "hidden", "internal"
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]);
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)
912 if (DECL_STATIC_CONSTRUCTOR (decl))
913 fprintf (f, " constructor");
914 if (DECL_STATIC_DESTRUCTOR (decl))
915 fprintf (f, " destructor");
917 fprintf (f, "\n");
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);
929 if (address_taken)
930 fprintf (f, " Address is taken.\n");
931 if (aux)
933 fprintf (f, " Aux:");
934 dump_addr (f, " @", (void *)aux);
935 fprintf (f, "\n");
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);
947 /* Dump symtab node to F. */
949 void
950 symtab_node::dump (FILE *f)
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);
958 void
959 symtab_node::dump_graphviz (FILE *f)
961 if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
962 cnode->dump_graphviz (f);
965 void
966 symbol_table::dump (FILE *f)
968 symtab_node *node;
969 fprintf (f, "Symbol table:\n\n");
970 FOR_EACH_SYMBOL (node)
971 node->dump (f);
974 void
975 symbol_table::dump_graphviz (FILE *f)
977 symtab_node *node;
978 fprintf (f, "digraph symtab {\n");
979 FOR_EACH_SYMBOL (node)
980 node->dump_graphviz (f);
981 fprintf (f, "}\n");
984 DEBUG_FUNCTION void
985 symbol_table::debug (void)
987 dump (stderr);
990 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
991 Return NULL if there's no such node. */
993 symtab_node *
994 symtab_node::get_for_asmname (const_tree asmname)
996 symtab_node *node;
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);
1004 if (slot)
1006 node = *slot;
1007 return node;
1009 return NULL;
1012 /* Dump symtab node NODE to stderr. */
1014 DEBUG_FUNCTION void
1015 symtab_node::debug (void)
1017 dump (stderr);
1020 /* Verify common part of symtab nodes. */
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
1031 DEBUG_FUNCTION bool
1032 symtab_node::verify_base (void)
1034 bool error_found = false;
1035 symtab_node *hashed_node;
1037 if (is_a <cgraph_node *> (this))
1039 if (TREE_CODE (decl) != FUNCTION_DECL)
1041 error ("function symbol is not function");
1042 error_found = true;
1044 else if ((lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl))
1045 != NULL)
1046 != dyn_cast <cgraph_node *> (this)->ifunc_resolver)
1048 error ("inconsistent %<ifunc%> attribute");
1049 error_found = true;
1052 else if (is_a <varpool_node *> (this))
1054 if (!VAR_P (decl))
1056 error ("variable symbol is not variable");
1057 error_found = true;
1060 else
1062 error ("node has unknown type");
1063 error_found = true;
1066 if (symtab->state != LTO_STREAMING)
1068 hashed_node = symtab_node::get (decl);
1069 if (!hashed_node)
1071 error ("node not found node->decl->decl_with_vis.symtab_node");
1072 error_found = true;
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))
1079 error ("node differs from node->decl->decl_with_vis.symtab_node");
1080 error_found = true;
1083 if (symtab->assembler_name_hash)
1085 hashed_node = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (decl));
1086 if (hashed_node)
1088 if (hashed_node->previous_sharing_asm_name)
1090 error ("assembler name hash list corrupted");
1091 error_found = true;
1093 else if (previous_sharing_asm_name == NULL)
1095 if (hashed_node != this)
1097 error ("assembler name hash list corrupted");
1098 error_found = true;
1101 else if (!(is_a <varpool_node *> (this) && DECL_HARD_REGISTER (decl)))
1103 if (!asmname_hasher::equal (previous_sharing_asm_name,
1104 DECL_ASSEMBLER_NAME (decl)))
1106 error ("node not found in symtab assembler name hash");
1107 error_found = true;
1112 if (previous_sharing_asm_name
1113 && previous_sharing_asm_name->next_sharing_asm_name != this)
1115 error ("double linked list of assembler names corrupted");
1116 error_found = true;
1118 if (body_removed && definition)
1120 error ("node has body_removed but is definition");
1121 error_found = true;
1123 if (analyzed && !definition)
1125 error ("node is analyzed but it is not a definition");
1126 error_found = true;
1128 if (cpp_implicit_alias && !alias)
1130 error ("node is alias but not implicit alias");
1131 error_found = true;
1133 if (alias && !definition && !weakref)
1135 error ("node is alias but not definition");
1136 error_found = true;
1138 if (weakref && !transparent_alias)
1140 error ("node is weakref but not an transparent_alias");
1141 error_found = true;
1143 if (transparent_alias && !alias)
1145 error ("node is transparent_alias but not an alias");
1146 error_found = true;
1148 if (same_comdat_group)
1150 symtab_node *n = same_comdat_group;
1152 if (!n->get_comdat_group ())
1154 error ("node is in same_comdat_group list but has no comdat_group");
1155 error_found = true;
1157 if (n->get_comdat_group () != get_comdat_group ())
1159 error ("same_comdat_group list across different groups");
1160 error_found = true;
1162 if (n->type != type)
1164 error ("mixing different types of symbol in same comdat groups is not supported");
1165 error_found = true;
1167 if (n == this)
1169 error ("node is alone in a comdat group");
1170 error_found = true;
1174 if (!n->same_comdat_group)
1176 error ("same_comdat_group is not a circular list");
1177 error_found = true;
1178 break;
1180 n = n->same_comdat_group;
1182 while (n != this);
1183 if (comdat_local_p ())
1185 ipa_ref *ref = NULL;
1187 for (int i = 0; iterate_referring (i, ref); ++i)
1189 if (!in_same_comdat_group_p (ref->referring))
1191 error ("comdat-local symbol referred to by %s outside its "
1192 "comdat",
1193 identifier_to_locale (ref->referring->name()));
1194 error_found = true;
1199 if (implicit_section && !get_section ())
1201 error ("implicit_section flag is set but section isn%'t");
1202 error_found = true;
1204 if (get_section () && get_comdat_group ()
1205 && !implicit_section
1206 && !lookup_attribute ("section", DECL_ATTRIBUTES (decl)))
1208 error ("Both section and comdat group is set");
1209 error_found = true;
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 ())))
1220 error ("Alias and target%'s section differs");
1221 get_alias_target ()->dump (stderr);
1222 error_found = true;
1224 if (alias && definition
1225 && get_comdat_group () != get_alias_target ()->get_comdat_group ())
1227 error ("Alias and target%'s comdat groups differs");
1228 get_alias_target ()->dump (stderr);
1229 error_found = true;
1231 if (transparent_alias && definition && !weakref)
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))
1242 error ("Transparent alias and target%'s assembler names differs");
1243 get_alias_target ()->dump (stderr);
1244 error_found = true;
1247 if (transparent_alias && definition
1248 && get_alias_target()->transparent_alias && get_alias_target()->analyzed)
1250 error ("Chained transparent aliases");
1251 get_alias_target ()->dump (stderr);
1252 error_found = true;
1255 return error_found;
1258 /* Verify consistency of NODE. */
1260 DEBUG_FUNCTION void
1261 symtab_node::verify (void)
1263 if (seen_error ())
1264 return;
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 ())
1272 debug ();
1273 internal_error ("symtab_node::verify failed");
1275 timevar_pop (TV_CGRAPH_VERIFY);
1278 /* Verify symbol table for internal consistency. */
1280 DEBUG_FUNCTION void
1281 symtab_node::verify_symtab_nodes (void)
1283 symtab_node *node;
1284 hash_map<tree, symtab_node *> comdat_head_map (251);
1286 FOR_EACH_SYMBOL (node)
1288 node->verify ();
1289 if (node->get_comdat_group ())
1291 symtab_node **entry, *s;
1292 bool existed;
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))
1300 for (s = (*entry)->same_comdat_group;
1301 s != NULL && s != node && s != *entry;
1302 s = s->same_comdat_group)
1304 if (!s || s == *entry)
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");
1317 #if __GNUC__ >= 10
1318 # pragma GCC diagnostic pop
1319 #endif
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. */
1324 void
1325 symtab_node::make_decl_local (void)
1327 rtx rtl, symbol;
1329 if (weakref)
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));
1339 /* Avoid clearing comdat_groups on comdat-local decls. */
1340 else if (TREE_PUBLIC (decl) == 0)
1341 return;
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++)
1347 struct symtab_node *alias = ref->referring;
1348 if (alias->transparent_alias)
1349 alias->make_decl_local ();
1352 if (VAR_P (decl))
1354 DECL_COMMON (decl) = 0;
1355 /* ADDRESSABLE flag is not defined for public symbols. */
1356 TREE_ADDRESSABLE (decl) = 1;
1357 TREE_STATIC (decl) = 1;
1359 else
1360 gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
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;
1372 /* Update rtl flags. */
1373 make_decl_rtl (decl);
1375 rtl = DECL_RTL (decl);
1376 if (!MEM_P (rtl))
1377 return;
1379 symbol = XEXP (rtl, 0);
1380 if (GET_CODE (symbol) != SYMBOL_REF)
1381 return;
1383 SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
1386 /* Copy visibility from N.
1387 This is useful when THIS becomes a transparent alias of N. */
1389 void
1390 symtab_node::copy_visibility_from (symtab_node *n)
1392 gcc_checking_assert (n->weakref == weakref);
1394 ipa_ref *ref;
1395 for (unsigned i = 0; iterate_direct_aliases (i, ref); i++)
1397 struct symtab_node *alias = ref->referring;
1398 if (alias->transparent_alias)
1399 alias->copy_visibility_from (n);
1402 if (VAR_P (decl))
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);
1410 else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
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;
1427 /* Update rtl flags. */
1428 make_decl_rtl (decl);
1430 rtx rtl = DECL_RTL (decl);
1431 if (!MEM_P (rtl))
1432 return;
1434 rtx symbol = XEXP (rtl, 0);
1435 if (GET_CODE (symbol) != SYMBOL_REF)
1436 return;
1438 SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
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. */
1445 symtab_node *
1446 symtab_node::ultimate_alias_target_1 (enum availability *availability,
1447 symtab_node *ref)
1449 bool transparent_p = false;
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.
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).
1461 If we ever get into supporting targets with different semantics, a target
1462 hook will be needed here. */
1464 if (availability)
1466 transparent_p = transparent_alias;
1467 if (!transparent_p)
1468 *availability = get_availability (ref);
1469 else
1470 *availability = AVAIL_NOT_AVAILABLE;
1473 symtab_node *node = this;
1474 while (node)
1476 if (node->alias && node->analyzed)
1477 node = node->get_alias_target ();
1478 else
1480 if (!availability || (!transparent_p && node->analyzed))
1482 else if (node->analyzed && !node->transparent_alias)
1483 *availability = node->get_availability (ref);
1484 else
1485 *availability = AVAIL_NOT_AVAILABLE;
1486 return node;
1488 if (node && availability && transparent_p
1489 && node->transparent_alias)
1491 *availability = node->get_availability (ref);
1492 transparent_p = false;
1495 if (availability)
1496 *availability = AVAIL_NOT_AVAILABLE;
1497 return NULL;
1500 /* C++ FE sometimes change linkage flags after producing same body aliases.
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. */
1507 void
1508 symtab_node::fixup_same_cpp_alias_visibility (symtab_node *target)
1510 if (is_a <cgraph_node *> (this))
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);
1517 /* FIXME: It is not really clear why those flags should not be copied for
1518 functions, too. */
1519 else
1521 DECL_WEAK (decl) = DECL_WEAK (target->decl);
1522 DECL_EXTERNAL (decl) = DECL_EXTERNAL (target->decl);
1523 DECL_VISIBILITY (decl) = DECL_VISIBILITY (target->decl);
1525 if (TREE_PUBLIC (decl))
1527 tree group;
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);
1536 externally_visible = target->externally_visible;
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. */
1543 void
1544 symtab_node::set_section_for_node (const char *section)
1546 const char *current = get_section ();
1547 section_hash_entry **slot;
1549 if (current == section
1550 || (current && section
1551 && !strcmp (current, section)))
1552 return;
1554 if (current)
1556 x_section->ref_count--;
1557 if (!x_section->ref_count)
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);
1565 x_section = NULL;
1567 if (!section)
1569 implicit_section = false;
1570 return;
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
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);
1586 x_section->ref_count++;
1589 /* Worker for set_section. */
1591 bool
1592 symtab_node::set_section (symtab_node *n, void *s)
1594 n->set_section_for_node ((char *)s);
1595 return false;
1598 /* Set section of symbol and its aliases. */
1600 void
1601 symtab_node::set_section (const char *section)
1603 gcc_assert (!this->alias || !this->analyzed);
1604 call_for_symbol_and_aliases
1605 (symtab_node::set_section, const_cast<char *>(section), true);
1608 /* Return the initialization priority. */
1610 priority_type
1611 symtab_node::get_init_priority ()
1613 if (!this->in_init_priority_hash)
1614 return DEFAULT_INIT_PRIORITY;
1616 symbol_priority_map *h = symtab->init_priority_hash->get (this);
1617 return h ? h->init : DEFAULT_INIT_PRIORITY;
1620 /* Return the finalization priority. */
1622 priority_type
1623 cgraph_node::get_fini_priority ()
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;
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. */
1635 symbol_priority_map *
1636 symtab_node::priority_info (void)
1638 if (!symtab->init_priority_hash)
1639 symtab->init_priority_hash = hash_map<symtab_node *, symbol_priority_map>::create_ggc (13);
1641 bool existed;
1642 symbol_priority_map *h
1643 = &symtab->init_priority_hash->get_or_insert (this, &existed);
1644 if (!existed)
1646 h->init = DEFAULT_INIT_PRIORITY;
1647 h->fini = DEFAULT_INIT_PRIORITY;
1648 in_init_priority_hash = true;
1651 return h;
1654 /* Set initialization priority to PRIORITY. */
1656 void
1657 symtab_node::set_init_priority (priority_type priority)
1659 symbol_priority_map *h;
1661 if (is_a <cgraph_node *> (this))
1662 gcc_assert (DECL_STATIC_CONSTRUCTOR (this->decl));
1664 if (priority == DEFAULT_INIT_PRIORITY)
1666 gcc_assert (get_init_priority() == priority);
1667 return;
1669 h = priority_info ();
1670 h->init = priority;
1673 /* Set fialization priority to PRIORITY. */
1675 void
1676 cgraph_node::set_fini_priority (priority_type priority)
1678 symbol_priority_map *h;
1680 gcc_assert (DECL_STATIC_DESTRUCTOR (this->decl));
1682 if (priority == DEFAULT_INIT_PRIORITY)
1684 gcc_assert (get_fini_priority() == priority);
1685 return;
1687 h = priority_info ();
1688 h->fini = priority;
1691 /* Worker for symtab_resolve_alias. */
1693 bool
1694 symtab_node::set_implicit_section (symtab_node *n,
1695 void *data ATTRIBUTE_UNUSED)
1697 n->implicit_section = true;
1698 return false;
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. */
1705 bool
1706 symtab_node::resolve_alias (symtab_node *target, bool transparent)
1708 symtab_node *n;
1710 gcc_assert (!analyzed && !vec_safe_length (ref_list.references));
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)
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;
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);
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);
1746 if ((get_section () != target->get_section ()
1747 || target->get_comdat_group ()) && get_section () && !implicit_section)
1749 error ("section of alias %q+D must match section of its target", decl);
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);
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;
1761 if (!transparent && cpp_implicit_alias && symtab->state >= CONSTRUCTION)
1762 fixup_same_cpp_alias_visibility (target);
1764 /* If alias has address taken, so does the target. */
1765 if (address_taken)
1766 target->ultimate_alias_target ()->address_taken = true;
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);)
1775 struct symtab_node *alias_alias = ref->referring;
1776 if (alias_alias->get_comdat_group ())
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);
1783 if (!alias_alias->transparent_alias || transparent)
1785 alias_alias->remove_all_references ();
1786 alias_alias->create_reference (target, IPA_REF_ALIAS, NULL);
1788 else i++;
1790 return true;
1793 /* Worker searching noninterposable alias. */
1795 bool
1796 symtab_node::noninterposable_alias (symtab_node *node, void *data)
1798 if (!node->transparent_alias && decl_binds_to_current_def_p (node->decl))
1800 symtab_node *fn = node->ultimate_alias_target ();
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;
1815 return false;
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. */
1822 symtab_node *
1823 symtab_node::noninterposable_alias (void)
1825 tree new_decl;
1826 symtab_node *new_node = NULL;
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;
1837 /* If aliases aren't supported by the assembler, fail. */
1838 if (!TARGET_SUPPORTS_ALIASES)
1839 return NULL;
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);
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;
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)
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);
1865 else
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);
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;
1877 /* Return true if symtab node and TARGET represents
1878 semantically equivalent symbols. */
1880 bool
1881 symtab_node::semantically_equivalent_p (symtab_node *target)
1883 enum availability avail;
1884 symtab_node *ba;
1885 symtab_node *bb;
1887 /* Equivalent functions are equivalent. */
1888 if (decl == target->decl)
1889 return true;
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)
1896 if (target == ba)
1897 return true;
1899 else
1900 ba = this;
1901 bb = target->ultimate_alias_target (&avail);
1902 if (avail >= AVAIL_AVAILABLE)
1904 if (this == bb)
1905 return true;
1907 else
1908 bb = target;
1909 return bb == ba;
1912 /* Classify symbol symtab node for partitioning. */
1914 enum symbol_partitioning_class
1915 symtab_node::get_partitioning_class (void)
1917 /* Inline clones are always duplicated.
1918 This include external delcarations. */
1919 cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
1921 if (DECL_ABSTRACT_P (decl))
1922 return SYMBOL_EXTERNAL;
1924 if (cnode && cnode->global.inlined_to)
1925 return SYMBOL_DUPLICATE;
1927 /* Transparent aliases are always duplicated. */
1928 if (transparent_alias)
1929 return definition ? SYMBOL_DUPLICATE : SYMBOL_EXTERNAL;
1931 /* External declarations are external. */
1932 if (DECL_EXTERNAL (decl))
1933 return SYMBOL_EXTERNAL;
1935 if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
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);
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;
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;
1963 return SYMBOL_PARTITION;
1966 /* Return true when symbol is known to be non-zero. */
1968 bool
1969 symtab_node::nonzero_address ()
1971 /* Weakrefs may be NULL when their target is not defined. */
1972 if (alias && weakref)
1974 if (analyzed)
1976 symtab_node *target = ultimate_alias_target ();
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;
1997 else
1998 return false;
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.
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.
2008 When parsing, beware the cases when WEAK attribute is added later. */
2009 if (!DECL_WEAK (decl)
2010 && flag_delete_null_pointer_checks)
2012 refuse_visibility_changes = true;
2013 return true;
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)))
2023 if (!DECL_WEAK (decl))
2024 refuse_visibility_changes = true;
2025 return true;
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;
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.
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. */
2046 symtab_node::equal_address_to (symtab_node *s2, bool memory_accessed)
2048 enum availability avail1, avail2;
2050 /* A Shortcut: equivalent symbols are always equivalent. */
2051 if (this == s2)
2052 return 1;
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();
2061 if (this == s2)
2062 return 1;
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;
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;
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;
2089 if (binds_local1 && binds_local2 && rs1 == rs2)
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;
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;
2104 /* Except for NULL, functions and variables never overlap. */
2105 if (TREE_CODE (decl) != TREE_CODE (s2->decl))
2106 return 0;
2108 /* If one of the symbols is unresolved alias, punt. */
2109 if (rs1->alias || rs2->alias)
2110 return -1;
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)
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;
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. */
2137 return memory_accessed && rs1 != rs2 ? 0 : -1;
2140 /* Worker for call_for_symbol_and_aliases. */
2142 bool
2143 symtab_node::call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *,
2144 void *),
2145 void *data,
2146 bool include_overwritable)
2148 ipa_ref *ref;
2149 FOR_EACH_ALIAS (this, ref)
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;
2158 return false;
2161 /* Return true if address of N is possibly compared. */
2163 static bool
2164 address_matters_1 (symtab_node *n, void *)
2166 struct ipa_ref *ref;
2168 if (!n->address_can_be_compared_p ())
2169 return false;
2170 if (n->externally_visible || n->force_output)
2171 return true;
2173 for (unsigned int i = 0; n->iterate_referring (i, ref); i++)
2174 if (ref->address_matters_p ())
2175 return true;
2176 return false;
2179 /* Return true if symbol's address may possibly be compared to other
2180 symbol's address. */
2182 bool
2183 symtab_node::address_matters_p ()
2185 gcc_assert (!alias);
2186 return call_for_symbol_and_aliases (address_matters_1, NULL, true);
2189 /* Return true if symbol's alignment may be increased. */
2191 bool
2192 symtab_node::can_increase_alignment_p (void)
2194 symtab_node *target = ultimate_alias_target ();
2196 /* For now support only variables. */
2197 if (!VAR_P (decl))
2198 return false;
2200 /* With -fno-toplevel-reorder we may have already output the constant. */
2201 if (TREE_ASM_WRITTEN (target->decl))
2202 return false;
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;
2211 /* Constant pool entries may be shared. */
2212 if (DECL_IN_CONSTANT_POOL (target->decl))
2213 return false;
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;
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;
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;
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;
2239 return true;
2242 /* Worker for symtab_node::increase_alignment. */
2244 static bool
2245 increase_alignment_1 (symtab_node *n, void *v)
2247 unsigned int align = (size_t)v;
2248 if (DECL_ALIGN (n->decl) < align
2249 && n->can_increase_alignment_p ())
2251 SET_DECL_ALIGN (n->decl, align);
2252 DECL_USER_ALIGN (n->decl) = 1;
2254 return false;
2257 /* Increase alignment of THIS to ALIGN. */
2259 void
2260 symtab_node::increase_alignment (unsigned int align)
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);
2269 /* Helper for symtab_node::definition_alignment. */
2271 static bool
2272 get_alignment_1 (symtab_node *n, void *v)
2274 *((unsigned int *)v) = MAX (*((unsigned int *)v), DECL_ALIGN (n->decl));
2275 return false;
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. */
2283 unsigned int
2284 symtab_node::definition_alignment ()
2286 unsigned int align = 0;
2287 gcc_assert (!alias);
2288 call_for_symbol_and_aliases (get_alignment_1, &align, true);
2289 return align;
2292 /* Return symbol used to separate symbol name from suffix. */
2294 char
2295 symbol_table::symbol_suffix_separator ()
2297 #ifndef NO_DOT_IN_LABEL
2298 return '.';
2299 #elif !defined NO_DOLLAR_IN_LABEL
2300 return '$';
2301 #else
2302 return '_';
2303 #endif
2306 /* Return true when references to this symbol from REF must bind to current
2307 definition in final executable. */
2309 bool
2310 symtab_node::binds_to_current_def_p (symtab_node *ref)
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;
2323 /* Inline clones always binds locally. */
2324 if (cnode && cnode->global.inlined_to)
2325 return true;
2327 if (DECL_EXTERNAL (decl))
2328 return false;
2330 gcc_assert (externally_visible);
2332 if (ref)
2334 cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2335 if (cref)
2336 ref = cref->global.inlined_to;
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.
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;
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;
2361 return false;
2364 /* Return true if symbol should be output to the symbol table. */
2366 bool
2367 symtab_node::output_to_lto_symbol_table_p (void)
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 if (TREE_CODE (decl) == FUNCTION_DECL && !definition
2379 && fndecl_built_in_p (decl))
2381 /* Builtins like those for most math functions have actual implementations
2382 in libraries so make sure to output references into the symbol table to
2383 make those libraries referenced. Note this is incomplete handling for
2384 now and only covers math functions. */
2385 if (builtin_with_linkage_p (decl))
2386 return true;
2387 else
2388 return false;
2391 /* We have real symbol that should be in symbol table. However try to trim
2392 down the refernces to libraries bit more because linker will otherwise
2393 bring unnecesary object files into the final link.
2394 FIXME: The following checks can easily be confused i.e. by self recursive
2395 function or self-referring variable. */
2397 /* We keep external functions in symtab for sake of inlining
2398 and devirtualization. We do not want to see them in symbol table as
2399 references unless they are really used. */
2400 cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2401 if (cnode && (!definition || DECL_EXTERNAL (decl))
2402 && cnode->callers)
2403 return true;
2405 /* Ignore all references from external vars initializers - they are not really
2406 part of the compilation unit until they are used by folding. Some symbols,
2407 like references to external construction vtables cannot be referred to at
2408 all. We decide this at can_refer_decl_in_current_unit_p. */
2409 if (!definition || DECL_EXTERNAL (decl))
2411 int i;
2412 struct ipa_ref *ref;
2413 for (i = 0; iterate_referring (i, ref); i++)
2415 if (ref->use == IPA_REF_ALIAS)
2416 continue;
2417 if (is_a <cgraph_node *> (ref->referring))
2418 return true;
2419 if (!DECL_EXTERNAL (ref->referring->decl))
2420 return true;
2422 return false;
2424 return true;