diff mbox

[google,4.7] Generate a label for the split cold function while using -freorder-blocks-and-partition

Message ID CAAs8Hmw4RW0dXPNnRARnnPKjoWkw9yeg3bnXe=04D3dYPVC03Q@mail.gmail.com
State New
Headers show

Commit Message

Sriraman Tallam April 19, 2013, 8:43 p.m. UTC
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.

I will port this patch to trunk, please let me know what you think.

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.
diff mbox

Patch

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 } } */
Index: final.c
===================================================================
--- final.c	(revision 198081)
+++ final.c	(working copy)
@@ -1907,6 +1907,9 @@  final_scan_insn (rtx insn, FILE *file, int optimiz
 #endif
   rtx next;
 
+  char *cold_function_name;
+  const char *mangled_function_name;
+
   insn_counter++;
 
   /* Ignore deleted insns.  These can occur when we split insns (due to a
@@ -1934,6 +1937,15 @@  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.  */
+	  mangled_function_name
+	    = IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (current_function_decl));
+	  cold_function_name = XNEWVEC (char,
+	      strlen (mangled_function_name) + strlen (".cold") + 1);
+	  sprintf (cold_function_name, "%s%s", mangled_function_name,
+	           ".cold");
+	  ASM_OUTPUT_LABEL (asm_out_file, cold_function_name);
+	  XDELETEVEC (cold_function_name);
 	  break;
 
 	case NOTE_INSN_BASIC_BLOCK: