]> gcc.gnu.org Git - gcc.git/commitdiff
cgraph.c (cgraph_function_body_availability): Handle weakref correctly.
authorJan Hubicka <jh@suse.cz>
Fri, 30 Aug 2013 15:41:26 +0000 (17:41 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Fri, 30 Aug 2013 15:41:26 +0000 (15:41 +0000)
* cgraph.c (cgraph_function_body_availability): Handle weakref
correctly.
* passes.def: Remove pass_fixup_cfg.
* ipa-inline.c (ipa_inline): When not optimizing, do not inline;
track when we need to remove functions.
(gate_ipa_inline): Execute inlining always; add comment why.
(pass_data_ipa_inline): Remove TODO_remove_functions.
* ipa-inline-analysis.c (inline_generate_summary): When not optimizing
do not produce summaries.
* symtab.c (change_decl_assembler_name): Handle renaming of weakrefs.
(symtab_nonoverwritable_alias): Assert we are not called on weakref.
* varpool.c (cgraph_variable_initializer_availability): Fix weakrefs,
constant pool and vtable.

From-SVN: r202111

gcc/ChangeLog
gcc/cgraph.c
gcc/ipa-inline-analysis.c
gcc/ipa-inline.c
gcc/passes.def
gcc/symtab.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/attr-alias.c
gcc/varpool.c

index c1ced6eda18d3d3c43b05e38149f15d88497b029..33ce266dc223ef97e0bf6cac097970732bb8275a 100644 (file)
@@ -1,3 +1,19 @@
+2013-08-29  Jan Hubicka  <jh@suse.cz>
+
+       * cgraph.c (cgraph_function_body_availability): Handle weakref
+       correctly.
+       * passes.def: Remove pass_fixup_cfg.
+       * ipa-inline.c (ipa_inline): When not optimizing, do not inline;
+       track when we need to remove functions.
+       (gate_ipa_inline): Execute inlining always; add comment why.
+       (pass_data_ipa_inline): Remove TODO_remove_functions.
+       * ipa-inline-analysis.c (inline_generate_summary): When not optimizing
+       do not produce summaries.
+       * symtab.c (change_decl_assembler_name): Handle renaming of weakrefs.
+       (symtab_nonoverwritable_alias): Assert we are not called on weakref.
+       * varpool.c (cgraph_variable_initializer_availability): Fix weakrefs,
+       constant pool and vtable.
+
 2013-08-30  Tejas Belagod  <tejas.belagod@arm.com>
 
        * config/aarch64/arm_neon.h (__AARCH64_UINT64_C, __AARCH64_INT64_C): New
index feb17bb0dd93cb0c3c0fecf9b441c51d5610b8fe..d89522432b3e583ae798639dff0592f1ed6b7da8 100644 (file)
@@ -2046,6 +2046,8 @@ cgraph_function_body_availability (struct cgraph_node *node)
     avail = AVAIL_NOT_AVAILABLE;
   else if (node->local.local)
     avail = AVAIL_LOCAL;
+  else if (node->symbol.alias && node->symbol.weakref)
+    cgraph_function_or_thunk_node (node, &avail);
   else if (!node->symbol.externally_visible)
     avail = AVAIL_AVAILABLE;
   /* Inline functions are safe to be analyzed even if their symbol can
index 806b219c2288ce6ba28c192c2f08ef591b945391..722ba51f42d7d5bed13e868d761c079aa079b3c4 100644 (file)
@@ -3698,6 +3698,11 @@ inline_generate_summary (void)
 {
   struct cgraph_node *node;
 
+  /* When not optimizing, do not bother to analyze.  Inlining is still done
+     because edge redirection needs to happen there.  */
+  if (!optimize && !flag_lto && !flag_wpa)
+    return;
+
   function_insertion_hook_holder =
     cgraph_add_function_insertion_hook (&add_new_function, NULL);
 
index 115269571909912df27506d75576482bfdd06416..9a9408ee2aba801c6c3df795e9540ef5b9d6c958 100644 (file)
@@ -1904,6 +1904,10 @@ ipa_inline (void)
     XCNEWVEC (struct cgraph_node *, cgraph_n_nodes);
   int i;
   int cold;
+  bool remove_functions = false;
+
+  if (!optimize)
+    return 0;
 
   if (in_lto_p && optimize)
     ipa_update_after_lto_read ();
@@ -1984,6 +1988,7 @@ ipa_inline (void)
                {
                  cgraph_resolve_speculation (edge, NULL);
                  update = true;
+                 remove_functions = true;
                }
            }
          if (update)
@@ -2018,6 +2023,7 @@ ipa_inline (void)
                    }
 
                  inline_call (node->callers, true, NULL, NULL, true);
+                 remove_functions = true;
                  if (dump_file)
                    fprintf (dump_file,
                             " Inlined into %s which now has %i size\n",
@@ -2048,7 +2054,7 @@ ipa_inline (void)
   /* In WPA we use inline summaries for partitioning process.  */
   if (!flag_wpa)
     inline_free_summary ();
-  return 0;
+  return remove_functions ? TODO_remove_functions : 0;
 }
 
 /* Inline always-inline function calls in NODE.  */
