diff options
author | Alan Modra <amodra@gmail.com> | 2023-04-03 22:21:59 +0930 |
---|---|---|
committer | Alan Modra <amodra@gmail.com> | 2023-04-04 12:47:56 +0930 |
commit | 19cacf672930cee20feaf1f3468e3d5ac3099ffd (patch) | |
tree | a85da4040a0d01240981754533db366f2ce172d5 /binutils/debug.h | |
parent | 59bb724b3591f270be752fb252bc6e01f1aae559 (diff) | |
download | fsf-binutils-gdb-19cacf672930cee20feaf1f3468e3d5ac3099ffd.zip fsf-binutils-gdb-19cacf672930cee20feaf1f3468e3d5ac3099ffd.tar.gz fsf-binutils-gdb-19cacf672930cee20feaf1f3468e3d5ac3099ffd.tar.bz2 |
Use bfd_alloc memory for read_debugging_info storage
Trying to free malloc'd memory used by the stabs and coff debug info
parsers is complicated, and traversing the trees generated requires a
lot of code. It's better to bfd_alloc the memory which allows it all
to be freed without fuss when the bfd is closed. In the process of
doing this I reverted most of commit a6336913332.
Some of the stabs handling code grows arrays of pointers with realloc,
to deal with arbitrary numbers of fields, function args, etc. The
code still does that but copies over to bfd_alloc memory when
finished. The alternative is to parse twice, once to size, then again
to populate the arrays. I think that complication is unwarranted.
Note that there is a greater than zero chance this patch breaks
something, eg. that I missed an attempt to free obj_alloc memory.
Also it seems there are no tests in the binutils testsuite aimed at
exercising objdump --debugging.
* budbg.h (finish_stab, parse_stab): Update prototypes
* debug.c: Include bucomm.h.
(struct debug_handle): Add "abfd" field.
(debug_init): Add "abfd" param. bfd_alloc handle.
(debug_xalloc, debug_xzalloc): New functions. Use throughout
in place of xmalloc and memset.
(debug_start_source): Remove "name_used" param.
* debug.h (debug_init, debug_start_source): Update prototypes.
(debug_xalloc, debug_xzalloc): Declare.
* objcopy.c (copy_object): Don't free dhandle.
* objdump.c (dump_bfd): Likewise.
* rdcoff.c (coff_get_slot): Add dhandle arg. debug_xzalloc
memory in place of xcalloc. Update callers.
(parse_coff_struct_type): Don't leak on error return. Copy
fields over to debug_xalloc memory.
(parse_coff_enum_type): Copy names and vals over the
debug_xalloc memory.
* rddbg.c (read_debugging_info): Adjust debug_init call.
Don't free dhandle.
(read_section_stabs_debugging_info): Don't free shandle.
Adjust parse_stab call. Call finish_stab on error return.
(read_symbol_stabs_debugging_info): Similarly.
* stabs.c (savestring): Delete unnecessary forward declaration.
Add dhandle param. debug_xalloc memory. Update callers.
(start_stab): Delete unnecessary casts.
(finish_stab): Add "emit" param. Free file_types, so_string,
and stabs handle.
(parse_stab): Delete string_used param. Revert code dealing
with string_used. Copy so_string passed to debug_set_filename
and stored as main_filename to debug_xalloc memory. Similarly
for string passed to debug_start_source and push_bincl. Copy
args to debug_xalloc memory. Don't leak args.
(parse_stab_enum_type): Copy names and values to debug_xalloc
memory. Don't free name.
(parse_stab_struct_type): Don't free fields.
(parse_stab_baseclasses): Delete unnecessary cast.
(parse_stab_struct_fields): Return debug_xalloc fields.
(parse_stab_cpp_abbrev): Use debug_xalloc for _vb$ type name.
(parse_stab_one_struct_field): Don't free name.
(parse_stab_members): Copy variants and methods to
debug_xalloc memory. Don't free name or argtypes.
(parse_stab_argtypes): Use debug_xalloc memory for physname
and args.
(push_bincl): Add dhandle param. Use debug_xalloc memory.
(stab_record_variable): Use debug_xalloc memory.
(stab_emit_pending_vars): Don't free var list.
(stab_find_slot): Add dhandle param. Use debug_xzalloc
memory. Update all callers.
(stab_find_tagged_type): Don't free name. Use debug_xzalloc.
(stab_demangle_qualified): Don't free name.
(stab_demangle_template): Don't free s1.
(stab_demangle_args): Tidy pvarargs refs. Copy *pargs on
success to debug_xalloc memory, free on failure.
(stab_demangle_fund_type): Don't free name.
(stab_demangle_v3_arglist): Copy args to debug_xalloc memory.
Don't free dt.
Diffstat (limited to 'binutils/debug.h')
-rw-r--r-- | binutils/debug.h | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/binutils/debug.h b/binutils/debug.h index fd19c8b..d499895 100644 --- a/binutils/debug.h +++ b/binutils/debug.h @@ -425,7 +425,12 @@ struct debug_write_fns /* Return a debugging handle. */ -extern void *debug_init (void); +extern void *debug_init (bfd *); + +/* Allocate bytes on the debug handle objalloc memory pool. */ + +extern void *debug_xalloc (void *, size_t); +extern void *debug_xzalloc (void *, size_t); /* Set the source filename. This implicitly starts a new compilation unit. */ @@ -435,7 +440,7 @@ extern bool debug_set_filename (void *, const char *); /* Change source files to the given file name. This is used for include files in a single compilation unit. */ -extern bool debug_start_source (void *, const char *, bool *); +extern bool debug_start_source (void *, const char *); /* Record a function definition. This implicitly starts a function block. The debug_type argument is the type of the return value. |