Hi,

  This patch generates labels for cold function parts that are split when
using the option -freorder-blocks-and-partition.  The cold label name
is generated by suffixing ".cold" to the assembler name of the hot
function.

  This is useful when getting back traces from gdb when the cold function
part does get executed.

        * final.c (final_scan_insn): Generate cold label name by suffixing
        ".cold" to function's assembler name.
        * gcc.dg/tree-prof/cold_partition_label.c: New test.

Comments please.

Thanks
Sri
Patch to generate labels for cold function parts that are split when
using the option -freorder-blocks-and-partition.  The cold label name
is generated by suffixing ".cold" to the assembler name of the hot
function.

This is useful when getting back traces from gdb when the cold function
part does get executed. 

        * final.c (final_scan_insn): Generate cold label name by suffixing
        ".cold" to function's assembler name.
        * gcc.dg/tree-prof/cold_partition_label.c: New test.

Index: final.c
===================================================================
--- final.c     (revision 198212)
+++ final.c     (working copy)
@@ -2101,6 +2101,21 @@ final_scan_insn (rtx insn, FILE *file, int optimiz
          targetm.asm_out.function_switched_text_sections (asm_out_file,
                                                           
current_function_decl,
                                                           in_cold_section_p);
+         /* Emit a label for the split cold section.  Form label name by
+            suffixing ".cold" to the function's assembler name.  */
+         if (in_cold_section_p)
+           {
+             char *cold_function_name;
+             const char *mangled_function_name;
+             tree asm_name = DECL_ASSEMBLER_NAME (current_function_decl);
+
+             mangled_function_name = IDENTIFIER_POINTER (asm_name);
+             cold_function_name = XNEWVEC (char,
+                 strlen (mangled_function_name) + strlen (".cold") + 1);
+             sprintf (cold_function_name, "%s.cold", mangled_function_name);
+             ASM_OUTPUT_LABEL (asm_out_file, cold_function_name);
+             XDELETEVEC (cold_function_name);
+           }
          break;
 
        case NOTE_INSN_BASIC_BLOCK:
Index: testsuite/gcc.dg/tree-prof/cold_partition_label.c
===================================================================
--- testsuite/gcc.dg/tree-prof/cold_partition_label.c   (revision 0)
+++ testsuite/gcc.dg/tree-prof/cold_partition_label.c   (revision 0)
@@ -0,0 +1,39 @@
+/* Test case to check if function foo gets split and the cold function
+   gets a label.  */
+/* { dg-require-effective-target freorder } */
+/* { dg-options "-O2 -freorder-blocks-and-partition --save-temps" } */
+
+#define SIZE 10000
+
+const char *sarr[SIZE];
+const char *buf_hot;
+const char *buf_cold;
+
+__attribute__((noinline))
+void 
+foo (int path)
+{
+  int i;
+  if (path)
+    {
+      for (i = 0; i < SIZE; i++)
+       sarr[i] = buf_hot;
+    }
+  else
+    {
+      for (i = 0; i < SIZE; i++)
+       sarr[i] = buf_cold;
+    }
+}
+
+int
+main (int argc, char *argv[])
+{
+  buf_hot =  "hello";
+  buf_cold = "world";
+  foo (argc);
+  return 0;
+}
+
+/* { dg-final-use { scan-assembler "foo.cold" } } */
+/* { dg-final-use { cleanup-saved-temps } } */

Reply via email to