Call disassemble_free_target in gdb
Commit Message
Commit 20135676fc4c3912297c313b3e0d3cbd6cc402e3 ("PR24960, Memory leak
from disassembler") added "disassemble_free_target" to opcodes. This
is used to free target-specific data when finished with a
disassembler.
This patch changes gdb to call this function where needed.
gdb/ChangeLog
2020-01-11 Tom Tromey <tom@tromey.com>
* disasm.c (~gdb_disassembler): New destructor.
(gdb_buffered_insn_length): Call disassemble_free_target.
* disasm.h (class gdb_disassembler): Declare destructor. Use
DISABLE_COPY_AND_ASSIGN.
Change-Id: I245ba5b7dec5e5d9f29cd21832c6e2b4fecef047
---
gdb/ChangeLog | 7 +++++++
gdb/disasm.c | 9 ++++++++-
gdb/disasm.h | 4 ++++
3 files changed, 19 insertions(+), 1 deletion(-)
Comments
>>>>> "Tom" == Tom Tromey <tom@tromey.com> writes:
Tom> Commit 20135676fc4c3912297c313b3e0d3cbd6cc402e3 ("PR24960, Memory leak
Tom> from disassembler") added "disassemble_free_target" to opcodes. This
Tom> is used to free target-specific data when finished with a
Tom> disassembler.
Tom> This patch changes gdb to call this function where needed.
I'm going to check this in shortly.
Tom
@@ -781,6 +781,11 @@ gdb_disassembler::gdb_disassembler (struct gdbarch *gdbarch,
disassemble_init_for_target (&m_di);
}
+gdb_disassembler::~gdb_disassembler ()
+{
+ disassemble_free_target (&m_di);
+}
+
int
gdb_disassembler::print_insn (CORE_ADDR memaddr,
int *branch_delay_insns)
@@ -908,7 +913,9 @@ gdb_buffered_insn_length (struct gdbarch *gdbarch,
gdb_buffered_insn_length_init_dis (gdbarch, &di, insn, max_len, addr,
&disassembler_options_holder);
- return gdbarch_print_insn (gdbarch, addr, &di);
+ int result = gdbarch_print_insn (gdbarch, addr, &di);
+ disassemble_free_target (&di);
+ return result;
}
char *
@@ -47,6 +47,10 @@ public:
: gdb_disassembler (gdbarch, file, dis_asm_read_memory)
{}
+ ~gdb_disassembler ();
+
+ DISABLE_COPY_AND_ASSIGN (gdb_disassembler);
+
int print_insn (CORE_ADDR memaddr, int *branch_delay_insns = NULL);
/* Return the gdbarch of gdb_disassembler. */