summaryrefslogtreecommitdiff
path: root/0057-AutoFdo-Fix-memory-leaks-in-autofdo.patch
blob: 4d80606a075a6f331c7eae33a8daa0eb5a6d4db5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
From 13e82fccba781b29e55a6e1934986514019b728d Mon Sep 17 00:00:00 2001
From: zhenyu--zhao <zhaozhenyu17@huawei.com>
Date: Sun, 24 Mar 2024 20:42:27 +0800
Subject: [PATCH 02/32] [AutoFdo] Fix memory leaks in autofdo

---
 gcc/final.cc | 22 ++++++++++++++--------
 1 file changed, 14 insertions(+), 8 deletions(-)

diff --git a/gcc/final.cc b/gcc/final.cc
index d4c4fa08f..af4e529bb 100644
--- a/gcc/final.cc
+++ b/gcc/final.cc
@@ -4402,12 +4402,15 @@ get_fdo_count_quality (profile_count count)
   return profile_quality[count.quality ()];
 }
 
-static const char *
+/* If the function is not public, return the function_name/file_name for
+   disambiguation of local symbols since there could be identical function
+   names coming from identical file names.  The caller needs to free memory.  */
+static char *
 alias_local_functions (const char *fnname)
 {
   if (TREE_PUBLIC (cfun->decl))
     {
-      return fnname;
+      return concat (fnname, NULL);
     }
   return concat (fnname, "/", lbasename (dump_base_name), NULL);
 }
@@ -4457,12 +4460,13 @@ dump_direct_callee_info_to_asm (basic_block bb, gcov_type call_count)
 
 	  if (callee)
 	    {
+	      char *func_name =
+		      alias_local_functions (get_fnname_from_decl (callee));
 	      fprintf (asm_out_file, "\t.string \"%x\"\n",
 		       INSN_ADDRESSES (INSN_UID (insn)));
 
 	      fprintf (asm_out_file, "\t.string \"%s%s\"\n",
-		       ASM_FDO_CALLEE_FLAG,
-                       alias_local_functions (get_fnname_from_decl (callee)));
+		       ASM_FDO_CALLEE_FLAG, func_name);
 
               fprintf (asm_out_file,
                        "\t.string \"" HOST_WIDE_INT_PRINT_DEC "\"\n",
@@ -4472,9 +4476,9 @@ dump_direct_callee_info_to_asm (basic_block bb, gcov_type call_count)
                 {
                   fprintf (dump_file, "call: %x --> %s \n",
                            INSN_ADDRESSES (INSN_UID (insn)),
-                           alias_local_functions
-                           (get_fnname_from_decl (callee)));
+			   func_name);
                 }
+	      free (func_name);
             }
         }
      } 
@@ -4547,8 +4551,9 @@ dump_bb_info_to_asm (basic_block bb, gcov_type bb_count)
 static void 
 dump_function_info_to_asm (const char *fnname)
 {
+  char *func_name = alias_local_functions (fnname);
   fprintf (asm_out_file, "\t.string \"%s%s\"\n",
-           ASM_FDO_CALLER_FLAG, alias_local_functions (fnname));
+	   ASM_FDO_CALLER_FLAG, func_name);
   fprintf (asm_out_file, "\t.string \"%s%d\"\n",
            ASM_FDO_CALLER_SIZE_FLAG, get_function_end_addr ());
   fprintf (asm_out_file, "\t.string \"%s%s\"\n",
@@ -4557,7 +4562,7 @@ dump_function_info_to_asm (const char *fnname)
   if (dump_file)
     {
       fprintf (dump_file, "\n FUNC_NAME: %s\n",
-               alias_local_functions (fnname));
+	       func_name);
       fprintf (dump_file, " file: %s\n",
                dump_base_name);
       fprintf (dump_file, "profile_status: %s\n",
@@ -4567,6 +4572,7 @@ dump_function_info_to_asm (const char *fnname)
       fprintf (dump_file, " function_bind: %s\n",
                simple_get_function_bind ());
     }
+  free (func_name);
 }
 
 /* Dump function profile into form AutoFDO or PGO to asm.    */
-- 
2.28.0.windows.1