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