This patch preserves cgraph callee edges till pass_final if callgraph
edge profiles sections are requested.  It also renames callgraph edge
profile sections to be .gnu.callgraph instead of .note.callgraph


Index: cgraphbuild.c
===================================================================
--- cgraphbuild.c       (revision 179098)
+++ cgraphbuild.c       (working copy)
@@ -697,10 +697,18 @@ struct gimple_opt_pass pass_rebuild_cgraph_edges =
  }
 };
 
+/* Defined in tree-optimize.c  */
+extern bool cgraph_callee_edges_final_cleanup; 
 
 static unsigned int
 remove_cgraph_callee_edges (void)
 {
+  /* The -fcallgraph-profiles-sections flag needs the call-graph preserved
+     till pass_final.  */
+  if (cgraph_callee_edges_final_cleanup
+      && flag_callgraph_profiles_sections)
+      return 0;
+
   cgraph_node_remove_callees (cgraph_node (current_function_decl));
   return 0;
 }
Index: final.c
===================================================================
--- final.c     (revision 179098)
+++ final.c     (working copy)
@@ -4425,10 +4425,11 @@ rest_of_handle_final (void)
      profiling information. */
   if (flag_callgraph_profiles_sections
       && flag_profile_use
-      && cgraph_node (current_function_decl) != NULL)
+      && cgraph_node (current_function_decl) != NULL
+      && (cgraph_node (current_function_decl))->callees != NULL)
     {
       flags = SECTION_DEBUG;
-      asprintf (&profile_fnname, ".note.callgraph.text.%s", fnname);
+      asprintf (&profile_fnname, ".gnu.callgraph.text.%s", fnname);
       switch_to_section (get_section (profile_fnname, flags, NULL));
       fprintf (asm_out_file, "\t.string \"Function %s\"\n", fnname);
       dump_cgraph_profiles ();
Index: testsuite/g++.dg/tree-prof/callgraph-profiles.C
===================================================================
--- testsuite/g++.dg/tree-prof/callgraph-profiles.C     (revision 0)
+++ testsuite/g++.dg/tree-prof/callgraph-profiles.C     (revision 0)
@@ -0,0 +1,29 @@
+/* Verify if call-graph profile sections are created
+   with -fcallgraph-profiles-sections. */
+/* { dg-options "-O2 -fcallgraph-profiles-sections -ffunction-sections 
--save-temps" } */
+
+int __attribute__ ((noinline))
+foo ()
+{
+  return 1;
+}
+
+int __attribute__ ((noinline))
+bar ()
+{
+  return 0;
+}
+
+int main ()
+{
+  int sum;
+  for (int i = 0; i< 1000; i++)
+    {
+      sum = foo () + bar();
+    }
+  return sum * bar ();
+}
+
+/* { dg-final-use { scan-assembler "\.gnu\.callgraph\.text\.main" } } */
+/* { dg-final-use { scan-assembler "\.string \"1000\"" } } */
+/* { dg-final-use { cleanup-saved-temps } }  */
Index: tree-optimize.c
===================================================================
--- tree-optimize.c     (revision 179098)
+++ tree-optimize.c     (working copy)
@@ -48,11 +48,17 @@ along with GCC; see the file COPYING3.  If not see
 #include "plugin.h"
 #include "regset.h"    /* FIXME: For reg_obstack.  */
 
+/* Decides if the cgraph callee edges are being cleaned up for the
+   last time.  */
+bool cgraph_callee_edges_final_cleanup = false;
+
 /* Gate: execute, or not, all of the non-trivial optimizations.  */
 
 static bool
 gate_all_optimizations (void)
 {
+  /* The cgraph callee edges can be cleaned up for the last time.  */
+  cgraph_callee_edges_final_cleanup = true;
   return (optimize >= 1
          /* Don't bother doing anything if the program has errors.
             We have to pass down the queue if we already went into SSA */

--
This patch is available for review at http://codereview.appspot.com/5101042

Reply via email to