gcc80: Handle TZ specific "%+" format in strftime.
[dragonfly.git] / contrib / gcc-8.0 / gcc / symtab.c
1 /* Symbol table.
2    Copyright (C) 2012-2018 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","chkp"};
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 base fields of symtab nodes to F.  Not to be used directly.  */
812
813 void
814 symtab_node::dump_base (FILE *f)
815 {
816   static const char * const visibility_types[] = {
817     "default", "protected", "hidden", "internal"
818   };
819
820   fprintf (f, "%s (%s)", dump_asm_name (), name ());
821   dump_addr (f, " @", (void *)this);
822   fprintf (f, "\n  Type: %s", symtab_type_names[type]);
823
824   if (definition)
825     fprintf (f, " definition");
826   if (analyzed)
827     fprintf (f, " analyzed");
828   if (alias)
829     fprintf (f, " alias");
830   if (transparent_alias)
831     fprintf (f, " transparent_alias");
832   if (weakref)
833     fprintf (f, " weakref");
834   if (cpp_implicit_alias)
835     fprintf (f, " cpp_implicit_alias");
836   if (alias_target)
837     fprintf (f, " target:%s",
838              DECL_P (alias_target)
839              ? IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME
840                                      (alias_target))
841              : IDENTIFIER_POINTER (alias_target));
842   if (body_removed)
843     fprintf (f, "\n  Body removed by symtab_remove_unreachable_nodes");
844   fprintf (f, "\n  Visibility:");
845   if (in_other_partition)
846     fprintf (f, " in_other_partition");
847   if (used_from_other_partition)
848     fprintf (f, " used_from_other_partition");
849   if (force_output)
850     fprintf (f, " force_output");
851   if (forced_by_abi)
852     fprintf (f, " forced_by_abi");
853   if (externally_visible)
854     fprintf (f, " externally_visible");
855   if (no_reorder)
856     fprintf (f, " no_reorder");
857   if (resolution != LDPR_UNKNOWN)
858     fprintf (f, " %s",
859              ld_plugin_symbol_resolution_names[(int)resolution]);
860   if (TREE_ASM_WRITTEN (decl))
861     fprintf (f, " asm_written");
862   if (DECL_EXTERNAL (decl))
863     fprintf (f, " external");
864   if (TREE_PUBLIC (decl))
865     fprintf (f, " public");
866   if (DECL_COMMON (decl))
867     fprintf (f, " common");
868   if (DECL_WEAK (decl))
869     fprintf (f, " weak");
870   if (DECL_DLLIMPORT_P (decl))
871     fprintf (f, " dll_import");
872   if (DECL_COMDAT (decl))
873     fprintf (f, " comdat");
874   if (get_comdat_group ())
875     fprintf (f, " comdat_group:%s",
876              IDENTIFIER_POINTER (get_comdat_group_id ()));
877   if (DECL_ONE_ONLY (decl))
878     fprintf (f, " one_only");
879   if (get_section ())
880     fprintf (f, " section:%s",
881              get_section ());
882   if (implicit_section)
883     fprintf (f," (implicit_section)");
884   if (DECL_VISIBILITY_SPECIFIED (decl))
885     fprintf (f, " visibility_specified");
886   if (DECL_VISIBILITY (decl))
887     fprintf (f, " visibility:%s",
888              visibility_types [DECL_VISIBILITY (decl)]);
889   if (DECL_VIRTUAL_P (decl))
890     fprintf (f, " virtual");
891   if (DECL_ARTIFICIAL (decl))
892     fprintf (f, " artificial");
893   if (TREE_CODE (decl) == FUNCTION_DECL)
894     {
895       if (DECL_STATIC_CONSTRUCTOR (decl))
896         fprintf (f, " constructor");
897       if (DECL_STATIC_DESTRUCTOR (decl))
898         fprintf (f, " destructor");
899     }
900   fprintf (f, "\n");
901   
902   if (same_comdat_group)
903     fprintf (f, "  Same comdat group as: %s\n",
904              same_comdat_group->dump_asm_name ());
905   if (next_sharing_asm_name)
906     fprintf (f, "  next sharing asm name: %i\n",
907              next_sharing_asm_name->order);
908   if (previous_sharing_asm_name)
909     fprintf (f, "  previous sharing asm name: %i\n",
910              previous_sharing_asm_name->order);
911
912   if (address_taken)
913     fprintf (f, "  Address is taken.\n");
914   if (aux)
915     {
916       fprintf (f, "  Aux:");
917       dump_addr (f, " @", (void *)aux);
918       fprintf (f, "\n");
919     }
920
921   fprintf (f, "  References: ");
922   dump_references (f);
923   fprintf (f, "  Referring: ");
924   dump_referring (f);
925   if (lto_file_data)
926     fprintf (f, "  Read from file: %s\n",
927              lto_file_data->file_name);
928 }
929
930 /* Dump symtab node to F.  */
931
932 void
933 symtab_node::dump (FILE *f)
934 {
935   if (cgraph_node *cnode = dyn_cast <cgraph_node *> (this))
936     cnode->dump (f);
937   else if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
938     vnode->dump (f);
939 }
940
941 void
942 symbol_table::dump (FILE *f)
943 {
944   symtab_node *node;
945   fprintf (f, "Symbol table:\n\n");
946   FOR_EACH_SYMBOL (node)
947     node->dump (f);
948 }
949
950 DEBUG_FUNCTION void
951 symbol_table::debug (void)
952 {
953   dump (stderr);
954 }
955
956 /* Return the cgraph node that has ASMNAME for its DECL_ASSEMBLER_NAME.
957    Return NULL if there's no such node.  */
958
959 symtab_node *
960 symtab_node::get_for_asmname (const_tree asmname)
961 {
962   symtab_node *node;
963
964   symtab->symtab_initialize_asm_name_hash ();
965   hashval_t hash = symtab->decl_assembler_name_hash (asmname);
966   symtab_node **slot
967     = symtab->assembler_name_hash->find_slot_with_hash (asmname, hash,
968                                                         NO_INSERT);
969
970   if (slot)
971     {
972       node = *slot;
973       return node;
974     }
975   return NULL;
976 }
977
978 /* Dump symtab node NODE to stderr.  */
979
980 DEBUG_FUNCTION void
981 symtab_node::debug (void)
982 {
983   dump (stderr);
984 }
985
986 /* Verify common part of symtab nodes.  */
987
988 DEBUG_FUNCTION bool
989 symtab_node::verify_base (void)
990 {
991   bool error_found = false;
992   symtab_node *hashed_node;
993
994   if (is_a <cgraph_node *> (this))
995     {
996       if (TREE_CODE (decl) != FUNCTION_DECL)
997         {
998           error ("function symbol is not function");
999           error_found = true;
1000         }
1001     }
1002   else if (is_a <varpool_node *> (this))
1003     {
1004       if (!VAR_P (decl))
1005         {
1006           error ("variable symbol is not variable");
1007           error_found = true;
1008         }
1009     }
1010   else
1011     {
1012       error ("node has unknown type");
1013       error_found = true;
1014     }
1015    
1016   if (symtab->state != LTO_STREAMING)
1017     {
1018       hashed_node = symtab_node::get (decl);
1019       if (!hashed_node)
1020         {
1021           error ("node not found node->decl->decl_with_vis.symtab_node");
1022           error_found = true;
1023         }
1024       if (hashed_node != this
1025           && (!is_a <cgraph_node *> (this)
1026               || !dyn_cast <cgraph_node *> (this)->clone_of
1027               || dyn_cast <cgraph_node *> (this)->clone_of->decl != decl))
1028         {
1029           error ("node differs from node->decl->decl_with_vis.symtab_node");
1030           error_found = true;
1031         }
1032     }
1033   if (symtab->assembler_name_hash)
1034     {
1035       hashed_node = symtab_node::get_for_asmname (DECL_ASSEMBLER_NAME (decl));
1036       if (hashed_node && hashed_node->previous_sharing_asm_name)
1037         {
1038           error ("assembler name hash list corrupted");
1039           error_found = true;
1040         }
1041       while (hashed_node)
1042         {
1043           if (hashed_node == this)
1044             break;
1045           hashed_node = hashed_node->next_sharing_asm_name;
1046         }
1047       if (!hashed_node
1048           && !(is_a <varpool_node *> (this)
1049                && DECL_HARD_REGISTER (decl)))
1050         {
1051           error ("node not found in symtab assembler name hash");
1052           error_found = true;
1053         }
1054     }
1055   if (previous_sharing_asm_name
1056       && previous_sharing_asm_name->next_sharing_asm_name != this)
1057     {
1058       error ("double linked list of assembler names corrupted");
1059       error_found = true;
1060     }
1061   if (body_removed && definition)
1062     {
1063       error ("node has body_removed but is definition");
1064       error_found = true;
1065     }
1066   if (analyzed && !definition)
1067     {
1068       error ("node is analyzed but it is not a definition");
1069       error_found = true;
1070     }
1071   if (cpp_implicit_alias && !alias)
1072     {
1073       error ("node is alias but not implicit alias");
1074       error_found = true;
1075     }
1076   if (alias && !definition && !weakref)
1077     {
1078       error ("node is alias but not definition");
1079       error_found = true;
1080     }
1081   if (weakref && !transparent_alias)
1082     {
1083       error ("node is weakref but not an transparent_alias");
1084       error_found = true;
1085     }
1086   if (transparent_alias && !alias)
1087     {
1088       error ("node is transparent_alias but not an alias");
1089       error_found = true;
1090     }
1091   if (same_comdat_group)
1092     {
1093       symtab_node *n = same_comdat_group;
1094
1095       if (!n->get_comdat_group ())
1096         {
1097           error ("node is in same_comdat_group list but has no comdat_group");
1098           error_found = true;
1099         }
1100       if (n->get_comdat_group () != get_comdat_group ())
1101         {
1102           error ("same_comdat_group list across different groups");
1103           error_found = true;
1104         }
1105       if (n->type != type)
1106         {
1107           error ("mixing different types of symbol in same comdat groups is not supported");
1108           error_found = true;
1109         }
1110       if (n == this)
1111         {
1112           error ("node is alone in a comdat group");
1113           error_found = true;
1114         }
1115       do
1116         {
1117           if (!n->same_comdat_group)
1118             {
1119               error ("same_comdat_group is not a circular list");
1120               error_found = true;
1121               break;
1122             }
1123           n = n->same_comdat_group;
1124         }
1125       while (n != this);
1126       if (comdat_local_p ())
1127         {
1128           ipa_ref *ref = NULL;
1129
1130           for (int i = 0; iterate_referring (i, ref); ++i)
1131             {
1132               if (!in_same_comdat_group_p (ref->referring))
1133                 {
1134                   error ("comdat-local symbol referred to by %s outside its "
1135                          "comdat",
1136                          identifier_to_locale (ref->referring->name()));
1137                   error_found = true;
1138                 }
1139             }
1140         }
1141     }
1142   if (implicit_section && !get_section ())
1143     {
1144       error ("implicit_section flag is set but section isn't");
1145       error_found = true;
1146     }
1147   if (get_section () && get_comdat_group ()
1148       && !implicit_section
1149       && !lookup_attribute ("section", DECL_ATTRIBUTES (decl)))
1150     {
1151       error ("Both section and comdat group is set");
1152       error_found = true;
1153     }
1154   /* TODO: Add string table for sections, so we do not keep holding duplicated
1155      strings.  */
1156   if (alias && definition
1157       && get_section () != get_alias_target ()->get_section ()
1158       && (!get_section()
1159           || !get_alias_target ()->get_section ()
1160           || strcmp (get_section(),
1161                      get_alias_target ()->get_section ())))
1162     {
1163       error ("Alias and target's section differs");
1164       get_alias_target ()->dump (stderr);
1165       error_found = true;
1166     }
1167   if (alias && definition
1168       && get_comdat_group () != get_alias_target ()->get_comdat_group ())
1169     {
1170       error ("Alias and target's comdat groups differs");
1171       get_alias_target ()->dump (stderr);
1172       error_found = true;
1173     }
1174   if (transparent_alias && definition && !weakref)
1175     {
1176       symtab_node *to = get_alias_target ();
1177       const char *name1
1178         = IDENTIFIER_POINTER (
1179             ultimate_transparent_alias_target (DECL_ASSEMBLER_NAME (decl)));
1180       const char *name2
1181         = IDENTIFIER_POINTER (
1182             ultimate_transparent_alias_target (DECL_ASSEMBLER_NAME (to->decl)));
1183       if (!symbol_table::assembler_names_equal_p (name1, name2))
1184         {
1185           error ("Transparent alias and target's assembler names differs");
1186           get_alias_target ()->dump (stderr);
1187           error_found = true;
1188         }
1189     }
1190   if (transparent_alias && definition
1191       && get_alias_target()->transparent_alias && get_alias_target()->analyzed)
1192     {
1193       error ("Chained transparent aliases");
1194       get_alias_target ()->dump (stderr);
1195       error_found = true;
1196     }
1197
1198   return error_found;
1199 }
1200
1201 /* Verify consistency of NODE.  */
1202
1203 DEBUG_FUNCTION void
1204 symtab_node::verify (void)
1205 {
1206   if (seen_error ())
1207     return;
1208
1209   timevar_push (TV_CGRAPH_VERIFY);
1210   if (cgraph_node *node = dyn_cast <cgraph_node *> (this))
1211     node->verify_node ();
1212   else
1213     if (verify_base ())
1214       {
1215         debug ();
1216         internal_error ("symtab_node::verify failed");
1217       }
1218   timevar_pop (TV_CGRAPH_VERIFY);
1219 }
1220
1221 /* Verify symbol table for internal consistency.  */
1222
1223 DEBUG_FUNCTION void
1224 symtab_node::verify_symtab_nodes (void)
1225 {
1226   symtab_node *node;
1227   hash_map<tree, symtab_node *> comdat_head_map (251);
1228
1229   FOR_EACH_SYMBOL (node)
1230     {
1231       node->verify ();
1232       if (node->get_comdat_group ())
1233         {
1234           symtab_node **entry, *s;
1235           bool existed;
1236
1237           entry = &comdat_head_map.get_or_insert (node->get_comdat_group (),
1238                                                   &existed);
1239           if (!existed)
1240             *entry = node;
1241           else if (!DECL_EXTERNAL (node->decl))
1242             {
1243               for (s = (*entry)->same_comdat_group;
1244                    s != NULL && s != node && s != *entry;
1245                    s = s->same_comdat_group)
1246                 ;
1247               if (!s || s == *entry)
1248                 {
1249                   error ("Two symbols with same comdat_group are not linked by "
1250                          "the same_comdat_group list.");
1251                   (*entry)->debug ();
1252                   node->debug ();
1253                   internal_error ("symtab_node::verify failed");
1254                 }
1255             }
1256         }
1257     }
1258 }
1259
1260 /* Make DECL local.  FIXME: We shouldn't need to mess with rtl this early,
1261    but other code such as notice_global_symbol generates rtl.  */
1262
1263 void
1264 symtab_node::make_decl_local (void)
1265 {
1266   rtx rtl, symbol;
1267
1268   if (weakref)
1269     {
1270       weakref = false;
1271       IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl)) = 0;
1272       TREE_CHAIN (DECL_ASSEMBLER_NAME (decl)) = NULL_TREE;
1273       symtab->change_decl_assembler_name
1274          (decl, DECL_ASSEMBLER_NAME (get_alias_target ()->decl));
1275       DECL_ATTRIBUTES (decl) = remove_attribute ("weakref",
1276                                                  DECL_ATTRIBUTES (decl));
1277     }
1278   /* Avoid clearing comdat_groups on comdat-local decls.  */
1279   else if (TREE_PUBLIC (decl) == 0)
1280     return;
1281
1282   /* Localizing a symbol also make all its transparent aliases local.  */
1283   ipa_ref *ref;
1284   for (unsigned i = 0; iterate_direct_aliases (i, ref); i++)
1285     {
1286       struct symtab_node *alias = ref->referring;
1287       if (alias->transparent_alias)
1288         alias->make_decl_local ();
1289     }
1290
1291   if (VAR_P (decl))
1292     {
1293       DECL_COMMON (decl) = 0;
1294       /* ADDRESSABLE flag is not defined for public symbols.  */
1295       TREE_ADDRESSABLE (decl) = 1;
1296       TREE_STATIC (decl) = 1;
1297     }
1298   else
1299     gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1300
1301   DECL_COMDAT (decl) = 0;
1302   DECL_WEAK (decl) = 0;
1303   DECL_EXTERNAL (decl) = 0;
1304   DECL_VISIBILITY_SPECIFIED (decl) = 0;
1305   DECL_VISIBILITY (decl) = VISIBILITY_DEFAULT;
1306   TREE_PUBLIC (decl) = 0;
1307   DECL_DLLIMPORT_P (decl) = 0;
1308   if (!DECL_RTL_SET_P (decl))
1309     return;
1310
1311   /* Update rtl flags.  */
1312   make_decl_rtl (decl);
1313
1314   rtl = DECL_RTL (decl);
1315   if (!MEM_P (rtl))
1316     return;
1317
1318   symbol = XEXP (rtl, 0);
1319   if (GET_CODE (symbol) != SYMBOL_REF)
1320     return;
1321
1322   SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
1323 }
1324
1325 /* Copy visibility from N.
1326    This is useful when THIS becomes a transparent alias of N.  */
1327
1328 void
1329 symtab_node::copy_visibility_from (symtab_node *n)
1330 {
1331   gcc_checking_assert (n->weakref == weakref);
1332
1333   ipa_ref *ref;
1334   for (unsigned i = 0; iterate_direct_aliases (i, ref); i++)
1335     {
1336       struct symtab_node *alias = ref->referring;
1337       if (alias->transparent_alias)
1338         alias->copy_visibility_from (n);
1339     }
1340
1341   if (VAR_P (decl))
1342     {
1343       DECL_COMMON (decl) = DECL_COMMON (n->decl);
1344       /* ADDRESSABLE flag is not defined for public symbols.  */
1345       if (TREE_PUBLIC (decl) && !TREE_PUBLIC (n->decl))
1346         TREE_ADDRESSABLE (decl) = 1;
1347       TREE_STATIC (decl) = TREE_STATIC (n->decl);
1348     }
1349   else gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
1350
1351   DECL_COMDAT (decl) = DECL_COMDAT (n->decl);
1352   DECL_WEAK (decl) = DECL_WEAK (n->decl);
1353   DECL_EXTERNAL (decl) = DECL_EXTERNAL (n->decl);
1354   DECL_VISIBILITY_SPECIFIED (decl) = DECL_VISIBILITY_SPECIFIED (n->decl);
1355   DECL_VISIBILITY (decl) = DECL_VISIBILITY (n->decl);
1356   TREE_PUBLIC (decl) = TREE_PUBLIC (n->decl);
1357   DECL_DLLIMPORT_P (decl) = DECL_DLLIMPORT_P (n->decl);
1358   resolution = n->resolution;
1359   set_comdat_group (n->get_comdat_group ());
1360   call_for_symbol_and_aliases (symtab_node::set_section,
1361                              const_cast<char *>(n->get_section ()), true);
1362   externally_visible = n->externally_visible;
1363   if (!DECL_RTL_SET_P (decl))
1364     return;
1365
1366   /* Update rtl flags.  */
1367   make_decl_rtl (decl);
1368
1369   rtx rtl = DECL_RTL (decl);
1370   if (!MEM_P (rtl))
1371     return;
1372
1373   rtx symbol = XEXP (rtl, 0);
1374   if (GET_CODE (symbol) != SYMBOL_REF)
1375     return;
1376
1377   SYMBOL_REF_WEAK (symbol) = DECL_WEAK (decl);
1378 }
1379
1380 /* Walk the alias chain to return the symbol NODE is alias of.
1381    If NODE is not an alias, return NODE.
1382    Assumes NODE is known to be alias.  */
1383
1384 symtab_node *
1385 symtab_node::ultimate_alias_target_1 (enum availability *availability,
1386                                       symtab_node *ref)
1387 {
1388   bool transparent_p = false;
1389
1390   /* To determine visibility of the target, we follow ELF semantic of aliases.
1391      Here alias is an alternative assembler name of a given definition. Its
1392      availability prevails the availability of its target (i.e. static alias of
1393      weak definition is available.
1394
1395      Transaparent alias is just alternative anme of a given symbol used within
1396      one compilation unit and is translated prior hitting the object file.  It
1397      inherits the visibility of its target.
1398      Weakref is a different animal (and noweak definition is weak).
1399
1400      If we ever get into supporting targets with different semantics, a target
1401      hook will be needed here.  */
1402
1403   if (availability)
1404     {
1405       transparent_p = transparent_alias;
1406       if (!transparent_p)
1407         *availability = get_availability (ref);
1408       else
1409         *availability = AVAIL_NOT_AVAILABLE;
1410     }
1411
1412   symtab_node *node = this;
1413   while (node)
1414     {
1415       if (node->alias && node->analyzed)
1416         node = node->get_alias_target ();
1417       else
1418         {
1419           if (!availability || (!transparent_p && node->analyzed))
1420             ;
1421           else if (node->analyzed && !node->transparent_alias)
1422             *availability = node->get_availability (ref);
1423           else
1424             *availability = AVAIL_NOT_AVAILABLE;
1425           return node;
1426         }
1427       if (node && availability && transparent_p
1428           && node->transparent_alias)
1429         {
1430           *availability = node->get_availability (ref);
1431           transparent_p = false;
1432         }
1433     }
1434   if (availability)
1435     *availability = AVAIL_NOT_AVAILABLE;
1436   return NULL;
1437 }
1438
1439 /* C++ FE sometimes change linkage flags after producing same body aliases.
1440
1441    FIXME: C++ produce implicit aliases for virtual functions and vtables that
1442    are obviously equivalent.  The way it is doing so is however somewhat
1443    kludgy and interferes with the visibility code. As a result we need to
1444    copy the visibility from the target to get things right.  */
1445
1446 void
1447 symtab_node::fixup_same_cpp_alias_visibility (symtab_node *target)
1448 {
1449   if (is_a <cgraph_node *> (this))
1450     {
1451       DECL_DECLARED_INLINE_P (decl)
1452          = DECL_DECLARED_INLINE_P (target->decl);
1453       DECL_DISREGARD_INLINE_LIMITS (decl)
1454          = DECL_DISREGARD_INLINE_LIMITS (target->decl);
1455     }
1456   /* FIXME: It is not really clear why those flags should not be copied for
1457      functions, too.  */
1458   else
1459     {
1460       DECL_WEAK (decl) = DECL_WEAK (target->decl);
1461       DECL_EXTERNAL (decl) = DECL_EXTERNAL (target->decl);
1462       DECL_VISIBILITY (decl) = DECL_VISIBILITY (target->decl);
1463     }
1464   if (TREE_PUBLIC (decl))
1465     {
1466       tree group;
1467
1468       DECL_EXTERNAL (decl) = DECL_EXTERNAL (target->decl);
1469       DECL_COMDAT (decl) = DECL_COMDAT (target->decl);
1470       group = target->get_comdat_group ();
1471       set_comdat_group (group);
1472       if (group && !same_comdat_group)
1473         add_to_same_comdat_group (target);
1474     }
1475   externally_visible = target->externally_visible;
1476 }
1477
1478 /* Set section, do not recurse into aliases.
1479    When one wants to change section of a symbol and its aliases,
1480    use set_section.  */
1481
1482 void
1483 symtab_node::set_section_for_node (const char *section)
1484 {
1485   const char *current = get_section ();
1486   section_hash_entry **slot;
1487
1488   if (current == section
1489       || (current && section
1490           && !strcmp (current, section)))
1491     return;
1492
1493   if (current)
1494     {
1495       x_section->ref_count--;
1496       if (!x_section->ref_count)
1497         {
1498           hashval_t hash = htab_hash_string (x_section->name);
1499           slot = symtab->section_hash->find_slot_with_hash (x_section->name,
1500                                                             hash, INSERT);
1501           ggc_free (x_section);
1502           symtab->section_hash->clear_slot (slot);
1503         }
1504       x_section = NULL;
1505     }
1506   if (!section)
1507     {
1508       implicit_section = false;
1509       return;
1510     }
1511   if (!symtab->section_hash)
1512     symtab->section_hash = hash_table<section_name_hasher>::create_ggc (10);
1513   slot = symtab->section_hash->find_slot_with_hash (section,
1514                                                     htab_hash_string (section),
1515                                                     INSERT);
1516   if (*slot)
1517     x_section = (section_hash_entry *)*slot;
1518   else
1519     {
1520       int len = strlen (section);
1521       *slot = x_section = ggc_cleared_alloc<section_hash_entry> ();
1522       x_section->name = ggc_vec_alloc<char> (len + 1);
1523       memcpy (x_section->name, section, len + 1);
1524     }
1525   x_section->ref_count++;
1526 }
1527
1528 /* Worker for set_section.  */
1529
1530 bool
1531 symtab_node::set_section (symtab_node *n, void *s)
1532 {
1533   n->set_section_for_node ((char *)s);
1534   return false;
1535 }
1536
1537 /* Set section of symbol and its aliases.  */
1538
1539 void
1540 symtab_node::set_section (const char *section)
1541 {
1542   gcc_assert (!this->alias);
1543   call_for_symbol_and_aliases
1544     (symtab_node::set_section, const_cast<char *>(section), true);
1545 }
1546
1547 /* Return the initialization priority.  */
1548
1549 priority_type
1550 symtab_node::get_init_priority ()
1551 {
1552   if (!this->in_init_priority_hash)
1553     return DEFAULT_INIT_PRIORITY;
1554
1555   symbol_priority_map *h = symtab->init_priority_hash->get (this);
1556   return h ? h->init : DEFAULT_INIT_PRIORITY;
1557 }
1558
1559 /* Return the finalization priority.  */
1560
1561 priority_type
1562 cgraph_node::get_fini_priority ()
1563 {
1564   if (!this->in_init_priority_hash)
1565     return DEFAULT_INIT_PRIORITY;
1566   symbol_priority_map *h = symtab->init_priority_hash->get (this);
1567   return h ? h->fini : DEFAULT_INIT_PRIORITY;
1568 }
1569
1570 /* Return the initialization and finalization priority information for
1571    DECL.  If there is no previous priority information, a freshly
1572    allocated structure is returned.  */
1573
1574 symbol_priority_map *
1575 symtab_node::priority_info (void)
1576 {
1577   if (!symtab->init_priority_hash)
1578     symtab->init_priority_hash = hash_map<symtab_node *, symbol_priority_map>::create_ggc (13);
1579
1580   bool existed;
1581   symbol_priority_map *h
1582     = &symtab->init_priority_hash->get_or_insert (this, &existed);
1583   if (!existed)
1584     {
1585       h->init = DEFAULT_INIT_PRIORITY;
1586       h->fini = DEFAULT_INIT_PRIORITY;
1587       in_init_priority_hash = true;
1588     }
1589
1590   return h;
1591 }
1592
1593 /* Set initialization priority to PRIORITY.  */
1594
1595 void
1596 symtab_node::set_init_priority (priority_type priority)
1597 {
1598   symbol_priority_map *h;
1599
1600   if (is_a <cgraph_node *> (this))
1601     gcc_assert (DECL_STATIC_CONSTRUCTOR (this->decl));
1602
1603   if (priority == DEFAULT_INIT_PRIORITY)
1604     {
1605       gcc_assert (get_init_priority() == priority);
1606       return;
1607     }
1608   h = priority_info ();
1609   h->init = priority;
1610 }
1611
1612 /* Set fialization priority to PRIORITY.  */
1613
1614 void
1615 cgraph_node::set_fini_priority (priority_type priority)
1616 {
1617   symbol_priority_map *h;
1618
1619   gcc_assert (DECL_STATIC_DESTRUCTOR (this->decl));
1620
1621   if (priority == DEFAULT_INIT_PRIORITY)
1622     {
1623       gcc_assert (get_fini_priority() == priority);
1624       return;
1625     }
1626   h = priority_info ();
1627   h->fini = priority;
1628 }
1629
1630 /* Worker for symtab_resolve_alias.  */
1631
1632 bool
1633 symtab_node::set_implicit_section (symtab_node *n,
1634                                    void *data ATTRIBUTE_UNUSED)
1635 {
1636   n->implicit_section = true;
1637   return false;
1638 }
1639
1640 /* Add reference recording that symtab node is alias of TARGET.
1641    The function can fail in the case of aliasing cycles; in this case
1642    it returns false.  */
1643
1644 bool
1645 symtab_node::resolve_alias (symtab_node *target, bool transparent)
1646 {
1647   symtab_node *n;
1648
1649   gcc_assert (!analyzed && !vec_safe_length (ref_list.references));
1650
1651   /* Never let cycles to creep into the symbol table alias references;
1652      those will make alias walkers to be infinite.  */
1653   for (n = target; n && n->alias;
1654        n = n->analyzed ? n->get_alias_target () : NULL)
1655     if (n == this)
1656        {
1657          if (is_a <cgraph_node *> (this))
1658            error ("function %q+D part of alias cycle", decl);
1659          else if (is_a <varpool_node *> (this))
1660            error ("variable %q+D part of alias cycle", decl);
1661          else
1662            gcc_unreachable ();
1663          alias = false;
1664          return false;
1665        }
1666
1667   /* "analyze" the node - i.e. mark the reference.  */
1668   definition = true;
1669   alias = true;
1670   analyzed = true;
1671   transparent |= transparent_alias;
1672   transparent_alias = transparent;
1673   if (transparent)
1674     while (target->transparent_alias && target->analyzed)
1675       target = target->get_alias_target ();
1676   create_reference (target, IPA_REF_ALIAS, NULL);
1677
1678   /* Add alias into the comdat group of its target unless it is already there.  */
1679   if (same_comdat_group)
1680     remove_from_same_comdat_group ();
1681   set_comdat_group (NULL);
1682   if (target->get_comdat_group ())
1683     add_to_same_comdat_group (target);
1684
1685   if ((get_section () != target->get_section ()
1686        || target->get_comdat_group ()) && get_section () && !implicit_section)
1687     {
1688       error ("section of alias %q+D must match section of its target", decl);
1689     }
1690   call_for_symbol_and_aliases (symtab_node::set_section,
1691                              const_cast<char *>(target->get_section ()), true);
1692   if (target->implicit_section)
1693     call_for_symbol_and_aliases (set_implicit_section, NULL, true);
1694
1695   /* Alias targets become redundant after alias is resolved into an reference.
1696      We do not want to keep it around or we would have to mind updating them
1697      when renaming symbols.  */
1698   alias_target = NULL;
1699
1700   if (!transparent && cpp_implicit_alias && symtab->state >= CONSTRUCTION)
1701     fixup_same_cpp_alias_visibility (target);
1702
1703   /* If alias has address taken, so does the target.  */
1704   if (address_taken)
1705     target->ultimate_alias_target ()->address_taken = true;
1706
1707   /* All non-transparent aliases of THIS are now in fact aliases of TARGET.
1708      If alias is transparent, also all transparent aliases of THIS are now
1709      aliases of TARGET.
1710      Also merge same comdat group lists.  */
1711   ipa_ref *ref;
1712   for (unsigned i = 0; iterate_direct_aliases (i, ref);)
1713     {
1714       struct symtab_node *alias_alias = ref->referring;
1715       if (alias_alias->get_comdat_group ())
1716         {
1717           alias_alias->remove_from_same_comdat_group ();
1718           alias_alias->set_comdat_group (NULL);
1719           if (target->get_comdat_group ())
1720             alias_alias->add_to_same_comdat_group (target);
1721         }
1722       if (!alias_alias->transparent_alias || transparent)
1723         {
1724           alias_alias->remove_all_references ();
1725           alias_alias->create_reference (target, IPA_REF_ALIAS, NULL);
1726         }
1727       else i++;
1728     }
1729   return true;
1730 }
1731
1732 /* Worker searching noninterposable alias.  */
1733
1734 bool
1735 symtab_node::noninterposable_alias (symtab_node *node, void *data)
1736 {
1737   if (!node->transparent_alias && decl_binds_to_current_def_p (node->decl))
1738     {
1739       symtab_node *fn = node->ultimate_alias_target ();
1740
1741       /* Ensure that the alias is well formed this may not be the case
1742          of user defined aliases and currently it is not always the case
1743          of C++ same body aliases (that is a bug).  */
1744       if (TREE_TYPE (node->decl) != TREE_TYPE (fn->decl)
1745           || DECL_CONTEXT (node->decl) != DECL_CONTEXT (fn->decl)
1746           || (TREE_CODE (node->decl) == FUNCTION_DECL
1747               && flags_from_decl_or_type (node->decl)
1748                  != flags_from_decl_or_type (fn->decl))
1749           || DECL_ATTRIBUTES (node->decl) != DECL_ATTRIBUTES (fn->decl))
1750         return false;
1751       *(symtab_node **)data = node;
1752       return true;
1753     }
1754   return false;
1755 }
1756
1757 /* If node can not be overwriten by static or dynamic linker to point to
1758    different definition, return NODE. Otherwise look for alias with such
1759    property and if none exists, introduce new one.  */
1760
1761 symtab_node *
1762 symtab_node::noninterposable_alias (void)
1763 {
1764   tree new_decl;
1765   symtab_node *new_node = NULL;
1766
1767   /* First try to look up existing alias or base object
1768      (if that is already non-overwritable).  */
1769   symtab_node *node = ultimate_alias_target ();
1770   gcc_assert (!node->alias && !node->weakref);
1771   node->call_for_symbol_and_aliases (symtab_node::noninterposable_alias,
1772                                    (void *)&new_node, true);
1773   if (new_node)
1774     return new_node;
1775
1776   /* If aliases aren't supported by the assembler, fail.  */
1777   if (!TARGET_SUPPORTS_ALIASES)
1778     return NULL;
1779
1780   /* Otherwise create a new one.  */
1781   new_decl = copy_node (node->decl);
1782   DECL_DLLIMPORT_P (new_decl) = 0;
1783   DECL_NAME (new_decl) = clone_function_name (node->decl, "localalias");
1784   if (TREE_CODE (new_decl) == FUNCTION_DECL)
1785     DECL_STRUCT_FUNCTION (new_decl) = NULL;
1786   DECL_INITIAL (new_decl) = NULL;
1787   SET_DECL_ASSEMBLER_NAME (new_decl, DECL_NAME (new_decl));
1788   SET_DECL_RTL (new_decl, NULL);
1789
1790   /* Update the properties.  */
1791   DECL_EXTERNAL (new_decl) = 0;
1792   TREE_PUBLIC (new_decl) = 0;
1793   DECL_COMDAT (new_decl) = 0;
1794   DECL_WEAK (new_decl) = 0;
1795
1796   /* Since the aliases can be added to vtables, keep DECL_VIRTUAL flag.  */
1797   DECL_VIRTUAL_P (new_decl) = DECL_VIRTUAL_P (node->decl);
1798   if (TREE_CODE (new_decl) == FUNCTION_DECL)
1799     {
1800       DECL_STATIC_CONSTRUCTOR (new_decl) = 0;
1801       DECL_STATIC_DESTRUCTOR (new_decl) = 0;
1802       new_node = cgraph_node::create_alias (new_decl, node->decl);
1803     }
1804   else
1805     {
1806       TREE_READONLY (new_decl) = TREE_READONLY (node->decl);
1807       DECL_INITIAL (new_decl) = error_mark_node;
1808       new_node = varpool_node::create_alias (new_decl, node->decl);
1809     }
1810   new_node->resolve_alias (node);
1811   gcc_assert (decl_binds_to_current_def_p (new_decl)
1812               && targetm.binds_local_p (new_decl));
1813   return new_node;
1814 }
1815
1816 /* Return true if symtab node and TARGET represents
1817    semantically equivalent symbols.  */
1818
1819 bool
1820 symtab_node::semantically_equivalent_p (symtab_node *target)
1821 {
1822   enum availability avail;
1823   symtab_node *ba;
1824   symtab_node *bb;
1825
1826   /* Equivalent functions are equivalent.  */
1827   if (decl == target->decl)
1828     return true;
1829
1830   /* If symbol is not overwritable by different implementation,
1831      walk to the base object it defines.  */
1832   ba = ultimate_alias_target (&avail);
1833   if (avail >= AVAIL_AVAILABLE)
1834     {
1835       if (target == ba)
1836         return true;
1837     }
1838   else
1839     ba = this;
1840   bb = target->ultimate_alias_target (&avail);
1841   if (avail >= AVAIL_AVAILABLE)
1842     {
1843       if (this == bb)
1844         return true;
1845     }
1846   else
1847     bb = target;
1848   return bb == ba;
1849 }
1850
1851 /* Classify symbol symtab node for partitioning.  */
1852
1853 enum symbol_partitioning_class
1854 symtab_node::get_partitioning_class (void)
1855 {
1856   /* Inline clones are always duplicated.
1857      This include external delcarations.   */
1858   cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
1859
1860   if (DECL_ABSTRACT_P (decl))
1861     return SYMBOL_EXTERNAL;
1862
1863   if (cnode && cnode->global.inlined_to)
1864     return SYMBOL_DUPLICATE;
1865
1866   /* Transparent aliases are always duplicated.  */
1867   if (transparent_alias)
1868     return definition ? SYMBOL_DUPLICATE : SYMBOL_EXTERNAL;
1869
1870   /* External declarations are external.  */
1871   if (DECL_EXTERNAL (decl))
1872     return SYMBOL_EXTERNAL;
1873
1874   if (varpool_node *vnode = dyn_cast <varpool_node *> (this))
1875     {
1876       if (alias && definition && !ultimate_alias_target ()->definition)
1877         return SYMBOL_EXTERNAL;
1878       /* Constant pool references use local symbol names that can not
1879          be promoted global.  We should never put into a constant pool
1880          objects that can not be duplicated across partitions.  */
1881       if (DECL_IN_CONSTANT_POOL (decl))
1882         return SYMBOL_DUPLICATE;
1883       if (DECL_HARD_REGISTER (decl))
1884         return SYMBOL_DUPLICATE;
1885       gcc_checking_assert (vnode->definition);
1886     }
1887   /* Functions that are cloned may stay in callgraph even if they are unused.
1888      Handle them as external; compute_ltrans_boundary take care to make
1889      proper things to happen (i.e. to make them appear in the boundary but
1890      with body streamed, so clone can me materialized).  */
1891   else if (!dyn_cast <cgraph_node *> (this)->function_symbol ()->definition)
1892     return SYMBOL_EXTERNAL;
1893
1894   /* Linker discardable symbols are duplicated to every use unless they are
1895      keyed.  */
1896   if (DECL_ONE_ONLY (decl)
1897       && !force_output
1898       && !forced_by_abi
1899       && !used_from_object_file_p ())
1900     return SYMBOL_DUPLICATE;
1901
1902   return SYMBOL_PARTITION;
1903 }
1904
1905 /* Return true when symbol is known to be non-zero.  */
1906
1907 bool
1908 symtab_node::nonzero_address ()
1909 {
1910   /* Weakrefs may be NULL when their target is not defined.  */
1911   if (alias && weakref)
1912     {
1913       if (analyzed)
1914         {
1915           symtab_node *target = ultimate_alias_target ();
1916
1917           if (target->alias && target->weakref)
1918             return false;
1919           /* We can not recurse to target::nonzero.  It is possible that the
1920              target is used only via the alias.
1921              We may walk references and look for strong use, but we do not know
1922              if this strong use will survive to final binary, so be
1923              conservative here.  
1924              ??? Maybe we could do the lookup during late optimization that
1925              could be useful to eliminate the NULL pointer checks in LTO
1926              programs.  */
1927           if (target->definition && !DECL_EXTERNAL (target->decl))
1928               return true;
1929           if (target->resolution != LDPR_UNKNOWN
1930               && target->resolution != LDPR_UNDEF
1931               && !target->can_be_discarded_p ()
1932               && flag_delete_null_pointer_checks)
1933             return true;
1934           return false;
1935         }
1936       else
1937         return false;
1938     }
1939
1940   /* With !flag_delete_null_pointer_checks we assume that symbols may
1941      bind to NULL. This is on by default on embedded targets only.
1942
1943      Otherwise all non-WEAK symbols must be defined and thus non-NULL or
1944      linking fails.  Important case of WEAK we want to do well are comdats.
1945      Those are handled by later check for definition.
1946
1947      When parsing, beware the cases when WEAK attribute is added later.  */
1948   if (!DECL_WEAK (decl)
1949       && flag_delete_null_pointer_checks)
1950     {
1951       refuse_visibility_changes = true;
1952       return true;
1953     }
1954
1955   /* If target is defined and not extern, we know it will be output and thus
1956      it will bind to non-NULL.
1957      Play safe for flag_delete_null_pointer_checks where weak definition maye
1958      be re-defined by NULL.  */
1959   if (definition && !DECL_EXTERNAL (decl)
1960       && (flag_delete_null_pointer_checks || !DECL_WEAK (decl)))
1961     {
1962       if (!DECL_WEAK (decl))
1963         refuse_visibility_changes = true;
1964       return true;
1965     }
1966
1967   /* As the last resort, check the resolution info.  */
1968   if (resolution != LDPR_UNKNOWN
1969       && resolution != LDPR_UNDEF
1970       && !can_be_discarded_p ()
1971       && flag_delete_null_pointer_checks)
1972     return true;
1973   return false;
1974 }
1975
1976 /* Return 0 if symbol is known to have different address than S2,
1977    Return 1 if symbol is known to have same address as S2,
1978    return -1 otherwise.  
1979
1980    If MEMORY_ACCESSED is true, assume that both memory pointer to THIS
1981    and S2 is going to be accessed.  This eliminates the situations when
1982    either THIS or S2 is NULL and is seful for comparing bases when deciding
1983    about memory aliasing.  */
1984 int
1985 symtab_node::equal_address_to (symtab_node *s2, bool memory_accessed)
1986 {
1987   enum availability avail1, avail2;
1988
1989   /* A Shortcut: equivalent symbols are always equivalent.  */
1990   if (this == s2)
1991     return 1;
1992
1993   /* Unwind transparent aliases first; those are always equal to their
1994      target.  */
1995   if (this->transparent_alias && this->analyzed)
1996     return this->get_alias_target ()->equal_address_to (s2);
1997   while (s2->transparent_alias && s2->analyzed)
1998     s2 = s2->get_alias_target();
1999
2000   if (this == s2)
2001     return 1;
2002
2003   /* For non-interposable aliases, lookup and compare their actual definitions.
2004      Also check if the symbol needs to bind to given definition.  */
2005   symtab_node *rs1 = ultimate_alias_target (&avail1);
2006   symtab_node *rs2 = s2->ultimate_alias_target (&avail2);
2007   bool binds_local1 = rs1->analyzed && decl_binds_to_current_def_p (this->decl);
2008   bool binds_local2 = rs2->analyzed && decl_binds_to_current_def_p (s2->decl);
2009   bool really_binds_local1 = binds_local1;
2010   bool really_binds_local2 = binds_local2;
2011
2012   /* Addresses of vtables and virtual functions can not be used by user
2013      code and are used only within speculation.  In this case we may make
2014      symbol equivalent to its alias even if interposition may break this
2015      rule.  Doing so will allow us to turn speculative inlining into
2016      non-speculative more agressively.  */
2017   if (DECL_VIRTUAL_P (this->decl) && avail1 >= AVAIL_AVAILABLE)
2018     binds_local1 = true;
2019   if (DECL_VIRTUAL_P (s2->decl) && avail2 >= AVAIL_AVAILABLE)
2020     binds_local2 = true;
2021
2022   /* If both definitions are available we know that even if they are bound
2023      to other unit they must be defined same way and therefore we can use
2024      equivalence test.  */
2025   if (rs1 != rs2 && avail1 >= AVAIL_AVAILABLE && avail2 >= AVAIL_AVAILABLE)
2026     binds_local1 = binds_local2 = true;
2027
2028   if (binds_local1 && binds_local2 && rs1 == rs2)
2029     {
2030       /* We made use of the fact that alias is not weak.  */
2031       if (rs1 != this)
2032         refuse_visibility_changes = true;
2033       if (rs2 != s2)
2034         s2->refuse_visibility_changes = true;
2035       return 1;
2036     }
2037
2038   /* If both symbols may resolve to NULL, we can not really prove them
2039      different.  */
2040   if (!memory_accessed && !nonzero_address () && !s2->nonzero_address ())
2041     return -1;
2042
2043   /* Except for NULL, functions and variables never overlap.  */
2044   if (TREE_CODE (decl) != TREE_CODE (s2->decl))
2045     return 0;
2046
2047   /* If one of the symbols is unresolved alias, punt.  */
2048   if (rs1->alias || rs2->alias)
2049     return -1;
2050
2051   /* If we have a non-interposale definition of at least one of the symbols
2052      and the other symbol is different, we know other unit can not interpose
2053      it to the first symbol; all aliases of the definition needs to be 
2054      present in the current unit.  */
2055   if (((really_binds_local1 || really_binds_local2)
2056       /* If we have both definitions and they are different, we know they
2057          will be different even in units they binds to.  */
2058        || (binds_local1 && binds_local2))
2059       && rs1 != rs2)
2060     {
2061       /* We make use of the fact that one symbol is not alias of the other
2062          and that the definition is non-interposable.  */
2063       refuse_visibility_changes = true;
2064       s2->refuse_visibility_changes = true;
2065       rs1->refuse_visibility_changes = true;
2066       rs2->refuse_visibility_changes = true;
2067       return 0;
2068     }
2069
2070   /* TODO: Alias oracle basically assume that addresses of global variables
2071      are different unless they are declared as alias of one to another while
2072      the code folding comparsions doesn't.
2073      We probably should be consistent and use this fact here, too, but for
2074      the moment return false only when we are called from the alias oracle.  */
2075
2076   return memory_accessed && rs1 != rs2 ? 0 : -1;
2077 }
2078
2079 /* Worker for call_for_symbol_and_aliases.  */
2080
2081 bool
2082 symtab_node::call_for_symbol_and_aliases_1 (bool (*callback) (symtab_node *,
2083                                                               void *),
2084                                             void *data,
2085                                             bool include_overwritable)
2086 {
2087   ipa_ref *ref;
2088   FOR_EACH_ALIAS (this, ref)
2089     {
2090       symtab_node *alias = ref->referring;
2091       if (include_overwritable
2092           || alias->get_availability () > AVAIL_INTERPOSABLE)
2093         if (alias->call_for_symbol_and_aliases (callback, data,
2094                                               include_overwritable))
2095           return true;
2096     }
2097   return false;
2098 }
2099
2100 /* Return true if address of N is possibly compared.  */
2101
2102 static bool
2103 address_matters_1 (symtab_node *n, void *)
2104 {
2105   struct ipa_ref *ref;
2106
2107   if (!n->address_can_be_compared_p ())
2108     return false;
2109   if (n->externally_visible || n->force_output)
2110     return true;
2111
2112   for (unsigned int i = 0; n->iterate_referring (i, ref); i++)
2113     if (ref->address_matters_p ())
2114       return true;
2115   return false;
2116 }
2117
2118 /* Return true if symbol's address may possibly be compared to other
2119    symbol's address.  */
2120
2121 bool
2122 symtab_node::address_matters_p ()
2123 {
2124   gcc_assert (!alias);
2125   return call_for_symbol_and_aliases (address_matters_1, NULL, true);
2126 }
2127
2128 /* Return true if symbol's alignment may be increased.  */
2129
2130 bool
2131 symtab_node::can_increase_alignment_p (void)
2132 {
2133   symtab_node *target = ultimate_alias_target ();
2134
2135   /* For now support only variables.  */
2136   if (!VAR_P (decl))
2137     return false;
2138
2139   /* With -fno-toplevel-reorder we may have already output the constant.  */
2140   if (TREE_ASM_WRITTEN (target->decl))
2141     return false;
2142
2143   /* If target is already placed in an anchor, we can not touch its
2144      alignment.  */
2145   if (DECL_RTL_SET_P (target->decl)
2146       && MEM_P (DECL_RTL (target->decl))
2147       && SYMBOL_REF_HAS_BLOCK_INFO_P (XEXP (DECL_RTL (target->decl), 0)))
2148     return false;
2149
2150   /* Constant pool entries may be shared.  */
2151   if (DECL_IN_CONSTANT_POOL (target->decl))
2152     return false;
2153
2154   /* We cannot change alignment of symbols that may bind to symbols
2155      in other translation unit that may contain a definition with lower
2156      alignment.  */
2157   if (!decl_binds_to_current_def_p (decl))
2158     return false;
2159
2160   /* When compiling partition, be sure the symbol is not output by other
2161      partition.  */
2162   if (flag_ltrans
2163       && (target->in_other_partition
2164           || target->get_partitioning_class () == SYMBOL_DUPLICATE))
2165     return false;
2166
2167   /* Do not override the alignment as specified by the ABI when the used
2168      attribute is set.  */
2169   if (DECL_PRESERVE_P (decl) || DECL_PRESERVE_P (target->decl))
2170     return false;
2171
2172   /* Do not override explicit alignment set by the user when an explicit
2173      section name is also used.  This is a common idiom used by many
2174      software projects.  */
2175   if (DECL_SECTION_NAME (target->decl) != NULL && !target->implicit_section)
2176     return false;
2177
2178   return true;
2179 }
2180
2181 /* Worker for symtab_node::increase_alignment.  */
2182
2183 static bool
2184 increase_alignment_1 (symtab_node *n, void *v)
2185 {
2186   unsigned int align = (size_t)v;
2187   if (DECL_ALIGN (n->decl) < align
2188       && n->can_increase_alignment_p ())
2189     {
2190       SET_DECL_ALIGN (n->decl, align);
2191       DECL_USER_ALIGN (n->decl) = 1;
2192     }
2193   return false;
2194 }
2195
2196 /* Increase alignment of THIS to ALIGN.  */
2197
2198 void
2199 symtab_node::increase_alignment (unsigned int align)
2200 {
2201   gcc_assert (can_increase_alignment_p () && align < MAX_OFILE_ALIGNMENT);
2202   ultimate_alias_target()->call_for_symbol_and_aliases (increase_alignment_1,
2203                                                         (void *)(size_t) align,
2204                                                         true);
2205   gcc_assert (DECL_ALIGN (decl) >= align);
2206 }
2207
2208 /* Helper for symtab_node::definition_alignment.  */
2209
2210 static bool
2211 get_alignment_1 (symtab_node *n, void *v)
2212 {
2213   *((unsigned int *)v) = MAX (*((unsigned int *)v), DECL_ALIGN (n->decl));
2214   return false;
2215 }
2216
2217 /* Return desired alignment of the definition.  This is NOT alignment useful
2218    to access THIS, because THIS may be interposable and DECL_ALIGN should
2219    be used instead.  It however must be guaranteed when output definition
2220    of THIS.  */
2221
2222 unsigned int
2223 symtab_node::definition_alignment ()
2224 {
2225   unsigned int align = 0;
2226   gcc_assert (!alias);
2227   call_for_symbol_and_aliases (get_alignment_1, &align, true);
2228   return align;
2229 }
2230
2231 /* Return symbol used to separate symbol name from suffix.  */
2232
2233 char 
2234 symbol_table::symbol_suffix_separator ()
2235 {
2236 #ifndef NO_DOT_IN_LABEL
2237   return '.';
2238 #elif !defined NO_DOLLAR_IN_LABEL
2239   return '$';
2240 #else
2241   return '_';
2242 #endif
2243 }
2244
2245 /* Return true when references to this symbol from REF must bind to current
2246    definition in final executable.  */
2247
2248 bool
2249 symtab_node::binds_to_current_def_p (symtab_node *ref)
2250 {
2251   if (!definition)
2252     return false;
2253   if (transparent_alias)
2254     return definition
2255            && get_alias_target()->binds_to_current_def_p (ref);
2256   if (lookup_attribute ("ifunc", DECL_ATTRIBUTES (decl)))
2257     return false;
2258   if (decl_binds_to_current_def_p (decl))
2259     return true;
2260
2261   /* Inline clones always binds locally.  */
2262   cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2263   if (cnode && cnode->global.inlined_to)
2264     return true;
2265
2266   if (DECL_EXTERNAL (decl))
2267     return false;
2268
2269   gcc_assert (externally_visible);
2270
2271   if (ref)
2272     {
2273       cgraph_node *cref = dyn_cast <cgraph_node *> (ref);
2274       if (cref)
2275         ref = cref->global.inlined_to;
2276     }
2277
2278   /* If this is a reference from symbol itself and there are no aliases, we
2279      may be sure that the symbol was not interposed by something else because
2280      the symbol itself would be unreachable otherwise.  This is important
2281      to optimize recursive functions well.
2282
2283      This assumption may be broken by inlining: if symbol is interposable
2284      but the body is available (i.e. declared inline), inliner may make
2285      the body reachable even with interposition.  */
2286   if (this == ref && !has_aliases_p ()
2287       && (!cnode
2288           || symtab->state >= IPA_SSA_AFTER_INLINING
2289           || get_availability () >= AVAIL_INTERPOSABLE))
2290     return true;
2291
2292
2293   /* References within one comdat group are always bound in a group.  */
2294   if (ref
2295       && symtab->state >= IPA_SSA_AFTER_INLINING
2296       && get_comdat_group ()
2297       && get_comdat_group () == ref->get_comdat_group ())
2298     return true;
2299
2300   return false;
2301 }
2302
2303 /* Return true if symbol should be output to the symbol table.  */
2304
2305 bool
2306 symtab_node::output_to_lto_symbol_table_p (void)
2307 {
2308   /* Only externally visible symbols matter.  */
2309   if (!TREE_PUBLIC (decl))
2310     return false;
2311   if (!real_symbol_p ())
2312     return false;
2313   /* FIXME: variables probably should not be considered as real symbols at
2314      first place.  */
2315   if (VAR_P (decl) && DECL_HARD_REGISTER (decl))
2316     return false;
2317   /* FIXME: Builtins corresponding to real functions probably should have
2318      symbol table entries.  */
2319   if (is_builtin_fn (decl))
2320     return false;
2321
2322   /* We have real symbol that should be in symbol table.  However try to trim
2323      down the refernces to libraries bit more because linker will otherwise
2324      bring unnecesary object files into the final link.
2325      FIXME: The following checks can easily be confused i.e. by self recursive
2326      function or self-referring variable.  */
2327
2328   /* We keep external functions in symtab for sake of inlining
2329      and devirtualization.  We do not want to see them in symbol table as
2330      references unless they are really used.  */
2331   cgraph_node *cnode = dyn_cast <cgraph_node *> (this);
2332   if (cnode && (!definition || DECL_EXTERNAL (decl))
2333       && cnode->callers)
2334     return true;
2335
2336  /* Ignore all references from external vars initializers - they are not really
2337     part of the compilation unit until they are used by folding.  Some symbols,
2338     like references to external construction vtables can not be referred to at
2339     all.  We decide this at can_refer_decl_in_current_unit_p.  */
2340  if (!definition || DECL_EXTERNAL (decl))
2341     {
2342       int i;
2343       struct ipa_ref *ref;
2344       for (i = 0; iterate_referring (i, ref); i++)
2345         {
2346           if (ref->use == IPA_REF_ALIAS)
2347             continue;
2348           if (is_a <cgraph_node *> (ref->referring))
2349             return true;
2350           if (!DECL_EXTERNAL (ref->referring->decl))
2351             return true;
2352         }
2353       return false;
2354     }
2355   return true;
2356 }