target/riscv: Free registers to avoid memory leak

Tested with SiFive HiFive1 development board.

Change-Id: I96a9a528057fcf9fc54d3da46a672d2cd54c3d5f
Signed-off-by: Marc Schink <openocd-dev@marcschink.de>
Reviewed-on: http://openocd.zylin.com/4885
Tested-by: jenkins
Reviewed-by: Tim Newsome <tim@sifive.com>
Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
bscan_optimization
Marc Schink 2019-04-01 13:47:17 +02:00 committed by Tomas Vanek
parent 6aae614cc2
commit d5936dc688
1 changed files with 17 additions and 14 deletions

View File

@ -271,16 +271,8 @@ static int riscv_init_target(struct command_context *cmd_ctx,
return ERROR_OK; return ERROR_OK;
} }
static void riscv_deinit_target(struct target *target) static void riscv_free_registers(struct target *target)
{ {
LOG_DEBUG("riscv_deinit_target()");
struct target_type *tt = get_target_type(target);
if (tt) {
tt->deinit_target(target);
riscv_info_t *info = (riscv_info_t *) target->arch_info;
free(info->reg_names);
free(info);
}
/* Free the shared structure use for most registers. */ /* Free the shared structure use for most registers. */
if (target->reg_cache) { if (target->reg_cache) {
if (target->reg_cache->reg_list) { if (target->reg_cache->reg_list) {
@ -293,6 +285,21 @@ static void riscv_deinit_target(struct target *target)
} }
free(target->reg_cache); free(target->reg_cache);
} }
}
static void riscv_deinit_target(struct target *target)
{
LOG_DEBUG("riscv_deinit_target()");
struct target_type *tt = get_target_type(target);
if (tt) {
tt->deinit_target(target);
riscv_info_t *info = (riscv_info_t *) target->arch_info;
free(info->reg_names);
free(info);
}
riscv_free_registers(target);
target->arch_info = NULL; target->arch_info = NULL;
} }
@ -2503,11 +2510,7 @@ int riscv_init_registers(struct target *target)
{ {
RISCV_INFO(info); RISCV_INFO(info);
if (target->reg_cache) { riscv_free_registers(target);
if (target->reg_cache->reg_list)
free(target->reg_cache->reg_list);
free(target->reg_cache);
}
target->reg_cache = calloc(1, sizeof(*target->reg_cache)); target->reg_cache = calloc(1, sizeof(*target->reg_cache));
target->reg_cache->name = "RISC-V Registers"; target->reg_cache->name = "RISC-V Registers";