1 /* Callgraph handling code.
2    Copyright (C) 2003-2019 Free Software Foundation, Inc.
3    Contributed by Jan Hubicka
4 
5 This file is part of GCC.
6 
7 GCC is free software; you can redistribute it and/or modify it under
8 the terms of the GNU General Public License as published by the Free
9 Software Foundation; either version 3, or (at your option) any later
10 version.
11 
12 GCC is distributed in the hope that it will be useful, but WITHOUT ANY
13 WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
15 for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with GCC; see the file COPYING3.  If not see
19 <http://www.gnu.org/licenses/>.  */
20 
21 #include "config.h"
22 #include "system.h"
23 #include "coretypes.h"
24 #include "backend.h"
25 #include "target.h"
26 #include "tree.h"
27 #include "gimple.h"
28 #include "timevar.h"
29 #include "cgraph.h"
30 #include "lto-streamer.h"
31 #include "varasm.h"
32 #include "debug.h"
33 #include "output.h"
34 #include "omp-offload.h"
35 #include "context.h"
36 #include "stringpool.h"
37 #include "attribs.h"
38 
39 const char * const tls_model_names[]={"none", "emulated",
40 				      "global-dynamic", "local-dynamic",
41 				      "initial-exec", "local-exec"};
42 
43 /* List of hooks triggered on varpool_node events.  */
44 struct varpool_node_hook_list {
45   varpool_node_hook hook;
46   void *data;
47   struct varpool_node_hook_list *next;
48 };
49 
50 /* Register HOOK to be called with DATA on each removed node.  */
51 varpool_node_hook_list *
add_varpool_removal_hook(varpool_node_hook hook,void * data)52 symbol_table::add_varpool_removal_hook (varpool_node_hook hook, void *data)
53 {
54   varpool_node_hook_list *entry;
55   varpool_node_hook_list **ptr = &m_first_varpool_removal_hook;
56 
57   entry = (varpool_node_hook_list *) xmalloc (sizeof (*entry));
58   entry->hook = hook;
59   entry->data = data;
60   entry->next = NULL;
61   while (*ptr)
62     ptr = &(*ptr)->next;
63   *ptr = entry;
64   return entry;
65 }
66 
67 /* Remove ENTRY from the list of hooks called on removing nodes.  */
68 void
remove_varpool_removal_hook(varpool_node_hook_list * entry)69 symbol_table::remove_varpool_removal_hook (varpool_node_hook_list *entry)
70 {
71   varpool_node_hook_list **ptr = &m_first_varpool_removal_hook;
72 
73   while (*ptr != entry)
74     ptr = &(*ptr)->next;
75   *ptr = entry->next;
76   free (entry);
77 }
78 
79 /* Call all node removal hooks.  */
80 void
call_varpool_removal_hooks(varpool_node * node)81 symbol_table::call_varpool_removal_hooks (varpool_node *node)
82 {
83   varpool_node_hook_list *entry = m_first_varpool_removal_hook;
84   while (entry)
85   {
86     entry->hook (node, entry->data);
87     entry = entry->next;
88   }
89 }
90 
91 /* Register HOOK to be called with DATA on each inserted node.  */
92 varpool_node_hook_list *
add_varpool_insertion_hook(varpool_node_hook hook,void * data)93 symbol_table::add_varpool_insertion_hook (varpool_node_hook hook, void *data)
94 {
95   varpool_node_hook_list *entry;
96   varpool_node_hook_list **ptr = &m_first_varpool_insertion_hook;
97 
98   entry = (varpool_node_hook_list *) xmalloc (sizeof (*entry));
99   entry->hook = hook;
100   entry->data = data;
101   entry->next = NULL;
102   while (*ptr)
103     ptr = &(*ptr)->next;
104   *ptr = entry;
105   return entry;
106 }
107 
108 /* Remove ENTRY from the list of hooks called on inserted nodes.  */
109 void
remove_varpool_insertion_hook(varpool_node_hook_list * entry)110 symbol_table::remove_varpool_insertion_hook (varpool_node_hook_list *entry)
111 {
112   varpool_node_hook_list **ptr = &m_first_varpool_insertion_hook;
113 
114   while (*ptr != entry)
115     ptr = &(*ptr)->next;
116   *ptr = entry->next;
117   free (entry);
118 }
119 
120 /* Call all node insertion hooks.  */
121 void
call_varpool_insertion_hooks(varpool_node * node)122 symbol_table::call_varpool_insertion_hooks (varpool_node *node)
123 {
124   varpool_node_hook_list *entry = m_first_varpool_insertion_hook;
125   while (entry)
126   {
127     entry->hook (node, entry->data);
128     entry = entry->next;
129   }
130 }
131 
132 /* Allocate new callgraph node and insert it into basic data structures.  */
133 
134 varpool_node *
create_empty(void)135 varpool_node::create_empty (void)
136 {
137   varpool_node *node = ggc_cleared_alloc<varpool_node> ();
138   node->type = SYMTAB_VARIABLE;
139   return node;
140 }
141 
142 /* Return varpool node assigned to DECL.  Create new one when needed.  */
143 varpool_node *
get_create(tree decl)144 varpool_node::get_create (tree decl)
145 {
146   varpool_node *node = varpool_node::get (decl);
147   gcc_checking_assert (VAR_P (decl));
148   if (node)
149     return node;
150 
151   node = varpool_node::create_empty ();
152   node->decl = decl;
153 
154   if ((flag_openacc || flag_openmp)
155       && lookup_attribute ("omp declare target", DECL_ATTRIBUTES (decl)))
156     {
157       node->offloadable = 1;
158       if (ENABLE_OFFLOADING && !DECL_EXTERNAL (decl))
159 	{
160 	  g->have_offload = true;
161 	  if (!in_lto_p)
162 	    vec_safe_push (offload_vars, decl);
163 	}
164     }
165 
166   node->register_symbol ();
167   return node;
168 }
169 
170 /* Remove variable from symbol table.  */
171 
172 void
remove(void)173 varpool_node::remove (void)
174 {
175   symtab->call_varpool_removal_hooks (this);
176   if (lto_file_data)
177     {
178       lto_free_function_in_decl_state_for_node (this);
179       lto_file_data = NULL;
180     }
181 
182   /* When streaming we can have multiple nodes associated with decl.  */
183   if (symtab->state == LTO_STREAMING)
184     ;
185   /* Keep constructor when it may be used for folding. We remove
186      references to external variables before final compilation.  */
187   else if (DECL_INITIAL (decl) && DECL_INITIAL (decl) != error_mark_node
188 	   && !ctor_useable_for_folding_p ())
189     remove_initializer ();
190 
191   unregister ();
192   ggc_free (this);
193 }
194 
195 /* Remove node initializer when it is no longer needed.  */
196 void
remove_initializer(void)197 varpool_node::remove_initializer (void)
198 {
199   if (DECL_INITIAL (decl)
200       && !DECL_IN_CONSTANT_POOL (decl)
201       /* Keep vtables for BINFO folding.  */
202       && !DECL_VIRTUAL_P (decl)
203       /* FIXME: http://gcc.gnu.org/PR55395 */
204       && debug_info_level == DINFO_LEVEL_NONE
205       /* When doing declaration merging we have duplicate
206 	 entries for given decl.  Do not attempt to remove
207 	 the boides, or we will end up remiving
208 	 wrong one.  */
209       && symtab->state != LTO_STREAMING)
210     DECL_INITIAL (decl) = error_mark_node;
211 }
212 
213 /* Dump given varpool node to F.  */
214 void
dump(FILE * f)215 varpool_node::dump (FILE *f)
216 {
217   dump_base (f);
218   fprintf (f, "  Availability: %s\n",
219 	   symtab->function_flags_ready
220 	   ? cgraph_availability_names[get_availability ()]
221 	   : "not-ready");
222   fprintf (f, "  Varpool flags:");
223   if (DECL_INITIAL (decl))
224     fprintf (f, " initialized");
225   if (output)
226     fprintf (f, " output");
227   if (used_by_single_function)
228     fprintf (f, " used-by-single-function");
229   if (TREE_READONLY (decl))
230     fprintf (f, " read-only");
231   if (ctor_useable_for_folding_p ())
232     fprintf (f, " const-value-known");
233   if (writeonly)
234     fprintf (f, " write-only");
235   if (tls_model)
236     fprintf (f, " tls-%s", tls_model_names [tls_model]);
237   fprintf (f, "\n");
238 }
239 
240 
241 /* Dump given varpool node to stderr.  */
debug(void)242 void varpool_node::debug (void)
243 {
244   varpool_node::dump (stderr);
245 }
246 
247 /* Dump the variable pool to F.  */
248 void
dump_varpool(FILE * f)249 varpool_node::dump_varpool (FILE *f)
250 {
251   varpool_node *node;
252 
253   fprintf (f, "variable pool:\n\n");
254   FOR_EACH_VARIABLE (node)
255     node->dump (f);
256 }
257 
258 /* Dump the variable pool to stderr.  */
259 
260 DEBUG_FUNCTION void
debug_varpool(void)261 varpool_node::debug_varpool (void)
262 {
263   dump_varpool (stderr);
264 }
265 
266 /* Given an assembler name, lookup node.  */
267 varpool_node *
get_for_asmname(tree asmname)268 varpool_node::get_for_asmname (tree asmname)
269 {
270   if (symtab_node *node = symtab_node::get_for_asmname (asmname))
271     return dyn_cast <varpool_node *> (node);
272   else
273     return NULL;
274 }
275 
276 /* When doing LTO, read variable's constructor from disk if
277    it is not already present.  */
278 
279 tree
get_constructor(void)280 varpool_node::get_constructor (void)
281 {
282   lto_file_decl_data *file_data;
283   const char *data, *name;
284   size_t len;
285 
286   if (DECL_INITIAL (decl) != error_mark_node
287       || !in_lto_p
288       || !lto_file_data)
289     return DECL_INITIAL (decl);
290 
291   timevar_push (TV_IPA_LTO_CTORS_IN);
292 
293   file_data = lto_file_data;
294   name = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl));
295 
296   /* We may have renamed the declaration, e.g., a static function.  */
297   name = lto_get_decl_name_mapping (file_data, name);
298   struct lto_in_decl_state *decl_state
299 	 = lto_get_function_in_decl_state (file_data, decl);
300 
301   data = lto_get_section_data (file_data, LTO_section_function_body,
302 			       name, &len, decl_state->compressed);
303   if (!data)
304     fatal_error (input_location, "%s: section %s is missing",
305 		 file_data->file_name,
306 		 name);
307 
308   if (!quiet_flag)
309     fprintf (stderr, " in:%s", IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (decl)));
310   lto_input_variable_constructor (file_data, this, data);
311   gcc_assert (DECL_INITIAL (decl) != error_mark_node);
312   lto_stats.num_function_bodies++;
313   lto_free_section_data (file_data, LTO_section_function_body, name,
314 			 data, len, decl_state->compressed);
315   lto_free_function_in_decl_state_for_node (this);
316   timevar_pop (TV_IPA_LTO_CTORS_IN);
317   return DECL_INITIAL (decl);
318 }
319 
320 /* Return true if variable has constructor that can be used for folding.  */
321 
322 bool
ctor_useable_for_folding_p(void)323 varpool_node::ctor_useable_for_folding_p (void)
324 {
325   varpool_node *real_node = this;
326 
327   if (real_node->alias && real_node->definition)
328     real_node = ultimate_alias_target ();
329 
330   if (TREE_CODE (decl) == CONST_DECL
331       || DECL_IN_CONSTANT_POOL (decl))
332     return true;
333   if (TREE_THIS_VOLATILE (decl))
334     return false;
335 
336   /* Avoid attempts to load constructors that was not streamed.  */
337   if (in_lto_p && DECL_INITIAL (real_node->decl) == error_mark_node
338       && real_node->body_removed)
339     return false;
340 
341   /* If we do not have a constructor, we can't use it.  */
342   if (DECL_INITIAL (real_node->decl) == error_mark_node
343       && !real_node->lto_file_data)
344     return false;
345 
346   /* Vtables are defined by their types and must match no matter of interposition
347      rules.  */
348   if (DECL_VIRTUAL_P (decl))
349     {
350       /* The C++ front end creates VAR_DECLs for vtables of typeinfo
351 	 classes not defined in the current TU so that it can refer
352 	 to them from typeinfo objects.  Avoid returning NULL_TREE.  */
353       return DECL_INITIAL (real_node->decl) != NULL;
354     }
355 
356   /* Alias of readonly variable is also readonly, since the variable is stored
357      in readonly memory.  We also accept readonly aliases of non-readonly
358      locations assuming that user knows what he is asking for.  */
359   if (!TREE_READONLY (decl) && !TREE_READONLY (real_node->decl))
360     return false;
361 
362   /* Variables declared 'const' without an initializer
363      have zero as the initializer if they may not be
364      overridden at link or run time.
365 
366      It is actually requirement for C++ compiler to optimize const variables
367      consistently. As a GNU extension, do not enfore this rule for user defined
368      weak variables, so we support interposition on:
369      static const int dummy = 0;
370      extern const int foo __attribute__((__weak__, __alias__("dummy")));
371    */
372   if ((!DECL_INITIAL (real_node->decl)
373        || (DECL_WEAK (decl) && !DECL_COMDAT (decl)))
374       && (DECL_EXTERNAL (decl) || decl_replaceable_p (decl)))
375     return false;
376 
377   /* Variables declared `const' with an initializer are considered
378      to not be overwritable with different initializer by default.
379 
380      ??? Previously we behaved so for scalar variables but not for array
381      accesses.  */
382   return true;
383 }
384 
385 /* If DECLARATION is constant variable and its initial value is known
386    (so we can do constant folding), return its constructor (DECL_INITIAL).
387    This may be an expression or NULL when DECL is initialized to 0.
388    Return ERROR_MARK_NODE otherwise.
389 
390    In LTO this may actually trigger reading the constructor from disk.
391    For this reason varpool_ctor_useable_for_folding_p should be used when
392    the actual constructor value is not needed.  */
393 
394 tree
ctor_for_folding(tree decl)395 ctor_for_folding (tree decl)
396 {
397   varpool_node *node, *real_node;
398   tree real_decl;
399 
400   if (!VAR_P (decl) && TREE_CODE (decl) != CONST_DECL)
401     return error_mark_node;
402 
403   if (TREE_CODE (decl) == CONST_DECL
404       || DECL_IN_CONSTANT_POOL (decl))
405     return DECL_INITIAL (decl);
406 
407   if (TREE_THIS_VOLATILE (decl))
408     return error_mark_node;
409 
410   /* Do not care about automatic variables.  Those are never initialized
411      anyway, because gimplifier exapnds the code.  */
412   if (!TREE_STATIC (decl) && !DECL_EXTERNAL (decl))
413     {
414       gcc_assert (!TREE_PUBLIC (decl));
415       return error_mark_node;
416     }
417 
418   gcc_assert (VAR_P (decl));
419 
420   real_node = node = varpool_node::get (decl);
421   if (node)
422     {
423       real_node = node->ultimate_alias_target ();
424       real_decl = real_node->decl;
425     }
426   else
427     real_decl = decl;
428 
429   /* See if we are dealing with alias.
430      In most cases alias is just alternative symbol pointing to a given
431      constructor.  This allows us to use interposition rules of DECL
432      constructor of REAL_NODE.  However weakrefs are special by being just
433      alternative name of their target (if defined).  */
434   if (decl != real_decl)
435     {
436       gcc_assert (!DECL_INITIAL (decl)
437 		  || (node->alias && node->get_alias_target () == real_node)
438 		  || DECL_INITIAL (decl) == error_mark_node);
439       while (node->transparent_alias && node->analyzed)
440 	{
441 	  node = node->get_alias_target ();
442 	  decl = node->decl;
443 	}
444     }
445 
446   if ((!DECL_VIRTUAL_P (real_decl)
447        || DECL_INITIAL (real_decl) == error_mark_node
448        || !DECL_INITIAL (real_decl))
449       && (!node || !node->ctor_useable_for_folding_p ()))
450     return error_mark_node;
451 
452   /* OK, we can return constructor.  See if we need to fetch it from disk
453      in LTO mode.  */
454   if (DECL_INITIAL (real_decl) != error_mark_node
455       || !in_lto_p)
456     return DECL_INITIAL (real_decl);
457   return real_node->get_constructor ();
458 }
459 
460 /* Add the variable DECL to the varpool.
461    Unlike finalize_decl function is intended to be used
462    by middle end and allows insertion of new variable at arbitrary point
463    of compilation.  */
464 void
add(tree decl)465 varpool_node::add (tree decl)
466 {
467   varpool_node *node;
468   varpool_node::finalize_decl (decl);
469   node = varpool_node::get_create (decl);
470   symtab->call_varpool_insertion_hooks (node);
471   if (node->externally_visible_p ())
472     node->externally_visible = true;
473   if (lookup_attribute ("no_reorder", DECL_ATTRIBUTES (decl)))
474     node->no_reorder = 1;
475 }
476 
477 /* Return variable availability.  See cgraph.h for description of individual
478    return values.  */
479 enum availability
get_availability(symtab_node * ref)480 varpool_node::get_availability (symtab_node *ref)
481 {
482   if (!definition)
483     return AVAIL_NOT_AVAILABLE;
484   if (!TREE_PUBLIC (decl))
485     return AVAIL_AVAILABLE;
486   if (DECL_IN_CONSTANT_POOL (decl)
487       || DECL_VIRTUAL_P (decl))
488     return AVAIL_AVAILABLE;
489   if (transparent_alias && definition)
490     {
491       enum availability avail;
492 
493       ultimate_alias_target (&avail, ref);
494       return avail;
495     }
496   /* If this is a reference from symbol itself and there are no aliases, we
497      may be sure that the symbol was not interposed by something else because
498      the symbol itself would be unreachable otherwise.  */
499   if ((this == ref && !has_aliases_p ())
500       || (ref && get_comdat_group ()
501           && get_comdat_group () == ref->get_comdat_group ()))
502     return AVAIL_AVAILABLE;
503   /* If the variable can be overwritten, return OVERWRITABLE.  Takes
504      care of at least one notable extension - the COMDAT variables
505      used to share template instantiations in C++.  */
506   if (decl_replaceable_p (decl)
507       || DECL_EXTERNAL (decl))
508     return AVAIL_INTERPOSABLE;
509   return AVAIL_AVAILABLE;
510 }
511 
512 void
analyze(void)513 varpool_node::analyze (void)
514 {
515   /* When reading back varpool at LTO time, we re-construct the queue in order
516      to have "needed" list right by inserting all needed nodes into varpool.
517      We however don't want to re-analyze already analyzed nodes.  */
518   if (!analyzed)
519     {
520       gcc_assert (!in_lto_p || symtab->function_flags_ready);
521       /* Compute the alignment early so function body expanders are
522 	 already informed about increased alignment.  */
523       align_variable (decl, 0);
524     }
525   if (alias)
526     resolve_alias (varpool_node::get (alias_target));
527   else if (DECL_INITIAL (decl))
528     record_references_in_initializer (decl, analyzed);
529   analyzed = true;
530 }
531 
532 /* Assemble thunks and aliases associated to varpool node.  */
533 
534 void
assemble_aliases(void)535 varpool_node::assemble_aliases (void)
536 {
537   ipa_ref *ref;
538 
539   FOR_EACH_ALIAS (this, ref)
540     {
541       varpool_node *alias = dyn_cast <varpool_node *> (ref->referring);
542       if (!alias->transparent_alias)
543 	do_assemble_alias (alias->decl,
544 			   DECL_ASSEMBLER_NAME (decl));
545       alias->assemble_aliases ();
546     }
547 }
548 
549 /* Output one variable, if necessary.  Return whether we output it.  */
550 
551 bool
assemble_decl(void)552 varpool_node::assemble_decl (void)
553 {
554   /* Aliases are outout when their target is produced or by
555      output_weakrefs.  */
556   if (alias)
557     return false;
558 
559   /* Constant pool is output from RTL land when the reference
560      survive till this level.  */
561   if (DECL_IN_CONSTANT_POOL (decl) && TREE_ASM_WRITTEN (decl))
562     return false;
563 
564   /* Decls with VALUE_EXPR should not be in the varpool at all.  They
565      are not real variables, but just info for debugging and codegen.
566      Unfortunately at the moment emutls is not updating varpool correctly
567      after turning real vars into value_expr vars.  */
568   if (DECL_HAS_VALUE_EXPR_P (decl)
569       && !targetm.have_tls)
570     return false;
571 
572   /* Hard register vars do not need to be output.  */
573   if (DECL_HARD_REGISTER (decl))
574     return false;
575 
576   gcc_checking_assert (!TREE_ASM_WRITTEN (decl)
577 		       && VAR_P (decl)
578 		       && !DECL_HAS_VALUE_EXPR_P (decl));
579 
580   if (!in_other_partition
581       && !DECL_EXTERNAL (decl))
582     {
583       get_constructor ();
584       assemble_variable (decl, 0, 1, 0);
585       gcc_assert (TREE_ASM_WRITTEN (decl));
586       gcc_assert (definition);
587       assemble_aliases ();
588       /* After the parser has generated debugging information, augment
589 	 this information with any new location/etc information that may
590 	 have become available after the compilation proper.  */
591       debug_hooks->late_global_decl (decl);
592       return true;
593     }
594 
595   return false;
596 }
597 
598 /* Add NODE to queue starting at FIRST.
599    The queue is linked via AUX pointers and terminated by pointer to 1.  */
600 
601 static void
enqueue_node(varpool_node * node,varpool_node ** first)602 enqueue_node (varpool_node *node, varpool_node **first)
603 {
604   if (node->aux)
605     return;
606   gcc_checking_assert (*first);
607   node->aux = *first;
608   *first = node;
609 }
610 
611 /* Optimization of function bodies might've rendered some variables as
612    unnecessary so we want to avoid these from being compiled.  Re-do
613    reachability starting from variables that are either externally visible
614    or was referred from the asm output routines.  */
615 
616 void
remove_unreferenced_decls(void)617 symbol_table::remove_unreferenced_decls (void)
618 {
619   varpool_node *next, *node;
620   varpool_node *first = (varpool_node *)(void *)1;
621   int i;
622   ipa_ref *ref = NULL;
623   hash_set<varpool_node *> referenced;
624 
625   if (seen_error ())
626     return;
627 
628   if (dump_file)
629     fprintf (dump_file, "Trivially needed variables:");
630   FOR_EACH_DEFINED_VARIABLE (node)
631     {
632       if (node->analyzed
633 	  && (!node->can_remove_if_no_refs_p ()
634 	      /* We just expanded all function bodies.  See if any of
635 		 them needed the variable.  */
636 	      || DECL_RTL_SET_P (node->decl)))
637 	{
638 	  enqueue_node (node, &first);
639 	  if (dump_file)
640 	    fprintf (dump_file, " %s", node->asm_name ());
641 	}
642     }
643   while (first != (varpool_node *)(void *)1)
644     {
645       node = first;
646       first = (varpool_node *)first->aux;
647 
648       if (node->same_comdat_group)
649 	{
650 	  symtab_node *next;
651 	  for (next = node->same_comdat_group;
652 	       next != node;
653 	       next = next->same_comdat_group)
654 	    {
655 	      varpool_node *vnext = dyn_cast <varpool_node *> (next);
656 	      if (vnext && vnext->analyzed && !next->comdat_local_p ())
657 		enqueue_node (vnext, &first);
658 	    }
659 	}
660       for (i = 0; node->iterate_reference (i, ref); i++)
661 	{
662 	  varpool_node *vnode = dyn_cast <varpool_node *> (ref->referred);
663 	  if (vnode
664 	      && !vnode->in_other_partition
665 	      && (!DECL_EXTERNAL (ref->referred->decl)
666 		  || vnode->alias)
667 	      && vnode->analyzed)
668 	    enqueue_node (vnode, &first);
669 	  else
670 	    {
671 	      referenced.add (vnode);
672 	      while (vnode && vnode->alias && vnode->definition)
673 		{
674 		  vnode = vnode->get_alias_target ();
675 	          referenced.add (vnode);
676 		}
677 	    }
678 	}
679     }
680   if (dump_file)
681     fprintf (dump_file, "\nRemoving variables:");
682   for (node = first_defined_variable (); node; node = next)
683     {
684       next = next_defined_variable (node);
685       if (!node->aux && !node->no_reorder)
686 	{
687 	  if (dump_file)
688 	    fprintf (dump_file, " %s", node->asm_name ());
689 	  if (referenced.contains(node))
690 	    node->remove_initializer ();
691 	  else
692 	    node->remove ();
693 	}
694     }
695 
696   if (dump_file)
697     fprintf (dump_file, "\n");
698 }
699 
700 /* For variables in named sections make sure get_variable_section
701    is called before we switch to those sections.  Then section
702    conflicts between read-only and read-only requiring relocations
703    sections can be resolved.  */
704 void
finalize_named_section_flags(void)705 varpool_node::finalize_named_section_flags (void)
706 {
707   if (!TREE_ASM_WRITTEN (decl)
708       && !alias
709       && !in_other_partition
710       && !DECL_EXTERNAL (decl)
711       && VAR_P (decl)
712       && !DECL_HAS_VALUE_EXPR_P (decl)
713       && get_section ())
714     get_variable_section (decl, false);
715 }
716 
717 /* Output all variables enqueued to be assembled.  */
718 bool
output_variables(void)719 symbol_table::output_variables (void)
720 {
721   bool changed = false;
722   varpool_node *node;
723 
724   if (seen_error ())
725     return false;
726 
727   remove_unreferenced_decls ();
728 
729   timevar_push (TV_VAROUT);
730 
731   FOR_EACH_DEFINED_VARIABLE (node)
732     {
733       /* Handled in output_in_order.  */
734       if (node->no_reorder)
735 	continue;
736 
737       node->finalize_named_section_flags ();
738     }
739 
740   /* There is a similar loop in output_in_order.  Please keep them in sync.  */
741   FOR_EACH_VARIABLE (node)
742     {
743       /* Handled in output_in_order.  */
744       if (node->no_reorder)
745 	continue;
746       if (DECL_HARD_REGISTER (node->decl)
747 	  || DECL_HAS_VALUE_EXPR_P (node->decl))
748 	continue;
749       if (node->definition)
750 	changed |= node->assemble_decl ();
751       else
752 	assemble_undefined_decl (node->decl);
753     }
754   timevar_pop (TV_VAROUT);
755   return changed;
756 }
757 
758 /* Attempt to mark ALIAS as an alias to DECL.  Return TRUE if successful.
759    Extra name aliases are output whenever DECL is output.  */
760 
761 varpool_node *
create_alias(tree alias,tree decl)762 varpool_node::create_alias (tree alias, tree decl)
763 {
764   varpool_node *alias_node;
765 
766   gcc_assert (VAR_P (decl));
767   gcc_assert (VAR_P (alias));
768   alias_node = varpool_node::get_create (alias);
769   alias_node->alias = true;
770   alias_node->definition = true;
771   alias_node->alias_target = decl;
772   if (lookup_attribute ("weakref", DECL_ATTRIBUTES (alias)) != NULL)
773     alias_node->weakref = alias_node->transparent_alias = true;
774   return alias_node;
775 }
776 
777 /* Attempt to mark ALIAS as an alias to DECL.  Return TRUE if successful.
778    Extra name aliases are output whenever DECL is output.  */
779 
780 varpool_node *
create_extra_name_alias(tree alias,tree decl)781 varpool_node::create_extra_name_alias (tree alias, tree decl)
782 {
783   varpool_node *alias_node;
784 
785   /* If aliases aren't supported by the assembler, fail.  */
786   if (!TARGET_SUPPORTS_ALIASES)
787     return NULL;
788 
789   alias_node = varpool_node::create_alias (alias, decl);
790   alias_node->cpp_implicit_alias = true;
791 
792   /* Extra name alias mechanizm creates aliases really late
793      via DECL_ASSEMBLER_NAME mechanizm.
794      This is unfortunate because they are not going through the
795      standard channels.  Ensure they get output.  */
796   if (symtab->cpp_implicit_aliases_done)
797     alias_node->resolve_alias (varpool_node::get_create (decl));
798   return alias_node;
799 }
800 
801 /* Worker for call_for_symbol_and_aliases.  */
802 
803 bool
call_for_symbol_and_aliases_1(bool (* callback)(varpool_node *,void *),void * data,bool include_overwritable)804 varpool_node::call_for_symbol_and_aliases_1 (bool (*callback) (varpool_node *,
805 							       void *),
806 					     void *data,
807 					     bool include_overwritable)
808 {
809   ipa_ref *ref;
810 
811   FOR_EACH_ALIAS (this, ref)
812     {
813       varpool_node *alias = dyn_cast <varpool_node *> (ref->referring);
814       if (include_overwritable
815 	  || alias->get_availability () > AVAIL_INTERPOSABLE)
816 	if (alias->call_for_symbol_and_aliases (callback, data,
817 					        include_overwritable))
818 	  return true;
819     }
820   return false;
821 }
822