Call disassemble_free_target in gdb

Message ID 20200111184422.4690-1-tom@tromey.com
State New, archived
Headers

Commit Message

Tom Tromey Jan. 11, 2020, 6:44 p.m. UTC
  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 Tromey Jan. 19, 2020, 8:09 p.m. UTC | #1
>>>>> "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
  

Patch

diff --git a/gdb/disasm.c b/gdb/disasm.c
index 39052f7fd36..d0c287d9f68 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -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 *
diff --git a/gdb/disasm.h b/gdb/disasm.h
index 0bda4df58ca..b0f535eaa21 100644
--- a/gdb/disasm.h
+++ b/gdb/disasm.h
@@ -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.  */