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.
This commit is contained in:
Alan Modra 2019-12-09 20:34:49 +10:30
parent 103ebbc35c
commit 20135676fc
6 changed files with 79 additions and 1 deletions

View File

@ -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".

View File

@ -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

View File

@ -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.

View File

@ -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 *);

View File

@ -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.

View File

@ -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 *