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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
From adfcca263996bf174f7108b477e81e7ec58f19c4 Mon Sep 17 00:00:00 2001
From: dingguangya <dingguangya1@huawei.com>
Date: Mon, 14 Mar 2022 10:42:07 +0800
Subject: [PATCH] [AutoFdo] Fix memory leaks in autofdo and autoprefetch
Fix memory leaks in autofdo and autoprefetch.
---
gcc/final.c | 23 +++++++++++++++--------
gcc/tree-ssa-loop-prefetch.c | 4 ++++
2 files changed, 19 insertions(+), 8 deletions(-)
diff --git a/gcc/final.c b/gcc/final.c
index b9affd3a7..da8d20958 100644
--- a/gcc/final.c
+++ b/gcc/final.c
@@ -4770,12 +4770,16 @@ 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);
@@ -4826,12 +4830,14 @@ 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)));
+ func_name);
fprintf (asm_out_file,
"\t.string \"" HOST_WIDE_INT_PRINT_DEC "\"\n",
@@ -4841,9 +4847,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);
}
}
}
@@ -4917,8 +4923,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",
@@ -4926,8 +4933,7 @@ dump_function_info_to_asm (const char *fnname)
if (dump_file)
{
- fprintf (dump_file, "\n FUNC_NAME: %s\n",
- alias_local_functions (fnname));
+ fprintf (dump_file, "\n FUNC_NAME: %s\n", func_name);
fprintf (dump_file, " file: %s\n",
dump_base_name);
fprintf (dump_file, " profile_status: %s\n",
@@ -4937,6 +4943,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 info form AutoFDO or PGO to asm. */
diff --git a/gcc/tree-ssa-loop-prefetch.c b/gcc/tree-ssa-loop-prefetch.c
index 0d992d8f6..781831c39 100644
--- a/gcc/tree-ssa-loop-prefetch.c
+++ b/gcc/tree-ssa-loop-prefetch.c
@@ -2248,6 +2248,7 @@ get_bb_branch_prob (hash_map <basic_block, bb_bp> &bb_branch_prob,
branch_prob.true_edge_prob = get_edge_prob (e);
}
}
+ free (body);
}
/* Traverse each bb in the loop and prune fake loops. */
@@ -2416,6 +2417,7 @@ estimate_num_loop_insns (struct loop *loop, eni_weights *weights)
if (get_bb_prob (bb_branch_prob, loop) == false)
{
dump_loop_bb (loop);
+ free (body);
return 0;
}
if (dump_file && (dump_flags & TDF_DETAILS))
@@ -2596,6 +2598,7 @@ is_high_exec_rate_loop (struct loop *loop)
if (loop_exec_rate < (float) LOOP_EXECUTION_RATE / 100.0)
{
+ exit_edges.release ();
return false;
}
}
@@ -2606,6 +2609,7 @@ is_high_exec_rate_loop (struct loop *loop)
loop_exec_rate, (float) LOOP_EXECUTION_RATE / 100.0);
dump_loop_bb (loop);
}
+ exit_edges.release ();
return true;
}
--
2.27.0.windows.1
|