Beispiel #1
0
void
dump_symtab_node (FILE *f, symtab_node node)
{
  if (symtab_function_p (node))
    dump_cgraph_node (f, cgraph (node));
  else if (symtab_variable_p (node))
    dump_varpool_node (f, varpool (node));
}
Beispiel #2
0
void
symtab_remove_node (symtab_node node)
{
  if (symtab_function_p (node))
    cgraph_remove_node (cgraph (node));
  else if (symtab_variable_p (node))
    varpool_remove_node (varpool (node));
}
Beispiel #3
0
/* Given an assembler name, lookup node.  */
struct varpool_node *
varpool_node_for_asm (tree asmname)
{
  symtab_node node = symtab_node_for_asm (asmname);
  if (node && symtab_variable_p (node))
    return varpool (node);
  return NULL;
}
Beispiel #4
0
enum availability
symtab_node_availability (symtab_node node)
{
  if (is_a <cgraph_node> (node))
    return cgraph_function_body_availability (cgraph (node));
  else
    return cgraph_variable_initializer_availability (varpool (node));
}
Beispiel #5
0
static void
lto_symtab_merge_symbols_1 (symtab_node prevailing)
{
  symtab_node e, next;

  /* Replace the cgraph node of each entry with the prevailing one.  */
  for (e = prevailing->symbol.next_sharing_asm_name; e;
       e = next)
    {
      next = e->symbol.next_sharing_asm_name;

      if (!lto_symtab_symbol_p (e))
	continue;
      cgraph_node *ce = dyn_cast <cgraph_node> (e);
      if (ce && !DECL_BUILT_IN (e->symbol.decl))
	lto_cgraph_replace_node (ce, cgraph (prevailing));
      if (varpool_node *ve = dyn_cast <varpool_node> (e))
	lto_varpool_replace_node (ve, varpool (prevailing));
    }

  return;
}
Beispiel #6
0
/* Walk the decls we marked as necessary and see if they reference new
   variables or functions and add them into the worklists.  */
bool
varpool_analyze_pending_decls (void)
{
  bool changed = false;

  timevar_push (TV_VARPOOL);
  while (varpool_first_unanalyzed_node)
    {
      struct varpool_node *node = varpool_first_unanalyzed_node, *next;
      tree decl = node->symbol.decl;
      bool analyzed = node->analyzed;

      varpool_first_unanalyzed_node->analyzed = true;

      x_varpool_first_unanalyzed_node = (symtab_node)varpool_first_unanalyzed_node->next_needed;

      /* When reading back varpool at LTO time, we re-construct the queue in order
         to have "needed" list right by inserting all needed nodes into varpool.
	 We however don't want to re-analyze already analyzed nodes.  */
      if (!analyzed)
	{
	  gcc_assert (!in_lto_p || cgraph_function_flags_ready);
          /* Compute the alignment early so function body expanders are
	     already informed about increased alignment.  */
          align_variable (decl, 0);
	}
      if (node->alias && node->alias_of)
	{
	  struct varpool_node *tgt = varpool_node (node->alias_of);
          struct varpool_node *n;

	  for (n = tgt; n && n->alias;
	       n = n->analyzed ? varpool_alias_aliased_node (n) : NULL)
	    if (n == node)
	      {
		error ("variable %q+D part of alias cycle", node->symbol.decl);
		node->alias = false;
		continue;
	      }
	  if (!VEC_length (ipa_ref_t, node->symbol.ref_list.references))
	    ipa_record_reference ((symtab_node)node, (symtab_node)tgt, IPA_REF_ALIAS, NULL);
	  /* C++ FE sometimes change linkage flags after producing same body aliases.  */
	  if (node->extra_name_alias)
	    {
	      DECL_WEAK (node->symbol.decl) = DECL_WEAK (node->alias_of);
	      TREE_PUBLIC (node->symbol.decl) = TREE_PUBLIC (node->alias_of);
	      DECL_EXTERNAL (node->symbol.decl) = DECL_EXTERNAL (node->alias_of);
	      DECL_VISIBILITY (node->symbol.decl) = DECL_VISIBILITY (node->alias_of);
	      if (TREE_PUBLIC (node->symbol.decl))
		{
		  DECL_COMDAT (node->symbol.decl) = DECL_COMDAT (node->alias_of);
		  DECL_COMDAT_GROUP (node->symbol.decl) = DECL_COMDAT_GROUP (node->alias_of);
		  if (DECL_ONE_ONLY (node->alias_of)
		      && !node->symbol.same_comdat_group)
		    {
		      node->symbol.same_comdat_group = (symtab_node)tgt;
		      if (!tgt->symbol.same_comdat_group)
			tgt->symbol.same_comdat_group = (symtab_node)node;
		      else
			{
			  symtab_node n;
			  for (n = tgt->symbol.same_comdat_group;
			       n->symbol.same_comdat_group != (symtab_node)tgt;
			       n = n->symbol.same_comdat_group)
			    ;
			  n->symbol.same_comdat_group = (symtab_node)node;
			}
		    }
		}
	    }
   	  varpool_mark_needed_node (tgt);
	}
      else if (DECL_INITIAL (decl))
	record_references_in_initializer (decl, analyzed);
      if (node->symbol.same_comdat_group)
	{
	  for (next = varpool (node->symbol.same_comdat_group);
	       next != node;
	       next = varpool (next->symbol.same_comdat_group))
	    varpool_mark_needed_node (next);
	}
      changed = true;
    }
  timevar_pop (TV_VARPOOL);
  return changed;
}