[binutils-gdb] Call disassemble_free_target in gdb

Tom Tromey tromey@sourceware.org
Sun Jan 19 20:35:00 GMT 2020


https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=4d89c1c79fa53ff2c4e9574148b59d83c21db6d2

commit 4d89c1c79fa53ff2c4e9574148b59d83c21db6d2
Author: Tom Tromey <tom@tromey.com>
Date:   Sat Jan 11 11:40:45 2020 -0700

    Call disassemble_free_target in gdb
    
    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

Diff:
---
 gdb/ChangeLog | 7 +++++++
 gdb/disasm.c  | 9 ++++++++-
 gdb/disasm.h  | 4 ++++
 3 files changed, 19 insertions(+), 1 deletion(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 0fd5dff..93a125b 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,12 @@
 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.
 	(die_reader_func_ftype): Remove.
 	(cutu_reader): New class.
diff --git a/gdb/disasm.c b/gdb/disasm.c
index 7dfbd2f..e45c840 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 0bda4df..b0f535e 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.  */



More information about the Gdb-cvs mailing list