This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Symbol table 13/many: reachability code rewrite


Hi,
the fortran problem is caused by fact that fortran does nested funtions that
are static constructors.  I did not really think of that case in cgraph
construction code.  Fixed thus.

Honza
	PR middle-end/53089 
	* cgraphunit.c (cgraph_process_new_functions): Do not enqueue new functions here.
	(referred_to_p): Move ahead in file to avoid forward declaration.
	(cgraph_finalize_function): Finalize them here.
	* symtab.c (dump_symtab): Dump ctors and dtors.

Index: cgraphunit.c
===================================================================
*** cgraphunit.c	(revision 186770)
--- cgraphunit.c	(working copy)
*************** cgraph_process_new_functions (void)
*** 243,249 ****
  	  cgraph_finalize_function (fndecl, false);
  	  output = true;
            cgraph_call_function_insertion_hooks (node);
- 	  enqueue_node ((symtab_node) node);
  	  break;
  
  	case CGRAPH_STATE_IPA:
--- 243,248 ----
*************** cgraph_reset_node (struct cgraph_node *n
*** 320,325 ****
--- 319,340 ----
    cgraph_node_remove_callees (node);
  }
  
+ /* Return true when there are references to NODE.  */
+ 
+ static bool
+ referred_to_p (symtab_node node)
+ {
+   int i;
+   struct ipa_ref *ref;
+ 
+   for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref);
+        i++)
+     return true;
+   if (symtab_function_p (node) && cgraph (node)->callers)
+     return true;
+   return false;
+ }
+ 
  /* DECL has been parsed.  Take it, queue it, compile it at the whim of the
     logic in effect.  If NESTED is true, then our caller cannot stand to have
     the garbage collector run at the moment.  We would need to either create
*************** cgraph_finalize_function (tree decl, boo
*** 372,377 ****
--- 387,397 ----
  
    if (!nested)
      ggc_collect ();
+ 
+   if (cgraph_state == CGRAPH_STATE_CONSTRUCTION
+       && (cgraph_decide_is_function_needed (node, decl)
+ 	  || referred_to_p ((symtab_node)node)))
+     enqueue_node ((symtab_node)node);
  }
  
  /* Add the function FNDECL to the call graph.
*************** process_function_and_variable_attributes
*** 1114,1135 ****
      }
  }
  
- /* Return true when there are references to NODE.  */
- 
- static bool
- referred_to_p (symtab_node node)
- {
-   int i;
-   struct ipa_ref *ref;
- 
-   for (i = 0; ipa_ref_list_referring_iterate (&node->symbol.ref_list, i, ref);
-        i++)
-     return true;
-   if (symtab_function_p (node) && cgraph (node)->callers)
-     return true;
-   return false;
- }
- 
  /* Mark DECL as finalized.  By finalizing the declaration, frontend instruct the
     middle end to output the variable to asm file, if needed or externally
     visible.  */
--- 1134,1139 ----
Index: symtab.c
===================================================================
*** symtab.c	(revision 186770)
--- symtab.c	(working copy)
*************** dump_symtab_base (FILE *f, symtab_node n
*** 414,419 ****
--- 414,426 ----
      fprintf (f, " virtual");
    if (DECL_ARTIFICIAL (node->symbol.decl))
      fprintf (f, " artificial");
+   if (TREE_CODE (node->symbol.decl) == FUNCTION_DECL)
+     {
+       if (DECL_STATIC_CONSTRUCTOR (node->symbol.decl))
+ 	fprintf (f, " constructor");
+       if (DECL_STATIC_DESTRUCTOR (node->symbol.decl))
+ 	fprintf (f, " destructor");
+     }
    fprintf (f, "\n");
    
    if (node->symbol.same_comdat_group)


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]