diff options
author | Anton Johansson <anjo@rev.ng> | 2024-05-23 14:59:00 +0200 |
---|---|---|
committer | Brian Cain <bcain@quicinc.com> | 2024-06-08 17:49:27 -0700 |
commit | 95408ad8e24c4364086f185285039e89927dad6c (patch) | |
tree | d48304c2ad2ac100abb2a158d94970d2c02bfd8c /target/hexagon | |
parent | 348fec2afe9f03b1761caff44ea6290357d87c01 (diff) | |
download | qemu-95408ad8e24c4364086f185285039e89927dad6c.zip qemu-95408ad8e24c4364086f185285039e89927dad6c.tar.gz qemu-95408ad8e24c4364086f185285039e89927dad6c.tar.bz2 |
target/hexagon: idef-parser fix leak of init_list
gen_inst_init_args() is called for instructions using a predicate as an
rvalue. Upon first call, the list of arguments which might need
initialization init_list is freed to indicate that they have been
processed. For instructions without an rvalue predicate,
gen_inst_init_args() isn't called and init_list will never be freed.
Free init_list from free_instruction() if it hasn't already been freed.
A comment in free_instruction is also updated.
Signed-off-by: Anton Johansson <anjo@rev.ng>
Reviewed-by: Taylor Simpson <ltaylorsimpson@gmail.com>
Reviewed-by: Brian Cain <bcain@quicinc.com>
Message-Id: <20240523125901.27797-4-anjo@rev.ng>
Signed-off-by: Brian Cain <bcain@quicinc.com>
Diffstat (limited to 'target/hexagon')
-rw-r--r-- | target/hexagon/idef-parser/parser-helpers.c | 9 |
1 files changed, 8 insertions, 1 deletions
diff --git a/target/hexagon/idef-parser/parser-helpers.c b/target/hexagon/idef-parser/parser-helpers.c index 95f2b43..c150c30 100644 --- a/target/hexagon/idef-parser/parser-helpers.c +++ b/target/hexagon/idef-parser/parser-helpers.c @@ -2121,9 +2121,16 @@ void free_instruction(Context *c) g_string_free(g_array_index(c->inst.strings, GString*, i), TRUE); } g_array_free(c->inst.strings, TRUE); + /* + * Free list of arguments that might need initialization, if they haven't + * already been freed. + */ + if (c->inst.init_list) { + g_array_free(c->inst.init_list, TRUE); + } /* Free INAME token value */ g_string_free(c->inst.name, TRUE); - /* Free variables and registers */ + /* Free declared TCGv variables */ g_array_free(c->inst.allocated, TRUE); /* Initialize instruction-specific portion of the context */ memset(&(c->inst), 0, sizeof(Inst)); |