re PR lto/47497 (SPEC CPU 2006 failed to link with LTO -fuse-linker-plugin -fwhole...
authorJan Hubicka <jh@suse.cz>
Fri, 4 Mar 2011 18:49:23 +0000 (19:49 +0100)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 4 Mar 2011 18:49:23 +0000 (18:49 +0000)
PR lto/47497
* lto-symtab.c (lto_cgraph_replace_node): Do not set thunk.alias.
(lto_symtab_merge_cgraph_nodes_1): Update thunk.alias pointers here.
* cgraph.h (cgraph_same_body_alias, cgraph_add_thunk): Add node pointers.
* cgraph.c (cgraph_same_body_alias_1, cgraph_same_body_alias,
cgraph_add_thunk): Add node pointers.
* lto-cgraph.c (lto_output_node): Verify that thunks&aliases are
associated to right node.
(input_node): Update use of cgraph_same_body_alias
and cgraph_add_thunk.

* optimize.c (maybe_clone_body): Update call of cgraph_same_body_alias
and cgraph_add_thunk.
* method.c (make_alias_for_thunk, use_thunk): Likewise.
* mangle.c (mangle_decl): Likewise.

From-SVN: r170682

gcc/ChangeLog
gcc/cgraph.c
gcc/cgraph.h
gcc/cp/ChangeLog
gcc/cp/mangle.c
gcc/cp/method.c
gcc/cp/optimize.c
gcc/lto-cgraph.c
gcc/lto-symtab.c

index ec81d68394dc0e4a5db700b89a39e559042b31ab..6b8dc6467ec37d63e6e276f2ed2c0beb36f4ae91 100644 (file)
@@ -1,3 +1,16 @@
+2011-03-04  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/47497
+       * lto-symtab.c (lto_cgraph_replace_node): Do not set thunk.alias.
+       (lto_symtab_merge_cgraph_nodes_1): Update thunk.alias pointers here.
+       * cgraph.h (cgraph_same_body_alias, cgraph_add_thunk): Add node pointers.
+       * cgraph.c (cgraph_same_body_alias_1, cgraph_same_body_alias,
+       cgraph_add_thunk): Add node pointers.
+       * lto-cgraph.c (lto_output_node): Verify that thunks&aliases are
+       associated to right node.
+       (input_node): Update use of cgraph_same_body_alias
+       and cgraph_add_thunk.
+
 2011-03-04  Changpeng Fang  <changpeng.fang@amd.com>
 
        * config/i386/i386.opt (mprefer-avx128): New flag.
index dd7eeadc705dabc7ee19e2865baf8bf2b44a334c..64d278f94c1cf5052be7d457fdcb7f3292c55583 100644 (file)
@@ -536,16 +536,16 @@ cgraph_node (tree decl)
   return node;
 }
 
-/* Mark ALIAS as an alias to DECL.  */
+/* Mark ALIAS as an alias to DECL.  DECL_NODE is cgraph node representing
+   the function body is associated with (not neccesarily cgraph_node (DECL).  */
 
 static struct cgraph_node *
