]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/varpool.c
* cgraph.c (cgraph_node_name): Remove.
[thirdparty/gcc.git] / gcc / varpool.c
1 /* Callgraph handling code.
2 Copyright (C) 2003, 2004, 2005, 2006, 2007, 2008, 2010, 2011
3 Free Software Foundation, Inc.
4 Contributed by Jan Hubicka
5
6 This file is part of GCC.
7
8 GCC is free software; you can redistribute it and/or modify it under
9 the terms of the GNU General Public License as published by the Free
10 Software Foundation; either version 3, or (at your option) any later
11 version.
12
13 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14 WARRANTY; without even the implied warranty of MERCHANTABILITY or
15 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
16 for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with GCC; see the file COPYING3. If not see
20 <http://www.gnu.org/licenses/>. */
21
22 #include "config.h"
23 #include "system.h"
24 #include "coretypes.h"
25 #include "tm.h"
26 #include "tree.h"
27 #include "cgraph.h"
28 #include "langhooks.h"
29 #include "diagnostic-core.h"
30 #include "hashtab.h"
31 #include "ggc.h"
32 #include "timevar.h"
33 #include "debug.h"
34 #include "target.h"
35 #include "output.h"
36 #include "gimple.h"
37 #include "tree-flow.h"
38 #include "flags.h"
39
40 /* This file contains basic routines manipulating variable pool.
41
42 Varpool acts as interface in between the front-end and middle-end
43 and drives the decision process on what variables and when are
44 going to be compiled.
45
46 The varpool nodes are allocated lazily for declarations
47 either by frontend or at callgraph construction time.
48 All variables supposed to be output into final file needs to be
49 explicitly marked by frontend via VARPOOL_FINALIZE_DECL function. */
50
51 /* Queue of cgraph nodes scheduled to be lowered and output.
52 The queue is maintained via mark_needed_node, linked via node->next_needed
53 pointer.
54
55 LAST_NEEDED_NODE points to the end of queue, so it can be
56 maintained in forward order. GTY is needed to make it friendly to
57 PCH.
58
59 During compilation we construct the queue of needed variables
60 twice: first time it is during cgraph construction, second time it is at the
61 end of compilation in VARPOOL_REMOVE_UNREFERENCED_DECLS so we can avoid
62 optimized out variables being output.
63
64 Each variable is thus first analyzed and then later possibly output.
65 FIRST_UNANALYZED_NODE points to first node in queue that was not analyzed
66 yet and is moved via VARPOOL_ANALYZE_PENDING_DECLS. */
67
68 symtab_node x_varpool_nodes_queue;
69 static GTY(()) symtab_node x_varpool_last_needed_node;
70 #define varpool_last_needed_node ((struct varpool_node *)x_varpool_last_needed_node)
71 static GTY(()) symtab_node x_varpool_first_unanalyzed_node;
72 #define varpool_first_unanalyzed_node ((struct varpool_node *)x_varpool_first_unanalyzed_node)
73
74 /* Lists all assembled variables to be sent to debugger output later on. */
75 static GTY(()) struct varpool_node *varpool_assembled_nodes_queue;
76
77 /* Return varpool node assigned to DECL. Create new one when needed. */
78 struct varpool_node *
79 varpool_node (tree decl)
80 {
81 struct varpool_node *node = varpool_get_node (decl);
82 gcc_assert (TREE_CODE (decl) == VAR_DECL
83 && (TREE_STATIC (decl) || DECL_EXTERNAL (decl) || in_lto_p));
84 if (node)
85 return node;
86
87 node = ggc_alloc_cleared_varpool_node ();
88 node->symbol.type = SYMTAB_VARIABLE;
89 node->symbol.decl = decl;
90 symtab_register_node ((symtab_node)node);
91 return node;
92 }
93
94 /* Remove node from the varpool. */
95 void
96 varpool_remove_node (struct varpool_node *node)
97 {
98 gcc_assert (!varpool_assembled_nodes_queue);
99 symtab_unregister_node ((symtab_node)node);
100 if (varpool_first_unanalyzed_node == node)
101 x_varpool_first_unanalyzed_node = (symtab_node)node->next_needed;
102 if (node->next_needed)
103 node->next_needed->prev_needed = node->prev_needed;
104 else if (node->prev_needed)
105 {
106 gcc_assert (varpool_last_needed_node);
107 x_varpool_last_needed_node = (symtab_node)node->prev_needed;
108 }
109 if (node->prev_needed)
110 node->prev_needed->next_needed = node->next_needed;
111 else if (node->next_needed)
112 {
113 gcc_assert (varpool_nodes_queue == node);
114 x_varpool_nodes_queue = (symtab_node)node->next_needed;
115 }
116 ggc_free (node);
117 }
118
119 /* Dump given cgraph node. */
120 void
121 dump_varpool_node (FILE *f, struct varpool_node *node)
122 {
123 dump_symtab_base (f, (symtab_node)node);
124 fprintf (f, " Availability: %s\n",
125 cgraph_function_flags_ready
126 ? cgraph_availability_names[cgraph_variable_initializer_availability (node)]
127 : "not-ready");
128 fprintf (f, " Varpool flags:");
129 if (DECL_INITIAL (node->symbol.decl))
130 fprintf (f, " initialized");
131 if (node->needed)
132 fprintf (f, " needed");
133 if (node->analyzed)
134 fprintf (f, " analyzed");
135 if (node->finalized)
136 fprintf (f, " finalized");
137 if (node->output)
138 fprintf (f, " output");
139 fprintf (f, "\n");
140 }
141
142 /* Dump the variable pool. */
143 void
144 dump_varpool (FILE *f)
145 {
146 struct varpool_node *node;
147
148 fprintf (f, "variable pool:\n\n");
149 FOR_EACH_VARIABLE (node)
150 dump_varpool_node (f, node);
151 }
152
153 /* Dump the variable pool to stderr. */
154
155 DEBUG_FUNCTION void
156 debug_varpool (void)
157 {
158 dump_varpool (stderr);
159 }
160
161 /* Given an assembler name, lookup node. */
162 struct varpool_node *
163 varpool_node_for_asm (tree asmname)
164 {
165 symtab_node node = symtab_node_for_asm (asmname);
166 if (node && symtab_variable_p (node))
167 return varpool (node);
168 return NULL;
169 }
170
171 /* Helper function for finalization code - add node into lists so it will
172 be analyzed and compiled. */
173 static void
174 varpool_enqueue_needed_node (struct varpool_node *node)
175 {
176 if (varpool_last_needed_node)
177 {
178 varpool_last_needed_node->next_needed = node;
179 node->prev_needed = varpool_last_needed_node;
180 }
181 x_varpool_last_needed_node = (symtab_node)node;
182 node->next_needed = NULL;
183 if (!varpool_nodes_queue)
184 x_varpool_nodes_queue = (symtab_node)node;
185 if (!varpool_first_unanalyzed_node)
186 x_varpool_first_unanalyzed_node = (symtab_node)node;
187 notice_global_symbol (node->symbol.decl);
188 }
189
190 /* Notify finalize_compilation_unit that given node is reachable
191 or needed. */
192 void
193 varpool_mark_needed_node (struct varpool_node *node)
194 {
195 if (!node->needed && node->finalized
196 && !TREE_ASM_WRITTEN (node->symbol.decl))
197 varpool_enqueue_needed_node (node);
198 node->needed = 1;
199 }
200
201 /* Reset the queue of needed nodes. */
202 void
203 varpool_reset_queue (void)
204 {
205 x_varpool_last_needed_node = NULL;
206 x_varpool_nodes_queue = NULL;
207 x_varpool_first_unanalyzed_node = NULL;
208 }
209
210 /* Determine if variable DECL is needed. That is, visible to something
211 either outside this translation unit, something magic in the system
212 configury */
213 bool
214 decide_is_variable_needed (struct varpool_node *node, tree decl)
215 {
216 /* If the user told us it is used, then it must be so. */
217 if (node->force_output)
218 return true;
219
220 gcc_assert (!DECL_EXTERNAL (decl));
221
222 /* Externally visible variables must be output. The exception is
223 COMDAT variables that must be output only when they are needed. */
224 if (TREE_PUBLIC (decl)
225 && !DECL_COMDAT (decl)
226 && !DECL_EXTERNAL (decl))
227 return true;
228
229 return false;
230 }
231
232 /* Return if DECL is constant and its initial value is known (so we can do
233 constant folding using DECL_INITIAL (decl)). */
234
235 bool
236 const_value_known_p (tree decl)
237 {
238 if (TREE_CODE (decl) != VAR_DECL
239 &&TREE_CODE (decl) != CONST_DECL)
240 return false;
241
242 if (TREE_CODE (decl) == CONST_DECL
243 || DECL_IN_CONSTANT_POOL (decl))
244 return true;
245
246 gcc_assert (TREE_CODE (decl) == VAR_DECL);
247
248 if (!TREE_READONLY (decl) || TREE_THIS_VOLATILE (decl))
249 return false;
250
251 /* Gimplifier takes away constructors of local vars */
252 if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
253 return DECL_INITIAL (decl) != NULL;
254
255 gcc_assert (TREE_STATIC (decl) || DECL_EXTERNAL (decl));
256
257 /* Variables declared 'const' without an initializer
258 have zero as the initializer if they may not be
259 overridden at link or run time. */
260 if (!DECL_INITIAL (decl)
261 && (DECL_EXTERNAL (decl)
262 || decl_replaceable_p (decl)))
263 return false;
264
265 /* Variables declared `const' with an initializer are considered
266 to not be overwritable with different initializer by default.
267
268 ??? Previously we behaved so for scalar variables but not for array
269 accesses. */
270 return true;
271 }
272
273 /* Mark DECL as finalized. By finalizing the declaration, frontend instruct the
274 middle end to output the variable to asm file, if needed or externally
275 visible. */
276 void
277 varpool_finalize_decl (tree decl)
278 {
279 struct varpool_node *node = varpool_node (decl);
280
281 gcc_assert (TREE_STATIC (decl));
282
283 /* The first declaration of a variable that comes through this function
284 decides whether it is global (in C, has external linkage)
285 or local (in C, has internal linkage). So do nothing more
286 if this function has already run. */
287 if (node->finalized)
288 {
289 if (cgraph_global_info_ready)
290 varpool_assemble_pending_decls ();
291 return;
292 }
293 if (node->needed)
294 varpool_enqueue_needed_node (node);
295 node->finalized = true;
296 if (TREE_THIS_VOLATILE (decl) || DECL_PRESERVE_P (decl)
297 /* Traditionally we do not eliminate static variables when not
298 optimizing and when not doing toplevel reoder. */
299 || (!flag_toplevel_reorder && !DECL_COMDAT (node->symbol.decl)
300 && !DECL_ARTIFICIAL (node->symbol.decl)))
301 node->force_output = true;
302
303 if (decide_is_variable_needed (node, decl))
304 varpool_mark_needed_node (node);
305 if (cgraph_global_info_ready)
306 varpool_assemble_pending_decls ();
307 }
308
309 /* Add the variable DECL to the varpool.
310 Unlike varpool_finalize_decl function is intended to be used
311 by middle end and allows insertion of new variable at arbitrary point
312 of compilation. */
313 void
314 varpool_add_new_variable (tree decl)
315 {
316 struct varpool_node *node;
317 varpool_finalize_decl (decl);
318 node = varpool_node (decl);
319 if (varpool_externally_visible_p (node, false))
320 node->symbol.externally_visible = true;
321 }
322
323 /* Return variable availability. See cgraph.h for description of individual
324 return values. */
325 enum availability
326 cgraph_variable_initializer_availability (struct varpool_node *node)
327 {
328 gcc_assert (cgraph_function_flags_ready);
329 if (!node->finalized)
330 return AVAIL_NOT_AVAILABLE;
331 if (!TREE_PUBLIC (node->symbol.decl))
332 return AVAIL_AVAILABLE;
333 /* If the variable can be overwritten, return OVERWRITABLE. Takes
334 care of at least two notable extensions - the COMDAT variables
335 used to share template instantiations in C++. */
336 if (!decl_replaceable_p (node->symbol.decl))
337 return AVAIL_OVERWRITABLE;
338 return AVAIL_AVAILABLE;
339 }
340
341 /* Walk the decls we marked as necessary and see if they reference new
342 variables or functions and add them into the worklists. */
343 bool
344 varpool_analyze_pending_decls (void)
345 {
346 bool changed = false;
347
348 timevar_push (TV_VARPOOL);
349 while (varpool_first_unanalyzed_node)
350 {
351 struct varpool_node *node = varpool_first_unanalyzed_node, *next;
352 tree decl = node->symbol.decl;
353 bool analyzed = node->analyzed;
354
355 varpool_first_unanalyzed_node->analyzed = true;
356
357 x_varpool_first_unanalyzed_node = (symtab_node)varpool_first_unanalyzed_node->next_needed;
358
359 /* When reading back varpool at LTO time, we re-construct the queue in order
360 to have "needed" list right by inserting all needed nodes into varpool.
361 We however don't want to re-analyze already analyzed nodes. */
362 if (!analyzed)
363 {
364 gcc_assert (!in_lto_p || cgraph_function_flags_ready);
365 /* Compute the alignment early so function body expanders are
366 already informed about increased alignment. */
367 align_variable (decl, 0);
368 }
369 if (node->alias && node->alias_of)
370 {
371 struct varpool_node *tgt = varpool_node (node->alias_of);
372 struct varpool_node *n;
373
374 for (n = tgt; n && n->alias;
375 n = n->analyzed ? varpool_alias_aliased_node (n) : NULL)
376 if (n == node)
377 {
378 error ("variable %q+D part of alias cycle", node->symbol.decl);
379 node->alias = false;
380 continue;
381 }
382 if (!VEC_length (ipa_ref_t, node->symbol.ref_list.references))
383 ipa_record_reference (NULL, node, NULL, tgt, IPA_REF_ALIAS, NULL);
384 /* C++ FE sometimes change linkage flags after producing same body aliases. */
385 if (node->extra_name_alias)
386 {
387 DECL_WEAK (node->symbol.decl) = DECL_WEAK (node->alias_of);
388 TREE_PUBLIC (node->symbol.decl) = TREE_PUBLIC (node->alias_of);
389 DECL_EXTERNAL (node->symbol.decl) = DECL_EXTERNAL (node->alias_of);
390 DECL_VISIBILITY (node->symbol.decl) = DECL_VISIBILITY (node->alias_of);
391 if (TREE_PUBLIC (node->symbol.decl))
392 {
393 DECL_COMDAT (node->symbol.decl) = DECL_COMDAT (node->alias_of);
394 DECL_COMDAT_GROUP (node->symbol.decl) = DECL_COMDAT_GROUP (node->alias_of);
395 if (DECL_ONE_ONLY (node->alias_of)
396 && !node->symbol.same_comdat_group)
397 {
398 node->symbol.same_comdat_group = (symtab_node)tgt;
399 if (!tgt->symbol.same_comdat_group)
400 tgt->symbol.same_comdat_group = (symtab_node)node;
401 else
402 {
403 symtab_node n;
404 for (n = tgt->symbol.same_comdat_group;
405 n->symbol.same_comdat_group != (symtab_node)tgt;
406 n = n->symbol.same_comdat_group)
407 ;
408 n->symbol.same_comdat_group = (symtab_node)node;
409 }
410 }
411 }
412 }
413 }
414 else if (DECL_INITIAL (decl))
415 record_references_in_initializer (decl, analyzed);
416 if (node->symbol.same_comdat_group)
417 {
418 for (next = varpool (node->symbol.same_comdat_group);
419 next != node;
420 next = varpool (next->symbol.same_comdat_group))
421 varpool_mark_needed_node (next);
422 }
423 changed = true;
424 }
425 timevar_pop (TV_VARPOOL);
426 return changed;
427 }
428
429 /* Assemble thunks and aliases asociated to NODE. */
430
431 static void
432 assemble_aliases (struct varpool_node *node)
433 {
434 int i;
435 struct ipa_ref *ref;
436 for (i = 0; ipa_ref_list_refering_iterate (&node->symbol.ref_list, i, ref); i++)
437 if (ref->use == IPA_REF_ALIAS)
438 {
439 struct varpool_node *alias = ipa_ref_refering_varpool_node (ref);
440 assemble_alias (alias->symbol.decl,
441 DECL_ASSEMBLER_NAME (alias->alias_of));
442 assemble_aliases (alias);
443 }
444 }
445
446 /* Output one variable, if necessary. Return whether we output it. */
447 bool
448 varpool_assemble_decl (struct varpool_node *node)
449 {
450 tree decl = node->symbol.decl;
451
452 if (!TREE_ASM_WRITTEN (decl)
453 && !node->alias
454 && !node->symbol.in_other_partition
455 && !DECL_EXTERNAL (decl)
456 && (TREE_CODE (decl) != VAR_DECL || !DECL_HAS_VALUE_EXPR_P (decl)))
457 {
458 assemble_variable (decl, 0, 1, 0);
459 if (TREE_ASM_WRITTEN (decl))
460 {
461 node->next_needed = varpool_assembled_nodes_queue;
462 node->prev_needed = NULL;
463 if (varpool_assembled_nodes_queue)
464 varpool_assembled_nodes_queue->prev_needed = node;
465 varpool_assembled_nodes_queue = node;
466 node->finalized = 1;
467 assemble_aliases (node);
468 return true;
469 }
470 }
471
472 return false;
473 }
474
475 /* Optimization of function bodies might've rendered some variables as
476 unnecessary so we want to avoid these from being compiled.
477
478 This is done by pruning the queue and keeping only the variables that
479 really appear needed (ie they are either externally visible or referenced
480 by compiled function). Re-doing the reachability analysis on variables
481 brings back the remaining variables referenced by these. */
482 void
483 varpool_remove_unreferenced_decls (void)
484 {
485 struct varpool_node *next, *node = varpool_nodes_queue;
486
487 varpool_reset_queue ();
488
489 if (seen_error ())
490 return;
491
492 while (node)
493 {
494 next = node->next_needed;
495 node->needed = 0;
496
497 if (node->analyzed
498 && (!varpool_can_remove_if_no_refs (node)
499 /* We just expanded all function bodies. See if any of
500 them needed the variable. */
501 || DECL_RTL_SET_P (node->symbol.decl)))
502 varpool_mark_needed_node (node);
503
504 node = next;
505 }
506 /* Make sure we mark alias targets as used targets. */
507 finish_aliases_1 ();
508 varpool_analyze_pending_decls ();
509 }
510
511 /* For variables in named sections make sure get_variable_section
512 is called before we switch to those sections. Then section
513 conflicts between read-only and read-only requiring relocations
514 sections can be resolved. */
515 void
516 varpool_finalize_named_section_flags (struct varpool_node *node)
517 {
518 if (!TREE_ASM_WRITTEN (node->symbol.decl)
519 && !node->alias
520 && !node->symbol.in_other_partition
521 && !DECL_EXTERNAL (node->symbol.decl)
522 && TREE_CODE (node->symbol.decl) == VAR_DECL
523 && !DECL_HAS_VALUE_EXPR_P (node->symbol.decl)
524 && DECL_SECTION_NAME (node->symbol.decl))
525 get_variable_section (node->symbol.decl, false);
526 }
527
528 /* Output all variables enqueued to be assembled. */
529 bool
530 varpool_assemble_pending_decls (void)
531 {
532 bool changed = false;
533 struct varpool_node *node;
534
535 if (seen_error ())
536 return false;
537
538 timevar_push (TV_VAROUT);
539 /* EH might mark decls as needed during expansion. This should be safe since
540 we don't create references to new function, but it should not be used
541 elsewhere. */
542 varpool_analyze_pending_decls ();
543
544 FOR_EACH_DEFINED_VARIABLE (node)
545 varpool_finalize_named_section_flags (node);
546
547 while (varpool_nodes_queue)
548 {
549 struct varpool_node *node = varpool_nodes_queue;
550
551 x_varpool_nodes_queue = (symtab_node)(varpool_nodes_queue->next_needed);
552 if (varpool_assemble_decl (node))
553 changed = true;
554 else
555 {
556 node->prev_needed = NULL;
557 node->next_needed = NULL;
558 }
559 }
560 /* varpool_nodes_queue is now empty, clear the pointer to the last element
561 in the queue. */
562 x_varpool_last_needed_node = NULL;
563 timevar_pop (TV_VAROUT);
564 return changed;
565 }
566
567 /* Remove all elements from the queue so we can re-use it for debug output. */
568 void
569 varpool_empty_needed_queue (void)
570 {
571 /* EH might mark decls as needed during expansion. This should be safe since
572 we don't create references to new function, but it should not be used
573 elsewhere. */
574 varpool_analyze_pending_decls ();
575
576 while (varpool_nodes_queue)
577 {
578 struct varpool_node *node = varpool_nodes_queue;
579 x_varpool_nodes_queue = (symtab_node)varpool_nodes_queue->next_needed;
580 node->next_needed = NULL;
581 node->prev_needed = NULL;
582 }
583 /* varpool_nodes_queue is now empty, clear the pointer to the last element
584 in the queue. */
585 x_varpool_last_needed_node = NULL;
586 }
587
588 /* Create a new global variable of type TYPE. */
589 tree
590 add_new_static_var (tree type)
591 {
592 tree new_decl;
593 struct varpool_node *new_node;
594
595 new_decl = create_tmp_var (type, NULL);
596 DECL_NAME (new_decl) = create_tmp_var_name (NULL);
597 TREE_READONLY (new_decl) = 0;
598 TREE_STATIC (new_decl) = 1;
599 TREE_USED (new_decl) = 1;
600 DECL_CONTEXT (new_decl) = NULL_TREE;
601 DECL_ABSTRACT (new_decl) = 0;
602 lang_hooks.dup_lang_specific_decl (new_decl);
603 create_var_ann (new_decl);
604 new_node = varpool_node (new_decl);
605 varpool_mark_needed_node (new_node);
606 add_referenced_var (new_decl);
607 varpool_finalize_decl (new_decl);
608
609 return new_node->symbol.decl;
610 }
611
612 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
613 Extra name aliases are output whenever DECL is output. */
614
615 struct varpool_node *
616 varpool_create_variable_alias (tree alias, tree decl)
617 {
618 struct varpool_node *alias_node;
619
620 gcc_assert (TREE_CODE (decl) == VAR_DECL);
621 gcc_assert (TREE_CODE (alias) == VAR_DECL);
622 alias_node = varpool_node (alias);
623 alias_node->alias = 1;
624 if (!DECL_EXTERNAL (alias))
625 alias_node->finalized = 1;
626 alias_node->alias_of = decl;
627 if ((!DECL_EXTERNAL (alias)
628 && decide_is_variable_needed (alias_node, alias))
629 || alias_node->needed)
630 varpool_mark_needed_node (alias_node);
631 return alias_node;
632 }
633
634 /* Attempt to mark ALIAS as an alias to DECL. Return TRUE if successful.
635 Extra name aliases are output whenever DECL is output. */
636
637 struct varpool_node *
638 varpool_extra_name_alias (tree alias, tree decl)
639 {
640 struct varpool_node *alias_node;
641
642 #ifndef ASM_OUTPUT_DEF
643 /* If aliases aren't supported by the assembler, fail. */
644 return NULL;
645 #endif
646 alias_node = varpool_create_variable_alias (alias, decl);
647 alias_node->extra_name_alias = true;
648 return alias_node;
649 }
650
651 /* Return true when NODE is known to be used from other (non-LTO) object file.
652 Known only when doing LTO via linker plugin. */
653
654 bool
655 varpool_used_from_object_file_p (struct varpool_node *node)
656 {
657 if (!TREE_PUBLIC (node->symbol.decl))
658 return false;
659 if (resolution_used_from_other_file_p (node->symbol.resolution))
660 return true;
661 return false;
662 }
663
664 /* Call calback on NODE and aliases asociated to NODE.
665 When INCLUDE_OVERWRITABLE is false, overwritable aliases and thunks are
666 skipped. */
667
668 bool
669 varpool_for_node_and_aliases (struct varpool_node *node,
670 bool (*callback) (struct varpool_node *, void *),
671 void *data,
672 bool include_overwritable)
673 {
674 int i;
675 struct ipa_ref *ref;
676
677 if (callback (node, data))
678 return true;
679 for (i = 0; ipa_ref_list_refering_iterate (&node->symbol.ref_list, i, ref); i++)
680 if (ref->use == IPA_REF_ALIAS)
681 {
682 struct varpool_node *alias = ipa_ref_refering_varpool_node (ref);
683 if (include_overwritable
684 || cgraph_variable_initializer_availability (alias) > AVAIL_OVERWRITABLE)
685 if (varpool_for_node_and_aliases (alias, callback, data,
686 include_overwritable))
687 return true;
688 }
689 return false;
690 }
691 #include "gt-varpool.h"