Browse Source

PR24960, Memory leak from disassembler

PR 24960
include/
	* dis-asm.h (disassemble_free_target): Declare.
opcodes/
	* disassemble.c (disassemble_free_target): New function.
binutils/
	* objdump.c (disassemble_data): Call disassemble_free_target.
gdb-9-branch
Alan Modra 6 years ago
parent
commit
20135676fc
  1. 5
      binutils/ChangeLog
  2. 1
      binutils/objdump.c
  3. 5
      include/ChangeLog
  4. 5
      include/dis-asm.h
  5. 5
      opcodes/ChangeLog
  6. 59
      opcodes/disassemble.c

5
binutils/ChangeLog

@ -1,3 +1,8 @@
2019-12-10 Alan Modra <amodra@gmail.com>
PR 24960
* objdump.c (disassemble_data): Call disassemble_free_target.
2019-12-10 Alan Modra <amodra@gmail.com>
* objdump.c (struct objdump_disasm_info): Delete "sec".

1
binutils/objdump.c

@ -2730,6 +2730,7 @@ disassemble_data (bfd *abfd)
if (aux.dynrelbuf != NULL)
free (aux.dynrelbuf);
free (sorted_syms);
disassemble_free_target (&disasm_info);
}
static bfd_boolean

5
include/ChangeLog

@ -1,3 +1,8 @@
2019-12-10 Alan Modra <amodra@gmail.com>
PR 24960
* dis-asm.h (disassemble_free_target): Declare.
2019-12-10 Alan Modra <amodra@gmail.com>
* dis-asm.h (struct disassemble_info): Delete insn_sets.

5
include/dis-asm.h

@ -325,7 +325,10 @@ extern disassembler_ftype disassembler (enum bfd_architecture arc,
/* Amend the disassemble_info structure as necessary for the target architecture.
Should only be called after initialising the info->arch field. */
extern void disassemble_init_for_target (struct disassemble_info * dinfo);
extern void disassemble_init_for_target (struct disassemble_info *);
/* Tidy any memory allocated by targets, such as info->private_data. */
extern void disassemble_free_target (struct disassemble_info *);
/* Document any target specific options available from the disassembler. */
extern void disassembler_usage (FILE *);

5
opcodes/ChangeLog

@ -1,3 +1,8 @@
2019-12-10 Alan Modra <amodra@gmail.com>
PR 24960
* disassemble.c (disassemble_free_target): New function.
2019-12-10 Alan Modra <amodra@gmail.com>
* cgen-dis.in (print_insn_@arch@): Replace insn_sets with private_data.

59
opcodes/disassemble.c

@ -716,6 +716,65 @@ disassemble_init_for_target (struct disassemble_info * info)
}
}
void
disassemble_free_target (struct disassemble_info *info)
{
if (info == NULL)
return;
switch (info->arch)
{
default:
return;
#ifdef ARCH_bpf
case bfd_arch_bpf:
#endif
#ifdef ARCH_m32c
case bfd_arch_m32c:
#endif
#if defined ARCH_bpf || defined ARCH_m32c
if (info->private_data)
{
CGEN_BITSET *mask = info->private_data;
free (mask->bits);
}
break;
#endif
#ifdef ARCH_arc
case bfd_arch_arc:
break;
#endif
#ifdef ARCH_cris
case bfd_arch_cris:
break;
#endif
#ifdef ARCH_mmix
case bfd_arch_mmix:
break;
#endif
#ifdef ARCH_nfp
case bfd_arch_nfp:
break;
#endif
#ifdef ARCH_powerpc
case bfd_arch_powerpc:
break;
#endif
#ifdef ARCH_riscv
case bfd_arch_riscv:
break;
#endif
#ifdef ARCH_rs6000
case bfd_arch_rs6000:
break;
#endif
}
free (info->private_data);
}
/* Remove whitespace and consecutive commas from OPTIONS. */
char *

Loading…
Cancel
Save