re PR middle-end/16460 (ICE when compiling glibc (ld-ctype.c))
authorJan Hubicka <jh@suse.cz>
Mon, 20 Sep 2004 20:38:29 +0000 (22:38 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Mon, 20 Sep 2004 20:38:29 +0000 (20:38 +0000)
PR middle-end/16460

* cgraph.c (cgraph_unnest_node): New function.
(c_finalize): Rename to ....
(c_warn_unused_result_recursivly): ... this one; do only the warning
(finish_function): Finalize the toplevel function; do not lower nested tree.
* cgraph.h (cgraph_unnest_node): Declare.
* cgraphunit.c (decide_is_function_needed): Do not use cgraph
nestedness datastructure.
* cse.c (cse_insn): Do not cprop nonlocal LABEL_REFs.
* reload1.c (set_label_offsets): Fix call of set_label_offsets.
* tree-nested.c (finlize_nesting_tree_1):  Use un-nesting code.

* utils.c (gnat_finalize): Remove.
(end_subprog_body): Directly call cgraph_finalize_function;
do not lower the nested functions.

* trans-decl.c (build_entry_thunks): Finalize the function; do not lower
tree.
(gfc_generate_function_code): Likewise.

From-SVN: r87770

gcc/ChangeLog
gcc/ada/ChangeLog
gcc/ada/utils.c
gcc/cgraph.c
gcc/cgraph.h
gcc/cgraphunit.c
gcc/cse.c
gcc/fortran/ChangeLog
gcc/fortran/trans-decl.c
gcc/reload1.c
gcc/tree-nested.c

index d4902b7d078ca84378b81bf2288bb1261ad7e3d6..79e80a517fe8f43d228de43cc776696fcd84fc40 100644 (file)
@@ -1,3 +1,18 @@
+2004-09-20  Jan Hubicka  <jh@suse.cz>
+
+       PR middle-end/16460
+
+       * cgraph.c (cgraph_unnest_node): New function.
+       (c_finalize): Rename to ....
+       (c_warn_unused_result_recursivly): ... this one; do only the warning
+       (finish_function): Finalize the toplevel function; do not lower nested tree.
+       * cgraph.h (cgraph_unnest_node): Declare.
+       * cgraphunit.c (decide_is_function_needed): Do not use cgraph
+       nestedness datastructure.
+       * cse.c (cse_insn): Do not cprop nonlocal LABEL_REFs.
+       * reload1.c (set_label_offsets): Fix call of set_label_offsets.
+       * tree-nested.c (finlize_nesting_tree_1):  Use un-nesting code.
+
 2004-09-20  Richard Henderson  <rth@redhat.com>
 
        * config/alpha/alpha.c (some_small_symbolic_operand_int): Rename
index 8c1632d23f9dcd0fa424c125cda3eb3b495a5d91..d55030262b356468f98941cd501e9247fa849886 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-20  Jan Hubicka  <jh@suse.cz>
+
+       * utils.c (gnat_finalize): Remove.
+       (end_subprog_body): Directly call cgraph_finalize_function;
+       do not lower the nested functions.
+
 2004-09-20  Robert Dewar  <dewar@gnat.com>
 
        PR ada/17540
index 1a5afb3d9b1150d687103261cd2bf24cd61cbd79..e09c83e7ff8c4aa0d2cf32f22fe1899170cb32ba 100644 (file)
@@ -125,7 +125,6 @@ static tree compute_related_constant (tree, tree);
 static tree split_plus (tree, tree *);
 static bool value_zerop (tree);
 static void gnat_gimplify_function (tree);
-static void gnat_finalize (tree);
 static tree float_type_for_precision (int, enum machine_mode);
 static tree convert_to_fat_pointer (tree, tree);
 static tree convert_to_thin_pointer (tree, tree);
@@ -1793,8 +1792,7 @@ end_subprog_body (tree body)
   if (!DECL_CONTEXT (fndecl))
     {
       gnat_gimplify_function (fndecl);
-      lower_nested_functions (fndecl);
-      gnat_finalize (fndecl);
+      cgraph_finalize_function (fndecl, false);
     }
   else
     /* Register this function with cgraph just far enough to get it
@@ -1820,21 +1818,6 @@ gnat_gimplify_function (tree fndecl)
   for (cgn = cgn->nested; cgn; cgn = cgn->next_nested)
     gnat_gimplify_function (cgn->decl);
 }
-
-/* Give FNDECL and all its nested functions to cgraph for compilation.  */
-
-static void
-gnat_finalize (tree fndecl)
-{
-  struct cgraph_node *cgn;
-
-  /* Finalize all nested functions now.  */
-  cgn = cgraph_node (fndecl);
-  for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
-    gnat_finalize (cgn->decl);
-
-  cgraph_finalize_function (fndecl, false);
-}
 \f
 /* Return a definition for a builtin function named NAME and whose data type
    is TYPE.  TYPE should be a function type with argument types.
index f8f0b7cd52a2af634c72dc6c9fda7832bfb0c8c3..7206251ac547e765a9de57e8e6e205855ae5e514 100644 (file)
@@ -693,4 +693,17 @@ cgraph_clone_node (struct cgraph_node *n)
 
   return new;
 }
+
+/* NODE is no longer nested function; update cgraph accordingly.  */
+void
+cgraph_unnest_node (struct cgraph_node *node)
+{
+  struct cgraph_node **node2 = &node->origin->nested;
+  gcc_assert (node->origin);
+
+  while (*node2 != node)
+    node2 = &(*node2)->next_nested;
+  *node2 = node->next_nested;
+  node->origin = NULL;
+}
 #include "gt-cgraph.h"
index ca355fec94b69eca46c14f30e0b81c6243a4235d..33209f6284b83e25032d780e3cff5989ef0e2541 100644 (file)
@@ -266,6 +266,7 @@ bool cgraph_varpool_assemble_pending_decls (void);
 void cgraph_redirect_edge_callee (struct cgraph_edge *, struct cgraph_node *);
 
 bool cgraph_function_possibly_inlined_p (tree);
+void cgraph_unnest_node (struct cgraph_node *node);
 
 /* In cgraphunit.c  */
 bool cgraph_assemble_pending_functions (void);
index e4348ca8b83134792a8d5c350c3125a3a184f75f..7da68540108db8e867067409b9c11bd82efbd993 100644 (file)
@@ -263,7 +263,7 @@ static tree memory_identifier;
 static bool
 decide_is_function_needed (struct cgraph_node *node, tree decl)
 {
-  struct cgraph_node *origin;
+  tree origin;
 
   /* If we decided it was needed before, but at the time we didn't have
      the body of the function available, then it's still needed.  We have
@@ -303,8 +303,9 @@ decide_is_function_needed (struct cgraph_node *node, tree decl)
     return false;
   /* Nested functions of extern inline function shall not be emit unless
      we inlined the origin.  */
-  for (origin = node->origin; origin; origin = origin->origin)
-    if (DECL_EXTERNAL (origin->decl))
+  for (origin = decl_function_context (decl); origin;
+       origin = decl_function_context (origin))
+    if (DECL_EXTERNAL (origin))
       return false;
   /* We want to emit COMDAT functions only when absolutely necessary.  */
   if (DECL_COMDAT (decl))
@@ -586,6 +587,9 @@ cgraph_finalize_function (tree decl, bool nested)
   notice_global_symbol (decl);
   node->decl = decl;
   node->local.finalized = true;
+  if (node->nested)
+    lower_nested_functions (decl);
+  gcc_assert (!node->nested);
 
   /* If not unit at a time, then we need to create the call graph
      now, so that called functions can be queued and emitted now.  */
index fb9632875561ccfebdb1d828df47bdd682a90135..b7da8a349788735f2495fa388b7f8457366008e7 100644 (file)
--- a/gcc/cse.c
+++ b/gcc/cse.c
@@ -5623,7 +5623,8 @@ cse_insn (rtx insn, rtx libcall_insn)
 
       /* If this SET is now setting PC to a label, we know it used to
         be a conditional or computed branch.  */
-      else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF)
+      else if (dest == pc_rtx && GET_CODE (src) == LABEL_REF
+              && !LABEL_REF_NONLOCAL_P (src))
        {
          /* Now emit a BARRIER after the unconditional jump.  */
          if (NEXT_INSN (insn) == 0
index 39f739c444a2e53ff00cad559aa564c90c92443e..c0dfa23fadb071ab771e30abd4ea1a15d4a259b7 100644 (file)
@@ -1,3 +1,9 @@
+2004-09-20  Jan Hubicka  <jh@suse.cz>
+
+       * trans-decl.c (build_entry_thunks): Finalize the function; do not lower
+       tree.
+       (gfc_generate_function_code): Likewise.
+
 2004-09-20  Tobias Schlueter  <tobias.schlueter@physik.uni-muenchen.de>
 
        PR fortran/15957
index 8cb308d37b272fd86faa0630109b5906da8d38ff..cbe36f72c38fc1ec0c3ce044760484e44b9196db 100644 (file)
@@ -1255,22 +1255,6 @@ create_function_arglist (gfc_symbol * sym)
   DECL_ARGUMENTS (fndecl) = arglist;
 }
 
-
-/* Finalize DECL and all nested functions with cgraph.  */
-
-static void
-gfc_finalize (tree decl)
-{
-  struct cgraph_node *cgn;
-
-  cgn = cgraph_node (decl);
-  for (cgn = cgn->nested; cgn ; cgn = cgn->next_nested)
-    gfc_finalize (cgn->decl);
-
-  cgraph_finalize_function (decl, false);
-}
-
-
 /* Convert FNDECL's code to GIMPLE and handle any nested functions.  */
 
 static void
@@ -1431,8 +1415,7 @@ build_entry_thunks (gfc_namespace * ns)
       current_function_decl = NULL_TREE;
 
       gfc_gimplify_function (thunk_fndecl);
-      lower_nested_functions (thunk_fndecl);
-      gfc_finalize (thunk_fndecl);
+      cgraph_finalize_function (thunk_fndecl, false);
 
       /* We share the symbols in the formal argument list with other entry
         points and the master function.  Clear them so that they are
@@ -2313,8 +2296,7 @@ gfc_generate_function_code (gfc_namespace * ns)
   else
     {
       gfc_gimplify_function (fndecl);
-      lower_nested_functions (fndecl);
-      gfc_finalize (fndecl);
+      cgraph_finalize_function (fndecl, false);
     }
 }
 
index c63d418b39cad20ea49581b79c3c7a14fd76afda..052acc092fffbe3ee6f39df996b3ca65705f6432 100644 (file)
@@ -2185,7 +2185,7 @@ set_label_offsets (rtx x, rtx insn, int initial_p)
          return;
 
        case LABEL_REF:
-         set_label_offsets (XEXP (SET_SRC (x), 0), insn, initial_p);
+         set_label_offsets (SET_SRC (x), insn, initial_p);
          return;
 
        case IF_THEN_ELSE:
index 135ac0486a8a8976d4a4fb751823e9ed2387a2a5..d2608a837f0eed415dfaa1cbe39ad2c44ce6dc50 100644 (file)
@@ -1207,6 +1207,7 @@ finalize_nesting_tree_1 (struct nesting_info *root)
   tree stmt_list = NULL;
   tree context = root->context;
   struct function *sf;
+  struct cgraph_node *node;
 
   /* If we created a non-local frame type or decl, we need to lay them
      out at this time.  */
@@ -1317,6 +1318,15 @@ finalize_nesting_tree_1 (struct nesting_info *root)
 
   /* Dump the translated tree function.  */
   dump_function (TDI_nested, root->context);
+  node = cgraph_node (root->context);
+
+  /* For nested functions update the cgraph to reflect unnesting.
+     We also delay finalizing of these functions up to this point.  */
+  if (node->origin)
+    {
+       cgraph_unnest_node (cgraph_node (root->context));
+       cgraph_finalize_function (root->context, true);
+    }
 }
 
 static void