-cgraph_same_body_alias_1 (tree alias, tree decl)
+cgraph_same_body_alias_1 (struct cgraph_node *decl_node, tree alias, tree decl)
 {
-  struct cgraph_node key, *alias_node, *decl_node, **slot;
+  struct cgraph_node key, *alias_node, **slot;
 
   gcc_assert (TREE_CODE (decl) == FUNCTION_DECL);
   gcc_assert (TREE_CODE (alias) == FUNCTION_DECL);
-  decl_node = cgraph_node (decl);
 
   key.decl = alias;
 
@@ -575,7 +575,7 @@ cgraph_same_body_alias_1 (tree alias, tree decl)
    and cgraph_node (ALIAS) transparently returns cgraph_node (DECL).   */
 
 struct cgraph_node *
-cgraph_same_body_alias (tree alias, tree decl)
+cgraph_same_body_alias (struct cgraph_node *decl_node, tree alias, tree decl)
 {
 #ifndef ASM_OUTPUT_DEF
   /* If aliases aren't supported by the assembler, fail.  */
@@ -584,7 +584,7 @@ cgraph_same_body_alias (tree alias, tree decl)
 
   /*gcc_assert (!assembler_name_hash);*/
 
-  return cgraph_same_body_alias_1 (alias, decl);
+  return cgraph_same_body_alias_1 (decl_node, alias, decl);
 }
 
 /* Add thunk alias into callgraph.  The alias declaration is ALIAS and it
@@ -592,7 +592,8 @@ cgraph_same_body_alias (tree alias, tree decl)
    See comments in thunk_adjust for detail on the parameters.  */
 
 struct cgraph_node *
-cgraph_add_thunk (tree alias, tree decl, bool this_adjusting,
+cgraph_add_thunk (struct cgraph_node *decl_node, tree alias, tree decl,
+                 bool this_adjusting,
                  HOST_WIDE_INT fixed_offset, HOST_WIDE_INT virtual_value,
                  tree virtual_offset,
                  tree real_alias)
@@ -606,7 +607,7 @@ cgraph_add_thunk (tree alias, tree decl, bool this_adjusting,
       cgraph_remove_node (node);
     }
   
-  node = cgraph_same_body_alias_1 (alias, decl);
+  node = cgraph_same_body_alias_1 (decl_node, alias, decl);
   gcc_assert (node);
   gcc_checking_assert (!virtual_offset
                       || tree_int_cst_equal (virtual_offset,
@@ -2722,7 +2723,7 @@ cgraph_propagate_frequency (struct cgraph_node *node)
        case NODE_FREQUENCY_EXECUTED_ONCE:
          if (dump_file && (dump_flags & TDF_DETAILS))
            fprintf (dump_file, "  Called by %s that is executed once\n",
-                    cgraph_node_name (node));
+                    cgraph_node_name (edge->caller));
          maybe_unlikely_executed = false;
          if (edge->loop_nest)
            {
@@ -2735,7 +2736,7 @@ cgraph_propagate_frequency (struct cgraph_node *node)
        case NODE_FREQUENCY_NORMAL:
          if (dump_file && (dump_flags & TDF_DETAILS))
            fprintf (dump_file, "  Called by %s that is normal or hot\n",
-                    cgraph_node_name (node));
+                    cgraph_node_name (edge->caller));
          maybe_unlikely_executed = false;
          maybe_executed_once = false;
          break;
index c00418d5888177603f87c4891cf34a5c565c7574..e2d2f50ca3e9e661ea091f83bce123fbf0a5af45 100644 (file)
@@ -559,8 +559,8 @@ struct cgraph_indirect_call_info *cgraph_allocate_init_indirect_info (void);
 struct cgraph_node * cgraph_get_node (const_tree);
 struct cgraph_node * cgraph_get_node_or_alias (const_tree);
 struct cgraph_node * cgraph_node (tree);
-struct cgraph_node * cgraph_same_body_alias (tree, tree);
-struct cgraph_node * cgraph_add_thunk (tree, tree, bool, HOST_WIDE_INT,
+struct cgraph_node * cgraph_same_body_alias (struct cgraph_node *, tree, tree);
+struct cgraph_node * cgraph_add_thunk (struct cgraph_node *, tree, tree, bool, HOST_WIDE_INT,
                                       HOST_WIDE_INT, tree, tree);
 void cgraph_remove_same_body_alias (struct cgraph_node *);
 struct cgraph_node *cgraph_node_for_asm (tree);
index 572090ad9a793239f9972cb3bc704af7d3ee7c51..dba9f10ecf66bc9b30775add857135ef81b6014c 100644 (file)
@@ -1,3 +1,11 @@
+2011-03-04  Jan Hubicka  <jh@suse.cz>
+
+       PR lto/47497
+       * optimize.c (maybe_clone_body): Update call of cgraph_same_body_alias
+       and cgraph_add_thunk.
+       * method.c (make_alias_for_thunk, use_thunk): Likewise.
+       * mangle.c (mangle_decl): Likewise.
+
 2011-03-04  Jason Merrill  <jason@redhat.com>
 
        PR c++/47971
index dca8b604daa9586887317cac02efcc305d8b2572..1984094ba4a097d1ef6a0949a408af1beba43025 100644 (file)
@@ -3163,7 +3163,7 @@ mangle_decl (const tree decl)
       if (vague_linkage_p (decl))
        DECL_WEAK (alias) = 1;
       if (TREE_CODE (decl) == FUNCTION_DECL)
-       cgraph_same_body_alias (alias, decl);
+       cgraph_same_body_alias (cgraph_node (decl), alias, decl);
       else
        varpool_extra_name_alias (alias, decl);
 #endif
index 47f18081063c72a22e7842c714e169de6e4a276b..a4c2dd1b41573d46187868a419ee781e8fbfa468 100644 (file)
@@ -259,7 +259,8 @@ make_alias_for_thunk (tree function)
 
   if (!flag_syntax_only)
     {
-      struct cgraph_node *aliasn = cgraph_same_body_alias (alias, function);
+      struct cgraph_node *aliasn = cgraph_same_body_alias (cgraph_node (function),
+                                                          alias, function);
       DECL_ASSEMBLER_NAME (function);
       gcc_assert (aliasn != NULL);
     }
@@ -376,7 +377,7 @@ use_thunk (tree thunk_fndecl, bool emit_p)
   a = nreverse (t);
   DECL_ARGUMENTS (thunk_fndecl) = a;
   TREE_ASM_WRITTEN (thunk_fndecl) = 1;
-  cgraph_add_thunk (thunk_fndecl, function,
+  cgraph_add_thunk (cgraph_node (function), thunk_fndecl, function,
                    this_adjusting, fixed_offset, virtual_value,
                    virtual_offset, alias);
 
index ed59f91eff34c65ac43c91f77101c52a9f0ddc42..2ce9838a74e80f593afd20c77d9b06b4a6e69383 100644 (file)
@@ -309,7 +309,7 @@ maybe_clone_body (tree fn)
          && (!DECL_ONE_ONLY (fns[0])
              || (HAVE_COMDAT_GROUP
                  && DECL_WEAK (fns[0])))
-         && cgraph_same_body_alias (clone, fns[0]))
+         && cgraph_same_body_alias (cgraph_node (fns[0]), clone, fns[0]))
        {
          alias = true;
          if (DECL_ONE_ONLY (fns[0]))
index fb05a1d05cb14bbdb6582751f3dca555bf57a6b9..ae49ae6543f27766a640b8c2a6c5892ded7973eb 100644 (file)
@@ -551,6 +551,7 @@ lto_output_node (struct lto_simple_output_block *ob, struct cgraph_node *node,
              lto_output_fn_decl_index (ob->decl_state, ob->main_stream,
                                        alias->thunk.alias);
            }
+         gcc_assert (cgraph_get_node (alias->thunk.alias) == node);
          lto_output_uleb128_stream (ob->main_stream, alias->resolution);
          alias = alias->previous;
        }
@@ -1094,7 +1095,7 @@ input_node (struct lto_file_decl_data *file_data,
          tree real_alias;
          decl_index = lto_input_uleb128 (ib);
          real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
-         alias = cgraph_same_body_alias (alias_decl, real_alias);
+         alias = cgraph_same_body_alias (node, alias_decl, real_alias);
        }
       else
         {
@@ -1103,12 +1104,13 @@ input_node (struct lto_file_decl_data *file_data,
          tree real_alias;
          decl_index = lto_input_uleb128 (ib);
          real_alias = lto_file_decl_data_get_fn_decl (file_data, decl_index);
-         alias = cgraph_add_thunk (alias_decl, fn_decl, type & 2, fixed_offset,
+         alias = cgraph_add_thunk (node, alias_decl, fn_decl, type & 2, fixed_offset,
                                    virtual_value,
                                    (type & 4) ? size_int (virtual_value) : NULL_TREE,
                                    real_alias);
        }
-       alias->resolution = (enum ld_plugin_symbol_resolution)lto_input_uleb128 (ib);
+      gcc_assert (alias);
+      alias->resolution = (enum ld_plugin_symbol_resolution)lto_input_uleb128 (ib);
     }
   return node;
 }
index 757327686534adc76e4d499a3f9831a31bda9a77..b02aabab14d2d8bbb94b558b15707fdda37b294a 100644 (file)
@@ -273,7 +273,6 @@ lto_cgraph_replace_node (struct cgraph_node *node,
          last = alias;
          gcc_assert (alias->same_body_alias);
          alias->same_body = prevailing_node;
-         alias->thunk.alias = prevailing_node->decl;
        }
       last->next = prevailing_node->same_body;
       /* Node with aliases is prevailed by alias.
@@ -828,8 +827,16 @@ lto_symtab_merge_cgraph_nodes_1 (void **slot, void *data ATTRIBUTE_UNUSED)
 void
 lto_symtab_merge_cgraph_nodes (void)
 {
+  struct cgraph_node *node, *alias, *next;
   lto_symtab_maybe_init_hash_table ();
   htab_traverse (lto_symtab_identifiers, lto_symtab_merge_cgraph_nodes_1, NULL);
+
+  for (node = cgraph_nodes; node; node = node->next)
+    for (alias = node->same_body; alias; alias = next)
+      {
+       next = alias->next;
+       alias->thunk.alias = lto_symtab_prevailing_decl (alias->thunk.alias);
+      }
 }
 
 /* Given the decl DECL, return the prevailing decl with the same name. */