Attaching an updated patch.
Thanks
Sri
On Thu, Apr 25, 2013 at 4:42 PM, Sriraman Tallam <[email protected]> wrote:
> On Tue, Apr 23, 2013 at 9:59 PM, Jakub Jelinek <[email protected]> wrote:
>> On Tue, Apr 23, 2013 at 03:58:06PM -0700, Sriraman Tallam wrote:
>>> 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.
>>
>> This doesn't honor NO_DOT_IN_LABEL (and NO_DOLLAR_IN_LABEL).
>
> Fixed, by calling clean_symbol_name
>
>> Also, don't some function start in cold section and then switch into hot
>> section?
>
> I am not able to generate a test where this happens. However, I fixed
> this problem by generating the cold label only when the first function
> block is not cold.
>
> Patch attached, please see if this is ok.
>
> Thanks
> Sri
>
>>
>> Jakub
Index: final.c
===================================================================
--- final.c (revision 198212)
+++ final.c (working copy)
@@ -2101,6 +2101,25 @@ 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. Do not do
+ this when the first function block of the split function is
+ cold. */
+ if (in_cold_section_p
+ && !first_function_block_is_cold)
+ {
+ 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);
+ clean_symbol_name (cold_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 } } */