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