@@ -2292,13 +2298,13 @@ make_pass_early_inline (gcc::context *ctxt)
 /* When to run IPA inlining.  Inlining of always-inline functions
    happens during early inlining.
 
-   Enable inlining unconditoinally at -flto.  We need size estimates to
-   drive partitioning.  */
+   Enable inlining unconditoinally, because callgraph redirection
+   happens here.   */
 
 static bool
 gate_ipa_inline (void)
 {
-  return optimize || flag_lto || flag_wpa;
+  return true;
 }
 
 namespace {
@@ -2315,7 +2321,7 @@ const pass_data pass_data_ipa_inline =
   0, /* properties_provided */
   0, /* properties_destroyed */
   TODO_remove_functions, /* todo_flags_start */
-  ( TODO_dump_symtab | TODO_remove_functions ), /* todo_flags_finish */
+  ( TODO_dump_symtab ), /* todo_flags_finish */
 };
 
 class pass_ipa_inline : public ipa_opt_pass_d
index b289713368f33d746444aa9b1a54a840c8963893..aa45d51994b20034513c5caccdbd06c0564bfc33 100644 (file)
@@ -126,7 +126,6 @@ along with GCC; see the file COPYING3.  If not see
   /* These passes are run after IPA passes on every function that is being
      output to the assembler file.  */
   INSERT_PASSES_AFTER (all_passes)
-  NEXT_PASS (pass_fixup_cfg);
   NEXT_PASS (pass_lower_eh_dispatch);
   NEXT_PASS (pass_all_optimizations);
   PUSH_INSERT_PASSES_WITHIN (pass_all_optimizations)
index a86bf6b132791e6b670519f8e251aceadfab2b6c..bfbc03b6a82d83be6134e7850a2f25520a8c7cb5 100644 (file)
@@ -390,6 +390,9 @@ change_decl_assembler_name (tree decl, tree name)
       if (name == DECL_ASSEMBLER_NAME (decl))
        return;
 
+      tree alias = (IDENTIFIER_TRANSPARENT_ALIAS (DECL_ASSEMBLER_NAME (decl))
+                   ? TREE_CHAIN (DECL_ASSEMBLER_NAME (decl))
+                   : NULL);
       if (node)
        unlink_from_assembler_name_hash (node, true);
       if (TREE_SYMBOL_REFERENCED (DECL_ASSEMBLER_NAME (decl))
@@ -397,6 +400,11 @@ change_decl_assembler_name (tree decl, tree name)
        warning (0, "%D renamed after being referenced in assembly", decl);
 
       SET_DECL_ASSEMBLER_NAME (decl, name);
+      if (alias)
+       {
+         IDENTIFIER_TRANSPARENT_ALIAS (name) = 1;
+         TREE_CHAIN (DECL_ASSEMBLER_NAME (name)) = alias;
+       }
       if (node)
        insert_to_assembler_name_hash (node, true);
     }
@@ -1065,11 +1073,17 @@ symtab_nonoverwritable_alias (symtab_node node)
 {
   tree new_decl;
   symtab_node new_node = NULL;
+
+  /* First try to look up existing alias or base object
+     (if that is already non-overwritable).  */
+  node = symtab_alias_ultimate_target (node, NULL);
+  gcc_assert (!node->symbol.alias && !node->symbol.weakref);
   symtab_for_node_and_aliases (node, symtab_nonoverwritable_alias_1,
                               (void *)&new_node, true);
   if (new_node)
     return new_node;
 
+  /* Otherwise create a new one.  */
   new_decl = copy_node (node->symbol.decl);
   DECL_NAME (new_decl) = clone_function_name (node->symbol.decl, "localalias");
   if (TREE_CODE (new_decl) == FUNCTION_DECL)
index f8a1f4964d24dacb6ab40f26f3122bc94ee340f6..5c1a8d6b024f2b3432a589baee9b70e2890c0191 100644 (file)
@@ -1,3 +1,8 @@
+2013-08-29  Jan Hubicka  <jh@suse.cz>
+
+       * gcc.dg/tree-ssa/attr-alias.c: Rename test3 to test1 to match template
+       and comment.
+
 2013-08-30  Paolo Carlini  <paolo.carlini@oracle.com>
 
        PR c++/51424
index 96c0dc24bedaf704cb82fb9c15b51c1ba913ebe7..fe4084d21314e870ceec0f07ff55798ab92cc4e3 100644 (file)
@@ -8,7 +8,7 @@ int test()
    return 0;
 }
 static int test2() __attribute__ ((alias("test")));
-static int test3() __attribute__ ((weakref)) __attribute__ ((alias("test2")));
+static int test1() __attribute__ ((weakref)) __attribute__ ((alias("test2")));
 static int test4() __attribute__ ((weakref)) __attribute__ ((alias("test")));
 main()
 {
index b426757ec8463feef14a304fd45313931790067d..f558aae0bd1d1932b9a4fb37fe55c143459d414f 100644 (file)
@@ -260,10 +260,22 @@ cgraph_variable_initializer_availability (struct varpool_node *node)
     return AVAIL_NOT_AVAILABLE;
   if (!TREE_PUBLIC (node->symbol.decl))
     return AVAIL_AVAILABLE;
+  if (DECL_IN_CONSTANT_POOL (node->symbol.decl)
+      || DECL_VIRTUAL_P (node->symbol.decl))
+    return AVAIL_AVAILABLE;
+  if (node->symbol.alias && node->symbol.weakref)
+    {
+      enum availability avail;
+
+      cgraph_variable_initializer_availability
+             (varpool_variable_node (node, &avail));
+      return avail;
+    }
   /* If the variable can be overwritten, return OVERWRITABLE.  Takes
      care of at least one notable extension - the COMDAT variables
      used to share template instantiations in C++.  */
-  if (!decl_replaceable_p (node->symbol.decl))
+  if (decl_replaceable_p (node->symbol.decl)
+      || DECL_EXTERNAL (node->symbol.decl))
     return AVAIL_OVERWRITABLE;
   return AVAIL_AVAILABLE;
 }
This page took 0.101665 seconds and 5 git commands to generate.