Call disassemble_free_target in gdb
authorTom Tromey <tom@tromey.com>
Sat, 11 Jan 2020 18:40:45 +0000 (11:40 -0700)
committerTom Tromey <tom@tromey.com>
Sun, 19 Jan 2020 20:24:32 +0000 (13:24 -0700)
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-19  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
gdb/disasm.c
gdb/disasm.h

index 0fd5dffc820be59250fb4eb97eec4f8027f78eb1..93a125b3e7d32e43a78a5db4a3366e9cd2bfe56f 100644 (file)
@@ -1,3 +1,10 @@
+2020-01-19  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.
+
 2020-01-19  Tom Tromey  <tom@tromey.com>
 
        * dwarf2read.c (abbrev_table_up): Move typedef earlier.
index 7dfbd2fb472101e0243607550c3f089a56b32374..e45c8400689b02fc9dd81e6322989a76e70310f7 100644 (file)
@@ -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 *
index 0bda4df58ca3342a2234aa201c58a18e07bd9f99..b0f535eaa211607905b48751cb7ef71ceabb3166 100644 (file)
@@ -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.  */